diff --git a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php
index bd5c631eb92a553a8a06b74103b355556a1ef4fb..4c6f922b7ccdd5ba39878adefe06a4e9b78afff0 100644
--- a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php
+++ b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php
@@ -159,7 +159,26 @@ class ExtendedIni implements FileLoaderInterface
         if ($data === false) {
             throw new InvalidArgumentException("Ini file '{$filename}' not found");
         }
-        return $data;
+
+        // Load parent data, if necessary:
+        return $this->loadParentData($data);
+    }
+
+    /**
+     * Support method for loadLanguageFile: retrieve parent data.
+     *
+     * @param TextDomain $data TextDomain to populate with parent information.
+     *
+     * @return TextDomain
+     */
+    protected function loadParentData($data)
+    {
+        if (!isset($data['@parent_ini'])) {
+            return $data;
+        }
+        $parent = $this->loadLanguageFile($data['@parent_ini']);
+        $parent->merge($data);
+        return $parent;
     }
 
     /**
diff --git a/module/VuFind/tests/fixtures/language/base/child1.ini b/module/VuFind/tests/fixtures/language/base/child1.ini
new file mode 100644
index 0000000000000000000000000000000000000000..9ec420aee08e7f00ef1b446ff5e0c0970e9ff11f
--- /dev/null
+++ b/module/VuFind/tests/fixtures/language/base/child1.ini
@@ -0,0 +1,2 @@
+@parent_ini = "fake.ini"
+test2 = "test 2"
\ No newline at end of file
diff --git a/module/VuFind/tests/fixtures/language/base/child2.ini b/module/VuFind/tests/fixtures/language/base/child2.ini
new file mode 100644
index 0000000000000000000000000000000000000000..07c807983149ef623ceede2ed8f8b7583c410ba2
--- /dev/null
+++ b/module/VuFind/tests/fixtures/language/base/child2.ini
@@ -0,0 +1,2 @@
+@parent_ini = "child1.ini"
+test1 = "test 1"
\ No newline at end of file
diff --git a/module/VuFind/tests/fixtures/language/base/self-parent.ini b/module/VuFind/tests/fixtures/language/base/self-parent.ini
new file mode 100644
index 0000000000000000000000000000000000000000..2babc6e38cf5547ee8c1c597010c9f6e833fd6aa
--- /dev/null
+++ b/module/VuFind/tests/fixtures/language/base/self-parent.ini
@@ -0,0 +1,2 @@
+@parent_ini = "self-parent.ini"
+string = "bad"
\ No newline at end of file
diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php
index c229eb245253abd4a54e995cc85baef5f50cf71c..3ea6e2ec610f1cf354d0912cb596f0b2be6fbde8 100644
--- a/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php
+++ b/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php
@@ -108,6 +108,50 @@ class ExtendedIniTest extends \VuFindTest\Unit\TestCase
         );
     }
 
+    /**
+     * Test file with self as parent.
+     *
+     * @return void
+     */
+    public function testSelfAsParent()
+    {
+        $pathStack = array(
+            realpath(__DIR__ . '/../../../../../../fixtures/language/base'),
+        );
+        $loader = new ExtendedIni($pathStack);
+        $result = $loader->load('self-parent', null);
+        $this->assertEquals(
+            array(
+                '@parent_ini' => 'self-parent.ini',
+                'string' => 'bad',
+            ),
+            (array)$result
+        );
+    }
+
+    /**
+     * Test file with a chain of parents.
+     *
+     * @return void
+     */
+    public function testParentChain()
+    {
+        $pathStack = array(
+            realpath(__DIR__ . '/../../../../../../fixtures/language/base'),
+        );
+        $loader = new ExtendedIni($pathStack);
+        $result = $loader->load('child2', null);
+        $this->assertEquals(
+            array(
+                '@parent_ini' => 'child1.ini',
+                'test1' => 'test 1',
+                'test2' => 'test 2',
+                'test3' => 'test three',
+            ),
+            (array)$result
+        );
+    }
+
     /**
      * Test missing path stack.
      *