WikidataBuilder has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/306644

Change subject: New Wikidata Build - 2016-08-25T10:00:01+0000
......................................................................

New Wikidata Build - 2016-08-25T10:00:01+0000

Change-Id: I9d6a7867b721e88f46892af746b82036c9486c8c
---
M composer.lock
A extensions/ArticlePlaceholder/includes/AboutTopicRenderer.php
M extensions/ArticlePlaceholder/includes/specials/SpecialAboutTopic.php
A 
extensions/ArticlePlaceholder/tests/phpunit/includes/AboutTopicRendererTest.php
M 
extensions/ArticlePlaceholder/tests/phpunit/includes/specials/SpecialAboutTopicTest.php
M 
extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
M 
extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
R 
extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindings.php
A 
extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindings.php
M 
extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
M 
extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
A 
extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindingsTest.php
A 
extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindingsTest.php
D 
extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaBindingsTest.php
M extensions/Wikibase/lib/i18n/nl.json
M extensions/Wikibase/lib/i18n/ru.json
M extensions/Wikibase/repo/i18n/nl.json
M extensions/Wikibase/repo/includes/Api/EditEntity.php
M extensions/Wikibase/repo/includes/Store/Sql/SqlIdGenerator.php
M extensions/Wikibase/repo/tests/phpunit/includes/Api/EditEntityTest.php
M extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.js
M 
extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.variations.Value.js
M vendor/composer/autoload_classmap.php
M vendor/composer/installed.json
24 files changed, 1,048 insertions(+), 659 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikidata 
refs/changes/44/306644/1

diff --git a/composer.lock b/composer.lock
index 858729b..744425a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -782,12 +782,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-ArticlePlaceholder.git";,
-                "reference": "2fa8987bbf2daace8bae00cf1f4f0d02a9d0b47e"
+                "reference": "747b41328a4650aca8f7a3c3e29ee4d72668ee93"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/2fa8987bbf2daace8bae00cf1f4f0d02a9d0b47e";,
-                "reference": "2fa8987bbf2daace8bae00cf1f4f0d02a9d0b47e",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/747b41328a4650aca8f7a3c3e29ee4d72668ee93";,
+                "reference": "747b41328a4650aca8f7a3c3e29ee4d72668ee93",
                 "shasum": ""
             },
             "require-dev": {
@@ -812,7 +812,7 @@
             ],
             "description": "Provides a special page with Wikibase information 
about a certain topic, with invitation to create an article for the topic",
             "homepage": 
"https://www.mediawiki.org/wiki/Extension:ArticlePlaceholder";,
-            "time": "2016-08-24 08:30:24"
+            "time": "2016-08-25 01:06:03"
         },
         {
             "name": "propertysuggester/property-suggester",
@@ -1568,12 +1568,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-                "reference": "7c19c5037aee83d9eda90da0bdff9a00d21aa521"
+                "reference": "aa4f666667f49ca7b40b7cf88bab92fa5236018d"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/7c19c5037aee83d9eda90da0bdff9a00d21aa521";,
-                "reference": "7c19c5037aee83d9eda90da0bdff9a00d21aa521",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/aa4f666667f49ca7b40b7cf88bab92fa5236018d";,
+                "reference": "aa4f666667f49ca7b40b7cf88bab92fa5236018d",
                 "shasum": ""
             },
             "require": {
@@ -1645,7 +1645,7 @@
                 "wikibaserepo",
                 "wikidata"
             ],
