diff --git a/_test/tests/inc/PassHash.test.php b/_test/tests/inc/PassHash.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6cb070903861fd7bf0859b24fc939de9c9543ab
--- /dev/null
+++ b/_test/tests/inc/PassHash.test.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * Class PassHash_test
+ *
+ * most tests are in auth_password.test.php
+ */
+class PassHash_test extends PHPUnit_Framework_TestCase {
+
+    function test_hmac(){
+        // known hashes taken from https://code.google.com/p/yii/issues/detail?id=1942
+        $this->assertEquals('df08aef118f36b32e29d2f47cda649b6', PassHash::hmac('md5','data','secret'));
+        $this->assertEquals('9818e3306ba5ac267b5f2679fe4abd37e6cd7b54', PassHash::hmac('sha1','data','secret'));
+
+        // known hashes from https://en.wikipedia.org/wiki/Hash-based_message_authentication_code
+        $this->assertEquals('74e6f7298a9c2d168935f58c001bad88', PassHash::hmac('md5','',''));
+        $this->assertEquals('fbdb1d1b18aa6c08324b7d64b71fb76370690e1d', PassHash::hmac('sha1','',''));
+        $this->assertEquals('80070713463e7749b90c2dc24911e275', PassHash::hmac('md5','The quick brown fox jumps over the lazy dog','key'));
+        $this->assertEquals('de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9', PassHash::hmac('sha1','The quick brown fox jumps over the lazy dog','key'));
+
+    }
+}
\ No newline at end of file
diff --git a/_test/tests/inc/common_ml.test.php b/_test/tests/inc/common_ml.test.php
index 0abfde37af2d50e6cfce380717f63ceb6aa273fc..6f3b71db446f3f86b56c6bcb2b0d6fc5fcddcce0 100644
--- a/_test/tests/inc/common_ml.test.php
+++ b/_test/tests/inc/common_ml.test.php
@@ -20,8 +20,8 @@ class common_ml_test extends DokuWikiTest {
 
         $args = array('a' => 'b', 'c' => 'd', 'q' => '&ä');
 
-        $expect = DOKU_BASE . $this->script . '?a=b&amp;c=d&amp;q=%26%C3%A4&amp;media=some:';
-        $this->assertEquals($expect, ml('some:', $args));
+        $expect = DOKU_BASE . $this->script . '?a=b&amp;c=d&amp;q=%26%C3%A4&amp;media=some:img.jpg';
+        $this->assertEquals($expect, ml('some:img.jpg', $args));
     }
 
     function test_ml_args_string() {
@@ -31,8 +31,8 @@ class common_ml_test extends DokuWikiTest {
 
         $args = 'a=b&c=d';
 
-        $expect = DOKU_BASE . $this->script . '?a=b&c=d&amp;media=some:';
-        $this->assertEquals($expect, ml('some:', $args));
+        $expect = DOKU_BASE . $this->script . '?a=b&c=d&amp;media=some:img.png';
+        $this->assertEquals($expect, ml('some:img.png', $args));
     }
 
     function test_ml_args_comma_string() {
@@ -42,8 +42,8 @@ class common_ml_test extends DokuWikiTest {
 
         $args = 'a=b,c=d';
 
-        $expect = DOKU_BASE . $this->script . '?a=b&amp;c=d&amp;media=some:';
-        $this->assertEquals($expect, ml('some:', $args));
+        $expect = DOKU_BASE . $this->script . '?a=b&amp;c=d&amp;media=some:img.gif';
+        $this->assertEquals($expect, ml('some:img.gif', $args));
     }
 
 
@@ -52,7 +52,7 @@ class common_ml_test extends DokuWikiTest {
         $conf['useslash'] = 0;
         $conf['userewrite'] = 0;
 
-        $id = 'some:';
+        $id = 'some:img.png';
         $w = 80;
         $args = array('w' => $w);
         $tok = media_get_token($id,$w,0);
@@ -66,7 +66,7 @@ class common_ml_test extends DokuWikiTest {
         $conf['useslash'] = 0;
         $conf['userewrite'] = 0;
 
-        $id = 'some:';
+        $id = 'some:img.png';
         $w = 80;
         $args = 'w='.$w;
         $tok = media_get_token($id,$w,0);
@@ -74,4 +74,41 @@ class common_ml_test extends DokuWikiTest {
         $expect = DOKU_BASE . $this->script . '?w='.$w.'&amp;tok='.$tok.'&amp;media='.$id;
         $this->assertEquals($expect, ml($id, $args));
     }
+
+    function test_ml_imgresize_array_rootid() {
+        global $conf;
+        $conf['useslash']   = 0;
+        $conf['userewrite'] = 0;
+
+        $id      = ':wiki:dokuwiki-128.png';
+        $cleanid = 'wiki:dokuwiki-128.png';
+        $w       = 80;
+        $args    = array('w' => $w);
+        $tok     = media_get_token($cleanid, $w, 0);
+
+        $expect = DOKU_BASE.$this->script.'?w='.$w.'&amp;tok='.$tok.'&amp;media='.$cleanid;
+        $this->assertEquals($expect, ml($id, $args));
+    }
+
+    function test_ml_imgresize_array_external() {
+        global $conf;
+        $conf['useslash']   = 0;
+        $conf['userewrite'] = 0;
+
+        $ids  = array(
+            'https://example.com/lib/tpl/dokuwiki/images/logo.png',
+            'http://example.com/lib/tpl/dokuwiki/images/logo.png',
+            'ftp://example.com/lib/tpl/dokuwiki/images/logo.png'
+        );
+        $w    = 80;
+        $args = array('w' => $w);
+
+        foreach($ids as $id) {
+            $tok = media_get_token($id, $w, 0);
+            $hash = substr(PassHash::hmac('md5', $id, auth_cookiesalt()), 0, 6);
+
+            $expect = DOKU_BASE.$this->script.'?hash='.$hash.'&amp;w='.$w.'&amp;tok='.$tok.'&amp;media='.rawurlencode($id);
+            $this->assertEquals($expect, ml($id, $args));
+        }
+    }
 }
diff --git a/_test/tests/inc/pageutils_clean_id.test.php b/_test/tests/inc/pageutils_clean_id.test.php
index 9c5781b248edd5cd13d7c4f7ddbec60c11269160..478fd2bc464860a57fc3edcbfd9b6a4c8ca2b38c 100644
--- a/_test/tests/inc/pageutils_clean_id.test.php
+++ b/_test/tests/inc/pageutils_clean_id.test.php
@@ -43,6 +43,10 @@ class init_clean_id_test extends DokuWikiTest {
         $tests[] = array('ns._#!ns:page','false','ns._ns:page');
         $tests[] = array('ns_:page',false,'ns:page');
         $tests[] = array('page...page','false','page...page');
+        $tests[] = array(':page',false,'page');
+        $tests[] = array(':ns:page',false,'ns:page');
+        $tests[] = array('page:',false,'page');
+        $tests[] = array('ns:page:',false,'ns:page');
 
         $conf['useslash'] = 0;
         $tests[] = array('page/page',false,'page_page');
diff --git a/conf/mysql.conf.php.example b/conf/mysql.conf.php.example
index 94bc14e1fb6bca19280701cd8d5d9ba3cc6492cf..c67e77c4548f5f12648a5112861be40ce510dd0f 100644
--- a/conf/mysql.conf.php.example
+++ b/conf/mysql.conf.php.example
@@ -1,6 +1,6 @@
 <?php
 /*
- * This is an example configuration for the mysql auth module.
+ * This is an example configuration for the mysql auth plugin.
  *
  * This SQL statements are optimized for following table structure.
  * If you use a different one you have to change them accordingly.
@@ -23,29 +23,29 @@
  * options carefully, otherwise you won't be able to access you
  * database.
  */
-$conf['auth']['mysql']['server']   = '';
-$conf['auth']['mysql']['user']     = '';
-$conf['auth']['mysql']['password'] = '';
-$conf['auth']['mysql']['database'] = '';
+$conf['plugin']['authmysql']['server']   = '';
+$conf['plugin']['authmysql']['user']     = '';
+$conf['plugin']['authmysql']['password'] = '';
+$conf['plugin']['authmysql']['database'] = '';
 
-/* This option enables debug messages in the mysql module. It is
- * mostly usefull for system admins.
+/* This option enables debug messages in the mysql plugin. It is
+ * mostly useful for system admins.
  */
-$conf['auth']['mysql']['debug'] = 0;
+$conf['plugin']['authmysql']['debug'] = 0;
 
 /* Normally password encryption is done by DokuWiki (recommended) but for
  * some reasons it might be usefull to let the database do the encryption.
  * Set 'forwardClearPass' to '1' and the cleartext password is forwarded to
  * the database, otherwise the encrypted one.
  */
-$conf['auth']['mysql']['forwardClearPass'] = 0;
+$conf['plugin']['authmysql']['forwardClearPass'] = 0;
 
 /* Multiple table operations will be protected by locks. This array tolds
- * the module which tables to lock. If you use any aliases for table names
+ * the plugin which tables to lock. If you use any aliases for table names
  * these array must also contain these aliases. Any unamed alias will cause
  * a warning during operation. See the example below.
  */
-$conf['auth']['mysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
+$conf['plugin']['authmysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
 
 /***********************************************************************/
 /*       Basic SQL statements for user authentication (required)       */
@@ -56,19 +56,19 @@ $conf['auth']['mysql']['TablesToLock']= array("users", "users AS u","groups", "g
  * of the user. If the result table is empty or contains more than one
  * row, access will be denied.
  *
- * The module access the password as 'pass' so a alias might be necessary.
+ * The plugin accesses the password as 'pass' so a alias might be necessary.
  *
  * Following patters will be replaced:
  *   %{user}    user name
  *   %{pass}    encrypted or clear text password (depends on 'encryptPass')
  *   %{dgroup}  default group name
  */
-$conf['auth']['mysql']['checkPass']   = "SELECT pass
-                                         FROM usergroup AS ug
-                                         JOIN users AS u ON u.uid=ug.uid
-                                         JOIN groups AS g ON g.gid=ug.gid
-                                         WHERE login='%{user}'
-                                         AND name='%{dgroup}'";
+$conf['plugin']['authmysql']['checkPass']   = "SELECT pass
+                                               FROM usergroup AS ug
+                                               JOIN users AS u ON u.uid=ug.uid
+                                               JOIN groups AS g ON g.gid=ug.gid
+                                               WHERE login='%{user}'
+                                               AND name='%{dgroup}'";
 
 /* This statement should return a table with exact one row containing
  * information about one user. The field needed are:
@@ -82,23 +82,23 @@ $conf['auth']['mysql']['checkPass']   = "SELECT pass
  * Following patters will be replaced:
  *   %{user}    user name
  */
-$conf['auth']['mysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
-                                         FROM users
-                                         WHERE login='%{user}'";
+$conf['plugin']['authmysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
+                                               FROM users
+                                               WHERE login='%{user}'";
 
 /* This statement is used to get all groups a user is member of. The
  * result should be a table containing all groups the given user is
- * member of. The module access the group name as 'group' so a alias
+ * member of. The plugin accesses the group name as 'group' so an alias
  * might be nessecary.
  *
  * Following patters will be replaced:
  *   %{user}    user name
  */
-$conf['auth']['mysql']['getGroups']   = "SELECT name as `group`
-                                         FROM groups g, users u, usergroup ug
-                                         WHERE u.uid = ug.uid
-                                         AND g.gid = ug.gid
-                                         AND u.login='%{user}'";
+$conf['plugin']['authmysql']['getGroups']   = "SELECT name as `group`
+                                               FROM groups g, users u, usergroup ug
+                                               WHERE u.uid = ug.uid
+                                               AND g.gid = ug.gid
+                                               AND u.login='%{user}'";
 
 /***********************************************************************/
 /*      Additional minimum SQL statements to use the user manager      */
@@ -106,7 +106,7 @@ $conf['auth']['mysql']['getGroups']   = "SELECT name as `group`
 
 /* This statement should return a table containing all user login names
  * that meet certain filter criteria. The filter expressions will be added
- * case dependend by the module. At the end a sort expression will be added.
+ * case dependend by the plugin. At the end a sort expression will be added.
  * Important is that this list contains no double entries fo a user. Each
  * user name is only allowed once in the table.
  *
@@ -118,15 +118,15 @@ $conf['auth']['mysql']['getGroups']   = "SELECT name as `group`
  *   %{email}   in FilterEmail  user's email address
  *   %{group}   in FilterGroup  group name
  */
-$conf['auth']['mysql']['getUsers']    = "SELECT DISTINCT login AS user
-                                         FROM users AS u
-                                         LEFT JOIN usergroup AS ug ON u.uid=ug.uid
-                                         LEFT JOIN groups AS g ON ug.gid=g.gid";
-$conf['auth']['mysql']['FilterLogin'] = "login LIKE '%{user}'";
-$conf['auth']['mysql']['FilterName']  = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
-$conf['auth']['mysql']['FilterEmail'] = "email LIKE '%{email}'";
-$conf['auth']['mysql']['FilterGroup'] = "name LIKE '%{group}'";
-$conf['auth']['mysql']['SortOrder']   = "ORDER BY login";
+$conf['plugin']['authmysql']['getUsers']    = "SELECT DISTINCT login AS user
+                                               FROM users AS u
+                                               LEFT JOIN usergroup AS ug ON u.uid=ug.uid
+                                               LEFT JOIN groups AS g ON ug.gid=g.gid";
+$conf['plugin']['authmysql']['FilterLogin'] = "login LIKE '%{user}'";
+$conf['plugin']['authmysql']['FilterName']  = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
+$conf['plugin']['authmysql']['FilterEmail'] = "email LIKE '%{email}'";
+$conf['plugin']['authmysql']['FilterGroup'] = "name LIKE '%{group}'";
+$conf['plugin']['authmysql']['SortOrder']   = "ORDER BY login";
 
 /***********************************************************************/
 /*   Additional SQL statements to add new users with the user manager  */
@@ -141,18 +141,18 @@ $conf['auth']['mysql']['SortOrder']   = "ORDER BY login";
  *   %{email}   email address
  *   %{name}    user's full name
  */
-$conf['auth']['mysql']['addUser']     = "INSERT INTO users
-                                         (login, pass, email, firstname, lastname)
-                                         VALUES ('%{user}', '%{pass}', '%{email}',
-                                         SUBSTRING_INDEX('%{name}',' ', 1),
-                                         SUBSTRING_INDEX('%{name}',' ', -1))";
+$conf['plugin']['authmysql']['addUser']     = "INSERT INTO users
+                                               (login, pass, email, firstname, lastname)
+                                               VALUES ('%{user}', '%{pass}', '%{email}',
+                                               SUBSTRING_INDEX('%{name}',' ', 1),
+                                               SUBSTRING_INDEX('%{name}',' ', -1))";
 
 /* This statement should add a group to the database.
  * Following patterns will be replaced:
  *   %{group}   group name
  */
-$conf['auth']['mysql']['addGroup']    = "INSERT INTO groups (name)
-                                         VALUES ('%{group}')";
+$conf['plugin']['authmysql']['addGroup']    = "INSERT INTO groups (name)
+                                               VALUES ('%{group}')";
 
 /* This statement should connect a user to a group (a user become member
  * of that group).
@@ -162,26 +162,26 @@ $conf['auth']['mysql']['addGroup']    = "INSERT INTO groups (name)
  *   %{group}   group name
  *   %{gid}     id of a group dataset
  */
-$conf['auth']['mysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
-                                         VALUES ('%{uid}', '%{gid}')";
+$conf['plugin']['authmysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
+                                               VALUES ('%{uid}', '%{gid}')";
 
 /* This statement should remove a group fom the database.
  * Following patterns will be replaced:
  *   %{group}   group name
  *   %{gid}     id of a group dataset
  */
-$conf['auth']['mysql']['delGroup']    = "DELETE FROM groups
-                                         WHERE gid='%{gid}'";
+$conf['plugin']['authmysql']['delGroup']    = "DELETE FROM groups
+                                               WHERE gid='%{gid}'";
 
 /* This statement should return the database index of a given user name.
- * The module will access the index with the name 'id' so a alias might be
+ * The plugin will access the index with the name 'id' so a alias might be
  * necessary.
  * following patters will be replaced:
  *   %{user}    user name
  */
-$conf['auth']['mysql']['getUserID']   = "SELECT uid AS id
-                                         FROM users
-                                         WHERE login='%{user}'";
+$conf['plugin']['authmysql']['getUserID']   = "SELECT uid AS id
+                                               FROM users
+                                               WHERE login='%{user}'";
 
 /***********************************************************************/
 /*   Additional SQL statements to delete users with the user manager   */
@@ -192,16 +192,16 @@ $conf['auth']['mysql']['getUserID']   = "SELECT uid AS id
  *   %{user}    user's login name
  *   %{uid}     id of a user dataset
  */
-$conf['auth']['mysql']['delUser']     = "DELETE FROM users
-                                         WHERE uid='%{uid}'";
+$conf['plugin']['authmysql']['delUser']     = "DELETE FROM users
+                                               WHERE uid='%{uid}'";
 
 /* This statement should remove all connections from a user to any group
  * (a user quits membership of all groups).
  * Following patterns will be replaced:
  *   %{uid}     id of a user dataset
  */
-$conf['auth']['mysql']['delUserRefs'] = "DELETE FROM usergroup
-                                         WHERE uid='%{uid}'";
+$conf['plugin']['authmysql']['delUserRefs'] = "DELETE FROM usergroup
+                                               WHERE uid='%{uid}'";
 
 /***********************************************************************/
 /*   Additional SQL statements to modify users with the user manager   */
@@ -218,13 +218,13 @@ $conf['auth']['mysql']['delUserRefs'] = "DELETE FROM usergroup
  *   %{name}    user's full name
  *   %{uid}     user id that should be updated
  */
-$conf['auth']['mysql']['updateUser']  = "UPDATE users SET";
-$conf['auth']['mysql']['UpdateLogin'] = "login='%{user}'";
-$conf['auth']['mysql']['UpdatePass']  = "pass='%{pass}'";
-$conf['auth']['mysql']['UpdateEmail'] = "email='%{email}'";
-$conf['auth']['mysql']['UpdateName']  = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
-                                         lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
-$conf['auth']['mysql']['UpdateTarget']= "WHERE uid=%{uid}";
+$conf['plugin']['authmysql']['updateUser']  = "UPDATE users SET";
+$conf['plugin']['authmysql']['UpdateLogin'] = "login='%{user}'";
+$conf['plugin']['authmysql']['UpdatePass']  = "pass='%{pass}'";
+$conf['plugin']['authmysql']['UpdateEmail'] = "email='%{email}'";
+$conf['plugin']['authmysql']['UpdateName']  = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
+                                               lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
+$conf['plugin']['authmysql']['UpdateTarget']= "WHERE uid=%{uid}";
 
 /* This statement should remove a single connection from a user to a
  * group (a user quits membership of that group).
@@ -235,19 +235,19 @@ $conf['auth']['mysql']['UpdateTarget']= "WHERE uid=%{uid}";
  *   %{group}   group name
  *   %{gid}     id of a group dataset
  */
-$conf['auth']['mysql']['delUserGroup']= "DELETE FROM usergroup
-                                         WHERE uid='%{uid}'
-                                         AND gid='%{gid}'";
+$conf['plugin']['authmysql']['delUserGroup']= "DELETE FROM usergroup
+                                               WHERE uid='%{uid}'
+                                               AND gid='%{gid}'";
 
 /* This statement should return the database index of a given group name.
- * The module will access the index with the name 'id' so a alias might
+ * The plugin will access the index with the name 'id' so a alias might
  * be necessary.
  *
  * Following patters will be replaced:
  *   %{group}   group name
  */
-$conf['auth']['mysql']['getGroupID']  = "SELECT gid AS id
-                                         FROM groups
-                                         WHERE name='%{group}'";
+$conf['plugin']['authmysql']['getGroupID']  = "SELECT gid AS id
+                                               FROM groups
+                                               WHERE name='%{group}'";
 
 
diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php
index 080fb47780e0e5fc6c503a14fe7ac75f39cd1f22..61bd74939f8eb4e48f29ce82f25030f3afdab28c 100644
--- a/inc/PassHash.class.php
+++ b/inc/PassHash.class.php
@@ -494,4 +494,51 @@ class PassHash {
         $this->init_salt($salt, 8, false);
         return ':B:'.$salt.':'.md5($salt.'-'.md5($clear));
     }
+
+    /**
+     * Wraps around native hash_hmac() or reimplents it
+     *
+     * This is not directly used as password hashing method, and thus isn't callable via the
+     * verify_hash() method. It should be used to create signatures and might be used in other
+     * password hashing methods.
+     *
+     * @see hash_hmac()
+     * @author KC Cloyd
+     * @link http://www.php.net/manual/en/function.hash-hmac.php#93440
+     *
+     * @param string $algo Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4",
+     *                     etc..) See hash_algos() for a list of supported algorithms.
+     * @param string $data Message to be hashed.
+     * @param string $key  Shared secret key used for generating the HMAC variant of the message digest.
+     * @param bool $raw_output When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.
+     *
+     * @return string
+     */
+    public static function hmac($algo, $data, $key, $raw_output = false) {
+        // use native function if available and not in unit test
+        if(function_exists('hash_hmac') && !defined('SIMPLE_TEST')){
+            return hash_hmac($algo, $data, $key, $raw_output);
+        }
+
+        $algo = strtolower($algo);
+        $pack = 'H' . strlen($algo('test'));
+        $size = 64;
+        $opad = str_repeat(chr(0x5C), $size);
+        $ipad = str_repeat(chr(0x36), $size);
+
+        if(strlen($key) > $size) {
+            $key = str_pad(pack($pack, $algo($key)), $size, chr(0x00));
+        } else {
+            $key = str_pad($key, $size, chr(0x00));
+        }
+
+        for($i = 0; $i < strlen($key) - 1; $i++) {
+            $opad[$i] = $opad[$i] ^ $key[$i];
+            $ipad[$i] = $ipad[$i] ^ $key[$i];
+        }
+
+        $output = $algo($opad . pack($pack, $algo($ipad . $data)));
+
+        return ($raw_output) ? pack($pack, $output) : $output;
+    }
 }
diff --git a/inc/auth.php b/inc/auth.php
index 3f1f7925b27bb6f02c3a9d3c6255749aec861d04..1f8489f03fe8e195bb27974cc790e72db7b8aa2d 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -54,7 +54,7 @@ function auth_setup() {
       } elseif ('auth' . $conf['authtype'] === $plugin) {
         // matches old auth backends (pre-Weatherwax)
         $auth = $plugin_controller->load('auth', $plugin);
-        msg('Your authtype setting is deprecated. You must set $conf[\'authtype\'] = ' . "auth" . $conf['authtype']
+        msg('Your authtype setting is deprecated. You must set $conf[\'authtype\'] = "auth' . $conf['authtype'] . '"'
              . ' in your configuration (see <a href="https://www.dokuwiki.org/auth">Authentication Backends</a>)',-1,'','',MSG_ADMINS_ONLY);
       }
     }
@@ -993,7 +993,7 @@ function act_resendpwd() {
         }
 
         // generate auth token
-        $token = md5(auth_cookiesalt().$user); //secret but user based
+        $token = md5(uniqid(mt_rand(), true)); // random secret
         $tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
         $url   = wl('', array('do'=> 'resendpwd', 'pwauth'=> $token), true, '&');
 
diff --git a/inc/common.php b/inc/common.php
index 4d939ac772af192bf5f179a2fb9f6a2f90b1ad1f..59ceb0c0df7a0796932323220e9b06f4fc9b5d4b 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -56,7 +56,7 @@ function stripctl($string) {
  * @return  string
  */
 function getSecurityToken() {
-    return md5(auth_cookiesalt().session_id().$_SERVER['REMOTE_USER']);
+    return PassHash::hmac('md5', session_id().$_SERVER['REMOTE_USER'], auth_cookiesalt());
 }
 
 /**
@@ -435,6 +435,11 @@ function exportlink($id = '', $format = 'raw', $more = '', $abs = false, $sep =
  */
 function ml($id = '', $more = '', $direct = true, $sep = '&amp;', $abs = false) {
     global $conf;
+    $isexternalimage = preg_match('#^(https?|ftp)://#i', $id);
+    if(!$isexternalimage) {
+        $id = cleanID($id);
+    }
+
     if(is_array($more)) {
         // add token for resized images
         if($more['w'] || $more['h']){
@@ -467,10 +472,10 @@ function ml($id = '', $more = '', $direct = true, $sep = '&amp;', $abs = false)
     }
 
     // external URLs are always direct without rewriting
-    if(preg_match('#^(https?|ftp)://#i', $id)) {
+    if($isexternalimage) {
         $xlink .= 'lib/exe/fetch.php';
         // add hash:
-        $xlink .= '?hash='.substr(md5(auth_cookiesalt().$id), 0, 6);
+        $xlink .= '?hash='.substr(PassHash::hmac('md5', $id, auth_cookiesalt()), 0, 6);
         if($more) {
             $xlink .= $sep.$more;
             $xlink .= $sep.'media='.rawurlencode($id);
diff --git a/inc/fetch.functions.php b/inc/fetch.functions.php
index e78bbf10396f8d9d7e58a9a285b96a8c74c6d8a9..53ade3555f78d79042b620ce137d1f9af5cacb9f 100644
--- a/inc/fetch.functions.php
+++ b/inc/fetch.functions.php
@@ -102,7 +102,7 @@ function checkFileStatus(&$media, &$file, $rev = '', $width=0, $height=0) {
     //media to local file
     if(media_isexternal($media)) {
         //check hash
-        if(substr(md5(auth_cookiesalt().$media), 0, 6) !== $INPUT->str('hash')) {
+        if(substr(PassHash::hmac('md5', $media, auth_cookiesalt()), 0, 6) !== $INPUT->str('hash')) {
             return array(412, 'Precondition Failed');
         }
         //handle external images
diff --git a/inc/infoutils.php b/inc/infoutils.php
index 9fe5ee689042604437f377c7e39bb0ed949b4592..71e6429952fac132a851d81278118d91decba681 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -107,8 +107,8 @@ function check(){
         msg('DokuWiki version: '.getVersion(),1);
     }
 
-    if(version_compare(phpversion(),'5.1.2','<')){
-        msg('Your PHP version is too old ('.phpversion().' vs. 5.1.2+ needed)',-1);
+    if(version_compare(phpversion(),'5.2.0','<')){
+        msg('Your PHP version is too old ('.phpversion().' vs. 5.2.0+ needed)',-1);
     }else{
         msg('PHP version '.phpversion(),1);
     }
diff --git a/inc/lang/ko/draft.txt b/inc/lang/ko/draft.txt
index f7787f981c19bd2bd2b8f86d090c31941f3eb60b..b655d7c92c05cd37eb0568d283d43eb886685f52 100644
--- a/inc/lang/ko/draft.txt
+++ b/inc/lang/ko/draft.txt
@@ -1,5 +1,5 @@
 ====== 문서 초안 있음 ======
 
-이 문서의 마지막 편집 세션은 정상적으로 끝나지 않았습니다. DokuWiki는 작업 도중 자동으로 저장된 문서 초안을 사용하여 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 문서 초안을 아래에서 볼 수 있습니다.
+이 문서의 마지막 편집 세션은 정상적으로 끝나지 않았습니다. DokuWiki는 작업 도중 자동으로 저장된 문서 초안을 사용해 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 문서 초안을 아래에서 볼 수 있습니다.
 
 비정상적으로 끝난 편집 세션을 **되돌릴**지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하세요.
\ No newline at end of file
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 76d6a535ddd946bd3b4d3b09735e89c1219aaa59..76684659c960e365a26d8209a9603cb2b09a4938 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -160,7 +160,7 @@ $lang['accessdenied']          = '이 문서를 볼 권한이 없습니다.';
 $lang['mediausage']            = '이 파일을 참고하려면 다음 문법을 사용하세요:';
 $lang['mediaview']             = '원본 파일 보기';
 $lang['mediaroot']             = '루트 (root)';
-$lang['mediaupload']           = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 쌍점(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭하여 선택할 수 있습니다.';
+$lang['mediaupload']           = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 쌍점(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭해 선택할 수 있습니다.';
 $lang['mediaextchange']        = '파일 확장자가 .%s에서 .%s(으)로 바뀌었습니다!';
 $lang['reference']             = '참고';
 $lang['ref_inuse']             = '다음 문서에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:';
@@ -218,7 +218,7 @@ $lang['qb_hs']                 = '문단 제목 선택';
 $lang['qb_hplus']              = '상위 문단 제목';
 $lang['qb_hminus']             = '하위 문단 제목';
 $lang['qb_hequal']             = '동급 문단 제목';
-$lang['qb_link']               = '내부 링크';
+$lang['qb_link']               = '안쪽 링크';
 $lang['qb_extlink']            = '바깥 링크';
 $lang['qb_hr']                 = '가로줄';
 $lang['qb_ol']                 = '순서 있는 목록';
@@ -231,7 +231,7 @@ $lang['upperns']               = '상위 이름공간으로 이동';
 $lang['admin_register']        = '새 사용자 추가';
 $lang['metaedit']              = '메타 데이터 편집';
 $lang['metasaveerr']           = '메타 데이터 쓰기 실패';
-$lang['metasaveok']            = '메타 데이타 저장됨';
+$lang['metasaveok']            = '메타 데이터 저장됨';
 $lang['img_backto']            = '뒤로';
 $lang['img_title']             = '이름';
 $lang['img_caption']           = '설명';
@@ -304,7 +304,7 @@ $lang['media_uploadtab']       = '올리기';
 $lang['media_searchtab']       = '찾기';
 $lang['media_file']            = '파일';
 $lang['media_viewtab']         = '보기';
-$lang['media_edittab']         = '수정';
+$lang['media_edittab']         = '편집';
 $lang['media_historytab']      = '역사';
 $lang['media_list_thumbs']     = '섬네일';
 $lang['media_list_rows']       = '목록';
@@ -318,7 +318,7 @@ $lang['media_view']            = '%s';
 $lang['media_viewold']         = '%s (%s에 있음)';
 $lang['media_edit']            = '%s 편집';
 $lang['media_history']         = '%s 바뀜 내역';
-$lang['media_meta_edited']     = '메타데이터가 수정됨';
+$lang['media_meta_edited']     = '메타 데이터 편집됨';
 $lang['media_perm_read']       = '이 파일을 읽을 권한이 없습니다.';
 $lang['media_perm_upload']     = '파일을 올릴 권한이 없습니다.';
 $lang['media_update']          = '새 판 올리기';
diff --git a/inc/lang/ko/login.txt b/inc/lang/ko/login.txt
index 160b899d34295c8737ceb13a08df3fb93eacfa19..f8af4100fb99847abaf05b2a919ca3de25a2002f 100644
--- a/inc/lang/ko/login.txt
+++ b/inc/lang/ko/login.txt
@@ -1,3 +1,3 @@
 ====== 로그인 ======
 
-로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 받도록 설정하여야 합니다.
\ No newline at end of file
+로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 활성화해야 합니다.
\ No newline at end of file
diff --git a/inc/lang/ko/newpage.txt b/inc/lang/ko/newpage.txt
index 8db34f9cf6fa539b6bafc6804034dc31688d036b..fa786461077b755395db9ad5fbda2c5f99412fd0 100644
--- a/inc/lang/ko/newpage.txt
+++ b/inc/lang/ko/newpage.txt
@@ -1,3 +1,3 @@
 ====== 이 주제는 아직 없습니다 ======
 
-아직 없는 주제에 대한 링크를 따라왔습니다. **문서 만들기** 버튼을 클릭하여 새로 만들 수 있습니다.
\ No newline at end of file
+아직 없는 주제에 대한 링크를 따라왔습니다. **문서 만들기** 버튼을 클릭해 새로 만들 수 있습니다.
\ No newline at end of file
diff --git a/inc/lang/ko/norev.txt b/inc/lang/ko/norev.txt
index 3e203b235127132e8e737d7763127862b7c51224..246f3e4f6f8820a2eacc1a1b728d8341c75dc56f 100644
--- a/inc/lang/ko/norev.txt
+++ b/inc/lang/ko/norev.txt
@@ -1,3 +1,3 @@
 ====== 지정한 판 없음 ======
 
-지정한 판이 존재하지 않습니다. **이전 판** 버튼을 사용하여 이 문서의 이전 판 목록을 보세요.
\ No newline at end of file
+지정한 판이 존재하지 않습니다. **이전 판** 버튼을 사용해 이 문서의 이전 판 목록을 보세요.
\ No newline at end of file
diff --git a/inc/lang/ko/read.txt b/inc/lang/ko/read.txt
index c510b598e6f732dd96b802d2007664b234a318e7..8f080fcb1006094f62b0fc3f651e9bf6764a92a3 100644
--- a/inc/lang/ko/read.txt
+++ b/inc/lang/ko/read.txt
@@ -1 +1 @@
-이 문서는 읽기 전용입니다. 내용을 볼 수는 있지만 수정할 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
\ No newline at end of file
+이 문서는 읽기 전용입니다. 내용을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
\ No newline at end of file
diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt
index 8cc003950c0ddf0c4056d9056ebe9a8d0cf571b0..d3b37ec7cb887c49a8ab4626464a927dfbf53106 100644
--- a/inc/lang/ko/searchpage.txt
+++ b/inc/lang/ko/searchpage.txt
@@ -1,5 +1,5 @@
 ====== 찾기 ======
 
-아래에서 찾기 결과를 볼 수 있습니다. 만일 원하는 문서를 찾지 못하였다면, **문서 만들기**나 **문서 편집** 버튼을 사용하여 쿼리 내용과 같은 이름의 문서를 만들거나 편집할 수 있습니다.
+아래에서 찾기 결과를 볼 수 있습니다. 만일 원하는 문서를 찾지 못하였다면, **문서 만들기**나 **문서 편집** 버튼을 사용해 쿼리 내용과 같은 이름의 문서를 만들거나 편집할 수 있습니다.
 
 ===== ê²°ê³¼ =====
\ No newline at end of file
diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt
index b67cc9bbcd566f8e6130b70180585d41a5d515eb..6db7b963cf6847fea36a63c6df28c334f9d48efa 100644
--- a/inc/lang/ko/subscr_digest.txt
+++ b/inc/lang/ko/subscr_digest.txt
@@ -12,7 +12,7 @@
 
 
 이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
+@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
 
 --
 @DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file
diff --git a/inc/lang/ko/subscr_list.txt b/inc/lang/ko/subscr_list.txt
index 03ca86d2a95ba916171c85fa2a93a06dce059a15..c13e0097af8397dc35deada55318275296295194 100644
--- a/inc/lang/ko/subscr_list.txt
+++ b/inc/lang/ko/subscr_list.txt
@@ -8,7 +8,7 @@
 --------------------------------------------------------
 
 이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
+@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
 
 --
 @DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file
diff --git a/inc/lang/ko/subscr_single.txt b/inc/lang/ko/subscr_single.txt
index 5f8b43b98a8cd4bb0ba2bde6afec3c1ce877d277..d4e38e044eea976517e2eff753956791ba07af6b 100644
--- a/inc/lang/ko/subscr_single.txt
+++ b/inc/lang/ko/subscr_single.txt
@@ -14,7 +14,7 @@
 새 판 : @NEWPAGE@
 
 이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
+@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
 
 --
 @DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file
diff --git a/inc/media.php b/inc/media.php
index f3b1a0af59516f8fde3ecce27a8eef4dc6b28d0f..fbe1363ec2026a59663ed093cf6b54501223bb13 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -1891,20 +1891,21 @@ function media_crop_image($file, $ext, $w, $h=0){
  * cropped images have been internally generated - and prevent external
  * DDOS attacks via fetch
  *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ *
  * @param string  $id    id of the image
  * @param int     $w     resize/crop width
  * @param int     $h     resize/crop height
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
+ * @return string
  */
 function media_get_token($id,$w,$h){
     // token is only required for modified images
     if ($w || $h) {
-        $token = auth_cookiesalt().$id;
+        $token = $id;
         if ($w) $token .= '.'.$w;
         if ($h) $token .= '.'.$h;
 
-        return substr(md5($token),0,6);
+        return substr(PassHash::hmac('md5', $token, auth_cookiesalt()),0,6);
     }
 
     return '';
diff --git a/install.php b/install.php
index 24f06608d61ef0274191b584ee708c1e50c9575a..ab0fad121af3c84e12f46bd2c9469669c1500e6c 100644
--- a/install.php
+++ b/install.php
@@ -518,8 +518,8 @@ function check_functions(){
     global $lang;
     $ok = true;
 
-    if(version_compare(phpversion(),'5.1.2','<')){
-        $error[] = sprintf($lang['i_phpver'],phpversion(),'5.1.2');
+    if(version_compare(phpversion(),'5.2.0','<')){
+        $error[] = sprintf($lang['i_phpver'],phpversion(),'5.2.0');
         $ok = false;
     }
 
diff --git a/lib/plugins/acl/lang/ko/lang.php b/lib/plugins/acl/lang/ko/lang.php
index 5cec4b8fde2e03cb0f7d25360741c33dd10f24a0..7c1e9a43d822a6faa82d6caf5f29a0a0bdbb2f3a 100644
--- a/lib/plugins/acl/lang/ko/lang.php
+++ b/lib/plugins/acl/lang/ko/lang.php
@@ -40,4 +40,4 @@ $lang['acl_perm4']             = '만들기';
 $lang['acl_perm8']             = '올리기';
 $lang['acl_perm16']            = '삭제';
 $lang['acl_new']               = '새 항목 추가';
-$lang['acl_mod']               = '선택 항목 수정';
+$lang['acl_mod']               = '항목 수정';
diff --git a/lib/plugins/authad/auth.php b/lib/plugins/authad/auth.php
index b6b5dd268cd5a27479ad3a335c81699f9eadafd4..fcbd2eeef4424f2628ad27f1cf412504126458a6 100644
--- a/lib/plugins/authad/auth.php
+++ b/lib/plugins/authad/auth.php
@@ -489,6 +489,11 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
             $this->cando['modPass'] = false;
         }
 
+        // adLDAP expects empty user/pass as NULL, we're less strict FS#2781
+        if(empty($opts['admin_username'])) $opts['admin_username'] = null;
+        if(empty($opts['admin_password'])) $opts['admin_password'] = null;
+
+        // user listing needs admin priviledges
         if(!empty($opts['admin_username']) && !empty($opts['admin_password'])) {
             $this->cando['getUsers'] = true;
         } else {
diff --git a/lib/plugins/authad/conf/default.php b/lib/plugins/authad/conf/default.php
index 9274db209140492864f165d4d05685851b70e9e8..f71202cfcdb8b73a839a037d8ceb3bf38e85ff1a 100644
--- a/lib/plugins/authad/conf/default.php
+++ b/lib/plugins/authad/conf/default.php
@@ -4,8 +4,8 @@ $conf['account_suffix']     = '';
 $conf['base_dn']            = '';
 $conf['domain_controllers'] = '';
 $conf['sso']                = 0;
-$conf['admin_username']        = '';
-$conf['admin_password']        = '';
+$conf['admin_username']     = '';
+$conf['admin_password']     = '';
 $conf['real_primarygroup']  = 0;
 $conf['use_ssl']            = 0;
 $conf['use_tls']            = 0;
diff --git a/lib/plugins/authldap/auth.php b/lib/plugins/authldap/auth.php
index b49aa4792ed104e9a8ad2e2d5f01a129a9751e0b..6a967a6d4dd3840317bb0fce5123e619775fa3b1 100644
--- a/lib/plugins/authldap/auth.php
+++ b/lib/plugins/authldap/auth.php
@@ -248,7 +248,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
         }
 
         // always add the default group to the list of groups
-        if(!in_array($conf['defaultgroup'], $info['grps'])) {
+        if(!$info['grps'] or !in_array($conf['defaultgroup'], $info['grps'])) {
             $info['grps'][] = $conf['defaultgroup'];
         }
         return $info;
@@ -502,23 +502,23 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
      * @return resource
      */
     protected function _ldapsearch($link_identifier, $base_dn, $filter, $scope = 'sub', $attributes = null,
-                         $attrsonly = 0, $sizelimit = 0, $timelimit = 0, $deref = LDAP_DEREF_NEVER) {
+                         $attrsonly = 0, $sizelimit = 0) {
         if(is_null($attributes)) $attributes = array();
 
         if($scope == 'base') {
             return @ldap_read(
                 $link_identifier, $base_dn, $filter, $attributes,
-                $attrsonly, $sizelimit, $timelimit, $deref
+                $attrsonly, $sizelimit
             );
         } elseif($scope == 'one') {
             return @ldap_list(
                 $link_identifier, $base_dn, $filter, $attributes,
-                $attrsonly, $sizelimit, $timelimit, $deref
+                $attrsonly, $sizelimit
             );
         } else {
             return @ldap_search(
                 $link_identifier, $base_dn, $filter, $attributes,
-                $attrsonly, $sizelimit, $timelimit, $deref
+                $attrsonly, $sizelimit
             );
         }
     }
diff --git a/lib/plugins/authldap/conf/default.php b/lib/plugins/authldap/conf/default.php
index d07f9c82ec4e992241457b282676449691c14ef3..2c295eeeb1e192147a804f159e3bf8bcbc042999 100644
--- a/lib/plugins/authldap/conf/default.php
+++ b/lib/plugins/authldap/conf/default.php
@@ -9,6 +9,7 @@ $conf['groupfilter'] = '';
 $conf['version']     = 2;
 $conf['starttls']    = 0;
 $conf['referrals']   = 0;
+$conf['deref']       = 0;
 $conf['binddn']      = '';
 $conf['bindpw']      = '';
 //$conf['mapping']['name']  unsupported in config manager
@@ -16,4 +17,4 @@ $conf['bindpw']      = '';
 $conf['userscope']  = 'sub';
 $conf['groupscope'] = 'sub';
 $conf['groupkey']   = 'cn';
-$conf['debug']      = array('onoff');
\ No newline at end of file
+$conf['debug']      = 0;
\ No newline at end of file
diff --git a/lib/plugins/authldap/conf/metadata.php b/lib/plugins/authldap/conf/metadata.php
index fc5b2e63ccbb1e8af54899a3b5900850ae940105..a3256628c52a66d132e75805e5e2d95524e81df5 100644
--- a/lib/plugins/authldap/conf/metadata.php
+++ b/lib/plugins/authldap/conf/metadata.php
@@ -8,6 +8,7 @@ $meta['groupfilter'] = array('string');
 $meta['version']     = array('numeric');
 $meta['starttls']    = array('onoff');
 $meta['referrals']   = array('onoff');
+$meta['deref']       = array('multichoice','_choices' => array(0,1,2,3));
 $meta['binddn']      = array('string');
 $meta['bindpw']      = array('password');
 //$meta['mapping']['name']  unsupported in config manager
diff --git a/lib/plugins/authldap/lang/en/settings.php b/lib/plugins/authldap/lang/en/settings.php
index ddedf8ae3185fc23cf88e1a2f538fff5d3d55ef7..e3f385f99d513f9343991bf644ad8c75f2035dc5 100644
--- a/lib/plugins/authldap/lang/en/settings.php
+++ b/lib/plugins/authldap/lang/en/settings.php
@@ -8,9 +8,16 @@ $lang['groupfilter'] = 'LDAP filter to search for groups. Eg. <code>(&amp;(objec
 $lang['version']     = 'The protocol version to use. You may need to set this to <code>3</code>';
 $lang['starttls']    = 'Use TLS connections?';
 $lang['referrals']   = 'Shall referrals be followed?';
+$lang['deref']       = 'How to dereference aliases?';
 $lang['binddn']      = 'DN of an optional bind user if anonymous bind is not sufficient. Eg. <code>cn=admin, dc=my, dc=home</code>';
 $lang['bindpw']      = 'Password of above user';
 $lang['userscope']   = 'Limit search scope for user search';
 $lang['groupscope']  = 'Limit search scope for group search';
-$lang['groupkey']    = 'Group member ship from any user attribute (instead of standard AD groups) e.g. group from department or telephone number';
+$lang['groupkey']    = 'Group membership from any user attribute (instead of standard AD groups) e.g. group from department or telephone number';
 $lang['debug']       = 'Display additional debug information on errors';
+
+
+$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';
\ No newline at end of file
diff --git a/lib/plugins/authmysql/auth.php b/lib/plugins/authmysql/auth.php
index 5f6e86c71b99003bd4b66f74886ea8802a8bb0e3..036644a6797361e24312d5e1a403402346671121 100644
--- a/lib/plugins/authmysql/auth.php
+++ b/lib/plugins/authmysql/auth.php
@@ -843,7 +843,7 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin {
     /**
      * Locked a list of tables for exclusive access so that modifications
      * to the database can't be disturbed by other threads. The list
-     * could be set with $conf['auth']['mysql']['TablesToLock'] = array()
+     * could be set with $conf['plugin']['authmysql']['TablesToLock'] = array()
      *
      * If aliases for tables are used in SQL statements, also this aliases
      * must be locked. For eg. you use a table 'user' and the alias 'u' in
diff --git a/lib/plugins/authmysql/conf/default.php b/lib/plugins/authmysql/conf/default.php
index 647f3d96c9473743b2d617ddb7f19ecacc71eb63..427bea2739217b1fc2abfd0f8510e0cc581b7261 100644
--- a/lib/plugins/authmysql/conf/default.php
+++ b/lib/plugins/authmysql/conf/default.php
@@ -7,7 +7,7 @@ $conf['password']         = '';
 $conf['database']         = '';
 $conf['debug']            = 0;
 $conf['forwardClearPass'] = 0;
-$conf['TablesToLock']     = '';
+$conf['TablesToLock']     = array();
 $conf['checkPass']        = '';
 $conf['getUserInfo']      = '';
 $conf['getGroups']        = '';
diff --git a/lib/plugins/config/lang/ko/intro.txt b/lib/plugins/config/lang/ko/intro.txt
index a2dc7b6f6f685c552dcb62a6bf71325e0b48a69a..b9eb763a47e7c753f57eed4422b8677bdb08bd11 100644
--- a/lib/plugins/config/lang/ko/intro.txt
+++ b/lib/plugins/config/lang/ko/intro.txt
@@ -2,6 +2,6 @@
 
 DokuWiki 설치할 때 설정을 바꾸기 위해 사용하는 페이지입니다. 각 설정에 대한 자세한 도움말이 필요하다면 [[doku>ko:config|설정 문서 (한국어)]]와 [[doku>config|설정 문서 (영어)]]를 참고하세요.
 
-플러그인에 대한 자세한 정보가 필요하다면 [[doku>plugin:config|플러그인 설정]] 문서를 참고하세요. 빨간 배경색으로 보이는 설정은 이 플러그인에서 바꾸지 못하도록 되어있습니다. 파란 배경색으로 보이는 설정은 기본 설정값을 가지고 있습니다. 하얀 배경색으로 보이는 설정은 특별한 설치를 위해 설정되어 있습니다. 파란색과 하얀색 배경으로 된 설정은 수정이 가능합니다.
+플러그인에 대한 자세한 정보가 필요하다면 [[doku>plugin:config|플러그인 설정]] 문서를 참고하세요. 빨간 배경색으로 보이는 설정은 이 플러그인에서 바꾸지 못하도록 되어있습니다. 파란 배경색으로 보이는 설정은 기본 설정값을 가지고 있습니다. 하얀 배경색으로 보이는 설정은 특별한 설치를 위해 설정되어 있습니다. 파란색과 하얀색 배경으로 된 설정은 바꿀 수 있습니다.
 
 이 페이지를 떠나기 전에 **저장** 버튼을 누르지 않으면 바뀐 값은 적용되지 않습니다.
\ No newline at end of file
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index f69af2df6cc74efc1c8951de71f066369cb26bd1..da155bcef4ed1f036a4ae55956dec555b71b724b 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -11,14 +11,14 @@
  * @author Myeongjin <aranet100@gmail.com>
  */
 $lang['menu']                  = '환경 설정';
-$lang['error']                 = '잘못된 값 때문에 설정을 바꿀 수 없습니다. 수정한 값을 검토하고 확인을 누르세요.
+$lang['error']                 = '잘못된 값 때문에 설정을 바꿀 수 없습니다. 바뀜을 검토하고 확인을 누르세요.
 <br />잘못된 값은 빨간 선으로 둘러싸여 있습니다.';
 $lang['updated']               = '설정이 성공적으로 바뀌었습니다.';
 $lang['nochoice']              = '(다른 선택이 불가능합니다)';
-$lang['locked']                = '환경 설정 파일을 수정할 수 없습니다. 의도한 행동이 아니라면,<br />
+$lang['locked']                = '환경 설정 파일을 바꿀 수 없습니다. 의도한 행동이 아니라면,<br />
 파일 이름과 권한이 맞는지 확인하세요.';
-$lang['danger']                = '위험: 이 옵션을 잘못 수정하면 환경설정 메뉴를 사용할 수 없을 수도 있습니다.';
-$lang['warning']               = '경고: 이 옵션을 잘못 수정하면 잘못 동작할 수 있습니다.';
+$lang['danger']                = '위험: 이 옵션을 잘못 바꾸면 환경 설정 메뉴를 사용할 수 없을 수도 있습니다.';
+$lang['warning']               = '경고: 이 옵션을 잘못 바꾸면 잘못 동작할 수 있습니다.';
 $lang['security']              = '보안 경고: 이 옵션은 보안에 위험이 있을 수 있습니다.';
 $lang['_configuration_manager'] = '환경 설정 관리자';
 $lang['_header_dokuwiki']      = 'DokuWiki 설정';
@@ -48,13 +48,13 @@ $lang['template']              = '템플릿 (위키 디자인)';
 $lang['tagline']               = '태그 라인 (템플릿이 지원할 때에 한함)';
 $lang['sidebar']               = '사이드바 문서 이름 (템플릿이 지원할 때에 한함), 비워두면 사이드바를 비활성화';
 $lang['license']               = '콘텐츠에 어떤 라이선스를 적용하겠습니까?';
-$lang['savedir']               = '데이타 저장 디렉토리';
+$lang['savedir']               = '데이터 저장 디렉토리';
 $lang['basedir']               = '서버 경로 (예를 들어 <code>/dokuwiki/</code>). 자동 감지를 하려면 비우세요.';
 $lang['baseurl']               = '서버 URL (예를 들어 <code>http://www.yourserver.com</code>). 자동 감지를 하려면 비우세요.';
 $lang['cookiedir']             = '쿠키 위치. 비워두면 기본 URL 위치로 지정됩니다.';
 $lang['dmode']                 = '디렉토리 만들기 모드';
 $lang['fmode']                 = '파일 만들기 모드';
-$lang['allowdebug']            = '디버그 허용 <b>필요하지 않으면 비활성화할 것!</b>';
+$lang['allowdebug']            = '디버그 허용 <b>필요하지 않으면 비활성화하세요!</b>';
 $lang['recent']                = '최근 바뀐 문서당 항목 수';
 $lang['recent_days']           = '최근 바뀐 문서 기준 시간 (일)';
 $lang['breadcrumbs']           = '위치 "추적" 수. 0으로 설정하면 비활성화합니다.';
@@ -63,7 +63,7 @@ $lang['fullpath']              = '문서 하단에 전체 경로 보여주기';
 $lang['typography']            = '기호 대체';
 $lang['dformat']               = '날짜 형식 (PHP <a href="http://www.php.net/strftime">strftime</a> 기능 참고)';
 $lang['signature']             = '편집기에서 서명 버튼을 누를 때 삽입할 내용';
-$lang['showuseras']            = '마지막에 문서를 수정한 사용자를 보여줄지 여부';
+$lang['showuseras']            = '마지막에 문서를 편집한 사용자를 보여줄지 여부';
 $lang['toptoclevel']           = '목차 최상위 항목';
 $lang['tocminheads']           = '목차 표시 여부를 결정할 최소한의 문단 제목 항목의 수';
 $lang['maxtoclevel']           = '목차 최대 단계';
@@ -102,7 +102,7 @@ $lang['htmlok']                = 'HTML 내장 허용';
 $lang['phpok']                 = 'PHP 내장 허용';
 $lang['locktime']              = '최대 파일 잠금 시간(초)';
 $lang['cachetime']             = '최대 캐시 생존 시간 (초)';
-$lang['target____wiki']        = '내부 링크에 대한 타겟 창';
+$lang['target____wiki']        = '안쪽 링크에 대한 타겟 창';
 $lang['target____interwiki']   = '인터위키 링크에 대한 타겟 창';
 $lang['target____extern']      = '바깥 링크에 대한 타겟 창';
 $lang['target____media']       = '미디어 링크에 대한 타겟 창';
@@ -133,7 +133,7 @@ $lang['userewrite']            = '멋진 URL 사용';
 $lang['useslash']              = 'URL에서 이름 구분자로 슬래시 문자 사용';
 $lang['sepchar']               = '문서 이름 단어 구분자';
 $lang['canonical']             = '완전한 canonical URL 사용';
-$lang['fnencode']              = '아스키가 아닌 파일 이름을 인코딩 하는 방법.';
+$lang['fnencode']              = 'ASCII가 아닌 파일 이름을 인코딩 하는 방법.';
 $lang['autoplural']            = '링크 연결시 복수 양식 검사';
 $lang['compression']           = '첨부 파일 압축 방법 선택';
 $lang['gzip_output']           = 'xhml 내용 gzip 압축 사용';
@@ -143,9 +143,9 @@ $lang['send404']               = '존재하지 않는 페이지에 대해 "HTTP
 $lang['broken_iua']            = '설치된 시스템에서 ignore_user_abort 기능에 문제가 있습니까? 문제가 있다면 색인이 정상적으로 동작하지 않습니다. 이 기능이 IIS+PHP/CGI에서 문제가 있는 것으로 알려졌습니다. 자세한 정보는 <a href="http://bugs.dokuwiki.org/?do=details&amp;task_id=852">버그 852</a>를 참고하시기 바랍니다.';
 $lang['xsendfile']             = '웹 서버가 정적 파일을 제공하도록 X-Sendfile 헤더를 사용하겠습니까? 웹 서버가 이 기능을 지원해야 합니다.';
 $lang['renderer_xhtml']        = '주 (xhtml) 위키 출력 처리기';
-$lang['renderer__core']        = '%s (DokuWiki 내부 기능)';
+$lang['renderer__core']        = '%s (DokuWiki 내부)';
 $lang['renderer__plugin']      = '%s (플러그인)';
-$lang['dnslookups']            = '이 옵션을 활성화하면 DokuWiki가 문서를 수정하는 사용자의 호스트 네임과 원격 IP 주소를 확인합니다. 서버가 느리거나, DNS를 운영하지 않거나 이 기능을 원치 않으면 비활성화하세요';
+$lang['dnslookups']            = '이 옵션을 활성화하면 DokuWiki가 문서를 편집하는 사용자의 호스트 네임과 원격 IP 주소를 확인합니다. 서버가 느리거나, DNS를 운영하지 않거나 이 기능을 원치 않으면 비활성화하세요';
 $lang['proxy____host']         = '프록시 서버 이름';
 $lang['proxy____port']         = '프록시 서버 포트';
 $lang['proxy____user']         = '프록시 사용자 이름';
diff --git a/lib/plugins/popularity/lang/ko/intro.txt b/lib/plugins/popularity/lang/ko/intro.txt
index 2513b77b44e08df19612975ebe2cb91ca660a0ff..c75c57ba53c50aa1fe312095676549c2e95c6295 100644
--- a/lib/plugins/popularity/lang/ko/intro.txt
+++ b/lib/plugins/popularity/lang/ko/intro.txt
@@ -2,7 +2,7 @@
 
 설치된 위키의 익명 정보를 DokuWiki 개발자에게 보냅니다. 이 [[doku>popularity|도구]]는 DokuWiki가 실제 사용자에게 어떻게 사용되는지  DokuWiki 개발자에게 알려줌으로써 이 후 개발 시 참고가 됩니다.
 
-설치된 위키가 커짐에 따라서 이 과정을 반복할 필요가 있습니다. 반복된 데이타는 익명 ID로 구별되어집니다.
+설치된 위키가 커짐에 따라서 이 과정을 반복할 필요가 있습니다. 반복된 데이터는 익명 ID로 구별되어집니다.
 
 보내려는 데이터는 설치 DokuWiki 버전, 문서와 파일 수, 크기, 설치 플러그인, 설치 PHP 정보등을 포함하고 있습니다.
 
diff --git a/lib/plugins/revert/lang/ko/lang.php b/lib/plugins/revert/lang/ko/lang.php
index d36726279ecda04d64243a9e8e0d6871d56ecd52..f944361b8028f7b5850da2cf456b213b98433caa 100644
--- a/lib/plugins/revert/lang/ko/lang.php
+++ b/lib/plugins/revert/lang/ko/lang.php
@@ -16,5 +16,5 @@ $lang['reverted']              = '%s 판을 %s 판으로 되돌림';
 $lang['removed']               = '%s 삭제함';
 $lang['revstart']              = '되돌리기 작업을 시작합니다. 오랜 시간이 걸릴 수 있습니다. 완료되기 전에 스크립트 시간 초과가 발생한다면 더 작은 작업으로 나누어서 되돌리시기 바랍니다.';
 $lang['revstop']               = '되돌리기 작업이 성공적으로 끝났습니다.';
-$lang['note1']                 = '참고: 대소문자를 구별하여 찾습니다';
+$lang['note1']                 = '참고: 대소문자를 구별해 찾습니다';
 $lang['note2']                 = '참고: 이 문서는 <i>%s</i> 스팸 단어를 포함하지 않은 최근 이전 판으로 되돌립니다. ';
diff --git a/lib/plugins/usermanager/lang/ko/lang.php b/lib/plugins/usermanager/lang/ko/lang.php
index f8c400d19454d9c48e27bb94c71e173eceab3060..57bfbc4a262b528dc2a107a7f5309e725d4e872a 100644
--- a/lib/plugins/usermanager/lang/ko/lang.php
+++ b/lib/plugins/usermanager/lang/ko/lang.php
@@ -23,8 +23,8 @@ $lang['value']                 = 'ê°’';
 $lang['add']                   = '추가';
 $lang['delete']                = '삭제';
 $lang['delete_selected']       = '선택 삭제';
-$lang['edit']                  = '수정';
-$lang['edit_prompt']           = '이 사용자 수정';
+$lang['edit']                  = '편집';
+$lang['edit_prompt']           = '이 사용자 편집';
 $lang['modify']                = '바뀜 저장';
 $lang['search']                = '찾기';
 $lang['search_prompt']         = '찾기 실행';
diff --git a/lib/tpl/dokuwiki/detail.php b/lib/tpl/dokuwiki/detail.php
index a8c5fef8a9b1d931005169198ec36599e20518df..d2ed530a3f397d3a523e589ff2c10949d8c59ede 100644
--- a/lib/tpl/dokuwiki/detail.php
+++ b/lib/tpl/dokuwiki/detail.php
@@ -9,12 +9,12 @@
 
 // must be run from within DokuWiki
 if (!defined('DOKU_INC')) die();
+header('X-UA-Compatible: IE=edge,chrome=1');
 
 ?><!DOCTYPE html>
 <html lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="no-js">
 <head>
     <meta charset="utf-8" />
-    <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
     <title>
         <?php echo hsc(tpl_img_getTag('IPTC.Headline',$IMG))?>
         [<?php echo strip_tags($conf['title'])?>]
diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php
index 963750a1cde4fe8171876f6fce74223acf784102..43a0c0da7a7088e4bc29ee9fcd0d2f1b1c2e9df4 100644
--- a/lib/tpl/dokuwiki/main.php
+++ b/lib/tpl/dokuwiki/main.php
@@ -9,6 +9,7 @@
  */
 
 if (!defined('DOKU_INC')) die(); /* must be run from within DokuWiki */
+header('X-UA-Compatible: IE=edge,chrome=1');
 
 $hasSidebar = page_findnearest($conf['sidebar']);
 $showSidebar = $hasSidebar && ($ACT=='show');
@@ -16,7 +17,6 @@ $showSidebar = $hasSidebar && ($ACT=='show');
 <html lang="<?php echo $conf['lang'] ?>" dir="<?php echo $lang['direction'] ?>" class="no-js">
 <head>
     <meta charset="utf-8" />
-    <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
     <title><?php tpl_pagetitle() ?> [<?php echo strip_tags($conf['title']) ?>]</title>
     <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
     <?php tpl_metaheaders() ?>
diff --git a/lib/tpl/dokuwiki/mediamanager.php b/lib/tpl/dokuwiki/mediamanager.php
index 23c9cee798b0c6ee25081bd6af43aa61ecf830f8..dadf2b10f87d802de1c19a6a4277bf9d1379084f 100644
--- a/lib/tpl/dokuwiki/mediamanager.php
+++ b/lib/tpl/dokuwiki/mediamanager.php
@@ -7,12 +7,12 @@
  */
 // must be run from within DokuWiki
 if (!defined('DOKU_INC')) die();
+header('X-UA-Compatible: IE=edge,chrome=1');
 
 ?><!DOCTYPE html>
 <html lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="popup no-js">
 <head>
     <meta charset="utf-8" />
-    <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
     <title>
         <?php echo hsc($lang['mediaselect'])?>
         [<?php echo strip_tags($conf['title'])?>]