diff --git a/.travis.yml b/.travis.yml
index edca80e0b97b3403b9b76e1b13caa9e8fe08684c..61e47522d1975f258f06a38945442880dd656335 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,5 @@
 language: php
+sudo: false
 php:
   - "5.6"
   - "5.5"
diff --git a/_test/tests/inc/auth_password.test.php b/_test/tests/inc/auth_password.test.php
index 07b9f5bb208fe727adaaccd3e8ef4530cb8ec756..5067e2ca1acf23fb26bf3972b022d91e190632dc 100644
--- a/_test/tests/inc/auth_password.test.php
+++ b/_test/tests/inc/auth_password.test.php
@@ -16,9 +16,16 @@ class auth_password_test extends DokuWikiTest {
         'kmd5'  => 'a579299436d7969791189acadd86fcb716',
         'djangomd5'  => 'md5$abcde$d0fdddeda8cd92725d2b54148ac09158',
         'djangosha1' => 'sha1$abcde$c8e65a7f0acc9158843048a53dcc5a6bc4d17678',
-        'sha512' => '$6$abcdefgh12345678$J9.zOcgx0lotwZdcz0uulA3IVQMinZvFZVjA5vapRLVAAqtay23XD4xeeUxQ3B4JvDWYFBIxVWW1tOYlHX13k1'
+
     );
 
+    function __construct() {
+        if(defined('CRYPT_SHA512') && CRYPT_SHA512 == 1) {
+            // Check SHA512 only if available in this PHP
+            $this->passes['sha512'] = '$6$abcdefgh12345678$J9.zOcgx0lotwZdcz0uulA3IVQMinZvFZVjA5vapRLVAAqtay23XD4xeeUxQ3B4JvDWYFBIxVWW1tOYlHX13k1';
+        }
+    }
+
 
     function test_cryptPassword(){
         foreach($this->passes as $method => $hash){
diff --git a/_test/tests/inc/form_form.test.php b/_test/tests/inc/form_form.test.php
index 02242a807ff64812fee492bf386da13d0e9778d4..7f168b89583cfcabae0222368e971c5d55e881aa 100644
--- a/_test/tests/inc/form_form.test.php
+++ b/_test/tests/inc/form_form.test.php
@@ -30,9 +30,9 @@ class form_test extends DokuWikiTest {
     $realoutput .= '<input type="checkbox" id="check__id" name="r" value="1" /> ';
     $realoutput .= '<span>Check</span></label>';
     $realoutput .= "\n";
-    $realoutput .= '<input name="do[save]" type="submit" value="Save" class="button" accesskey="s" title="Save [S]" />';
+    $realoutput .= '<button name="do[save]" type="submit" accesskey="s" title="Save [S]">Save</button>';
     $realoutput .= "\n";
-    $realoutput .= '<input name="do[cancel]" type="submit" value="Cancel" class="button" />';
+    $realoutput .= '<button name="do[cancel]" type="submit">Cancel</button>';
     $realoutput .= "\n";
     $realoutput .= "</fieldset>\n</div></form>\n";
     return $realoutput;
diff --git a/_test/tests/inc/io_deletefromfile.test.php b/_test/tests/inc/io_deletefromfile.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..e86150aac8a3864f0aca40ec266fd43ce77778ae
--- /dev/null
+++ b/_test/tests/inc/io_deletefromfile.test.php
@@ -0,0 +1,15 @@
+<?php
+
+class io_deletefromfile_test extends DokuWikiTest {
+
+    function test_delete(){
+        $file = TMP_DIR.'/test.txt';
+        $contents = "The\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012";
+        io_saveFile($file, $contents);
+        $this->assertTrue(io_deleteFromFile($file, "Delete\012"));
+        $this->assertEquals("The\012Delete01\012Delete02\012DeleteX\012Test\012", io_readFile($file));
+        $this->assertTrue(io_deleteFromFile($file, "#Delete\\d+\012#", true));
+        $this->assertEquals("The\012DeleteX\012Test\012", io_readFile($file));
+    }
+
+}
diff --git a/_test/tests/inc/io_readfile.test.php b/_test/tests/inc/io_readfile.test.php
index e3e90cd8d880a03618aa3a0aa5bb92154500b5fa..700c1902b23c1f4b7502ae26fe66f5d89baf641d 100644
--- a/_test/tests/inc/io_readfile.test.php
+++ b/_test/tests/inc/io_readfile.test.php
@@ -48,6 +48,11 @@ class io_readfile_test extends DokuWikiTest {
         $this->assertEquals("The\015\012Test\015\012", io_readFile(__DIR__.'/io_readfile/test.txt.bz2', false));
         $this->assertEquals(false, io_readFile(__DIR__.'/io_readfile/nope.txt.bz2'));
         $this->assertEquals(false, io_readFile(__DIR__.'/io_readfile/corrupt.txt.bz2'));
+        // internal bzfile function
+        $this->assertEquals(array("The\015\012","Test\015\012"), bzfile(__DIR__.'/io_readfile/test.txt.bz2', true));
+        $this->assertEquals(array_fill(0, 120, str_repeat('a', 80)."\012"), bzfile(__DIR__.'/io_readfile/large.txt.bz2', true));
+        $line = str_repeat('a', 8888)."\012";
+        $this->assertEquals(array($line,"\012",$line,"!"), bzfile(__DIR__.'/io_readfile/long.txt.bz2', true));
     }
 
-}
\ No newline at end of file
+}
diff --git a/_test/tests/inc/io_readfile/large.txt.bz2 b/_test/tests/inc/io_readfile/large.txt.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..3135435f82ed3e14ecd60b87af5b9d16f247f45a
Binary files /dev/null and b/_test/tests/inc/io_readfile/large.txt.bz2 differ
diff --git a/_test/tests/inc/io_readfile/long.txt.bz2 b/_test/tests/inc/io_readfile/long.txt.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..fb40759e618fa0c589f4a787e11fc48b6d7c75e4
Binary files /dev/null and b/_test/tests/inc/io_readfile/long.txt.bz2 differ
diff --git a/_test/tests/inc/io_replaceinfile.test.php b/_test/tests/inc/io_replaceinfile.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..452ed740108fe48cf0351f358a466ab1796487fd
--- /dev/null
+++ b/_test/tests/inc/io_replaceinfile.test.php
@@ -0,0 +1,108 @@
+<?php
+
+class io_replaceinfile_test extends DokuWikiTest {
+
+    protected $contents = "The\012Delete\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012";
+
+    /*
+     * dependency for tests needing zlib extension to pass
+     */
+    public function test_ext_zlib() {
+        if (!extension_loaded('zlib')) {
+            $this->markTestSkipped('skipping all zlib tests.  Need zlib extension');
+        }
+    }
+
+    /*
+     * dependency for tests needing zlib extension to pass
+     */
+    public function test_ext_bz2() {
+        if (!extension_loaded('bz2')) {
+            $this->markTestSkipped('skipping all bzip2 tests.  Need bz2 extension');
+        }
+    }
+
+    function _write($file){
+
+        io_saveFile($file, $this->contents);
+        // Replace one, no regex
+        $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete00\012", false, 1));
+        $this->assertEquals("The\012Delete00\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012", io_readFile($file));
+        // Replace all, no regex
+        $this->assertTrue(io_replaceInFile($file, "Delete\012", "DeleteX\012", false, -1));
+        $this->assertEquals("The\012Delete00\012DeleteX\012Delete01\012Delete02\012DeleteX\012DeleteX\012Test\012", io_readFile($file));
+        // Replace two, regex and backreference
+        $this->assertTrue(io_replaceInFile($file, "#Delete(\\d+)\012#", "\\1\012", true, 2));
+        $this->assertEquals("The\01200\012DeleteX\01201\012Delete02\012DeleteX\012DeleteX\012Test\012", io_readFile($file));
+        // Delete and insert, no regex
+        $this->assertTrue(io_replaceInFile($file, "DeleteX\012", "Replace\012", false, 0));
+        $this->assertEquals("The\01200\01201\012Delete02\012Test\012Replace\012", io_readFile($file));
+    }
+
+    function test_replace(){
+        $this->_write(TMP_DIR.'/test.txt');
+    }
+
+
+    /**
+     * @depends test_ext_zlib
+     */
+    function test_gzwrite(){
+        $this->_write(TMP_DIR.'/test.txt.gz');
+    }
+
+    /**
+     * @depends test_ext_bz2
+     */
+    function test_bzwrite(){
+        $this->_write(TMP_DIR.'/test.txt.bz2');
+    }
+
+    /**
+     * Test for a non-regex replacement where $newline contains a backreference like construct - it shouldn't affect the replacement
+     */
+    function test_edgecase1()
+    {
+        $file = TMP_DIR . '/test.txt';
+
+        io_saveFile($file, $this->contents);
+        $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete\\00\012", false, -1));
+        $this->assertEquals("The\012Delete\\00\012Delete\\00\012Delete01\012Delete02\012Delete\\00\012DeleteX\012Test\012", io_readFile($file), "Edge case: backreference like construct in replacement line");
+    }
+    /**
+     * Test with replace all where replacement line == search line - must not timeout
+     *
+     * @small
+     */
+    function test_edgecase2() {
+        $file = TMP_DIR.'/test.txt';
+
+        io_saveFile($file, $this->contents);
+        $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete\012", false, -1));
+        $this->assertEquals("The\012Delete\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012", io_readFile($file), "Edge case: new line the same as old line");
+    }
+
+    /**
+     *    Test where $oldline exactly matches one line and also matches part of other lines - only the exact match should be replaced
+     */
+    function test_edgecase3()
+    {
+        $file = TMP_DIR . '/test.txt';
+        $contents = "The\012Delete\01201Delete\01202Delete\012Test\012";
+
+        io_saveFile($file, $contents);
+        $this->assertTrue(io_replaceInFile($file, "Delete\012", "Replace\012", false, -1));
+        $this->assertEquals("The\012Replace\01201Delete\01202Delete\012Test\012", io_readFile($file), "Edge case: old line is a match for parts of other lines");
+    }
+
+    /**
+     * Test passing an invalid parameter.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     */
+    function test_badparam()
+    {
+        /* The empty $oldline parameter should be caught before the file doesn't exist test. */
+        $this->assertFalse(io_replaceInFile(TMP_DIR.'/not_existing_file.txt', '', '', false, 0));
+    }
+}
diff --git a/_test/tests/inc/io_savefile.test.php b/_test/tests/inc/io_savefile.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a4d4671d2d750b8197ba83a30e5164db1bf2c51
--- /dev/null
+++ b/_test/tests/inc/io_savefile.test.php
@@ -0,0 +1,49 @@
+<?php
+
+class io_savefile_test extends DokuWikiTest {
+
+    /*
+     * dependency for tests needing zlib extension to pass
+     */
+    public function test_ext_zlib() {
+        if (!extension_loaded('zlib')) {
+            $this->markTestSkipped('skipping all zlib tests.  Need zlib extension');
+        }
+    }
+
+    /*
+     * dependency for tests needing zlib extension to pass
+     */
+    public function test_ext_bz2() {
+        if (!extension_loaded('bz2')) {
+            $this->markTestSkipped('skipping all bzip2 tests.  Need bz2 extension');
+        }
+    }
+
+    function _write($file){
+        $contents = "The\012Write\012Test\012";
+        $this->assertTrue(io_saveFile($file, $contents));
+        $this->assertEquals($contents, io_readFile($file));
+        $this->assertTrue(io_saveFile($file, $contents, true));
+        $this->assertEquals($contents.$contents, io_readFile($file));
+    }
+
+    function test_write(){
+        $this->_write(TMP_DIR.'/test.txt');
+    }
+
+    /**
+     * @depends test_ext_zlib
+     */
+    function test_gzwrite(){
+        $this->_write(TMP_DIR.'/test.txt.gz');
+    }
+
+    /**
+     * @depends test_ext_bz2
+     */
+    function test_bzwrite(){
+        $this->_write(TMP_DIR.'/test.txt.bz2');
+    }
+
+}
diff --git a/_test/tests/inc/ixr_library_date.test.php b/_test/tests/inc/ixr_library_date.test.php
index f384869258abf341aee97fb885b7222409c7ce21..0c81e674196ca7a038affe6710d069e860eb0ad9 100644
--- a/_test/tests/inc/ixr_library_date.test.php
+++ b/_test/tests/inc/ixr_library_date.test.php
@@ -2,6 +2,9 @@
 
 require_once DOKU_INC.'inc/IXR_Library.php';
 
+/**
+ * Class ixr_library_date_test
+ */
 class ixr_library_date_test extends DokuWikiTest {
 
 
@@ -16,18 +19,24 @@ class ixr_library_date_test extends DokuWikiTest {
             array('2010-08-17T09:23:14Z', 1282036994),
             array('20100817T09:23:14Z',   1282036994),
 
+            // with timezone
+            array('2010-08-17 09:23:14+0000',  1282036994),
+            array('2010-08-17 09:23:14+00:00',  1282036994),
+            array('2010-08-17 12:23:14+03:00',  1282036994),
+
             // no seconds
             array('2010-08-17T09:23',     1282036980),
             array('20100817T09:23',       1282036980),
 
             // no time
             array('2010-08-17',           1282003200),
-            //array('20100817',             1282003200), #this will NOT be parsed, but is assumed to be timestamp
+            array(1282036980,             1282036980),
+//            array('20100817',             1282003200), #this will NOT be parsed, but is assumed to be timestamp
         );
 
         foreach($tests as $test){
             $dt = new IXR_Date($test[0]);
-            $this->assertEquals($dt->getTimeStamp(),$test[1]);
+            $this->assertEquals($test[1], $dt->getTimeStamp());
         }
     }
 
diff --git a/_test/tests/inc/parser/renderer_resolveinterwiki.test.php b/_test/tests/inc/parser/renderer_resolveinterwiki.test.php
index dd1ed1d3f64f488dbd1913b817d89d1864536940..772001b99f04c3263412d5e0cbf6b9f8fd85c294 100644
--- a/_test/tests/inc/parser/renderer_resolveinterwiki.test.php
+++ b/_test/tests/inc/parser/renderer_resolveinterwiki.test.php
@@ -14,21 +14,23 @@ class Test_resolveInterwiki extends DokuWikiTest {
         $Renderer->interwiki['withslash'] = '/test';
         $Renderer->interwiki['onlytext'] = ':onlytext{NAME}'; //with {URL} double urlencoded
         $Renderer->interwiki['withquery'] = ':anyns:{NAME}?do=edit';
+        //this was the only link with host/port/path/query. Keep it here for regression
+        $Renderer->interwiki['coral'] = 'http://{HOST}.{PORT}.nyud.net:8090{PATH}?{QUERY}';
 
         $tests = array(
             // shortcut, reference and expected
-            array('wp', 'foo @+%/#txt', 'http://en.wikipedia.org/wiki/foo @+%/#txt'),
-            array('amazon', 'foo @+%/#txt', 'http://www.amazon.com/exec/obidos/ASIN/foo%20%40%2B%25%2F/splitbrain-20/#txt'),
-            array('doku', 'foo @+%/#txt', 'http://www.dokuwiki.org/foo%20%40%2B%25%2F#txt'),
-            array('coral', 'http://example.com:83/path/naar/?query=foo%20%40%2B%25%2F', 'http://example.com.83.nyud.net:8090/path/naar/?query=foo%20%40%2B%25%2F'),
+            array('wp', 'foo [\\]^`{|}~@+#%?/#txt', 'https://en.wikipedia.org/wiki/foo %5B%5C%5D%5E%60%7B%7C%7D~@+%23%25?/#txt'),
+            array('amazon', 'foo [\\]^`{|}~@+#%?/#txt', 'https://www.amazon.com/exec/obidos/ASIN/foo%20%5B%5C%5D%5E%60%7B%7C%7D~%40%2B%23%25%3F%2F/splitbrain-20/#txt'),
+            array('doku', 'foo [\\]^`{|}~@+#%?/#txt', 'https://www.dokuwiki.org/foo%20%5B%5C%5D%5E%60%7B%7C%7D~%40%2B%23%25%3F%2F#txt'),
+            array('coral', 'http://example.com:83/path/naar/?query=foo%20%40%2B%25%3F%2F', 'http://example.com.83.nyud.net:8090/path/naar/?query=foo%20%40%2B%25%3F%2F'),
             array('scheme', 'ftp://foo @+%/#txt', 'ftp://example.com#txt'),
             //relative url
-            array('withslash', 'foo @+%/#txt', '/testfoo%20%40%2B%25%2F#txt'),
-            array('skype',  'foo @+%/#txt', 'skype:foo @+%/#txt'),
+            array('withslash', 'foo [\\]^`{|}~@+#%?/#txt', '/testfoo%20%5B%5C%5D%5E%60%7B%7C%7D~%40%2B%23%25%3F%2F#txt'),
+            array('skype',  'foo [\\]^`{|}~@+#%?/#txt', 'skype:foo %5B%5C%5D%5E%60%7B%7C%7D~@+%23%25?/#txt'),
             //dokuwiki id's
-            array('onlytext', 'foo @+%#txt', DOKU_BASE.'doku.php?id=onlytextfoo#txt'),
-            array('user', 'foo @+%#txt', DOKU_BASE.'doku.php?id=user:foo#txt'),
-            array('withquery', 'foo @+%#txt', DOKU_BASE.'doku.php?id=anyns:foo&amp;do=edit#txt')
+            array('onlytext', 'foo [\\]^`{|}~@+#%/#txt', DOKU_BASE.'doku.php?id=onlytextfoo#txt'),
+            array('user', 'foo [\\]^`{|}~@+#%/#txt', DOKU_BASE.'doku.php?id=user:foo#txt'),
+            array('withquery', 'foo [\\]^`{|}~@+#%/#txt', DOKU_BASE.'doku.php?id=anyns:foo&amp;do=edit#txt')
         );
 
         foreach($tests as $test) {
@@ -45,7 +47,7 @@ class Test_resolveInterwiki extends DokuWikiTest {
         $shortcut = 'nonexisting';
         $reference = 'foo @+%/';
         $url = $Renderer->_resolveInterWiki($shortcut, $reference);
-        $expected = 'http://www.google.com/search?q=foo%20%40%2B%25%2F&amp;btnI=lucky';
+        $expected = 'https://www.google.com/search?q=foo%20%40%2B%25%2F&amp;btnI=lucky';
 
         $this->assertEquals($expected, $url);
     }
diff --git a/_test/tests/inc/remote.test.php b/_test/tests/inc/remote.test.php
index d0d4eb7ce03aa8fd555b3303591d15a3bf03e43c..037b1dc0b316eaf5c4b27bba8be69ae1aeef61f9 100644
--- a/_test/tests/inc/remote.test.php
+++ b/_test/tests/inc/remote.test.php
@@ -160,10 +160,16 @@ class remote_test extends DokuWikiTest {
         $this->assertTrue($this->remote->hasAccess());
     }
 
+    /**
+     * @expectedException RemoteAccessDeniedException
+     */
     function test_hasAccessFail() {
         global $conf;
         $conf['remote'] = 0;
-        $this->assertFalse($this->remote->hasAccess());
+        // the hasAccess() should throw a Exception to keep the same semantics with xmlrpc.php.
+        // because the user(xmlrpc) check remote before .--> (!$conf['remote']) die('XML-RPC server not enabled.');
+        // so it must be a Exception when get here.
+        $this->remote->hasAccess();
     }
 
     function test_hasAccessFailAcl() {
diff --git a/composer.lock b/composer.lock
index 8b64242446b58864cb54e032e20331da1370cce7..9aa1659027da9d2279d34f58a08cb50d38423e04 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,23 +1,23 @@
 {
     "_readme": [
         "This file locks the dependencies of your project to a known state",
-        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
     "hash": "23ee0dd06136e2301c930e75055300d5",
     "packages": [
         {
             "name": "easybook/geshi",
-            "version": "v1.0.8.14",
+            "version": "v1.0.8.15",
             "source": {
                 "type": "git",
                 "url": "https://github.com/easybook/geshi.git",
-                "reference": "af589a67bf308791bb13e54bddd9aa3544b7dff8"
+                "reference": "54387de80bc7ee50397ffae39234626a48d2d45f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/easybook/geshi/zipball/af589a67bf308791bb13e54bddd9aa3544b7dff8",
-                "reference": "af589a67bf308791bb13e54bddd9aa3544b7dff8",
+                "url": "https://api.github.com/repos/easybook/geshi/zipball/54387de80bc7ee50397ffae39234626a48d2d45f",
+                "reference": "54387de80bc7ee50397ffae39234626a48d2d45f",
                 "shasum": ""
             },
             "require": {
@@ -50,20 +50,20 @@
                 "highlighter",
                 "syntax"
             ],
-            "time": "2015-04-15 13:21:45"
+            "time": "2015-06-18 14:56:28"
         },
         {
             "name": "splitbrain/php-archive",
-            "version": "1.0.0",
+            "version": "1.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/splitbrain/php-archive.git",
-                "reference": "a0fbfc2f85ed491f3d2af42cff48a9cb783a8549"
+                "reference": "6572e78ef9d064eeb5c74d4ffe61b473a4996b68"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/a0fbfc2f85ed491f3d2af42cff48a9cb783a8549",
-                "reference": "a0fbfc2f85ed491f3d2af42cff48a9cb783a8549",
+                "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/6572e78ef9d064eeb5c74d4ffe61b473a4996b68",
+                "reference": "6572e78ef9d064eeb5c74d4ffe61b473a4996b68",
                 "shasum": ""
             },
             "require": {
@@ -97,7 +97,7 @@
                 "unzip",
                 "zip"
             ],
-            "time": "2015-02-25 20:15:02"
+            "time": "2015-07-24 11:36:49"
         }
     ],
     "packages-dev": [],
diff --git a/conf/interwiki.conf b/conf/interwiki.conf
index 4857e27f30f4c1c8ab685e9004a764eecefedf73..4dc3c80ee40985e561d687a1d476a15acb1e5a25 100644
--- a/conf/interwiki.conf
+++ b/conf/interwiki.conf
@@ -1,35 +1,39 @@
-# Each URL may contain one of the placeholders {URL} or {NAME}
+# Each URL may contain one of these placeholders
 # {URL}  is replaced by the URL encoded representation of the wikiname
 #        this is the right thing to do in most cases
 # {NAME} this is replaced by the wikiname as given in the document
-#        no further encoding is done
+#        only mandatory encoded is done, urlencoding if the link
+#        is an external URL, or encoding as a wikiname if it is an
+#        internal link (begins with a colon)
+# {SCHEME}
+# {HOST}
+# {PORT}
+# {PATH}
+# {QUERY} these placeholders will be replaced with the appropriate part
+#         of the link when parsed as a URL
 # If no placeholder is defined the urlencoded name is appended to the URL
 
 # To prevent losing your added InterWiki shortcuts after an upgrade,
 # you should add new ones to interwiki.local.conf
 
-wp        http://en.wikipedia.org/wiki/{NAME}
-wpfr      http://fr.wikipedia.org/wiki/{NAME}
-wpde      http://de.wikipedia.org/wiki/{NAME}
-wpes      http://es.wikipedia.org/wiki/{NAME}
-wppl      http://pl.wikipedia.org/wiki/{NAME}
-wpjp      http://ja.wikipedia.org/wiki/{NAME}
-wpmeta    http://meta.wikipedia.org/wiki/{NAME}
-doku      http://www.dokuwiki.org/
-dokubug   http://bugs.dokuwiki.org/index.php?do=details&amp;task_id=
-rfc       http://tools.ietf.org/html/rfc
+wp        https://en.wikipedia.org/wiki/{NAME}
+wpfr      https://fr.wikipedia.org/wiki/{NAME}
+wpde      https://de.wikipedia.org/wiki/{NAME}
+wpes      https://es.wikipedia.org/wiki/{NAME}
+wppl      https://pl.wikipedia.org/wiki/{NAME}
+wpjp      https://ja.wikipedia.org/wiki/{NAME}
+wpmeta    https://meta.wikipedia.org/wiki/{NAME}
+doku      https://www.dokuwiki.org/
+rfc       https://tools.ietf.org/html/rfc
 man       http://man.cx/
-amazon    http://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/
-amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/
-amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/
+amazon    https://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/
+amazon.de https://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/
+amazon.uk https://www.amazon.co.uk/exec/obidos/ASIN/
 paypal    https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=
-phpfn     http://www.php.net/{NAME}
-coral     http://{HOST}.{PORT}.nyud.net:8090{PATH}?{QUERY}
-freecache http://freecache.org/{NAME}
-sb        http://www.splitbrain.org/go/
+phpfn     https://www.php.net/{NAME}
 skype     skype:{NAME}
-google.de http://www.google.de/search?q=
-go        http://www.google.com/search?q={URL}&amp;btnI=lucky
+google.de https://www.google.de/search?q=
+go        https://www.google.com/search?q={URL}&amp;btnI=lucky
 user      :user:{NAME}
 
 # To support VoIP/SIP/TEL links
diff --git a/data/pages/wiki/syntax.txt b/data/pages/wiki/syntax.txt
index 7b453efa2ba80530cea9bfb6bd268dbdd6b28ac7..bdfda9c467ea8d48a16ba54cd59042899db4e50f 100644
--- a/data/pages/wiki/syntax.txt
+++ b/data/pages/wiki/syntax.txt
@@ -83,9 +83,14 @@ Windows shares like [[\\server\share|this]] are recognized, too. Please note tha
 Notes:
 
   * For security reasons direct browsing of windows shares only works in Microsoft Internet Explorer per default (and only in the "local zone").
-  * For Mozilla and Firefox it can be enabled through different workaround mentioned in the [[http://kb.mozillazine.org/Links_to_local_pages_do_not_work|Mozilla Knowledge Base]]. However, there will still be a JavaScript warning about trying to open a Windows Share. To remove this warning (for all users), put the following line in ''conf/userscript.js'':
-
-  LANG.nosmblinks = '';
+  * For Mozilla and Firefox it can be enabled through different workaround mentioned in the [[http://kb.mozillazine.org/Links_to_local_pages_do_not_work|Mozilla Knowledge Base]]. However, there will still be a JavaScript warning about trying to open a Windows Share. To remove this warning (for all users), put the following line in ''conf/lang/en/lang.php'' (more details at [[doku>localization#changing_some_localized_texts_and_strings_in_your_installation|localization]]): <code - conf/lang/en/lang.php>
+<?php
+/**
+ * Customization of the english language file
+ * Copy only the strings that needs to be modified
+ */
+$lang['js']['nosmblinks'] = '';
+</code>
 
 ==== Image Links ====
 
@@ -170,6 +175,12 @@ DokuWiki can embed the following media formats directly.
 
 If you specify a filename that is not a supported media format, then it will be displayed as a link instead.
 
+By adding ''?linkonly'' you provide a link to the media without displaying it inline
+
+  {{wiki:dokuwiki-128.png?linkonly}}
+
+{{wiki:dokuwiki-128.png?linkonly}} This is just a link to the image.
+
 ==== Fallback Formats ====
 
 Unfortunately not all browsers understand all video and audio formats. To mitigate the problem, you can upload your file in different formats for maximum browser compatibility.
@@ -261,17 +272,19 @@ There are three exceptions which do not come from that pattern file: multiplicat
 
 Some times you want to mark some text to show it's a reply or comment. You can use the following syntax:
 
-  I think we should do it
-  
-  > No we shouldn't
-  
-  >> Well, I say we should
-  
-  > Really?
-  
-  >> Yes!
-  
-  >>> Then lets do it!
+<code>
+I think we should do it
+
+> No we shouldn't
+
+>> Well, I say we should
+
+> Really?
+
+>> Yes!
+
+>>> Then lets do it!
+</code>
 
 I think we should do it
 
@@ -317,7 +330,7 @@ As you can see, it's the cell separator before a cell which decides about the fo
   ^ Heading 4    | no colspan this time |                    |
   ^ Heading 5    | Row 2 Col 2          | Row 2 Col 3        |
 
-You can have rowspans (vertically connected cells) by adding '':::'' into the cells below the one to which they should connect.
+You can have rowspans (vertically connected cells) by adding ''%%:::%%'' into the cells below the one to which they should connect.
 
 ^ Heading 1      ^ Heading 2                  ^ Heading 3          ^
 | Row 1 Col 1    | this cell spans vertically | Row 1 Col 3        |
diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php
index 301a8d9e1db6c24d09cb79b5ea5b90eb30e2d56f..5ae1402b955120d24867c2aaa3986db891d41690 100644
--- a/inc/IXR_Library.php
+++ b/inc/IXR_Library.php
@@ -297,6 +297,7 @@ class IXR_Message {
      * @param $tag
      */
     function tag_close($parser, $tag) {
+        $value = null;
         $valueFlag = false;
         switch($tag) {
             case 'int':
@@ -818,18 +819,14 @@ EOD;
  * @since 1.5
  */
 class IXR_Date {
-    var $year;
-    var $month;
-    var $day;
-    var $hour;
-    var $minute;
-    var $second;
-    var $timezone;
+
+    /** @var DateTime */
+    protected $date;
 
     /**
      * @param int|string $time
      */
-    function __construct($time) {
+    public function __construct($time) {
         // $time can be a PHP timestamp or an ISO one
         if(is_numeric($time)) {
             $this->parseTimestamp($time);
@@ -839,51 +836,48 @@ class IXR_Date {
     }
 
     /**
+     * Parse unix timestamp
+     *
      * @param int $timestamp
      */
-    function parseTimestamp($timestamp) {
-        $this->year = gmdate('Y', $timestamp);
-        $this->month = gmdate('m', $timestamp);
-        $this->day = gmdate('d', $timestamp);
-        $this->hour = gmdate('H', $timestamp);
-        $this->minute = gmdate('i', $timestamp);
-        $this->second = gmdate('s', $timestamp);
-        $this->timezone = '';
+    protected function parseTimestamp($timestamp) {
+        $this->date = new DateTime('@' . $timestamp);
     }
 
     /**
+     * Parses less or more complete iso dates and much more, if no timezone given assumes UTC
+     *
      * @param string $iso
      */
-    function parseIso($iso) {
-        if(preg_match('/^(\d\d\d\d)-?(\d\d)-?(\d\d)([T ](\d\d):(\d\d)(:(\d\d))?)?/', $iso, $match)) {
-            $this->year = (int) $match[1];
-            $this->month = (int) $match[2];
-            $this->day = (int) $match[3];
-            $this->hour = (int) $match[5];
-            $this->minute = (int) $match[6];
-            $this->second = (int) $match[8];
-        }
+    protected function parseIso($iso) {
+        $this->date = new DateTime($iso, new DateTimeZone("UTC"));
     }
 
     /**
+     * Returns date in ISO 8601 format
+     *
      * @return string
      */
-    function getIso() {
-        return $this->year . $this->month . $this->day . 'T' . $this->hour . ':' . $this->minute . ':' . $this->second . $this->timezone;
+    public function getIso() {
+        return $this->date->format(DateTime::ISO8601);
     }
 
     /**
+     * Returns date in valid xml
+     *
      * @return string
      */
-    function getXml() {
+    public function getXml() {
         return '<dateTime.iso8601>' . $this->getIso() . '</dateTime.iso8601>';
     }
 
     /**
+     * Returns Unix timestamp
+     *
      * @return int
      */
     function getTimestamp() {
-        return gmmktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
+        return $this->date->getTimestamp();
     }
 }
 
@@ -923,6 +917,9 @@ class IXR_IntrospectionServer extends IXR_Server {
     /** @var string[] */
     var $help;
 
+    /**
+     * Constructor
+     */
     function __construct() {
         $this->setCallbacks();
         $this->setCapabilities();
@@ -1107,7 +1104,7 @@ class IXR_ClientMulticall extends IXR_Client {
      * @param int $port
      */
     function __construct($server, $path = false, $port = 80) {
-        parent::IXR_Client($server, $path, $port);
+        parent::__construct($server, $path, $port);
         //$this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
     }
 
diff --git a/inc/auth.php b/inc/auth.php
index 60b8c7c78e8aea042773b8852b4cf8bb874c8147..e04a6ca1a8b2f089a48b9b9581ee92771fa6d7ae 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -739,28 +739,23 @@ function auth_aclcheck_cb($data) {
         $user   = utf8_strtolower($user);
         $groups = array_map('utf8_strtolower', $groups);
     }
-    $user   = $auth->cleanUser($user);
+    $user   = auth_nameencode($auth->cleanUser($user));
     $groups = array_map(array($auth, 'cleanGroup'), (array) $groups);
-    $user   = auth_nameencode($user);
 
     //prepend groups with @ and nameencode
-    $cnt = count($groups);
-    for($i = 0; $i < $cnt; $i++) {
-        $groups[$i] = '@'.auth_nameencode($groups[$i]);
+    foreach($groups as &$group) {
+        $group = '@'.auth_nameencode($group);
     }
 
     $ns   = getNS($id);
     $perm = -1;
 
-    if($user || count($groups)) {
-        //add ALL group
-        $groups[] = '@ALL';
-        //add User
-        if($user) $groups[] = $user;
-    } else {
-        $groups[] = '@ALL';
-    }
-
+    //add ALL group
+    $groups[] = '@ALL';
+    
+    //add User
+    if($user) $groups[] = $user;
+    
     //check exact match first
     $matches = preg_grep('/^'.preg_quote($id, '/').'[ \t]+([^ \t]+)[ \t]+/', $AUTH_ACL);
     if(count($matches)) {
diff --git a/inc/changelog.php b/inc/changelog.php
index d1ef7973e33ce4889356146306589034d4a1c94c..f4731021ca48c63e14eae6d414eb02132cf72866 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -849,18 +849,17 @@ abstract class ChangeLog {
     public function isCurrentRevision($rev) {
         return $rev == @filemtime($this->getFilename());
     }
-    
+
     /**
-    * Return an existing revision for a specific date which is 
+    * Return an existing revision for a specific date which is
     * the current one or younger or equal then the date
     *
-    * @param string $id 
     * @param number $date_at timestamp
     * @return string revision ('' for current)
     */
     function getLastRevisionAt($date_at){
         //requested date_at(timestamp) younger or equal then modified_time($this->id) => load current
-        if($date_at >= @filemtime($this->getFilename())) { 
+        if($date_at >= @filemtime($this->getFilename())) {
             return '';
         } else if ($rev = $this->getRelativeRevision($date_at+1, -1)) { //+1 to get also the requested date revision
             return $rev;
@@ -1049,6 +1048,12 @@ class MediaChangelog extends ChangeLog {
  *
  * @author Ben Coburn <btcoburn@silicodon.net>
  * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $id
+ * @param int    $rev
+ * @param int    $chunk_size
+ * @param bool   $media
+ * @return array|bool
  */
 function getRevisionInfo($id, $rev, $chunk_size = 8192, $media = false) {
     dbg_deprecated('class PageChangeLog or class MediaChangelog');
diff --git a/inc/cliopts.php b/inc/cliopts.php
index 7d71c7dc922431d83d18e8b17a8be3aa71dbad9e..d7d06119a2ccb2a167e0a44f5ce39f916c0dd003 100644
--- a/inc/cliopts.php
+++ b/inc/cliopts.php
@@ -447,7 +447,7 @@ class Doku_Cli_Opts_Error {
     var $code;
     var $msg;
 
-    function Doku_Cli_Opts_Error($code, $msg) {
+    function __construct($code, $msg) {
         $this->code = $code;
         $this->msg = $msg;
     }
@@ -468,7 +468,7 @@ class Doku_Cli_Opts_Container {
     var $options = array();
     var $args = array();
 
-    function Doku_Cli_Opts_Container($options) {
+    function __construct($options) {
         foreach ( $options[0] as $option ) {
             if ( false !== ( strpos($option[0], '--') ) ) {
                 $opt_name = substr($option[0], 2);
diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php
index b90da572412067aa5ea66eaacb47878e2e7894ff..fe444b39baa3b750026d35ca57afe9b760bf8e10 100644
--- a/inc/feedcreator.class.php
+++ b/inc/feedcreator.class.php
@@ -129,6 +129,9 @@ class FeedItem extends HtmlDescribable {
     // var $source;
 }
 
+/**
+ * Class EnclosureItem
+ */
 class EnclosureItem extends HtmlDescribable {
     /*
     *
@@ -226,7 +229,7 @@ class FeedHtmlField {
      * Creates a new instance of FeedHtmlField.
      * @param string $parFieldContent: if given, sets the rawFieldContent property
      */
-    function FeedHtmlField($parFieldContent) {
+    function __construct($parFieldContent) {
         if ($parFieldContent) {
             $this->rawFieldContent = $parFieldContent;
         }
@@ -482,6 +485,8 @@ class FeedCreator extends HtmlDescribable {
     var $additionalElements = Array();
 
 
+    var $_timeout;
+
     /**
      * Adds an FeedItem to the feed.
      *
@@ -505,7 +510,7 @@ class FeedCreator extends HtmlDescribable {
      * @param int     $length the maximum length the string should be truncated to
      * @return string    the truncated string
      */
-    function iTrunc($string, $length) {
+    static function iTrunc($string, $length) {
         if (strlen($string)<=$length) {
             return $string;
         }
@@ -604,6 +609,8 @@ class FeedCreator extends HtmlDescribable {
     /**
      * @since 1.4
      * @access private
+     *
+     * @param string $filename
      */
     function _redirect($filename) {
         // attention, heavily-commented-out-area
@@ -697,7 +704,7 @@ class FeedDate {
      * Accepts RFC 822, ISO 8601 date formats as well as unix time stamps.
      * @param mixed $dateString optional the date this FeedDate will represent. If not specified, the current date and time is used.
      */
-    function FeedDate($dateString="") {
+    function __construct($dateString="") {
         if ($dateString=="") $dateString = date("r");
 
         if (is_numeric($dateString)) {
@@ -878,7 +885,10 @@ class RSSCreator091 extends FeedCreator {
      */
     var $RSSVersion;
 
-    function RSSCreator091() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         $this->_setRSSVersion("0.91");
         $this->contentType = "application/rss+xml";
     }
@@ -886,6 +896,8 @@ class RSSCreator091 extends FeedCreator {
     /**
      * Sets this RSS feed's version number.
      * @access private
+     *
+     * @param $version
      */
     function _setRSSVersion($version) {
         $this->RSSVersion = $version;
@@ -1034,7 +1046,10 @@ class RSSCreator091 extends FeedCreator {
  */
 class RSSCreator20 extends RSSCreator091 {
 
-    function RSSCreator20() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         parent::_setRSSVersion("2.0");
     }
 
@@ -1051,7 +1066,10 @@ class RSSCreator20 extends RSSCreator091 {
  */
 class PIECreator01 extends FeedCreator {
 
-    function PIECreator01() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         $this->encoding = "utf-8";
     }
 
@@ -1113,7 +1131,10 @@ class PIECreator01 extends FeedCreator {
  */
 class AtomCreator10 extends FeedCreator {
 
-    function AtomCreator10() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         $this->contentType = "application/atom+xml";
         $this->encoding = "utf-8";
     }
@@ -1200,7 +1221,10 @@ class AtomCreator10 extends FeedCreator {
  */
 class AtomCreator03 extends FeedCreator {
 
-    function AtomCreator03() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         $this->contentType = "application/atom+xml";
         $this->encoding = "utf-8";
     }
@@ -1272,12 +1296,19 @@ class AtomCreator03 extends FeedCreator {
  * @author Kai Blankenhorn <kaib@bitfolge.de>
  */
 class MBOXCreator extends FeedCreator {
-
-    function MBOXCreator() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         $this->contentType = "text/plain";
         $this->encoding = "utf-8";
     }
 
+    /**
+     * @param string $input
+     * @param int $line_max
+     * @return string
+     */
     function qp_enc($input = "", $line_max = 76) {
         $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
         $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
@@ -1363,7 +1394,10 @@ class MBOXCreator extends FeedCreator {
  */
 class OPMLCreator extends FeedCreator {
 
-    function OPMLCreator() {
+    /**
+     * Constructor
+     */
+    function __construct() {
         $this->encoding = "utf-8";
     }
 
diff --git a/inc/fetch.functions.php b/inc/fetch.functions.php
index c99fbf20ae3d0c8535e90fbd403fee037fb8c0f0..b8e75eaec4adcd00ce55f59b1e5773cd526a75aa 100644
--- a/inc/fetch.functions.php
+++ b/inc/fetch.functions.php
@@ -1,4 +1,4 @@
-<?php 
+<?php
 /**
  * Functions used by lib/exe/fetch.php
  * (not included by other parts of dokuwiki)
@@ -47,18 +47,15 @@ function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null) {
             // cache publically
             header('Expires: '.gmdate("D, d M Y H:i:s", $expires).' GMT');
             header('Cache-Control: public, proxy-revalidate, no-transform, max-age='.$maxage);
-            header('Pragma: public');
         } else {
             // cache in browser
             header('Expires: '.gmdate("D, d M Y H:i:s", $expires).' GMT');
             header('Cache-Control: private, no-transform, max-age='.$maxage);
-            header('Pragma: no-cache');
         }
     } else {
         // no cache at all
         header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
         header('Cache-Control: no-cache, no-transform');
-        header('Pragma: no-cache');
     }
 
     //send important headers first, script stops here if '304 Not Modified' response
diff --git a/inc/form.php b/inc/form.php
index 748983281e94d35989caba4bad52b99460ab768e..91a171555c85aa3b686a7042ad201dcdd8774878 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -400,7 +400,7 @@ function form_makeWikiText($text, $attrs=array()) {
 function form_makeButton($type, $act, $value='', $attrs=array()) {
     if ($value == '') $value = $act;
     $elem = array('_elem'=>'button', 'type'=>$type, '_action'=>$act,
-                        'value'=>$value, 'class'=>'button');
+                        'value'=>$value);
     if (!empty($attrs['accesskey']) && empty($attrs['title'])) {
         $attrs['title'] = $value . ' ['.strtoupper($attrs['accesskey']).']';
     }
@@ -761,7 +761,9 @@ function form_wikitext($attrs) {
  */
 function form_button($attrs) {
     $p = (!empty($attrs['_action'])) ? 'name="do['.$attrs['_action'].']" ' : '';
-    return '<input '.$p.buildAttributes($attrs,true).' />';
+    $value = $attrs['value'];
+    unset($attrs['value']);
+    return '<button '.$p.buildAttributes($attrs,true).'>'.$value.'</button>';
 }
 
 /**
diff --git a/inc/html.php b/inc/html.php
index 36083a57e3b12bc75634a5eaaed9a06710e57469..0914a1762de1ba12bc0bff21d0c424f20b3c60da 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -183,7 +183,7 @@ function html_topbtn(){
  * @param bool|string    $label  label text, false: lookup btn_$name in localization
  * @return string
  */
-function html_btn($name,$id,$akey,$params,$method='get',$tooltip='',$label=false){
+function html_btn($name, $id, $akey, $params, $method='get', $tooltip='', $label=false){
     global $conf;
     global $lang;
 
@@ -221,13 +221,15 @@ function html_btn($name,$id,$akey,$params,$method='get',$tooltip='',$label=false
         $tip = htmlspecialchars($label);
     }
 
-    $ret .= '<input type="submit" value="'.hsc($label).'" class="button" ';
+    $ret .= '<button type="submit" ';
     if($akey){
         $tip .= ' ['.strtoupper($akey).']';
         $ret .= 'accesskey="'.$akey.'" ';
     }
     $ret .= 'title="'.$tip.'" ';
     $ret .= '/>';
+    $ret .= hsc($label);
+    $ret .= '</button>';
     $ret .= '</div></form>';
 
     return $ret;
@@ -856,26 +858,28 @@ function html_recent($first=0, $show_changes='both'){
         $first -= $conf['recent'];
         if ($first < 0) $first = 0;
         $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-prev')));
-        $form->addElement(form_makeTag('input', array(
+        $form->addElement(form_makeOpenTag('button', array(
                     'type'  => 'submit',
                     'name'  => 'first['.$first.']',
-                    'value' => $lang['btn_newer'],
                     'accesskey' => 'n',
                     'title' => $lang['btn_newer'].' [N]',
                     'class' => 'button show'
                     )));
+        $form->addElement($lang['btn_newer']);
+        $form->addElement(form_makeCloseTag('button'));
         $form->addElement(form_makeCloseTag('div'));
     }
     if ($hasNext) {
         $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-next')));
-        $form->addElement(form_makeTag('input', array(
+        $form->addElement(form_makeOpenTag('button', array(
                         'type'  => 'submit',
                         'name'  => 'first['.$last.']',
-                        'value' => $lang['btn_older'],
                         'accesskey' => 'p',
                         'title' => $lang['btn_older'].' [P]',
                         'class' => 'button show'
                         )));
+        $form->addElement($lang['btn_older']);
+        $form->addElement(form_makeCloseTag('button'));
         $form->addElement(form_makeCloseTag('div'));
     }
     $form->addElement(form_makeCloseTag('div'));
@@ -1005,7 +1009,7 @@ function html_li_default($item){
  * @param callable $func  callback to print an list item
  * @param callable $lifunc callback to the opening li tag
  * @param bool     $forcewrapper Trigger building a wrapper ul if the first level is
-                                 0 (we have a root object) or 1 (just the root content)
+ *                               0 (we have a root object) or 1 (just the root content)
  * @return string html of an unordered list
  */
 function html_buildlist($data,$class,$func,$lifunc='html_li_default',$forcewrapper=false){
diff --git a/inc/io.php b/inc/io.php
index 0636a4b62503c76a7fd76b15f458acdcdc5e1f7d..704c5b1a614b4237079b318c4419704a975f8309 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -107,13 +107,15 @@ function io_readFile($file,$clean=true){
     $ret = '';
     if(file_exists($file)){
         if(substr($file,-3) == '.gz'){
-            $ret = join('',gzfile($file));
+            $ret = gzfile($file);
+            if(is_array($ret)) $ret = join('', $ret);
         }else if(substr($file,-4) == '.bz2'){
             $ret = bzfile($file);
         }else{
             $ret = file_get_contents($file);
         }
     }
+    if($ret === null) return false;
     if($ret !== false && $clean){
         return cleanText($ret);
     }else{
@@ -127,22 +129,36 @@ function io_readFile($file,$clean=true){
  * @author  Andreas Gohr <andi@splitbrain.org>
  *
  * @param string $file filename
- * @return string|bool content or false on error
+ * @param bool   $array return array of lines
+ * @return string|array|bool content or false on error
  */
-function bzfile($file){
+function bzfile($file, $array=false) {
     $bz = bzopen($file,"r");
     if($bz === false) return false;
 
+    if($array) $lines = array();
     $str = '';
-    while (!feof($bz)){
+    while (!feof($bz)) {
         //8192 seems to be the maximum buffersize?
         $buffer = bzread($bz,8192);
         if(($buffer === false) || (bzerrno($bz) !== 0)) {
             return false;
         }
         $str = $str . $buffer;
+        if($array) {
+            $pos = strpos($str, "\n");
+            while($pos !== false) {
+                $lines[] = substr($str, 0, $pos+1);
+                $str = substr($str, $pos+1);
+                $pos = strpos($str, "\n");
+            }
+        }
     }
     bzclose($bz);
+    if($array) {
+        if($str !== '') $lines[] = $str;
+        return $lines;
+    }
     return $str;
 }
 
@@ -191,13 +207,7 @@ function _io_writeWikiPage_action($data) {
 }
 
 /**
- * Saves $content to $file.
- *
- * If the third parameter is set to true the given content
- * will be appended.
- *
- * Uses gzip if extension is .gz
- * and bz2 if extension is .bz2
+ * Internal function to save contents to a file.
  *
  * @author  Andreas Gohr <andi@splitbrain.org>
  *
@@ -206,64 +216,97 @@ function _io_writeWikiPage_action($data) {
  * @param bool   $append
  * @return bool true on success, otherwise false
  */
-function io_saveFile($file,$content,$append=false){
+function _io_saveFile($file, $content, $append) {
     global $conf;
     $mode = ($append) ? 'ab' : 'wb';
-
     $fileexists = file_exists($file);
-    io_makeFileDir($file);
-    io_lock($file);
+
     if(substr($file,-3) == '.gz'){
         $fh = @gzopen($file,$mode.'9');
-        if(!$fh){
-            msg("Writing $file failed",-1);
-            io_unlock($file);
-            return false;
-        }
+        if(!$fh) return false;
         gzwrite($fh, $content);
         gzclose($fh);
     }else if(substr($file,-4) == '.bz2'){
-        $fh = @bzopen($file,$mode{0});
-        if(!$fh){
-            msg("Writing $file failed", -1);
-            io_unlock($file);
-            return false;
+        if($append) {
+            $bzcontent = bzfile($file);
+            if($bzcontent === false) return false;
+            $content = $bzcontent.$content;
         }
+        $fh = @bzopen($file,'w');
+        if(!$fh) return false;
         bzwrite($fh, $content);
         bzclose($fh);
     }else{
         $fh = @fopen($file,$mode);
-        if(!$fh){
-            msg("Writing $file failed",-1);
-            io_unlock($file);
-            return false;
-        }
+        if(!$fh) return false;
         fwrite($fh, $content);
         fclose($fh);
     }
 
     if(!$fileexists and !empty($conf['fperm'])) chmod($file, $conf['fperm']);
-    io_unlock($file);
     return true;
 }
 
 /**
- * Delete exact linematch for $badline from $file.
+ * Saves $content to $file.
  *
- * Be sure to include the trailing newline in $badline
+ * If the third parameter is set to true the given content
+ * will be appended.
  *
  * Uses gzip if extension is .gz
+ * and bz2 if extension is .bz2
  *
- * 2005-10-14 : added regex option -- Christopher Smith <chris@jalakai.co.uk>
+ * @author  Andreas Gohr <andi@splitbrain.org>
  *
- * @author Steven Danz <steven-danz@kc.rr.com>
+ * @param string $file filename path to file
+ * @param string $content
+ * @param bool   $append
+ * @return bool true on success, otherwise false
+ */
+function io_saveFile($file, $content, $append=false) {
+    io_makeFileDir($file);
+    io_lock($file);
+    if(!_io_saveFile($file, $content, $append)) {
+        msg("Writing $file failed",-1);
+        io_unlock($file);
+        return false;
+    }
+    io_unlock($file);
+    return true;
+}
+
+/**
+ * Replace one or more occurrences of a line in a file.
  *
- * @param string $file    filename
- * @param string $badline exact linematch to remove
- * @param bool   $regex   use regexp?
+ * The default, when $maxlines is 0 is to delete all matching lines then append a single line.
+ * A regex that matches any part of the line will remove the entire line in this mode.
+ * Captures in $newline are not available.
+ *
+ * Otherwise each line is matched and replaced individually, up to the first $maxlines lines
+ * or all lines if $maxlines is -1. If $regex is true then captures can be used in $newline.
+ *
+ * Be sure to include the trailing newline in $oldline when replacing entire lines.
+ *
+ * Uses gzip if extension is .gz
+ * and bz2 if extension is .bz2
+ *
+ * @author Steven Danz <steven-danz@kc.rr.com>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author Patrick Brown <ptbrown@whoopdedo.org>
+ *
+ * @param string $file     filename
+ * @param string $oldline  exact linematch to remove
+ * @param string $newline  new line to insert
+ * @param bool   $regex    use regexp?
+ * @param int    $maxlines number of occurrences of the line to replace
  * @return bool true on success
  */
-function io_deleteFromFile($file,$badline,$regex=false){
+function io_replaceInFile($file, $oldline, $newline, $regex=false, $maxlines=0) {
+    if ((string)$oldline === '') {
+        trigger_error('$oldline parameter cannot be empty in io_replaceInFile()', E_USER_WARNING);
+        return false;
+    }
+
     if (!file_exists($file)) return true;
 
     io_lock($file);
@@ -271,41 +314,40 @@ function io_deleteFromFile($file,$badline,$regex=false){
     // load into array
     if(substr($file,-3) == '.gz'){
         $lines = gzfile($file);
+    }else if(substr($file,-4) == '.bz2'){
+        $lines = bzfile($file, true);
     }else{
         $lines = file($file);
     }
 
-    // remove all matching lines
-    if ($regex) {
-        $lines = preg_grep($badline,$lines,PREG_GREP_INVERT);
-    } else {
-        $pos = array_search($badline,$lines); //return null or false if not found
-        while(is_int($pos)){
-            unset($lines[$pos]);
-            $pos = array_search($badline,$lines);
+    // make non-regexes into regexes
+    $pattern = $regex ? $oldline : '/^'.preg_quote($oldline,'/').'$/';
+    $replace = $regex ? $newline : addcslashes($newline, '\$');
+
+    // remove matching lines
+    if ($maxlines > 0) {
+        $count = 0;
+        $matched = 0;
+        while (($count < $maxlines) && (list($i,$line) = each($lines))) {
+            // $matched will be set to 0|1 depending on whether pattern is matched and line replaced
+            $lines[$i] = preg_replace($pattern, $replace, $line, -1, $matched);
+            if ($matched) $count++;
+        }
+    } else if ($maxlines == 0) {
+        $lines = preg_grep($pattern, $lines, PREG_GREP_INVERT);
+
+        if ((string)$newline !== ''){
+            $lines[] = $newline;
         }
+    } else {
+        $lines = preg_replace($pattern, $replace, $lines);
     }
 
     if(count($lines)){
-        $content = join('',$lines);
-        if(substr($file,-3) == '.gz'){
-            $fh = @gzopen($file,'wb9');
-            if(!$fh){
-                msg("Removing content from $file failed",-1);
-                io_unlock($file);
-                return false;
-            }
-            gzwrite($fh, $content);
-            gzclose($fh);
-        }else{
-            $fh = @fopen($file,'wb');
-            if(!$fh){
-                msg("Removing content from $file failed",-1);
-                io_unlock($file);
-                return false;
-            }
-            fwrite($fh, $content);
-            fclose($fh);
+        if(!_io_saveFile($file, join('',$lines), false)) {
+            msg("Removing content from $file failed",-1);
+            io_unlock($file);
+            return false;
         }
     }else{
         @unlink($file);
@@ -315,6 +357,22 @@ function io_deleteFromFile($file,$badline,$regex=false){
     return true;
 }
 
+/**
+ * Delete lines that match $badline from $file.
+ *
+ * Be sure to include the trailing newline in $badline
+ *
+ * @author Patrick Brown <ptbrown@whoopdedo.org>
+ *
+ * @param string $file    filename
+ * @param string $badline exact linematch to remove
+ * @param bool   $regex   use regexp?
+ * @return bool true on success
+ */
+function io_deleteFromFile($file,$badline,$regex=false){
+    return io_replaceInFile($file,$badline,null,$regex,0);
+}
+
 /**
  * Tries to lock a file
  *
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index 2d21fc8f0861abf4396bdd73271a4218732bdecc..fb89bb0c7bb6a2ba487d0cec26debc4f5f2d098e 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Mostafa Hussein <mostafa@gmail.com>
  * @author Yaman Hokan <always.smile.yh@hotmail.com>
  * @author Usama Akkad <uahello@gmail.com>
@@ -87,7 +87,7 @@ $lang['profchanged']           = 'حُدث الملف الشخصي للمستخ
 $lang['profnodelete']          = 'هذه الموسوعه لا ندعم حذف الأشخاص';
 $lang['profdeleteuser']        = 'احذف حساب';
 $lang['profdeleted']           = 'حسابك الخاص تم حذفه من هذه الموسوعة';
-$lang['profconfdelete']        = 'أنا أرغب في حذف حسابي من هذه الموسوعة.<br/> 
+$lang['profconfdelete']        = 'أنا أرغب في حذف حسابي من هذه الموسوعة.<br/>
 هذا الحدث غير ممكن.';
 $lang['profconfdeletemissing'] = 'لم تقم بوضع علامة في مربع التأكيد';
 $lang['pwdforget']             = 'أنسيت كلمة السر؟ احصل على واحدة جديدة';
@@ -142,8 +142,6 @@ $lang['js']['del_confirm']     = 'هل حقاً تريد حذف البنود ا
 $lang['js']['restore_confirm'] = 'أمتأكد من استرجاع هذه النسخة؟';
 $lang['js']['media_diff']      = 'عرض الفروق:';
 $lang['js']['media_diff_both'] = 'جنبا إلى جنب';
-$lang['js']['media_diff_opacity'] = 'Shine-through';
-$lang['js']['media_diff_portions'] = 'Swipe';
 $lang['js']['media_select']    = 'اختر ملفا...';
 $lang['js']['media_upload_btn'] = 'ارفع';
 $lang['js']['media_done_btn']  = 'تم';
@@ -299,8 +297,8 @@ $lang['i_badhash']             = 'الملف dokuwiki.php غير مصنف أو 
 (hash=<code>%s</code>)';
 $lang['i_badval']              = 'القيمة <code>%s</code> غير شرعية أو فارغة';
 $lang['i_success']             = 'الإعدادات تمت بنجاح، يرجى حذف الملف install.php الآن.
-ثم تابع إلى <a href="doku.php"> دوكو ويكي الجديدة</a>';
-$lang['i_failure']             = 'بعض الأخطاء حدثت أثنا كتابة ملفات الإعدادات، عليك تعديلها يدوياً قبل أن تستطيع استخدام <a href="doku.php"> دوكو ويكي الجديدة</a>';
+ثم تابع إلى <a href="doku.php?id=wiki:welcome"> دوكو ويكي الجديدة</a>';
+$lang['i_failure']             = 'بعض الأخطاء حدثت أثنا كتابة ملفات الإعدادات، عليك تعديلها يدوياً قبل أن تستطيع استخدام <a href="doku.php?id=wiki:welcome"> دوكو ويكي الجديدة</a>';
 $lang['i_policy']              = 'تصريح ACL مبدئي';
 $lang['i_pol0']                = 'ويكي مفتوحة؛ أي القراءة والكتابة والتحميل مسموحة للجميع';
 $lang['i_pol1']                = 'ويكي عامة؛ أي القراءة للجميع ولكن الكتابة والتحميل للمشتركين المسجلين فقط';
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index 9176cee5655b349d7e86aff4f5a16c398c0b846f..697f39ad38655b48d05be3e18c3f38d7e1237edf 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Nikolay Vladimirov <nikolay@vladimiroff.com>
  * @author Viktor Usunov <usun0v@mail.bg>
  * @author Kiril <neohidra@gmail.com>
@@ -10,8 +10,8 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
 $lang['singlequoteopening']    = '‘';
 $lang['singlequoteclosing']    = '’';
 $lang['apostrophe']            = '’';
diff --git a/inc/lang/bn/lang.php b/inc/lang/bn/lang.php
index 8443228e37bdb0d6c69f618c9a5df5f52c17aa1c..5cb66a85307e2a93951ba70c85f1c390d1b6d1b2 100644
--- a/inc/lang/bn/lang.php
+++ b/inc/lang/bn/lang.php
@@ -2,25 +2,24 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Foysol <ragebot1125@gmail.com>
  * @author ninetailz <ninetailz1125@gmail.com>
  * @author Khan M. B. Asad <muhammad2017@gmail.com>
  * @author Ninetailz <ninetailz1125@gmail.com>
  */
 $lang['encoding']              = 'utf-8';
-$lang['direction']             = 'itr';
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
-$lang['singlequoteopening']    = '\'';
-$lang['singlequoteclosing']    = '\'';
-$lang['apostrophe']            = '\'';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'এই পৃষ্ঠা সম্পাদনা করুন';
 $lang['btn_source']            = 'দেখান পাতা উৎস';
 $lang['btn_show']              = 'দেখান পৃষ্ঠা';
 $lang['btn_create']            = 'এই পৃষ্ঠা তৈরি করুন';
 $lang['btn_search']            = 'অনুসন্ধান';
-$lang['btn_save']              = 'Save';
 $lang['btn_preview']           = 'পূর্বরূপ';
 $lang['btn_top']               = 'উপরে ফিরে যান ';
 $lang['btn_newer']             = '<< আরো সাম্প্রতিক';
@@ -196,7 +195,7 @@ $lang['created']               = 'তৈরি করা';
 $lang['restored']              = 'পুরানো সংস্করণের পুনঃস্থাপন (%s)';
 $lang['external_edit']         = 'বাহ্যিক সম্পাদনা';
 $lang['summary']               = 'সম্পাদনা সারাংশ';
-$lang['noflash']               = 'এ href="http://www.adobe.com/products/flashplayer/"> অ্যাডোবি ফ্ল্যাশ প্লাগইন </ a> এই সামগ্রী প্রদর্শন করার জন্য প্রয়োজন হয়.';
+$lang['noflash']               = 'এ href="http://www.adobe.com/products/flashplayer/"> অ্যাডোবি ফ্ল্যাশ প্লাগইন </a> এই সামগ্রী প্রদর্শন করার জন্য প্রয়োজন হয়.';
 $lang['download']              = 'ডাউনলোড স্নিপেট ';
 $lang['tools']                 = 'সরঞ্জামসমূহ';
 $lang['user_tools']            = 'ব্যবহারকারীর সরঞ্জামসমূহ';
diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php
index 220600dec44623ee03d74cbc7774c0053868bc5c..bb21f5c3c4ca25f4ab5821402a5dc84bcf8bd272 100644
--- a/inc/lang/ca/lang.php
+++ b/inc/lang/ca/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Carles Bellver <carles.bellver@cent.uji.es>
  * @author Carles Bellver <carles.bellver@gmail.com>
  * @author daniel@6temes.cat
@@ -271,8 +271,8 @@ $lang['i_confexists']          = '<code>%s</code> ja existeix';
 $lang['i_writeerr']            = 'No es pot crear <code>%s</code>. Comproveu els permisos del directori i/o del fitxer i creeu el fitxer manualment.';
 $lang['i_badhash']             = 'dokuwiki.php no reconegut o modificat (hash=<code>%s</code>)';
 $lang['i_badval']              = '<code>%s</code> - valor il·legal o buit';
-$lang['i_success']             = 'La configuració s\'ha acabat amb èxit. Ara podeu suprimir el fitxer install.php. Aneu al vostre nou <a href="doku.php">DokuWiki</a>.';
-$lang['i_failure']             = 'S\'han produït alguns errors en escriure els fitxers de configuració. Potser caldrà que els arregleu manualment abans d\'utilitzar el vostre nou <a href="doku.php">DokuWiki</a>.';
+$lang['i_success']             = 'La configuració s\'ha acabat amb èxit. Ara podeu suprimir el fitxer install.php. Aneu al <a href="doku.php?id=wiki:welcome">vostre nou DokuWiki</a>.';
+$lang['i_failure']             = 'S\'han produït alguns errors en escriure els fitxers de configuració. Potser caldrà que els arregleu manualment abans d\'utilitzar el <a href="doku.php?id=wiki:welcome">vostre nou DokuWiki</a>.';
 $lang['i_policy']              = 'Política ACL inicial';
 $lang['i_pol0']                = 'Wiki obert (tothom pot llegir, escriure i penjar fitxers)';
 $lang['i_pol1']                = 'Wiki públic (tothom pot llegir, els usuaris registrats poden escriure i penjar fitxers)';
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index 6545621d7e21b8a76205a6717bce8ee2dceeb365..42fb9a2656d30932fd3f5817852f218b607b05d2 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -22,6 +22,7 @@
  * @author Frank Loizzi <contact@software.bacal.de>
  * @author Volker Bödker <volker@boedker.de>
  * @author Janosch <janosch@moinzen.de>
+ * @author rnck <dokuwiki@rnck.de>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
@@ -65,6 +66,8 @@ $lang['btn_register']          = 'Registrieren';
 $lang['btn_apply']             = 'Ãœbernehmen';
 $lang['btn_media']             = 'Medien-Manager';
 $lang['btn_deleteuser']        = 'Benutzerprofil löschen';
+$lang['btn_img_backto']        = 'Zurück zu %s';
+$lang['btn_mediaManager']      = 'Im Medien-Manager anzeigen';
 $lang['loggedinas']            = 'Angemeldet als:';
 $lang['user']                  = 'Benutzername';
 $lang['pass']                  = 'Passwort';
@@ -80,11 +83,12 @@ $lang['badpassconfirm']        = 'Das Passwort war falsch.';
 $lang['minoredit']             = 'Kleine Änderung';
 $lang['draftdate']             = 'Entwurf gespeichert am';
 $lang['nosecedit']             = 'Diese Seite wurde in der Zwischenzeit geändert, da das Sektionsinfo veraltet ist. Die ganze Seite wird stattdessen geladen.';
-$lang['searchcreatepage']      = "Falls der gesuchte Begriff nicht gefunden wurde, kannst du direkt eine neue Seite für den Suchbegriff anlegen, indem du auf den Knopf **''[Seite anlegen]''** drückst.";
+$lang['searchcreatepage']      = 'Falls der gesuchte Begriff nicht gefunden wurde, kannst du direkt eine neue Seite für den Suchbegriff anlegen, indem du auf den Knopf **\'\'[Seite anlegen]\'\'** drückst.';
 $lang['regmissing']            = 'Alle Felder müssen ausgefüllt werden';
 $lang['reguexists']            = 'Der Benutzername existiert leider schon.';
 $lang['regsuccess']            = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';
 $lang['regsuccess2']           = 'Der neue Benutzer wurde angelegt.';
+$lang['regfail']               = 'Der Benutzer konnte nicht erstellt werden.';
 $lang['regmailfail']           = 'Offenbar ist ein Fehler beim Versenden der Passwortmail aufgetreten. Bitte wende dich an den Wiki-Admin.';
 $lang['regbadmail']            = 'Die angegebene Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wende dich bitte an den Wiki-Admin.';
 $lang['regbadpass']            = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuche es noch einmal.';
@@ -99,6 +103,7 @@ $lang['profdeleteuser']        = 'Benutzerprofil löschen';
 $lang['profdeleted']           = 'Dein Benutzerprofil wurde im Wiki gelöscht.';
 $lang['profconfdelete']        = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion ist nicht umkehrbar.';
 $lang['profconfdeletemissing'] = 'Bestätigungs-Checkbox wurde nicht angehakt.';
+$lang['proffail']              = 'Das Benutzerprofil wurde nicht aktualisiert.';
 $lang['pwdforget']             = 'Passwort vergessen? Fordere ein neues an';
 $lang['resendna']              = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
 $lang['resendpwd']             = 'Neues Passwort setzen für';
@@ -194,6 +199,11 @@ $lang['difflink']              = 'Link zu der Vergleichsansicht';
 $lang['diff_type']             = 'Unterschiede anzeigen:';
 $lang['diff_inline']           = 'Inline';
 $lang['diff_side']             = 'Side by Side';
+$lang['diffprevrev']           = 'Vorherige Ãœberarbeitung';
+$lang['diffnextrev']           = 'Nächste Überarbeitung';
+$lang['difflastrev']           = 'Letzte Ãœberarbeitung';
+$lang['diffbothprevrev']       = 'Beide Seiten, vorherige Ãœberarbeitung';
+$lang['diffbothnextrev']       = 'Beide Seiten, nächste Überarbeitung';
 $lang['line']                  = 'Zeile';
 $lang['breadcrumb']            = 'Zuletzt angesehen:';
 $lang['youarehere']            = 'Du befindest dich hier:';
@@ -249,7 +259,6 @@ $lang['upperns']               = 'Gehe zum übergeordneten Namensraum';
 $lang['metaedit']              = 'Metadaten bearbeiten';
 $lang['metasaveerr']           = 'Die Metadaten konnten nicht gesichert werden';
 $lang['metasaveok']            = 'Metadaten gesichert';
-$lang['btn_img_backto']            = 'Zurück zu %s';
 $lang['img_title']             = 'Titel:';
 $lang['img_caption']           = 'Bildunterschrift:';
 $lang['img_date']              = 'Datum:';
@@ -262,7 +271,6 @@ $lang['img_camera']            = 'Kamera:';
 $lang['img_keywords']          = 'Schlagwörter:';
 $lang['img_width']             = 'Breite:';
 $lang['img_height']            = 'Höhe:';
-$lang['btn_mediaManager']           = 'Im Medien-Manager anzeigen';
 $lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementliste von %s hinzugefügt';
 $lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementliste von %s';
 $lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden';
@@ -289,6 +297,7 @@ $lang['i_problems']            = 'Das Installationsprogramm hat unten aufgeführ
 $lang['i_modified']            = 'Aus Sicherheitsgründen arbeitet dieses Skript nur mit einer neuen bzw. nicht modifizierten DokuWiki-Installation. Du solltest entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
 $lang['i_funcna']              = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von deinem Hoster deaktiviert?';
 $lang['i_phpver']              = 'Deine PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisiere deine PHP-Installation.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload muss in php.in deaktiviert werden um DokuWiki auszuführen.';
 $lang['i_permfail']            = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Du musst die Berechtigungen dieses Ordners ändern!';
 $lang['i_confexists']          = '<code>%s</code> existiert bereits';
 $lang['i_writeerr']            = '<code>%s</code> konnte nicht erzeugt werden. Du solltest die Verzeichnis-/Datei-Rechte überprüfen und die Datei manuell anlegen.';
@@ -338,6 +347,9 @@ $lang['media_perm_read']       = 'Du besitzt nicht die notwendigen Berechtigunge
 $lang['media_perm_upload']     = 'Du besitzt nicht die notwendigen Berechtigungen um Dateien hochzuladen.';
 $lang['media_update']          = 'Neue Version hochladen';
 $lang['media_restore']         = 'Diese Version wiederherstellen';
+$lang['media_acl_warning']     = 'Diese Liste ist möglicherweise nicht vollständig. Versteckte und durch ACL gesperrte Seiten werden nicht angezeigt.';
 $lang['currentns']             = 'Aktueller Namensraum';
 $lang['searchresult']          = 'Suchergebnis';
-$lang['media_acl_warning']     = 'Diese Liste ist möglicherweise nicht vollständig. Versteckte und durch ACL gesperrte Seiten werden nicht angezeigt.';
+$lang['plainhtml']             = 'Reines HTML';
+$lang['wikimarkup']            = 'Wiki Markup';
+$lang['page_nonexist_rev']     = 'Seite existierte nicht an der Stelle %s. Sie wurde an folgende Stelle erstellt: <a href="%s">%s</a>.';
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index d74f661492d2d822623a71ba2274d7c9c6fe9fe9..c452042b6335aed796b1be0fd38a878005a40af9 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -358,5 +358,5 @@ $lang['currentns']             = 'Aktueller Namensraum';
 $lang['searchresult']          = 'Suchergebnisse';
 $lang['plainhtml']             = 'HTML Klartext';
 $lang['wikimarkup']            = 'Wiki Markup';
-$lang['page_nonexist_rev']     = 'DIe Seite exitiert nicht unter %s. Sie wurde aber unter <a herf="%s">%s</a>';
+$lang['page_nonexist_rev']     = 'Die Seite exitiert nicht unter %s. Sie wurde aber unter <a href="%s">%s</a>';
 $lang['unable_to_parse_date']  = 'Parameter "%s" kann nicht geparsed werden.';
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 21a854b3071860ceb9e5a9d5603fcb05be93aa60..0e62dd37b8f88abec1bc907891596ec0682a15bb 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Thanos Massias <tm@thriasio.gr>
  * @author Αθανάσιος Νταής <homunculus@wana.gr>
  * @author Konstantinos Koryllos <koryllos@gmail.com>
@@ -284,8 +284,8 @@ $lang['i_confexists']          = '<code>%s</code> υπάρχει ήδη';
 $lang['i_writeerr']            = 'Δεν είναι δυνατή η δημιουργία του <code>%s</code>. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου/αρχείου και να δημιουργήσετε το αρχείο χειροκίνητα!';
 $lang['i_badhash']             = 'Μη αναγνωρίσιμο ή τροποποιημένο αρχείο dokuwiki.php (hash=<code>%s</code>)';
 $lang['i_badval']              = '<code>%s</code> - λάθος ή ανύπαρκτη τιμή';
-$lang['i_success']             = 'Η εγκατάσταση ολοκληρώθηκε επιτυχώς. Μπορείτε πλέον να διαγράψετε το αρχείο install.php. Συνεχίστε στο <a href="doku.php">νέο σας DokuWiki</a>.';
-$lang['i_failure']             = 'Εμφανίστηκαν κάποια προβλήματα στη διαδικασία ανανέωσης των αρχείων ρυθμίσεων. Πιθανόν να χρειάζεται να τα τροποποιήσετε χειροκίνητα ώστε να μπορείτε να χρησιμοποιήσετε το <a href="doku.php">νέο σας DokuWiki</a>.';
+$lang['i_success']             = 'Η εγκατάσταση ολοκληρώθηκε επιτυχώς. Μπορείτε πλέον να διαγράψετε το αρχείο install.php. Συνεχίστε στο <a href="doku.php?id=wiki:welcome">νέο σας DokuWiki</a>.';
+$lang['i_failure']             = 'Εμφανίστηκαν κάποια προβλήματα στη διαδικασία ανανέωσης των αρχείων ρυθμίσεων. Πιθανόν να χρειάζεται να τα τροποποιήσετε χειροκίνητα ώστε να μπορείτε να χρησιμοποιήσετε το <a href="doku.php?id=wiki:welcome">νέο σας DokuWiki</a>.';
 $lang['i_policy']              = 'Αρχική πολιτική Λίστας Δικαιωμάτων Πρόσβασης - ACL';
 $lang['i_pol0']                = 'Ανοιχτό Wiki (όλοι μπορούν να διαβάσουν ή να δημιουργήσουν/τροποποιήσουν σελίδες και να μεταφορτώσουν αρχεία)';
 $lang['i_pol1']                = 'Δημόσιο Wiki (όλοι μπορούν να διαβάσουν σελίδες αλλά μόνο οι εγγεγραμμένοι χρήστες μπορούν να δημιουργήσουν/τροποποιήσουν σελίδες και να μεταφορτώσουν αρχεία)';
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index 24df39dc73ffdb2df165921b012b2b71b930cd61..3e0b910598e6a1adc07aeb621ce0c8541cd30e06 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Antono Vasiljev <esperanto.minsk ĈE tut.by>
  * @author Felipe Castro <fefcas@yahoo.com.br>
  * @author Felipe Castro <fefcas@uol.com.br>
@@ -17,7 +17,7 @@ $lang['doublequoteopening']    = '“';
 $lang['doublequoteclosing']    = '”';
 $lang['singlequoteopening']    = '‘';
 $lang['singlequoteclosing']    = '’';
-$lang['apostrophe']            = '\'';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Redakti la paĝon';
 $lang['btn_source']            = 'Montri fontan tekston';
 $lang['btn_show']              = 'Montri paĝon';
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index e10a29a0fd65477f40996bc6faad768b3eeec5cc..65978f558bdc449b7750f814d9c27992e23ce952 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -39,6 +39,7 @@
  * @author pokesakura <pokesakura@gmail.com>
  * @author Álvaro Iradier <airadier@gmail.com>
  * @author Alejandro Nunez <nunez.alejandro@gmail.com>
+ * @author Mauricio Segura <maose38@yahoo.es>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
@@ -104,6 +105,7 @@ $lang['regmissing']            = 'Lo siento, tienes que completar todos los camp
 $lang['reguexists']            = 'Lo siento, ya existe un usuario con este nombre.';
 $lang['regsuccess']            = 'El usuario ha sido creado y la contraseña se ha enviado por correo.';
 $lang['regsuccess2']           = 'El usuario ha sido creado.';
+$lang['regfail']               = 'No se pudo crear el usuario.';
 $lang['regmailfail']           = 'Parece que ha habido un error al enviar el correo con la contraseña. ¡Por favor, contacta al administrador!';
 $lang['regbadmail']            = 'La dirección de correo no parece válida. Si piensas que esto es un error, contacta al administrador';
 $lang['regbadpass']            = 'Las dos contraseñas no son iguales, por favor inténtalo de nuevo.';
@@ -118,6 +120,7 @@ $lang['profdeleteuser']        = 'Eliminar Cuenta';
 $lang['profdeleted']           = 'Tu cuenta de usuario ha sido eliminada de este wiki';
 $lang['profconfdelete']        = 'Deseo eliminar mi cuenta de este wiki. <br /> Esta acción es irreversible.';
 $lang['profconfdeletemissing'] = 'Casilla de verificación no activada.';
+$lang['proffail']              = 'No se ha actualizado el perfil del usuario.';
 $lang['pwdforget']             = '¿Has olvidado tu contraseña? Consigue una nueva';
 $lang['resendna']              = 'Este wiki no brinda la posibilidad de reenvío de contraseña.';
 $lang['resendpwd']             = 'Establecer nueva contraseña para';
@@ -363,6 +366,7 @@ $lang['media_perm_read']       = 'Disculpa, no tienes los permisos necesarios pa
 $lang['media_perm_upload']     = 'Disculpa, no tienes los permisos necesarios para cargar ficheros.';
 $lang['media_update']          = 'Actualizar nueva versión';
 $lang['media_restore']         = 'Restaurar esta versión';
+$lang['media_acl_warning']     = 'Puede que esta lista no esté completa debido a restricciones de la ACL y a las páginas ocultas.';
 $lang['currentns']             = 'Espacio de nombres actual';
 $lang['searchresult']          = 'Resultado de la búsqueda';
 $lang['plainhtml']             = 'HTML sencillo';
diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php
index 2372482c352c88601fc6058e2d6972fd916aae59..dbff49dfcba89266ebfb5c0ebb36e233ab159952 100644
--- a/inc/lang/et/lang.php
+++ b/inc/lang/et/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Oliver S6ro <seem.iges@mail.ee>
  * @author Aari Juhanson <aari@vmg.vil.ee>
  * @author Kaiko Kaur <kaiko@kultuur.edu.ee>
diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php
index 0f70efa5c43c520b82ba64b73bff920b8865ccec..de2ca13dacb67f30ce49dae294f81578cd75c363 100644
--- a/inc/lang/fi/lang.php
+++ b/inc/lang/fi/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Petteri <petteri@gmail.com>
  * @author Matti Pöllä <mpo@iki.fi>
  * @author Otto Vainio <otto@valjakko.net>
@@ -17,7 +17,7 @@ $lang['doublequoteopening']    = '”';
 $lang['doublequoteclosing']    = '”';
 $lang['singlequoteopening']    = '’';
 $lang['singlequoteclosing']    = '’';
-$lang['apostrophe']            = '\'';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Muokkaa tätä sivua';
 $lang['btn_source']            = 'Näytä sivun lähdekoodi';
 $lang['btn_show']              = 'Näytä sivu';
diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php
index f3f462272c67c75a36f2b1bce9dc6a9d2e4ff2cc..d1d7096c9982f078ec51873cc59b520b6eacc157 100644
--- a/inc/lang/fo/lang.php
+++ b/inc/lang/fo/lang.php
@@ -8,11 +8,11 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = 'Vanligt gásareygað byrjan';
-$lang['doublequoteclosing']    = 'Vanligt gásareygað endi';
-$lang['singlequoteopening']    = 'Einstakt gásareygað byrjan';
-$lang['singlequoteclosing']    = 'Einstakt gásareygað endi';
-$lang['apostrophe']            = 'Apostroff';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
+$lang['singlequoteopening']    = '\'';
+$lang['singlequoteclosing']    = '\'';
+$lang['apostrophe']            = '\'';
 $lang['btn_edit']              = 'Rætta hetta skjal';
 $lang['btn_source']            = 'Vís keldu';
 $lang['btn_show']              = 'Vís skjal';
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index 74b1edd19a56db3b174db7ade04e2412eb10f784..4a25aab43d73702a23278609038db966c224bf39 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Sébastien Bauer <sebastien.bauer@advalvas.be>
  * @author Antoine Fixary <antoine.fixary@freesbee.fr>
  * @author cumulus <pta-n56@myamail.com>
@@ -197,7 +197,7 @@ $lang['accessdenied']          = 'Vous n\'êtes pas autorisé à voir cette page
 $lang['mediausage']            = 'Utilisez la syntaxe suivante pour faire référence à ce fichier :';
 $lang['mediaview']             = 'Afficher le fichier original';
 $lang['mediaroot']             = 'racine';
-$lang['mediaupload']           = 'Envoyez un fichier dans la catégorie actuelle. Pour créer des sous-catégories, préfixez en le nom du fichier séparées par un double-point, après avoir choisis le(s) fichier(s). Le(s) fichier(s) peuvent également être envoyé(s) par glisser-déposer (drag & drop)';
+$lang['mediaupload']           = 'Envoyez un fichier dans la catégorie actuelle. Pour créer des sous-catégories, préfixez en le nom du fichier séparées par un double-point, après avoir choisis le(s) fichier(s). Le(s) fichier(s) peuvent également être envoyé(s) par glisser-déposer (drag &amp; drop)';
 $lang['mediaextchange']        = 'Extension du fichier modifiée de .%s en .%s !';
 $lang['reference']             = 'Références pour';
 $lang['ref_inuse']             = 'Le fichier ne peut être effacé car il est toujours utilisé par les pages suivantes :';
@@ -318,7 +318,7 @@ $lang['i_writeerr']            = 'Impossible de créer <code>%s</code>. Vous dev
 $lang['i_badhash']             = 'dokuwiki.php non reconnu ou modifié (hash=<code>%s</code>)';
 $lang['i_badval']              = '<code>%s</code> - valeur interdite ou vide';
 $lang['i_success']             = 'L\'installation s\'est terminée avec succès. Vous pouvez maintenant supprimer le fichier « install.php ». Continuer avec <a href="doku.php?id=wiki:welcome">votre nouveau DokuWiki</a>.';
-$lang['i_failure']             = 'Des erreurs sont survenues lors de l\'écriture des fichiers de configuration. Il vous faudra les corriger manuellement avant de pouvoir utiliser <a href="doku.php">votre nouveau DokuWiki</a>.';
+$lang['i_failure']             = 'Des erreurs sont survenues lors de l\'écriture des fichiers de configuration. Il vous faudra les corriger manuellement avant de pouvoir utiliser <a href="doku.php?id=wiki:welcome">votre nouveau DokuWiki</a>.';
 $lang['i_policy']              = 'Politique de contrôle d\'accès initiale';
 $lang['i_pol0']                = 'Wiki ouvert (lecture, écriture, envoi de fichiers pour tout le monde)';
 $lang['i_pol1']                = 'Wiki public (lecture pour tout le monde, écriture et envoi de fichiers pour les utilisateurs enregistrés)';
diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php
index 9cc460b58b4492eb71227fc641b14605c9f8603e..9e3d4f2b2668ac3fdccc1219d1a409cb81482a62 100644
--- a/inc/lang/gl/lang.php
+++ b/inc/lang/gl/lang.php
@@ -274,9 +274,9 @@ $lang['i_writeerr']            = 'Non se puido crear <code>%s</code>. Terás de
 $lang['i_badhash']             = 'dokuwiki.php irrecoñecíbel ou modificado (hash=<code>%s</code>)';
 $lang['i_badval']              = '<code>%s</code> - ilegal ou valor baleiro';
 $lang['i_success']             = 'A configuración rematou correctamente. Agora podes eliminar o arquivo install.php. Continúa deica o
-                        <a href="doku.php">teu novo DokuWiki</a>.';
+                        <a href="doku.php?id=wiki:welcome">teu novo DokuWiki</a>.';
 $lang['i_failure']             = 'Houbo algúns erros ao tentar escribir os arquivos de configuración. Pode que precises solucionalos de xeito manual antes
-                         de poderes empregar <a href="doku.php">o teu novo DokuWiki</a>.';
+                         de poderes empregar <a href="doku.php?id=wiki:welcome">o teu novo DokuWiki</a>.';
 $lang['i_policy']              = 'Regras iniciais da ACL';
 $lang['i_pol0']                = 'Wiki Aberto (lectura, escritura, subida de arquivos para todas as persoas)';
 $lang['i_pol1']                = 'Wiki Público (lectura para todas as persoas, escritura e subida de arquivos para usuarios rexistrados)';
diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php
index 37ea704da6c520b7ddad16564e6056c8ac41b3b7..a24ccace9422a257a3563dc25e225b77004fb989 100644
--- a/inc/lang/he/lang.php
+++ b/inc/lang/he/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author גיא שפר <guysoft@ort.org.il>
  * @author Denis Simakov <akinoame1@gmail.com>
  * @author Dotan Kamber <kamberd@yahoo.com>
@@ -110,7 +110,7 @@ $lang['searchmedia_in']        = 'חיפוש תחת %s';
 $lang['txt_upload']            = 'בחירת קובץ להעלות:';
 $lang['txt_filename']          = 'העלאה בשם (נתון לבחירה):';
 $lang['txt_overwrt']           = 'שכתוב על קובץ קיים';
-$lang['maxuploadsize']         = 'העלה מקסימום. s% לכל קובץ.';
+$lang['maxuploadsize']         = 'העלה מקסימום. %s לכל קובץ.';
 $lang['lockedby']              = 'נעול על ידי:';
 $lang['lockexpire']            = 'הנעילה פגה:';
 $lang['js']['willexpire']      = 'הנעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאפס את מד משך הנעילה.';
@@ -289,7 +289,7 @@ $lang['i_problems']            = 'תכנית ההתקנה זיהתה מספר ב
 $lang['i_modified']            = 'משיקולי אבטחה סקריפט זה יעבוד אך ורק עם התקנת DokuWiki חדשה שלא עברה כל שינוי.
                          עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף
                          <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
-$lang['i_funcna']              = 'פונקציית ה-PHP&rlm; <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
+$lang['i_funcna']              = 'פונקציית ה-PHP&#8207; <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
 $lang['i_phpver']              = 'גרסת PHP שלך <code>%s</code> נמוכה מ <code>%s</code> הצורך. אתה צריך לשדרג PHP שלך להתקין.';
 $lang['i_mbfuncoverload']      = 'יש לבטל את mbstring.func_overload בphp.ini בכדי להריץ את DokuWiki';
 $lang['i_permfail']            = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!';
@@ -329,8 +329,8 @@ $lang['media_list_rows']       = 'שורות';
 $lang['media_sort_name']       = 'שם';
 $lang['media_sort_date']       = 'תאריך';
 $lang['media_namespaces']      = 'בחר מרחב שמות';
-$lang['media_files']           = 'קבצים ב s%';
-$lang['media_upload']          = 'להעלות s%';
+$lang['media_files']           = 'קבצים ב %s';
+$lang['media_upload']          = 'להעלות %s';
 $lang['media_search']          = 'חיפוש ב%s';
 $lang['media_view']            = '%s';
 $lang['media_viewold']         = '%s ב %s';
diff --git a/inc/lang/he/mailtext.txt b/inc/lang/he/mailtext.txt
index 222ee1b6d06e1463d22d2bd61aaaa5ef3ca881f9..5ef4ec7e25e6deb0ac5b77d8fd4b6425c277afa6 100644
--- a/inc/lang/he/mailtext.txt
+++ b/inc/lang/he/mailtext.txt
@@ -2,7 +2,7 @@
 
 תאריך        : @DATE@
 דפדפן     : @BROWSER@
-כתובת ה־IP&rlm;  : @IPADDRESS@
+כתובת ה־IP&#8207;  : @IPADDRESS@
 שם המארח    : @HOSTNAME@
 המהדורה הישנה: @OLDPAGE@
 המהדורה החדשה: @NEWPAGE@
@@ -11,7 +11,7 @@
 
 @DIFF@
 
--- 
+--
 
 דף זה נוצר ע״י ה־DokuWiki הזמין בכתובת
 @DOKUWIKIURL@
diff --git a/inc/lang/he/registermail.txt b/inc/lang/he/registermail.txt
index 3edca3fa0326c41ceb8bb0931f8da6934991e469..d478d1c20cd44b9f69294a4ee2fdac6dbf52bfa3 100644
--- a/inc/lang/he/registermail.txt
+++ b/inc/lang/he/registermail.txt
@@ -6,9 +6,9 @@
 
 תאריך      : @DATE@
 דפדפן      : @BROWSER@
-כתובת IP&rlm;  : @IPADDRESS@
+כתובת IP&#8207;  : @IPADDRESS@
 שם המארח   : @HOSTNAME@
 
--- 
+--
 הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת
 @DOKUWIKIURL@
diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php
index 39eaa18c0094a550a7bf90a8430dc4afd96c1cbd..40e0c59c360226841a6f1320f7535b3d07e9fe87 100644
--- a/inc/lang/hr/lang.php
+++ b/inc/lang/hr/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Tomo Krajina <aaa@puzz.info>
  * @author Branko Rihtman <theney@gmail.com>
  * @author Dražen Odobašić <dodobasic@gmail.com>
@@ -15,7 +15,7 @@ $lang['doublequoteopening']    = '“';
 $lang['doublequoteclosing']    = '”';
 $lang['singlequoteopening']    = '‘';
 $lang['singlequoteclosing']    = '’';
-$lang['apostrophe']            = '\'';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Izmijeni stranicu';
 $lang['btn_source']            = 'Prikaži kod stranice';
 $lang['btn_show']              = 'Prikaži dokument';
diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php
index 514c638718413519083dbe4c3d1ac5ce9ed0897f..4321e2cc908c3ddf228b03f45e0effc37d3f0a37 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author mubaidillah <mubaidillah@gmail.com>
  * @author Irwan Butar Butar <irwansah.putra@gmail.com>
  * @author Yustinus Waruwu <juswaruwu@gmail.com>
@@ -12,10 +12,10 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
-$lang['singlequoteopening']    = '\'';
-$lang['singlequoteclosing']    = '\'';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
 $lang['apostrophe']            = '\'';
 $lang['btn_edit']              = 'Edit halaman ini';
 $lang['btn_source']            = 'Lihat sumber halaman';
@@ -23,7 +23,6 @@ $lang['btn_show']              = 'Tampilkan halaman';
 $lang['btn_create']            = 'Buat halaman baru';
 $lang['btn_search']            = 'Cari';
 $lang['btn_save']              = 'Simpan';
-$lang['btn_preview']           = 'Preview';
 $lang['btn_top']               = 'kembali ke atas';
 $lang['btn_newer']             = '<< lebih lanjut';
 $lang['btn_older']             = 'sebelumnya >>';
@@ -32,7 +31,6 @@ $lang['btn_recent']            = 'Perubahan terbaru';
 $lang['btn_upload']            = 'Upload';
 $lang['btn_cancel']            = 'Batal';
 $lang['btn_index']             = 'Indeks';
-$lang['btn_secedit']           = 'Edit';
 $lang['btn_login']             = 'Login';
 $lang['btn_logout']            = 'Keluar';
 $lang['btn_admin']             = 'Admin';
@@ -42,9 +40,7 @@ $lang['btn_back']              = 'Kembali';
 $lang['btn_backlink']          = 'Backlinks';
 $lang['btn_subscribe']         = 'Ikuti Perubahan';
 $lang['btn_profile']           = 'Ubah Profil';
-$lang['btn_reset']             = 'Reset';
 $lang['btn_resendpwd']         = 'Atur password baru';
-$lang['btn_draft']             = 'Edit draft';
 $lang['btn_recover']           = 'Cadangkan draf';
 $lang['btn_draftdel']          = 'Hapus draft';
 $lang['btn_revert']            = 'Kembalikan';
@@ -157,7 +153,7 @@ $lang['uploadexist']           = 'File telah ada. Tidak mengerjakan apa-apa.';
 $lang['uploadbadcontent']      = 'Isi file yang diupload tidak cocok dengan ekstensi file %s.';
 $lang['uploadspam']            = 'File yang diupload diblok oleh spam blacklist.';
 $lang['uploadxss']             = 'File yang diupload diblok karena kemungkinan isi yang berbahaya.';
-$lang['uploadsize']            = 'File yang diupload terlalu besar. (max.%)';
+$lang['uploadsize']            = 'File yang diupload terlalu besar. (max. %s)';
 $lang['deletesucc']            = 'File "%s" telah dihapus.';
 $lang['deletefail']            = '"%s" tidak dapat dihapus - cek hak aksesnya.';
 $lang['mediainuse']            = 'File "%s" belum dihapus - file ini sedang digunakan.';
@@ -172,7 +168,6 @@ $lang['mediaextchange']        = 'Ektensi file berubah dari .%s ke .%s';
 $lang['reference']             = 'Referensi untuk';
 $lang['ref_inuse']             = 'File tidak dapat dihapus karena sedang digunakan oleh halaman:';
 $lang['ref_hidden']            = 'Beberapa referensi ada didalam halaman yang tidak diijinkan untuk Anda baca.';
-$lang['hits']                  = 'Hits';
 $lang['quickhits']             = 'Matching pagenames';
 $lang['toc']                   = 'Daftar isi';
 $lang['current']               = 'sekarang';
@@ -195,7 +190,6 @@ $lang['deleted']               = 'terhapus';
 $lang['created']               = 'dibuat';
 $lang['restored']              = 'revisi lama ditampilkan kembali (%s)';
 $lang['external_edit']         = 'Perubahan eksternal';
-$lang['summary']               = 'Edit summary';
 $lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> diperlukan untuk menampilkan konten ini.';
 $lang['download']              = 'Unduh Cuplikan';
 $lang['tools']                 = 'Alat';
@@ -218,26 +212,17 @@ $lang['qb_italic']             = 'Miring';
 $lang['qb_underl']             = 'Garis Bawah';
 $lang['qb_code']               = 'Kode';
 $lang['qb_strike']             = 'Text Tercoret';
-$lang['qb_h1']                 = 'Level 1 Headline';
-$lang['qb_h2']                 = 'Level 2 Headline';
-$lang['qb_h3']                 = 'Level 3 Headline';
-$lang['qb_h4']                 = 'Level 4 Headline';
-$lang['qb_h5']                 = 'Level 5 Headline';
 $lang['qb_hs']                 = 'Pilih Judul';
 $lang['qb_hplus']              = 'Judul Lebih Atas';
 $lang['qb_hminus']             = 'Judul Lebih Bawah';
 $lang['qb_hequal']             = 'Tingkat Judul yang Sama';
-$lang['qb_link']               = 'Link Internal';
-$lang['qb_extlink']            = 'Link External';
 $lang['qb_hr']                 = 'Garis Horisontal';
 $lang['qb_ol']                 = 'Item Berurutan';
 $lang['qb_ul']                 = 'Item Tidak Berurutan';
 $lang['qb_media']              = 'Tambahkan gambar atau file lain';
 $lang['qb_sig']                = 'Sisipkan tanda tangan';
-$lang['qb_smileys']            = 'Smileys';
 $lang['qb_chars']              = 'Karakter Khusus';
 $lang['upperns']               = 'lompat ke namespace induk';
-$lang['metaedit']              = 'Edit Metadata';
 $lang['metasaveerr']           = 'Gagal menulis metadata';
 $lang['metasaveok']            = 'Metadata tersimpan';
 $lang['img_title']             = 'Judul:';
diff --git a/inc/lang/ja/index.txt b/inc/lang/ja/index.txt
index b0447899da792019a7c311cab5e11c6787973a3b..b3dbb95f3319e2abcbd0fa9295da807143f3f07e 100644
--- a/inc/lang/ja/index.txt
+++ b/inc/lang/ja/index.txt
@@ -1,4 +1,4 @@
 ====== サイトマップ ======
 
-[[doku>namespaces|名前空間]] に基づく、全ての文書の索引です。
+[[doku>ja:namespaces|名前空間]] に基づく、全ての文書の索引です。
 
diff --git a/inc/lang/ka/lang.php b/inc/lang/ka/lang.php
index 0b2d60e4ec831417202d6eceb5432abd9baa8b41..72594efe3a8f10cd1a3a04d85ed986937f8a5c87 100644
--- a/inc/lang/ka/lang.php
+++ b/inc/lang/ka/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Luka Lejava <luka.lejava@gmail.com>
  */
 $lang['encoding']              = 'utf-8';
@@ -35,7 +35,6 @@ $lang['btn_update']            = 'განახლება';
 $lang['btn_delete']            = 'წაშლა';
 $lang['btn_back']              = 'უკან';
 $lang['btn_backlink']          = 'გადმომისამართებული ბმულები';
-$lang['btn_subscribe']         = 'Manage Subscriptions';
 $lang['btn_profile']           = 'პროფილის განახლება';
 $lang['btn_reset']             = 'წაშლა';
 $lang['btn_resendpwd']         = 'ახალი პაროლის დაყენება';
@@ -47,7 +46,7 @@ $lang['btn_register']          = 'რეგისტრაცია';
 $lang['btn_apply']             = 'ცადე';
 $lang['btn_media']             = 'მედია ფაილების მართვა';
 $lang['btn_deleteuser']        = 'ჩემი ექაუნთის წაშლა';
-$lang['btn_img_backto']        = 'უკან %';
+$lang['btn_img_backto']        = 'უკან %s';
 $lang['btn_mediaManager']      = 'მედია ფაილების მმართველში გახსნა';
 $lang['loggedinas']            = 'შესული ხართ როგორც:';
 $lang['user']                  = 'ლოგინი';
@@ -93,11 +92,11 @@ $lang['resendpwdsuccess']      = 'ახალი პაროლი გამ
 $lang['license']               = 'ვიკი ლიცენზირებულია: ';
 $lang['licenseok']             = 'ამ გვერდის რედაქტირებით თვენ ეთანხმებით ლიცენზიას:';
 $lang['searchmedia']           = 'საძებო სახელი:';
-$lang['searchmedia_in']        = 'ძებნა %-ში';
+$lang['searchmedia_in']        = 'ძებნა %s-ში';
 $lang['txt_upload']            = 'აირჩიეთ ასატვირთი ფაილი:';
 $lang['txt_filename']          = 'ატვირთვა როგორც (არჩევითი):';
 $lang['txt_overwrt']           = 'გადაწერა ზემოდან';
-$lang['maxuploadsize']         = 'მაქსიმალური ზომა %';
+$lang['maxuploadsize']         = 'მაქსიმალური ზომა %s';
 $lang['lockedby']              = 'დაბლოკილია:';
 $lang['lockexpire']            = 'განიბლოკება:';
 $lang['js']['willexpire']      = 'გვერდი განიბლოკება 1 წუთში';
@@ -107,7 +106,6 @@ $lang['js']['keepopen']        = 'დატოვეთ ღია';
 $lang['js']['hidedetails']     = 'დეტალების დამალვა';
 $lang['js']['mediatitle']      = 'ინსტრუმენტები';
 $lang['js']['mediadisplay']    = 'ბმულის ტიპი';
-$lang['js']['mediaalign']      = 'Alignment';
 $lang['js']['mediasize']       = 'სურათის ზომა';
 $lang['js']['mediatarget']     = 'მიზნის ბმული';
 $lang['js']['mediaclose']      = 'დახურვა';
@@ -125,7 +123,6 @@ $lang['js']['medianolink']     = 'არ დალინკოთ სურა
 $lang['js']['medialeft']       = 'მარცხვნივ განათავსეთ სურათი';
 $lang['js']['mediaright']      = 'მარჯვნივ განათავსეთ სურათი';
 $lang['js']['mediacenter']     = 'შუაში განათავსეთ სურათი';
-$lang['js']['medianoalign']    = 'Use no align.';
 $lang['js']['nosmblinks']      = 'ეს ფუქნცია მუშაობს მხოლოდ  Internet Explorer-ზე';
 $lang['js']['linkwiz']         = 'ბმული';
 $lang['js']['linkto']          = 'ბმული';
@@ -133,9 +130,6 @@ $lang['js']['del_confirm']     = 'დარწმუნებული ხარ
 $lang['js']['restore_confirm'] = 'დარწმუნებული ხართ რომ აღდგენა გინდათ?';
 $lang['js']['media_diff']      = 'განსხვავებების ჩვენება';
 $lang['js']['media_diff_both'] = 'გვერდიგვერდ';
-$lang['js']['media_diff_opacity'] = 'Shine-through';
-$lang['js']['media_diff_portions'] = 'Swipe
-';
 $lang['js']['media_select']    = 'არჩეული ფაილები';
 $lang['js']['media_upload_btn'] = 'ატვირთვა';
 $lang['js']['media_done_btn']  = 'მზადაა';
@@ -149,49 +143,36 @@ $lang['uploadsucc']            = 'ატვირთვა დასრულე
 $lang['uploadfail']            = 'შეფერხება ატვირთვისას';
 $lang['uploadwrong']           = 'ატვირთვა შეუძლებელია';
 $lang['uploadexist']           = 'ფაილი უკვე არსებობს';
-$lang['uploadbadcontent']      = 'ატვირთული ფაილები არ ემთხვევა ';
+$lang['uploadbadcontent']      = 'ატვირთული ფაილები არ ემთხვევა %s';
 $lang['uploadspam']            = 'ატვირთვა დაბლოკილია სპამბლოკერის მიერ';
 $lang['uploadxss']             = 'ატვირთვა დაბლოკილია';
-$lang['uploadsize']            = 'ასატვირთი ფაილი ზედმეტად დიდია';
-$lang['deletesucc']            = '% ფაილები წაიშალა';
-$lang['deletefail']            = '% ვერ მოიძებნა';
-$lang['mediainuse']            = 'ფაილის % ვერ წაიშალა, რადგან გამოყენებაშია';
-$lang['namespaces']            = 'Namespaces';
+$lang['uploadsize']            = 'ასატვირთი ფაილი ზედმეტად დიდია %s';
+$lang['deletesucc']            = '%s ფაილები წაიშალა';
+$lang['deletefail']            = '%s ვერ მოიძებნა';
+$lang['mediainuse']            = 'ფაილის %s ვერ წაიშალა, რადგან გამოყენებაშია';
 $lang['mediafiles']            = 'არსებული ფაილები';
 $lang['accessdenied']          = 'თქვენ არ შეგიძლიათ გვერდის ნახვა';
-$lang['mediausage']            = 'Use the following syntax to reference this file:';
 $lang['mediaview']             = 'ორიგინალი ფაილის ჩვენება';
 $lang['mediaroot']             = 'root';
-$lang['mediaupload']           = 'Upload a file to the current namespace here. To create subnamespaces, prepend them to your filename separated by colons after you selected the files. Files can also be selected by drag and drop.';
-$lang['mediaextchange']        = 'Filextension changed from .%s to .%s!';
-$lang['reference']             = 'References for';
 $lang['ref_inuse']             = 'ფაილი წაშლა შეუძლებელია, გამოიყენება აქ:';
 $lang['ref_hidden']            = 'ზოგიერთი ბლოკის წაკითხვის უფლება არ გაქვთ';
-$lang['hits']                  = 'Hits';
 $lang['quickhits']             = 'მსგავსი სახელები';
-$lang['toc']                   = 'Table of Contents';
 $lang['current']               = 'ახლანდელი';
 $lang['yours']                 = 'თვენი ვერსია';
 $lang['diff']                  = 'ვერსიების განსხვავება';
 $lang['diff2']                 = 'განსხვავებები';
-$lang['difflink']              = 'Link to this comparison view';
 $lang['diff_type']             = 'განსხვავებების ჩვენება';
-$lang['diff_inline']           = 'Inline';
 $lang['diff_side']             = 'გვერდიგვერდ';
 $lang['diffprevrev']           = 'წინა ვერსია';
 $lang['diffnextrev']           = 'შემდეგი ვერსია';
 $lang['difflastrev']           = 'ბოლო ვერსია';
-$lang['diffbothprevrev']       = 'Both sides previous revision';
-$lang['diffbothnextrev']       = 'Both sides next revision';
 $lang['line']                  = 'ზოლი';
-$lang['breadcrumb']            = 'Trace:';
 $lang['youarehere']            = 'თვენ ხართ აქ:';
 $lang['lastmod']               = 'ბოლოს მოდიფიცირებული:';
 $lang['deleted']               = 'წაშლილია';
 $lang['created']               = 'შექმნილია';
-$lang['restored']              = 'ძველი ვერსია აღდგენილია %';
+$lang['restored']              = 'ძველი ვერსია აღდგენილია (%s)';
 $lang['external_edit']         = 'რედაქტირება';
-$lang['summary']               = 'Edit summary';
 $lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">საჭიროა Adobe Flash Plugin</a>';
 $lang['download']              = 'Snippet-ის გადმოწერა';
 $lang['tools']                 = 'ინსტრუმენტები';
@@ -209,11 +190,6 @@ $lang['changes_type']          = 'ცვლილებები';
 $lang['pages_changes']         = 'გვერდები';
 $lang['media_changes']         = 'მედია ფაილები';
 $lang['both_changes']          = 'გვერდები და მედია ფაილები';
-$lang['qb_bold']               = 'Bold Text';
-$lang['qb_italic']             = 'Italic Text';
-$lang['qb_underl']             = 'Underlined Text';
-$lang['qb_code']               = 'Monospaced Text';
-$lang['qb_strike']             = 'Strike-through Text';
 $lang['qb_h1']                 = 'Level 1 სათაური';
 $lang['qb_h2']                 = 'Level 2 სათაური';
 $lang['qb_h3']                 = 'Level 3 სათაური';
@@ -224,64 +200,28 @@ $lang['qb_hs']                 = 'სათაურის არჩევა';
 $lang['qb_hplus']              = 'Higher სათაური';
 $lang['qb_hminus']             = 'Lower სათაური';
 $lang['qb_hequal']             = 'Same Level სათაური';
-$lang['qb_link']               = 'Internal Link';
-$lang['qb_extlink']            = 'External Link';
-$lang['qb_hr']                 = 'Horizontal Rule';
 $lang['qb_ol']                 = 'შეკვეთილი ბოლო მასალა';
-$lang['qb_ul']                 = 'Unordered List Item';
 $lang['qb_media']              = 'ნახატების და სხვა ფაიელბის დამატება';
 $lang['qb_sig']                = 'ხელმოწერა';
 $lang['qb_smileys']            = 'სმაილები';
-$lang['qb_chars']              = 'Special Chars';
-$lang['upperns']               = 'jump to parent namespace';
-$lang['metaedit']              = 'Edit Metadata';
-$lang['metasaveerr']           = 'Writing metadata failed';
-$lang['metasaveok']            = 'Metadata saved';
 $lang['img_title']             = 'სათაური:';
-$lang['img_caption']           = 'Caption:';
 $lang['img_date']              = 'თარიღი:';
 $lang['img_fname']             = 'ფაილის სახელი:';
 $lang['img_fsize']             = 'ზომა:';
 $lang['img_artist']            = 'ფოტოგრაფი:';
-$lang['img_copyr']             = 'Copyright:';
 $lang['img_format']            = 'ფორმატი:';
 $lang['img_camera']            = 'კამერა:';
-$lang['img_keywords']          = 'Keywords:';
 $lang['img_width']             = 'სიგანე:';
 $lang['img_height']            = 'სიმაღლე:';
-$lang['subscr_subscribe_success'] = 'Added %s to subscription list for %s';
-$lang['subscr_subscribe_error'] = 'Error adding %s to subscription list for %s';
-$lang['subscr_subscribe_noaddress'] = 'There is no address associated with your login, you cannot be added to the subscription list';
-$lang['subscr_unsubscribe_success'] = 'Removed %s from subscription list for %s';
-$lang['subscr_unsubscribe_error'] = 'Error removing %s from subscription list for %s';
-$lang['subscr_already_subscribed'] = '%s is already subscribed to %s';
-$lang['subscr_not_subscribed'] = '%s is not subscribed to %s';
-$lang['subscr_m_not_subscribed'] = 'You are currently not subscribed to the current page or namespace.';
-$lang['subscr_m_new_header']   = 'Add subscription';
-$lang['subscr_m_current_header'] = 'Current subscriptions';
-$lang['subscr_m_unsubscribe']  = 'Unsubscribe';
-$lang['subscr_m_subscribe']    = 'Subscribe';
 $lang['subscr_m_receive']      = 'მიღება';
 $lang['subscr_style_every']    = 'ფოსტა ყოველ ცვლილებაზე';
 $lang['subscr_style_digest']   = 'ფოსტა ყოველი გვერდის შეცვლაზე ';
 $lang['subscr_style_list']     = 'ფოსტა ყოველი გვერდის შეცვლაზე ';
-$lang['authtempfail']          = 'User authentication is temporarily unavailable. If this situation persists, please inform your Wiki Admin.';
 $lang['i_chooselang']          = 'ენსი არჩევა';
 $lang['i_installer']           = 'DokuWiki დამყენებელი';
 $lang['i_wikiname']            = 'Wiki სახელი';
-$lang['i_enableacl']           = 'Enable ACL (recommended)';
 $lang['i_superuser']           = 'ადმინი';
 $lang['i_problems']            = 'შეასწორეთ შეცდომები';
-$lang['i_modified']            = 'For security reasons this script will only work with a new and unmodified Dokuwiki installation. You should either re-extract the files from the downloaded package or consult the complete <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
-$lang['i_funcna']              = 'PHP function <code>%s</code> is not available. Maybe your hosting provider disabled it for some reason?';
-$lang['i_phpver']              = 'Your PHP version <code>%s</code> is lower than the needed <code>%s</code>. You need to upgrade your PHP install.';
-$lang['i_permfail']            = '<code>%s</code> is not writable by DokuWiki. You need to fix the permission settings of this directory!';
-$lang['i_confexists']          = '<code>%s</code> already exists';
-$lang['i_writeerr']            = 'Unable to create <code>%s</code>. You will need to check directory/file permissions and create the file manually.';
-$lang['i_badhash']             = 'unrecognised or modified dokuwiki.php (hash=<code>%s</code>)';
-$lang['i_badval']              = '<code>%s</code> - illegal or empty value';
-$lang['i_failure']             = 'Some errors occurred while writing the configuration files. You may need to fix them manually before you can use <a href="doku.php?id=wiki:welcome">your new DokuWiki</a>.';
-$lang['i_policy']              = 'Initial ACL policy';
 $lang['i_pol0']                = 'ღია ვიკი (წაკითხვა, დაწერა და ატვირთვა შეუძლია ნებისმიერს)';
 $lang['i_pol1']                = 'თავისუფალი ვიკი (წაკითხვა შეუძლია ყველას, დაწერა და ატვირთვა - რეგისტრირებულს)';
 $lang['i_pol2']                = 'დახურული ვიკი (წაკითხვა, დაწერა და ატვირთვა შეუძლიათ მხოლოდ რეგისტრირებულებს)';
@@ -291,7 +231,6 @@ $lang['i_license']             = 'აირჩიეთ ლიცენზია
 $lang['i_license_none']        = 'არ აჩვენოთ ლიცენზიის ინფორმაცია';
 $lang['i_pop_field']           = 'დაგვეხმარეთ DokuWiki-ს აგუმჯობესებაში';
 $lang['i_pop_label']           = 'თვეში ერთელ ინფორმაციის DokuWiki-ის ადმინისტრაციისთვის გაგზავნა';
-$lang['recent_global']         = 'You\'re currently watching the changes inside the <b>%s</b> namespace. You can also <a href="%s">view the recent changes of the whole wiki</a>.';
 $lang['years']                 = '%d წლის უკან';
 $lang['months']                = '%d თვის უკან';
 $lang['weeks']                 = '%d კვირის უკან';
@@ -306,17 +245,12 @@ $lang['media_file']            = 'ფაილი';
 $lang['media_viewtab']         = 'ჩვენება';
 $lang['media_edittab']         = 'რედაქტირება';
 $lang['media_historytab']      = 'ისტორია';
-$lang['media_list_thumbs']     = 'Thumbnails';
-$lang['media_list_rows']       = 'Rows';
 $lang['media_sort_name']       = 'სახელი';
 $lang['media_sort_date']       = 'თარიღი';
-$lang['media_namespaces']      = 'Choose namespace';
 $lang['media_files']           = 'ფაილები %s';
 $lang['media_upload']          = 'ატვირთვა %s';
 $lang['media_search']          = 'ძებნა %s';
 $lang['media_view']            = '%s';
-$lang['media_viewold']         = '%s at %s';
 $lang['media_edit']            = 'რედაქტირება %s';
 $lang['media_history']         = 'ისტორია %s';
-$lang['media_meta_edited']     = 'metadata edited';
 $lang['media_perm_read']       = 'თვენ არ გაქვთ უფლება წაიკითხოთ ეს მასალა';
diff --git a/inc/lang/kk/lang.php b/inc/lang/kk/lang.php
index 5536d48d339f05c4fd873dcc1a2ffaecdaf75fec..cb224d9a0ee4ea4ddeb5b8b35592107540901295 100644
--- a/inc/lang/kk/lang.php
+++ b/inc/lang/kk/lang.php
@@ -6,8 +6,8 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
 $lang['singlequoteopening']    = '‘';
 $lang['singlequoteclosing']    = '’';
 $lang['apostrophe']            = '\'';
diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php
index 87ac30936f32a796e57dc61c6de3dcfdb0a54060..52e0e6a3d8db53bb0cd31fdf2dbfd0102013f831 100644
--- a/inc/lang/km/lang.php
+++ b/inc/lang/km/lang.php
@@ -61,7 +61,7 @@ $lang['reguexists'] = 'សុំអាទោស​ នាមប្រើនេ
 $lang['regsuccess'] = 'អ្នកប្រើបានបង្កើតហើយ និងពាក្សសម្ងាតក៏បានផ្ញើទៀត។';
 $lang['regsuccess2']= 'អ្នកប្រើបានបង្កើតហើយ។';
 $lang['regmailfail']= 'មើលទៅដុចជាមានកំហុសក្នុង....សុំទាកទងអ្នកក្របក្រង';
-$lang['regbadmail'] = 'អ៊ីមេលអ្នកសាសេមិនត្រូវបញ្ជរ&mdash;បើអ្នកកិតថានេះជាកំហុសបដិបត្តិ សុំទាកទងអ្នកក្របគ្រោង។';
+$lang['regbadmail'] = 'អ៊ីមេលអ្នកសាសេមិនត្រូវបញ្ជរ—បើអ្នកកិតថានេះជាកំហុសបដិបត្តិ សុំទាកទងអ្នកក្របគ្រោង។';
 $lang['regbadpass'] = 'គូពាក្សសម្ងាតមិនដូចគ្នាទេ សមសាកទៀត។';
 $lang['regpwmail']  = 'ពាក្សសម្ងាតអ្នក';
 $lang['reghere']    = 'អ្នកឥតមានបញ្ជីនាមបម្រើទេ?  សុំចល់ចុះឈ្មោះធ្វើគណនីសម្របប្រើប្រស';
@@ -99,8 +99,8 @@ $lang['uploadbadcontent'] = 'ធាតុចំរុញឡើងមិនត្
 $lang['uploadspam']  = 'ចំរុញឡើង បង្ខាំង ដៅយ  ';
 $lang['uploadxss']   = 'ចំរុញឡើង បង្ខាំង  ';
 $lang['deletesucc']  = 'ឯកសារ «%s» បានលុបហើយ។';
-$lang['deletefail']  = '«%s» មិនអាចលុបទេ&mdashមើល';
-$lang['mediainuse']  = 'ឯកសារ «%s» ឥតទានលុបទេ&mdashមានគេកំភងទេជាប់ប្រើ។';
+$lang['deletefail']  = '«%s» មិនអាចលុបទេ—មើល';
+$lang['mediainuse']  = 'ឯកសារ «%s» ឥតទានលុបទេ—មានគេកំភងទេជាប់ប្រើ។';
 $lang['namespaces']  = 'នាមដ្ឋាន';
 $lang['mediafiles']  = 'ឯកសារទំនេនៅក្នុង';
 
@@ -185,12 +185,9 @@ $lang['i_enableacl']  = 'បើកប្រើ (អនុសាស)';
 $lang['i_superuser']  = 'អ្នកកំពូល';
 $lang['i_problems']   = 'កម្មវិធី​ដំឡើងបានប៉ះឧបសគ្គ។ អ្នកមិនអាចបន្តទៅទៀត ដល់អ្នកជួសជុលវា។';
 $lang['i_modified']   = '';
-$lang['i_funcna']     = '<code>%s</code> ';
 $lang['i_permfail']   = '<code>%s</code> មិនអាចសាស';
 $lang['i_confexists'] = '<code>%s</code> មានហាយ';
 $lang['i_writeerr']   = 'មិនអាចបណ្កើ<code>%s</code>។ អ្នកត្រវការពិនិត្យអធិក្រឹតិរបស់ថតនឹងឯកសារ។';
-$lang['i_badhash']    = '(hash=<code>%s</code>)';
-$lang['i_badval']     = '<code>%s</code>&mdash;';
 $lang['i_success']    = '';
 $lang['i_failure']    = 'ពលសាសារ';
 $lang['i_policy']     = 'បញ្ជីអនុញ្ញតផ្ដើម';
diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt
index 8da90266ce1c649e9eedcc3f90b0555709d2be6e..70b24ac7b0e7c9c0ae2b13958e9132064f6bff1a 100644
--- a/inc/lang/ko/edit.txt
+++ b/inc/lang/ko/edit.txt
@@ -1 +1 @@
-문서를 편집하고 ''저장''을 누르세요. 위키 구문은 [[wiki:syntax]]를 참고하세요. 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요.
\ No newline at end of file
+문서를 편집하고 ''저장''을 누르세요. 위키 구문은 [[wiki:syntax]]를 참조하세요. 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요.
\ No newline at end of file
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index b46abf5d115223cbf59207be8f7f6685ac8bdcce..48ebfb1d613af14adc3a835512067f2d7c6c95f4 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -77,9 +77,9 @@ $lang['nosecedit']             = '한 동안 문서가 바뀌었으며, 문단 
 $lang['searchcreatepage']      = '만약 원하는 문서를 찾지 못했다면, \'\'문서 만들기\'\'나 \'\'문서 편집\'\'을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.';
 $lang['regmissing']            = '죄송하지만 모든 필드를 채워야 합니다.';
 $lang['reguexists']            = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
-$lang['regsuccess']            = '사용자를 만들었으며 비밀번호는 이메일로 보냈습니다.';
-$lang['regsuccess2']           = '사용자를 만들었습니다.';
-$lang['regfail']               = '사용자 계정이 만들어지지 않았습니다.';
+$lang['regsuccess']            = '사용자 계정을 만들었으며 비밀번호는 이메일로 보냈습니다.';
+$lang['regsuccess2']           = '사용자 계정을 만들었습니다.';
+$lang['regfail']               = '사용자 계정을 만들 수 없었습니다.';
 $lang['regmailfail']           = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의해주세요!';
 $lang['regbadmail']            = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의해주세요';
 $lang['regbadpass']            = '두 주어진 비밀번호가 같지 않습니다. 다시 입력하세요.';
@@ -89,12 +89,12 @@ $lang['profna']                = '이 위키는 프로필 수정을 할 수 없
 $lang['profnochange']          = '바뀐 내용이 없습니다.';
 $lang['profnoempty']           = '빈 이름이나 이메일 주소는 허용하지 않습니다.';
 $lang['profchanged']           = '프로필이 성공적으로 바뀌었습니다.';
-$lang['profnodelete']          = '이 위키는 사용자 삭제를 지원하지 않습니다';
+$lang['profnodelete']          = '이 위키는 사용자 계정 삭제를 지원하지 않습니다';
 $lang['profdeleteuser']        = '계정 삭제';
 $lang['profdeleted']           = '당신의 사용자 계정이 이 위키에서 삭제되었습니다';
 $lang['profconfdelete']        = '이 위키에서 내 계정을 제거하고 싶습니다. <br/> 이 행동은 되돌릴 수 없습니다.';
 $lang['profconfdeletemissing'] = '선택하지 않은 확인 상자를 확인';
-$lang['proffail']              = '사용자 설정이 업데이트되지 않았습니다.';
+$lang['proffail']              = '사용자 프로필이 업데이트되지 않았습니다.';
 $lang['pwdforget']             = '비밀번호를 잊으셨나요? 비밀번호를 재설정하세요';
 $lang['resendna']              = '이 위키는 비밀번호 재설정을 지원하지 않습니다.';
 $lang['resendpwd']             = '다음으로 새 비밀번호 보내기';
@@ -171,14 +171,14 @@ $lang['mediainuse']            = '"%s" 파일을 삭제할 수 없습니다 - 
 $lang['namespaces']            = '이름공간';
 $lang['mediafiles']            = '사용할 수 있는 파일 목록';
 $lang['accessdenied']          = '이 문서를 볼 권한이 없습니다.';
-$lang['mediausage']            = '이 파일을 참고하려면 다음 문법을 사용하세요:';
+$lang['mediausage']            = '이 파일을 참조하려면 다음 문법을 사용하세요:';
 $lang['mediaview']             = '원본 파일 보기';
 $lang['mediaroot']             = '루트';
 $lang['mediaupload']           = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 쌍점(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭해 선택할 수 있습니다.';
 $lang['mediaextchange']        = '파일 확장자가 .%s에서 .%s(으)로 바뀌었습니다!';
 $lang['reference']             = '다음을 참조';
 $lang['ref_inuse']             = '다음 문서에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:';
-$lang['ref_hidden']            = '문서의 일부 참고는 읽을 수 있는 권한이 없습니다';
+$lang['ref_hidden']            = '문서의 일부 참조는 읽을 수 있는 권한이 없습니다';
 $lang['hits']                  = '조회 수';
 $lang['quickhits']             = '일치하는 문서 이름';
 $lang['toc']                   = '목차';
@@ -286,7 +286,7 @@ $lang['i_enableacl']           = 'ACL 활성화 (권장)';
 $lang['i_superuser']           = '슈퍼 사용자';
 $lang['i_problems']            = '설치 관리자가 아래에 나와 있는 몇 가지 문제를 찾았습니다. 문제를 해결하지 전까지 설치를 계속할 수 없습니다.';
 $lang['i_modified']            = '보안 상의 이유로 이 스크립트는 수정되지 않은 새 도쿠위키 설치에서만 동작됩니다.
-다운로드한 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/ko:install">도쿠위키 설치 과정</a>을 참고해서 설치하세요.';
+다운로드한 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/ko:install">도쿠위키 설치 과정</a>을 참조해서 설치하세요.';
 $lang['i_funcna']              = '<code>%s</code> PHP 함수를 사용할 수 없습니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.';
 $lang['i_phpver']              = 'PHP <code>%s</code> 버전은 필요한 <code>%s</code> 버전보다 오래되었습니다. PHP를 업그레이드할 필요가 있습니다.';
 $lang['i_mbfuncoverload']      = '도쿠위키를 실행하려면 mbstring.func_overload를 php.ini에서 비활성화해야 합니다.';
@@ -341,6 +341,7 @@ $lang['media_perm_read']       = '죄송하지만 파일을 읽을 권한이 없
 $lang['media_perm_upload']     = '죄송하지만 파일을 올릴 권한이 없습니다.';
 $lang['media_update']          = '새 판 올리기';
 $lang['media_restore']         = '이 판으로 되돌리기';
+$lang['media_acl_warning']     = '이 목록은 ACL로 제한되어 있고 숨겨진 문서이기 때문에 완전하지 않을 수 있습니다.';
 $lang['currentns']             = '현재 이름공간';
 $lang['searchresult']          = '검색 결과';
 $lang['plainhtml']             = '일반 HTML';
diff --git a/inc/lang/ku/admin.txt b/inc/lang/ku/admin.txt
deleted file mode 100644
index cfd21b21790353b863bff2ce565f645347b5b051..0000000000000000000000000000000000000000
--- a/inc/lang/ku/admin.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Administration ======
-
-Below you can find a list of administrative tasks available in DokuWiki.
-
diff --git a/inc/lang/ku/denied.txt b/inc/lang/ku/denied.txt
deleted file mode 100644
index 34cb8456a6cc18ba211acd4e57de24539ad79b65..0000000000000000000000000000000000000000
--- a/inc/lang/ku/denied.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Permission Denied ======
-
-Sorry, you don't have enough rights to continue.
-
diff --git a/inc/lang/ku/editrev.txt b/inc/lang/ku/editrev.txt
deleted file mode 100644
index e6995713bd2d3d7e1960747bc671f1a3c06eb0e0..0000000000000000000000000000000000000000
--- a/inc/lang/ku/editrev.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-**You've loaded an old revision of the document!** If you save it, you will create a new version with this data.
-----
\ No newline at end of file
diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php
index 7e21b5ba77104465b52efe6b4930c48913914871..460b5e8a304b87102e70da37d22961dd4c002560 100644
--- a/inc/lang/ku/lang.php
+++ b/inc/lang/ku/lang.php
@@ -31,109 +31,16 @@ $lang['btn_update'] = 'Rojanekirin';
 $lang['btn_delete'] = 'Jê bibe';
 $lang['btn_back']   = 'PaÅŸ';
 $lang['btn_backlink']    = 'Girêdanên paş';
-$lang['btn_subscribe']   = 'Subscribe Changes';
-$lang['btn_register'] = 'Register';
 
-$lang['loggedinas'] = 'Logged in as:';
-$lang['user']       = 'Username';
-$lang['pass']       = 'Password';
-$lang['passchk']    = 'once again';
-$lang['remember']   = 'Remember me';
-$lang['fullname']   = 'Full name';
-$lang['email']      = 'E-Mail';
-$lang['badlogin']   = 'Sorry, username or password was wrong.';
-
-$lang['regmissing'] = 'Sorry, you must fill in all fields.';
-$lang['reguexists'] = 'Sorry, a user with this login already exists.';
-$lang['regsuccess'] = 'The user has been created and the password was sent by email.';
-$lang['regsuccess2']= 'The user has been created.';
-$lang['regmailfail']= 'Looks like there was an error on sending the password mail. Please contact the admin!';
-$lang['regbadmail'] = 'The given email address looks invalid - if you think this is an error, contact the admin';
-$lang['regbadpass'] = 'The two given passwords are not identically, please try again.';
-$lang['regpwmail']  = 'Your DokuWiki password';
-$lang['reghere']    = 'You don\'t have an account yet? Just get one';
-
-$lang['txt_upload']   = 'Select file to upload';
-$lang['txt_filename'] = 'Enter wikiname (optional)';
-$lang['txt_overwrt']  = 'Overwrite existing file';
-$lang['lockedby']     = 'Currently locked by';
-$lang['lockexpire']   = 'Lock expires at';
-$lang['js']['willexpire']   = 'Your lock for editing this page is about to expire in a minute.\nTo avoid conflicts use the preview button to reset the locktimer.';
-
-$lang['js']['notsavedyet'] = 'Unsaved changes will be lost.\nReally continue?';
-
-$lang['rssfailed']   = 'An error occured while fetching this feed: ';
 $lang['nothingfound']= 'Tiştek nehat dîtin.';
-
-$lang['mediaselect'] = 'Mediafile Selection';
-$lang['uploadsucc']  = 'Upload successful';
-$lang['uploadfail']  = 'Upload failed. Maybe wrong permissions?';
-$lang['uploadwrong'] = 'Upload denied. This file extension is forbidden!';
-$lang['uploadexist'] = 'File already exists. Nothing done.';
-$lang['deletesucc']  = 'The file "%s" has been deleted.';
-$lang['deletefail']  = '"%s" couldn\'t be deleted - check permissions.';
-$lang['mediainuse']  = 'The file "%s" hasn\'t been deleted - it is still in use.';
-$lang['namespaces']  = 'Namespace';
-$lang['mediafiles']  = 'Available files in';
-
 $lang['reference']   = 'Referansa';
-$lang['ref_inuse']   = 'The file can\'t be deleted, because it\'s still used by the following pages:';
-$lang['ref_hidden']  = 'Some references  are on pages you don\'t have permission to read';
-
-$lang['hits']       = 'Hits';
-$lang['quickhits']  = 'Matching pagenames';
 $lang['toc']        = 'Tabloya Navêrokê';
-$lang['current']    = 'current';
-$lang['yours']      = 'Your Version';
-$lang['diff']       = 'show differences to current version';
 $lang['line']       = 'Rêz';
 $lang['breadcrumb'] = 'Åžop:';
 $lang['lastmod']    = 'Guherandina dawî:';
-$lang['by']         = 'by';
 $lang['deleted']    = 'hat jê birin';
 $lang['created']    = 'hat afirandin';
-$lang['restored']   = 'old revision restored (%s)';
 $lang['summary']    = 'Kurteya guhartinê';
-
-$lang['mail_newpage'] = 'page added:';
-$lang['mail_changed'] = 'page changed:';
-
-$lang['js']['nosmblinks'] = 'Linking to Windows shares only works in Microsoft Internet Explorer.\nYou still can copy and paste the link.';
-
-$lang['qb_bold']    = 'Bold Text';
-$lang['qb_italic']  = 'Italic Text';
-$lang['qb_underl']  = 'Underlined Text';
-$lang['qb_code']    = 'Code Text';
-$lang['qb_strike']  = 'Strike-through Text';
-$lang['qb_h1']      = 'Level 1 Headline';
-$lang['qb_h2']      = 'Level 2 Headline';
-$lang['qb_h3']      = 'Level 3 Headline';
-$lang['qb_h4']      = 'Level 4 Headline';
-$lang['qb_h5']      = 'Level 5 Headline';
-$lang['qb_link']    = 'Internal Link';
-$lang['qb_extlink'] = 'External Link';
-$lang['qb_hr']      = 'Horizontal Rule';
-$lang['qb_ol']      = 'Ordered List Item';
-$lang['qb_ul']      = 'Unordered List Item';
-$lang['qb_media']   = 'Add Images and other files';
-$lang['qb_sig']     = 'Insert Signature';
-
-$lang['js']['del_confirm']= 'Delete this entry?';
-
-$lang['metaedit']    = 'Edit Metadata';
-$lang['metasaveerr'] = 'Writing metadata failed';
-$lang['metasaveok']  = 'Metadata saved';
-$lang['btn_img_backto']  = 'Back to %s';
-$lang['img_title']   = 'Title:';
-$lang['img_caption'] = 'Caption:';
-$lang['img_date']    = 'Date:';
-$lang['img_fname']   = 'Filename:';
-$lang['img_fsize']   = 'Size:';
-$lang['img_artist']  = 'Photographer:';
-$lang['img_copyr']   = 'Copyright:';
-$lang['img_format']  = 'Format:';
-$lang['img_camera']  = 'Camera:';
-$lang['img_keywords']= 'Keywords:';
 $lang['searchcreatepage']      = "Heke tiştek nehatibe dîtin, tu dikarî dest bi nivîsandina rûpelekê nû bikî. Ji bo vê, ''Vê rûpelê biguherîne'' bitikîne.";
 
 //Setup VIM: ex: et ts=2 :
diff --git a/inc/lang/ku/locked.txt b/inc/lang/ku/locked.txt
deleted file mode 100644
index af6347a962a7364c9aad79dd28f88a003de326bd..0000000000000000000000000000000000000000
--- a/inc/lang/ku/locked.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== Page locked ======
-
-This page is currently locked for editing by another user. You have to wait until this user finishes editing or the lock expires.
diff --git a/inc/lang/ku/login.txt b/inc/lang/ku/login.txt
deleted file mode 100644
index 2004ea1985fd289991cc44ae7aa4eb81ea8d23bb..0000000000000000000000000000000000000000
--- a/inc/lang/ku/login.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Login ======
-
-You are currently not logged in! Enter your authentication credentials below to log in. You need to have cookies enabled to log in.
-
diff --git a/inc/lang/ku/mailtext.txt b/inc/lang/ku/mailtext.txt
deleted file mode 100644
index 44a3f6553604d5de12b30ad006b272e87bd29c76..0000000000000000000000000000000000000000
--- a/inc/lang/ku/mailtext.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-A page in your DokuWiki was added or changed. Here are the details:
-
-Date        : @DATE@
-Browser     : @BROWSER@
-IP-Address  : @IPADDRESS@
-Hostname    : @HOSTNAME@
-Old Revision: @OLDPAGE@
-New Revision: @NEWPAGE@
-Edit Summary: @SUMMARY@
-User        : @USER@
-
-@DIFF@
-
-
--- 
-This mail was generated by DokuWiki at
-@DOKUWIKIURL@
diff --git a/inc/lang/ku/norev.txt b/inc/lang/ku/norev.txt
deleted file mode 100644
index 0b21bf3f06bacd312b1ca92e09470453b876aaa7..0000000000000000000000000000000000000000
--- a/inc/lang/ku/norev.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== No such revision ======
-
-The specified revision doesn't exist. Use the ''Old revisions'' button for a list of old revisions of this document.
-
diff --git a/inc/lang/ku/password.txt b/inc/lang/ku/password.txt
deleted file mode 100644
index 6d5cbe678cd813a4e5652cd2fa044b0feaa90728..0000000000000000000000000000000000000000
--- a/inc/lang/ku/password.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Hi @FULLNAME@!
-
-Here is your userdata for @TITLE@ at @DOKUWIKIURL@
-
-Login    : @LOGIN@
-Password : @PASSWORD@
-
--- 
-This mail was generated by DokuWiki at
-@DOKUWIKIURL@
diff --git a/inc/lang/ku/read.txt b/inc/lang/ku/read.txt
deleted file mode 100644
index 9f56d81ad8b36dd3467fe8a43297209f53f93d67..0000000000000000000000000000000000000000
--- a/inc/lang/ku/read.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong.
-
diff --git a/inc/lang/ku/register.txt b/inc/lang/ku/register.txt
deleted file mode 100644
index b65683bc2b4ac25c594a5186223530612162b69e..0000000000000000000000000000000000000000
--- a/inc/lang/ku/register.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Register as new user ======
-
-Fill in all the information below to create a new account in this wiki. Make sure you supply a **valid e-mail address** - your new password will be sent to it. The login name should be a valid [[doku>pagename|pagename]].
-
diff --git a/inc/lang/ku/revisions.txt b/inc/lang/ku/revisions.txt
deleted file mode 100644
index dd5f35b8e7e3b17d8eaddffd705f868b1e69f2da..0000000000000000000000000000000000000000
--- a/inc/lang/ku/revisions.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Old Revisions ======
-
-These are the older revisons of the current document. To revert to an old revision, select it from below, click ''Edit this page'' and save it.
-
diff --git a/inc/lang/ku/showrev.txt b/inc/lang/ku/showrev.txt
deleted file mode 100644
index 3608de36b84af7d8fc918b1fa0d439bf04b0bb27..0000000000000000000000000000000000000000
--- a/inc/lang/ku/showrev.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-**This is an old revision of the document!**
-----
diff --git a/inc/lang/ku/stopwords.txt b/inc/lang/ku/stopwords.txt
deleted file mode 100644
index bc6eb48aea08f241e220bc59d6d6851acfb8e381..0000000000000000000000000000000000000000
--- a/inc/lang/ku/stopwords.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-# This is a list of words the indexer ignores, one word per line
-# When you edit this file be sure to use UNIX line endings (single newline)
-# No need to include words shorter than 3 chars - these are ignored anyway
-# This list is based upon the ones found at http://www.ranks.nl/stopwords/
-about
-are
-and
-you
-your
-them
-their
-com
-for
-from
-into
-how
-that
-the
-this
-was
-what
-when
-where
-who
-will
-with
-und
-the
-www
diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php
index 35f8308d0a4faa4b916bdadf8299e76cbc214089..d6b8285257ee42f1102df02d39b948515e6ee919 100644
--- a/inc/lang/la/lang.php
+++ b/inc/lang/la/lang.php
@@ -12,11 +12,11 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
 $lang['singlequoteopening']    = '`';
-$lang['singlequoteclosing']    = '\'';
-$lang['apostrophe']            = '´';
+$lang['singlequoteclosing']    = '´';
+$lang['apostrophe']            = '\'';
 $lang['btn_edit']              = 'Recensere hanc paginam';
 $lang['btn_source']            = 'Fontem uidere';
 $lang['btn_show']              = 'Ostendere paginam';
diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php
index 5621fe9c0a4e092856acf9d8feb4e47f14d2c84a..034d98b38f91145f7c61a26cea9f0ed6b871100a 100644
--- a/inc/lang/mk/lang.php
+++ b/inc/lang/mk/lang.php
@@ -14,7 +14,9 @@ $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
 $lang['doublequoteopening']    = '„';
 $lang['doublequoteclosing']    = '“';
-$lang['apostrophe']            = '\'';
+$lang['singlequoteopening']    = '’';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Уреди ја страницата';
 $lang['btn_source']            = 'Прикажи ја изворната страница';
 $lang['btn_show']              = 'Прикажи страница';
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index e7d82af19ce5e064d09e6ccdfcab7c76cbfe7458..496144a271a01d7ce5cddccea4cd1ee6a09dd99c 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author François Kooman <fkooman.tuxed.net>
  * @author Jack van Klaren <dokuwiki@afentoe.xs4all.nl>
  * @author Riny Heijdendael <riny@heijdendael.nl>
@@ -355,4 +355,4 @@ $lang['searchresult']          = 'Zoekresultaat';
 $lang['plainhtml']             = 'Alleen HTML';
 $lang['wikimarkup']            = 'Wiki Opmaak';
 $lang['page_nonexist_rev']     = 'Pagina bestaat niet bij %s. Het is vervolgens aangemaakt bij <a href="%s">%s</a>.';
-$lang['unable_to_parse_date']  = 'Begrijp het niet bij parameter "% s".';
+$lang['unable_to_parse_date']  = 'Begrijp het niet bij parameter "%s".';
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index fddbf1419f6e6812bfc38e7513bc3972019568cf..9388a0a70e48dfee48cf2c52ee0c5cdf7f8dae0e 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Reidar Mosvold <Reidar.Mosvold@hit.no>
  * @author Jorge Barrera Grandon <jorge@digitalwolves.org>
  * @author Rune Rasmussen [http://www.syntaxerror.no/]
@@ -30,7 +30,7 @@ $lang['doublequoteopening']    = '«';
 $lang['doublequoteclosing']    = '»';
 $lang['singlequoteopening']    = '‘';
 $lang['singlequoteclosing']    = '’';
-$lang['apostrophe']            = '\'';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Rediger denne siden';
 $lang['btn_source']            = 'Vis kildekode';
 $lang['btn_show']              = 'Vis siden';
@@ -347,7 +347,7 @@ $lang['media_search']          = 'Søk i navnerommet <strong>%s</strong>.';
 $lang['media_view']            = '%s';
 $lang['media_viewold']         = '%s på %s';
 $lang['media_edit']            = 'Rediger %s';
-$lang['media_history']         = '%vis historikk';
+$lang['media_history']         = '%s vis historikk';
 $lang['media_meta_edited']     = 'metadata er endra';
 $lang['media_perm_read']       = 'Beklager, du har ikke tilgang til å lese filer.';
 $lang['media_perm_upload']     = 'Beklager, du har ikke tilgang til å laste opp filer.';
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index 5c9acfa17bd225a3d88f61eb13212db03ba3e4fc..ae307b4fd707db2fe1d2909fc39f6e38f80d9bd1 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Grzegorz Żur <grzegorz.zur@gmail.com>
  * @author Mariusz Kujawski <marinespl@gmail.com>
  * @author Maciej Kurczewski <pipijajko@gmail.com>
@@ -25,7 +25,7 @@ $lang['doublequoteopening']    = '„';
 $lang['doublequoteclosing']    = '”';
 $lang['singlequoteopening']    = '‚';
 $lang['singlequoteclosing']    = '’';
-$lang['apostrophe']            = '\'';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Edytuj stronÄ™';
 $lang['btn_source']            = 'Pokaż źródło strony';
 $lang['btn_show']              = 'Pokaż stronę';
diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php
index 7c6395b4be5db9a209d27d628acc0b0ddf32d124..1603e7cecab201f43844d77ca1ace9b0fefa2898 100644
--- a/inc/lang/pt/lang.php
+++ b/inc/lang/pt/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author José Carlos Monteiro <jose.c.monteiro@netcabo.pt>
  * @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
  * @author Enrico Nicoletto <liverig@gmail.com>
@@ -340,5 +340,5 @@ $lang['currentns']             = 'Namespace actual';
 $lang['searchresult']          = 'Resultado da pesquisa';
 $lang['plainhtml']             = 'HTML simples';
 $lang['wikimarkup']            = 'Markup de Wiki';
-$lang['page_nonexist_rev']     = 'Página não existia no %s. Posteriormente, foi criado em <a href="%s">% s </a>.';
+$lang['page_nonexist_rev']     = 'Página não existia no %s. Posteriormente, foi criado em <a href="%s">%s</a>.';
 $lang['unable_to_parse_date']  = 'Não é possível analisar o parâmetro "%s".';
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index 5953fccda401eda825ea2560ceddf43b9714c6af..5dab68c69d7906eb6016cbffaeae7c8b5f6b5ed5 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Tiberiu Micu <tibimicu@gmx.net>
  * @author Sergiu Baltariu <s_baltariu@yahoo.com>
  * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
@@ -17,7 +17,7 @@ $lang['doublequoteopening']    = '„';
 $lang['doublequoteclosing']    = '“';
 $lang['singlequoteopening']    = '‚';
 $lang['singlequoteclosing']    = '‘';
-$lang['apostrophe']            = '\'';
+$lang['apostrophe']            = '’';
 $lang['btn_edit']              = 'Editează această pagină';
 $lang['btn_source']            = 'Arată sursa paginii';
 $lang['btn_show']              = 'Arată pagina';
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index 3a1fb2c561f2185085b86eb182f4e0c8a54e7b4f..40d3ffefeac331c30cc630655cc7d287f45c1237 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Yuri Pimenov <up@ftpsearch.lv>
  * @author Igor Tarasov <tigr@mail15.com>
  * @author Denis Simakov <akinoame1@gmail.com>
@@ -31,8 +31,9 @@
  * @author Vitaly Filatenko <kot@hacktest.net>
  * @author Alex P <alexander@lanos.co.uk>
  * @author Nolf <m.kopachovets@gmail.com>
+ * @author Takumo <9206984@mail.ru>
  */
-$lang['encoding']              = ' utf-8';
+$lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
 $lang['doublequoteopening']    = '«';
 $lang['doublequoteclosing']    = '»';
diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php
index 3d21463941f24baff859ee20211862045a6a7e19..331819a667c42232c9a65035fc791eec89d9b326 100644
--- a/inc/lang/sq/lang.php
+++ b/inc/lang/sq/lang.php
@@ -12,10 +12,10 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
-$lang['singlequoteopening']    = '\'';
-$lang['singlequoteclosing']    = '\'';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
 $lang['apostrophe']            = '\'';
 $lang['btn_edit']              = 'Redaktoni këtë faqe';
 $lang['btn_source']            = 'Trego kodin burim të faqes';
diff --git a/inc/lang/ta/lang.php b/inc/lang/ta/lang.php
index 41c4a94c3b01ab5294abf9968df865fa050640b4..422613ec7bcedd8914e42641b569fe2097677b67 100644
--- a/inc/lang/ta/lang.php
+++ b/inc/lang/ta/lang.php
@@ -2,12 +2,12 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Naveen Venugopal <naveen.venugopal.anu@gmail.com>
  * @author Sri Saravana <saravanamuthaly@gmail.com>
  */
-$lang['doublequoteopening']    = '"';
-$lang['doublequoteclosing']    = '"';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
 $lang['singlequoteopening']    = '\'';
 $lang['singlequoteclosing']    = '\'';
 $lang['apostrophe']            = '\'';
diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php
index e40b6945404411091b8d92c9f7f1a73ef6c713cf..59332f70b23cd3c388e80a42fe381665a61c97fd 100644
--- a/inc/lang/th/lang.php
+++ b/inc/lang/th/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Komgrit Niyomrath <n.komgrit@gmail.com>
  * @author Arthit Suriyawongkul <arthit@gmail.com>
  * @author Kittithat Arnontavilas <mrtomyum@gmail.com>
@@ -11,7 +11,7 @@
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
-$lang['doublequoteopening']    = '“	';
+$lang['doublequoteopening']    = '“';
 $lang['doublequoteclosing']    = '”';
 $lang['singlequoteopening']    = '‘';
 $lang['singlequoteclosing']    = '’';
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 6b4315c7cd7b51e7a290ef8d9fa4a5a4b832793d..2242b1792fcb0e51c961bd6ceffe8d16351957d0 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Selim FarsakoÄŸlu <farsakogluselim@yahoo.de>
  * @author Aydın Coşkuner <aydinweb@gmail.com>
  * @author Cihan Kahveci <kahvecicihan@gmail.com>
@@ -290,8 +290,8 @@ $lang['i_confexists']          = '<code>%s</code> zaten var';
 $lang['i_writeerr']            = '<code>%s</code> oluşturulamadı. Dosya/Klasör izin ayarlarını gözden geçirip dosyayı elle oluşturmalısınız.';
 $lang['i_badhash']             = 'dokuwiki.php tanınamadı ya da değiştirilmiş (hash=<code>%s</code>)';
 $lang['i_badval']              = '<code>%s</code> - Yanlış veya boş değer';
-$lang['i_success']             = 'Kurulum başarıyla tamamlandı. Şimdi install.php dosyasını silebilirsiniz. <a href="doku.php">Yeni DokuWikiniz</a>i kullanabilirsiniz.';
-$lang['i_failure']             = 'Ayar dosyalarını yazarken bazı hatalar oluştu. <a href="doku.php">Yeni DokuWikiniz</a>i kullanmadan önce bu hatalarınızı elle düzeltmeniz gerekebilir.';
+$lang['i_success']             = 'Kurulum başarıyla tamamlandı. Şimdi install.php dosyasını silebilirsiniz. <a href="doku.php?id=wiki:welcome">Yeni DokuWikiniz</a>i kullanabilirsiniz.';
+$lang['i_failure']             = 'Ayar dosyalarını yazarken bazı hatalar oluştu. <a href="doku.php?id=wiki:welcome">Yeni DokuWikiniz</a>i kullanmadan önce bu hatalarınızı elle düzeltmeniz gerekebilir.';
 $lang['i_policy']              = 'İlk ACL ayarı';
 $lang['i_pol0']                = 'Tamamen Açık Wiki (herkes okuyabilir, yazabilir ve dosya yükleyebilir)';
 $lang['i_pol1']                = 'Açık Wiki (herkes okuyabilir, ancak  sadece üye olanlar yazabilir ve dosya yükleyebilir)';
diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php
index 52edaafda3a8a37728750aa32bb5ef8d386c1d8e..74a717bfe682108c73d453d83d220a192f93622f 100644
--- a/inc/lang/uk/lang.php
+++ b/inc/lang/uk/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Oleksiy Voronin <ovoronin@gmail.com>
  * @author serg_stetsuk@ukr.net
  * @author Oleksandr Kunytsia <okunia@gmail.com>
@@ -189,7 +189,6 @@ $lang['line']                  = 'Рядок';
 $lang['breadcrumb']            = 'Відвідано:';
 $lang['youarehere']            = 'Ви тут:';
 $lang['lastmod']               = 'В останнє змінено:';
-$lang['by']                    = ' ';
 $lang['deleted']               = 'знищено';
 $lang['created']               = 'створено';
 $lang['restored']              = 'відновлено стару ревізію (%s)';
diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php
index bfe38b9207998c0f89ceb626323d90ba04a367dc..b69456ee7ee4d46a5db372b8909905363a318115 100644
--- a/inc/lang/zh-tw/lang.php
+++ b/inc/lang/zh-tw/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author chinsan <chinsan@mail2000.com.tw>
  * @author Li-Jiun Huang <ljhuang.tw@gmail.com>
  * @author http://www.chinese-tools.com/tools/converter-simptrad.html
@@ -296,8 +296,8 @@ $lang['i_writeerr']            = '無法建立 <code>%s</code>。您必須檢查
 $lang['i_badhash']             = '無法辨識或已遭修改的 dokuwiki.php (hash=<code>%s</code>)';
 $lang['i_badval']              = '<code>%s</code> —— 非法或空白的值';
 $lang['i_success']             = '設定已完成。您現在可以刪除 install.php 檔案。繼續到
-<a href="doku.php">您的新 DokuWiki</a>.';
-$lang['i_failure']             = '寫入設定檔時發生了一些錯誤。您必須在使用<a href="doku.php">您的新 Dokuwiki</a> 之前手動修正它們。';
+<a href="doku.php?id=wiki:welcome">您的新 DokuWiki</a>.';
+$lang['i_failure']             = '寫入設定檔時發生了一些錯誤。您必須在使用<a href="doku.php?id=wiki:welcome">您的新 Dokuwiki</a> 之前手動修正它們。';
 $lang['i_policy']              = '初步的 ACL 政策';
 $lang['i_pol0']                = '開放的 wiki (任何人可讀取、寫入、上傳)';
 $lang['i_pol1']                = '公開的 wiki (任何人可讀取,註冊使用者可寫入與上傳)';
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index 8f3a7bbf4939315d75a0d1a657c307dc7f05e70d..d179ad634c127fd170717d1c6275b5d305be70bd 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -24,6 +24,7 @@
  * @author xiqingongzi <Xiqingongzi@Gmail.com>
  * @author qinghao <qingxianhao@gmail.com>
  * @author Yuwei Sun <yuwei@hrz.tu-chemnitz.de>
+ * @author Errol <errol@hotmail.com>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
@@ -89,6 +90,7 @@ $lang['regmissing']            = '对不起,您必须填写所有的字段。'
 $lang['reguexists']            = '对不起,该用户名已经存在。';
 $lang['regsuccess']            = '新用户已建立,密码将通过电子邮件发送给您。';
 $lang['regsuccess2']           = '新用户已建立';
+$lang['regfail']               = '用户不能被创建。';
 $lang['regmailfail']           = '发送密码邮件时产生错误。请联系管理员!';
 $lang['regbadmail']            = '您输入的邮件地址有问题——如果您认为这是系统错误,请联系管理员。';
 $lang['regbadpass']            = '您输入的密码与系统产生的不符,请重试。';
@@ -103,6 +105,7 @@ $lang['profdeleteuser']        = '删除账号';
 $lang['profdeleted']           = '你的用户已经从这个 wiki 中删除';
 $lang['profconfdelete']        = '我希望删除我的账户。<br/>这项操作无法撤销。';
 $lang['profconfdeletemissing'] = '确认框未勾选';
+$lang['proffail']              = '用户设置没有更新。';
 $lang['pwdforget']             = '忘记密码?立即获取新密码';
 $lang['resendna']              = '本维基不支持二次发送密码。';
 $lang['resendpwd']             = '设置新密码用于';
@@ -352,6 +355,7 @@ $lang['media_perm_read']       = '抱歉,您没有足够权限读取这些文
 $lang['media_perm_upload']     = '抱歉,您没有足够权限来上传文件。';
 $lang['media_update']          = '上传新版本';
 $lang['media_restore']         = '恢复这个版本';
+$lang['media_acl_warning']     = '此列表可能不完全是由ACL限制和隐藏的页面。';
 $lang['currentns']             = '当前命名空间';
 $lang['searchresult']          = '搜索结果';
 $lang['plainhtml']             = '纯HTML';
diff --git a/inc/pageutils.php b/inc/pageutils.php
index 3757126610c259f8b26de4e867b60a120d2fe1bd..a5bf039d50215548416701516afb25906a3f6006 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -243,7 +243,6 @@ function sectionID($title,&$check) {
     return $title;
 }
 
-
 /**
  * Wiki page existence check
  *
@@ -251,9 +250,10 @@ function sectionID($title,&$check) {
  *
  * @author Chris Smith <chris@jalakai.co.uk>
  *
- * @param string     $id     page id
- * @param string|int $rev    empty or revision timestamp
- * @param bool       $clean  flag indicating that $id should be cleaned (see wikiFN as well)
+ * @param string $id page id
+ * @param string|int $rev empty or revision timestamp
+ * @param bool $clean flag indicating that $id should be cleaned (see wikiFN as well)
+ * @param bool $date_at
  * @return bool exists?
  */
 function page_exists($id,$rev='',$clean=true, $date_at=false) {
@@ -489,9 +489,11 @@ function resolve_id($ns,$id,$clean=true){
  *
  * @author Andreas Gohr <andi@splitbrain.org>
  *
- * @param string  $ns     namespace which is context of id
- * @param string &$page   (reference) relative media id, updated to resolved id
- * @param bool   &$exists (reference) updated with existance of media
+ * @param string $ns namespace which is context of id
+ * @param string &$page (reference) relative media id, updated to resolved id
+ * @param bool &$exists (reference) updated with existance of media
+ * @param int|string $rev
+ * @param bool $date_at
  */
 function resolve_mediaid($ns,&$page,&$exists,$rev='',$date_at=false){
     $page   = resolve_id($ns,$page);
@@ -502,7 +504,7 @@ function resolve_mediaid($ns,&$page,&$exists,$rev='',$date_at=false){
             $rev = $medialog_rev;
         }
     }
-    
+
     $file   = mediaFN($page,$rev);
     $exists = file_exists($file);
 }
@@ -512,9 +514,11 @@ function resolve_mediaid($ns,&$page,&$exists,$rev='',$date_at=false){
  *
  * @author Andreas Gohr <andi@splitbrain.org>
  *
- * @param string  $ns     namespace which is context of id
- * @param string &$page   (reference) relative page id, updated to resolved id
- * @param bool   &$exists (reference) updated with existance of media
+ * @param string $ns namespace which is context of id
+ * @param string &$page (reference) relative page id, updated to resolved id
+ * @param bool &$exists (reference) updated with existance of media
+ * @param string $rev
+ * @param bool $date_at
  */
 function resolve_pageid($ns,&$page,&$exists,$rev='',$date_at=false ){
     global $conf;
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index 35bdd0e3f5a4a748396ba1dec8fec07b5555d4d3..d7a3faef88fde27ff39ad214eba717f8ce9aee23 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -806,18 +806,26 @@ class Doku_Renderer extends DokuWiki_Plugin {
             $url = $this->interwiki[$shortcut];
         } else {
             // Default to Google I'm feeling lucky
-            $url      = 'http://www.google.com/search?q={URL}&amp;btnI=lucky';
+            $url      = 'https://www.google.com/search?q={URL}&amp;btnI=lucky';
             $shortcut = 'go';
         }
 
         //split into hash and url part
-        @list($reference, $hash) = explode('#', $reference, 2);
+        $hash = strrchr($reference, '#');
+        if($hash) {
+            $reference = substr($reference, 0, -strlen($hash));
+            $hash = substr($hash, 1);
+        }
 
         //replace placeholder
         if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#', $url)) {
             //use placeholders
             $url    = str_replace('{URL}', rawurlencode($reference), $url);
-            $url    = str_replace('{NAME}', $reference, $url);
+            //wiki names will be cleaned next, otherwise urlencode unsafe chars
+            $url    = str_replace('{NAME}', ($url{0} === ':') ? $reference :
+                                  preg_replace_callback('/[[\\\\\]^`{|}#%]/', function($match) {
+                                    return rawurlencode($match[0]);
+                                  }, $reference), $url);
             $parsed = parse_url($reference);
             if(!$parsed['port']) $parsed['port'] = 80;
             $url = str_replace('{SCHEME}', $parsed['scheme'], $url);
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index d1bf91a02fc5a0791d025ceda689ccdee4226ffb..c544d9e32904fb81b4231da8e58b26f4d6ee5e4b 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -761,27 +761,40 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
     /**
      * Render a CamelCase link
      *
-     * @param string $link The link name
+     * @param string $link       The link name
+     * @param bool   $returnonly whether to return html or write to doc attribute
      * @see http://en.wikipedia.org/wiki/CamelCase
      */
-    function camelcaselink($link) {
-        $this->internallink($link, $link);
+    function camelcaselink($link, $returnonly = false) {
+        if($returnonly) {
+          return $this->internallink($link, $link, null, true);
+        } else {
+          $this->internallink($link, $link);
+        }
     }
 
     /**
      * Render a page local link
      *
-     * @param string $hash hash link identifier
-     * @param string $name name for the link
+     * @param string $hash       hash link identifier
+     * @param string $name       name for the link
+     * @param bool   $returnonly whether to return html or write to doc attribute
      */
-    function locallink($hash, $name = null) {
+    function locallink($hash, $name = null, $returnonly = false) {
         global $ID;
         $name  = $this->_getLinkTitle($name, $hash, $isImage);
         $hash  = $this->_headerToLink($hash);
         $title = $ID.' ↵';
-        $this->doc .= '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">';
-        $this->doc .= $name;
-        $this->doc .= '</a>';
+
+        $doc = '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">';
+        $doc .= $name;
+        $doc .= '</a>';
+
+        if($returnonly) {
+          return $doc;
+        } else {
+          $this->doc .= $doc;
+        }
     }
 
     /**
@@ -884,10 +897,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
     /**
      * Render an external link
      *
-     * @param string       $url  full URL with scheme
-     * @param string|array $name name for the link, array for media file
+     * @param string       $url        full URL with scheme
+     * @param string|array $name       name for the link, array for media file
+     * @param bool         $returnonly whether to return html or write to doc attribute
      */
-    function externallink($url, $name = null) {
+    function externallink($url, $name = null, $returnonly = false) {
         global $conf;
 
         $name = $this->_getLinkTitle($name, $url, $isImage);
@@ -926,7 +940,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
         if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"';
 
         //output formatted
-        $this->doc .= $this->_formatLink($link);
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
     }
 
     /**
@@ -934,12 +952,13 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      *
      * You may want to use $this->_resolveInterWiki() here
      *
-     * @param string       $match     original link - probably not much use
-     * @param string|array $name      name for the link, array for media file
-     * @param string       $wikiName  indentifier (shortcut) for the remote wiki
-     * @param string       $wikiUri   the fragment parsed from the original link
+     * @param string       $match      original link - probably not much use
+     * @param string|array $name       name for the link, array for media file
+     * @param string       $wikiName   indentifier (shortcut) for the remote wiki
+     * @param string       $wikiUri    the fragment parsed from the original link
+     * @param bool         $returnonly whether to return html or write to doc attribute
      */
-    function interwikilink($match, $name = null, $wikiName, $wikiUri) {
+    function interwikilink($match, $name = null, $wikiName, $wikiUri, $returnonly = false) {
         global $conf;
 
         $link           = array();
@@ -977,16 +996,21 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
         $link['title'] = htmlspecialchars($link['url']);
 
         //output formatted
-        $this->doc .= $this->_formatLink($link);
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
     }
 
     /**
      * Link to windows share
      *
-     * @param string       $url  the link
-     * @param string|array $name name for the link, array for media file
+     * @param string       $url        the link
+     * @param string|array $name       name for the link, array for media file
+     * @param bool         $returnonly whether to return html or write to doc attribute
      */
-    function windowssharelink($url, $name = null) {
+    function windowssharelink($url, $name = null, $returnonly = false) {
         global $conf;
 
         //simple setup
@@ -1010,7 +1034,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
         $link['url']   = $url;
 
         //output formatted
-        $this->doc .= $this->_formatLink($link);
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
     }
 
     /**
@@ -1018,10 +1046,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      *
      * Honors $conf['mailguard'] setting
      *
-     * @param string       $address Email-Address
-     * @param string|array $name    name for the link, array for media file
+     * @param string       $address    Email-Address
+     * @param string|array $name       name for the link, array for media file
+     * @param bool         $returnonly whether to return html or write to doc attribute
      */
-    function emaillink($address, $name = null) {
+    function emaillink($address, $name = null, $returnonly = false) {
         global $conf;
         //simple setup
         $link           = array();
@@ -1053,7 +1082,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
         $link['title'] = $title;
 
         //output formatted
-        $this->doc .= $this->_formatLink($link);
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
     }
 
     /**
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 8650f974f80a1442d914a4ee8b9422a77acf5519..5b96d39feba76a558d2189d6323319516aa4d92a 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -121,15 +121,21 @@ function p_cached_output($file, $format='xhtml', $id='') {
     $cache = new cache_renderer($id, $file, $format);
     if ($cache->useCache()) {
         $parsed = $cache->retrieveCache(false);
-        if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- cachefile {$cache->cache} used -->\n";
+        if($conf['allowdebug'] && $format=='xhtml') {
+            $parsed .= "\n<!-- cachefile {$cache->cache} used -->\n";
+        }
     } else {
         $parsed = p_render($format, p_cached_instructions($file,false,$id), $info);
 
         if ($info['cache'] && $cache->storeCache($parsed)) {              // storeCache() attempts to save cachefile
-            if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n";
+            if($conf['allowdebug'] && $format=='xhtml') {
+                $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n";
+            }
         }else{
             $cache->removeCache();                     //try to delete cachefile
-            if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n";
+            if($conf['allowdebug'] && $format=='xhtml') {
+                $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n";
+            }
         }
     }
 
@@ -616,8 +622,9 @@ function p_sort_modes($a, $b){
  * @author Andreas Gohr <andi@splitbrain.org>
  *
  * @param string $mode
- * @param array|null|false  $instructions
- * @param array  $info returns render info like enabled toc and cache
+ * @param array|null|false $instructions
+ * @param array $info returns render info like enabled toc and cache
+ * @param string $date_at
  * @return null|string rendered output
  */
 function p_render($mode,$instructions,&$info,$date_at=''){
@@ -632,7 +639,7 @@ function p_render($mode,$instructions,&$info,$date_at=''){
     if($date_at) {
         $Renderer->date_at = $date_at;
     }
-    
+
     $Renderer->smileys = getSmileys();
     $Renderer->entities = getEntities();
     $Renderer->acronyms = getAcronyms();
diff --git a/inc/remote.php b/inc/remote.php
index 861353a190b74fb0d1a4f5e693ee6d5d565e5185..3e032049d8e82343fca30dfe44083233edc6e48e 100644
--- a/inc/remote.php
+++ b/inc/remote.php
@@ -234,7 +234,7 @@ class RemoteAPI {
         global $INPUT;
 
         if (!$conf['remote']) {
-            return false;
+            throw new RemoteAccessDeniedException('server error. RPC server not enabled.',-32604); //should not be here,just throw
         }
         if(!$conf['useacl']) {
             return true;
diff --git a/inc/template.php b/inc/template.php
index 7a25e12c8e176d2653031880d1dc22588be30379..f918d1a047019690c2f909dedb7f268db2243517 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -835,7 +835,7 @@ function tpl_searchform($ajax = true, $autocomplete = true) {
     print 'placeholder="'.$lang['btn_search'].'" ';
     if(!$autocomplete) print 'autocomplete="off" ';
     print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[F]" />';
-    print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />';
+    print '<button type="submit" title="'.$lang['btn_search'].'">'.$lang['btn_search'].'</button>';
     if($ajax) print '<div id="qsearch__out" class="ajax_qsearch JSpopup"></div>';
     print '</div></form>';
     return true;
@@ -1614,6 +1614,12 @@ function tpl_actiondropdown($empty = '', $button = '&gt;') {
     /** @var Input $INPUT */
     global $INPUT;
 
+    $action_structure = array(
+        'page_tools' => array('edit', 'revert', 'revisions', 'backlink', 'subscribe'),
+        'site_tools' => array('recent', 'media', 'index'),
+        'user_tools' => array('login', 'register', 'profile', 'admin'),
+    );
+
     echo '<form action="'.script().'" method="get" accept-charset="utf-8">';
     echo '<div class="no">';
     echo '<input type="hidden" name="id" value="'.$ID.'" />';
@@ -1625,50 +1631,17 @@ function tpl_actiondropdown($empty = '', $button = '&gt;') {
     echo '<select name="do" class="edit quickselect" title="'.$lang['tools'].'">';
     echo '<option value="">'.$empty.'</option>';
 
-    echo '<optgroup label="'.$lang['page_tools'].'">';
-    $act = tpl_get_action('edit');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('revert');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('revisions');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('backlink');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('subscribe');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-    echo '</optgroup>';
-
-    echo '<optgroup label="'.$lang['site_tools'].'">';
-    $act = tpl_get_action('recent');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('media');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('index');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-    echo '</optgroup>';
-
-    echo '<optgroup label="'.$lang['user_tools'].'">';
-    $act = tpl_get_action('login');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('register');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('profile');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-
-    $act = tpl_get_action('admin');
-    if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
-    echo '</optgroup>';
+    foreach($action_structure as $tools => $actions) {
+        echo '<optgroup label="'.$lang[$tools].'">';
+        foreach($actions as $action) {
+            $act = tpl_get_action($action);
+            if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+        }
+        echo '</optgroup>';
+    }
 
     echo '</select>';
-    echo '<input type="submit" value="'.$button.'" />';
+    echo '<button type="submit">'.$button.'</button>';
     echo '</div>';
     echo '</form>';
 }
diff --git a/install.php b/install.php
index 1a2d03dff8372a56efb5e804fa09ff05a87e518d..4de8093d6ba670ebd09ed0fb4d9a5e4b6c6d27df 100644
--- a/install.php
+++ b/install.php
@@ -243,7 +243,7 @@ function print_form($d){
 
     </fieldset>
     <fieldset id="process">
-        <input class="button" type="submit" name="submit" value="<?php echo $lang['btn_save']?>" />
+        <button type="submit" name="submit"><?php echo $lang['btn_save']?></button>
     </fieldset>
     </form>
     <?php
@@ -256,7 +256,7 @@ function print_retry() {
     <form action="" method="get">
       <fieldset>
         <input type="hidden" name="l" value="<?php echo $LC ?>" />
-        <input class="button" type="submit" value="<?php echo $lang['i_retry'];?>" />
+        <button type="submit"><?php echo $lang['i_retry'];?></button>
       </fieldset>
     </form>
     <?php
@@ -619,7 +619,7 @@ function langsel(){
         echo '<option value="'.$l.'" '.$sel.'>'.$l.'</option>';
     }
     echo '</select> ';
-    echo '<input type="submit" value="'.$lang['btn_update'].'" />';
+    echo '<button type="submit">'.$lang['btn_update'].'</button>';
     echo '</form>';
 }
 
diff --git a/lib/exe/css.php b/lib/exe/css.php
index dc4d7d75ce2d3e65f84c93dbc4ae882b4a510fa7..3b8a524bc76f088ce9de762eaf3a84d2482f9484 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -32,25 +32,24 @@ function css_out(){
     global $config_cascade;
     global $INPUT;
 
-    // decide from where to get the template
-    $tpl = trim(preg_replace('/[^\w-]+/','',$INPUT->str('t')));
-    if(!$tpl) $tpl = $conf['template'];
-
-    // load style.ini
-    $styleini = css_styleini($tpl, $INPUT->bool('preview'));
-    
-    // find mediatypes
     if ($INPUT->str('s') == 'feed') {
         $mediatypes = array('feed');
         $type = 'feed';
     } else {
-        $mediatypes = array_unique(array_merge(array('screen', 'all', 'print'), array_keys($styleini['stylesheets'])));
+        $mediatypes = array('screen', 'all', 'print');
         $type = '';
     }
 
+    // decide from where to get the template
+    $tpl = trim(preg_replace('/[^\w-]+/','',$INPUT->str('t')));
+    if(!$tpl) $tpl = $conf['template'];
+
     // The generated script depends on some dynamic options
     $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].$INPUT->int('preview').DOKU_BASE.$tpl.$type,'.css');
 
+    // load styl.ini
+    $styleini = css_styleini($tpl, $INPUT->bool('preview'));
+
     // if old 'default' userstyle setting exists, make it 'screen' userstyle for backwards compatibility
     if (isset($config_cascade['userstyle']['default'])) {
         $config_cascade['userstyle']['screen'] = array($config_cascade['userstyle']['default']);
diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php
index 814bbfe9c44ff27524cad7b2e6c87c43c5d1b63f..f4baec9941aeca5aaad3ec70eb4ac10c05cc5403 100644
--- a/lib/plugins/acl/admin.php
+++ b/lib/plugins/acl/admin.php
@@ -332,7 +332,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
         echo $this->getLang('acl_perms').' ';
         $inl =  $this->_html_select();
         echo '<input type="text" name="acl_w" class="edit" value="'.(($inl)?'':hsc(ltrim($this->who,'@'))).'" />'.NL;
-        echo '<input type="submit" value="'.$this->getLang('btn_select').'" class="button" />'.NL;
+        echo '<button type="submit">'.$this->getLang('btn_select').'</button>'.NL;
         echo '</div>'.NL;
 
         echo '<div id="acl__info">';
@@ -391,10 +391,10 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
         echo $this->_html_checkboxes($current,empty($this->ns),'acl');
 
         if(is_null($current)){
-            echo '<input type="submit" name="cmd[save]" class="button" value="'.$lang['btn_save'].'" />'.NL;
+            echo '<button type="submit" name="cmd[save]">'.$lang['btn_save'].'</button>'.NL;
         }else{
-            echo '<input type="submit" name="cmd[save]" class="button" value="'.$lang['btn_update'].'" />'.NL;
-            echo '<input type="submit" name="cmd[del]" class="button" value="'.$lang['btn_delete'].'" />'.NL;
+            echo '<button type="submit" name="cmd[save]">'.$lang['btn_update'].'</button>'.NL;
+            echo '<button type="submit" name="cmd[del]">'.$lang['btn_delete'].'</button>'.NL;
         }
 
         echo '</fieldset>';
@@ -641,7 +641,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
 
         echo '<tr>';
         echo '<th class="action" colspan="4">';
-        echo '<input type="submit" value="'.$lang['btn_update'].'" name="cmd[update]" class="button" />';
+        echo '<button type="submit" name="cmd[update]">'.$lang['btn_update'].'</button>';
         echo '</th>';
         echo '</tr>';
         echo '</table>';
@@ -682,7 +682,6 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
      */
     function _acl_add($acl_scope, $acl_user, $acl_level){
         global $config_cascade;
-        $acl_config = file_get_contents($config_cascade['acl']['default']);
         $acl_user = auth_nameencode($acl_user,true);
 
         // max level for pagenames is edit
@@ -692,9 +691,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
 
         $new_acl = "$acl_scope\t$acl_user\t$acl_level\n";
 
-        $new_config = $acl_config.$new_acl;
-
-        return io_saveFile($config_cascade['acl']['default'], $new_config);
+        return io_saveFile($config_cascade['acl']['default'], $new_acl, true);
     }
 
     /**
@@ -704,15 +701,11 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
      */
     function _acl_del($acl_scope, $acl_user){
         global $config_cascade;
-        $acl_config = file($config_cascade['acl']['default']);
         $acl_user = auth_nameencode($acl_user,true);
 
         $acl_pattern = '^'.preg_quote($acl_scope,'/').'[ \t]+'.$acl_user.'[ \t]+[0-8].*$';
 
-        // save all non!-matching
-        $new_config = preg_grep("/$acl_pattern/", $acl_config, PREG_GREP_INVERT);
-
-        return io_saveFile($config_cascade['acl']['default'], join('',$new_config));
+        return io_deleteFromFile($config_cascade['acl']['default'], "/$acl_pattern/", true);
     }
 
     /**
diff --git a/lib/plugins/acl/lang/ja/help.txt b/lib/plugins/acl/lang/ja/help.txt
index f7867f8e256e6b5d32d4ef7e72ec6b7dd773620b..a1f03a3afb52e8315f14747be7edcc2dbb002369 100644
--- a/lib/plugins/acl/lang/ja/help.txt
+++ b/lib/plugins/acl/lang/ja/help.txt
@@ -1,11 +1,8 @@
-=== クイックヘルプ: ===
+=== 操作案内 ===
 
-このページでは、Wiki内の名前空間とページに対する権限を追加・削除することができます。
+このページでは、Wiki 内の名前空間とページに対する権限を追加・削除することができます。
+  * 左側のボックスには存在する名前空間とページが表示されています。
+  * 上部のフォームを使って、選択したユーザーもしくはグループの権限を閲覧・変更することができます。
+  * 下部の一覧は、現在設定されているアクセス制御のルールを表示します。この一覧を使って、複数のルールを素早く変更・削除することが可能です。
 
-左側のボックスには存在する名前空間とページが表示されています。
-
-上記のフォームを使って、選択したユーザーもしくはグループの権限を閲覧・変更することができます。
-
-以下のテープルには、現在設定されているアクセスコントロールのルールが表示されています。このテーブルを使って、複数のルールを素早く変更・削除することが可能です。
-
-DokuWikiのアクセスコントロールについては、[[doku>acl|official documentation on ACL]] をお読み下さい。
\ No newline at end of file
+DokuWiki のアクセス制御については、[[doku>ja:acl|アクセス制御リスト (ACL)の公式解説]]をお読み下さい。
\ No newline at end of file
diff --git a/lib/plugins/acl/remote.php b/lib/plugins/acl/remote.php
index 42449428f875e945c61a361109eb07c59d8c9301..031686f959ab1c568b3a597e6060c02eb7fe04cc 100644
--- a/lib/plugins/acl/remote.php
+++ b/lib/plugins/acl/remote.php
@@ -8,7 +8,7 @@ class remote_plugin_acl extends DokuWiki_Remote_Plugin {
     /**
      * Returns details about the remote plugin methods
      *
-     * @return array
+     * @return array Information about all provided methods. {@see RemoteAPI}
      */
     public function _getMethods() {
         return array(
diff --git a/lib/plugins/acl/script.js b/lib/plugins/acl/script.js
index 58598b1e04d382cd395194007d93b3e0e248b875..86badffdd66f746a3930793ad3e9b6f826b21cd5 100644
--- a/lib/plugins/acl/script.js
+++ b/lib/plugins/acl/script.js
@@ -16,7 +16,7 @@ var dw_acl = {
         }
 
         jQuery('#acl__user select').change(dw_acl.userselhandler);
-        jQuery('#acl__user input[type=submit]').click(dw_acl.loadinfo);
+        jQuery('#acl__user button').click(dw_acl.loadinfo);
 
         $tree = jQuery('#acl__tree');
         $tree.dw_tree({toggle_selector: 'img',
diff --git a/lib/plugins/action.php b/lib/plugins/action.php
index 4b5eef60a8b7e23ce3517158dd7524b7952dd05f..23d94a509394f2620d8b3e30667e46e55623c354 100644
--- a/lib/plugins/action.php
+++ b/lib/plugins/action.php
@@ -16,6 +16,8 @@ class DokuWiki_Action_Plugin extends DokuWiki_Plugin {
 
     /**
      * Registers a callback function for a given event
+     *
+     * @param Doku_Event_Handler $controller
      */
     public function register(Doku_Event_Handler $controller) {
         trigger_error('register() not implemented in '.get_class($this), E_USER_WARNING);
diff --git a/lib/plugins/authad/lang/de-informal/lang.php b/lib/plugins/authad/lang/de-informal/lang.php
index e9361d5fe5604ec57633e6875c5305152f1fc8ce..973c992d2bb914f897988ae4d1ef2faaf3f045ff 100644
--- a/lib/plugins/authad/lang/de-informal/lang.php
+++ b/lib/plugins/authad/lang/de-informal/lang.php
@@ -4,5 +4,8 @@
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * 
  * @author Andreas Gohr <gohr@cosmocode.de>
+ * @author rnck <dokuwiki@rnck.de>
  */
 $lang['authpwdexpire']         = 'Dein Passwort läuft in %d Tag(en) ab. Du solltest es es frühzeitig ändern.';
+$lang['passchangefail']        = 'Das Passwort konnte nicht geändert werden. Eventuell wurde die Passwort-Richtlinie nicht eingehalten.';
+$lang['connectfail']           = 'Verbindung zum Active Directory Server fehlgeschlagen.';
diff --git a/lib/plugins/authad/lang/de/lang.php b/lib/plugins/authad/lang/de/lang.php
index 11f52a41486aacda7d86c50fc69aadcfee1119b6..93a65667e2218aaf20d73f63e10c8d76ce7c959e 100644
--- a/lib/plugins/authad/lang/de/lang.php
+++ b/lib/plugins/authad/lang/de/lang.php
@@ -4,6 +4,9 @@
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * 
  * @author Andreas Gohr <gohr@cosmocode.de>
+ * @author Philip Knack <p.knack@stollfuss.de>
  */
 $lang['domain']                = 'Anmelde-Domäne';
 $lang['authpwdexpire']         = 'Ihr Passwort läuft in %d Tag(en) ab. Sie sollten es frühzeitig ändern.';
+$lang['passchangefail']        = 'Kennwortänderung fehlgeschlagen. Entspricht das Kennwort der Richtlinie?';
+$lang['connectfail']           = 'Verbindung zum Active Directory Server fehlgeschlagen.';
diff --git a/lib/plugins/authad/lang/es/lang.php b/lib/plugins/authad/lang/es/lang.php
index ffbff49a1356158cbc4ea11b2b5eff3ff536def7..0ad262c211036fda2dcb5b979876168a6bd9272f 100644
--- a/lib/plugins/authad/lang/es/lang.php
+++ b/lib/plugins/authad/lang/es/lang.php
@@ -5,6 +5,9 @@
  * 
  * @author Juan De La Cruz <juann.dlc@gmail.com>
  * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
+ * @author Mauricio Segura <maose38@yahoo.es>
  */
 $lang['domain']                = 'Dominio de inicio';
 $lang['authpwdexpire']         = 'Su contraseña caducara en %d días, debería cambiarla lo antes posible';
+$lang['passchangefail']        = 'Error al cambiar la contraseña. ¿Tal vez no se cumplió la directiva de contraseñas?';
+$lang['connectfail']           = 'Error al conectar con el servidor de Active Directory.';
diff --git a/lib/plugins/authad/lang/et/lang.php b/lib/plugins/authad/lang/et/lang.php
index 6dda193603a37d22855bc22d216e2ac0ff5f9ffa..94fe9ed8e10b3f004291a498cba7150e07d91c1c 100644
--- a/lib/plugins/authad/lang/et/lang.php
+++ b/lib/plugins/authad/lang/et/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Janar Leas <janar.leas@eesti.ee>
  */
-$lang['authpwdexpire']         = 'Sinu salasõna aegub %päeva pärast, võiksid seda peatselt muuta.';
+$lang['authpwdexpire']         = 'Sinu salasõna aegub %d päeva pärast, võiksid seda peatselt muuta.';
diff --git a/lib/plugins/authad/lang/he/lang.php b/lib/plugins/authad/lang/he/lang.php
index 616d1ab4b9f00166e378f72edcb36a218c98238a..ac8fbcb5c44ed666733acd883c304d9d7cda3f91 100644
--- a/lib/plugins/authad/lang/he/lang.php
+++ b/lib/plugins/authad/lang/he/lang.php
@@ -2,9 +2,9 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author tomer <tomercarolldergicz@gmail.com>
  * @author Menashe Tomer <menashesite@gmail.com>
  */
-$lang['authpwdexpire']         = 'הסיסמה שלך תפוג ב% d ימים, אתה צריך לשנות את זה בקרוב.';
+$lang['authpwdexpire']         = 'הסיסמה שלך תפוג ב %d ימים, אתה צריך לשנות את זה בקרוב.';
 $lang['passchangefail']        = 'שגיאה בשינוי סיסמה. האם הסיסמה תואמת למדיניות המערכת?';
diff --git a/lib/plugins/authad/lang/ko/lang.php b/lib/plugins/authad/lang/ko/lang.php
index c119fabc55b45187382ffb8f88b69a6d35934774..7e9b22f4068a3d28aa7e3d0e89beb998b4aaf3a5 100644
--- a/lib/plugins/authad/lang/ko/lang.php
+++ b/lib/plugins/authad/lang/ko/lang.php
@@ -7,3 +7,5 @@
  */
 $lang['domain']                = '로그온 도메인';
 $lang['authpwdexpire']         = '비밀번호를 바꾼지 %d일이 지났으며, 비밀번호를 곧 바꿔야 합니다.';
+$lang['passchangefail']        = '비밀번호를 바꾸는 데 실패했습니다. 비밀번호 정책을 따르지 않았나요?';
+$lang['connectfail']           = 'Active Directory 서버에 연결하는 데 실패했습니다.';
diff --git a/lib/plugins/authad/lang/pt/settings.php b/lib/plugins/authad/lang/pt/settings.php
index 6256eb5975a116c921e0539c9734b7c4076630a3..c5756890db7e06be02959bdc4a28b0010b7516ad 100644
--- a/lib/plugins/authad/lang/pt/settings.php
+++ b/lib/plugins/authad/lang/pt/settings.php
@@ -2,14 +2,14 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author André Neves <drakferion@gmail.com>
  * @author Murilo <muriloricci@hotmail.com>
  * @author Paulo Silva <paulotsilva@yahoo.com>
  * @author Guido Salatino <guidorafael23@gmail.com>
  */
 $lang['account_suffix']        = 'O sufixo da sua conta. Por exemplo, <code>@my.domain.org</code>';
-$lang['base_dn']               = 'Sua base DN. Eg. <code> DC=meu, DC=dominio, DC=org </ code>';
+$lang['base_dn']               = 'Sua base DN. Eg. <code> DC=meu, DC=dominio, DC=org </code>';
 $lang['domain_controllers']    = 'Uma lista separada por vírgulas de Controladores de Domínio (AD DC). Ex.: <code>srv1.domain.org,srv2.domain.org</code>';
 $lang['admin_username']        = 'Um utilizador com privilégios na Active Directory que tenha acesso aos dados de todos os outros utilizadores. Opcional, mas necessário para certas ações como enviar emails de subscrição.';
 $lang['admin_password']        = 'A senha para o utilizador acima.';
diff --git a/lib/plugins/authad/lang/ru/lang.php b/lib/plugins/authad/lang/ru/lang.php
index 6a3f6e9954ef60663ab7148634d07114f9c467a9..fe56be2bffa77f690372f60db7b583b3cd67c9fb 100644
--- a/lib/plugins/authad/lang/ru/lang.php
+++ b/lib/plugins/authad/lang/ru/lang.php
@@ -4,6 +4,9 @@
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * 
  * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Takumo <9206984@mail.ru>
  */
 $lang['domain']                = 'Домен';
 $lang['authpwdexpire']         = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее';
+$lang['passchangefail']        = 'Не удалось изменить пароль. Возможно, он не соответствует требованиям к паролю.';
+$lang['connectfail']           = 'Невозможно соединиться с сервером AD.';
diff --git a/lib/plugins/authad/lang/zh/lang.php b/lib/plugins/authad/lang/zh/lang.php
index 4f3794999afa9614af73148c75f741db23826197..df1a7a7f7717e12c1700866f108f4fb1f3f39b19 100644
--- a/lib/plugins/authad/lang/zh/lang.php
+++ b/lib/plugins/authad/lang/zh/lang.php
@@ -4,6 +4,9 @@
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * 
  * @author lainme <lainme993@gmail.com>
+ * @author Errol <errol@hotmail.com>
  */
 $lang['domain']                = '登录域';
 $lang['authpwdexpire']         = '您的密码将在 %d 天内过期,请尽快更改';
+$lang['passchangefail']        = '密码更改失败。是不是密码规则不符合?';
+$lang['connectfail']           = '无法连接到Active Directory服务器。';
diff --git a/lib/plugins/authldap/lang/de/lang.php b/lib/plugins/authldap/lang/de/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..74197f918a6500692d5ce4252043e85295016b2d
--- /dev/null
+++ b/lib/plugins/authldap/lang/de/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Philip Knack <p.knack@stollfuss.de>
+ */
+$lang['connectfail']           = 'LDAP-Verbindung scheitert: %s';
+$lang['domainfail']            = 'LDAP kann nicht dein Benutzer finden dn';
diff --git a/lib/plugins/authldap/lang/de/settings.php b/lib/plugins/authldap/lang/de/settings.php
index 933189c403ab112f90ff211970452f163e2d6993..df1974867c472c672509d1893c81fde9a34c9e25 100644
--- a/lib/plugins/authldap/lang/de/settings.php
+++ b/lib/plugins/authldap/lang/de/settings.php
@@ -5,6 +5,7 @@
  * 
  * @author Matthias Schulte <dokuwiki@lupo49.de>
  * @author christian studer <cstuder@existenz.ch>
+ * @author Philip Knack <p.knack@stollfuss.de>
  */
 $lang['server']                = 'Adresse zum LDAP-Server. Entweder als Hostname (<code>localhost</code>) oder als FQDN (<code>ldap://server.tld:389</code>).';
 $lang['port']                  = 'Port des LDAP-Servers, falls kein Port angegeben wurde.';
@@ -28,3 +29,4 @@ $lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
 $lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
 $lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
 $lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
+$lang['referrals_o_-1']        = 'Standard verwenden';
diff --git a/lib/plugins/authldap/lang/es/lang.php b/lib/plugins/authldap/lang/es/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..e68a426031f80202f5ba695133685f8c68a57390
--- /dev/null
+++ b/lib/plugins/authldap/lang/es/lang.php
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Mauricio Segura <maose38@yahoo.es>
+ */
+$lang['connectfail']           = 'LDAP no se puede conectar: %5';
diff --git a/lib/plugins/authldap/lang/ja/lang.php b/lib/plugins/authldap/lang/ja/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..aeeb6c75e7956d16d3044fcabbe08013537f20e6
--- /dev/null
+++ b/lib/plugins/authldap/lang/ja/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['connectfail']           = 'LDAP に接続できません: %s';
+$lang['domainfail']            = 'LDAP で user dn を発見できません。';
diff --git a/lib/plugins/authldap/lang/ja/settings.php b/lib/plugins/authldap/lang/ja/settings.php
index 717b5a6d9fe9fd2006af4302863359fe8bb38a46..99a70de7964ae451d590e09cb07a734f4a9693a0 100644
--- a/lib/plugins/authldap/lang/ja/settings.php
+++ b/lib/plugins/authldap/lang/ja/settings.php
@@ -23,10 +23,15 @@ $lang['binddn']                = '匿名バインドでは不十分な場合、
 $lang['bindpw']                = '上記ユーザーのパスワード';
 $lang['userscope']             = 'ユーザー検索の範囲を限定させる';
 $lang['groupscope']            = 'グループ検索の範囲を限定させる';
+$lang['userkey']               = 'ユーザー名を示す属性。userfilter と一致している必要があります。';
 $lang['groupkey']              = 'ユーザー属性をグループのメンバーシップから設定します(代わりに標準のADグループ)。
 例えば、部署や電話番号などです。';
+$lang['modPass']               = 'DokuWiki から LDAP パスワードの変更が可能?';
 $lang['debug']                 = 'エラーに関して追加のデバッグ情報を表示する。';
 $lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
 $lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
 $lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
 $lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
+$lang['referrals_o_-1']        = 'デフォルトを使用する';
+$lang['referrals_o_0']         = 'referral に従わない';
+$lang['referrals_o_1']         = 'referral に従う';
diff --git a/lib/plugins/authldap/lang/ko/lang.php b/lib/plugins/authldap/lang/ko/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c6722a81230ea4f33465d6de49ede159793e14c
--- /dev/null
+++ b/lib/plugins/authldap/lang/ko/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Myeongjin <aranet100@gmail.com>
+ */
+$lang['connectfail']           = 'LDAP가 연결할 수 없습니다: %s';
+$lang['domainfail']            = 'LDAP가 사용자 DN을 찾을 수 없습니다';
diff --git a/lib/plugins/authldap/lang/ru/lang.php b/lib/plugins/authldap/lang/ru/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..c05ed3b1545204e912f6e7cab7fc5628c4aaf848
--- /dev/null
+++ b/lib/plugins/authldap/lang/ru/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Takumo <9206984@mail.ru>
+ */
+$lang['connectfail']           = 'Ошибка соединения LDAP с %s';
+$lang['domainfail']            = 'Не найдено имя пользователя LDAP (dn)';
diff --git a/lib/plugins/authldap/lang/zh-tw/settings.php b/lib/plugins/authldap/lang/zh-tw/settings.php
index e3d85cb873e532e2f6be164763620fc73433170a..dcbbace8cad584baee9cdad5b49aaa5f22ab8970 100644
--- a/lib/plugins/authldap/lang/zh-tw/settings.php
+++ b/lib/plugins/authldap/lang/zh-tw/settings.php
@@ -2,15 +2,15 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author syaoranhinata@gmail.com
  */
 $lang['server']                = '您的 LDAP 伺服器。填寫主機名稱 (<code>localhost</code>) 或完整的 URL (<code>ldap://server.tld:389</code>)';
 $lang['port']                  = 'LDAP 伺服器端口 (若上方沒填寫完整的 URL)';
 $lang['usertree']              = '到哪裏尋找使用者帳號?如: <code>ou=People, dc=server, dc=tld</code>';
 $lang['grouptree']             = '到哪裏尋找使用者群組?如: <code>ou=Group, dc=server, dc=tld</code>';
-$lang['userfilter']            = '用於搜索使用者賬號的 LDAP 篩選器。如: <code>(&(uid=%{user})(objectClass=posixAccount))</code>';
-$lang['groupfilter']           = '用於搜索群組的 LDAP 篩選器。例如 <code>(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
+$lang['userfilter']            = '用於搜索使用者賬號的 LDAP 篩選器。如: <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
+$lang['groupfilter']           = '用於搜索群組的 LDAP 篩選器。例如 <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
 $lang['version']               = '使用的通訊協定版本。您可能要設置為 <code>3</code>';
 $lang['starttls']              = '使用 TLS 連接嗎?';
 $lang['referrals']             = '是否允許引用 (referrals)?';
diff --git a/lib/plugins/authldap/lang/zh/lang.php b/lib/plugins/authldap/lang/zh/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef727497ed2ccae463b734cfd9b04e4b415c9bf5
--- /dev/null
+++ b/lib/plugins/authldap/lang/zh/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Errol <errol@hotmail.com>
+ */
+$lang['connectfail']           = 'LDAP 无法连接: %s';
+$lang['domainfail']            = 'LDAP 无法找到你的用户 dn';
diff --git a/lib/plugins/authldap/lang/zh/settings.php b/lib/plugins/authldap/lang/zh/settings.php
index d4ea5c615f6693ad55e866ab8754807e6387e754..11cba4f5593923fbf5dbe399a186d013941bccc6 100644
--- a/lib/plugins/authldap/lang/zh/settings.php
+++ b/lib/plugins/authldap/lang/zh/settings.php
@@ -2,16 +2,17 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author lainme <lainme993@gmail.com>
  * @author oott123 <ip.192.168.1.1@qq.com>
+ * @author Errol <errol@hotmail.com>
  */
 $lang['server']                = '您的 LDAP 服务器。填写主机名 (<code>localhost</code>) 或者完整的 URL (<code>ldap://server.tld:389</code>)';
 $lang['port']                  = 'LDAP 服务器端口 (如果上面没有给出完整的 URL)';
 $lang['usertree']              = '何处查找用户账户。例如 <code>ou=People, dc=server, dc=tld</code>';
 $lang['grouptree']             = '何处查找用户组。例如 <code>ou=Group, dc=server, dc=tld</code>';
-$lang['userfilter']            = '用于搜索用户账户的 LDAP 筛选器。例如 <code>(&(uid=%{user})(objectClass=posixAccount))</code>';
-$lang['groupfilter']           = '用于搜索组的 LDAP 筛选器。例如 <code>(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
+$lang['userfilter']            = '用于搜索用户账户的 LDAP 筛选器。例如 <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
+$lang['groupfilter']           = '用于搜索组的 LDAP 筛选器。例如 <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
 $lang['version']               = '使用的协议版本。您或许需要设置为 <code>3</code>';
 $lang['starttls']              = '使用 TLS 连接?';
 $lang['referrals']             = '是否允许引用 (referrals)?';
@@ -21,6 +22,7 @@ $lang['bindpw']                = '上述用户的密码';
 $lang['userscope']             = '限制用户搜索的范围';
 $lang['groupscope']            = '限制组搜索的范围';
 $lang['groupkey']              = '根据任何用户属性得来的组成员(而不是标准的 AD 组),例如根据部门或者电话号码得到的组。';
+$lang['modPass']               = ' LDAP密码可以由dokuwiki修改吗?';
 $lang['debug']                 = '有错误时显示额外的调试信息';
 $lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
 $lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
diff --git a/lib/plugins/authmysql/lang/de/lang.php b/lib/plugins/authmysql/lang/de/lang.php
index 819b98458d11a21f2ec0f2f6776091cad9793265..c5c3c657a3dae22529c1b3c18df55a9b9f8de80a 100644
--- a/lib/plugins/authmysql/lang/de/lang.php
+++ b/lib/plugins/authmysql/lang/de/lang.php
@@ -5,7 +5,9 @@
  * 
  * @author Noel Tilliot <noeltilliot@byom.de>
  * @author Hendrik Diel <diel.hendrik@gmail.com>
+ * @author Philip Knack <p.knack@stollfuss.de>
  */
+$lang['connectfail']           = 'Verbindung zur Datenbank fehlgeschlagen.';
 $lang['userexists']            = 'Entschuldigung, aber dieser Benutzername ist bereits vergeben.';
 $lang['usernotexists']         = 'Sorry, dieser Nutzer existiert nicht.';
 $lang['writefail']             = 'Die Benutzerdaten konnten nicht geändert werden. Bitte wenden Sie sich an den Wiki-Admin.';
diff --git a/lib/plugins/authmysql/lang/ja/lang.php b/lib/plugins/authmysql/lang/ja/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2348f2f3ab6a5013a6b88c9fd2a44ea6803b4a6
--- /dev/null
+++ b/lib/plugins/authmysql/lang/ja/lang.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['connectfail']           = 'データベースへの接続に失敗しました。';
+$lang['userexists']            = 'このログイン名のユーザーが既に存在しています。';
+$lang['usernotexists']         = 'そのユーザーは存在しません。';
+$lang['writefail']             = 'ユーザーデータを変更できません。Wiki の管理者に連絡してください。';
diff --git a/lib/plugins/authmysql/lang/ja/settings.php b/lib/plugins/authmysql/lang/ja/settings.php
index e5d5689df24be1f61c3e745b9bba711a3af115ca..6bc3f9a14705c1bf7d04e72a5567472098620c7a 100644
--- a/lib/plugins/authmysql/lang/ja/settings.php
+++ b/lib/plugins/authmysql/lang/ja/settings.php
@@ -11,7 +11,7 @@ $lang['password']              = 'MySQL 接続用ユーザーのパスワード'
 $lang['database']              = '使用するデータベース名';
 $lang['charset']               = 'データベースの文字コード';
 $lang['debug']                 = 'デバック情報を表示する';
-$lang['forwardClearPass']      = '以下で定義する SQL ステートメントにおいて, パスワード変数 &#x25;{pass} を平文とする(DokiWiki側で暗号化しない)';
+$lang['forwardClearPass']      = '以下で定義する SQL ステートメントにおいて, パスワード変数 を平文とする(DokiWiki側で暗号化しない)';
 $lang['TablesToLock']          = '書き込み時にロックするテーブル(コンマ区切りで列挙)';
 $lang['checkPass']             = 'パスワードの照合に用いる SQL ステートメント';
 $lang['getUserInfo']           = 'ユーザー情報の取得に用いる SQL ステートメント';
diff --git a/lib/plugins/authmysql/lang/ko/lang.php b/lib/plugins/authmysql/lang/ko/lang.php
index a2ad278c16cb7bdb0fa64c0d8eb80a9cd7673b92..d07d58388cd25487a72a7ca888b886b5e0d91d09 100644
--- a/lib/plugins/authmysql/lang/ko/lang.php
+++ b/lib/plugins/authmysql/lang/ko/lang.php
@@ -4,8 +4,9 @@
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * 
  * @author hyeonsoft <hyeonsoft@live.co.kr>
+ * @author Myeongjin <aranet100@gmail.com>
  */
 $lang['connectfail']           = '데이터베이스에 연결하는 데 실패했습니다.';
-$lang['userexists']            = '이 계정으로 이미 로그인 된 사용자가 있습니다.';
-$lang['usernotexists']         = '이 계정은 존재하지 않습니다.';
-$lang['writefail']             = '사용자 데이터를 수정할 수 없습니다. 관리자에게 문의하십시오.';
+$lang['userexists']            = '죄송하지만 이 계정으로 이미 로그인한 사용자가 있습니다.';
+$lang['usernotexists']         = '죄송하지만 해당 사용자가 존재하지 않습니다.';
+$lang['writefail']             = '사용자 데이터를 수정할 수 없습니다. 위키 관리자에게 문의하시기 바랍니다';
diff --git a/lib/plugins/authmysql/lang/ru/lang.php b/lib/plugins/authmysql/lang/ru/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..75b5613f58e2fac009ffa3c700cd0c2c74b03ab5
--- /dev/null
+++ b/lib/plugins/authmysql/lang/ru/lang.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Takumo <9206984@mail.ru>
+ */
+$lang['connectfail']           = 'Ошибка соединения с базой данных.';
+$lang['userexists']            = 'Извините, пользователь с таким логином уже существует.';
+$lang['usernotexists']         = 'Извините, такой пользователь не существует.';
+$lang['writefail']             = 'Невозможно изменить данные пользователя. Сообщите об этом администратору Вики.';
diff --git a/lib/plugins/authmysql/lang/zh/lang.php b/lib/plugins/authmysql/lang/zh/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..044fe6d609d545d9fdfd0e2f2c5995e7a4fc8f53
--- /dev/null
+++ b/lib/plugins/authmysql/lang/zh/lang.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Errol <errol@hotmail.com>
+ */
+$lang['connectfail']           = '连接数据库失败';
+$lang['userexists']            = '抱歉,用户名已被使用。';
+$lang['usernotexists']         = '抱歉,用户不存在。';
+$lang['writefail']             = '无法修改用户数据。请通知管理员';
diff --git a/lib/plugins/authpgsql/lang/ja/settings.php b/lib/plugins/authpgsql/lang/ja/settings.php
index d7a5f6cf26540e70074e2edf70773f1daf224007..c4a82a1790747883333692d4c388d649cf9bfbeb 100644
--- a/lib/plugins/authpgsql/lang/ja/settings.php
+++ b/lib/plugins/authpgsql/lang/ja/settings.php
@@ -11,7 +11,7 @@ $lang['user']                  = 'PostgreSQL 接続用ユーザー名';
 $lang['password']              = 'PostgreSQL 接続用ユーザーのパスワード';
 $lang['database']              = '使用するデータベース名';
 $lang['debug']                 = 'デバック情報を表示する';
-$lang['forwardClearPass']      = '以下で定義する SQL ステートメントにおいて, パスワード変数 &#x25;{pass} を平文とする(DokiWiki側で暗号化しない)';
+$lang['forwardClearPass']      = '以下で定義する SQL ステートメントにおいて, パスワード変数 を平文とする(DokiWiki側で暗号化しない)';
 $lang['checkPass']             = 'パスワードの照合に用いる SQL ステートメント';
 $lang['getUserInfo']           = 'ユーザー情報の取得に用いる SQL ステートメント';
 $lang['getGroups']             = 'ユーザーが所属する全てのグループの取得に用いる SQL ステートメント';
diff --git a/lib/plugins/authplain/auth.php b/lib/plugins/authplain/auth.php
index bd46c61a7d10c3b51cdc2370eb2e4cda58638351..8ec632dada62424a5a847ce3c36d9bd9833ae6e9 100644
--- a/lib/plugins/authplain/auth.php
+++ b/lib/plugins/authplain/auth.php
@@ -188,15 +188,9 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
 
         $userline = $this->_createUserLine($newuser, $userinfo['pass'], $userinfo['name'], $userinfo['mail'], $userinfo['grps']);
 
-        if(!$this->deleteUsers(array($user))) {
-            msg($this->getLang('writefail'), -1);
-            return false;
-        }
-
-        if(!io_saveFile($config_cascade['plainauth.users']['default'], $userline, true)) {
-            msg('There was an error modifying your user data. You should register again.', -1);
-            // FIXME, user has been deleted but not recreated, should force a logout and redirect to login page
-            // Should replace the delete/save hybrid modify with an atomic io_replaceInFile
+        if(!io_replaceInFile($config_cascade['plainauth.users']['default'], '/^'.$user.':/', $userline, true)) {
+            msg('There was an error modifying your user data. You may need to register again.', -1);
+            // FIXME, io functions should be fail-safe so existing data isn't lost
             $ACT = 'register';
             return false;
         }
diff --git a/lib/plugins/config/admin.php b/lib/plugins/config/admin.php
index 2ef570b682c0738880d19cc737818446af5ef53f..ec8ee0b842bf566a635754c554b86cb969383cec 100644
--- a/lib/plugins/config/admin.php
+++ b/lib/plugins/config/admin.php
@@ -212,8 +212,8 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
 
         if (!$this->_config->locked) {
             ptln('  <input type="hidden" name="save"   value="1" />');
-            ptln('  <input type="submit" name="submit" class="button" value="'.$lang['btn_save'].'" accesskey="s" />');
-            ptln('  <input type="reset" class="button" value="'.$lang['btn_reset'].'" />');
+            ptln('  <button type="submit" name="submit" accesskey="s">'.$lang['btn_save'].'</button>');
+            ptln('  <button type="reset">'.$lang['btn_reset'].'</button>');
         }
 
         ptln('</p>');
diff --git a/lib/plugins/config/lang/ar/intro.txt b/lib/plugins/config/lang/ar/intro.txt
index d447ec315eb66deb8fa0c874956759f94684545c..15905189f94bd5c9b7cf00826ace90a10af9e551 100644
--- a/lib/plugins/config/lang/ar/intro.txt
+++ b/lib/plugins/config/lang/ar/intro.txt
@@ -4,4 +4,4 @@
 
 الاعدادات الظاهرة بخلفية حمراء فاتحة اعدادات محمية ولا يمكن تغييرها بهذه الاضافة. الاعدادات الظاهرة بخلفية زرقاء هي القيم الافتراضية والاعدادات الظاهرة بخلفية بيضاء خصصت لهذا التثبيت محليا. الاعدادات الزرقاء والبيضاء يمكن تغييرها.
 
-تأكد من ضغط زر **SAVE** قبل ترك الصفحة وإلا ستضيع تعديلاتك.
\ No newline at end of file
+تأكد من ضغط زر **SAVE** قبل ترك الصفحة وإلا ستضيع تعديلاتك.
diff --git a/lib/plugins/config/lang/ca-valencia/intro.txt b/lib/plugins/config/lang/ca-valencia/intro.txt
index 40729e5fe9adb569d8a482e146b9f7ad488e9d24..6dd461db344b9519c5f47f9d1bee8c5aa353db59 100644
--- a/lib/plugins/config/lang/ca-valencia/intro.txt
+++ b/lib/plugins/config/lang/ca-valencia/intro.txt
@@ -7,4 +7,4 @@ Per a més informació al voltant d'este plúgin vaja a [[doku>config]].
 Els ajusts mostrats en un fondo roig claret estan protegits i no els pot
 modificar en este plúgin. Els ajusts mostrats en un fondo blau tenen els valors predeterminats i els ajusts mostrats en un fondo blanc han segut modificats localment per ad esta instalació. Abdós ajusts, blaus i blancs, es poden modificar.
 
-Recorde pulsar el botó **GUARDAR** ans d'anar-se'n d'esta pàgina o perdrà els canvis que haja fet.
\ No newline at end of file
+Recorde pulsar el botó **GUARDAR** ans d'anar-se'n d'esta pàgina o perdrà els canvis que haja fet.
diff --git a/lib/plugins/config/lang/cs/intro.txt b/lib/plugins/config/lang/cs/intro.txt
index 63381b84e66fb258b56f4b2beb3e356d2a0882fd..f98a62a6e9ae99563738cb0945d85874c3d22e04 100644
--- a/lib/plugins/config/lang/cs/intro.txt
+++ b/lib/plugins/config/lang/cs/intro.txt
@@ -5,4 +5,3 @@ Tuto stránku můžete používat ke správě nastavení vaší instalace DokuWi
 Položky se světle červeným pozadím jsou chráněné a nelze je upravovat tímto pluginem.  Položky s modrým pozadím jsou výchozí hodnoty a položky s bílým pozadím byly nastaveny lokálně v této konkrétní instalaci. Modré i bílé položky je možné upravovat.
 
 Než opustíte tuto stránku, nezapomeňte stisknout tlačítko **Uložit**, jinak budou změny ztraceny.
-
diff --git a/lib/plugins/config/lang/da/intro.txt b/lib/plugins/config/lang/da/intro.txt
index f20961b9881014b440374465bf6d7b57e7105eae..14cd3d601d43f9ff0007ed313f335af647b4193c 100644
--- a/lib/plugins/config/lang/da/intro.txt
+++ b/lib/plugins/config/lang/da/intro.txt
@@ -5,4 +5,3 @@ Brug denne side til at kontrollere indstillingerne for din Dokuwiki-opsætning.
 Indstillinger vist med lys rød baggrund er beskyttede og kan ikke ændres med denne udvidelse. Indstillinger vist med blå baggrund er standardindstillinger og indstillinger vist med hvid baggrund er blevet sat lokalt denne konkrete opsætning.  Både blå og hvide indstillinger kan ændres.
 
 Husk at trykke på **Gem**-knappen før du forlader siden, for at du ikke mister dine ændringer.
-
diff --git a/lib/plugins/config/lang/de-informal/intro.txt b/lib/plugins/config/lang/de-informal/intro.txt
index df9845ebc0610e1d8508da0ec967f4e3289013dd..ce4625cffb079869ebeaf49a5b254078edbd8c8b 100644
--- a/lib/plugins/config/lang/de-informal/intro.txt
+++ b/lib/plugins/config/lang/de-informal/intro.txt
@@ -4,4 +4,4 @@ Benutze diese Seite zur Kontrolle der Einstellungen deiner DokuWiki-Installation
 
 Einstellungen die mit einem hellroten Hintergrund angezeigt werden, können mit dieser Erweiterung nicht verändert werden. Einstellungen mit einem blauen Hintergrund sind Standardwerte und Einstellungen mit einem weißen Hintergrund wurden lokal gesetzt für diese Installation. Sowohl blaue als auch weiße Einstellungen können angepasst werden.
 
-Denke dran **Speichern** zu drücken bevor du die Seite verlässt, andernfalls werden deine Änderungen nicht übernommen.
\ No newline at end of file
+Denke dran **Speichern** zu drücken bevor du die Seite verlässt, andernfalls werden deine Änderungen nicht übernommen.
diff --git a/lib/plugins/config/lang/de/intro.txt b/lib/plugins/config/lang/de/intro.txt
index b79b5f871c05c9087754b4eea33a750b979b5d89..e743379ff53d50273612f00ee461aeaf246daf00 100644
--- a/lib/plugins/config/lang/de/intro.txt
+++ b/lib/plugins/config/lang/de/intro.txt
@@ -5,6 +5,3 @@ Dieses Plugin hilft Ihnen bei der Konfiguration von DokuWiki. Hilfe zu den einze
 Einstellungen mit einem hellroten Hintergrund sind gesichert und können nicht mit diesem Plugin verändert werden, Einstellungen mit hellblauem Hintergrund sind Voreinstellungen, weiß hinterlegte Felder zeigen lokal veränderte Werte an. Sowohl die blauen als auch die weißen Felder können verändert werden.
 
 Bitte vergessen Sie nicht **Speichern** zu drücken bevor Sie die Seite verlassen, andernfalls gehen Ihre Änderungen verloren.
-
-
-
diff --git a/lib/plugins/config/lang/en/intro.txt b/lib/plugins/config/lang/en/intro.txt
index 7cf46cee3c23e25a9625c757846765fe11aa2818..01089871c3a15e34dbd1d2d41d21639f60d140bf 100644
--- a/lib/plugins/config/lang/en/intro.txt
+++ b/lib/plugins/config/lang/en/intro.txt
@@ -5,5 +5,3 @@ Use this page to control the settings of your DokuWiki installation.  For help o
 Settings shown with a light red background are protected and can not be altered with this plugin. Settings shown with a blue background are the default values and settings shown with a white background have been set locally for this particular installation.  Both blue and white settings can be altered.
 
 Remember to press the **Save** button before leaving this page otherwise your changes will be lost.
-
-
diff --git a/lib/plugins/config/lang/eo/lang.php b/lib/plugins/config/lang/eo/lang.php
index 440d771dcca39ae24f09b706ed79ffe165ed0d4c..566da0d2d052e67d7589490125fa4cf834d36afd 100644
--- a/lib/plugins/config/lang/eo/lang.php
+++ b/lib/plugins/config/lang/eo/lang.php
@@ -137,7 +137,7 @@ $lang['compress']              = 'Kompaktigi CSS-ajn kaj ĵavaskriptajn elmetojn
 $lang['cssdatauri']            = 'Grandeco en bitokoj, ĝis kiom en CSS-dosieroj referencitaj bildoj enmetiĝu rekte en la stilfolion por malgrandigi vanan HTTP-kapan trafikon. Tiu tekniko ne funkcias en IE 7 aŭ pli frua!
 <code>400</code> ĝis <code>600</code> bitokoj estas bona grandeco. Indiku <code>0</code> por malebligi enmeton.';
 $lang['send404']               = 'Sendi la mesaĝon "HTTP 404/Paĝo ne trovita" por ne ekzistantaj paĝoj';
-$lang['broken_iua']            = 'Ĉu la funkcio "ignore_user_abort" difektas en via sistemo? Tio povus misfunkciigi la serĉindekson. IIS+PHP/CGI estas konata kiel fuŝaĵo. Vidu <a href="http://bugs.splitbrain.org/?do=details&task_id=852&">Cimon 852</a> por pli da informoj.';
+$lang['broken_iua']            = 'Ĉu la funkcio "ignore_user_abort" difektas en via sistemo? Tio povus misfunkciigi la serĉindekson. IIS+PHP/CGI estas konata kiel fuŝaĵo. Vidu <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Cimon 852</a> por pli da informoj.';
 $lang['xsendfile']             = 'Ĉu uzi la kaplinion X-Sendfile por ebligi al la retservilo liveri fiksajn dosierojn? Via retservilo subtenu tion.';
 $lang['renderer_xhtml']        = 'Prezentilo por la ĉefa vikia rezulto (xhtml)';
 $lang['renderer__core']        = '%s (DokuWiki-a kerno)';
diff --git a/lib/plugins/config/lang/fa/intro.txt b/lib/plugins/config/lang/fa/intro.txt
index f5b6ba235d181fa624043c513ff6f44c6a5b4106..31bbaea98daa731c4bc89b30ba6172e41e25bcb0 100644
--- a/lib/plugins/config/lang/fa/intro.txt
+++ b/lib/plugins/config/lang/fa/intro.txt
@@ -5,4 +5,4 @@
 
 تنظیماتی که با پیش‌زمینه‌ی قرمز مشخص شده‌اند، غیرقابل تغییر می‌باشند. تنظیماتی که به پیش‌زمینه‌ی آبی مشخص شده‌اند نیز حامل مقادیر پیش‌فرض می‌باشند و تنظیماتی که پیش‌زمینه‌ی سفید دارند به طور محلی برای این سیستم تنظیم شده‌اند. تمامی مقادیر آبی و سفید قابلیت تغییر دارند.
 
-به یاد داشته باشید که قبل از ترک صفحه، دکمه‌ی **ذخیره** را بفشارید، در غیر این صورت تنظیمات شما از بین خواهد رفت.
\ No newline at end of file
+به یاد داشته باشید که قبل از ترک صفحه، دکمه‌ی **ذخیره** را بفشارید، در غیر این صورت تنظیمات شما از بین خواهد رفت.
diff --git a/lib/plugins/config/lang/fi/intro.txt b/lib/plugins/config/lang/fi/intro.txt
index f6eedb50c015238b3cf173405c0e22631eb47db8..2765a18afe19ef025a0ff5258408df190a5382a3 100644
--- a/lib/plugins/config/lang/fi/intro.txt
+++ b/lib/plugins/config/lang/fi/intro.txt
@@ -4,4 +4,4 @@ Käytä tätä sivua hallitaksesi DokuWikisi asetuksia. Apua yksittäisiin asetu
 
 Asetukset, jotka näkyvät vaaleanpunaisella taustalla ovat suojattuja, eikä niitä voi muutta tämän liitännäisen avulla. Asetukset, jotka näkyvät sinisellä taustalla ovat oletusasetuksia. Asetukset valkoisella taustalla ovat asetettu paikallisesti tätä asennusta varten. Sekä sinisiä että valkoisia asetuksia voi muokata.
 
-Muista painaa **TALLENNA**-nappia ennen kuin poistut sivulta. Muuten muutoksesi häviävät.
\ No newline at end of file
+Muista painaa **TALLENNA**-nappia ennen kuin poistut sivulta. Muuten muutoksesi häviävät.
diff --git a/lib/plugins/config/lang/fr/intro.txt b/lib/plugins/config/lang/fr/intro.txt
index 3d71f618488f12de0f93a1d284ce05a365dfab41..afc5805d8a9e9bc3420ee6bd62cc60c6e5278fe2 100644
--- a/lib/plugins/config/lang/fr/intro.txt
+++ b/lib/plugins/config/lang/fr/intro.txt
@@ -5,5 +5,3 @@ Utilisez cette page pour contrôler les paramètres de votre installation de Dok
 Les paramètres affichés sur un fond rouge sont protégés et ne peuvent être modifiés avec cette extension. Les paramètres affichés sur un fond bleu sont les valeurs par défaut et les valeurs spécifiquement définies pour votre installation sont affichées sur un fond blanc. Seuls les paramètres sur fond bleu ou blanc peuvent être modifiés.
 
 N'oubliez pas d'utiliser le bouton **ENREGISTRER** avant de quitter cette page, sinon vos modifications ne seront pas prises en compte !
-
-
diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php
index e92144b22fe7114a8fd11f8deff0b3b6d9666b4f..75dc4f1774d11fdf250c6ddc7cfbd986cdeaec87 100644
--- a/lib/plugins/config/lang/fr/lang.php
+++ b/lib/plugins/config/lang/fr/lang.php
@@ -94,7 +94,9 @@ $lang['disableactions']        = 'Actions à désactiver dans DokuWiki';
 $lang['disableactions_check']  = 'Vérifier';
 $lang['disableactions_subscription'] = 'Abonnement aux pages';
 $lang['disableactions_wikicode'] = 'Afficher le texte source';
+$lang['disableactions_profile_delete'] = 'Supprimer votre propre compte';
 $lang['disableactions_other']  = 'Autres actions (séparées par des virgules)';
+$lang['disableactions_rss']    = 'Syndication XML (RSS)';
 $lang['auth_security_timeout'] = 'Délai d\'expiration de sécurité (secondes)';
 $lang['securecookie']          = 'Les cookies définis via HTTPS doivent-ils n\'être envoyé par le navigateur que via HTTPS ? Désactivez cette option lorsque seule la connexion à votre wiki est sécurisée avec SSL et que la navigation sur le wiki est effectuée de manière non sécurisée.';
 $lang['remote']                = 'Active l\'API système distante. Ceci permet à d\'autres applications d\'accéder au wiki via XML-RPC ou d\'autres mécanismes.';
diff --git a/lib/plugins/config/lang/he/intro.txt b/lib/plugins/config/lang/he/intro.txt
index 010c69018d36dc3982554ccb2605d99c7f49f0f5..d61a93861ff6f8def21ceeea7f1f965228f2682f 100644
--- a/lib/plugins/config/lang/he/intro.txt
+++ b/lib/plugins/config/lang/he/intro.txt
@@ -5,5 +5,3 @@
 הגדרות עם רקע אדום-בהיר מוגנות ואין אפשרות לשנותן עם תוסף זה. הגדרות עם רקע כחול הן בעלות ערך ברירת המחדל והגדרות עם רקע לבן הוגדרו באופן מקומי עבור התקנה זו. ההגדרות בעלות הרקעים הכחול והלבן הן ברות שינוי.
 
 יש לזכור ללחוץ על כפתור ה**שמירה** טרם עזיבת דף זה פן יאבדו השינויים.
-
-
diff --git a/lib/plugins/config/lang/ia/intro.txt b/lib/plugins/config/lang/ia/intro.txt
index 37b970c4f935231a1f015c8b38029d58bf2193fe..eb2e105915ff740f3c7c08df34e9947a9450e399 100644
--- a/lib/plugins/config/lang/ia/intro.txt
+++ b/lib/plugins/config/lang/ia/intro.txt
@@ -4,4 +4,4 @@ Usa iste pagina pro controlar le configurationes de tu installation de DokuWiki.
 
 Le configurationes monstrate super un fundo rubie clar es protegite e non pote esser alterate con iste plug-in. Le configurationes monstrate super un fundo blau es le valores predefinite e le configurationes monstrate super un fundo blanc ha essite definite localmente pro iste particular installation. Le configurationes blau e blanc pote esser alterate.
 
-Rememora de premer le button **SALVEGUARDAR** ante de quitar iste pagina, alteremente tu modificationes essera perdite.
\ No newline at end of file
+Rememora de premer le button **SALVEGUARDAR** ante de quitar iste pagina, alteremente tu modificationes essera perdite.
diff --git a/lib/plugins/config/lang/it/intro.txt b/lib/plugins/config/lang/it/intro.txt
index 617e8c7b5f9baa0498baea0daad922e2ac74a2e8..02984baa7c0be4230d70e23478f698f3e26b4548 100644
--- a/lib/plugins/config/lang/it/intro.txt
+++ b/lib/plugins/config/lang/it/intro.txt
@@ -5,5 +5,3 @@ Usa questa pagina per gestire la configurazione della tua installazione DokuWiki
 Le impostazioni con lo sfondo rosso chiaro sono protette e non possono essere modificate con questo plugin. Le impostazioni con lo sfondo blu contengono i valori predefiniti, e le impostazioni con lo sfondo bianco sono relative solo a questa particolare installazione. Sia le impostazioni su sfondo blu che quelle su sfondo bianco possono essere modificate.
 
 Ricordati di premere il pulsante **SALVA** prima di lasciare questa pagina altrimenti le modifiche andranno perse.
-
-
diff --git a/lib/plugins/config/lang/ja/intro.txt b/lib/plugins/config/lang/ja/intro.txt
index 0c45471c6ce6194df42e77b58a9e8ded0736b75d..6a1f956cb4759c255659b10163402d9a12d774f3 100644
--- a/lib/plugins/config/lang/ja/intro.txt
+++ b/lib/plugins/config/lang/ja/intro.txt
@@ -5,5 +5,3 @@
 背景が薄い赤になっている場合、その設定は変更することが出来ません。 背景が青の値はデフォルト、背景が白の値は現在の設定となっており、 どちらの値も変更が可能です。
 
 設定の変更後は必ず **保存** ボタンを押して変更を確定してください。 ボタンを押さなかった場合、変更は破棄されます。
-
-
diff --git a/lib/plugins/config/lang/ko/intro.txt b/lib/plugins/config/lang/ko/intro.txt
index 979bbcb147643ec542388ceaf05d455e8d8e7a68..42240e3d747e21e16c6e453947cbb9dab4bca8c7 100644
--- a/lib/plugins/config/lang/ko/intro.txt
+++ b/lib/plugins/config/lang/ko/intro.txt
@@ -5,4 +5,3 @@
 밝은 빨간색 배경으로 보이는 설정은 이 플러그인에서 바꿀 수 없도록 보호되어 있습니다. 파란색 배경으로 보이는 설정은 기본값이며 하얀색 배경으로 보이는 설정은 특수한 설치를 위해 로컬로 설정되어 있습니다. 파란색과 하얀색 배경으로 된 설정은 바꿀 수 있습니다.
 
 이 페이지를 떠나기 전에 **저장** 버튼을 누르지 않으면 바뀜이 사라지는 것에 주의하세요.
-
diff --git a/lib/plugins/config/lang/la/intro.txt b/lib/plugins/config/lang/la/intro.txt
index 573d34ac1e42943f3c06ca3ed8b0e4da6dd2914f..51d8c3d711f7034a64cda573ec3504d95dd84a03 100644
--- a/lib/plugins/config/lang/la/intro.txt
+++ b/lib/plugins/config/lang/la/intro.txt
@@ -4,4 +4,4 @@ In hac pagina administratoris optiones mutare et inspicere potes. Auxilia in pag
 
 Optiones ostensae rubro colore tutae et non nunc mutabiles sunt. Optiones ostensae caeruleo colore praecipuae sunt et optiones ostensae in area alba singulares huic uici sunt. Et caerulae et albae optiones mutabiles sunt.
 
-Memento premere **SERVA** ante quam nouam paginam eas: si hoc non facias, mutata amissa sunt.
\ No newline at end of file
+Memento premere **SERVA** ante quam nouam paginam eas: si hoc non facias, mutata amissa sunt.
diff --git a/lib/plugins/config/lang/mr/intro.txt b/lib/plugins/config/lang/mr/intro.txt
index 12ada73a146c76f7fea7725d39df7bb1d7d73d6e..e068295e5aab88efbdcc14c2c15da54ed721271a 100644
--- a/lib/plugins/config/lang/mr/intro.txt
+++ b/lib/plugins/config/lang/mr/intro.txt
@@ -7,4 +7,4 @@
 निळ्या पार्श्वभूमीमधे दाखवलेले सेटिंग आपोआप सेट होणार्या किमती आहेत आणि पांढर्या पार्श्वभूमीमधे 
 दाखवलेले सेटिंग या इन्स्टॉलेशनसाठी ख़ास सेट केलेले आहेत. निळे आणि पांढरे दोन्ही सेटिंग बदलता येतील.
 
-ह्या पानावरून बाहर जाण्याआधी "Save" चे बटन क्लिक करायला विसरू नका नाहीतर सर्व बदल नाहीसे होतील.
\ No newline at end of file
+ह्या पानावरून बाहर जाण्याआधी "Save" चे बटन क्लिक करायला विसरू नका नाहीतर सर्व बदल नाहीसे होतील.
diff --git a/lib/plugins/config/lang/nl/intro.txt b/lib/plugins/config/lang/nl/intro.txt
index 3814b70bdf139c26558b1a2fe6b440beea9ebe53..4d72b695da1922ebde4292e58b5c3d79e63fe2ef 100644
--- a/lib/plugins/config/lang/nl/intro.txt
+++ b/lib/plugins/config/lang/nl/intro.txt
@@ -5,5 +5,3 @@ Gebruik deze pagina om de instellingen van je DokuWiki te bekijken en/of te wijz
 Instellingen met een rode achtergond kunnen niet worden gewijzigd met deze plugin. Instellingen met een blauwe achtergrond hebben de default waarde, en instellingen met een witte achtergrond zijn lokaal gewijzigd voor deze specifieke installatie. Zowel blauwe als witte instellingen kunnen worden gewijzigd.
 
 Vergeet niet op **Opslaan** te drukken alvorens de pagina te verlaten, anders gaan je wijzigingen verloren.
-
-
diff --git a/lib/plugins/config/lang/pl/intro.txt b/lib/plugins/config/lang/pl/intro.txt
index 72c0e1c13bb84a0842454aba321bc28c819c034c..9d85c7a7ccd99066502010d052f868926d4b7540 100644
--- a/lib/plugins/config/lang/pl/intro.txt
+++ b/lib/plugins/config/lang/pl/intro.txt
@@ -5,5 +5,3 @@ Na tej stronie można zmienić ustawienia tej instalacji DokuWiki. W celu uzyska
 Ustawienia w kolorze jasnoczerwonym są chronione i nie mogą być zmienioną z użyciem tej wtyczki. Ustawienia w kolorze niebieskim mają domyślne wartości. Ustawienia w kolorze białym są specyficzne dla tej instalacji. Ustawienia w kolorach niebieskim i białym mogą być zmienione.
 
 W celu zapisania nowej konfiguracji naciśnij **zapisz** przed opuszczeniem tej strony.
-
-
diff --git a/lib/plugins/config/lang/pt-br/intro.txt b/lib/plugins/config/lang/pt-br/intro.txt
index 850ba25cb7e4363f58e7e8a1cdb2634b2db23d58..db31de4cf2e72c685c2b57f6c5a68c205e90ec1f 100644
--- a/lib/plugins/config/lang/pt-br/intro.txt
+++ b/lib/plugins/config/lang/pt-br/intro.txt
@@ -4,4 +4,4 @@ Use essa página para controlar as configurações da instalação do seu DokuWi
 
 Definições que apresentem um fundo vermelho claro são protegidas e não podem ser alteradas com esse plug-in. As definições com um fundo azul são o padrão e as com um fundo branco foram configuradas localmente para essa instalação em particular. Tanto as definições em azul quanto as em branco podem ser alteradas.
 
-Lembre-se de pressionar o botão **Salvar** antes de sair dessa página, caso contrário, suas configurações serão perdidas.
\ No newline at end of file
+Lembre-se de pressionar o botão **Salvar** antes de sair dessa página, caso contrário, suas configurações serão perdidas.
diff --git a/lib/plugins/config/lang/pt/intro.txt b/lib/plugins/config/lang/pt/intro.txt
index 2010dadafa50eec22a952a6a03b5b8c5cbb7456c..06a68c4750c866f016b967dfdeb53377701538d8 100644
--- a/lib/plugins/config/lang/pt/intro.txt
+++ b/lib/plugins/config/lang/pt/intro.txt
@@ -4,4 +4,4 @@ Use esta página para controlar as definições da instalação do seu DokuWiki.
 
 Definições que apresentem um fundo vermelho claro são protegidas e não podem ser alteradas com este plugin. Definições com um fundo azul são padrão e definições com um fundo branco foram configuradas localmente para essa instalação em particular. Tanto as definições em azul como em branco podem ser alteradas.
 
-Lembre-se de pressionar o botão **Guardar** antes de sair desta página, caso contrário, as suas definições serão perdidas.
\ No newline at end of file
+Lembre-se de pressionar o botão **Guardar** antes de sair desta página, caso contrário, as suas definições serão perdidas.
diff --git a/lib/plugins/config/lang/ru/intro.txt b/lib/plugins/config/lang/ru/intro.txt
index a629d9332ce071b17b802b14aa6fb94311488adf..f30d4c79178644b2184c349f8c6b153698fbba0e 100644
--- a/lib/plugins/config/lang/ru/intro.txt
+++ b/lib/plugins/config/lang/ru/intro.txt
@@ -5,5 +5,3 @@
 Настройки, отображаемые на светло-красном фоне, защищены от изменений и не могут быть отредактированы с помощью этого плагина.  Голубым фоном отмечены настройки со значениями по умолчанию, а белым фоном — настройки, которые были локально изменены для этой конкретной «ДокуВики». Как голубые, так и белые настройки доступны для изменения.
 
 Не забудьте нажать кнопку «**Сохранить**» перед тем, как покинуть эту страницу, иначе все ваши изменения будут потеряны.
-
-
diff --git a/lib/plugins/config/lang/sk/intro.txt b/lib/plugins/config/lang/sk/intro.txt
index 5de62a3152fbaf5d3a0213f9f6b68f7ab657855a..a3d15bf93ce72a883abc14ca2f6a9befe3804272 100644
--- a/lib/plugins/config/lang/sk/intro.txt
+++ b/lib/plugins/config/lang/sk/intro.txt
@@ -4,4 +4,4 @@ Túto stránku môžete používať na zmenu nastavení Vašej DokuWiki inštal
 
 Nastavenia zobrazené na červenom pozadí sú neprístupné a nemôžu byť týmto pluginom zmenené. Nastavenia s modrým pozadím obsahujú prednastavené hodnoty a nastavenia s bielym pozadím boli nastavené lokálne pre túto konkrétnu inštaláciu. Nastavenia s modrým a bielym pozadím môžu byť zmenené.
 
-Nezabudnite stlačiť tlačidlo **Uložiť** pred opustením stránky, inak budú vaše zmeny stratené.
\ No newline at end of file
+Nezabudnite stlačiť tlačidlo **Uložiť** pred opustením stránky, inak budú vaše zmeny stratené.
diff --git a/lib/plugins/config/lang/sq/intro.txt b/lib/plugins/config/lang/sq/intro.txt
index 687b497c9c5500da1efcc37c9ec431ebd5878af8..d2bab0fd562c925e985c7696de6cfbdb02b9087a 100644
--- a/lib/plugins/config/lang/sq/intro.txt
+++ b/lib/plugins/config/lang/sq/intro.txt
@@ -4,4 +4,4 @@ Përdoreni këtë faqe për të kontrolluar kuadrot e instalimit të DokuWiki-t
 
 Kuadrot e treguara me një backgroudn me një ngjyrë të kuqe të lehtë janë të mbrojtura dhe nuk mund të ndryshohen me këtë plugin. Kuadrot e treguara me një background blu janë vlerat default dhe kuadrot e treguara me një background të bardhë janë vendosur lokalisht për këtë instalim të caktuar. Si kuadrot blu, ashtu edhe ato të bardhë mund të ndryshohen.
 
-Kujtohuni të shtypni butonin **Ruaj** para se të dilni nga kjo faqe ose ndryshimet tuaja do të humbasin.
\ No newline at end of file
+Kujtohuni të shtypni butonin **Ruaj** para se të dilni nga kjo faqe ose ndryshimet tuaja do të humbasin.
diff --git a/lib/plugins/config/lang/sv/intro.txt b/lib/plugins/config/lang/sv/intro.txt
index 8887d4a7bd6f57978732a97d0e6aac44597a4172..fd77634c2b0c936c958cb5c7019707c9dd34eed8 100644
--- a/lib/plugins/config/lang/sv/intro.txt
+++ b/lib/plugins/config/lang/sv/intro.txt
@@ -5,5 +5,3 @@ Använd den här sidan för att göra inställningar i din Dokuwiki. För hjälp
 Inställningar med en rosa bakgrund är skyddade och kan inte ändras med den här insticksmodulen. Inställningar med en blå bakgrund är standardvärden, och inställningar som visas med en vit bakgrund har ändrats i den här installationen. Både blåa och vita inställningar kan ändras.
 
 Kom i håg att trycka på knappen **Spara** innan du lämnar den här sidan, annars kommer ändringarna att gå förlorade.
-
-
diff --git a/lib/plugins/config/lang/tr/intro.txt b/lib/plugins/config/lang/tr/intro.txt
index 4a965422224afd8031113f95d4026a2af6667e21..2602fb3eda9fb007fc094dfd532b36216fb430f3 100644
--- a/lib/plugins/config/lang/tr/intro.txt
+++ b/lib/plugins/config/lang/tr/intro.txt
@@ -4,4 +4,4 @@ Bu sayfayı DokuWiki kurulumunun ayarlarını değiştirmek için kullanabilirsi
 
 Açık kırmızı renkle gösterilenler bu eklenti ile değiştirilemez. Mavi ile gösterilenler varsayılan değerlerdir. Beyaz altyazı ile gösterilenler is bu kuruluma özel değiştirilmiş ayarlardır. Mavi ve beyaz ayarlar değiştirilebilir.
 
-Değişiklik yapmanız durumunda **Kaydet** tuşuna basmayı unutmayınız. Aksi takdirde sayfayı kapattığınızda tüm ayarlar silinecektir.
\ No newline at end of file
+Değişiklik yapmanız durumunda **Kaydet** tuşuna basmayı unutmayınız. Aksi takdirde sayfayı kapattığınızda tüm ayarlar silinecektir.
diff --git a/lib/plugins/config/lang/zh-tw/intro.txt b/lib/plugins/config/lang/zh-tw/intro.txt
index 228c12e0abbceafaac8c7d55448d6f916d203e2e..e131ec342d20e405da5b0dfa08da48fe9874cee1 100644
--- a/lib/plugins/config/lang/zh-tw/intro.txt
+++ b/lib/plugins/config/lang/zh-tw/intro.txt
@@ -4,4 +4,4 @@
 
 淡紅色背景的項目是受到保護的,不能通過這管理器更改。藍色背景的項目是系統的預設值,白色背景的項目是您更改過的。藍色和白色的設定項目都可以更改。
 
-離開本頁之前,不要忘記點擊最下面的 **儲存** 按鈕,否則您的修改不會生效。
\ No newline at end of file
+離開本頁之前,不要忘記點擊最下面的 **儲存** 按鈕,否則您的修改不會生效。
diff --git a/lib/plugins/config/lang/zh-tw/lang.php b/lib/plugins/config/lang/zh-tw/lang.php
index cc2c28c31084c1437f0c6ea6e5d26f071a120cee..c586a0d5110a726eb1adde6561ffb932dc5a3640 100644
--- a/lib/plugins/config/lang/zh-tw/lang.php
+++ b/lib/plugins/config/lang/zh-tw/lang.php
@@ -137,7 +137,7 @@ $lang['gzip_output']           = '對 xhtml 使用 gzip 內容編碼';
 $lang['compress']              = '壓縮 CSS 與 JavaScript 的輸出';
 $lang['cssdatauri']            = '假如 CSS 中所引用的圖片小於該數字大小(bytes),圖片將被直接嵌入 CSS 中,以減少 HTTP Request 的發送。 IE 7 及以下的版本並不支援此功能。推薦把此數值設定成 <code>400</code> 至 <code>600</code> bytes 之間。若輸入 <code>0</code> 則停用此功能。';
 $lang['send404']               = '存取不存在的頁面時送出 "HTTP 404/Page Not Found"';
-$lang['broken_iua']            = 'ignore_user_abort 功能失效了?這有可能導致搜索索引不可用。IIS+PHP/CGI 已損壞。請參閱 <a href=\"http://bugs.splitbrain.org/?do=details&task_id=852\">Bug 852</a> 獲取更多訊息。';
+$lang['broken_iua']            = 'ignore_user_abort 功能失效了?這有可能導致搜索索引不可用。IIS+PHP/CGI 已損壞。請參閱 <a href=\"http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> 獲取更多訊息。';
 $lang['xsendfile']             = '使用 X-Sendfile 頭讓網頁伺服器發送狀態文件?您的網頁伺服器需要支持該功能。';
 $lang['renderer_xhtml']        = '主要 wiki 輸出 (xhtml) 的渲染器';
 $lang['renderer__core']        = '%s (dokuwiki 核心)';
diff --git a/lib/plugins/config/lang/zh/intro.txt b/lib/plugins/config/lang/zh/intro.txt
index a7db4eda0f4ea03d359b32c92a1adef4ddb60bc5..30cb650042c8bceb046eb0bd019cfdcc49a64e49 100644
--- a/lib/plugins/config/lang/zh/intro.txt
+++ b/lib/plugins/config/lang/zh/intro.txt
@@ -5,5 +5,3 @@
 淡红色背景的项目被保护,不能通过这个管理器更改。 蓝色背景的项目是系统的默认值,白色背景的项目是您作出更改的项目。蓝色和白色的设置项目都可以更改。
 
 离开本页之前不要忘记点击最后的 **保存** 按钮,否则您做的修改不会生效。
-
-
diff --git a/lib/plugins/config/settings/extra.class.php b/lib/plugins/config/settings/extra.class.php
index c6a3f9dae52536dfdf02bcdc0b8e399b279ad822..2445577d1288ae91e933c571b5b56edb7a2c6e10 100644
--- a/lib/plugins/config/settings/extra.class.php
+++ b/lib/plugins/config/settings/extra.class.php
@@ -15,7 +15,7 @@ if (!class_exists('setting_sepchar')) {
          * @param string $key
          * @param array|null $param array with metadata of setting
          */
-        function setting_sepchar($key,$param=null) {
+        function __construct($key,$param=null) {
             $str = '_-.';
             for ($i=0;$i<strlen($str);$i++) $this->_choices[] = $str{$i};
 
diff --git a/lib/plugins/extension/helper/list.php b/lib/plugins/extension/helper/list.php
index 11aea1d0ebb3e3728b8ed7432abe051a4c144a63..bf099d3082261534fcd52cbcce1661fbf4ec7e39 100644
--- a/lib/plugins/extension/helper/list.php
+++ b/lib/plugins/extension/helper/list.php
@@ -535,7 +535,7 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
         $classes = 'button '.$action;
         $name    = 'fn['.$action.']['.hsc($extension->getID()).']';
 
-        return '<input class="'.$classes.'" name="'.$name.'" type="submit" value="'.$this->getLang('btn_'.$action).'" '.$title.' />';
+        return '<button class="'.$classes.'" name="'.$name.'" type="submit" '.$title.'>'.$this->getLang('btn_'.$action).'</button> ';
     }
 
     /**
diff --git a/lib/plugins/extension/lang/cs/lang.php b/lib/plugins/extension/lang/cs/lang.php
index dc38afd52ad018e11729ac67e78d9f76e3156e1f..d48c517cf9d3fa724f9484a24272e76128fbd8ff 100644
--- a/lib/plugins/extension/lang/cs/lang.php
+++ b/lib/plugins/extension/lang/cs/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Viktor Zavadil <vzavadil@newps.cz>
  * @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
  */
@@ -62,7 +62,7 @@ $lang['status_template']       = 'Å¡ablona';
 $lang['status_bundled']        = 'svázaný';
 $lang['msg_enabled']           = 'Zásuvný modul %s povolen';
 $lang['msg_disabled']          = 'Zásuvný modul %s zakázán';
-$lang['msg_delete_success']    = 'Rozšíření odinstalováno';
+$lang['msg_delete_success']    = 'Rozšíření %s odinstalováno';
 $lang['msg_delete_failed']     = 'Odinstalování rozšíření %s selhalo';
 $lang['msg_template_install_success'] = 'Šablona %s úspěšně nainstalována';
 $lang['msg_template_update_success'] = 'Šablona %s úspěšně aktualizována';
diff --git a/lib/plugins/extension/lang/de/lang.php b/lib/plugins/extension/lang/de/lang.php
index ef31975138b0a5b54f9b8bb31846834b2f6f5263..a47c9360f65d1e02d7b238d403048cb3c0b0bcfe 100644
--- a/lib/plugins/extension/lang/de/lang.php
+++ b/lib/plugins/extension/lang/de/lang.php
@@ -9,6 +9,7 @@
  * @author Hoisl <hoisl@gmx.at>
  * @author Dominik Mahr <drache.mahr@gmx.de>
  * @author Noel Tilliot <noeltilliot@byom.de>
+ * @author Philip Knack <p.knack@stollfuss.de>
  */
 $lang['menu']                  = 'Erweiterungen verwalten';
 $lang['tab_plugins']           = 'Installierte Plugins';
@@ -33,6 +34,7 @@ $lang['js']['reallydel']       = 'Wollen Sie diese Erweiterung wirklich löschen
 $lang['js']['display_viewoptions'] = 'Optionen anzeigen';
 $lang['js']['display_enabled'] = 'aktiviert';
 $lang['js']['display_disabled'] = 'deaktiviert';
+$lang['js']['display_updatable'] = 'aktualisierbar';
 $lang['search_for']            = 'Erweiterung suchen:';
 $lang['search']                = 'Suchen';
 $lang['extensionby']           = '<strong>%s</strong> von %s';
@@ -69,7 +71,8 @@ $lang['status_template']       = 'Template';
 $lang['status_bundled']        = 'gebündelt';
 $lang['msg_enabled']           = 'Plugin %s ist aktiviert';
 $lang['msg_disabled']          = 'Erweiterung %s ist deaktiviert';
-$lang['msg_delete_success']    = 'Erweiterung wurde entfernt';
+$lang['msg_delete_success']    = 'Erweiterung %s wurde entfernt';
+$lang['msg_delete_failed']     = 'Deinstallation der Erweiterung %s fehlgeschlagen';
 $lang['msg_template_install_success'] = 'Das Template %s wurde erfolgreich installiert';
 $lang['msg_template_update_success'] = 'Das Update des Templates %s war erfolgreich ';
 $lang['msg_plugin_install_success'] = 'Das Plugin %s wurde erfolgreich installiert';
@@ -91,6 +94,8 @@ $lang['noperms']               = 'Das Erweiterungs-Verzeichnis ist schreibgesch
 $lang['notplperms']            = 'Das Template-Verzeichnis ist schreibgeschützt';
 $lang['nopluginperms']         = 'Das Plugin-Verzeichnis ist schreibgeschützt';
 $lang['git']                   = 'Diese Erweiterung wurde über git installiert und sollte daher nicht hier aktualisiert werden.';
+$lang['auth']                  = 'Dieses Auth Plugin ist in der Konfiguration nicht aktiviert, Sie sollten es deaktivieren.';
 $lang['install_url']           = 'Von Webadresse (URL) installieren';
 $lang['install_upload']        = 'Erweiterung hochladen:';
 $lang['repo_error']            = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stellen sie sicher das der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfen sie ihre Proxy Einstellungen.';
+$lang['nossl']                 = 'Ihr PHP scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki Erweiterungen wird scheitern.';
diff --git a/lib/plugins/extension/lang/eo/lang.php b/lib/plugins/extension/lang/eo/lang.php
index 6ce840be8bdce2b9f748b84b3ebc916b1f899772..e0488cb46446ea43d4c9a8e8f8cdcac6ff036d3b 100644
--- a/lib/plugins/extension/lang/eo/lang.php
+++ b/lib/plugins/extension/lang/eo/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Robert Bogenschneider <bogi@uea.org>
  */
 $lang['menu']                  = 'Aldonaĵa administrado';
@@ -61,7 +61,7 @@ $lang['status_template']       = 'ŝablono';
 $lang['status_bundled']        = 'kunliverita';
 $lang['msg_enabled']           = 'Kromaĵo %s ebligita';
 $lang['msg_disabled']          = 'Kromaĵo %s malebligita';
-$lang['msg_delete_success']    = 'Aldonaĵo malinstaliĝis';
+$lang['msg_delete_success']    = 'Aldonaĵo %s malinstaliĝis';
 $lang['msg_template_install_success'] = 'Ŝablono %s sukcese instaliĝis';
 $lang['msg_template_update_success'] = 'Ŝablono %s sukcese aktualiĝis';
 $lang['msg_plugin_install_success'] = 'Kromaĵo %s sukcese instaliĝis';
diff --git a/lib/plugins/extension/lang/es/lang.php b/lib/plugins/extension/lang/es/lang.php
index a835cb630444d69ec7c024861ebdd7a8cd7da4ba..9e3d243189d4f8523a5f19b4b07737d22ad703c9 100644
--- a/lib/plugins/extension/lang/es/lang.php
+++ b/lib/plugins/extension/lang/es/lang.php
@@ -2,11 +2,12 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Antonio Bueno <atnbueno@gmail.com>
  * @author Antonio Castilla <antoniocastilla@trazoide.com>
  * @author Jonathan Hernández <me@jhalicea.com>
  * @author Álvaro Iradier <airadier@gmail.com>
+ * @author Mauricio Segura <maose38@yahoo.es>
  */
 $lang['menu']                  = 'Administrador de Extensiones ';
 $lang['tab_plugins']           = 'Plugins instalados';
@@ -28,6 +29,10 @@ $lang['btn_disable']           = 'Desactivar';
 $lang['btn_install']           = 'Instalar';
 $lang['btn_reinstall']         = 'Reinstalar';
 $lang['js']['reallydel']       = '¿Realmente quiere desinstalar esta extensión?';
+$lang['js']['display_viewoptions'] = 'Ver opciones:';
+$lang['js']['display_enabled'] = 'habilitado';
+$lang['js']['display_disabled'] = 'deshabilitado';
+$lang['js']['display_updatable'] = 'actualizable';
 $lang['search_for']            = 'Extensión de búsqueda :';
 $lang['search']                = 'Buscar';
 $lang['extensionby']           = '<strong>%s</strong> por %s';
@@ -64,7 +69,7 @@ $lang['status_template']       = 'plantilla';
 $lang['status_bundled']        = 'agrupado';
 $lang['msg_enabled']           = 'Plugin %s activado';
 $lang['msg_disabled']          = 'Plugin %s desactivado';
-$lang['msg_delete_success']    = 'Extensión desinstalada';
+$lang['msg_delete_success']    = 'Extensión %s desinstalada';
 $lang['msg_delete_failed']     = 'La desinstalación de la extensión %s ha fallado';
 $lang['msg_template_install_success'] = 'Plantilla %s instalada con éxito';
 $lang['msg_template_update_success'] = 'Plantilla %s actualizada con éxito';
diff --git a/lib/plugins/extension/lang/hu/lang.php b/lib/plugins/extension/lang/hu/lang.php
index a27b5a3079f12279ece6fc9e3711e362afc867ef..28194ad9d58fcdf186131321c08e1c46f1ca497c 100644
--- a/lib/plugins/extension/lang/hu/lang.php
+++ b/lib/plugins/extension/lang/hu/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Marton Sebok <sebokmarton@gmail.com>
  */
 $lang['menu']                  = 'Bővítménykezelő';
@@ -61,7 +61,7 @@ $lang['status_template']       = 'sablon';
 $lang['status_bundled']        = 'beépített';
 $lang['msg_enabled']           = 'A(z) %s modul engedélyezve';
 $lang['msg_disabled']          = 'A(z) %s modul letiltva';
-$lang['msg_delete_success']    = 'A bővítmény törölve';
+$lang['msg_delete_success']    = 'A bővítmény %s törölve';
 $lang['msg_template_install_success'] = 'A(z) %s sablon sikeresen telepítve';
 $lang['msg_template_update_success'] = 'A(z) %s sablon sikeresen frissítve';
 $lang['msg_plugin_install_success'] = 'A(z) %s modul sikeresen telepítve';
diff --git a/lib/plugins/extension/lang/ja/lang.php b/lib/plugins/extension/lang/ja/lang.php
index 42334c767d37a668f6381af539c38307326df98d..689a9877ef741a8f72b76266e65aec6e955d1a20 100644
--- a/lib/plugins/extension/lang/ja/lang.php
+++ b/lib/plugins/extension/lang/ja/lang.php
@@ -28,6 +28,7 @@ $lang['btn_disable']           = '無効化';
 $lang['btn_install']           = 'インストール';
 $lang['btn_reinstall']         = '再インストール';
 $lang['js']['reallydel']       = 'この拡張機能を本当にアンインストールしますか?';
+$lang['js']['display_viewoptions'] = '表示オプション: ';
 $lang['js']['display_enabled'] = '有効';
 $lang['js']['display_disabled'] = '無効';
 $lang['js']['display_updatable'] = '更新可能';
diff --git a/lib/plugins/extension/lang/ko/lang.php b/lib/plugins/extension/lang/ko/lang.php
index 3de28c0c8378eeb903a3e133f278138e85d6b42f..31b230b535229293c2f51a7fe4a2fdfe875c33e8 100644
--- a/lib/plugins/extension/lang/ko/lang.php
+++ b/lib/plugins/extension/lang/ko/lang.php
@@ -28,8 +28,9 @@ $lang['btn_install']           = '설치';
 $lang['btn_reinstall']         = '다시 설치';
 $lang['js']['reallydel']       = '정말 이 확장 기능을 제거하겠습니까?';
 $lang['js']['display_viewoptions'] = '보기 옵션:';
-$lang['js']['display_enabled'] = '켜짐';
-$lang['js']['display_disabled'] = '꺼짐';
+$lang['js']['display_enabled'] = '활성화됨';
+$lang['js']['display_disabled'] = '비활성화됨';
+$lang['js']['display_updatable'] = '업데이트할 수 있음';
 $lang['search_for']            = '확장 기능 검색:';
 $lang['search']                = '검색';
 $lang['extensionby']           = '<strong>%s</strong> (저자 %s)';
diff --git a/lib/plugins/extension/lang/lv/lang.php b/lib/plugins/extension/lang/lv/lang.php
index e7e9bdfd9a1206a86a72129c74748f2d2fbe946a..b3e5ce0d24269c4650276c53f3cd96c5d04928b0 100644
--- a/lib/plugins/extension/lang/lv/lang.php
+++ b/lib/plugins/extension/lang/lv/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Aivars Miška <allefm@gmail.com>
  */
-$lang['msg_delete_success']    = 'Papildinājums atinstalēts';
+$lang['msg_delete_success']    = 'Papildinājums %s atinstalēts';
diff --git a/lib/plugins/extension/lang/pl/lang.php b/lib/plugins/extension/lang/pl/lang.php
index 4fdca79c9caca2c538744cc84e7cce18b1266250..ab9a818b6d5bc007651d3288eb1b61e1e12185b1 100644
--- a/lib/plugins/extension/lang/pl/lang.php
+++ b/lib/plugins/extension/lang/pl/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Mati <mackosa@wp.pl>
  */
 $lang['menu']                  = 'Menedżer rozszerzeń';
@@ -36,4 +36,4 @@ $lang['status_not_installed']  = 'nie zainstalowano';
 $lang['status_enabled']        = 'uruchomione';
 $lang['status_disabled']       = 'wyłączone';
 $lang['status_plugin']         = 'dodatek';
-$lang['msg_delete_success']    = 'Rozszerzenie odinstalowane';
+$lang['msg_delete_success']    = 'Rozszerzenie %s odinstalowane';
diff --git a/lib/plugins/extension/lang/pt-br/lang.php b/lib/plugins/extension/lang/pt-br/lang.php
index 47286389f18c8666e5ca605d4f1bd289c78f5079..823900acfabcf8ea50e33bbd092329aecd8660d0 100644
--- a/lib/plugins/extension/lang/pt-br/lang.php
+++ b/lib/plugins/extension/lang/pt-br/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Felipe Castro <fefcas@gmail.com>
  * @author Hudson FAS <hudsonfas@gmail.com>
  */
@@ -62,8 +62,8 @@ $lang['status_template']       = 'modelo';
 $lang['status_bundled']        = 'agrupado';
 $lang['msg_enabled']           = 'Extensão %s habilitada';
 $lang['msg_disabled']          = 'Extensão %s desabilitada';
-$lang['msg_delete_success']    = 'Extensão desinstalada';
-$lang['msg_delete_failed']     = 'Falha na desinstala&ccedil;&atilde;o da extens&atilde;o';
+$lang['msg_delete_success']    = 'Extensão %s desinstalada';
+$lang['msg_delete_failed']     = 'Falha na desinstalação da extensão %s';
 $lang['msg_template_install_success'] = 'Modelo %s instalado com sucesso';
 $lang['msg_template_update_success'] = 'Modelo %s atualizado com sucesso';
 $lang['msg_plugin_install_success'] = 'Extensão %s instalada com sucesso';
@@ -75,18 +75,18 @@ $lang['security_warning']      = '<strong>Aviso sobre segurança:</strong> %s';
 $lang['update_available']      = '<strong>Atualização:</strong> Nova versão %s está disponível.';
 $lang['wrong_folder']          = '<strong>Extensão instalada incorretamente:</strong> Renomeie o diretório de extensões "%s" para "%s".';
 $lang['url_change']            = '<strong>URL mudou:</strong> A URL para baixar mudou desde a última baixada. Verifique se a nova URL é válida antes de atualizar a extensão.<br />Novo: %s<br />Velho: %s';
-$lang['error_badurl']          = 'O URL deve come&ccedil;ar com http ou https';
-$lang['error_dircreate']       = 'Imposs&iacute;vel criar pasta tempor&aacute;ria para receber o download';
-$lang['error_download']        = 'Imposs&aacute;vel baixar o arquivo: %s';
-$lang['error_decompress']      = 'Imposs&aacute;vel descompimir o arquivo baixado. Isso pode ser resultado de um download ruim que neste caso pode ser tentado novamente; ou o formato da compress&atilde;o pode ser desconhecido, neste caso baixe e instale manualmente.';
-$lang['error_findfolder']      = 'Imposs&iacute;l identificar a extens&atilde;o do diret&oacute;rio, voc&ecirc; deve baixar e instalar manualmente.';
-$lang['error_copy']            = 'Houve um erro de c&oacute;pia de arquivo durante a tentativa de instalar os arquivos para o diret&oacute;rio <em>%s</ em> : o disco pode estar cheio ou as permiss&otilde;es de acesso ao arquivo podem estar incorreta. Isso pode ter resultado em um plugin parcialmente instalado e deixar a sua instala&ccedil;&atilde;o wiki inst&aacute;vel';
-$lang['noperms']               = 'Diret&oacute;rio de extens&atilde;o n&atilde;o &eacute; grav&aacute;vel';
-$lang['notplperms']            = 'Diret&oacute;rio de modelo (Template) n&atilde;o &eacute; grav&aacute;vel';
-$lang['nopluginperms']         = 'Diret&oacute;rio de plugin n&atilde;o &eacute; grav&aacute;vel';
-$lang['git']                   = 'A extens&atilde;o foi instalada via git, voc&ecirc; talvez n&atilde;o queira atualiz&aacute;-lo aqui.';
-$lang['auth']                  = 'O plugin auth n&atilde;o est&aacute; ativado na configura&ccedil;&atilde;o, considere desativ&aacute-lo.';
+$lang['error_badurl']          = 'O URL deve começar com http ou https';
+$lang['error_dircreate']       = 'Impossível criar pasta temporária para receber o download';
+$lang['error_download']        = 'Impossável baixar o arquivo: %s';
+$lang['error_decompress']      = 'Impossável descompimir o arquivo baixado. Isso pode ser resultado de um download ruim que neste caso pode ser tentado novamente; ou o formato da compressão pode ser desconhecido, neste caso baixe e instale manualmente.';
+$lang['error_findfolder']      = 'Impossíl identificar a extensão do diretório, você deve baixar e instalar manualmente.';
+$lang['error_copy']            = 'Houve um erro de cópia de arquivo durante a tentativa de instalar os arquivos para o diretório <em>%s</em> : o disco pode estar cheio ou as permissões de acesso ao arquivo podem estar incorreta. Isso pode ter resultado em um plugin parcialmente instalado e deixar a sua instalação wiki instável';
+$lang['noperms']               = 'Diretório de extensão não é gravável';
+$lang['notplperms']            = 'Diretório de modelo (Template) não é gravável';
+$lang['nopluginperms']         = 'Diretório de plugin não é gravável';
+$lang['git']                   = 'A extensão foi instalada via git, você talvez não queira atualizá-lo aqui.';
+$lang['auth']                  = 'O plugin auth não está ativado na configuração, considere desativá-lo.';
 $lang['install_url']           = 'Instale a partir do URL:';
-$lang['install_upload']        = 'Publicar Extens&atilde;o:';
+$lang['install_upload']        = 'Publicar Extensão:';
 $lang['repo_error']            = 'O repositório de plugin não pode ser contactado. Certifique-se de que o servidor pode acessar www.dokuwiki.org e confira suas configurações de proxy.';
 $lang['nossl']                 = 'Sua instalação PHP parece que não suporta SSL. Algumas extensões DokuWiki não serão baixadas.';
diff --git a/lib/plugins/extension/lang/pt/intro_templates.txt b/lib/plugins/extension/lang/pt/intro_templates.txt
index ecdf99f17886d6fec5f466398bbf2179a7494263..02bc3364384a3512bbc23bdd99b5291a76de5617 100644
--- a/lib/plugins/extension/lang/pt/intro_templates.txt
+++ b/lib/plugins/extension/lang/pt/intro_templates.txt
@@ -1 +1 @@
-Estes são os modelos atualmente instalados em seu DokuWiki. Você pode selecionar o modelo a ser usado no [[Do = admin & page = configuração |? Configuration Manager]].
\ No newline at end of file
+Estes são os modelos atualmente instalados em seu DokuWiki. Você pode selecionar o modelo a ser usado no [[?do=admin&page=config|Configuration Manager]].
diff --git a/lib/plugins/extension/lang/pt/lang.php b/lib/plugins/extension/lang/pt/lang.php
index c9ca8d9769c774e2f6d9fd47c0c3ddaeb6d14b8f..e8c8a7d5539bfb0b9cec0477ef8c0e8314b6cb30 100644
--- a/lib/plugins/extension/lang/pt/lang.php
+++ b/lib/plugins/extension/lang/pt/lang.php
@@ -2,7 +2,7 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Guido Salatino <guidorafael23@gmail.com>
  * @author Romulo Pereira <romuloccomp@gmail.com>
  */
@@ -41,7 +41,7 @@ $lang['downloadurl']           = 'Baixar URL:
 ';
 $lang['repository']            = 'Repositório:
 ';
-$lang['unknown']               = '<em> desconhecido </ em>
+$lang['unknown']               = '<em> desconhecido </em>
 ';
 $lang['installed_version']     = 'Versão instalada:';
 $lang['install_date']          = 'Sua última atualização:';
diff --git a/lib/plugins/extension/lang/ru/lang.php b/lib/plugins/extension/lang/ru/lang.php
index 4b25424202bd75ab18b5fb1b1299f2a7d643ec85..71d949606768c9d0fa64406b6c16a5fc9650768e 100644
--- a/lib/plugins/extension/lang/ru/lang.php
+++ b/lib/plugins/extension/lang/ru/lang.php
@@ -2,94 +2,111 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
  * @author Igor Degraf <igordegraf@gmail.com>
  * @author Type-kun <workwork-1@yandex.ru>
  * @author Vitaly Filatenko <kot@hacktest.net>
  * @author Alex P <alexander@lanos.co.uk>
+ * @author Takumo <9206984@mail.ru>
  */
-$lang['menu']                  = 'Управление дополнениями';
-$lang['tab_plugins']           = 'Установленные плагины';
-$lang['tab_templates']         = 'Установленные шаблоны';
-$lang['tab_search']            = 'Поиск и установка';
-$lang['tab_install']           = 'Ручная установка';
-$lang['notimplemented']        = 'Эта возможность ещё не реализована';
-$lang['notinstalled']          = 'Это дополнение не установлено';
-$lang['alreadyenabled']        = 'Это расширение уже включено';
-$lang['alreadydisabled']       = 'Это расширение уже выключено';
-$lang['pluginlistsaveerror']   = 'Ошибка при сохранении списка плагинов';
-$lang['unknownauthor']         = 'Автор неизвестен';
-$lang['unknownversion']        = 'Версия неизвестна';
-$lang['btn_info']              = 'Отобразить доп. информацию';
-$lang['btn_update']            = 'Обновить';
-$lang['btn_uninstall']         = 'Удалить';
-$lang['btn_enable']            = 'Включить';
-$lang['btn_disable']           = 'Отключить';
-$lang['btn_install']           = 'Установить';
-$lang['btn_reinstall']         = 'Переустановить';
-$lang['js']['reallydel']       = 'Действительно удалить это дополнение?';
-$lang['search_for']            = 'Поиск дополнения:';
-$lang['search']                = 'Найти';
-$lang['extensionby']           = '<strong>%s</strong> — %s';
-$lang['screenshot']            = 'Скриншот: %s';
-$lang['popularity']            = 'Популярность: %s%%';
-$lang['homepage_link']         = 'Описание';
-$lang['bugs_features']         = 'Баг-трекер';
-$lang['tags']                  = 'Метки:';
-$lang['author_hint']           = 'Найти дополнения автора';
-$lang['installed']             = 'Установлено:';
-$lang['downloadurl']           = 'Скачать:';
-$lang['repository']            = 'Репозиторий:';
-$lang['unknown']               = '<em>неизвестно</em>';
-$lang['installed_version']     = 'Уст. версия:';
-$lang['install_date']          = 'Посл. обновление:';
-$lang['available_version']     = 'Доступная версия:';
-$lang['compatible']            = 'Совместим с';
-$lang['depends']               = 'Зависит от';
-$lang['similar']               = 'Похож на';
-$lang['conflicts']             = 'Конфликтует с';
-$lang['donate']                = 'Нравится?';
-$lang['donate_action']         = 'Купить автору кофе!';
-$lang['repo_retry']            = 'Повторить';
-$lang['provides']              = 'Предоставляет:';
-$lang['status']                = 'Статус:';
-$lang['status_installed']      = 'установлено';
-$lang['status_not_installed']  = 'не установлено';
-$lang['status_protected']      = 'защищено';
-$lang['status_enabled']        = 'включён';
-$lang['status_disabled']       = 'отключено';
-$lang['status_unmodifiable']   = 'неизменяемо';
-$lang['status_plugin']         = 'плагин';
-$lang['status_template']       = 'шаблон';
-$lang['status_bundled']        = 'в комплекте';
-$lang['msg_enabled']           = 'Плагин %s включён';
-$lang['msg_disabled']          = 'Плагин %s отключён';
-$lang['msg_delete_success']    = 'Дополнение %s удалено';
-$lang['msg_delete_failed']     = 'Не удалось удалить расширение %s';
+$lang['menu']                         = 'Управление дополнениями';
+
+$lang['tab_plugins']                  = 'Установленные плагины';
+$lang['tab_templates']                = 'Установленные шаблоны';
+$lang['tab_search']                   = 'Поиск и установка';
+$lang['tab_install']                  = 'Ручная установка';
+
+$lang['notimplemented']               = 'Эта возможность ещё не реализована';
+$lang['notinstalled']                 = 'Это дополнение не установлено';
+$lang['alreadyenabled']               = 'Это дополнение уже включено';
+$lang['alreadydisabled']              = 'Это дополнение уже отключено';
+$lang['pluginlistsaveerror']          = 'Ошибка при сохранении списка плагинов';
+$lang['unknownauthor']                = 'Автор неизвестен';
+$lang['unknownversion']               = 'Версия неизвестна';
+
+$lang['btn_info']                     = 'Отобразить доп. информацию';
+$lang['btn_update']                   = 'Обновить';
+$lang['btn_uninstall']                = 'Удалить';
+$lang['btn_enable']                   = 'Включить';
+$lang['btn_disable']                  = 'Отключить';
+$lang['btn_install']                  = 'Установить';
+$lang['btn_reinstall']                = 'Переустановить';
+
+$lang['js']['reallydel']              = 'Действительно удалить это дополнение?';
+$lang['js']['display_viewoptions']    = 'Показать как:';
+$lang['js']['display_enabled']        = 'включено';
+$lang['js']['display_disabled']       = 'отключено';
+$lang['js']['display_updatable']      = 'обновление';
+
+$lang['search_for']                   = 'Поиск дополнения:';
+$lang['search']                       = 'Найти';
+
+$lang['extensionby']                  = '<strong>%s</strong> — %s';
+$lang['screenshot']                   = 'Скриншот: %s';
+$lang['popularity']                   = 'Популярность: %s%%';
+$lang['homepage_link']                = 'Описание';
+$lang['bugs_features']                = 'Баг-трекер';
+$lang['tags']                         = 'Метки:';
+$lang['author_hint']                  = 'Найти дополнения этого автора';
+$lang['installed']                    = 'Установлено:';
+$lang['downloadurl']                  = 'Скачать:';
+$lang['repository']                   = 'Репозиторий:';
+$lang['unknown']                      = '<em>неизвестно</em>';
+$lang['installed_version']            = 'Уст. версия:';
+$lang['install_date']                 = 'Посл. обновление:';
+$lang['available_version']            = 'Доступная версия:';
+$lang['compatible']                   = 'Совместим с:';
+$lang['depends']                      = 'Зависит от:';
+$lang['similar']                      = 'Похож на:';
+$lang['conflicts']                    = 'Конфликтует с:';
+$lang['donate']                       = 'Нравится?';
+$lang['donate_action']                = 'Купить автору кофе!';
+$lang['repo_retry']                   = 'Повторить';
+$lang['provides']                     = 'Предоставляет:';
+$lang['status']                       = 'Состояние:';
+$lang['status_installed']             = 'установлено';
+$lang['status_not_installed']         = 'не установлено';
+$lang['status_protected']             = 'защищено';
+$lang['status_enabled']               = 'включено';
+$lang['status_disabled']              = 'отключено';
+$lang['status_unmodifiable']          = 'неизменяемо';
+$lang['status_plugin']                = 'плагин';
+$lang['status_template']              = 'шаблон';
+$lang['status_bundled']               = 'в комплекте';
+
+$lang['msg_enabled']                  = 'Плагин %s включён';
+$lang['msg_disabled']                 = 'Плагин %s отключён';
+$lang['msg_delete_success']           = 'Дополнение %s удалено';
+$lang['msg_delete_failed']            = 'Не удалось удалить дополнение %s';
 $lang['msg_template_install_success'] = 'Шаблон %s успешно установлен';
-$lang['msg_template_update_success'] = 'Шаблон %s успешно обновлён';
-$lang['msg_plugin_install_success'] = 'Плагин %s успешно установлен';
-$lang['msg_plugin_update_success'] = 'Плагин %s успешно обновлён';
-$lang['msg_upload_failed']     = 'Не удалось загрузить файл';
-$lang['missing_dependency']    = '<strong>Отсутствует или отключена зависимость:</strong> %s';
-$lang['security_issue']        = '<strong>Проблема безопасности:</strong> %s';
-$lang['security_warning']      = '<strong>Предупреждение безопасности:</strong> %s';
-$lang['update_available']      = '<strong>Обновление:</strong> доступна новая версия %s.';
-$lang['wrong_folder']          = '<strong>Плагин установлен неправильно:</strong> переименуйте папку плагина из %s в %s.';
-$lang['url_change']            = '<strong>Ссылка изменилась:</strong> ссылка для загрузки изменилась с прошлого раза. Проверьте новую ссылку прежде, чем обновлять расширение.<br />Новая: %s<br />Старая: %s';
-$lang['error_badurl']          = 'Ссылки должны начинаться с http или https';
-$lang['error_dircreate']       = 'Не удалось создать временную директорию для загрузки';
-$lang['error_download']        = 'Не удалось загрузить файл: %s';
-$lang['error_decompress']      = 'Не удалось распаковать загруженный файл. Возможно, файл был повреждён при загрузке — тогда нужно попробовать ещё раз. Либо неизвестен формат архива — тогда загрузку и установку надо произвести вручную.';
-$lang['error_findfolder']      = 'Не удалось определить директорию для расширения, загрузку и установку надо произвести вручную.';
-$lang['error_copy']            = 'Возникла ошибка копирования файлов в директорию <em>%s</em>: возможно, диск переполнен, или неверно выставлены права доступа. Это могло привести к неполной установке плагина и нарушить работу вашей вики.';
-$lang['noperms']               = 'Папка для расширений недоступна для записи';
-$lang['notplperms']            = 'Папка для шаблонов недоступна для записи';
-$lang['nopluginperms']         = 'Папка плагинов недоступна для записи';
-$lang['git']                   = 'Это расширение было установлено через git. Вы не можете обновить его тут.';
-$lang['auth']                  = 'Этот auth плагин не включен в конфигурации, подумайте о его отключении';
-$lang['install_url']           = 'Установить с адреса URL';
-$lang['install_upload']        = 'Скачать расширение';
-$lang['repo_error']            = 'Сайт с плагинами недоступен. Убедитесь, что у сайта есть доступ на www.dokuwiki.org, а также проверьте настройки соединения с Интернетом.';
-$lang['nossl']                 = 'Ваша PHP конфигурация не имеет SSL поддержки. Это поломает скачивание для многих DokuWiki плагинов и расширений.';
+$lang['msg_template_update_success']  = 'Шаблон %s успешно обновлён';
+$lang['msg_plugin_install_success']   = 'Плагин %s успешно установлен';
+$lang['msg_plugin_update_success']    = 'Плагин %s успешно обновлён';
+$lang['msg_upload_failed']            = 'Не удалось загрузить файл';
+
+$lang['missing_dependency']           = '<strong>Отсутствует или отключена зависимость:</strong> %s';
+$lang['security_issue']               = '<strong>Проблема безопасности:</strong> %s';
+$lang['security_warning']             = '<strong>Предупреждение безопасности:</strong> %s';
+$lang['update_available']             = '<strong>Обновление:</strong> доступна новая версия %s';
+$lang['wrong_folder']                 = '<strong>Плагин установлен неправильно:</strong> переименуйте директорию плагина из %s в %s';
+$lang['url_change']                   = '<strong>Ссылка изменилась:</strong> ссылка для загрузки изменилась с прошлого раза. Проверьте новую ссылку прежде, чем обновлять дополнение.<br />Новая: %s<br />Старая: %s';
+
+$lang['error_badurl']                 = 'Ссылка должна начинаться с http или https';
+$lang['error_dircreate']              = 'Не удалось создать временную директорию для загрузки';
+$lang['error_download']               = 'Не удалось загрузить файл: %s';
+$lang['error_decompress']             = 'Не удалось распаковать загруженный файл. Возможно, файл был повреждён при загрузке — тогда нужно попробовать ещё раз. Либо неизвестен формат архива — тогда загрузку и установку надо произвести вручную';
+$lang['error_findfolder']             = 'Не удалось определить директорию для дополнения, загрузку и установку надо произвести вручную.';
+$lang['error_copy']                   = 'Возникла ошибка копирования файлов в директорию <em>%s</em>: возможно, диск переполнен, или неверно выставлены права доступа. Это могло привести к неполной установке плагина и нарушить работу вашей вики.';
+
+$lang['noperms']                      = 'Директория для дополнений не доступна для записи';
+$lang['notplperms']                   = 'Директория для шаблонов не доступна для записи';
+$lang['nopluginperms']                = 'Директория для плагинов не доступна для записи';
+$lang['git']                          = 'Это дополнение было установлено через git. Вы не можете обновить его тут.';
+$lang['auth']                         = 'Этот auth плагин не включен в конфигурации, подумайте о его отключении';
+
+$lang['install_url']                  = 'Установить с адреса:';
+$lang['install_upload']               = 'Скачать дополнение:';
+
+$lang['repo_error']                   = 'Сайт с плагинами недоступен. Убедитесь, что у сайта есть доступ на www.dokuwiki.org и также проверьте настройки соединения прокси.';
+$lang['nossl']                        = 'Ваша PHP конфигурация не имеет SSL поддержки. Это поломает скачивание для многих DokuWiki плагинов и дополнений.';
diff --git a/lib/plugins/extension/lang/zh/lang.php b/lib/plugins/extension/lang/zh/lang.php
index 5ab3d77ba8909df7b7a1d3ffeb7a68bf3acc9ad5..f07bee0ac699ac8acb1976173bd2bae98edd1d62 100644
--- a/lib/plugins/extension/lang/zh/lang.php
+++ b/lib/plugins/extension/lang/zh/lang.php
@@ -2,11 +2,12 @@
 
 /**
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
+ *
  * @author Cupen <Cupenoruler@foxmail.com>
  * @author xiqingongzi <Xiqingongzi@Gmail.com>
  * @author qinghao <qingxianhao@gmail.com>
  * @author lainme <lainme993@gmail.com>
+ * @author Errol <errol@hotmail.com>
  */
 $lang['menu']                  = '扩展管理器';
 $lang['tab_plugins']           = '安装插件';
@@ -28,6 +29,10 @@ $lang['btn_disable']           = '关闭';
 $lang['btn_install']           = '安装';
 $lang['btn_reinstall']         = '重新安装';
 $lang['js']['reallydel']       = '确定卸载这个扩展么?';
+$lang['js']['display_viewoptions'] = '查看选项:';
+$lang['js']['display_enabled'] = '启用';
+$lang['js']['display_disabled'] = '禁用';
+$lang['js']['display_updatable'] = '可更新';
 $lang['search_for']            = '搜索扩展';
 $lang['search']                = '搜索';
 $lang['extensionby']           = '<strong>%s</strong> by %s';
diff --git a/lib/plugins/extension/script.js b/lib/plugins/extension/script.js
index bc1bf8b12ab0af93fcdf4bc3839ad41fbb47e4db..0c43de6ae97403f85f9cffb759ee84040751d734 100644
--- a/lib/plugins/extension/script.js
+++ b/lib/plugins/extension/script.js
@@ -5,7 +5,7 @@ jQuery(function(){
     /**
      * Confirm uninstalling
      */
-    $extmgr.find('input.uninstall').click(function(e){
+    $extmgr.find('button.uninstall').click(function(e){
         if(!window.confirm(LANG.plugins.extension.reallydel)){
             e.preventDefault();
             return false;
@@ -46,7 +46,7 @@ jQuery(function(){
     /**
      * Enable/Disable extension via AJAX
      */
-    $extmgr.find('input.disable, input.enable').click(function (e) {
+    $extmgr.find('button.disable, button.enable').click(function (e) {
         e.preventDefault();
         var $btn = jQuery(this);
 
@@ -114,19 +114,20 @@ jQuery(function(){
         Create section for enabling/disabling viewing options
      */
     if ( $extmgr.find('.plugins, .templates').hasClass('active') ) {
+        var $extlist = jQuery('#extension__list');
+        $extlist.addClass('hasDisplayOptions');
         var $displayOpts = jQuery('<p>', { id: 'extension__viewoptions'} ).appendTo($extmgr.find( '.panelHeader' ));
 
         $displayOpts.append(LANG.plugins.extension.display_viewoptions);
-    
+
         var displayOptionsHandler = function(){
-            jQuery('#extension__list').toggleClass( this.name );
+            $extlist.toggleClass( this.name );
         };
-    
+
         jQuery(['enabled', 'disabled', 'updatable']).each(function(index, chkName){
-        
             var $label = jQuery( '<label></label>' ).appendTo($displayOpts);
             jQuery( '<input />', { type: 'checkbox', name: chkName }).change(displayOptionsHandler).appendTo($label).click();
-            jQuery( '<span/>' ).append(LANG.plugins.extension['display_'+chkName]).appendTo($label);
+            jQuery( '<span/>' ).append(' '+LANG.plugins.extension['display_'+chkName]).appendTo($label);
         });
     }
 });
diff --git a/lib/plugins/extension/style.less b/lib/plugins/extension/style.less
index 38b2d65d00e7b0c2814adc4fb6abfaf9d3a3993f..c400d649a29f01358bfc89cdb7ee5f28a3d61961 100644
--- a/lib/plugins/extension/style.less
+++ b/lib/plugins/extension/style.less
@@ -80,8 +80,8 @@
         overflow: hidden;
     }
 
-    input.button {
-        margin: 0 .3em .3em 0;
+    button {
+        margin-bottom: .3em;
     }
 }
 
@@ -281,18 +281,21 @@
  * Enabled/Disabled overrides
  */
 #extension__list {
-    
-    .enabled, .disabled,
-    .updatable {
-        display: none;
-    }
-    
-    &.enabled .enabled,
-    &.disabled .disabled,
-    &.updatable .updatable {
-        display: block;
+
+    &.hasDisplayOptions {
+        .enabled,
+        .disabled,
+        .updatable {
+            display: none;
+        }
+
+        &.enabled .enabled,
+        &.disabled .disabled,
+        &.updatable .updatable {
+            display: block;
+        }
     }
-    
+
     .enabled div.screenshot span {
         background: transparent url(images/enabled.png) no-repeat 2px 2px;
     }
@@ -376,4 +379,5 @@
 
 #extension__viewoptions label {
     margin-left: 1em;
+    vertical-align: baseline;
 }
diff --git a/lib/plugins/popularity/admin.php b/lib/plugins/popularity/admin.php
index a2c3c6c8bc35616e275a091740d145d1ef6416a7..0cf174e0de7c20d8b197e4e240241b36bf0940e1 100644
--- a/lib/plugins/popularity/admin.php
+++ b/lib/plugins/popularity/admin.php
@@ -144,7 +144,7 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
                 .'<input type="hidden" name="do" value="admin" />'
                 .'<input type="hidden" name="page" value="popularity" />';
         }
-        $form .= '<input type="submit" class="button" value="'.$this->getLang('submit').'"/>'
+        $form .= '<button type="submit">'.$this->getLang('submit').'</button>'
             .'</fieldset>'
             .'</form>';
         return $form;
diff --git a/lib/plugins/popularity/lang/ja/intro.txt b/lib/plugins/popularity/lang/ja/intro.txt
index 09886f418b973af7c1035cd2816f56286cd46b08..db9a342845d40b72f3fdebf343b0c3da387ffcd8 100644
--- a/lib/plugins/popularity/lang/ja/intro.txt
+++ b/lib/plugins/popularity/lang/ja/intro.txt
@@ -1,6 +1,6 @@
 ====== 利用状況調査 ======
 
-このツールは、ご利用中のwikiの情報を収集し、それをDokuWikiの開発者へ匿名で送信するものです。開発者はこのツールにより、DokuWikiが実際にどの様に利用されているかを理解し、そして実際の利用状況に基づいて今後の開発方針の決定することができます。
+この[[doku>ja:popularity|ツール]]は、ご利用中のwikiの情報を収集し、それをDokuWikiの開発者へ匿名で送信するものです。開発者はこのツールにより、DokuWikiが実際にどの様に利用されているかを理解し、そして実際の利用状況に基づいて今後の開発方針の決定することができます。
 
 お使いのwikiの規模が大きくなってきたときは、このステップを定期的に繰り返すことを推奨しています。また、送信されたデータは匿名のIDで識別されます。
 
diff --git a/lib/plugins/popularity/lang/ko/intro.txt b/lib/plugins/popularity/lang/ko/intro.txt
index bc9bb9dd0ec9c0faac8659c21468cbd9f2420fef..edc0f87332a3a83cf17b80f56699c6dd2a0a3a33 100644
--- a/lib/plugins/popularity/lang/ko/intro.txt
+++ b/lib/plugins/popularity/lang/ko/intro.txt
@@ -1,6 +1,6 @@
 ====== 인기도 조사 ======
 
-설치된 위키의 익명 정보를 도쿠위키 개발자에게 보냅니다. 이 [[doku>ko:popularity|도구]]는 도쿠위키가 실제 사용자에게 어떻게 사용되는지 도쿠위키 개발자에게 알려줌으로써 이 후 개발 시 참고가 됩니다.
+설치된 위키의 익명 정보를 도쿠위키 개발자에게 보냅니다. 이 [[doku>ko:popularity|도구]]는 도쿠위키가 실제 사용자에게 어떻게 사용되는지 도쿠위키 개발자에게 알려줌으로써 이 후 개발 시 참조가 됩니다.
 
 설치된 위키가 커짐에 따라서 이 과정을 반복할 필요가 있습니다. 반복된 데이터는 익명 ID로 구별되어집니다.
 
diff --git a/lib/plugins/remote.php b/lib/plugins/remote.php
index a51f701fbf87e7158cbe3246c5d74934dbeb9767..47f954ee6034aa05d4b726a184ee9f9642e135e9 100644
--- a/lib/plugins/remote.php
+++ b/lib/plugins/remote.php
@@ -1,19 +1,30 @@
 <?php
 
+/**
+ * Class DokuWiki_Remote_Plugin
+ */
 abstract class DokuWiki_Remote_Plugin extends DokuWiki_Plugin {
 
     private  $api;
 
+    /**
+     * Constructor
+     */
     public function __construct() {
         $this->api = new RemoteAPI();
     }
 
     /**
+     * Get all available methods with remote access.
+     *
      * @abstract
-     * @return array Information to all provided methods. {@see RemoteAPI}.
+     * @return array Information about all provided methods. {@see RemoteAPI}.
      */
     public abstract function _getMethods();
 
+    /**
+     * @return RemoteAPI
+     */
     protected function getApi() {
         return $this->api;
     }
diff --git a/lib/plugins/revert/admin.php b/lib/plugins/revert/admin.php
index b61615d0050a4b8c3fd007067b29f3e38a1056df..1a03005857b815854247979b4d02e510ecf3851a 100644
--- a/lib/plugins/revert/admin.php
+++ b/lib/plugins/revert/admin.php
@@ -64,9 +64,9 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
         global $lang, $INPUT;
         echo '<form action="" method="post"><div class="no">';
         echo '<label>'.$this->getLang('filter').': </label>';
-        echo '<input type="text" name="filter" class="edit" value="'.hsc($INPUT->str('filter')).'" />';
-        echo ' <input type="submit" class="button" value="'.$lang['btn_search'].'" />';
-        echo ' <span>'.$this->getLang('note1').'</span>';
+        echo '<input type="text" name="filter" class="edit" value="'.hsc($INPUT->str('filter')).'" /> ';
+        echo '<button type="submit">'.$lang['btn_search'].'</button> ';
+        echo '<span>'.$this->getLang('note1').'</span>';
         echo '</div></form><br /><br />';
     }
 
@@ -173,7 +173,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
         echo '</ul>';
 
         echo '<p>';
-        echo '<input type="submit" class="button" value="'.$this->getLang('revert').'" /> ';
+        echo '<button type="submit">'.$this->getLang('revert').'</button> ';
         printf($this->getLang('note2'),hsc($filter));
         echo '</p>';
 
diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php
index 0d92e5cc19f781eff52c41bdc85768c9389c54ec..86823ee2f15af1045ff237541f7a8259892b9ce0 100644
--- a/lib/plugins/usermanager/admin.php
+++ b/lib/plugins/usermanager/admin.php
@@ -241,18 +241,18 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         ptln("    <tbody>");
         ptln("      <tr><td colspan=\"5\" class=\"centeralign\">");
         ptln("        <span class=\"medialeft\">");
-        ptln("          <input type=\"submit\" name=\"fn[delete]\" ".$delete_disable." class=\"button\" value=\"".$this->lang['delete_selected']."\" id=\"usrmgr__del\" />");
-        ptln("        </span>");
+        ptln("          <button type=\"submit\" name=\"fn[delete]\" id=\"usrmgr__del\" ".$delete_disable.">".$this->lang['delete_selected']."</button>");
+        ptln("        ");
         ptln("        <span class=\"mediaright\">");
-        ptln("          <input type=\"submit\" name=\"fn[start]\" ".$page_buttons['start']." class=\"button\" value=\"".$this->lang['start']."\" />");
-        ptln("          <input type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev']." class=\"button\" value=\"".$this->lang['prev']."\" />");
-        ptln("          <input type=\"submit\" name=\"fn[next]\" ".$page_buttons['next']." class=\"button\" value=\"".$this->lang['next']."\" />");
-        ptln("          <input type=\"submit\" name=\"fn[last]\" ".$page_buttons['last']." class=\"button\" value=\"".$this->lang['last']."\" />");
+        ptln("          <button type=\"submit\" name=\"fn[start]\" ".$page_buttons['start'].">".$this->lang['start']."</button>");
+        ptln("          <button type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev'].">".$this->lang['prev']."</button>");
+        ptln("          <button type=\"submit\" name=\"fn[next]\" ".$page_buttons['next'].">".$this->lang['next']."</button>");
+        ptln("          <button type=\"submit\" name=\"fn[last]\" ".$page_buttons['last'].">".$this->lang['last']."</button>");
         ptln("        </span>");
         if (!empty($this->_filter)) {
-            ptln("    <input type=\"submit\" name=\"fn[search][clear]\" class=\"button\" value=\"".$this->lang['clear']."\" />");
+            ptln("    <button type=\"submit\" name=\"fn[search][clear]\">".$this->lang['clear']."</button>");
         }
-        ptln("        <input type=\"submit\" name=\"fn[export]\" class=\"button\" value=\"".$export_label."\" />");
+        ptln("        <button type=\"submit\" name=\"fn[export]\">".$export_label."</button>");
         ptln("        <input type=\"hidden\" name=\"do\"    value=\"admin\" />");
         ptln("        <input type=\"hidden\" name=\"page\"  value=\"usermanager\" />");
 
@@ -360,7 +360,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
 
         $this->_htmlFilterSettings($indent+10);
 
-        ptln("          <input type=\"submit\" name=\"fn[".$cmd."]\" class=\"button\" value=\"".$this->lang[$cmd]."\" />",$indent);
+        ptln("          <button type=\"submit\" name=\"fn[".$cmd."]\">".$this->lang[$cmd]."</button>",$indent);
         ptln("        </td>",$indent);
         ptln("      </tr>",$indent);
         ptln("    </tbody>",$indent);
@@ -369,7 +369,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         if ($notes) {
             ptln("    <ul class=\"notes\">");
             foreach ($notes as $note) {
-                ptln("      <li><span class=\"li\">".$note."</span></li>",$indent);
+                ptln("      <li><span class=\"li\">".$note."</li>",$indent);
             }
             ptln("    </ul>");
         }
@@ -456,7 +456,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         ptln('  <form action="'.wl($ID).'" method="post" enctype="multipart/form-data">',$indent);
         formSecurityToken();
         ptln('    <label>'.$this->lang['import_userlistcsv'].'<input type="file" name="import" /></label>',$indent);
-        ptln('    <input type="submit" name="fn[import]" value="'.$this->lang['import'].'" />',$indent);
+        ptln('    <button type="submit" name="fn[import]">'.$this->lang['import'].'</button>',$indent);
         ptln('    <input type="hidden" name="do"    value="admin" />',$indent);
         ptln('    <input type="hidden" name="page"  value="usermanager" />',$indent);
 
diff --git a/lib/plugins/usermanager/style.css b/lib/plugins/usermanager/style.css
index d119b195a0475eb0cadb7143436f4cd9ec7f71d8..9028fed5eb58d0e66cd866864c50943d83c27442 100644
--- a/lib/plugins/usermanager/style.css
+++ b/lib/plugins/usermanager/style.css
@@ -17,7 +17,7 @@
   padding-left: 0;
   padding-right: 1.4em;
 }
-#user__manager input.button[disabled] {
+#user__manager button[disabled] {
   color: #ccc!important;
   border-color: #ccc!important;
 }
diff --git a/lib/scripts/behaviour.js b/lib/scripts/behaviour.js
index fb61f6e48b4de063787f30c10ab9affbe18a5759..b05949a90533f97f6f094add3690dbeaeed60d76 100644
--- a/lib/scripts/behaviour.js
+++ b/lib/scripts/behaviour.js
@@ -1,37 +1,41 @@
 /**
  * Hides elements with a slide animation
  *
- * @param fn optional callback to run after hiding
+ * @param {function} fn optional callback to run after hiding
+ * @param {bool} noaria supress aria-expanded state setting
  * @author Adrian Lang <mail@adrianlang.de>
  */
-jQuery.fn.dw_hide = function(fn) {
-    this.attr('aria-expanded', 'false');
+jQuery.fn.dw_hide = function(fn, noaria) {
+    if(!noaria) this.attr('aria-expanded', 'false');
     return this.slideUp('fast', fn);
 };
 
 /**
  * Unhides elements with a slide animation
  *
- * @param fn optional callback to run after hiding
+ * @param {function} fn optional callback to run after hiding
+ * @param {bool} noaria supress aria-expanded state setting
  * @author Adrian Lang <mail@adrianlang.de>
  */
-jQuery.fn.dw_show = function(fn) {
-    this.attr('aria-expanded', 'true');
+jQuery.fn.dw_show = function(fn, noaria) {
+    if(!noaria) this.attr('aria-expanded', 'true');
     return this.slideDown('fast', fn);
 };
 
 /**
  * Toggles visibility of an element using a slide element
  *
- * @param bool the current state of the element (optional)
+ * @param {bool} state the current state of the element (optional)
+ * @param {function} fn callback after the state has been toggled
+ * @param {bool} noaria supress aria-expanded state setting
  */
-jQuery.fn.dw_toggle = function(bool, fn) {
+jQuery.fn.dw_toggle = function(state, fn, noaria) {
     return this.each(function() {
         var $this = jQuery(this);
-        if (typeof bool === 'undefined') {
-            bool = $this.is(':hidden');
+        if (typeof state === 'undefined') {
+            state = $this.is(':hidden');
         }
-        $this[bool ? "dw_show" : "dw_hide" ](fn);
+        $this[state ? "dw_show" : "dw_hide" ](fn, noaria);
     });
 };
 
@@ -107,7 +111,7 @@ var dw_behaviour = {
     quickSelect: function(){
         jQuery('select.quickselect')
             .change(function(e){ e.target.form.submit(); })
-            .closest('form').find('input[type=submit]').not('.show').hide();
+            .closest('form').find(':button').not('.show').hide();
     },
 
     /**
@@ -171,10 +175,10 @@ var dw_behaviour = {
 
         if($checked.length < 2){
             $all.attr('disabled',false);
-            jQuery('#page__revisions input[type=submit]').attr('disabled',true);
+            jQuery('#page__revisions button').attr('disabled',true);
         }else{
             $all.attr('disabled',true);
-            jQuery('#page__revisions input[type=submit]').attr('disabled',false);
+            jQuery('#page__revisions button').attr('disabled',false);
             for(var i=0; i<$checked.length; i++){
                 $checked[i].disabled = false;
                 if(i>1){
diff --git a/lib/scripts/editor.js b/lib/scripts/editor.js
index f4143f0bc20a9edd9cb53bddb23af6bf81ac4397..fac084489246a7dc73987e5c360f5d82701fc79c 100644
--- a/lib/scripts/editor.js
+++ b/lib/scripts/editor.js
@@ -146,7 +146,7 @@ var dw_editor = {
 
         if((e.keyCode == 13 || e.keyCode == 10) && e.ctrlKey) { // Ctrl-Enter (With Chrome workaround)
             // Submit current edit
-            jQuery('input#edbtn__save').click();
+            jQuery('#edbtn__save').click();
             e.preventDefault(); // prevent enter key
             return false;
         }else if(e.keyCode == 13){ // Enter
diff --git a/lib/scripts/fileuploaderextended.js b/lib/scripts/fileuploaderextended.js
index f5786c387dbcb9a5c55f8f7b428c32cbf5e7737a..d6a82397d7e5a6c2e705123775f95e1d689130f3 100644
--- a/lib/scripts/fileuploaderextended.js
+++ b/lib/scripts/fileuploaderextended.js
@@ -82,7 +82,7 @@ qq.FileUploaderExtended = function(o){
             '<div class="qq-upload-button">' + LANG.media_select + '</div>' +
             '<ul class="qq-upload-list"></ul>' +
             '<div class="qq-action-container">' +
-            '  <input class="qq-upload-action button" type="submit" value="' + LANG.media_upload_btn + '" id="mediamanager__upload_button">' +
+            '  <button class="qq-upload-action" type="submit" id="mediamanager__upload_button">' + LANG.media_upload_btn + '</button>' +
             '  <label class="qq-overwrite-check"><input type="checkbox" value="1" name="ow" class="dw__ow"> <span>' + LANG.media_overwrt + '</span></label>' +
             '</div>' +
             '</div>',
@@ -189,7 +189,7 @@ qq.extend(qq.FileUploaderExtended.prototype, {
             var button = '<form method="post" action="' + action + '" id="mediamanager__done_form"><div>';
             button += '<input type="hidden" value="' + result.ns + '" name="ns">';
             button += '<input type="hidden" value="1" name="recent">';
-            button += '<input class="button" type="submit" value="' + LANG.media_done_btn + '"></div></form>';
+            button += '<button type="submit">' + LANG.media_done_btn + '</button></div></form>';
             jQuery('#mediamanager__uploader').append(button);
         }
     }
diff --git a/lib/scripts/hotkeys.js b/lib/scripts/hotkeys.js
index bff28530d240d70bba0c34d1b8974d4344e4bcd8..76a277aea2ad6b09e7d2850def2b16678b58d90d 100644
--- a/lib/scripts/hotkeys.js
+++ b/lib/scripts/hotkeys.js
@@ -26,7 +26,7 @@ function Hotkeys() {
      * Initialization
      *
      * This function looks up all the accesskeys used in the current page
-     * (at anchor elements and input elements [type="submit"]) and registers
+     * (at anchor elements and button elements [type="submit"]) and registers
      * appropriate shortcuts.
      *
      * Secondly, initialization registers listeners on document to catch all
@@ -59,10 +59,10 @@ function Hotkeys() {
         });
 
         /**
-         * Lookup all input [type="submit"] with accesskey and register event -
+         * Lookup all button [type="submit"] with accesskey and register event -
          * perform "click" on a button.
          */
-        var inputs = document.getElementsByTagName("input");
+        var inputs = document.getElementsByTagName("button");
         t.each(inputs, function(i) {
             if (i.type == "submit" && i.accessKey != "") {
                 t.addShortcut(t.modifier + '+' + i.accessKey, function() {
diff --git a/lib/scripts/media.js b/lib/scripts/media.js
index 8ca21ecabccfd26e2c88f6d3a4fe4e2aad123dac..2995addfd0f41d335d2831a9c775e9f7e91afa3b 100644
--- a/lib/scripts/media.js
+++ b/lib/scripts/media.js
@@ -119,7 +119,7 @@ var dw_mediamanager = {
         $both = $listType.add($sortBy);
 
         // Remove the submit button
-        $options.find('input[type=submit]').parent().hide();
+        $options.find('button[type=submit]').parent().hide();
 
         // Prepare HTML for jQuery UI buttonset
         $both.find('label').each(function () {
@@ -435,7 +435,7 @@ var dw_mediamanager = {
                 dw_mediamanager.$resizables().resizable('destroy');
 
                 if (update_list) {
-                    dw_mediamanager.list.call(jQuery('#mediamanager__page form.options input[type="submit"]')[0]);
+                    dw_mediamanager.list.call(jQuery('#mediamanager__page form.options button[type="submit"]')[0]);
                 }
 
                 $content.html(data);
diff --git a/lib/scripts/page.js b/lib/scripts/page.js
index 7b4958d8254f2706def95b368be7bb9fbc4074a7..a179ae2a8e45434f79a7eceea0cd87f87e937789 100644
--- a/lib/scripts/page.js
+++ b/lib/scripts/page.js
@@ -109,8 +109,14 @@ dw_page = {
      * as well. A state indicator is inserted into the handle and can be styled
      * by CSS.
      *
-     * @param selector handle What should be clicked to toggle
-     * @param selector content This element will be toggled
+     * To properly reserve space for the expanded element, the sliding animation is
+     * done on the children of the content. To make that look good and to make sure aria
+     * attributes are assigned correctly, it's recommended to make sure that the content
+     * element contains a single child element only.
+     *
+     * @param {selector} handle What should be clicked to toggle
+     * @param {selector} content This element will be toggled
+     * @param {int} state initial state (-1 = open, 1 = closed)
      */
     makeToggle: function(handle, content, state){
         var $handle, $content, $clicky, $child, setClicky;
@@ -160,8 +166,9 @@ dw_page = {
             // Start animation and assure that $toc is hidden/visible
             $child.dw_toggle(hidden, function () {
                 $content.toggle(hidden);
+                $content.attr('aria-expanded', hidden);
                 $content.css('min-height',''); // remove min-height again
-            });
+            }, true);
         };
 
         // the state indicator
diff --git a/lib/tpl/dokuwiki/css/_edit.css b/lib/tpl/dokuwiki/css/_edit.css
index f40aaa89199e383750a30872e97a8884e397743e..d6dcb93ab1152381ceb54f98e6ea19a198f82071 100644
--- a/lib/tpl/dokuwiki/css/_edit.css
+++ b/lib/tpl/dokuwiki/css/_edit.css
@@ -88,7 +88,7 @@ div.picker button.toolbutton {
     margin-right: 0;
     margin-left: 1em;
 }
-.dokuwiki .editBar .editButtons input {
+.dokuwiki .editBar .editButtons button {
 }
 
 /* summary input and minor changes checkbox */
@@ -130,7 +130,7 @@ div.picker button.toolbutton {
 [dir=rtl] .dokuwiki .secedit {
     float: left;
 }
-.dokuwiki .secedit input.button {
+.dokuwiki .secedit button {
     font-size: 75%;
 }
 
diff --git a/lib/tpl/dokuwiki/css/_forms.css b/lib/tpl/dokuwiki/css/_forms.css
index 522f9ed4d0596cca570b4e14036bd9f8ff16f677..bf70fa24b92392ecf7dac6f9c9e923a5c5d44d22 100644
--- a/lib/tpl/dokuwiki/css/_forms.css
+++ b/lib/tpl/dokuwiki/css/_forms.css
@@ -62,8 +62,7 @@
 }
 
 
-.dokuwiki input.button,
-.dokuwiki button.button {
+.dokuwiki button {
     vertical-align: middle;
 }
 /**
diff --git a/lib/tpl/dokuwiki/css/_media_fullscreen.css b/lib/tpl/dokuwiki/css/_media_fullscreen.css
index 31b71897bf138ba29d4fe28448c767cfd3fc8c41..71308ec856d7bf38ccf38450f8899c79ca652c5f 100644
--- a/lib/tpl/dokuwiki/css/_media_fullscreen.css
+++ b/lib/tpl/dokuwiki/css/_media_fullscreen.css
@@ -394,7 +394,7 @@
     width: 50%;
 }
 
-#mediamanager__page form.meta input.button {
+#mediamanager__page form.meta button {
     width: auto;
 }
 
diff --git a/lib/tpl/dokuwiki/css/_media_popup.css b/lib/tpl/dokuwiki/css/_media_popup.css
index 20d669c1484f87acab965f1ca659e726da9b67d2..af536489c6e4fcb11e55a9beaaf714471a732172 100644
--- a/lib/tpl/dokuwiki/css/_media_popup.css
+++ b/lib/tpl/dokuwiki/css/_media_popup.css
@@ -204,7 +204,7 @@ html.popup {
 }
 #dw__mediasearch input.edit {
 }
-#dw__mediasearch input.button {
+#dw__mediasearch button {
 }
 
 
diff --git a/lib/tpl/dokuwiki/css/_modal.css b/lib/tpl/dokuwiki/css/_modal.css
index a46dff30e0370555b919bcd3e696c15feeb51264..37f64830ff10c8c870076661004e402abc38844f 100644
--- a/lib/tpl/dokuwiki/css/_modal.css
+++ b/lib/tpl/dokuwiki/css/_modal.css
@@ -88,7 +88,7 @@
     cursor: default;
 }
 
-#media__popup_content .button {
+#media__popup_content button {
     margin-right: 1px;
     cursor: pointer;
 }
diff --git a/lib/tpl/dokuwiki/css/design.less b/lib/tpl/dokuwiki/css/design.less
index 548ba72285a182bdb8a894d6d404a256f07c7943..ed643fb25ea4403751b7e8de9c520e451afd591e 100644
--- a/lib/tpl/dokuwiki/css/design.less
+++ b/lib/tpl/dokuwiki/css/design.less
@@ -207,12 +207,12 @@ form.search {
     position: relative;
     margin-bottom: 0.5em;
 
-    input.edit {
+    input {
         width: 18em;
         padding: .35em 22px .35em .1em;
     }
 
-    input.button {
+    button {
         background: transparent url(images/search.png) no-repeat 0 0;
         border-width: 0;
         width: 19px;
@@ -225,11 +225,11 @@ form.search {
 }
 
 [dir=rtl] form.search {
-    input.edit {
+    input {
         padding: .35em .1em .35em 22px;
     }
 
-    input.button {
+    button {
         background-position: 5px 0;
         margin-left: 0;
         margin-right: -20px;
diff --git a/lib/tpl/dokuwiki/css/mobile.less b/lib/tpl/dokuwiki/css/mobile.less
index e5e13e2215f1c01fede95acfae40f2d717d8bc52..a52c723ca993530f9bd89ac8a1c5d45506fc3cb0 100644
--- a/lib/tpl/dokuwiki/css/mobile.less
+++ b/lib/tpl/dokuwiki/css/mobile.less
@@ -237,7 +237,7 @@ body {
     margin: 0 0 .2em .2em;
 }
 
-#dokuwiki__sitetools form.search input.edit {
+#dokuwiki__sitetools form.search input {
     width: 100% !important;
 }
 .dokuwiki form.search div.ajax_qsearch {
@@ -261,7 +261,7 @@ body {
 }
 
 /* force same height on search input and tools select */
-#dokuwiki__sitetools form.search input.edit,
+#dokuwiki__sitetools form.search input,
 #dokuwiki__header .mobileTools select {
     height: 2.1em;
     line-height: 2.1em;
diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php
index 165230e8a9fdca188e25b7a67e4d67e838776e90..eea1df71a91667a3bce124b6b2240aef37a02d53 100644
--- a/lib/tpl/dokuwiki/main.php
+++ b/lib/tpl/dokuwiki/main.php
@@ -38,12 +38,12 @@ $showSidebar = $hasSidebar && ($ACT=='show');
                 <!-- ********** ASIDE ********** -->
                 <div id="dokuwiki__aside"><div class="pad aside include group">
                     <h3 class="toggle"><?php echo $lang['sidebar'] ?></h3>
-                    <div class="content">
+                    <div class="content"><div class="group">
                         <?php tpl_flush() ?>
                         <?php tpl_includeFile('sidebarheader.html') ?>
                         <?php tpl_include_page($conf['sidebar'], true, true) ?>
                         <?php tpl_includeFile('sidebarfooter.html') ?>
-                    </div>
+                    </div></div>
                 </div></div><!-- /aside -->
             <?php endif; ?>
 
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index 5e1469e8307d9c644831f694ed8eccdd4afccc28..4e05d3b158348d499092a409f7beec47328946da 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -351,7 +351,7 @@ class ClassLoader
             foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
                 if (0 === strpos($class, $prefix)) {
                     foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
-                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                        if (is_file($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
                             return $file;
                         }
                     }
@@ -361,7 +361,7 @@ class ClassLoader
 
         // PSR-4 fallback dirs
         foreach ($this->fallbackDirsPsr4 as $dir) {
-            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+            if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                 return $file;
             }
         }
@@ -380,7 +380,7 @@ class ClassLoader
             foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                 if (0 === strpos($class, $prefix)) {
                     foreach ($dirs as $dir) {
-                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                        if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                             return $file;
                         }
                     }
@@ -390,7 +390,7 @@ class ClassLoader
 
         // PSR-0 fallback dirs
         foreach ($this->fallbackDirsPsr0 as $dir) {
-            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+            if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                 return $file;
             }
         }
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index a9eb3f9ee78dce1e5f79ea1284b967fcffb2df6b..9b20b8a09e0a6484313d0b71aa3509dc744d8fcb 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1,99 +1,99 @@
 [
     {
-        "name": "splitbrain/php-archive",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
+        "name": "easybook/geshi",
+        "version": "v1.0.8.15",
+        "version_normalized": "1.0.8.15",
         "source": {
             "type": "git",
-            "url": "https://github.com/splitbrain/php-archive.git",
-            "reference": "a0fbfc2f85ed491f3d2af42cff48a9cb783a8549"
+            "url": "https://github.com/easybook/geshi.git",
+            "reference": "54387de80bc7ee50397ffae39234626a48d2d45f"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/a0fbfc2f85ed491f3d2af42cff48a9cb783a8549",
-            "reference": "a0fbfc2f85ed491f3d2af42cff48a9cb783a8549",
+            "url": "https://api.github.com/repos/easybook/geshi/zipball/54387de80bc7ee50397ffae39234626a48d2d45f",
+            "reference": "54387de80bc7ee50397ffae39234626a48d2d45f",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "4.5.*"
+            "php": ">4.3.0"
         },
-        "time": "2015-02-25 20:15:02",
+        "time": "2015-06-18 14:56:28",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "splitbrain\\PHPArchive\\": "src"
-            }
+            "classmap": [
+                "./"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "GPL-2.0"
         ],
         "authors": [
             {
-                "name": "Andreas Gohr",
-                "email": "andi@splitbrain.org"
+                "name": "Nigel McNie",
+                "email": "nigel@geshi.org"
+            },
+            {
+                "name": "Benny Baumann",
+                "email": "BenBE@geshi.org"
             }
         ],
-        "description": "Pure-PHP implementation to read and write TAR and ZIP archives",
+        "description": "GeSHi - Generic Syntax Highlighter. This is an unmodified port of GeSHi project code found on SourceForge.",
+        "homepage": "http://qbnz.com/highlighter",
         "keywords": [
-            "archive",
-            "extract",
-            "tar",
-            "unpack",
-            "unzip",
-            "zip"
+            "highlight",
+            "highlighter",
+            "syntax"
         ]
     },
     {
-        "name": "easybook/geshi",
-        "version": "v1.0.8.14",
-        "version_normalized": "1.0.8.14",
+        "name": "splitbrain/php-archive",
+        "version": "1.0.4",
+        "version_normalized": "1.0.4.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/easybook/geshi.git",
-            "reference": "af589a67bf308791bb13e54bddd9aa3544b7dff8"
+            "url": "https://github.com/splitbrain/php-archive.git",
+            "reference": "6572e78ef9d064eeb5c74d4ffe61b473a4996b68"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/easybook/geshi/zipball/af589a67bf308791bb13e54bddd9aa3544b7dff8",
-            "reference": "af589a67bf308791bb13e54bddd9aa3544b7dff8",
+            "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/6572e78ef9d064eeb5c74d4ffe61b473a4996b68",
+            "reference": "6572e78ef9d064eeb5c74d4ffe61b473a4996b68",
             "shasum": ""
         },
         "require": {
-            "php": ">4.3.0"
+            "php": ">=5.3.0"
         },
-        "time": "2015-04-15 13:21:45",
+        "require-dev": {
+            "phpunit/phpunit": "4.5.*"
+        },
+        "time": "2015-07-24 11:36:49",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "./"
-            ]
+            "psr-4": {
+                "splitbrain\\PHPArchive\\": "src"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "GPL-2.0"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Nigel McNie",
-                "email": "nigel@geshi.org"
-            },
-            {
-                "name": "Benny Baumann",
-                "email": "BenBE@geshi.org"
+                "name": "Andreas Gohr",
+                "email": "andi@splitbrain.org"
             }
         ],
-        "description": "GeSHi - Generic Syntax Highlighter. This is an unmodified port of GeSHi project code found on SourceForge.",
-        "homepage": "http://qbnz.com/highlighter",
+        "description": "Pure-PHP implementation to read and write TAR and ZIP archives",
         "keywords": [
-            "highlight",
-            "highlighter",
-            "syntax"
+            "archive",
+            "extract",
+            "tar",
+            "unpack",
+            "unzip",
+            "zip"
         ]
     }
 ]
diff --git a/vendor/easybook/geshi/geshi/cpp-qt.php b/vendor/easybook/geshi/geshi/cpp-qt.php
index 5a23f58546c07f404d9c17b7332021020d53b389..44f2d215f712754969ca5d5f92fb8d053568093a 100755
--- a/vendor/easybook/geshi/geshi/cpp-qt.php
+++ b/vendor/easybook/geshi/geshi/cpp-qt.php
@@ -540,7 +540,7 @@ $language_data = array (
         2 => '',
         3 => '',
         4 => '',
-        5 => 'http://doc.trolltech.com/latest/{FNAMEL}.html'
+        5 => 'http://doc.qt.io/qt-5/{FNAMEL}.html'
         ),
     'OOLANG' => true,
     'OBJECT_SPLITTERS' => array(
diff --git a/vendor/splitbrain/php-archive/README.md b/vendor/splitbrain/php-archive/README.md
index 4fb67325911dcf76f030dbf064594c24ffe319f6..6c5780a7ac2ec5055939fa5e42652fdb4ea2a0dc 100644
--- a/vendor/splitbrain/php-archive/README.md
+++ b/vendor/splitbrain/php-archive/README.md
@@ -18,24 +18,29 @@ Use composer:
 Usage
 -----
 
-The usage for the Zip and Tar classes are basically the same. Here are some examples for working with TARs to get
-you started. Check the source code comments for more info
+The usage for the Zip and Tar classes are basically the same. Here are some
+examples for working with TARs to get you started. Check the source code
+comments for more info
 
 ```php
+require_once 'vendor/autoload.php';
 use splitbrain\PHPArchive\Tar;
 
-// To list the contents of an existing TAR archive, open() it and use contents() on it:
+// To list the contents of an existing TAR archive, open() it and use
+// contents() on it:
 $tar = new Tar();
 $tar->open('myfile.tgz');
 $toc = $tar->contents();
 print_r($toc); // array of FileInfo objects
 
-// To extract the contents of an existing TAR archive, open() it and use extract() on it:
+// To extract the contents of an existing TAR archive, open() it and use
+// extract() on it:
 $tar = new Tar();
 $tar->open('myfile.tgz');
 $tar->extract('/tmp');
 
-// To create a new TAR archive directly on the filesystem (low memory requirements), create() it,
+// To create a new TAR archive directly on the filesystem (low memory
+// requirements), create() it:
 $tar = new Tar();
 $tar->create('myfile.tgz');
 $tar->addFile(...);
@@ -43,8 +48,8 @@ $tar->addData(...);
 ...
 $tar->close();
 
-// To create a TAR archive directly in memory, create() it, add*() files and then either save()
-// or getData() it:
+// To create a TAR archive directly in memory, create() it, add*()
+// files and then either save() or getArchive() it:
 $tar = new Tar();
 $tar->create();
 $tar->addFile(...);
@@ -54,8 +59,8 @@ $tar->save('myfile.tgz'); // compresses and saves it
 echo $tar->getArchive(Archive::COMPRESS_GZIP); // compresses and returns it
 ```
 
-Differences between Tar and Zip: Tars are compressed as a whole while Zips compress each file individually. Therefore
-you can call ```setCompression``` before each ```addFile()``` and ```addData()``` functions.
+Differences between Tar and Zip: Tars are compressed as a whole, while Zips compress each file individually. Therefore
+you can call ```setCompression``` before each ```addFile()``` and ```addData()``` function call.
 
 The FileInfo class can be used to specify additional info like ownership or permissions when adding a file to
 an archive. 
\ No newline at end of file
diff --git a/vendor/splitbrain/php-archive/src/Zip.php b/vendor/splitbrain/php-archive/src/Zip.php
index c2ff3657536f27c5a0230e7dcea3ba4b726fc32d..1bc1ac1b7b24415b879608e70e4d6a03a17b4f72 100644
--- a/vendor/splitbrain/php-archive/src/Zip.php
+++ b/vendor/splitbrain/php-archive/src/Zip.php
@@ -7,6 +7,8 @@ namespace splitbrain\PHPArchive;
  *
  * Creates or extracts Zip archives
  *
+ * for specs see http://www.pkware.com/appnote
+ *
  * @author  Andreas Gohr <andi@splitbrain.org>
  * @package splitbrain\PHPArchive
  * @license MIT
@@ -221,6 +223,7 @@ class Zip extends Archive
                 }
                 fclose($fp);
                 gzclose($gzp);
+                unlink($extractto); // remove temporary gz file
             }
 
             touch($output, $fileinfo->getMtime());
@@ -308,45 +311,45 @@ class Zip extends Archive
             throw new ArchiveIOException('Archive has been closed, files can no longer be added');
         }
 
-        // prepare the various header infos
-        $dtime    = dechex($this->makeDosTime($fileinfo->getMtime()));
-        $hexdtime = pack(
-            'H*',
-            $dtime[6].$dtime[7].
-            $dtime[4].$dtime[5].
-            $dtime[2].$dtime[3].
-            $dtime[0].$dtime[1]
-        );
+        // prepare info and compress data
         $size     = strlen($data);
         $crc      = crc32($data);
         if ($this->complevel) {
-            $fmagic = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00";
-            $cmagic = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00";
-            $data   = gzcompress($data, $this->complevel);
-            $data   = substr($data, 2, -4); // strip compression headers
-        } else {
-            $fmagic = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00";
-            $cmagic = "\x50\x4b\x01\x02\x14\x00\x0a\x00\x00\x00\x00\x00";
+            $data = gzcompress($data, $this->complevel);
+            $data = substr($data, 2, -4); // strip compression headers
         }
         $csize  = strlen($data);
         $offset = $this->dataOffset();
         $name   = $fileinfo->getPath();
+        $time   = $fileinfo->getMtime();
+
+        // write local file header
+        $this->writebytes($this->makeLocalFileHeader(
+            $time,
+            $crc,
+            $size,
+            $csize,
+            $name,
+            (bool) $this->complevel
+        ));
+
+        // we store no encryption header
 
         // write data
-        $this->writebytes($fmagic);
-        $this->writebytes($hexdtime);
-        $this->writebytes(pack('V', $crc).pack('V', $csize).pack('V', $size)); //pre header
-        $this->writebytes(pack('v', strlen($name)).pack('v', 0).$name.$data); //file data
-        $this->writebytes(pack('V', $crc).pack('V', $csize).pack('V', $size)); //post header
+        $this->writebytes($data);
+
+        // we store no data descriptor
 
         // add info to central file directory
-        $cdrec = $cmagic;
-        $cdrec .= $hexdtime.pack('V', $crc).pack('V', $csize).pack('V', $size);
-        $cdrec .= pack('v', strlen($name)).pack('v', 0).pack('v', 0);
-        $cdrec .= pack('v', 0).pack('v', 0).pack('V', 32);
-        $cdrec .= pack('V', $offset);
-        $cdrec .= $name;
-        $this->ctrl_dir[] = $cdrec;
+        $this->ctrl_dir[] = $this->makeCentralFileRecord(
+            $offset,
+            $time,
+            $crc,
+            $size,
+            $csize,
+            $name,
+            (bool) $this->complevel
+        );
     }
 
     /**
@@ -361,14 +364,24 @@ class Zip extends Archive
             return;
         } // we did this already
 
-        // write footer
         if ($this->writeaccess) {
-            $offset  = $this->dataOffset();
+            // write central directory
+            $offset = $this->dataOffset();
             $ctrldir = join('', $this->ctrl_dir);
             $this->writebytes($ctrldir);
-            $this->writebytes("\x50\x4b\x05\x06\x00\x00\x00\x00"); // EOF CTRL DIR
-            $this->writebytes(pack('v', count($this->ctrl_dir)).pack('v', count($this->ctrl_dir)));
-            $this->writebytes(pack('V', strlen($ctrldir)).pack('V', strlen($offset))."\x00\x00");
+
+            // write end of central directory record
+            $this->writebytes("\x50\x4b\x05\x06"); // end of central dir signature
+            $this->writebytes(pack('v', 0)); // number of this disk
+            $this->writebytes(pack('v', 0)); // number of the disk with the start of the central directory
+            $this->writebytes(pack('v',
+                count($this->ctrl_dir))); // total number of entries in the central directory on this disk
+            $this->writebytes(pack('v', count($this->ctrl_dir))); // total number of entries in the central directory
+            $this->writebytes(pack('V', strlen($ctrldir))); // size of the central directory
+            $this->writebytes(pack('V',
+                $offset)); // offset of start of central directory with respect to the starting disk number
+            $this->writebytes(pack('v', 0)); // .ZIP file comment length
+
             $this->ctrl_dir = array();
         }
 
@@ -492,18 +505,7 @@ class Zip extends Archive
             $header['comment'] = '';
         }
 
-        if ($header['mdate'] && $header['mtime']) {
-            $hour            = ($header['mtime'] & 0xF800) >> 11;
-            $minute          = ($header['mtime'] & 0x07E0) >> 5;
-            $seconde         = ($header['mtime'] & 0x001F) * 2;
-            $year            = (($header['mdate'] & 0xFE00) >> 9) + 1980;
-            $month           = ($header['mdate'] & 0x01E0) >> 5;
-            $day             = $header['mdate'] & 0x001F;
-            $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
-        } else {
-            $header['mtime'] = time();
-        }
-
+        $header['mtime']           = $this->makeUnixTime($header['mdate'], $header['mtime']);
         $header['stored_filename'] = $header['filename'];
         $header['status']          = 'ok';
         if (substr($header['filename'], -1) == '/') {
@@ -518,12 +520,12 @@ class Zip extends Archive
      * Reads the local file header
      *
      * This header precedes each individual file inside the zip file. Assumes the current file pointer is pointing at
-     * the right position already. Enhances this given central header with the data found at the local header.
+     * the right position already. Enhances the given central header with the data found at the local header.
      *
      * @param array $header the central file header read previously (see above)
      * @return array
      */
-    function readFileHeader($header)
+    protected function readFileHeader($header)
     {
         $binary_data = fread($this->fh, 30);
         $data        = unpack(
@@ -549,20 +551,7 @@ class Zip extends Archive
             }
         }
         $header['flag']  = $data['flag'];
-        $header['mdate'] = $data['mdate'];
-        $header['mtime'] = $data['mtime'];
-
-        if ($header['mdate'] && $header['mtime']) {
-            $hour            = ($header['mtime'] & 0xF800) >> 11;
-            $minute          = ($header['mtime'] & 0x07E0) >> 5;
-            $seconde         = ($header['mtime'] & 0x001F) * 2;
-            $year            = (($header['mdate'] & 0xFE00) >> 9) + 1980;
-            $month           = ($header['mdate'] & 0x01E0) >> 5;
-            $day             = $header['mdate'] & 0x001F;
-            $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
-        } else {
-            $header['mtime'] = time();
-        }
+        $header['mtime'] = $this->makeUnixTime($data['mdate'], $data['mtime']);
 
         $header['stored_filename'] = $header['filename'];
         $header['status']          = "ok";
@@ -651,4 +640,111 @@ class Zip extends Archive
         ($timearray['seconds'] >> 1);
     }
 
+    /**
+     * Create a UNIX timestamp from a DOS timestamp
+     *
+     * @param $mdate
+     * @param $mtime
+     * @return int
+     */
+    protected function makeUnixTime($mdate = null, $mtime = null)
+    {
+        if ($mdate && $mtime) {
+            $year = (($mdate & 0xFE00) >> 9) + 1980;
+            $month = ($mdate & 0x01E0) >> 5;
+            $day = $mdate & 0x001F;
+
+            $hour = ($mtime & 0xF800) >> 11;
+            $minute = ($mtime & 0x07E0) >> 5;
+            $seconde = ($mtime & 0x001F) << 1;
+
+            $mtime = mktime($hour, $minute, $seconde, $month, $day, $year);
+        } else {
+            $mtime = time();
+        }
+
+        return $mtime;
+    }
+
+    /**
+     * Returns a local file header for the given data
+     *
+     * @param int $offset location of the local header
+     * @param int $ts unix timestamp
+     * @param int $crc CRC32 checksum of the uncompressed data
+     * @param int $len length of the uncompressed data
+     * @param int $clen length of the compressed data
+     * @param string $name file name
+     * @param boolean|null $comp if compression is used, if null it's determined from $len != $clen
+     * @return string
+     */
+    protected function makeCentralFileRecord($offset, $ts, $crc, $len, $clen, $name, $comp = null)
+    {
+        if(is_null($comp)) $comp = $len != $clen;
+        $comp = $comp ? 8 : 0;
+        $dtime = dechex($this->makeDosTime($ts));
+
+        $header = "\x50\x4b\x01\x02"; // central file header signature
+        $header .= pack('v', 14); // version made by - VFAT
+        $header .= pack('v', 20); // version needed to extract - 2.0
+        $header .= pack('v', 0); // general purpose flag - no flags set
+        $header .= pack('v', $comp); // compression method - deflate|none
+        $header .= pack(
+            'H*',
+            $dtime[6] . $dtime[7] .
+            $dtime[4] . $dtime[5] .
+            $dtime[2] . $dtime[3] .
+            $dtime[0] . $dtime[1]
+        ); //  last mod file time and date
+        $header .= pack('V', $crc); // crc-32
+        $header .= pack('V', $clen); // compressed size
+        $header .= pack('V', $len); // uncompressed size
+        $header .= pack('v', strlen($name)); // file name length
+        $header .= pack('v', 0); // extra field length
+        $header .= pack('v', 0); // file comment length
+        $header .= pack('v', 0); // disk number start
+        $header .= pack('v', 0); // internal file attributes
+        $header .= pack('V', 0); // external file attributes  @todo was 0x32!?
+        $header .= pack('V', $offset); // relative offset of local header
+        $header .= $name; // file name
+
+        return $header;
+    }
+
+    /**
+     * Returns a local file header for the given data
+     *
+     * @param int $ts unix timestamp
+     * @param int $crc CRC32 checksum of the uncompressed data
+     * @param int $len length of the uncompressed data
+     * @param int $clen length of the compressed data
+     * @param string $name file name
+     * @param boolean|null $comp if compression is used, if null it's determined from $len != $clen
+     * @return string
+     */
+    protected function makeLocalFileHeader($ts, $crc, $len, $clen, $name, $comp = null)
+    {
+        if(is_null($comp)) $comp = $len != $clen;
+        $comp = $comp ? 8 : 0;
+        $dtime = dechex($this->makeDosTime($ts));
+
+        $header = "\x50\x4b\x03\x04"; //  local file header signature
+        $header .= pack('v', 20); // version needed to extract - 2.0
+        $header .= pack('v', 0); // general purpose flag - no flags set
+        $header .= pack('v', $comp); // compression method - deflate|none
+        $header .= pack(
+            'H*',
+            $dtime[6] . $dtime[7] .
+            $dtime[4] . $dtime[5] .
+            $dtime[2] . $dtime[3] .
+            $dtime[0] . $dtime[1]
+        ); //  last mod file time and date
+        $header .= pack('V', $crc); // crc-32
+        $header .= pack('V', $clen); // compressed size
+        $header .= pack('V', $len); // uncompressed size
+        $header .= pack('v', strlen($name)); // file name length
+        $header .= pack('v', 0); // extra field length
+        $header .= $name;
+        return $header;
+    }
 }