-            "time": "2016-08-24 09:29:21"
+            "time": "2016-08-24 21:34:05"
         },
         {
             "name": "wikibase/wikimedia-badges",
diff --git a/extensions/ArticlePlaceholder/includes/AboutTopicRenderer.php 
b/extensions/ArticlePlaceholder/includes/AboutTopicRenderer.php
new file mode 100644
index 0000000..b3dd674
--- /dev/null
+++ b/extensions/ArticlePlaceholder/includes/AboutTopicRenderer.php
@@ -0,0 +1,167 @@
+<?php
+
+namespace ArticlePlaceholder;
+
+use OOUI;
+use SpecialPage;
+use Title;
+use Wikibase\Client\Store\TitleFactory;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
+use Wikibase\Lib\Store\SiteLinkLookup;
+use OutputPage;
+use SiteLookup;
+use Language;
+use User;
+
+/**
+ * The AboutTopic SpecialPage for the ArticlePlaceholder extension
+ *
+ * @ingroup Extensions
+ * @author Lucie-Aimée Kaffee
+ * @license GNU General Public Licence 2.0 or later
+ */
+class AboutTopicRenderer {
+
+       /**
+        * @var LanguageFallbackLabelDescriptionLookupFactory
+        */
+       private $termLookupFactory;
+
+       /**
+        * @var SiteLinkLookup
+        */
+       private $siteLinkLookup;
+
+       /**
+        * @var SiteLookup
+        */
+       private $siteLookup;
+
+       /**
+        * @var string
+        */
+       private $langLinkSiteGroup;
+
+       /**
+        * @var TitleFactory
+        */
+       private $titleFactory;
+
+       /**
+        * @param LanguageFallbackLabelDescriptionLookupFactory 
$termLookupFactory
+        * @param SiteLinkLookup $siteLinkLookup
+        * @param SiteLookup $siteLookup
+        * @param string $langLinkSiteGroup
+        * @param TitleFactory $titleFactory
+        */
+       public function __construct(
+               LanguageFallbackLabelDescriptionLookupFactory 
$termLookupFactory,
+               SiteLinkLookup $siteLinkLookup,
+               SiteLookup $siteLookup,
+               $langLinkSiteGroup,
+               TitleFactory $titleFactory
+       ) {
+               $this->termLookupFactory = $termLookupFactory;
+               $this->siteLinkLookup = $siteLinkLookup;
+               $this->siteLookup = $siteLookup;
+               $this->langLinkSiteGroup = $langLinkSiteGroup;
+               $this->titleFactory = $titleFactory;
+       }
+
+       /**
+        * Show content of the ArticlePlaceholder
+        * @param ItemId $entityId
+        * @param Language $language
+        * @param User $user
+        * @param OutputPage $output
+        */
+       public function showPlaceholder(
+                       ItemId $entityId,
+                       Language $language,
+                       User $user,
+                       OutputPage $output
+               ) {
+               $output->addWikiText( '{{aboutTopic|' . 
$entityId->getSerialization() . '}}' );
+               $label = $this->getLabel( $entityId, $language );
+               $labelTitle = null;
+               if ( $label ) {
+                       $this->showTitle( $label, $output );
+                       $labelTitle = $this->titleFactory->newFromText( $label 
);
+               }
+               if ( $labelTitle && $labelTitle->quickUserCan( 'createpage', 
$user ) ) {
+                       $this->showCreateArticle( $labelTitle, $output );
+               }
+               $this->showLanguageLinks( $entityId, $output );
+       }
+
+       /**
+        * Adds a button to create an article
+        * @param Title $labelTitle
+        * @param OutputPage $output
+        */
+       private function showCreateArticle( Title $labelTitle, OutputPage 
$output ) {
+               $output->enableOOUI();
+               $output->addModuleStyles( 
'ext.articleplaceholder.defaultDisplay' );
+               $output->addModules( 'ext.articleplaceholder.createArticle' );
+               $output->addJsConfigVars( 'apLabel', 
$labelTitle->getPrefixedText() );
+
+               $button = new OOUI\ButtonWidget( [
+                       'id' => 'new-empty-article-button',
+                       'infusable' => true,
+                       'label' => wfMessage( 
'articleplaceholder-abouttopic-create-article-button' )->text(),
+                       'href' => SpecialPage::getTitleFor( 'CreateTopicPage', 
$labelTitle->getPrefixedText() )
+                               ->getLocalURL( [ 'ref' => 'button' ] ),
+                       'target' => 'blank'
+               ] );
+
+               $output->addHTML( $button );
+       }
+
+       /**
+        * @param ItemId $entityId
+        * @param Language $language
+        * @return string|null null if the item doesn't have a label
+        */
+       private function getLabel( ItemId $entityId, Language $language ) {
+               $label = $this->termLookupFactory->newLabelDescriptionLookup( 
$language )
+                       ->getLabel( $entityId );
+
+               if ( $label !== null ) {
+                       return $label->getText();
+               }
+
+               return null;
+       }
+
+       /**
+        * Show label as page title
+        * @param string $label
+        * @param OutputPage $output
+        */
+       private function showTitle( $label, OutputPage $output ) {
+               $output->setPageTitle( htmlspecialchars( $label ) );
+       }
+
+       /**
+        * Set language links
+        * @param ItemId $entityId
+        * @param OutputPage $output
+        */
+       private function showLanguageLinks( ItemId $entityId, OutputPage 
$output ) {
+               $siteLinks = $this->siteLinkLookup->getSiteLinksForItem( 
$entityId );
+               $languageLinks = [];
+
+               foreach ( $siteLinks as $siteLink ) {
+                       $site = $this->siteLookup->getSite( 
$siteLink->getSiteId() );
+                       $languageCode = $site->getLanguageCode();
+                       $group = $site->getGroup();
+                       if ( $languageCode !== null && $group === 
$this->langLinkSiteGroup ) {
+                               $languageLinks[$languageCode] = $languageCode . 
':' . $siteLink->getPageName();
+                       }
+               }
+
+               $output->setLanguageLinks( $languageLinks );
+       }
+
+}
diff --git 
a/extensions/ArticlePlaceholder/includes/specials/SpecialAboutTopic.php 
b/extensions/ArticlePlaceholder/includes/specials/SpecialAboutTopic.php
index f13a34e..bea94fc 100644
--- a/extensions/ArticlePlaceholder/includes/specials/SpecialAboutTopic.php
+++ b/extensions/ArticlePlaceholder/includes/specials/SpecialAboutTopic.php
@@ -3,17 +3,14 @@
 namespace ArticlePlaceholder\Specials;
 
 use HTMLForm;
-use OOUI;
-use SiteStore;
 use SpecialPage;
-use Title;
+use ArticlePlaceholder\AboutTopicRenderer;
 use Wikibase\Client\Store\TitleFactory;
 use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\EntityIdParsingException;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Services\Lookup\EntityLookup;
-use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
 use Wikibase\Lib\Store\SiteLinkLookup;
 
 /**
@@ -28,16 +25,25 @@
        public static function newFromGlobalState() {
                $wikibaseClient = WikibaseClient::getDefaultInstance();
                return new self(
+                       new AboutTopicRenderer(
+                               
$wikibaseClient->getLanguageFallbackLabelDescriptionLookupFactory(),
+                               
$wikibaseClient->getStore()->getSiteLinkLookup(),
+                               $wikibaseClient->getSiteStore(),
+                               $wikibaseClient->getLangLinkSiteGroup(),
+                               new TitleFactory()
+                       ),
                        $wikibaseClient->getEntityIdParser(),
-                       
$wikibaseClient->getLanguageFallbackLabelDescriptionLookupFactory(),
                        $wikibaseClient->getStore()->getSiteLinkLookup(),
-                       $wikibaseClient->getSiteStore(),
                        new TitleFactory(),
                        $wikibaseClient->getSettings()->getSetting( 
'siteGlobalID' ),
-                       $wikibaseClient->getStore()->getEntityLookup(),
-                       $wikibaseClient->getLangLinkSiteGroup()
+                       $wikibaseClient->getStore()->getEntityLookup()
                );
        }
+
+       /**
+        * @var AboutTopicRenderer
+        */
+       private $aboutTopicRenderer;
 
        /**
         * @var EntityIdParser
@@ -45,19 +51,9 @@
        private $idParser;
 
        /**
-        * @var LanguageFallbackLabelDescriptionLookupFactory
-        */
-       private $termLookupFactory;
-
-       /**
         * @var SiteLinkLookup
         */
        private $siteLinkLookup;
-
-       /**
-        * @var SiteStore
-        */
-       private $siteStore;
 
        /**
         * @var TitleFactory
@@ -75,40 +71,29 @@
        private $entityLookup;
 
        /**
-        * @var string
-        */
-       private $langLinkSiteGroup;
-
-       /**
+        * @param AboutTopicRenderer $aboutTopicRenderer
         * @param EntityIdParser $idParser
-        * @param LanguageFallbackLabelDescriptionLookupFactory 
$termLookupFactory
         * @param SiteLinkLookup $siteLinkLookup
-        * @param SiteStore $siteStore
         * @param TitleFactory $titleFactory
         * @param string $siteGlobalID
         * @param EntityLookup $entityLookup
-        * @param string $langLinkSiteGroup
         */
        public function __construct(
+               AboutTopicRenderer $aboutTopicRenderer,
                EntityIdParser $idParser,
-               LanguageFallbackLabelDescriptionLookupFactory 
$termLookupFactory,
                SiteLinkLookup $siteLinkLookup,
-               SiteStore $siteStore,
                TitleFactory $titleFactory,
                $siteGlobalID,
-               EntityLookup $entityLookup,
-               $langLinkSiteGroup
+               EntityLookup $entityLookup
        ) {
                parent::__construct( 'AboutTopic' );
 
+               $this->aboutTopicRenderer = $aboutTopicRenderer;
                $this->idParser = $idParser;
-               $this->termLookupFactory = $termLookupFactory;
                $this->siteLinkLookup = $siteLinkLookup;
-               $this->siteStore = $siteStore;
                $this->titleFactory = $titleFactory;
                $this->siteGlobalID = $siteGlobalID;
                $this->entityLookup = $entityLookup;
-               $this->langLinkSiteGroup = $langLinkSiteGroup;
        }
 
        /**
@@ -137,12 +122,17 @@
                        return;
                }
 
-               $articleOnWiki = $this->getArticleOnWiki( $itemId );
+               $articleOnWiki = $this->getArticleUrl( $itemId );
 
                if ( $articleOnWiki !== null ) {
                        $this->getOutput()->redirect( $articleOnWiki );
                } else {
-                       $this->showPlaceholder( $itemId );
+                       $this->aboutTopicRenderer->showPlaceholder(
+                               $itemId,
+                               $this->getLanguage(),
+                               $this->getUser(),
+                               $this->getOutput()
+                       );
                }
        }
 
@@ -219,91 +209,11 @@
        }
 
        /**
-        * Show placeholder and include template to call lua module
         * @param ItemId $entityId
+        *
+        * @return string|null
         */
-       private function showPlaceholder( ItemId $entityId ) {
-               $this->getOutput()->addWikiText( '{{aboutTopic|' . 
$entityId->getSerialization() . '}}' );
-               $label = $this->getLabel( $entityId );
-               $this->showTitle( $label );
-               $labelTitle = Title::newFromText( $label );
-               if ( $labelTitle && $labelTitle->quickUserCan( 'createpage', 
$this->getUser() ) ) {
-                       $this->showCreateArticle( $labelTitle );
-               }
-               $this->showLanguageLinks( $entityId );
-       }
-
-       private function showCreateArticle( Title $labelTitle ) {
-               $output = $this->getOutput();
-
-               $output->enableOOUI();
-               $output->addModuleStyles( 
'ext.articleplaceholder.defaultDisplay' );
-               $output->addModules( 'ext.articleplaceholder.createArticle' );
-               $output->addJsConfigVars( 'apLabel', 
$labelTitle->getPrefixedText() );
-
-               $button = new OOUI\ButtonWidget( [
-                       'id' => 'new-empty-article-button',
-                       'infusable' => true,
-                       'label' => $this->msg( 
'articleplaceholder-abouttopic-create-article-button' )->text(),
-                       'href' => SpecialPage::getTitleFor( 'CreateTopicPage', 
$labelTitle->getPrefixedText() )
-                               ->getLocalURL( [ 'ref' => 'button' ] ),
-                       'target' => 'blank'
-               ] );
-
-               $output->addHTML( $button );
-       }
-
-       /**
-        * @param ItemId $entityId
-        * @return string|null label
-        */
-       private function getLabel( ItemId $entityId ) {
-               $label = $this->termLookupFactory->newLabelDescriptionLookup( 
$this->getLanguage() )
-                       ->getLabel( $entityId );
-
-               if ( $label !== null ) {
-                       return $label->getText();
-               }
-
-               return null;
-       }
-
-       /**
-        * Show label as page title
-        * @param string|null $label
-        */
-       private function showTitle( $label ) {
-               if ( $label !== null ) {
-                       $this->getOutput()->setPageTitle( htmlspecialchars( 
$label ) );
-               }
-       }
-
-       /**
-        * Set language links
-        * @param ItemId $entityId
-        * @todo set links to other projects in sidebar, too!
-        */
-       private function showLanguageLinks( ItemId $entityId ) {
-               $siteLinks = $this->siteLinkLookup->getSiteLinksForItem( 
$entityId );
-               $languageLinks = [];
-
-               foreach ( $siteLinks as $siteLink ) {
-                       $site = $this->siteStore->getSite( 
$siteLink->getSiteId() );
-                       $languageCode = $site->getLanguageCode();
-                       $group = $site->getGroup();
-                       if ( $languageCode !== null && $group === 
$this->langLinkSiteGroup ) {
-                               $languageLinks[$languageCode] = $languageCode . 
':' . $siteLink->getPageName();
-                       }
-               }
-
-               $this->getOutput()->setLanguageLinks( $languageLinks );
-       }
-
-       /**
-        * @param ItemId $entityId
-        * @return Title
-        */
-       private function getArticleOnWiki( ItemId $entityId ) {
+       private function getArticleUrl( ItemId $entityId ) {
                $sitelinkTitles = $this->siteLinkLookup->getLinks(
                        [ $entityId->getNumericId() ],
                        [ $this->siteGlobalID ]
diff --git 
a/extensions/ArticlePlaceholder/tests/phpunit/includes/AboutTopicRendererTest.php
 
b/extensions/ArticlePlaceholder/tests/phpunit/includes/AboutTopicRendererTest.php
new file mode 100644
index 0000000..34f6d26
--- /dev/null
+++ 
b/extensions/ArticlePlaceholder/tests/phpunit/includes/AboutTopicRendererTest.php
@@ -0,0 +1,163 @@
+<?php
+
+namespace ArticlePlaceholder\Tests;
+
+use ArticlePlaceholder\AboutTopicRenderer;
+use DerivativeContext;
+use MediaWikiTestCase;
+use RequestContext;
+use Site;
+use SiteLookup;
+use SpecialPage;
+use Language;
+use User;
+use OutputPage;
+use Wikibase\Client\Store\TitleFactory;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\SiteLink;
+use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
+use Wikibase\DataModel\Term\Term;
+use Wikibase\Lib\Store\SiteLinkLookup;
+use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
+
+/**
+ * @covers ArticlePlaceholder\AboutTopicRenderer
+ *
+ * @group ArticlePlaceholder
+ *
+ * @licence GNU GPL v2+
+ * @author Lucie-Aimée Kaffee
+ */
+class AboutTopicRendererTest extends MediaWikiTestCase {
+
+       /**
+        * @param ItemId $itemId
+        *
+        * @return OutputPage
+        */
+       private function getInstanceOutput( ItemId $itemId ) {
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $title = SpecialPage::getTitleFor( 'AboutTopic' );
+               $context->getOutput()->setTitle( $title );
+
+               $instance = new AboutTopicRenderer(
+                       $this->getTermLookupFactory(),
+                       $this->getSiteLinkLookup(),
+                       $this->getSiteLookup(),
+                       'wikipedia',
+                       new TitleFactory()
+               );
+
+               $instance->showPlaceholder(
+                       $itemId,
+                       Language::factory( 'eo' ),
+                       $this->getMock( User::class ),
+                       $context->getOutput()
+               );
+
+               return $context->getOutput();
+       }
+
+       /**
+        * Test that the title is set correctly
+        */
+       public function testTitle() {
+               $output = $this->getInstanceOutput( new ItemId( 'Q123' ) );
+               $title = $output->getPageTitle();
+               $this->assertEquals( 'Label of Q123', $title );
+       }
+
+       /**
+        * Test that Language links are set correctly
+        */
+       public function testLanguageLinks() {
+               $output = $this->getInstanceOutput( new ItemId( 'Q123' ) );
+               $langLinks = $output->getLanguageLinks();
+               $this->assertArrayEquals( [ 'eo:Unicorn' ], $langLinks );
+               $this->assertEquals( 1, count( $langLinks ) );
+       }
+
+       /**
+        * @return LanguageFallbackLabelDescriptionLookupFactory
+        */
+       private function getTermLookupFactory() {
+               $labelDescriptionLookupFactory = $this->getMockBuilder(
+                               
LanguageFallbackLabelDescriptionLookupFactory::class
+                       )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $labelDescriptionLookupFactory->expects( $this->once() )
+                       ->method( 'newLabelDescriptionLookup' )
+                       ->with( Language::factory( 'eo' ) )
+                       ->will( $this->returnValue( $this->getLabelLookup() ) );
+
+               return $labelDescriptionLookupFactory;
+       }
+
+       /**
+        * @return LabelDescriptionLookup
+        */
+       private function getLabelLookup() {
+               $labelLookup = $this->getMock( LabelDescriptionLookup::class );
+               $labelLookup->expects( $this->any() )
+                       ->method( 'getLabel' )
+                       ->will( $this->returnCallback( function( ItemId $id ) {
+                               return new Term( 'eo', 'Label of ' . 
$id->getSerialization() );
+                       } ) );
+
+               return $labelLookup;
+       }
+
+       /**
+        * @return SiteLinkLookup
+        */
+       private function getSiteLinkLookup() {
+               $siteLinkLookup = $this->getMockBuilder( SiteLinkLookup::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLinkLookup->expects( $this->any() )
+                       ->method( 'getSiteLinksForItem' )
+                       ->with( ItemId::newFromNumber( '123' ) )
+                       ->will(
+                               $this->returnValue( [
+                                       new SiteLink( 'eowiki', 'Unicorn' ),
+                                       new SiteLink( 'qwertz', 'Unicorn' ),
+                                       new SiteLink( 'eowikivoyage', 
'TravelUnicorn' )
+                               ] )
+                       );
+
+               return $siteLinkLookup;
+       }
+
+       private function getSiteLookup() {
+               $siteLookup = $this->getMockBuilder( SiteLookup::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLookup->expects( $this->any() )
+                       ->method( 'getSite' )
+                       ->will( $this->returnCallback( function( $siteId ) {
+                               $site = new Site();
+                               $site->setGlobalId( $siteId );
+
+                               switch ( $siteId ) {
+                                       case 'eowiki':
+                                               $site->setGroup( 'wikipedia' );
+                                               $site->setLanguageCode( 'eo' );
+                                               return $site;
+                                       case 'qwertz':
+                                               $site->setGroup( 'qwertz' );
+                                               $site->setLanguageCode( 'qw' );
+                                               return $site;
+                                       case 'eowikivoyage':
+                                               $site->setGroup( 'wikivoyage' );
+                                               $site->setLanguageCode( 'eo' );
+                                               return $site;
+                               }
+                       } ) );
+
+               return $siteLookup;
+       }
+
+}
diff --git 
a/extensions/ArticlePlaceholder/tests/phpunit/includes/specials/SpecialAboutTopicTest.php
 
b/extensions/ArticlePlaceholder/tests/phpunit/includes/specials/SpecialAboutTopicTest.php
index f098b97..1880d17 100644
--- 
a/extensions/ArticlePlaceholder/tests/phpunit/includes/specials/SpecialAboutTopicTest.php
+++ 
b/extensions/ArticlePlaceholder/tests/phpunit/includes/specials/SpecialAboutTopicTest.php
@@ -2,22 +2,30 @@
 
 namespace ArticlePlaceholder\Tests\Specials;
 
+use ArticlePlaceholder\AboutTopicRenderer;
 use ArticlePlaceholder\Specials\SpecialAboutTopic;
 use DerivativeContext;
 use Language;
 use MediaWikiTestCase;
 use RequestContext;
 use SpecialPage;
+use Title;
 use Wikibase\Client\WikibaseClient;
 use Wikibase\Client\Store\TitleFactory;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Lib\Store\SiteLinkLookup;
+use Wikibase\Lib\Tests\MockRepository;
 
 /**
- * @covers ArticlePlaceholder\SpecialAboutTopic
+ * @covers ArticlePlaceholder\Specials\SpecialAboutTopic
  *
  * @group ArticlePlaceholder
  *
  * @licence GNU GPL v2+
  * @author Thiemo Mättig
+ * @author Lucie-Aimée Kaffee
  */
 class SpecialAboutTopicTest extends MediaWikiTestCase {
 
@@ -43,8 +51,8 @@
                $settings->setSetting( 'siteGroup', $siteGroup );
        }
 
-       public function testExecute() {
-               $output = $this->getInstanceOutput();
+       public function testHTML() {
+               $output = $this->getInstanceOutput( '' );
                $this->assertSame( '(articleplaceholder-abouttopic)', 
$output->getPageTitle() );
 
                $html = $output->getHTML();
@@ -55,32 +63,71 @@
                $this->assertContains( 
'(articleplaceholder-abouttopic-submit)', $html );
        }
 
+       public function testRedirect() {
+               $redirect = $this->getInstanceOutput( 'Q1234' )->getRedirect();
+
+               $this->assertSame( Title::newFromText( 'Beer' )->getLinkURL(), 
$redirect );
+       }
+
        /**
+        * @param string $itemIdSerialization
+        *
         * @return OutputPage
         */
-       private function getInstanceOutput() {
-               $termLookupFactory = $this->getMockBuilder(
-                       
'Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
+       private function getInstanceOutput( $itemIdSerialization ) {
                $context = new DerivativeContext( RequestContext::getMain() );
                $title = SpecialPage::getTitleFor( 'AboutTopic' );
                $context->setTitle( $title );
                $instance = new SpecialAboutTopic(
-                       $this->getMock( 
'Wikibase\DataModel\Entity\EntityIdParser' ),
-                       $termLookupFactory,
-                       $this->getMock( 'Wikibase\Lib\Store\SiteLinkLookup' ),
-                       $this->getMock( 'SiteStore' ),
+                       $this->getMockBuilder( AboutTopicRenderer::class 
)->disableOriginalConstructor()->getMock(),
+                       $this->getEntityIdParser(),
+                       $this->getSiteLinkLookup(),
                        new TitleFactory(),
-                       '',
-                       $this->getMock( 
'Wikibase\DataModel\Services\Lookup\EntityLookup' ),
-                       'wikipedia'
+                       'enwiki',
+                       $this->getEntityLookup()
                );
                $instance->setContext( $context );
 
-               $instance->execute( '' );
+               $instance->execute( $itemIdSerialization );
                return $instance->getOutput();
        }
 
+       private function getSiteLinkLookup() {
+               $siteLikLookup = $this->getMockBuilder( SiteLinkLookup::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLikLookup->expects( $this->any() )
+                       ->method( 'getLinks' )
+                       ->with( [ 1234 ], [ 'enwiki' ] )
+                       ->will( $this->returnValue( [ [ 'enwiki', 'Beer', 1234 
] ] ) );
+
+               return $siteLikLookup;
+       }
+
+       private function getEntityIdParser() {
+               $siteLikLookup = $this->getMockBuilder( EntityIdParser::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLikLookup->expects( $this->any() )
+                       ->method( 'parse' )
+                       ->with( 'Q1234' )
+                       ->will( $this->returnValue( new ItemId( 'Q1234' ) ) );
+
+               return $siteLikLookup;
+       }
+
+       private function getEntityLookup() {
+               $item = new Item( new ItemId( 'Q1234' ) );
+               $item->setLabel( 'en', 'Beer' );
+               $item->setDescription( 'en', 'yummy beverage' );
+               $item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Beer' );
+
+               $entityLookup = new MockRepository();
+               $entityLookup->putEntity( $item );
+
+               return $entityLookup;
+       }
+
 }
diff --git 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
index 1f49cd3..80379da 100644
--- 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
+++ 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
@@ -89,10 +89,10 @@
         * language, otherwise it will be the content language.
         * In a perfect world, this would equal Parser::getTargetLanguage.
         *
-        * This doesn't split the ParserCache by language yet, please see
-        * self::splitParserCacheIfMultilingual for that.
-        *
         * This can probably be removed after T114640 has been implemented.
+        *
+        * Please note, that this splits the parser cache by user language, if
+        * allowDataAccessInUserLanguage is true.
         *
         * @return Language
         */
@@ -100,23 +100,10 @@
                global $wgContLang;
 
                if ( $this->allowDataAccessInUserLanguage() ) {
-                       // Can't use ParserOptions::getUserLang as that already 
splits the ParserCache
-                       $userLang = 
$this->getParserOptions()->getUser()->getOption( 'language' );
-
-                       return Language::factory( $userLang );
+                       return $this->getParserOptions()->getUserLangObj();
                }
 
                return $wgContLang;
-       }
-
-       /**
-        * Splits the page's ParserCache in case we're on a multilingual wiki
-        */
-       private function splitParserCacheIfMultilingual() {
-               if ( $this->allowDataAccessInUserLanguage() ) {
-                       // ParserOptions::getUserLang splits the ParserCache
-                       $this->getParserOptions()->getUserLang();
-               }
        }
 
        /**
@@ -188,8 +175,6 @@
                $this->checkType( 'formatPropertyValues', 1, 
$propertyLabelOrId, 'string' );
                $this->checkTypeOptional( 'formatPropertyValues', 2, 
$acceptableRanks, 'table', null );
                try {
-                       $this->splitParserCacheIfMultilingual();
-
                        return array(
                                
$this->getImplementation()->formatPropertyValues(
                                        $entityId,
diff --git 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
index 45c027f..c8eb800 100644
--- 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
+++ 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
@@ -38,9 +38,14 @@
 class Scribunto_LuaWikibaseLibrary extends Scribunto_LuaLibraryBase {
 
        /**
-        * @var WikibaseLuaBindings|null
+        * @var WikibaseLanguageIndependentLuaBindings|null
         */
-       private $luaBindings = null;
+       private $languageIndependentLuaBindings = null;
+
+       /**
+        * @var WikibaseLanguageDependentLuaBindings|null
+        */
+       private $languageDependentLuaBindings = null;
 
        /**
         * @var EntityAccessor|null
@@ -83,14 +88,25 @@
        private $repoLinker = null;
 
        /**
-        * @return WikibaseLuaBindings
+        * @return WikibaseLanguageIndependentLuaBindings
         */
-       private function getLuaBindings() {
-               if ( $this->luaBindings === null ) {
-                       $this->luaBindings = $this->newLuaBindings();
+       private function getLanguageIndependentLuaBindings() {
+               if ( $this->languageIndependentLuaBindings === null ) {
+                       $this->languageIndependentLuaBindings = 
$this->newLanguageIndependentLuaBindings();
                }
 
-               return $this->luaBindings;
+               return $this->languageIndependentLuaBindings;
+       }
+
+       /**
+        * @return WikibaseLanguageDependentLuaBindings
+        */
+       private function getLanguageDependentLuaBindings() {
+               if ( $this->languageDependentLuaBindings === null ) {
+                       $this->languageDependentLuaBindings = 
$this->newLanguageDependentLuaBindings();
+               }
+
+               return $this->languageDependentLuaBindings;
        }
 
        /**
@@ -160,10 +176,10 @@
         * language, otherwise it will be the content language.
         * In a perfect world, this would equal Parser::getTargetLanguage.
         *
-        * This doesn't split the ParserCache by language yet, please see
-        * self::splitParserCacheIfMultilingual for that.
-        *
         * This can probably be removed after T114640 has been implemented.
+        *
+        * Please note, that this splits the parser cache by user language, if
+        * allowDataAccessInUserLanguage is true.
         *
         * @return Language
         */
@@ -171,23 +187,10 @@
                global $wgContLang;
 
                if ( $this->allowDataAccessInUserLanguage() ) {
-                       // Can't use ParserOptions::getUserLang as that already 
splits the ParserCache
-                       $userLang = 
$this->getParserOptions()->getUser()->getOption( 'language' );
-
-                       return Language::factory( $userLang );
+                       return $this->getParserOptions()->getUserLangObj();
                }
 
                return $wgContLang;
-       }
-
-       /**
-        * Splits the page's ParserCache in case we're on a multilingual wiki
-        */
-       private function splitParserCacheIfMultilingual() {
-               if ( $this->allowDataAccessInUserLanguage() ) {
-                       // ParserOptions::getUserLang splits the ParserCache
-                       $this->getParserOptions()->getUserLang();
-               }
        }
 
        /**
@@ -203,7 +206,7 @@
                $wikibaseClient = WikibaseClient::getDefaultInstance();
 
                return new EntityAccessor(
-                       $wikibaseClient->getEntityIdParser(),
+                       $this->getEntityIdParser(),
                        $wikibaseClient->getRestrictedEntityLookup(),
                        $this->getUsageAccumulator(),
                        $wikibaseClient->getEntitySerializer(
@@ -243,7 +246,7 @@
                );
        }
 
-       private function newLuaBindings() {
+       private function newLanguageDependentLuaBindings() {
                $wikibaseClient = WikibaseClient::getDefaultInstance();
                $usageAccumulator = $this->getUsageAccumulator();
 
@@ -255,15 +258,33 @@
                        $this->getLanguageFallbackChain()
                );
 
-               return new WikibaseLuaBindings(
-                       $wikibaseClient->getEntityIdParser(),
-                       $wikibaseClient->getStore()->getEntityLookup(),
+               return new WikibaseLanguageDependentLuaBindings(
+                       $this->getEntityIdParser(),
+                       $labelDescriptionLookup,
+                       $usageAccumulator
+               );
+       }
+
+       private function newLanguageIndependentLuaBindings() {
+               $wikibaseClient = WikibaseClient::getDefaultInstance();
+
+               return new WikibaseLanguageIndependentLuaBindings(
                        $wikibaseClient->getStore()->getSiteLinkLookup(),
                        $wikibaseClient->getSettings(),
-                       $labelDescriptionLookup,
-                       $usageAccumulator,
+                       $this->getUsageAccumulator(),
                        $wikibaseClient->getSettings()->getSetting( 
'siteGlobalID' )
                );
+       }
+
+       /**
+        * @return EntityIdParser
+        */
+       private function getEntityIdParser() {
+               if ( !$this->entityIdParser ) {
+                       $wikibaseClient = WikibaseClient::getDefaultInstance();
+                       $this->entityIdParser = 
$wikibaseClient->getEntityIdParser();
+               }
+               return $this->entityIdParser;
        }
 
        /**
@@ -311,7 +332,6 @@
         */
        public function getEntity( $prefixedEntityId ) {
                $this->checkType( 'getEntity', 1, $prefixedEntityId, 'string' );
-               $this->splitParserCacheIfMultilingual();
 
                try {
                        $entityArr = $this->getEntityAccessor()->getEntity( 
$prefixedEntityId );
@@ -336,7 +356,7 @@
         */
        public function getEntityId( $pageTitle = null ) {
                $this->checkType( 'getEntityByTitle', 1, $pageTitle, 'string' );
-               return array( $this->getLuaBindings()->getEntityId( $pageTitle 
) );
+               return array( 
$this->getLanguageIndependentLuaBindings()->getEntityId( $pageTitle ) );
        }
 
        /**
@@ -350,7 +370,7 @@
         */
        public function getSetting( $setting ) {
                $this->checkType( 'setting', 1, $setting, 'string' );
-               return array( $this->getLuaBindings()->getSetting( $setting ) );
+               return array( 
$this->getLanguageIndependentLuaBindings()->getSetting( $setting ) );
        }
 
        /**
@@ -391,17 +411,6 @@
        }
 
        /**
-        * @return EntityIdParser
-        */
-       private function getEntityIdParser() {
-               if ( !$this->entityIdParser ) {
-                       $wikibaseClient = WikibaseClient::getDefaultInstance();
-                       $this->entityIdParser = 
$wikibaseClient->getEntityIdParser();
-               }
-               return $this->entityIdParser;
-       }
-
-       /**
         * Wrapper for getLabel in Scribunto_LuaWikibaseLibraryImplementation
         *
         * @since 0.5
@@ -412,9 +421,8 @@
         */
        public function getLabel( $prefixedEntityId ) {
                $this->checkType( 'getLabel', 1, $prefixedEntityId, 'string' );
-               $this->splitParserCacheIfMultilingual();
 
-               return $this->getLuaBindings()->getLabel( $prefixedEntityId );
+               return $this->getLanguageDependentLuaBindings()->getLabel( 
$prefixedEntityId );
        }
 
        /**
@@ -428,9 +436,8 @@
         */
        public function getDescription( $prefixedEntityId ) {
                $this->checkType( 'getDescription', 1, $prefixedEntityId, 
'string' );
-               $this->splitParserCacheIfMultilingual();
 
-               return $this->getLuaBindings()->getDescription( 
$prefixedEntityId );
+               return 
$this->getLanguageDependentLuaBindings()->getDescription( $prefixedEntityId );
        }
 
        /**
@@ -444,7 +451,7 @@
         */
        public function getSiteLinkPageName( $prefixedEntityId ) {
                $this->checkType( 'getSiteLinkPageName', 1, $prefixedEntityId, 
'string' );
-               return array( $this->getLuaBindings()->getSiteLinkPageName( 
$prefixedEntityId ) );
+               return array( 
$this->getLanguageIndependentLuaBindings()->getSiteLinkPageName( 
$prefixedEntityId ) );
        }
 
        /**
@@ -459,7 +466,6 @@
         */
        public function renderSnak( $snakSerialization ) {
                $this->checkType( 'renderSnak', 1, $snakSerialization, 'table' 
);
-               $this->splitParserCacheIfMultilingual();
 
                try {
                        $ret = array( 
$this->getSnakSerializationRenderer()->renderSnak( $snakSerialization ) );
@@ -481,7 +487,6 @@
         */
        public function renderSnaks( $snaksSerialization ) {
                $this->checkType( 'renderSnaks', 1, $snaksSerialization, 
'table' );
-               $this->splitParserCacheIfMultilingual();
 
                try {
                        $ret = array( 
$this->getSnakSerializationRenderer()->renderSnaks( $snaksSerialization ) );
diff --git 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLuaBindings.php
 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindings.php
similarity index 60%
rename from 
extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLuaBindings.php
rename to 
extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindings.php
index 495476e..48000c3 100644
--- 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLuaBindings.php
+++ 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindings.php
@@ -2,22 +2,16 @@
 
 namespace Wikibase\Client\DataAccess\Scribunto;
 
-use InvalidArgumentException;
 use Wikibase\Client\Usage\UsageAccumulator;
-use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\EntityIdParsingException;
-use Wikibase\DataModel\Services\Lookup\EntityLookup;
 use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
 use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookupException;
-use Wikibase\DataModel\SiteLink;
-use Wikibase\Lib\Store\SiteLinkLookup;
 use Wikibase\Lib\Store\StorageException;
-use Wikibase\SettingsArray;
 
 /**
  * Actual implementations of various functions to access Wikibase functionality
- * through Scribunto.
+ * through Scribunto. Functions in here can dependend on the target language.
  *
  * @since 0.5
  *
@@ -25,27 +19,12 @@
  * @author Jens Ohlig < [email protected] >
  * @author Marius Hoch < [email protected] >
  */
-class WikibaseLuaBindings {
+class WikibaseLanguageDependentLuaBindings {
 
        /**
         * @var EntityIdParser
         */
        private $entityIdParser;
-
-       /**
-        * @var EntityLookup
-        */
-       private $entityLookup;
-
-       /**
-        * @var SiteLinkLookup
-        */
-       private $siteLinkLookup;
-
-       /**
-        * @var SettingsArray
-        */
-       private $settings;
 
        /**
         * @var LabelDescriptionLookup
@@ -58,67 +37,21 @@
        private $usageAccumulator;
 
        /**
-        * @var string
-        */
-       private $siteId;
-
-       /**
         * @param EntityIdParser $entityIdParser
-        * @param EntityLookup $entityLookup
-        * @param SiteLinkLookup $siteLinkLookup
-        * @param SettingsArray $settings
         * @param LabelDescriptionLookup $labelDescriptionLookup
         * @param UsageAccumulator $usageAccumulator for tracking title usage 
via getEntityId.
-        * @param string $siteId
         *
         * @note: label usage is not tracked in $usageAccumulator. This should 
be done inside
         *        the $labelDescriptionLookup or an underlying TermsLookup.
         */
        public function __construct(
                EntityIdParser $entityIdParser,
-               EntityLookup $entityLookup,
-               SiteLinkLookup $siteLinkLookup,
-               SettingsArray $settings,
                LabelDescriptionLookup $labelDescriptionLookup,
-               UsageAccumulator $usageAccumulator,
-               $siteId
+               UsageAccumulator $usageAccumulator
        ) {
                $this->entityIdParser = $entityIdParser;
-               $this->entityLookup = $entityLookup;
-               $this->siteLinkLookup = $siteLinkLookup;
-               $this->settings = $settings;
                $this->labelDescriptionLookup = $labelDescriptionLookup;
                $this->usageAccumulator = $usageAccumulator;
-               $this->siteId = $siteId;
-       }
-
-       /**
-        * Get entity id from page title.
-        *
-        * @since 0.5
-        *
-        * @param string $pageTitle
-        *
-        * @return string|null
-        */
-       public function getEntityId( $pageTitle ) {
-               $id = $this->siteLinkLookup->getItemIdForLink( $this->siteId, 
$pageTitle );
-
-               if ( !$id ) {
-                       return null;
-               }
-
-               $this->usageAccumulator->addTitleUsage( $id );
-               return $id->getSerialization();
-       }
-
-       /**
-        * @param string $setting
-        *
-        * @return mixed
-        */
-       public function getSetting( $setting ) {
-               return $this->settings->getSetting( $setting );
        }
 
        /**
@@ -183,35 +116,6 @@
                // Also notes about language fallbacks from getLabel apply
                $this->usageAccumulator->addOtherUsage( $entityId );
                return [ $term->getText(), $term->getLanguageCode() ];
-       }
-
-       /**
-        * @param string $prefixedEntityId
-        *
-        * @since 0.5
-        * @return string|null Null if no site link found.
-        */
-       public function getSiteLinkPageName( $prefixedEntityId ) {
-               try {
-                       $itemId = new ItemId( $prefixedEntityId );
-               } catch ( InvalidArgumentException $e ) {
-                       return null;
-               }
-
-               // @fixme the SiteLinks do not contain badges! but all we want 
here is page name.
-               $siteLinkRows = $this->siteLinkLookup->getLinks(
-                       [ $itemId->getNumericId() ],
-                       [ $this->siteId ]
-               );
-
-               foreach ( $siteLinkRows as $siteLinkRow ) {
-                       $siteLink = new SiteLink( $siteLinkRow[0], 
$siteLinkRow[1] );
-
-                       $this->usageAccumulator->addTitleUsage( $itemId );
-                       return $siteLink->getPageName();
-               }
-
-               return null;
        }
 
 }
diff --git 
a/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindings.php
 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindings.php
new file mode 100644
index 0000000..0e91213
--- /dev/null
+++ 
b/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindings.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Wikibase\Client\DataAccess\Scribunto;
+
+use InvalidArgumentException;
+use Wikibase\Client\Usage\UsageAccumulator;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\SiteLink;
+use Wikibase\Lib\Store\SiteLinkLookup;
+use Wikibase\SettingsArray;
+
+/**
+ * Actual implementations of various functions to access Wikibase functionality
+ * through Scribunto.
+ * All functions in here are independent from the target language, meaning that
+ * this class can be instantiated without knowing the target language.
+ *
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Jens Ohlig < [email protected] >
+ * @author Marius Hoch < [email protected] >
+ */
+class WikibaseLanguageIndependentLuaBindings {
+
+       /**
+        * @var SiteLinkLookup
+        */
+       private $siteLinkLookup;
+
+       /**
+        * @var SettingsArray
+        */
+       private $settings;
+
+       /**
+        * @var UsageAccumulator
+        */
+       private $usageAccumulator;
+
+       /**
+        * @var string
+        */
+       private $siteId;
+
+       /**
+        * @param SiteLinkLookup $siteLinkLookup
+        * @param SettingsArray $settings
+        * @param UsageAccumulator $usageAccumulator for tracking title usage 
via getEntityId.
+        * @param string $siteId
+        */
+       public function __construct(
+               SiteLinkLookup $siteLinkLookup,
+               SettingsArray $settings,
+               UsageAccumulator $usageAccumulator,
+               $siteId
+       ) {
+               $this->siteLinkLookup = $siteLinkLookup;
+               $this->settings = $settings;
+               $this->usageAccumulator = $usageAccumulator;
+               $this->siteId = $siteId;
+       }
+
+       /**
+        * Get entity id from page title.
+        *
+        * @since 0.5
+        *
+        * @param string $pageTitle
+        *
+        * @return string|null
+        */
+       public function getEntityId( $pageTitle ) {
+               $id = $this->siteLinkLookup->getItemIdForLink( $this->siteId, 
$pageTitle );
+
+               if ( !$id ) {
+                       return null;
+               }
+
+               $this->usageAccumulator->addTitleUsage( $id );
+               return $id->getSerialization();
+       }
+
+       /**
+        * @param string $setting
+        *
+        * @return mixed
+        */
+       public function getSetting( $setting ) {
+               return $this->settings->getSetting( $setting );
+       }
+
+       /**
+        * @param string $prefixedEntityId
+        *
+        * @since 0.5
+        * @return string|null Null if no site link found.
+        */
+       public function getSiteLinkPageName( $prefixedEntityId ) {
+               try {
+                       $itemId = new ItemId( $prefixedEntityId );
+               } catch ( InvalidArgumentException $e ) {
+                       return null;
+               }
+
+               // @fixme the SiteLinks do not contain badges! but all we want 
here is page name.
+               $siteLinkRows = $this->siteLinkLookup->getLinks(
+                       [ $itemId->getNumericId() ],
+                       [ $this->siteId ]
+               );
+
+               foreach ( $siteLinkRows as $siteLinkRow ) {
+                       $siteLink = new SiteLink( $siteLinkRow[0], 
$siteLinkRow[1] );
+
+                       $this->usageAccumulator->addTitleUsage( $itemId );
+                       return $siteLink->getPageName();
+               }
+
+               return null;
+       }
+
+}
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
index bba09cb..1ebd7da 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
@@ -2,6 +2,7 @@
 
 namespace Wikibase\Client\Tests\DataAccess\Scribunto;
 
+use Language;
 use LuaSandboxFunction;
 use Scribunto_LuaEngine;
 use Scribunto_LuaStandaloneInterpreterFunction;
@@ -79,20 +80,14 @@
                );
        }
 
-       /**
-        * @dataProvider allowDataAccessInUserLanguageProvider
-        */
-       public function testGetGlobalSiteId( $allowDataAccessInUserLanguage ) {
-               $cacheSplit = false;
-               $this->setAllowDataAccessInUserLanguage( 
$allowDataAccessInUserLanguage );
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
+       public function testGetGlobalSiteId() {
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary();
 
                $expected = array(
                        
WikibaseClient::getDefaultInstance()->getSettings()->getSetting( 'siteGlobalID' 
)
                );
 
                $this->assertSame( $expected, 
$luaWikibaseLibrary->getGlobalSiteId() );
-               $this->assertFalse( $cacheSplit );
        }
 
        /**
@@ -128,7 +123,8 @@
                $cacheSplit = false;
                $this->setAllowDataAccessInUserLanguage( 
$allowDataAccessInUserLanguage );
 
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
+               $lang = Language::factory( 'es' );
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit, $lang );
 
                $this->assertSame(
                        array( 'Q885588' ),
@@ -139,11 +135,7 @@
                $this->assertArrayHasKey( 'Q885588#T', $usages );
 
                if ( $allowDataAccessInUserLanguage ) {
-                       global $wgUser;
-
-                       $userLang = $wgUser->getOption( 'language' );
-
-                       $this->assertArrayHasKey( 'Q885588#L.' . $userLang, 
$usages );
+                       $this->assertArrayHasKey( 'Q885588#L.' . 
$lang->getCode(), $usages );
                } else {
                        $this->assertArrayHasKey( 'Q885588#L.de', $usages );
                }
@@ -151,12 +143,22 @@
                $this->assertSame( $allowDataAccessInUserLanguage, $cacheSplit 
);
        }
 
-       private function newScribuntoLuaWikibaseLibrary( &$cacheSplit = false ) 
{
+       /**
+        * @param bool &$cacheSplit Will become true when the ParserCache has 
been split
+        * @param Language|null $userLang The user's language
+        *
+        * @return Scribunto_LuaWikibaseLibrary
+        */
+       private function newScribuntoLuaWikibaseLibrary( &$cacheSplit = false, 
Language $userLang = null ) {
                /* @var $engine Scribunto_LuaEngine */
                $engine = $this->getEngine();
                $engine->load();
 
-               $engine->getParser()->getOptions()->registerWatcher(
+               $parserOptions = $engine->getParser()->getOptions();
+               if ( $userLang ) {
+                       $parserOptions->setUserLang( $userLang );
+               }
+               $parserOptions->registerWatcher(
                        function( $optionName ) use ( &$cacheSplit ) {
                                $this->assertSame( 'userlang', $optionName );
                                $cacheSplit = true;
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
index 9324d5b..6d031c9 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
@@ -7,7 +7,6 @@
 use Scribunto_LuaEngine;
 use Scribunto_LuaStandaloneInterpreterFunction;
 use ScribuntoException;
-use User;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\Client\DataAccess\Scribunto\Scribunto_LuaWikibaseLibrary;
 use Wikibase\Client\RepoLinker;
@@ -177,9 +176,14 @@
        }
 
        public function testGetEntityId() {
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary();
+               // Cache is not split, even if "allowDataAccessInUserLanguage" 
is true.
+               $this->setAllowDataAccessInUserLanguage( true );
+               $cacheSplit = false;
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
+
                $entityId = $luaWikibaseLibrary->getEntityId( 'CanHazKitten123' 
);
                $this->assertEquals( array( null ), $entityId );
+               $this->assertFalse( $cacheSplit );
        }
 
        public function getEntityUrlProvider() {
@@ -193,11 +197,13 @@
         * @dataProvider getEntityUrlProvider
         */
        public function testGetEntityUrl( $expected, $entityIdSerialization ) {
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary();
+               $cacheSplit = false;
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
                $luaWikibaseLibrary->setRepoLinker( $this->getRepoLinker() );
                $result = $luaWikibaseLibrary->getEntityUrl( 
$entityIdSerialization );
 
                $this->assertSame( $expected, $result );
+               $this->assertFalse( $cacheSplit );
        }
 
        private function getRepoLinker() {
@@ -217,18 +223,15 @@
         * @dataProvider allowDataAccessInUserLanguageProvider
         */
        public function testGetLabel( $allowDataAccessInUserLanguage ) {
-               $user = new User();
-               $user->setOption( 'language', 'de' );
-
-               $this->setMwGlobals( array(
-                       'wgContLang' => Language::factory( 'en' ),
-                       'wgUser' => $user
-               ) );
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'en' ) );
 
                $this->setAllowDataAccessInUserLanguage( 
$allowDataAccessInUserLanguage );
                $cacheSplit = false;
 
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary(
+                       $cacheSplit,
+                       Language::factory( 'de' )
+               );
                $label = $luaWikibaseLibrary->getLabel( 'Q32487' );
 
                if ( $allowDataAccessInUserLanguage ) {
@@ -252,8 +255,9 @@
        public function testRenderSnak( $allowDataAccessInUserLanguage ) {
                $this->setAllowDataAccessInUserLanguage( 
$allowDataAccessInUserLanguage );
                $cacheSplit = false;
+               $lang = Language::factory( 'es' );
 
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit, $lang );
                $entityArr = $luaWikibaseLibrary->getEntity( 'Q32488' );
 
                $snak = $entityArr[0]['claims']['P456'][1]['mainsnak'];
@@ -267,11 +271,7 @@
                $usage = 
$luaWikibaseLibrary->getUsageAccumulator()->getUsages();
 
                if ( $allowDataAccessInUserLanguage ) {
-                       global $wgUser;
-
-                       $userLang = $wgUser->getOption( 'language' );
-
-                       $this->assertArrayHasKey( 'Q885588#L.' . $userLang, 
$usage );
+                       $this->assertArrayHasKey( 'Q885588#L.' . 
$lang->getCode(), $usage );
                } else {
                        $this->assertArrayHasKey( 'Q885588#L.de', $usage );
                }
@@ -321,12 +321,14 @@
        }
 
        public function testResolvePropertyId() {
-               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary();
+               $cacheSplit = false;
+               $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary( 
$cacheSplit );
 
                $this->assertSame(
                        array( 'P342' ),
                        $luaWikibaseLibrary->resolvePropertyId( 
'LuaTestStringProperty' )
                );
+               $this->assertFalse( $cacheSplit );
        }
 
        public function testResolvePropertyId_propertyIdGiven() {
@@ -424,15 +426,20 @@
 
        /**
         * @param bool &$cacheSplit Will become true when the ParserCache has 
been split
+        * @param Language|null $userLang The user's language
         *
         * @return Scribunto_LuaWikibaseLibrary
         */
-       private function newScribuntoLuaWikibaseLibrary( &$cacheSplit = false ) 
{
+       private function newScribuntoLuaWikibaseLibrary( &$cacheSplit = false, 
Language $userLang = null ) {
                /* @var $engine Scribunto_LuaEngine */
                $engine = $this->getEngine();
                $engine->load();
 
-               $engine->getParser()->getOptions()->registerWatcher(
+               $parserOptions = $engine->getParser()->getOptions();
+               if ( $userLang ) {
+                       $parserOptions->setUserLang( $userLang );
+               }
+               $parserOptions->registerWatcher(
                        function( $optionName ) use ( &$cacheSplit ) {
                                $this->assertSame( 'userlang', $optionName );
                                $cacheSplit = true;
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindingsTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindingsTest.php
new file mode 100644
index 0000000..e835d53
--- /dev/null
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindingsTest.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Wikibase\Client\Tests\DataAccess\Scribunto;
+
+use PHPUnit_Framework_TestCase;
+use Wikibase\Client\DataAccess\Scribunto\WikibaseLanguageDependentLuaBindings;
+use Wikibase\Client\Usage\EntityUsage;
+use Wikibase\Client\Usage\HashUsageAccumulator;
+use Wikibase\Client\Usage\UsageAccumulator;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\BasicEntityIdParser;
+use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
+use Wikibase\DataModel\Term\Term;
+
+/**
+ * @covers 
Wikibase\Client\DataAccess\Scribunto\WikibaseLanguageDependentLuaBindings
+ *
+ * @group Wikibase
+ * @group WikibaseClient
+ * @group WikibaseScribunto
+ *
+ * @license GPL-2.0+
+ * @author Jens Ohlig < [email protected] >
+ * @author Katie Filbert < [email protected] >
+ * @author Marius Hoch < [email protected] >
+ */
+class WikibaseLanguageDependentLuaBindingsTest extends 
PHPUnit_Framework_TestCase {
+
+       public function testConstructor() {
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageDependentLuaBindings();
+
+               $this->assertInstanceOf( 
WikibaseLanguageDependentLuaBindings::class, $wikibaseLuaBindings );
+       }
+
+       /**
+        * @param UsageAccumulator|null $usageAccumulator
+        * @return WikibaseLuaBindings
+        */
+       private function getWikibaseLanguageDependentLuaBindings(
+               UsageAccumulator $usageAccumulator = null
+       ) {
+               $labelDescriptionLookup = $this->getMock( 
LabelDescriptionLookup::class );
+               $labelDescriptionLookup->expects( $this->any() )
+                       ->method( 'getLabel' )
+                       ->will( $this->returnValue( new Term( 'lang-code', 
'LabelString' ) ) );
+
+               $labelDescriptionLookup->expects( $this->any() )
+                       ->method( 'getDescription' )
+                       ->will( $this->returnValue( new Term( 'lang-code', 
'DescriptionString' ) ) );
+
+               return new WikibaseLanguageDependentLuaBindings(
+                       new BasicEntityIdParser(),
+                       $labelDescriptionLookup,
+                       $usageAccumulator ?: new HashUsageAccumulator()
+               );
+       }
+
+       private function hasUsage( $actualUsages, EntityId $entityId, $aspect ) 
{
+               $usage = new EntityUsage( $entityId, $aspect );
+               $key = $usage->getIdentityString();
+               return isset( $actualUsages[$key] );
+       }
+
+       public function getLabelProvider() {
+               return array(
+                       array( array( 'LabelString', 'lang-code' ), 'Q123' ),
+                       array( array( null, null ), 'DoesntExist' )
+               );
+       }
+
+       /**
+        * @dataProvider getLabelProvider
+        *
+        * @param string $expected
+        * @param string $itemId
+        */
+       public function testGetLabel( $expected, $itemId ) {
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageDependentLuaBindings();
+
+               $this->assertSame( $expected, $wikibaseLuaBindings->getLabel( 
$itemId ) );
+       }
+
+       public function testGetLabel_usage() {
+               $usages = new HashUsageAccumulator();
+
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageDependentLuaBindings(
+                       $usages
+               );
+
+               $itemId = new ItemId( 'Q7' );
+               $wikibaseLuaBindings->getLabel( $itemId->getSerialization() );
+
+               //NOTE: label usage is not tracked directly, this is done via 
the LabelDescriptionLookup
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
+       }
+
+       public function getDescriptionProvider() {
+               return array(
+                       array( array( 'DescriptionString', 'lang-code' ), 
'Q123' ),
+                       array( array( null, null ), 'DoesntExist' )
+               );
+       }
+
+       /**
+        * @dataProvider getDescriptionProvider
+        *
+        * @param string $expected
+        * @param string $itemId
+        */
+       public function testGetDescription( $expected, $itemId ) {
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageDependentLuaBindings();
+
+               $this->assertSame( $expected, 
$wikibaseLuaBindings->getDescription( $itemId ) );
+       }
+
+       public function testGetDescription_usage() {
+               $usages = new HashUsageAccumulator();
+
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageDependentLuaBindings(
+                       $usages
+               );
+
+               $itemId = new ItemId( 'Q7' );
+               $wikibaseLuaBindings->getDescription( 
$itemId->getSerialization() );
+
+               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::OTHER_USAGE ), 'other usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::LABEL_USAGE ), 'label usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
+       }
+
+}
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindingsTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindingsTest.php
new file mode 100644
index 0000000..61a7d72
--- /dev/null
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindingsTest.php
@@ -0,0 +1,165 @@
+<?php
+
+namespace Wikibase\Client\Tests\DataAccess\Scribunto;
+
+use PHPUnit_Framework_TestCase;
+use 
Wikibase\Client\DataAccess\Scribunto\WikibaseLanguageIndependentLuaBindings;
+use Wikibase\Client\Usage\EntityUsage;
+use Wikibase\Client\Usage\HashUsageAccumulator;
+use Wikibase\Client\Usage\UsageAccumulator;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Lib\Store\HashSiteLinkStore;
+use Wikibase\Lib\Store\SiteLinkLookup;
+use Wikibase\SettingsArray;
+
+/**
+ * @covers 
Wikibase\Client\DataAccess\Scribunto\WikibaseLanguageIndependentLuaBindings
+ *
+ * @group Wikibase
+ * @group WikibaseClient
+ * @group WikibaseScribunto
+ *
+ * @license GPL-2.0+
+ * @author Jens Ohlig < [email protected] >
+ * @author Katie Filbert < [email protected] >
+ * @author Marius Hoch < [email protected] >
+ */
+class WikibaseLanguageIndependentLuaBindingsTest extends 
PHPUnit_Framework_TestCase {
+
+       public function testConstructor() {
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageIndependentLuaBindings(
+                       $this->getMock( SiteLinkLookup::class )
+               );
+
+               $this->assertInstanceOf( 
WikibaseLanguageIndependentLuaBindings::class, $wikibaseLuaBindings );
+       }
+
+       /**
+        * @param SiteLinkLookup $siteLinkLookup
+        * @param UsageAccumulator|null $usageAccumulator
+        *
+        * @return WikibaseLuaBindings
+        */
+       private function getWikibaseLanguageIndependentLuaBindings(
+               SiteLinkLookup $siteLinkLookup,
+               UsageAccumulator $usageAccumulator = null
+       ) {
+               return new WikibaseLanguageIndependentLuaBindings(
+                       $siteLinkLookup,
+                       new SettingsArray(),
+                       $usageAccumulator ?: new HashUsageAccumulator(),
+                       "enwiki" // siteId
+               );
+       }
+
+       private function hasUsage( $actualUsages, EntityId $entityId, $aspect ) 
{
+               $usage = new EntityUsage( $entityId, $aspect );
+               $key = $usage->getIdentityString();
+               return isset( $actualUsages[$key] );
+       }
+
+       public function testGetSettings() {
+               $settings = new SettingsArray();
+               $settings->setSetting( 'a-setting', 'a-value' );
+
+               $bindings = new WikibaseLanguageIndependentLuaBindings(
+                       $this->getMock( SiteLinkLookup::class ),
+                       $settings,
+                       new HashUsageAccumulator(),
+                       "enwiki" // siteId
+               );
+
+               $this->assertSame(
+                       'a-value',
+                       $bindings->getSetting( 'a-setting' )
+               );
+       }
+
+       public function testGetEntityId() {
+               $item = new Item( new ItemId( 'Q33' ) );
+               $item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Rome' );
+
+               $usages = new HashUsageAccumulator();
+
+               $siteLinkStore = new HashSiteLinkStore();
+               $siteLinkStore->saveLinksOfItem( $item );
+
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageIndependentLuaBindings(
+                       $siteLinkStore,
+                       $usages
+               );
+
+               $id = $wikibaseLuaBindings->getEntityId( 'Rome' );
+               $this->assertSame( 'Q33', $id );
+
+               $itemId = new ItemId( $id );
+               $this->assertTrue(
+                       $this->hasUsage( $usages->getUsages(), $itemId, 
EntityUsage::TITLE_USAGE ),
+                       'title usage'
+               );
+               $this->assertFalse(
+                       $this->hasUsage( $usages->getUsages(), $itemId, 
EntityUsage::SITELINK_USAGE ),
+                       'sitelink usage'
+               );
+
+               $id = $wikibaseLuaBindings->getEntityId( 'Barcelona' );
+               $this->assertNull( $id );
+       }
+
+       public function getSiteLinkPageNameProvider() {
+               return array(
+                       array( 'Beer', 'Q666' ),
+                       array( null, 'DoesntExist' )
+               );
+       }
+
+       /**
+        * @dataProvider getSiteLinkPageNameProvider
+        *
+        * @param string $expected
+        * @param string $itemId
+        */
+       public function testGetSiteLinkPageName( $expected, $itemId ) {
+               $item = $this->getItem();
+
+               $siteLinkStore = new HashSiteLinkStore();
+               $siteLinkStore->saveLinksOfItem( $item );
+
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageIndependentLuaBindings( $siteLinkStore );
+               $this->assertSame( $expected, 
$wikibaseLuaBindings->getSiteLinkPageName( $itemId ) );
+       }
+
+       public function testGetSiteLinkPageName_usage() {
+               $item = $this->getItem();
+
+               $siteLinkStore = new HashSiteLinkStore();
+               $siteLinkStore->saveLinksOfItem( $item );
+
+               $usages = new HashUsageAccumulator();
+
+               $wikibaseLuaBindings = 
$this->getWikibaseLanguageIndependentLuaBindings(
+                       $siteLinkStore,
+                       $usages
+               );
+
+               $itemId = $item->getId();
+               $wikibaseLuaBindings->getSiteLinkPageName( 
$itemId->getSerialization() );
+
+               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::LABEL_USAGE ), 'label usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
+       }
+
+       private function getItem() {
+               $item = new Item( new ItemId( 'Q666' ) );
+               $item->setLabel( 'en', 'Beer' );
+               $item->setDescription( 'en', 'yummy beverage' );
+               $item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Beer' );
+               $item->getSiteLinkList()->addNewSiteLink( 'dewiki', 'Bier' );
+
+               return $item;
+       }
+
+}
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaBindingsTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaBindingsTest.php
deleted file mode 100644
index a24b636..0000000
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaBindingsTest.php
+++ /dev/null
@@ -1,256 +0,0 @@
-<?php
-
-namespace Wikibase\Client\Tests\DataAccess\Scribunto;
-
-use Wikibase\Client\DataAccess\Scribunto\WikibaseLuaBindings;
-use Wikibase\Client\Usage\EntityUsage;
-use Wikibase\Client\Usage\HashUsageAccumulator;
-use Wikibase\Client\Usage\UsageAccumulator;
-use Wikibase\DataModel\Entity\EntityId;
-use Wikibase\DataModel\Entity\Item;
-use Wikibase\DataModel\Entity\ItemId;
-use Wikibase\DataModel\Entity\BasicEntityIdParser;
-use Wikibase\DataModel\Services\Lookup\EntityLookup;
-use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
-use Wikibase\DataModel\Term\Term;
-use Wikibase\Lib\Store\HashSiteLinkStore;
-use Wikibase\Lib\Store\SiteLinkLookup;
-use Wikibase\SettingsArray;
-use Wikibase\Lib\Tests\MockRepository;
-
-/**
- * @covers Wikibase\Client\DataAccess\Scribunto\WikibaseLuaBindings
- *
- * @group Wikibase
- * @group WikibaseClient
- * @group WikibaseScribunto
- *
- * @license GPL-2.0+
- * @author Jens Ohlig < [email protected] >
- * @author Katie Filbert < [email protected] >
- * @author Marius Hoch < [email protected] >
- */
-class WikibaseLuaBindingsTest extends \PHPUnit_Framework_TestCase {
-
-       public function testConstructor() {
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       new MockRepository(),
-                       new HashSiteLinkStore()
-               );
-
-               $this->assertInstanceOf( WikibaseLuaBindings::class, 
$wikibaseLuaBindings );
-       }
-
-       /**
-        * @param EntityLookup $entityLookup
-        * @param SiteLinkLookup $siteLinkLookup
-        * @param UsageAccumulator|null $usageAccumulator
-        * @return WikibaseLuaBindings
-        */
-       private function getWikibaseLuaBindings(
-               EntityLookup $entityLookup,
-               SiteLinkLookup $siteLinkLookup,
-               UsageAccumulator $usageAccumulator = null
-       ) {
-               $labelDescriptionLookup = $this->getMock( 
LabelDescriptionLookup::class );
-               $labelDescriptionLookup->expects( $this->any() )
-                       ->method( 'getLabel' )
-                       ->will( $this->returnValue( new Term( 'lang-code', 
'LabelString' ) ) );
-
-               $labelDescriptionLookup->expects( $this->any() )
-                       ->method( 'getDescription' )
-                       ->will( $this->returnValue( new Term( 'lang-code', 
'DescriptionString' ) ) );
-
-               return new WikibaseLuaBindings(
-                       new BasicEntityIdParser(),
-                       $entityLookup,
-                       $siteLinkLookup,
-                       new SettingsArray(),
-                       $labelDescriptionLookup,
-                       $usageAccumulator ?: new HashUsageAccumulator(),
-                       "enwiki" // siteId
-               );
-       }
-
-       private function hasUsage( $actualUsages, EntityId $entityId, $aspect ) 
{
-               $usage = new EntityUsage( $entityId, $aspect );
-               $key = $usage->getIdentityString();
-               return isset( $actualUsages[$key] );
-       }
-
-       public function testGetEntityId() {
-               $item = new Item( new ItemId( 'Q33' ) );
-               $item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Rome' );
-
-               $usages = new HashUsageAccumulator();
-
-               $entityLookup = new MockRepository();
-               $entityLookup->putEntity( $item );
-
-               $siteLinkStore = new HashSiteLinkStore();
-               $siteLinkStore->saveLinksOfItem( $item );
-
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       $entityLookup,
-                       $siteLinkStore,
-                       $usages
-               );
-
-               $id = $wikibaseLuaBindings->getEntityId( 'Rome' );
-               $this->assertSame( 'Q33', $id );
-
-               $itemId = new ItemId( $id );
-               $this->assertTrue(
-                       $this->hasUsage( $usages->getUsages(), $itemId, 
EntityUsage::TITLE_USAGE ),
-                       'title usage'
-               );
-               $this->assertFalse(
-                       $this->hasUsage( $usages->getUsages(), $itemId, 
EntityUsage::SITELINK_USAGE ),
-                       'sitelink usage'
-               );
-
-               $id = $wikibaseLuaBindings->getEntityId( 'Barcelona' );
-               $this->assertNull( $id );
-       }
-
-       public function getLabelProvider() {
-               return array(
-                       array( array( 'LabelString', 'lang-code' ), 'Q123' ),
-                       array( array( null, null ), 'DoesntExist' )
-               );
-       }
-
-       /**
-        * @dataProvider getLabelProvider
-        *
-        * @param string $expected
-        * @param string $itemId
-        */
-       public function testGetLabel( $expected, $itemId ) {
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       new MockRepository(),
-                       new HashSiteLinkStore()
-               );
-
-               $this->assertSame( $expected, $wikibaseLuaBindings->getLabel( 
$itemId ) );
-       }
-
-       public function testGetLabel_usage() {
-               $usages = new HashUsageAccumulator();
-
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       new MockRepository(),
-                       new HashSiteLinkStore(),
-                       $usages
-               );
-
-               $itemId = new ItemId( 'Q7' );
-               $wikibaseLuaBindings->getLabel( $itemId->getSerialization() );
-
-               //NOTE: label usage is not tracked directly, this is done via 
the LabelDescriptionLookup
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
-       }
-
-       public function getDescriptionProvider() {
-               return array(
-                       array( array( 'DescriptionString', 'lang-code' ), 
'Q123' ),
-                       array( array( null, null ), 'DoesntExist' )
-               );
-       }
-
-       /**
-        * @dataProvider getDescriptionProvider
-        *
-        * @param string $expected
-        * @param string $itemId
-        */
-       public function testGetDescription( $expected, $itemId ) {
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       new MockRepository(),
-                       new HashSiteLinkStore()
-               );
-
-               $this->assertSame( $expected, 
$wikibaseLuaBindings->getDescription( $itemId ) );
-       }
-
-       public function testGetDescription_usage() {
-               $usages = new HashUsageAccumulator();
-
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       new MockRepository(),
-                       new HashSiteLinkStore(),
-                       $usages
-               );
-
-               $itemId = new ItemId( 'Q7' );
-               $wikibaseLuaBindings->getDescription( 
$itemId->getSerialization() );
-
-               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::OTHER_USAGE ), 'other usage' );
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::LABEL_USAGE ), 'label usage' );
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
-       }
-
-       public function getSiteLinkPageNameProvider() {
-               return array(
-                       array( 'Beer', 'Q666' ),
-                       array( null, 'DoesntExist' )
-               );
-       }
-
-       /**
-        * @dataProvider getSiteLinkPageNameProvider
-        *
-        * @param string $expected
-        * @param string $itemId
-        */
-       public function testGetSiteLinkPageName( $expected, $itemId ) {
-               $item = $this->getItem();
-
-               $entityLookup = new MockRepository();
-               $entityLookup->putEntity( $item );
-
-               $siteLinkStore = new HashSiteLinkStore();
-               $siteLinkStore->saveLinksOfItem( $item );
-
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings( 
$entityLookup, $siteLinkStore );
-               $this->assertSame( $expected, 
$wikibaseLuaBindings->getSiteLinkPageName( $itemId ) );
-       }
-
-       public function testGetSiteLinkPageName_usage() {
-               $item = $this->getItem();
-
-               $entityLookup = new MockRepository();
-               $entityLookup->putEntity( $item );
-
-               $siteLinkStore = new HashSiteLinkStore();
-               $siteLinkStore->saveLinksOfItem( $item );
-
-               $usages = new HashUsageAccumulator();
-
-               $wikibaseLuaBindings = $this->getWikibaseLuaBindings(
-                       $entityLookup,
-                       $siteLinkStore,
-                       $usages
-               );
-
-               $itemId = $item->getId();
-               $wikibaseLuaBindings->getSiteLinkPageName( 
$itemId->getSerialization() );
-
-               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::LABEL_USAGE ), 'label usage' );
-               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
-       }
-
-       protected function getItem() {
-               $item = new Item( new ItemId( 'Q666' ) );
-               $item->setLabel( 'en', 'Beer' );
-               $item->setDescription( 'en', 'yummy beverage' );
-               $item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Beer' );
-               $item->getSiteLinkList()->addNewSiteLink( 'dewiki', 'Bier' );
-
-               return $item;
-       }
-
-}
diff --git a/extensions/Wikibase/lib/i18n/nl.json 
b/extensions/Wikibase/lib/i18n/nl.json
index 1ea20f8..1b24581 100644
--- a/extensions/Wikibase/lib/i18n/nl.json
+++ b/extensions/Wikibase/lib/i18n/nl.json
@@ -96,15 +96,15 @@
        "wikibase-entity-summary-wbeditentity-create": "Nieuwe entiteit 
aangemaakt",
        "wikibase-entity-summary-wbeditentity-update": "Een entiteit gewijzigd",
        "wikibase-entity-summary-wbeditentity-override": "Een entiteit geleegd",
-       "wikibase-entity-summary-wbsetreference": "Referentie instellen",
-       "wikibase-entity-summary-wbsetreference-add": "Referentie toegevoegd 
aan claim",
-       "wikibase-entity-summary-wbsetreference-set": "Referentie van claim 
gewijzigd",
+       "wikibase-entity-summary-wbsetreference": "Bron ingesteld",
+       "wikibase-entity-summary-wbsetreference-add": "Bron toegevoegd aan 
verklaring",
+       "wikibase-entity-summary-wbsetreference-set": "Bron van verklaring 
gewijzigd",
        "wikibase-entity-summary-wbsetlabel-add": "Label toegevoegd voor [$2]",
-       "wikibase-entity-summary-wbsetlabel-set": "Label [$2] gewijzigd.",
-       "wikibase-entity-summary-wbsetlabel-remove": "Label [$2] verwijderd",
+       "wikibase-entity-summary-wbsetlabel-set": "[$2]-label gewijzigd.",
+       "wikibase-entity-summary-wbsetlabel-remove": "[$2]-label verwijderd",
        "wikibase-entity-summary-wbsetdescription-add": "Beschrijving 
toegevoegd voor [$2]",
-       "wikibase-entity-summary-wbsetdescription-set": "Beschrijving [$2] 
gewijzigd",
-       "wikibase-entity-summary-wbsetdescription-remove": "Beschrijving [$2] 
verwijderd",
+       "wikibase-entity-summary-wbsetdescription-set": "[$2]-beschrijving 
gewijzigd",
+       "wikibase-entity-summary-wbsetdescription-remove": "[$2]-beschrijving 
verwijderd",
        "wikibase-entity-summary-wbsetaliases-set": "{{PLURAL:$1|Alias|$1 
aliassen}} voor [$2] ingesteld",
        "wikibase-entity-summary-wbsetaliases-add-remove": 
"{{PLURAL:$1|Alias|$1 aliassen}} voor [$2] toegevoegd en verwijderd",
        "wikibase-entity-summary-wbsetaliases-add": "{{PLURAL:$1|Alias|$1 
aliassen}} voor [$2] toegevoegd",
@@ -118,38 +118,38 @@
        "wikibase-entity-summary-wbsetsitelink-remove": "Koppeling verwijderd 
voor [$2]",
        "wikibase-entity-summary-wblinktitles-create": "Nieuwe entiteit 
aangemaakt om pagina's met elkaar te koppelen",
        "wikibase-entity-summary-wblinktitles-connect": "Taalkoppeling 
toegevoegd om pagina's met elkaar te koppelen",
-       "wikibase-entity-summary-wbcreateclaim-value": "Claim{{PLURAL:$1||s}} 
aangemaakt",
-       "wikibase-entity-summary-wbcreateclaim-novalue": "Claim{{PLURAL:$1||s}} 
aangemaakt",
-       "wikibase-entity-summary-wbcreateclaim-somevalue": 
"Claim{{PLURAL:$1||s}} aangemaakt",
-       "wikibase-entity-summary-wbcreateclaim": "Claim{{PLURAL:$1||s}} 
aangemaakt",
-       "wikibase-entity-summary-wbsetclaimvalue": "Claimwaarde{{PLURAL:$1||n}} 
ingesteld",
-       "wikibase-entity-summary-wbremoveclaims": "{{PLURAL:$1|Claim|Claims}} 
verwijderd",
+       "wikibase-entity-summary-wbcreateclaim-value": 
"Verklaring{{PLURAL:$1||en}} aangemaakt",
+       "wikibase-entity-summary-wbcreateclaim-novalue": 
"Verklaring{{PLURAL:$1||en}} aangemaakt",
+       "wikibase-entity-summary-wbcreateclaim-somevalue": 
"Verklaring{{PLURAL:$1||en}} aangemaakt",
+       "wikibase-entity-summary-wbcreateclaim": "Verklaring{{PLURAL:$1||en}} 
aangemaakt",
+       "wikibase-entity-summary-wbsetclaimvalue": 
"Verklaringwaarde{{PLURAL:$1||n}} ingesteld",
+       "wikibase-entity-summary-wbremoveclaims": "Verklaring{{PLURAL:$1||en}} 
verwijderd",
        "wikibase-entity-summary-special-create-item": "Item voor [$2] met 
waarde{{PLURAL:$1||n}} aangemaakt",
-       "wikibase-entity-summary-wbcreateclaim-create": "Claim aangemaakt",
-       "wikibase-entity-summary-wbremoveclaims-remove": 
"{{PLURAL:$1|Claim|Claims}} verwijderd",
-       "wikibase-entity-summary-wbsetclaim-update": 
"{{PLURAL:$3|Claim|Claims}} gewijzigd",
-       "wikibase-entity-summary-wbsetclaim-create": "Claim{{PLURAL:$3||s}} 
aangemaakt",
-       "wikibase-entity-summary-wbsetclaim-update-qualifiers": 
"{{PLURAL:$4|één qualifier|$4 qualifiers}} van {{PLURAL:$3|één claim|$3 
claims}} gewijzigd",
-       "wikibase-entity-summary-wbsetclaim-update-references": 
"{{PLURAL:$4|Eén referentie|$4 referenties}} van {{PLURAL:$3|één claim|$3 
claims}} gewijzigd",
-       "wikibase-entity-summary-wbsetclaim-update-rank": "Volgorde van 
{{PLURAL:$3|één claim|$3 claims}} gewijzigd",
+       "wikibase-entity-summary-wbcreateclaim-create": "Verklaring aangemaakt",
+       "wikibase-entity-summary-wbremoveclaims-remove": 
"Verklaring{{PLURAL:$1||en}} verwijderd",
+       "wikibase-entity-summary-wbsetclaim-update": 
"Verklaring{{PLURAL:$3||en}} gewijzigd",
+       "wikibase-entity-summary-wbsetclaim-create": 
"Verklaring{{PLURAL:$3||en}} aangemaakt",
+       "wikibase-entity-summary-wbsetclaim-update-qualifiers": 
"{{PLURAL:$4|Eén kwalificatie|$4 kwalificaties}} van {{PLURAL:$3|één 
verklaring|$3 verklaringen}} gewijzigd",
+       "wikibase-entity-summary-wbsetclaim-update-references": 
"{{PLURAL:$4|Eén bron|$4 bronnen}} van {{PLURAL:$3|één verklaring|$3 
verklaringen}} gewijzigd",
+       "wikibase-entity-summary-wbsetclaim-update-rank": "Volgorde van 
{{PLURAL:$3|één verklaring|$3 verklaringen}} gewijzigd",
        "wikibase-entity-summary-clientsitelink-update": "Pagina hernoemd van 
[$3] naar [$4]",
        "wikibase-entity-summary-clientsitelink-remove": "Pagina op [$3] 
verwijderd",
-       "wikibase-entity-summary-wbsetqualifier-add": 
"{{PLURAL:$1|Qualifier|Qualifiers}} toegevoegd",
-       "wikibase-entity-summary-wbsetqualifier-update": 
"{{PLURAL:$1|Qualifier|Qualifiers}} gewijzigd",
-       "wikibase-entity-summary-wbremovequalifiers-remove": 
"{{PLURAL:$1|Qualifier|Qualifiers}} verwijderd",
-       "wikibase-entity-summary-wbremovereferences-remove": 
"{{PLURAL:$3|Referentie|Referenties}} van claim verwijderd",
-       "wikibase-entity-summary-wbmergeitems-from": "Samengevoegd uit \"$3\"",
-       "wikibase-entity-summary-wbmergeitems-to": "Item samengevoegd naar 
\"$3\"",
+       "wikibase-entity-summary-wbsetqualifier-add": 
"Kwalificatie{{PLURAL:$1||s}} toegevoegd",
+       "wikibase-entity-summary-wbsetqualifier-update": 
"Kwalificatie{{PLURAL:$1||s}} gewijzigd",
+       "wikibase-entity-summary-wbremovequalifiers-remove": 
"Kwalificatie{{PLURAL:$1||s}} verwijderd",
+       "wikibase-entity-summary-wbremovereferences-remove": 
"Bron{{PLURAL:$3||nen}} van verklaring verwijderd",
+       "wikibase-entity-summary-wbmergeitems-from": "Samengevoegd uit $3",
+       "wikibase-entity-summary-wbmergeitems-to": "Item samengevoegd naar $3",
        "wikibase-item-summary-wbcreate-new": "Nieuw item aangemaakt",
        "wikibase-item-summary-wbeditentity": "Nieuw item aangemaakt",
        "wikibase-item-summary-wbeditentity-create": "Nieuw item gemaakt",
        "wikibase-item-summary-wbeditentity-update": "Een item bijgewerkt",
-       "wikibase-item-summary-wbeditentity-override": "Item overschreven",
+       "wikibase-item-summary-wbeditentity-override": "Item geleegd",
        "wikibase-item-summary-wblinktitles-create": "Item aangemaakt om 
pagina's te koppelen",
        "wikibase-item-summary-wblinktitles-connect": "Taalkoppeling naar 
gekoppelde pagina's toegevoegd",
        "wikibase-property-summary-wbcreate-new": "Nieuwe eigenschap 
aangemaakt",
        "wikibase-property-summary-wbeditentity-create": "Nieuwe eigenschap 
aangemaakt",
        "wikibase-property-summary-wbeditentity-update": "Een eigenschap 
bijgewerkt",
-       "wikibase-property-summary-wbeditentity-override": "Eigenschap 
verwijderd",
+       "wikibase-property-summary-wbeditentity-override": "Eigenschap geleegd",
        "wikibase-property-summary-special-create-property": "Eigenschap voor 
[$2] met waarde{{PLURAL:$1||n}} aangemaakt"
 }
diff --git a/extensions/Wikibase/lib/i18n/ru.json 
b/extensions/Wikibase/lib/i18n/ru.json
index 10a07f5..04dde07 100644
--- a/extensions/Wikibase/lib/i18n/ru.json
+++ b/extensions/Wikibase/lib/i18n/ru.json
@@ -19,7 +19,7 @@
        "wikibase-deletedentity-query": "Удалённый запрос",
        "wikibase-error-unexpected": "Ошибка: $1.",
        "wikibase-error-save-generic": "Не удалось сохранить из-за возникшей 
ошибки.",
-       "wikibase-error-remove-generic": "Произошла ошибка при попытке 
выполнить удаление. Ваши изменения не могут быть завершены.",
+       "wikibase-error-remove-generic": "Не удалось удалить из-за возникшей 
ошибки.",
        "wikibase-error-save-connection": "При попытке выполнить сохранение 
произошла ошибка подключения. Ваши изменения не могут быть завершены. 
Пожалуйста, проверьте своё подключение к интернету.",
        "wikibase-error-remove-connection": "При попытке выполнить удаление 
произошла ошибка подключения. Ваши изменения не могут быть завершены. 
Пожалуйста, проверьте своё подключение к интернету.",
        "wikibase-error-save-timeout": "Мы испытываем технические проблемы. 
Ваше сохранение не может быть завершено.",
diff --git a/extensions/Wikibase/repo/i18n/nl.json 
b/extensions/Wikibase/repo/i18n/nl.json
index 1a6db92..77557b9 100644
--- a/extensions/Wikibase/repo/i18n/nl.json
+++ b/extensions/Wikibase/repo/i18n/nl.json
@@ -157,6 +157,8 @@
        "wikibase-newproperty-fieldset": "Nieuwe eigenschap aanmaken",
        "wikibase-newproperty-datatype": "Gegevenstype:",
        "wikibase-newproperty-invalid-datatype": "Er is een ongeldig 
gegevenstype opgegeven.",
+       "wikibase-description-helppage": "Help:Beschrijving",
+       "wikibase-label-helppage": "Help:Label",
        "special-newitem": "Nieuw item aanmaken",
        "wikibase-newitem-summary": "Zorg ervoor dat u 
[[Special:Search|controleert of het item al bestaat]]!<br />U moet een 
[[{{int:Wikibase-label-helppage}}|label]] en een 
[[{{int:Wikibase-description-helppage}}|beschrijving]] opgeven voor alle nieuwe 
items.",
        "wikibase-newitem-fieldset": "Nieuw item aanmaken",
@@ -164,6 +166,7 @@
        "wikibase-newitem-page": "Naam van de eerste gekoppelde pagina",
        "wikibase-newitem-no-external-page": "De opgegeven pagina kon niet 
worden gevonden op de overeenkomende site.",
        "wikibase-newitem-not-recognized-siteid": "Het opgegeven site-ID is 
niet herkend.",
+       "wikibase-newitem-not-recognized-language": "De opgegeven taalcode kon 
niet worden herkend.",
        "wikibase-newentity-language": "Taal:",
        "wikibase-newentity-label": "Label:",
        "wikibase-newentity-description": "Beschrijving:",
@@ -211,7 +214,7 @@
        "wikibase-mergeitems-fromid": "Het itemnummer waarvan samen te voegen",
        "wikibase-mergeitems-toid": "Het itemnummer waarnaar samen te voegen",
        "wikibase-mergeitems-submit": "Items samenvoegen",
-       "wikibase-mergeitems-success": "$1 is succesvol samengevoegd naar $3 en 
is doorverwezen.",
+       "wikibase-mergeitems-success": "$1 is samengevoegd naar $3 en is 
doorverwezen.",
        "wikibase-itemmerge-missing-parameter": "Onvolledige invoer.",
        "wikibase-itemmerge-not-item": "De opgegeven entiteit is geen Item.",
        "wikibase-itemmerge-failed-save": "Fout bij het opslaan van het item.",
diff --git a/extensions/Wikibase/repo/includes/Api/EditEntity.php 
b/extensions/Wikibase/repo/includes/Api/EditEntity.php
index 4e3e6a4..c88e63c 100644
--- a/extensions/Wikibase/repo/includes/Api/EditEntity.php
+++ b/extensions/Wikibase/repo/includes/Api/EditEntity.php
@@ -3,8 +3,8 @@
 namespace Wikibase\Repo\Api;
 
 use ApiMain;
-use DataValues\IllegalValueException;
 use Deserializers\Deserializer;
+use Exception;
 use InvalidArgumentException;
 use MWException;
 use SiteList;
@@ -537,13 +537,11 @@
                                        $statement = 
$this->statementDeserializer->deserialize( $statementArray );
 
                                        if ( !( $statement instanceof Statement 
) ) {
-                                               throw new 
IllegalValueException( 'Statement serialization did not contained a Statement.' 
);
+                                               throw new Exception( 'Statement 
serialization did not contained a Statement.' );
                                        }
 
                                        $opsToReturn[] = 
$this->statementChangeOpFactory->newSetStatementOp( $statement );
-                               } catch ( IllegalValueException $ex ) {
-                                       $this->errorReporter->dieException( 
$ex, 'invalid-claim' );
-                               } catch ( MWException $ex ) {
+                               } catch ( Exception $ex ) {
                                        $this->errorReporter->dieException( 
$ex, 'invalid-claim' );
                                }
                        }
diff --git a/extensions/Wikibase/repo/includes/Store/Sql/SqlIdGenerator.php 
b/extensions/Wikibase/repo/includes/Store/Sql/SqlIdGenerator.php
index b05f363..c86cad1 100644
--- a/extensions/Wikibase/repo/includes/Store/Sql/SqlIdGenerator.php
+++ b/extensions/Wikibase/repo/includes/Store/Sql/SqlIdGenerator.php
@@ -62,11 +62,7 @@
         * @return int
         */
        private function generateNewId( DatabaseBase $database, $type, $retry = 
true ) {
-               $trx = $database->trxLevel();
-
-               if ( $trx == 0 ) {
-                       $database->begin( __METHOD__ );
-               }
+               $database->startAtomic( __METHOD__ );
 
                $currentId = $database->selectRow(
                        'wb_id_counters',
@@ -103,9 +99,7 @@
                        }
                }
 
-               if ( $trx == 0 ) {
-                       $database->commit( __METHOD__ );
-               }
+               $database->endAtomic( __METHOD__ );
 
                if ( !$success ) {
                        throw new MWException( 'Could not generate a reliably 
unique ID.' );
diff --git 
a/extensions/Wikibase/repo/tests/phpunit/includes/Api/EditEntityTest.php 
b/extensions/Wikibase/repo/tests/phpunit/includes/Api/EditEntityTest.php
index d87e5f2..9b66492 100644
--- a/extensions/Wikibase/repo/tests/phpunit/includes/Api/EditEntityTest.php
+++ b/extensions/Wikibase/repo/tests/phpunit/includes/Api/EditEntityTest.php
@@ -5,6 +5,7 @@
 use UsageException;
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\Property;
+use Wikibase\DataModel\Services\Statement\StatementGuidParsingException;
 use Wikibase\Lib\Store\StorageException;
 use Wikibase\Repo\WikibaseRepo;
 
@@ -674,6 +675,34 @@
                                        'message' => 'Cannot remove a claim 
with no GUID'
                                ) )
                        ),
+                       'invalid entity ID in data value' => array(
+                               'p' => array(
+                                       'id' => '%Berlin%',
+                                       'data' => '{ "claims": [ {
+                                               "mainsnak": { "snaktype": 
"novalue", "property": "P0" },
+                                               "type": "statement"
+                                       } ] }'
+                               ),
+                               'e' => array( 'exception' => array(
+                                       'type' => UsageException::class,
+                                       'code' => 'invalid-claim',
+                                       'message' => '\'P0\' is not a valid 
entity ID'
+                               ) )
+                       ),
+                       'invalid statement GUID' => array(
+                               'p' => array(
+                                       'id' => '%Berlin%',
+                                       'data' => '{ "claims": [ {
+                                               "id": "Q0$GUID",
+                                               "mainsnak": { "snaktype": 
"novalue", "property": "%P56%" },
+                                               "type": "statement"
+                                       } ] }'
+                               ),
+                               'e' => array( 'exception' => array(
+                                       // FIXME: Does this also need fixing?
+                                       'type' => 
StatementGuidParsingException::class
+                               ) )
+                       ),
                        'removing valid claim with no guid fails' => array(
                                'p' => array(
                                        'site' => 'enwiki',
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.js 
b/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.js
index fe05d51..3d50010 100644
--- a/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.js
+++ b/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.js
@@ -245,6 +245,13 @@
                        }
                } )
                .on( 'entityselectorselected', function( event, entityId ) {
+                       if ( self._variation ) {
+                               // A new property has been selected:
+                               // Remove the existing variation as it's 
impossible to change
+                               // the property id in the variation and its 
dependencies.
+                               self._variation.destroy();
+                               self._variation = null;
+                       }
                        self._selectProperty();
                } );
        },
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.variations.Value.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.variations.Value.js
index 3bfb1cf..b113f98 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.variations.Value.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/snakview/snakview.variations.Value.js
@@ -400,7 +400,7 @@
                        }
                },
 
-               /*
+               /**
                 * @inheritdoc
                 */
                isFocusable: function() {
diff --git a/vendor/composer/autoload_classmap.php 
b/vendor/composer/autoload_classmap.php
index 3d8d914..d474f2a 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,6 +6,7 @@
 $baseDir = dirname($vendorDir);
 
 return array(
+    'ArticlePlaceholder\\AboutTopicRenderer' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/AboutTopicRenderer.php',
     'ArticlePlaceholder\\BaseTemplateToolboxHookHandler' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/BaseTemplateToolboxHookHandler.php',
     'ArticlePlaceholder\\Hooks' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/Hooks.php',
     'ArticlePlaceholder\\ItemNotabilityFilter' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/ItemNotabilityFilter.php',
@@ -407,7 +408,8 @@
     
'Wikibase\\Client\\DataAccess\\Scribunto\\Scribunto_LuaWikibaseEntityLibrary' 
=> $baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php',
     'Wikibase\\Client\\DataAccess\\Scribunto\\Scribunto_LuaWikibaseLibrary' => 
$baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php',
     'Wikibase\\Client\\DataAccess\\Scribunto\\SnakSerializationRenderer' => 
$baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/SnakSerializationRenderer.php',
-    'Wikibase\\Client\\DataAccess\\Scribunto\\WikibaseLuaBindings' => $baseDir 
. 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLuaBindings.php',
+    
'Wikibase\\Client\\DataAccess\\Scribunto\\WikibaseLanguageDependentLuaBindings' 
=> $baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindings.php',
+    
'Wikibase\\Client\\DataAccess\\Scribunto\\WikibaseLanguageIndependentLuaBindings'
 => $baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindings.php',
     'Wikibase\\Client\\DataAccess\\Scribunto\\WikibaseLuaEntityBindings' => 
$baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php',
     'Wikibase\\Client\\DataAccess\\SnaksFinder' => $baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/SnaksFinder.php',
     'Wikibase\\Client\\DataAccess\\StatementTransclusionInteractor' => 
$baseDir . 
'/extensions/Wikibase/client/includes/DataAccess/StatementTransclusionInteractor.php',
@@ -476,7 +478,8 @@
     
'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\Scribunto_LuaWikibaseLibraryTest'
 => $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php',
     
'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\Scribunto_LuaWikibaseLibraryTestCase'
 => $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTestCase.php',
     
'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\SnakSerializationRendererTest' 
=> $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/SnakSerializationRendererTest.php',
-    'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\WikibaseLuaBindingsTest' 
=> $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaBindingsTest.php',
+    
'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\WikibaseLanguageDependentLuaBindingsTest'
 => $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageDependentLuaBindingsTest.php',
+    
'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\WikibaseLanguageIndependentLuaBindingsTest'
 => $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLanguageIndependentLuaBindingsTest.php',
     
'Wikibase\\Client\\Tests\\DataAccess\\Scribunto\\WikibaseLuaEntityBindingsTest' 
=> $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php',
     'Wikibase\\Client\\Tests\\DataAccess\\SnaksFinderTest' => $baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/SnaksFinderTest.php',
     
'Wikibase\\Client\\Tests\\DataAccess\\WikibaseDataAccessTestItemSetUpHelper' => 
$baseDir . 
'/extensions/Wikibase/client/tests/phpunit/includes/DataAccess/WikibaseDataAccessTestItemSetUpHelper.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 79efbca..347ca53 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -110,19 +110,19 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-ArticlePlaceholder.git";,
-            "reference": "2fa8987bbf2daace8bae00cf1f4f0d02a9d0b47e"
+            "reference": "747b41328a4650aca8f7a3c3e29ee4d72668ee93"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/2fa8987bbf2daace8bae00cf1f4f0d02a9d0b47e";,
-            "reference": "2fa8987bbf2daace8bae00cf1f4f0d02a9d0b47e",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/747b41328a4650aca8f7a3c3e29ee4d72668ee93";,
+            "reference": "747b41328a4650aca8f7a3c3e29ee4d72668ee93",
             "shasum": ""
         },
         "require-dev": {
             "jakub-onderka/php-parallel-lint": "0.9.2",
             "mediawiki/mediawiki-codesniffer": "0.7.2"
         },
-        "time": "2016-08-24 08:30:24",
+        "time": "2016-08-25 01:06:03",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {
@@ -1397,12 +1397,12 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-            "reference": "7c19c5037aee83d9eda90da0bdff9a00d21aa521"
+            "reference": "aa4f666667f49ca7b40b7cf88bab92fa5236018d"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/7c19c5037aee83d9eda90da0bdff9a00d21aa521";,
-            "reference": "7c19c5037aee83d9eda90da0bdff9a00d21aa521",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/aa4f666667f49ca7b40b7cf88bab92fa5236018d";,
+            "reference": "aa4f666667f49ca7b40b7cf88bab92fa5236018d",
             "shasum": ""
         },
         "require": {
@@ -1435,7 +1435,7 @@
             "jakub-onderka/php-parallel-lint": "0.9.2",
             "mediawiki/mediawiki-codesniffer": "0.4.0|0.5.0"
         },
-        "time": "2016-08-24 09:29:21",
+        "time": "2016-08-24 21:34:05",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {

-- 
To view, visit https://gerrit.wikimedia.org/r/306644
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9d6a7867b721e88f46892af746b82036c9486c8c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikidata
Gerrit-Branch: master
Gerrit-Owner: WikidataBuilder <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to