diff --git a/.gitignore b/.gitignore
index 64816ba380b17025f279c998e461ee2c9fc410fd..bb39ba7cf6b011a3875a25b80594da199a27b92a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@
 /conf/lang/*
 /conf/plugin_lang/*
 /conf/plugins.local.*
+/conf/tpl/*
 .htaccess
 *.swp
 *.bak
@@ -26,25 +27,23 @@
 /data/media_attic/*
 /data/meta/*
 /data/pages/*
+/data/tmp/*
 !/data/pages/wiki/dokuwiki.txt
 !/data/pages/wiki/syntax.txt
 !/data/pages/wiki/welcome.txt
-/data/tmp/*
 /lib/tpl/*
-!/lib/tpl/default
 !/lib/tpl/dokuwiki
 !/lib/tpl/index.php
 /lib/plugins/*
+!/lib/plugins/acl
 !/lib/plugins/authad
 !/lib/plugins/authldap
 !/lib/plugins/authmysql
 !/lib/plugins/authpgsql
 !/lib/plugins/authplain
-!/lib/plugins/acl
 !/lib/plugins/config
 !/lib/plugins/extension
 !/lib/plugins/info
-!/lib/plugins/plugin
 !/lib/plugins/popularity
 !/lib/plugins/revert
 !/lib/plugins/safefnrecode
@@ -52,5 +51,8 @@
 !/lib/plugins/usermanager
 !/lib/plugins/action.php
 !/lib/plugins/admin.php
+!/lib/plugins/auth.php
 !/lib/plugins/index.html
+!/lib/plugins/remote.php
 !/lib/plugins/syntax.php
+lib/images/*/local/*
diff --git a/_test/tests/inc/common_pageinfo.test.php b/_test/tests/inc/common_pageinfo.test.php
index 0a1ea0a8f2d622155ff95eb1a9a3ce437b9d8b33..2b230d9ce037fb7279b75f5ad425db9af12f4978 100644
--- a/_test/tests/inc/common_pageinfo.test.php
+++ b/_test/tests/inc/common_pageinfo.test.php
@@ -38,6 +38,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['writable'] = true;
         $info['editable'] = true;
         $info['lastmod'] = false;
+        $info['currentrev'] = false;
         $info['meta'] = array();
         $info['ip'] = null;
         $info['user'] = null;
@@ -77,6 +78,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['filepath'] = $filename;
         $info['exists'] = true;
         $info['lastmod'] = $rev;
+        $info['currentrev'] = $rev;
         $info['meta'] = p_get_metadata($ID);
 
         $this->assertEquals($info, pageinfo());
@@ -101,6 +103,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['filepath'] = $filename;
         $info['exists'] = true;
         $info['lastmod'] = $rev;
+        $info['currentrev'] = $rev;
         $info['meta'] = p_get_metadata($ID);
         $info['rev'] = '';
 
@@ -131,6 +134,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['namespace'] = 'wiki';
         $info['meta'] = p_get_metadata($ID);
         $info['rev'] = $REV;
+        $info['currentrev'] = $rev;
         $info['filepath'] = str_replace('pages','attic',substr($filename,0,-3).$REV.'.txt.gz');
 
         $this->assertEquals($info, pageinfo());
@@ -153,6 +157,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['namespace'] = 'wiki';
         $info['exists'] = true;
         $info['lastmod'] = $rev;
+        $info['currentrev'] = $rev;
         $info['meta'] = p_get_metadata($ID);
         $info['filepath'] = $filename;
 
@@ -197,6 +202,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['filepath'] = $filename;
         $info['exists'] = true;
         $info['lastmod'] = $rev;
+        $info['currentrev'] = $rev;
         $info['meta'] = p_get_metadata($ID);  // need $INFO set correctly for addLogEntry()
 
         global $INFO;
@@ -226,6 +232,7 @@ class common_pageinfo_test extends DokuWikiTest {
         touch($filename,$now);
 
         $info['lastmod'] = $now;
+        $info['currentrev'] = $now;
         $info['meta']['last_change'] = false;
         $info['ip'] = null;
         $info['user'] = null;
@@ -251,6 +258,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['filepath'] = $filename;
         $info['exists'] = true;
         $info['lastmod'] = $rev;
+        $info['currentrev'] = $rev;
         $info['meta'] = p_get_metadata($ID);
 
         // setup a draft, make it more recent than the current page
diff --git a/_test/tests/inc/parserutils_get_renderer.test.php b/_test/tests/inc/parserutils_get_renderer.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..69aeb3b194c5f11964d0735a738ebb6725f62b69
--- /dev/null
+++ b/_test/tests/inc/parserutils_get_renderer.test.php
@@ -0,0 +1,83 @@
+<?php
+
+class parserutils_get_renderer_test extends DokuWikiTest {
+
+    private $plugin_controller;
+
+    // test default behaviour / usual settings
+    function test_p_get_renderer_normal() {
+        global $conf;
+
+        $old_conf = $conf;
+        $conf['renderer_xhtml'] = 'xhtml';
+
+        $this->assertInstanceOf('Doku_Renderer_xhtml', p_get_renderer('xhtml'));
+
+        $conf = $old_conf;
+    }
+
+    // test get a renderer plugin
+    function test_p_get_renderer_plugin() {
+        global $conf;
+        global $plugin_controller;
+
+        $old_conf = $conf;
+        $conf['renderer_xhtml'] = 'get_renderer_test';
+        $this->plugin_controller = $plugin_controller;
+        $plugin_controller = $this;
+
+        $this->assertInstanceOf('renderer_plugin_test', p_get_renderer('xhtml'));
+
+        $conf = $old_conf;
+        $plugin_controller = $this->plugin_controller;
+    }
+
+    // test fallback succeeds
+    function test_p_get_renderer_fallback() {
+        global $conf;
+
+        $old_conf = $conf;
+        $conf['renderer_xhtml'] = 'badvalue';
+
+        $this->assertInstanceOf('Doku_Renderer_xhtml', p_get_renderer('xhtml'));
+
+        $conf = $old_conf;
+    }
+
+    // test fallback fails
+    /**
+     * @expectedException        PHPUnit_Framework_Error
+     * @expectedExceptionCode    E_USER_WARNING
+     */
+    function test_p_get_renderer_fallback_fail() {
+        global $conf;
+
+        $old_conf = $conf;
+        $conf['renderer_junk'] = 'badvalue';
+
+        $this->assertNull(p_get_renderer('junk'));
+
+        $conf = $old_conf;
+    }
+
+    // wrapper function for the fake plugin controller, return $this for the fake syntax of this test
+    function load($type,$name,$new=false,$disabled=false){
+        if ($name == 'get_renderer_test') {
+            return new renderer_plugin_test();
+        } else {
+            return $this->plugin_controller->load($type, $name, $new, $disabled);
+        }
+    }
+ }
+
+require_once DOKU_INC . 'inc/parser/xhtml.php';
+
+class renderer_plugin_test extends Doku_Renderer_xhtml {
+
+    function canRender($format) {
+      return ($format=='xhtml');
+    }
+
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/_test/tests/inc/utf8_strtolower.test.php b/_test/tests/inc/utf8_strtolower.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..85f5b270b1decb8b3551fc456958f1727bfdaf36
--- /dev/null
+++ b/_test/tests/inc/utf8_strtolower.test.php
@@ -0,0 +1,23 @@
+<?php
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+
+class utf8_strtolower_test extends DokuWikiTest {
+
+    function test_givens(){
+        $data = array(
+            'Αρχιτεκτονική Μελέτη' => 'αρχιτεκτονική μελέτη', // FS#2173
+        );
+
+        foreach($data as $input => $expected) {
+            $this->assertEquals($expected, utf8_strtolower($input));
+        }
+
+        // just make sure our data was correct
+        if(function_exists('mb_strtolower')) {
+            foreach($data as $input => $expected) {
+                $this->assertEquals($expected, mb_strtolower($input, 'utf-8'));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/data/pages/wiki/dokuwiki.txt b/data/pages/wiki/dokuwiki.txt
index 808aea68a2f2d9beae92b4e1948cf99f2b30b7ff..0e08fdcd30d36c38abcfb04da24925e7db1a6937 100644
--- a/data/pages/wiki/dokuwiki.txt
+++ b/data/pages/wiki/dokuwiki.txt
@@ -6,7 +6,7 @@ Read the [[doku>manual|DokuWiki Manual]] to unleash the full power of DokuWiki.
 
 ===== Download =====
 
-DokuWiki is available at http://www.splitbrain.org/go/dokuwiki
+DokuWiki is available at http://download.dokuwiki.org/
 
 
 ===== Read More =====
@@ -24,7 +24,7 @@ All documentation and additional information besides the [[syntax|syntax descrip
 **Installing DokuWiki**
 
   * [[doku>requirements|System Requirements]]
-  * [[http://www.splitbrain.org/go/dokuwiki|Download DokuWiki]] :!:
+  * [[http://download.dokuwiki.org/|Download DokuWiki]] :!:
   * [[doku>changes|Change Log]]
   * [[doku>Install|How to install or upgrade]] :!:
   * [[doku>config|Configuration]]
@@ -50,7 +50,7 @@ All documentation and additional information besides the [[syntax|syntax descrip
   * [[doku>mailinglist|Join the mailing list]]
   * [[http://forum.dokuwiki.org|Check out the user forum]]
   * [[doku>irc|Talk to other users in the IRC channel]]
-  * [[http://bugs.splitbrain.org/index.php?project=1|Submit bugs and feature wishes]]
+  * [[https://github.com/splitbrain/dokuwiki/issues|Submit bugs and feature wishes]]
   * [[http://www.wikimatrix.org/forum/viewforum.php?id=10|Share your experiences in the WikiMatrix forum]]
   * [[doku>thanks|Some humble thanks]]
 
diff --git a/data/pages/wiki/syntax.txt b/data/pages/wiki/syntax.txt
index 02b49dc3de9c4bd9114859234a53af8a592f7711..86ad815e4dedb6dcb6bdd85625b564d779ac58ae 100644
--- a/data/pages/wiki/syntax.txt
+++ b/data/pages/wiki/syntax.txt
@@ -121,9 +121,9 @@ By using four or more dashes, you can make a horizontal line:
 
 ----
 
-===== Images and Other Files =====
+===== Media Files =====
 
-You can include external and internal [[doku>images]] with curly brackets. Optionally you can specify the size of them.
+You can include external and internal [[doku>images|images, videos and audio files]] with curly brackets. Optionally you can specify the size of them.
 
 Real size:                        {{wiki:dokuwiki-128.png}}
 
@@ -157,10 +157,31 @@ Of course, you can add a title (displayed as a tooltip by most browsers), too.
 
   {{ wiki:dokuwiki-128.png |This is the caption}}
 
-If you specify a filename (external or internal) that is not an image (''gif, jpeg, png''), then it will be displayed as a link instead.
-
 For linking an image to another page see [[#Image Links]] above.
 
+==== Supported Media Formats ====
+
+DokuWiki can embed the following media formats directly.
+
+| Image | ''gif'', ''jpg'', ''png''  |
+| Video | ''webm'', ''ogv'', ''mp4'' |
+| Audio | ''ogg'', ''mp3'', ''wav''  |
+| Flash | ''swf''                    |
+
+If you specify a filename that is not a supported media format, then it will be displayed as a link instead.
+
+==== 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.
+
+For example consider this embedded mp4 video:
+
+  {{video.mp4|A funny video}}
+
+When you upload a ''video.webm'' and ''video.ogv'' next to the referenced ''video.mp4'', DokuWiki will automatically add them as alternatives so that one of the three files is understood by your browser.
+
+Additionally DokuWiki supports a "poster" image which will be shown before the video has started. That image needs to have the same filename as the video and be either a jpg or png file. In the example above a ''video.jpg'' file would work.
+
 ===== Lists =====
 
 Dokuwiki supports ordered and unordered lists. To create a list item, indent your text by two spaces and use a ''*'' for unordered lists or a ''-'' for ordered ones.
diff --git a/feed.php b/feed.php
index bdce666d223748746e9606b98eba9736d22fd4eb..f97f98028e12ed07ac67046747ba926df382e9f9 100644
--- a/feed.php
+++ b/feed.php
@@ -20,8 +20,7 @@ $opt = rss_parseOptions();
 
 // the feed is dynamic - we need a cache for each combo
 // (but most people just use the default feed so it's still effective)
-$cache = getCacheName(join('', array_values($opt)).$_SERVER['REMOTE_USER'], '.feed');
-$key   = join('', array_values($opt)).$_SERVER['REMOTE_USER'];
+$key   = join('', array_values($opt)).'$'.$_SERVER['REMOTE_USER'].'$'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'];
 $cache = new cache($key, '.feed');
 
 // prepare cache depends
@@ -182,7 +181,7 @@ function rss_parseOptions() {
 function rss_buildItems(&$rss, &$data, $opt) {
     global $conf;
     global $lang;
-    /* @var auth_basic $auth */
+    /* @var DokuWiki_Auth_Plugin $auth */
     global $auth;
 
     $eventData = array(
@@ -299,12 +298,12 @@ function rss_buildItems(&$rss, &$data, $opt) {
                         $src_l = '';
 
                         if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
-                            $more  = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
-                            $src_r = ml($id, $more);
+                            $more  = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id));
+                            $src_r = ml($id, $more, true, '&amp;', true);
                         }
                         if($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)) {
                             $more  = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
-                            $src_l = ml($id, $more);
+                            $src_l = ml($id, $more, true, '&amp;', true);
                         }
                         $content = '';
                         if($src_r) {
@@ -347,8 +346,8 @@ function rss_buildItems(&$rss, &$data, $opt) {
                 case 'html':
                     if($ditem['media']) {
                         if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
-                            $more    = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
-                            $src     = ml($id, $more);
+                            $more    = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id));
+                            $src     = ml($id, $more, true, '&amp;', true);
                             $content = '<img src="'.$src.'" alt="'.$id.'" />';
                         } else {
                             $content = '';
@@ -378,8 +377,8 @@ function rss_buildItems(&$rss, &$data, $opt) {
                 default:
                     if($ditem['media']) {
                         if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
-                            $more    = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
-                            $src     = ml($id, $more);
+                            $more    = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id));
+                            $src     = ml($id, $more, true, '&amp;', true);
                             $content = '<img src="'.$src.'" alt="'.$id.'" />';
                         } else {
                             $content = '';
diff --git a/inc/EmailAddressValidator.php b/inc/EmailAddressValidator.php
index bb4ef0ca9f151452b98a633c3bd226c1a2334a3a..fd6f3275babd7d144a13ecfcc21a6e00b535221d 100644
--- a/inc/EmailAddressValidator.php
+++ b/inc/EmailAddressValidator.php
@@ -15,8 +15,8 @@ class EmailAddressValidator {
 
     /**
      * Check email address validity
-     * @param   strEmailAddress     Email address to be checked
-     * @return  True if email is valid, false if not
+     * @param  string $strEmailAddress     Email address to be checked
+     * @return bool True if email is valid, false if not
      */
     public function check_email_address($strEmailAddress) {
 
@@ -82,8 +82,8 @@ class EmailAddressValidator {
 
     /**
      * Checks email section before "@" symbol for validity
-     * @param   strLocalPortion     Text to be checked
-     * @return  True if local portion is valid, false if not
+     * @param string  $strLocalPortion     Text to be checked
+     * @return bool True if local portion is valid, false if not
      */
     protected function check_local_portion($strLocalPortion) {
         // Local portion can only be from 1 to 64 characters, inclusive.
@@ -113,8 +113,8 @@ class EmailAddressValidator {
 
     /**
      * Checks email section after "@" symbol for validity
-     * @param   strDomainPortion     Text to be checked
-     * @return  True if domain portion is valid, false if not
+     * @param  string $strDomainPortion     Text to be checked
+     * @return bool True if domain portion is valid, false if not
      */
     protected function check_domain_portion($strDomainPortion) {
         // Total domain can only be from 1 to 255 characters, inclusive
@@ -172,10 +172,10 @@ class EmailAddressValidator {
 
     /**
      * Check given text length is between defined bounds
-     * @param   strText     Text to be checked
-     * @param   intMinimum  Minimum acceptable length
-     * @param   intMaximum  Maximum acceptable length
-     * @return  True if string is within bounds (inclusive), false if not
+     * @param   string $strText     Text to be checked
+     * @param   int $intMinimum  Minimum acceptable length
+     * @param   int $intMaximum  Maximum acceptable length
+     * @return bool True if string is within bounds (inclusive), false if not
      */
     protected function check_text_length($strText, $intMinimum, $intMaximum) {
         // Minimum and maximum are both inclusive
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index de3a1683031cd9e5f1c469abeb05383aa8e28648..53f3c9a78656806aa39be58da2a0e8f0efa4a9fc 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -552,7 +552,7 @@ class HTTPClient {
         $request  = "CONNECT {$requestinfo['host']}:{$requestinfo['port']} HTTP/1.0".HTTP_NL;
         $request .= "Host: {$requestinfo['host']}".HTTP_NL;
         if($this->proxy_user) {
-                'Proxy-Authorization Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
+            $request .= 'Proxy-Authorization Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
         }
         $request .= HTTP_NL;
 
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index 2ac2c1d6098f41a9cef2b054ef3e3e3a38d726bc..e32178bba5de9615f41768db05224cf04c362f8c 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -277,7 +277,7 @@ class Mailer {
     /**
      * Add the To: recipients
      *
-     * @see setAddress
+     * @see cleanAddress
      * @param string|array  $address Multiple adresses separated by commas or as array
      */
     public function to($address) {
@@ -287,7 +287,7 @@ class Mailer {
     /**
      * Add the Cc: recipients
      *
-     * @see setAddress
+     * @see cleanAddress
      * @param string|array  $address Multiple adresses separated by commas or as array
      */
     public function cc($address) {
@@ -297,7 +297,7 @@ class Mailer {
     /**
      * Add the Bcc: recipients
      *
-     * @see setAddress
+     * @see cleanAddress
      * @param string|array  $address Multiple adresses separated by commas or as array
      */
     public function bcc($address) {
@@ -310,7 +310,7 @@ class Mailer {
      * This is set to $conf['mailfrom'] when not specified so you shouldn't need
      * to call this function
      *
-     * @see setAddress
+     * @see cleanAddress
      * @param string  $address from address
      */
     public function from($address) {
@@ -333,9 +333,9 @@ class Mailer {
      * for headers. Addresses may not contain Non-ASCII data!
      *
      * Example:
-     *   setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc");
+     *   cc("föö <foo@bar.com>, me@somewhere.com","TBcc");
      *
-     * @param string|array  $address Multiple adresses separated by commas or as array
+     * @param string|array  $addresses Multiple adresses separated by commas or as array
      * @return bool|string  the prepared header (can contain multiple lines)
      */
     public function cleanAddress($addresses) {
@@ -522,7 +522,7 @@ class Mailer {
 
         // clean up addresses
         if(empty($this->headers['From'])) $this->from($conf['mailfrom']);
-        $addrs = array('To', 'From', 'Cc', 'Bcc');
+        $addrs = array('To', 'From', 'Cc', 'Bcc', 'Reply-To', 'Sender');
         foreach($addrs as $addr) {
             if(isset($this->headers[$addr])) {
                 $this->headers[$addr] = $this->cleanAddress($this->headers[$addr]);
diff --git a/inc/Sitemapper.php b/inc/Sitemapper.php
index bf89a311c6b131e97e46bfddca0bfa444ceddb8d..6332746a688ec22f3b05953a776f62a64b528091 100644
--- a/inc/Sitemapper.php
+++ b/inc/Sitemapper.php
@@ -131,9 +131,9 @@ class Sitemapper {
 
         $encoded_sitemap_url = urlencode(wl('', array('do' => 'sitemap'), true, '&'));
         $ping_urls = array(
-            'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url,
-            'yahoo' => 'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=dokuwiki&url='.$encoded_sitemap_url,
+            'google'    => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url,
             'microsoft' => 'http://www.bing.com/webmaster/ping.aspx?siteMap='.$encoded_sitemap_url,
+            'yandex'    => 'http://blogs.yandex.ru/pings/?status=success&url='.$encoded_sitemap_url
         );
 
         $data = array('ping_urls' => $ping_urls,
diff --git a/inc/auth.php b/inc/auth.php
index 6000ea6d7dde1e0195ab7c6e693fe6e42ee35ac1..8fde129aa933c9a248a7119b792f96aa18b75691 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -845,6 +845,12 @@ function auth_nameencode($name, $skip_group = false) {
     return $cache[$name][$skip_group];
 }
 
+/**
+ * callback encodes the matches
+ *
+ * @param array $matches first complete match, next matching subpatterms
+ * @return string
+ */
 function auth_nameencode_callback($matches) {
     return '%'.dechex(ord(substr($matches[1],-1)));
 }
@@ -1075,6 +1081,11 @@ function updateprofile() {
     return false;
 }
 
+/**
+ * Delete the current logged-in user
+ *
+ * @return bool true on success, false on any error
+ */
 function auth_deleteprofile(){
     global $conf;
     global $lang;
diff --git a/inc/cache.php b/inc/cache.php
index 5eac949345808328231dca38938410a9358c468d..5f54a34a94b7f70b67d1705229dfca45cdc9125f 100644
--- a/inc/cache.php
+++ b/inc/cache.php
@@ -8,16 +8,24 @@
 
 if(!defined('DOKU_INC')) die('meh.');
 
+/**
+ * Generic handling of caching
+ */
 class cache {
-    var $key = '';          // primary identifier for this item
-    var $ext = '';          // file ext for cache data, secondary identifier for this item
-    var $cache = '';        // cache file name
-    var $depends = array(); // array containing cache dependency information,
+    public $key = '';          // primary identifier for this item
+    public $ext = '';          // file ext for cache data, secondary identifier for this item
+    public $cache = '';        // cache file name
+    public $depends = array(); // array containing cache dependency information,
     //   used by _useCache to determine cache validity
 
     var $_event = '';       // event to be triggered during useCache
+    var $_time;
 
-    function cache($key,$ext) {
+    /**
+     * @param string $key primary identifier
+     * @param string $ext file extension
+     */
+    public function cache($key,$ext) {
         $this->key = $key;
         $this->ext = $ext;
         $this->cache = getCacheName($key,$ext);
@@ -36,7 +44,7 @@ class cache {
      *
      * @return bool    true if cache can be used, false otherwise
      */
-    function useCache($depends=array()) {
+    public function useCache($depends=array()) {
         $this->depends = $depends;
         $this->_addDependencies();
 
@@ -59,7 +67,7 @@ class cache {
      *
      * @return bool               see useCache()
      */
-    function _useCache() {
+    protected function _useCache() {
 
         if (!empty($this->depends['purge'])) return false;              // purge requested?
         if (!($this->_time = @filemtime($this->cache))) return false;   // cache exists?
@@ -83,7 +91,7 @@ class cache {
      * it should not remove any existing dependencies and
      * it should only overwrite a dependency when the new value is more stringent than the old
      */
-    function _addDependencies() {
+    protected function _addDependencies() {
         global $INPUT;
         if ($INPUT->has('purge')) $this->depends['purge'] = true;   // purge requested
     }
@@ -94,7 +102,7 @@ class cache {
      * @param   bool   $clean   true to clean line endings, false to leave line endings alone
      * @return  string          cache contents
      */
-    function retrieveCache($clean=true) {
+    public function retrieveCache($clean=true) {
         return io_readFile($this->cache, $clean);
     }
 
@@ -104,14 +112,14 @@ class cache {
      * @param   string $data   the data to be cached
      * @return  bool           true on success, false otherwise
      */
-    function storeCache($data) {
+    public function storeCache($data) {
         return io_savefile($this->cache, $data);
     }
 
     /**
      * remove any cached data associated with this cache instance
      */
-    function removeCache() {
+    public function removeCache() {
         @unlink($this->cache);
     }
 
@@ -122,7 +130,7 @@ class cache {
      * @param    bool   $success   result of this cache use attempt
      * @return   bool              pass-thru $success value
      */
-    function _stats($success) {
+    protected function _stats($success) {
         global $conf;
         static $stats = null;
         static $file;
@@ -157,14 +165,23 @@ class cache {
     }
 }
 
+/**
+ * Parser caching
+ */
 class cache_parser extends cache {
 
-    var $file = '';       // source file for cache
-    var $mode = '';       // input mode (represents the processing the input file will undergo)
+    public $file = '';       // source file for cache
+    public $mode = '';       // input mode (represents the processing the input file will undergo)
 
     var $_event = 'PARSER_CACHE_USE';
 
-    function cache_parser($id, $file, $mode) {
+    /**
+     *
+     * @param string $id page id
+     * @param string $file source file for cache
+     * @param string $mode input mode
+     */
+    public function cache_parser($id, $file, $mode) {
         if ($id) $this->page = $id;
         $this->file = $file;
         $this->mode = $mode;
@@ -172,24 +189,29 @@ class cache_parser extends cache {
         parent::cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
     }
 
-    function _useCache() {
+    /**
+     * method contains cache use decision logic
+     *
+     * @return bool               see useCache()
+     */
+    protected function _useCache() {
 
         if (!@file_exists($this->file)) return false;                   // source exists?
         return parent::_useCache();
     }
 
-    function _addDependencies() {
-        global $conf, $config_cascade;
+    protected function _addDependencies() {
+        global $conf;
 
         $this->depends['age'] = isset($this->depends['age']) ?
             min($this->depends['age'],$conf['cachetime']) : $conf['cachetime'];
 
         // parser cache file dependencies ...
-        $files = array($this->file,                                     // ... source
+        $files = array($this->file,                              // ... source
                 DOKU_INC.'inc/parser/parser.php',                // ... parser
                 DOKU_INC.'inc/parser/handler.php',               // ... handler
                 );
-        $files = array_merge($files, getConfigFiles('main'));           // ... wiki settings
+        $files = array_merge($files, getConfigFiles('main'));    // ... wiki settings
 
         $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files;
         parent::_addDependencies();
@@ -197,8 +219,17 @@ class cache_parser extends cache {
 
 }
 
+/**
+ * Caching of data of renderer
+ */
 class cache_renderer extends cache_parser {
-    function _useCache() {
+
+    /**
+     * method contains cache use decision logic
+     *
+     * @return bool               see useCache()
+     */
+    protected function _useCache() {
         global $conf;
 
         if (!parent::_useCache()) return false;
@@ -231,7 +262,7 @@ class cache_renderer extends cache_parser {
         return true;
     }
 
-    function _addDependencies() {
+    protected function _addDependencies() {
 
         // renderer cache file dependencies ...
         $files = array(
@@ -253,18 +284,37 @@ class cache_renderer extends cache_parser {
     }
 }
 
+/**
+ * Caching of parser instructions
+ */
 class cache_instructions extends cache_parser {
 
-    function cache_instructions($id, $file) {
+    /**
+     * @param string $id page id
+     * @param string $file source file for cache
+     */
+    public function cache_instructions($id, $file) {
         parent::cache_parser($id, $file, 'i');
     }
 
-    function retrieveCache($clean=true) {
+    /**
+     * retrieve the cached data
+     *
+     * @param   bool   $clean   true to clean line endings, false to leave line endings alone
+     * @return  string          cache contents
+     */
+    public function retrieveCache($clean=true) {
         $contents = io_readFile($this->cache, false);
         return !empty($contents) ? unserialize($contents) : array();
     }
 
-    function storeCache($instructions) {
+    /**
+     * cache $instructions
+     *
+     * @param   string $instructions  the instruction to be cached
+     * @return  bool                  true on success, false otherwise
+     */
+    public function storeCache($instructions) {
         return io_savefile($this->cache,serialize($instructions));
     }
 }
diff --git a/inc/cliopts.php b/inc/cliopts.php
index 9cea686a24ec42897a1a3cfc82fe07c68d5b3580..3eac72e5b589f5415237a016e3d41aaaa48a2108 100644
--- a/inc/cliopts.php
+++ b/inc/cliopts.php
@@ -74,9 +74,9 @@ class Doku_Cli_Opts {
     /**
      * <?php ?>
      * @see http://www.sitepoint.com/article/php-command-line-1/3
-     * @param string executing file name - this MUST be passed the __FILE__ constant
-     * @param string short options
-     * @param array (optional) long options
+     * @param string $bin_file      executing file name - this MUST be passed the __FILE__ constant
+     * @param string $short_options short options
+     * @param array  $long_options  (optional) long options
      * @return Doku_Cli_Opts_Container or Doku_Cli_Opts_Error
      */
     function & getOptions($bin_file, $short_options, $long_options = null) {
@@ -233,12 +233,12 @@ class Doku_Cli_Opts {
      * Parse short option
      *
      * @param string     $arg           Argument
-     * @param string[]   $short_options Available short options
+     * @param string     $short_options Available short options
      * @param string[][] &$opts
      * @param string[]   &$args
      *
      * @access private
-     * @return void
+     * @return void|Doku_Cli_Opts_Error
      */
     function _parseShortOption($arg, $short_options, &$opts, &$args) {
         $len = strlen($arg);
@@ -324,7 +324,7 @@ class Doku_Cli_Opts {
      * @param string[]   &$args
      *
      * @access private
-     * @return void|PEAR_Error
+     * @return void|Doku_Cli_Opts_Error
      */
     function _parseLongOption($arg, $long_options, &$opts, &$args) {
         @list($opt, $opt_arg) = explode('=', $arg, 2);
@@ -402,7 +402,7 @@ class Doku_Cli_Opts {
      * Will take care on register_globals and register_argc_argv ini directives
      *
      * @access public
-     * @return mixed the $argv PHP array or PEAR error if not registered
+     * @return array|Doku_Cli_Opts_Error the $argv PHP array or PEAR error if not registered
      */
     function readPHPArgv() {
         global $argv;
@@ -421,10 +421,19 @@ class Doku_Cli_Opts {
         return $argv;
     }
 
+    /**
+     * @param $code
+     * @param $msg
+     * @return Doku_Cli_Opts_Error
+     */
     function raiseError($code, $msg) {
         return new Doku_Cli_Opts_Error($code, $msg);
     }
 
+    /**
+     * @param $obj
+     * @return bool
+     */
     function isError($obj) {
         return is_a($obj, 'Doku_Cli_Opts_Error');
     }
diff --git a/inc/common.php b/inc/common.php
index 32771285b20bdf2acdc7a53ad257e8c115b4bf69..9a53ee52627c76b1b1f1598a076af302d5e7bdc0 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -155,12 +155,13 @@ function pageinfo() {
         $info['subscribed'] = false;
     }
 
-    $info['locked']    = checklock($ID);
-    $info['filepath']  = fullpath(wikiFN($ID));
-    $info['exists']    = @file_exists($info['filepath']);
+    $info['locked']     = checklock($ID);
+    $info['filepath']   = fullpath(wikiFN($ID));
+    $info['exists']     = @file_exists($info['filepath']);
+    $info['currentrev'] = @filemtime($info['filepath']);
     if($REV) {
         //check if current revision was meant
-        if($info['exists'] && (@filemtime($info['filepath']) == $REV)) {
+        if($info['exists'] && ($info['currentrev'] == $REV)) {
             $REV = '';
         } elseif($RANGE) {
             //section editing does not work with old revisions!
@@ -1140,7 +1141,6 @@ function saveWikiText($id, $text, $summary, $minor = false) {
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function saveOldRevision($id) {
-    global $conf;
     $oldf = wikiFN($id);
     if(!@file_exists($oldf)) return '';
     $date = filemtime($oldf);
@@ -1230,8 +1230,9 @@ function getGoogleQuery() {
 /**
  * Return the human readable size of a file
  *
- * @param       int    $size   A file size
- * @param       int    $dec    A number of decimal places
+ * @param       int $size A file size
+ * @param       int $dec A number of decimal places
+ * @return string human readable size
  * @author      Martin Benjamin <b.martin@cybernet.ch>
  * @author      Aidan Lister <aidan@php.net>
  * @version     1.0.0
@@ -1362,12 +1363,16 @@ function php_to_byte($v) {
     $l   = substr($v, -1);
     $ret = substr($v, 0, -1);
     switch(strtoupper($l)) {
+        /** @noinspection PhpMissingBreakStatementInspection */
         case 'P':
             $ret *= 1024;
+        /** @noinspection PhpMissingBreakStatementInspection */
         case 'T':
             $ret *= 1024;
+        /** @noinspection PhpMissingBreakStatementInspection */
         case 'G':
             $ret *= 1024;
+        /** @noinspection PhpMissingBreakStatementInspection */
         case 'M':
             $ret *= 1024;
         case 'K':
diff --git a/inc/confutils.php b/inc/confutils.php
index 0ac003b72b992fe5509c9a189ff4e2bfac91ea6e..31371d41fb5a200f1c845388bed182960e38c0d9 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -237,13 +237,14 @@ function getConfigFiles($type) {
  * check if the given action was disabled in config
  *
  * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $action
  * @returns boolean true if enabled, false if disabled
  */
 function actionOK($action){
     static $disabled = null;
     if(is_null($disabled) || defined('SIMPLE_TEST')){
         global $conf;
-        /** @var auth_basic $auth */
+        /** @var DokuWiki_Auth_Plugin $auth */
         global $auth;
 
         // prepare disabled actions array and handle legacy options
diff --git a/inc/events.php b/inc/events.php
index f7b1a7a160650cc9f450a0bff33643b8359247f9..7f9824f605a67c592a596f1d0a57748768f218a6 100644
--- a/inc/events.php
+++ b/inc/events.php
@@ -8,15 +8,18 @@
 
 if(!defined('DOKU_INC')) die('meh.');
 
+/**
+ * The event
+ */
 class Doku_Event {
 
     // public properties
-    var $name = '';                // READONLY  event name, objects must register against this name to see the event
-    var $data = null;              // READWRITE data relevant to the event, no standardised format (YET!)
-    var $result = null;            // READWRITE the results of the event action, only relevant in "_AFTER" advise
+    public $name = '';                // READONLY  event name, objects must register against this name to see the event
+    public $data = null;              // READWRITE data relevant to the event, no standardised format (YET!)
+    public $result = null;            // READWRITE the results of the event action, only relevant in "_AFTER" advise
     //    event handlers may modify this if they are preventing the default action
     //    to provide the after event handlers with event results
-    var $canPreventDefault = true; // READONLY  if true, event handlers can prevent the events default action
+    public $canPreventDefault = true; // READONLY  if true, event handlers can prevent the events default action
 
     // private properties, event handlers can effect these through the provided methods
     var $_default = true;     // whether or not to carry out the default action associated with the event
@@ -32,6 +35,13 @@ class Doku_Event {
 
     }
 
+    /**
+     * @return string
+     */
+    function __toString() {
+        return $this->name;
+    }
+
     /**
      * advise functions
      *
@@ -47,7 +57,8 @@ class Doku_Event {
      *    $evt->advise_after();
      *    unset($evt);
      *
-     * @return  results of processing the event, usually $this->_default
+     * @param bool $enablePreventDefault
+     * @return bool results of processing the event, usually $this->_default
      */
     function advise_before($enablePreventDefault=true) {
         global $EVENT_HANDLER;
@@ -73,7 +84,9 @@ class Doku_Event {
      *   $this->_default, all of which may have been modified by the event handlers.
      * - advise all registered (<event>_AFTER) handlers that the event has taken place
      *
-     * @return  $event->results
+     * @param null|callable $action
+     * @param bool $enablePrevent
+     * @return  mixed $event->results
      *          the value set by any <event>_before or <event> handlers if the default action is prevented
      *          or the results of the default action (as modified by <event>_after handlers)
      *          or NULL no action took place and no handler modified the value
@@ -112,12 +125,15 @@ class Doku_Event {
     function preventDefault() { $this->_default = false;  }
 }
 
+/**
+ * Controls the registration and execution of all events,
+ */
 class Doku_Event_Handler {
 
     // public properties:  none
 
     // private properties
-    var $_hooks = array();          // array of events and their registered handlers
+    protected $_hooks = array();          // array of events and their registered handlers
 
     /**
      * event_handler
@@ -128,6 +144,7 @@ class Doku_Event_Handler {
     function Doku_Event_Handler() {
 
         // load action plugins
+        /** @var DokuWiki_Action_Plugin $plugin */
         $plugin = null;
         $pluginlist = plugin_list('action');
 
@@ -143,34 +160,47 @@ class Doku_Event_Handler {
      *
      * register a hook for an event
      *
-     * @param  $event   (string)   name used by the event, (incl '_before' or '_after' for triggers)
-     * @param  $obj     (obj)      object in whose scope method is to be executed,
+     * @param  $event   string   name used by the event, (incl '_before' or '_after' for triggers)
+     * @param  $advise  string
+     * @param  $obj     object   object in whose scope method is to be executed,
      *                             if NULL, method is assumed to be a globally available function
-     * @param  $method  (function) event handler function
-     * @param  $param   (mixed)    data passed to the event handler
+     * @param  $method  string   event handler function
+     * @param  $param   mixed    data passed to the event handler
+     * @param  $seq     int      sequence number for ordering hook execution (ascending)
      */
-    function register_hook($event, $advise, $obj, $method, $param=null) {
-        $this->_hooks[$event.'_'.$advise][] = array($obj, $method, $param);
+    function register_hook($event, $advise, $obj, $method, $param=null, $seq=0) {
+        $seq = (int)$seq;
+        $doSort = !isset($this->_hooks[$event.'_'.$advise][$seq]);
+        $this->_hooks[$event.'_'.$advise][$seq][] = array($obj, $method, $param);
+
+        if ($doSort) {
+            ksort($this->_hooks[$event.'_'.$advise]);
+        }
     }
 
-    function process_event(&$event,$advise='') {
+    /**
+     * process the before/after event
+     *
+     * @param Doku_Event $event
+     * @param string     $advise BEFORE or AFTER
+     */
+    function process_event($event,$advise='') {
 
         $evt_name = $event->name . ($advise ? '_'.$advise : '_BEFORE');
 
         if (!empty($this->_hooks[$evt_name])) {
-            foreach ($this->_hooks[$evt_name] as $hook) {
-                //        list($obj, $method, $param) = $hook;
-                $obj =& $hook[0];
-                $method = $hook[1];
-                $param = $hook[2];
-
-                if (is_null($obj)) {
-                    $method($event, $param);
-                } else {
-                    $obj->$method($event, $param);
-                }
+            foreach ($this->_hooks[$evt_name] as $sequenced_hooks) {
+                foreach ($sequenced_hooks as $hook) {
+                    list($obj, $method, $param) = $hook;
 
-                if (!$event->_continue) break;
+                    if (is_null($obj)) {
+                        $method($event, $param);
+                    } else {
+                        $obj->$method($event, $param);
+                    }
+
+                    if (!$event->_continue) return;
+                }
             }
         }
     }
@@ -181,12 +211,12 @@ class Doku_Event_Handler {
  *
  * function wrapper to process (create, trigger and destroy) an event
  *
- * @param  $name               (string)   name for the event
- * @param  $data               (mixed)    event data
- * @param  $action             (callback) (optional, default=NULL) default action, a php callback function
- * @param  $canPreventDefault  (bool)     (optional, default=true) can hooks prevent the default action
+ * @param  $name               string   name for the event
+ * @param  $data               mixed    event data
+ * @param  $action             callback (optional, default=NULL) default action, a php callback function
+ * @param  $canPreventDefault  bool     (optional, default=true) can hooks prevent the default action
  *
- * @return (mixed)                        the event results value after all event processing is complete
+ * @return mixed                        the event results value after all event processing is complete
  *                                         by default this is the return value of the default action however
  *                                         it can be set or modified by event handler hooks
  */
diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php
index 670a1bc29876f31509bc9db434daf1726d534177..b90da572412067aa5ea66eaacb47878e2e7894ff 100644
--- a/inc/feedcreator.class.php
+++ b/inc/feedcreator.class.php
@@ -185,6 +185,8 @@ class HtmlDescribable {
      */
     var $descriptionTruncSize;
 
+    var $description;
+
     /**
      * Returns a formatted description field, depending on descriptionHtmlSyndicated and
      * $descriptionTruncSize properties
@@ -222,7 +224,7 @@ class FeedHtmlField {
 
     /**
      * Creates a new instance of FeedHtmlField.
-     * @param  $string: if given, sets the rawFieldContent property
+     * @param string $parFieldContent: if given, sets the rawFieldContent property
      */
     function FeedHtmlField($parFieldContent) {
         if ($parFieldContent) {
@@ -267,8 +269,14 @@ class FeedHtmlField {
  * @author Kai Blankenhorn <kaib@bitfolge.de>
  */
 class UniversalFeedCreator extends FeedCreator {
+    /** @var FeedCreator */
     var $_feed;
 
+    /**
+     * Sets format
+     *
+     * @param string $format
+     */
     function _setFormat($format) {
         switch (strtoupper($format)) {
 
@@ -344,7 +352,7 @@ class UniversalFeedCreator extends FeedCreator {
      * Creates a syndication feed based on the items previously added.
      *
      * @see        FeedCreator::addItem()
-     * @param    string    format    format the feed should comply to. Valid values are:
+     * @param    string    $format    format the feed should comply to. Valid values are:
      *          "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS"
      * @return    string    the contents of the feed.
      */
@@ -358,10 +366,10 @@ class UniversalFeedCreator extends FeedCreator {
      * header may be sent to redirect the use to the newly created file.
      * @since 1.4
      *
-     * @param   string  format  format the feed should comply to. Valid values are:
+     * @param   string  $format  format the feed should comply to. Valid values are:
      *          "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM", "ATOM0.3", "HTML", "JS"
-     * @param   string  filename    optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
-     * @param   boolean displayContents optional    send the content of the file or not. If true, the file will be sent in the body of the response.
+     * @param   string  $filename    optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param   boolean $displayContents optional    send the content of the file or not. If true, the file will be sent in the body of the response.
      */
     function saveFeed($format="RSS0.91", $filename="", $displayContents=true) {
         $this->_setFormat($format);
@@ -376,10 +384,10 @@ class UniversalFeedCreator extends FeedCreator {
      * before anything else, especially before you do the time consuming task to build the feed
      * (web fetching, for example).
      *
-     * @param   string   format   format the feed should comply to. Valid values are:
+     * @param string   $format   format the feed should comply to. Valid values are:
      *       "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
-     * @param filename   string   optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
-     * @param timeout int      optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+     * @param string   $filename   optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param int      $timeout optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
      */
     function useCached($format="RSS0.91", $filename="", $timeout=3600) {
         $this->_setFormat($format);
@@ -390,7 +398,7 @@ class UniversalFeedCreator extends FeedCreator {
     /**
      * Outputs feed to the browser - needed for on-the-fly feed generation (like it is done in WordPress, etc.)
      *
-     * @param    format  string  format the feed should comply to. Valid values are:
+     * @param    $format  string  format the feed should comply to. Valid values are:
      *                           "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
      */
     function outputFeed($format='RSS0.91') {
@@ -422,7 +430,13 @@ class FeedCreator extends HtmlDescribable {
     /**
      * Optional attributes of a feed.
      */
-    var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
+    var $syndicationURL, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
+    /**
+     * Optional attribute of a feed
+     *
+     * @var FeedImage
+     */
+    var $image = null;
 
     /**
     * The url of the external xsl stylesheet used to format the naked rss feed.
@@ -430,13 +444,18 @@ class FeedCreator extends HtmlDescribable {
     */
     var $xslStyleSheet = "";
 
+    /**
+     * Style sheet for rss feed
+     */
+    var $cssStyleSheet = "";
+
 
     /**
      * @access private
+     * @var FeedItem[]
      */
     var $items = Array();
 
-
     /**
      * This feed's MIME content type.
      * @since 1.4
@@ -466,7 +485,7 @@ class FeedCreator extends HtmlDescribable {
     /**
      * Adds an FeedItem to the feed.
      *
-     * @param object FeedItem $item The FeedItem to add to the feed.
+     * @param FeedItem $item The FeedItem to add to the feed.
      * @access public
      */
     function addItem($item) {
@@ -482,8 +501,8 @@ class FeedCreator extends HtmlDescribable {
      * If the string is already shorter than $length, it is returned unchanged.
      *
      * @static
-     * @param string    string A string to be truncated.
-     * @param int        length the maximum length the string should be truncated to
+     * @param string  $string A string to be truncated.
+     * @param int     $length the maximum length the string should be truncated to
      * @return string    the truncated string
      */
     function iTrunc($string, $length) {
@@ -527,8 +546,8 @@ class FeedCreator extends HtmlDescribable {
     /**
      * Creates a string containing all additional elements specified in
      * $additionalElements.
-     * @param   elements    array   an associative array containing key => value pairs
-     * @param indentString  string  a string that will be inserted before every generated line
+     * @param $elements      array   an associative array containing key => value pairs
+     * @param $indentString  string  a string that will be inserted before every generated line
      * @return    string    the XML tags corresponding to $additionalElements
      */
     function _createAdditionalElements($elements, $indentString="") {
@@ -541,6 +560,9 @@ class FeedCreator extends HtmlDescribable {
         return $ae;
     }
 
+    /**
+     * Create elements for stylesheets
+     */
     function _createStylesheetReferences() {
         $xml = "";
         if ($this->cssStyleSheet) $xml .= "<?xml-stylesheet href=\"".$this->cssStyleSheet."\" type=\"text/css\"?>\n";
@@ -610,8 +632,8 @@ class FeedCreator extends HtmlDescribable {
      * before anything else, especially before you do the time consuming task to build the feed
      * (web fetching, for example).
      * @since 1.4
-     * @param filename  string  optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
-     * @param timeout   int     optional    the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+     * @param $filename  string  optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param $timeout   int     optional    the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
      */
     function useCached($filename="", $timeout=3600) {
         $this->_timeout = $timeout;
@@ -629,8 +651,8 @@ class FeedCreator extends HtmlDescribable {
      * header may be sent to redirect the user to the newly created file.
      * @since 1.4
      *
-     * @param filename  string  optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
-     * @param redirect  boolean optional    send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file.
+     * @param $filename         string  optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param $displayContents  boolean optional    send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file.
      */
     function saveFeed($filename="", $displayContents=true) {
         if ($filename=="") {
@@ -667,6 +689,7 @@ class FeedCreator extends HtmlDescribable {
  * Usually, you won't need to use this.
  */
 class FeedDate {
+    /** @var int */
     var $unix;
 
     /**
@@ -726,7 +749,7 @@ class FeedDate {
     /**
      * Gets the date stored in this FeedDate as an RFC 822 date.
      *
-     * @return a date in RFC 822 format
+     * @return string a date in RFC 822 format
      */
     function rfc822() {
         //return gmdate("r",$this->unix);
@@ -738,7 +761,7 @@ class FeedDate {
     /**
      * Gets the date stored in this FeedDate as an ISO 8601 date.
      *
-     * @return a date in ISO 8601 (RFC 3339) format
+     * @return string a date in ISO 8601 (RFC 3339) format
      */
     function iso8601() {
         $date = gmdate("Y-m-d\TH:i:sO",$this->unix);
@@ -751,7 +774,7 @@ class FeedDate {
     /**
      * Gets the date stored in this FeedDate as unix time stamp.
      *
-     * @return a date as a unix time stamp
+     * @return int a date as a unix time stamp
      */
     function unix() {
         return $this->unix;
@@ -777,7 +800,7 @@ class RSSCreator10 extends FeedCreator {
         $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
         $feed.= $this->_createGeneratorComment();
         if ($this->cssStyleSheet=="") {
-            $cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css";
+            $this->cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css";
         }
         $feed.= $this->_createStylesheetReferences();
         $feed.= "<rdf:RDF\n";
@@ -1032,12 +1055,16 @@ class PIECreator01 extends FeedCreator {
         $this->encoding = "utf-8";
     }
 
+    /**
+     * Build content
+     * @return string
+     */
     function createFeed() {
         $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
         $feed.= $this->_createStylesheetReferences();
         $feed.= "<feed version=\"0.1\" xmlns=\"http://example.com/newformat#\">\n";
         $feed.= "    <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
-        $this->truncSize = 500;
+        $this->descriptionTruncSize = 500;
         $feed.= "    <subtitle>".$this->getDescription()."</subtitle>\n";
         $feed.= "    <link>".$this->link."</link>\n";
         $icnt = count($this->items);
@@ -1091,6 +1118,10 @@ class AtomCreator10 extends FeedCreator {
         $this->encoding = "utf-8";
     }
 
+    /**
+     * Build content
+     * @return string
+     */
     function createFeed() {
         $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
         $feed.= $this->_createGeneratorComment();
@@ -1174,6 +1205,10 @@ class AtomCreator03 extends FeedCreator {
         $this->encoding = "utf-8";
     }
 
+    /**
+     * Build content
+     * @return string
+     */
     function createFeed() {
         $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
         $feed.= $this->_createGeneratorComment();
@@ -1281,6 +1316,7 @@ class MBOXCreator extends FeedCreator {
      */
     function createFeed() {
         $icnt = count($this->items);
+        $feed = "";
         for ($i=0; $i<$icnt; $i++) {
             if ($this->items[$i]->author!="") {
                 $from = $this->items[$i]->author;
@@ -1331,6 +1367,10 @@ class OPMLCreator extends FeedCreator {
         $this->encoding = "utf-8";
     }
 
+    /**
+     * Build content
+     * @return string
+     */
     function createFeed() {
         $feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
         $feed.= $this->_createGeneratorComment();
@@ -1441,6 +1481,7 @@ class HTMLCreator extends FeedCreator {
         }
 
         //set an openInNewWindow_token_to be inserted or not
+        $targetInsert = "";
         if ($this->openInNewWindow) {
             $targetInsert = " target='_blank'";
         }
@@ -1568,6 +1609,14 @@ class JSCreator extends HTMLCreator {
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 class DokuWikiFeedCreator extends UniversalFeedCreator{
+
+    /**
+     * Build content
+     *
+     * @param string $format
+     * @param string $encoding
+     * @return string
+     */
     function createFeed($format = "RSS0.91",$encoding='iso-8859-15') {
         $this->_setFormat($format);
         $this->_feed->encoding = $encoding;
diff --git a/inc/form.php b/inc/form.php
index 312c42b6078a5f91aa83eb9917ae91a01bde1b30..610f5020074a56fc2e1e24b910d56a7622a14670 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -47,15 +47,11 @@ class Doku_Form {
      * with up to four parameters is deprecated, instead the first parameter
      * should be an array with parameters.
      *
-     * @param   mixed   $params  Parameters for the HTML form element; Using the
-     *                           deprecated calling convention this is the ID
-     *                           attribute of the form
-     * @param   string  $action  (optional, deprecated) submit URL, defaults to
-     *                                                  current page
-     * @param   string  $method  (optional, deprecated) 'POST' or 'GET', default
-     *                                                  is POST
-     * @param   string  $enctype (optional, deprecated) Encoding type of the
-     *                                                  data
+     * @param mixed       $params  Parameters for the HTML form element; Using the deprecated
+     *                             calling convention this is the ID attribute of the form
+     * @param bool|string $action  (optional, deprecated) submit URL, defaults to current page
+     * @param bool|string $method  (optional, deprecated) 'POST' or 'GET', default is POST
+     * @param bool|string $enctype (optional, deprecated) Encoding type of the data
      * @author  Tom N Harris <tnharris@whoopdedo.org>
      */
     function Doku_Form($params, $action=false, $method=false, $enctype=false) {
@@ -230,7 +226,7 @@ class Doku_Form {
      * first (underflow) or last (overflow) element.
      *
      * @param   int     $pos    0-based index
-     * @return  arrayreference  pseudo-element
+     * @return  array reference  pseudo-element
      * @author  Tom N Harris <tnharris@whoopdedo.org>
      */
     function &getElementAt($pos) {
diff --git a/inc/fulltext.php b/inc/fulltext.php
index bd8e6b866c7287d35ef31046617a230ec730f2bd..dd918f214ffb182755da5680c7f8222a4e921dca 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -72,8 +72,20 @@ function _ft_pageSearch(&$data) {
                 $pages  = end($stack);
                 $pages_matched = array();
                 foreach(array_keys($pages) as $id){
-                    $text = utf8_strtolower(rawWiki($id));
-                    if (strpos($text, $phrase) !== false) {
+                    $evdata = array(
+                        'id' => $id,
+                        'phrase' => $phrase,
+                        'text' => rawWiki($id)
+                    );
+                    $evt = new Doku_Event('FULLTEXT_PHRASE_MATCH',$evdata);
+                    if ($evt->advise_before() && $evt->result !== true) {
+                        $text = utf8_strtolower($evdata['text']);
+                        if (strpos($text, $phrase) !== false) {
+                            $evt->result = true;
+                        }
+                    }
+                    $evt->advise_after();
+                    if ($evt->result === true) {
                         $pages_matched[$id] = 0; // phrase: always 0 hit
                     }
                 }
@@ -333,7 +345,7 @@ function ft_snippet($id,$highlight){
                 $pre = min($pre,100-$post);
             } else if ($post>50) {
                 $post = min($post, 100-$pre);
-            } else {
+            } else if ($offset == 0) {
                 // both are less than 50, means the context is the whole string
                 // make it so and break out of this loop - there is no need for the
                 // complex snippet calculations
@@ -354,12 +366,12 @@ function ft_snippet($id,$highlight){
             }
 
             // set $offset for next match attempt
-            //   substract strlen to avoid splitting a potential search success,
-            //   this is an approximation as the search pattern may match strings
-            //   of varying length and it will fail if the context snippet
-            //   boundary breaks a matching string longer than the current match
-            $utf8_offset = $utf8_idx + $post;
-            $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$post));
+            // continue matching after the current match
+            // if the current match is not the longest possible match starting at the current offset
+            // this prevents further matching of this snippet but for possible matches of length
+            // smaller than match length + context (at least 50 characters) this match is part of the context
+            $utf8_offset = $utf8_idx + $utf8_len;
+            $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$utf8_len));
             $offset = utf8_correctIdx($text,$offset);
         }
 
diff --git a/inc/html.php b/inc/html.php
index 928991ae25de7b045ccfedb95b89eadd390f20bf..fcec2967093e36821c922a49d6e8bb801c234dc1 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -1189,7 +1189,7 @@ function html_diff($text='',$intro=true,$type=null){
         $diffurl = wl($ID, array(
                         'do'       => 'diff',
                         'rev2[0]'  => $l_rev,
-                        'rev2[1]'  => $r_rev,
+                        'rev2[1]'  => $r_rev ? $r_rev : $INFO['currentrev'], // link to exactly this view FS#2835
                         'difftype' => $type,
                       ));
         ptln('<p><a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a></p>');
diff --git a/inc/httputils.php b/inc/httputils.php
index d6532720f48e386dd9e3666a5cabd7a16fcfd118..efeb2a56ca328dda83d6a3d422d718bd8c3c4908 100644
--- a/inc/httputils.php
+++ b/inc/httputils.php
@@ -65,7 +65,7 @@ function http_conditionalRequest($timestamp){
  *
  * @author Chris Smith <chris@jalakai.co.uk>
  * @param string $file absolute path of file to send
- * @returns  void or exits with previously header() commands executed
+ * @returns  void or exits with previous header() commands executed
  */
 function http_sendfile($file) {
     global $conf;
@@ -93,7 +93,7 @@ function http_sendfile($file) {
  *
  * This function exits the running script
  *
- * @param ressource $fh - file handle for an already open file
+ * @param resource $fh - file handle for an already open file
  * @param int $size     - size of the whole file
  * @param int $mime     - MIME type of the file
  *
@@ -205,7 +205,7 @@ function http_gzip_valid($uncompressed_file) {
  *
  * This function handles output of cacheable resource files. It ses the needed
  * HTTP headers. If a useable cache is present, it is passed to the web server
- * and the scrpt is terminated.
+ * and the script is terminated.
  */
 function http_cached($cache, $cache_ok) {
     global $conf;
diff --git a/inc/infoutils.php b/inc/infoutils.php
index 7358955a024d3681300a5b0f9e8cc50f6b86df91..3636d86a1ae8e9b5d3d7e546f82b0e353b8b7eeb 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -105,12 +105,16 @@ function check(){
 
     if ($INFO['isadmin'] || $INFO['ismanager']){
         msg('DokuWiki version: '.getVersion(),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);
+        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);
+        }
+    } else {
+        if(version_compare(phpversion(),'5.2.0','<')){
+            msg('Your PHP version is too old',-1);
+        }
     }
 
     $mem = (int) php_to_byte(ini_get('memory_limit'));
diff --git a/inc/init.php b/inc/init.php
index a937b934df938b7efc4a1a5f6b1ce0dcff1f021f..3e422453d5f2cb85492882c7af5267bb879e99ab 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -183,11 +183,6 @@ if($conf['compression'] == 'gz' && !function_exists('gzopen')){
     $conf['compression'] = 0;
 }
 
-// fix dateformat for upgraders
-if(strpos($conf['dformat'],'%') === false){
-    $conf['dformat'] = '%Y/%m/%d %H:%M';
-}
-
 // precalculate file creation modes
 init_creationmodes();
 
diff --git a/inc/io.php b/inc/io.php
index c5225a2e0723c8eb0201871f36b4d9fb2cb5c6d4..27a34b045957f5e3a6a6be54c983d58be718d98a 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -367,8 +367,6 @@ function io_createNamespace($id, $ns_type='pages') {
  * @author  Andreas Gohr <andi@splitbrain.org>
  */
 function io_makeFileDir($file){
-    global $conf;
-
     $dir = dirname($file);
     if(!@is_dir($dir)){
         io_mkdir_p($dir) || msg("Creating directory $dir failed",-1);
diff --git a/inc/lang/bn/lang.php b/inc/lang/bn/lang.php
index 94a3fbb127cc0442664feb2cf9849f9f2fad3766..230f3ef803ae0c2e709f665e1d7ddc0445d77475 100644
--- a/inc/lang/bn/lang.php
+++ b/inc/lang/bn/lang.php
@@ -5,6 +5,7 @@
  * 
  * @author Foysol <ragebot1125@gmail.com>
  * @author ninetailz <ninetailz1125@gmail.com>
+ * @author Khan M. B. Asad <muhammad2017@gmail.com>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'itr';
@@ -127,3 +128,33 @@ $lang['js']['medialeft']       = 'বাম দিকে ইমেজ সার
 $lang['js']['mediaright']      = 'ডান দিকে ইমেজ সারিবদ্ধ কর';
 $lang['js']['mediacenter']     = 'মাঝখানে ইমেজ সারিবদ্ধ কর';
 $lang['js']['medianoalign']    = 'কোনো সারিবদ্ধ করা প্রয়োজন নেই';
+$lang['js']['nosmblinks']      = 'উইন্ডোস শেয়ার এর সাথে সংযোগ সাধন কেবল মাইক্রোসফ্ট ইন্টারনেট এক্সপ্লোরারেই সম্ভব।\nতবে আপনি লিংকটি কপি পেস্ট করতেই পারেন।';
+$lang['js']['linkwiz']         = 'লিংক উইজার্ড';
+$lang['js']['linkto']          = 'সংযোগের লক্ষ্য:';
+$lang['js']['del_confirm']     = 'নির্বাচিত আইটেম(গুলো) আসলেই মুছে ফেলতে চান?';
+$lang['js']['restore_confirm'] = 'এই সংস্করণ সত্যিই পূর্বাবস্থায় ফিরিয়ে আনতে চান?';
+$lang['js']['media_diff']      = 'পার্থক্যগুলো দেখুন:';
+$lang['js']['media_diff_both'] = 'পাশাপাশি';
+$lang['js']['media_diff_opacity'] = 'শাইন-থ্রু';
+$lang['js']['media_diff_portions'] = 'ঝেঁটিয়ে বিদায়';
+$lang['js']['media_select']    = 'ফাইল নির্বাচন...';
+$lang['js']['media_upload_btn'] = 'আপলোড';
+$lang['js']['media_done_btn']  = 'সাধিত';
+$lang['js']['media_drop']      = 'আপলোডের জন্য এখানে ফাইল ফেলুন';
+$lang['js']['media_cancel']    = 'অপসারণ';
+$lang['js']['media_overwrt']   = 'বর্তমান ফাইল ওভাররাইট করুন';
+$lang['rssfailed']             = 'ফিডটি জোগাড় করতে গিয়ে একটি ত্রুটি ঘটেছে:';
+$lang['nothingfound']          = 'কিছু পাওয়া যায়নি।';
+$lang['mediaselect']           = 'মিডিয়া ফাইল';
+$lang['fileupload']            = 'মিডিয়া ফাইল আপলোড';
+$lang['uploadsucc']            = 'আপলোড সফল';
+$lang['uploadfail']            = 'আপলোড ব্যর্থ। অনুমতি জনিত ত্রুটি কী?';
+$lang['uploadwrong']           = 'আপলোড প্রত্যাখ্যাত। এই ফাইল এক্সটেনশন অননুমোদিত।';
+$lang['uploadexist']           = 'ফাইল ইতিমধ্যেই বিরাজমান। কিছু করা হয়নি।';
+$lang['uploadbadcontent']      = 'আপলোডকৃত সামগ্রী %s ফাইল এক্সটেনশন এর সাথে মিলেনি।';
+$lang['uploadspam']            = 'স্প্যাম ব্ল্যাকলিস্ট আপলোড আটকে দিয়েছে।';
+$lang['uploadxss']             = 'সামগ্রীটি ক্ষতিকর ভেবে আপলোড আটকে দেয়া হয়েছে।';
+$lang['uploadsize']            = 'আপলোডকৃত ফাইলটি বেশি বড়ো। (সর্বোচ্চ %s)';
+$lang['deletesucc']            = '"%s" ফাইলটি মুছে ফেলা হয়েছে।';
+$lang['deletefail']            = '"%s" ডিলিট করা যায়নি - অনুমতি আছে কি না দেখুন।';
+$lang['mediainuse']            = '"%s" ফাইলটি মোছা হয়নি - এটি এখনো ব্যবহৃত হচ্ছে।';
diff --git a/inc/lang/eo/admin.txt b/inc/lang/eo/admin.txt
index 4b0cf790921ed51e5bb9e070f0f646f130e02492..4b3cf0c2acc1309c6b9064c7407851a97202386a 100644
--- a/inc/lang/eo/admin.txt
+++ b/inc/lang/eo/admin.txt
@@ -1,3 +1,3 @@
 ====== Administrado ======
 
-Sube vi povas trovi liston de administraj taskoj disponeblaj en DokuWiki.
+Sube vi trovas liston de administraj taskoj haveblaj en DokuWiki.
diff --git a/inc/lang/eo/adminplugins.txt b/inc/lang/eo/adminplugins.txt
index 769a8c538722b27500632e06c25fef6484bfdb2f..bb7e7829bf79e036c26dc32ffce4f3f9cad407b2 100644
--- a/inc/lang/eo/adminplugins.txt
+++ b/inc/lang/eo/adminplugins.txt
@@ -1 +1 @@
-===== Eksteraj kromaĵoj =====
\ No newline at end of file
+===== Aldonaj kromaĵoj =====
\ No newline at end of file
diff --git a/inc/lang/eo/diff.txt b/inc/lang/eo/diff.txt
index 5829a7db1572ee1f953898d2935e52193513cb5b..3c9db61c81587b8d514593af2450c234a3fbf0f6 100644
--- a/inc/lang/eo/diff.txt
+++ b/inc/lang/eo/diff.txt
@@ -1,4 +1,4 @@
 ====== Diferencoj ======
 
-Ĉi tie vi povas vidi diferencojn inter la aktuala versio kaj la elektita revizio de la paĝo.
+Tio montras diferencojn inter du versioj de la paĝo.
 
diff --git a/inc/lang/eo/draft.txt b/inc/lang/eo/draft.txt
index 32ddc83f6cbed78ee818b635788158c54c389348..57526f3b546a5bf4c999cc838d52b4a9dc029241 100644
--- a/inc/lang/eo/draft.txt
+++ b/inc/lang/eo/draft.txt
@@ -1,5 +1,5 @@
 ====== Skiza dosiero troviĝis ======
 
-Via lasta sekcio de redakto en tiu ĉi paĝo ne korekte kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sekcio.
+Via lasta redaktosesio en tiu ĉi paĝo ne ĝuste kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sesio.
 
 Bonvolu decidi ĉu vi volas //restarigi// vian perditan redakton, //forigi// la aŭtomate konservitan skizon aŭ //rezigni// pri la redakta procezo.
diff --git a/inc/lang/eo/edit.txt b/inc/lang/eo/edit.txt
index 29b3382c5265599c0f6686e3336260ea7e1f7278..ccc8a613d1af9d8e7349b407b787e5de8c6fa95f 100644
--- a/inc/lang/eo/edit.txt
+++ b/inc/lang/eo/edit.txt
@@ -1 +1 @@
-Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] por kompreni kiel vi povas krei paĝojn. Bonvolu redakti nur se vi planas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[wiki:playground|ludejo]].
+Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] pri la formatigo. Bonvolu redakti **nur**, se vi povas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[playground:playground|sablokesto]].
diff --git a/inc/lang/eo/editrev.txt b/inc/lang/eo/editrev.txt
index 1640baa91d24fa0d62af0a2b7de8b6cbcf9f5c81..2e1406b0fb9a3d3d75e9650eaf1b6528d7150195 100644
--- a/inc/lang/eo/editrev.txt
+++ b/inc/lang/eo/editrev.txt
@@ -1,2 +1,2 @@
-**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun la sama enhavo.
+**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun tiu enhavo.
 ----
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index a543b25714b4196d2899b9459a1a8177403bb422..97231bdcef4c624ebff9300f4825bcae3a4e992e 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -37,13 +37,13 @@ $lang['btn_secedit']           = 'Redakti';
 $lang['btn_login']             = 'Ensaluti';
 $lang['btn_logout']            = 'Elsaluti';
 $lang['btn_admin']             = 'Administri';
-$lang['btn_update']            = 'Äœisdatigi';
+$lang['btn_update']            = 'Aktualigi';
 $lang['btn_delete']            = 'Forigi';
 $lang['btn_back']              = 'Retroiri';
 $lang['btn_backlink']          = 'Retroligoj';
 $lang['btn_backtomedia']       = 'Retroiri al elekto de dosiero';
 $lang['btn_subscribe']         = 'Aliĝi al paĝaj modifoj';
-$lang['btn_profile']           = 'Äœisdatigi profilon';
+$lang['btn_profile']           = 'Aktualigi profilon';
 $lang['btn_reset']             = 'Rekomenci';
 $lang['btn_resendpwd']         = 'Sendi novan pasvorton';
 $lang['btn_draft']             = 'Redakti skizon';
@@ -53,7 +53,7 @@ $lang['btn_revert']            = 'Restarigi';
 $lang['btn_register']          = 'Registriĝi';
 $lang['btn_apply']             = 'Apliki';
 $lang['btn_media']             = 'Medio-administrilo';
-$lang['btn_deleteuser']        = 'Forigi mian aliĝon';
+$lang['btn_deleteuser']        = 'Forigi mian konton';
 $lang['loggedinas']            = 'Ensalutinta kiel';
 $lang['user']                  = 'Uzant-nomo';
 $lang['pass']                  = 'Pasvorto';
@@ -81,7 +81,7 @@ $lang['reghere']               = 'Se vi ne havas konton, vi povas akiri ĝin';
 $lang['profna']                = 'Tiu ĉi vikio ne ebligas modifon en la profiloj.';
 $lang['profnochange']          = 'Neniu ŝanĝo, nenio farinda.';
 $lang['profnoempty']           = 'Malplena nomo aÅ­ retadreso ne estas permesata.';
-$lang['profchanged']           = 'La profilo de la uzanto sukcese ĝisdatiĝis.';
+$lang['profchanged']           = 'La profilo de la uzanto sukcese aktualiĝis.';
 $lang['profnodelete']          = 'Tiu ĉi vikio ne subtenas forigo de uzantoj';
 $lang['profdeleteuser']        = 'Forigi aliĝon';
 $lang['profdeleted']           = 'Via uzant-aliĝo estis forigata de tiu ĉi vikio';
@@ -104,7 +104,7 @@ $lang['txt_filename']          = 'Alŝuti kiel (laŭvole)';
 $lang['txt_overwrt']           = 'AnstataÅ­igi ekzistantan dosieron';
 $lang['maxuploadsize']         = 'Alŝuto maks. %s po dosiero.';
 $lang['lockedby']              = 'Nune ŝlosita de';
-$lang['lockexpire']            = 'Ŝlosado ĉesos en';
+$lang['lockexpire']            = 'Ŝlosado ĉesos je';
 $lang['js']['willexpire']      = 'Vi povos redakti ĉi tiun paĝon post unu minuto.\nSe vi volas nuligi tempokontrolon de la ŝlosado, premu la butonon "Antaŭrigardi".';
 $lang['js']['notsavedyet']     = 'Ne konservitaj modifoj perdiĝos.
 Ĉu vi certe volas daŭrigi la procezon?';
@@ -293,6 +293,7 @@ $lang['i_policy']              = 'Komenca ACL-a agordo';
 $lang['i_pol0']                = 'Malferma Vikio (legi, skribi, alŝuti povas ĉiuj)';
 $lang['i_pol1']                = 'Publika Vikio (legi povas ĉiuj, skribi kaj alŝuti povas registritaj uzantoj)';
 $lang['i_pol2']                = 'Ferma Vikio (legi, skribi, alŝuti nur povas registritaj uzantoj)';
+$lang['i_allowreg']            = 'Permesi al uzantoj registri sin mem';
 $lang['i_retry']               = 'Reprovi';
 $lang['i_license']             = 'Bonvolu elekti la permesilon, sub kiun vi volas meti vian enhavon:';
 $lang['i_license_none']        = 'Ne montri licencinformojn';
diff --git a/inc/lang/fr/denied.txt b/inc/lang/fr/denied.txt
index 20d4d67551a8e009e99594ee9c15e3691431bba1..56c59a7c2f21ec07604086bc95c1ce9a1650d1bc 100644
--- a/inc/lang/fr/denied.txt
+++ b/inc/lang/fr/denied.txt
@@ -1,3 +1,3 @@
 ====== Autorisation refusée ======
 
-Désolé, vous n'avez pas les droits pour continuer. Peut-être avez-vous oublié de vous identifier ?
+Désolé, vous n'avez pas suffisement d'autorisations pour poursuivre votre demande. Peut-être avez-vous oublié de vous identifier ?
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index 49f617323f7e118c009ebb06366d7cb4d045473f..32e3055f7f9667f142bea43ab45f550a4f4adb99 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -29,6 +29,7 @@
  * @author Bruno Veilleux <bruno.vey@gmail.com>
  * @author Emmanuel <seedfloyd@gmail.com>
  * @author Jérôme Brandt <jeromebrandt@gmail.com>
+ * @author Wild <wild.dagger@free.fr>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
@@ -51,10 +52,10 @@ $lang['btn_revs']              = 'Anciennes révisions';
 $lang['btn_recent']            = 'Derniers changements';
 $lang['btn_upload']            = 'Envoyer';
 $lang['btn_cancel']            = 'Annuler';
-$lang['btn_index']             = 'Index';
+$lang['btn_index']             = 'Plan du site';
 $lang['btn_secedit']           = 'Modifier';
-$lang['btn_login']             = 'Connexion';
-$lang['btn_logout']            = 'Déconnexion';
+$lang['btn_login']             = 'S\'identifier';
+$lang['btn_logout']            = 'Se déconnecter';
 $lang['btn_admin']             = 'Administrer';
 $lang['btn_update']            = 'Mettre à jour';
 $lang['btn_delete']            = 'Effacer';
@@ -69,7 +70,7 @@ $lang['btn_draft']             = 'Modifier le brouillon';
 $lang['btn_recover']           = 'Récupérer le brouillon';
 $lang['btn_draftdel']          = 'Effacer le brouillon';
 $lang['btn_revert']            = 'Restaurer';
-$lang['btn_register']          = 'S\'enregistrer';
+$lang['btn_register']          = 'Créer un compte';
 $lang['btn_apply']             = 'Appliquer';
 $lang['btn_media']             = 'Gestionnaire de médias';
 $lang['btn_deleteuser']        = 'Supprimer mon compte';
diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php
index 5113e1cc836059b22118ade1adb9a109677aeaae..a0aef9447269d27e73edf8fe43d6a6b66c9556ab 100644
--- a/inc/lang/hu/lang.php
+++ b/inc/lang/hu/lang.php
@@ -337,4 +337,4 @@ $lang['media_restore']         = 'Ezen verzió visszaállítása';
 $lang['currentns']             = 'Aktuális névtér';
 $lang['searchresult']          = 'Keresés eredménye';
 $lang['plainhtml']             = 'Sima HTML';
-$lang['wikimarkup']            = 'Wiki-jelölő nyelv';
+$lang['wikimarkup']            = 'Wiki-jelölőnyelv';
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index e5e3e3c766d0bc6357067c99e0e1fa2aacff5388..e22aa9fff35ae08b853c5260c605fc9db36a9ec0 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -22,6 +22,7 @@
  * @author Klap-in <klapinklapin@gmail.com>
  * @author Remon <no@email.local>
  * @author gicalle <gicalle@hotmail.com>
+ * @author Rene <wllywlnt@yahoo.com>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
diff --git a/inc/load.php b/inc/load.php
index 497dd6921db9c573dd6bbeb4a29abf0d62bf5e42..f1deffe19a56cf867f8fa39de04101d533a87fc3 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -96,6 +96,12 @@ function load_autoload($name){
         'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
         'DokuWiki_Auth_Plugin'   => DOKU_PLUGIN.'auth.php',
 
+        'Doku_Renderer'          => DOKU_INC.'inc/parser/renderer.php',
+        'Doku_Renderer_xhtml'    => DOKU_INC.'inc/parser/xhtml.php',
+        'Doku_Renderer_code'     => DOKU_INC.'inc/parser/code.php',
+        'Doku_Renderer_xhtmlsummary' => DOKU_INC.'inc/parser/xhtmlsummary.php',
+        'Doku_Renderer_metadata' => DOKU_INC.'inc/parser/metadata.php',
+
     );
 
     if(isset($classes[$name])){
diff --git a/inc/media.php b/inc/media.php
index 960b96e65ba4b65d01b10aac8e814330ec9aa474..4fff95d94ce49779a2aa81226db9dbfb276beed1 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -284,7 +284,7 @@ function media_upload_xhr($ns,$auth){
         'copy'
     );
     unlink($path);
-    if ($tmp) dir_delete($tmp);
+    if ($tmp) io_rmdir($tmp, true);
     if (is_array($res)) {
         msg($res[0], $res[1]);
         return false;
@@ -704,7 +704,7 @@ function media_tab_files_options(){
             if ($checked == $option) {
                 $attrs['checked'] = 'checked';
             }
-            $form->addElement(form_makeRadioField($group, $option,
+            $form->addElement(form_makeRadioField($group . '_dwmedia', $option,
                                        $lang['media_' . $group . '_' . $option],
                                                   $content[0] . '__' . $option,
                                                   $option, $attrs));
@@ -728,10 +728,23 @@ function _media_get_sort_type() {
     return _media_get_display_param('sort', array('default' => 'name', 'date'));
 }
 
+/**
+ * Returns type of listing for the list of files in media manager
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @return string - list type
+ */
 function _media_get_list_type() {
     return _media_get_display_param('list', array('default' => 'thumbs', 'rows'));
 }
 
+/**
+ * Get display parameters
+ *
+ * @param string $param   name of parameter
+ * @param array  $values  allowed values, where default value has index key 'default'
+ * @return string the parameter value
+ */
 function _media_get_display_param($param, $values) {
     global $INPUT;
     if (in_array($INPUT->str($param), $values)) {
@@ -859,6 +872,10 @@ function media_tab_history($image, $ns, $auth=null) {
 /**
  * Prints mediafile details
  *
+ * @param string        $image media id
+ * @param               $auth
+ * @param int|bool      $rev
+ * @param JpegMeta|bool $meta
  * @author Kate Arzamastseva <pshns@ukr.net>
  */
 function media_preview($image, $auth, $rev=false, $meta=false) {
@@ -1039,7 +1056,6 @@ function media_details($image, $auth, $rev=false, $meta=false) {
  * @author Kate Arzamastseva <pshns@ukr.net>
  */
 function media_diff($image, $ns, $auth, $fromajax = false) {
-    global $lang;
     global $conf;
     global $INPUT;
 
@@ -1098,9 +1114,15 @@ function media_diff($image, $ns, $auth, $fromajax = false) {
 
 }
 
+/**
+ * Callback for media file diff
+ *
+ * @param $data
+ * @return bool|void
+ */
 function _media_file_diff($data) {
     if(is_array($data) && count($data)===6) {
-        return media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
+        media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
     } else {
         return false;
     }
@@ -1559,7 +1581,7 @@ function media_printimgdetail($item, $fullscreen=false){
  * @param string     $amp - separator
  * @param bool       $abs
  * @param bool       $params_array
- * @return string - link
+ * @return string|array - link
  */
 function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array=false) {
     global $ID;
@@ -1819,7 +1841,7 @@ function media_resize_image($file, $ext, $w, $h=0){
     if( $mtime > filemtime($file) ||
             media_resize_imageIM($ext,$file,$info[0],$info[1],$local,$w,$h) ||
             media_resize_imageGD($ext,$file,$info[0],$info[1],$local,$w,$h) ){
-        if($conf['fperm']) chmod($local, $conf['fperm']);
+        if($conf['fperm']) @chmod($local, $conf['fperm']);
         return $local;
     }
     //still here? resizing failed
@@ -1880,7 +1902,7 @@ function media_crop_image($file, $ext, $w, $h=0){
     if( $mtime > @filemtime($file) ||
             media_crop_imageIM($ext,$file,$info[0],$info[1],$local,$cw,$ch,$cx,$cy) ||
             media_resize_imageGD($ext,$file,$cw,$ch,$local,$cw,$ch,$cx,$cy) ){
-        if($conf['fperm']) chmod($local, $conf['fperm']);
+        if($conf['fperm']) @chmod($local, $conf['fperm']);
         return media_resize_image($local,$ext, $w, $h);
     }
 
@@ -2164,7 +2186,7 @@ function media_alternativefiles($src, $exts){
 /**
  * Check if video/audio is supported to be embedded.
  *
- * @param string $src       - mimetype of media file
+ * @param string $mime      - mimetype of media file
  * @param string $type      - type of media files to check ('video', 'audio', or none)
  * @return boolean
  *
diff --git a/inc/pageutils.php b/inc/pageutils.php
index c8d3cf4bb506ce7e33f0a829ca7b1e80a9dbe53d..9c2794387882840beaadde79b2c481c952feec1d 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -94,6 +94,7 @@ function getID($param='id',$clean=true){
  * @author Andreas Gohr <andi@splitbrain.org>
  * @param  string  $raw_id    The pageid to clean
  * @param  boolean $ascii     Force ASCII
+ * @return string cleaned id
  */
 function cleanID($raw_id,$ascii=false){
     global $conf;
@@ -244,6 +245,7 @@ function page_exists($id,$rev='',$clean=true) {
  * @param  $rev     string   page revision, empty string for current
  * @param  $clean   bool     flag indicating that $raw_id should be cleaned.  Only set to false
  *                           when $id is guaranteed to have been cleaned already.
+ * @return string full path
  *
  * @author Andreas Gohr <andi@splitbrain.org>
  */
@@ -361,6 +363,7 @@ function mediaFN($id, $rev=''){
  *
  * @param  string $id  The id of the local file
  * @param  string $ext The file extension (usually txt)
+ * @return string full filepath to localized file
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function localeFN($id,$ext='txt'){
@@ -543,6 +546,11 @@ function isHiddenPage($id){
     return $data['hidden'];
 }
 
+/**
+ * callback checks if page is hidden
+ *
+ * @param array $data event data    see isHiddenPage()
+ */
 function _isHiddenPage(&$data) {
     global $conf;
     global $ACT;
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 0b8e3ee026fb7f5cceb83a3f7723e3a02a6f2f04..d77ffd1aa8ec5c7b9543df11e19d99bd6e3b6b88 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -5,7 +5,6 @@
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/renderer.php';
 
 class Doku_Renderer_code extends Doku_Renderer {
     var $_codeblock=0;
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 8ba159d62d6c1b238ae8d14976f2819cf3e4187b..73bae190fc6a22da7b1e27fd9502dd872fa80b71 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -16,8 +16,6 @@ if ( !defined('DOKU_TAB') ) {
     define ('DOKU_TAB',"\t");
 }
 
-require_once DOKU_INC . 'inc/parser/renderer.php';
-
 /**
  * The Renderer
  */
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index e3401fd4816dd1e49f75ee7bf12d50864f73a90c..1f9ad00a29c18ef748478446b1127d7663b63d4d 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -6,8 +6,6 @@
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/plugin.php';
-require_once DOKU_INC . 'inc/pluginutils.php';
 
 /**
  * An empty renderer, produces no output
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 80701cd2ebc6711aefb875ddc73dc6e018e00092..184e62fe3548895a8e700e2c3a71eae120b04e8b 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -17,9 +17,6 @@ if ( !defined('DOKU_TAB') ) {
     define ('DOKU_TAB',"\t");
 }
 
-require_once DOKU_INC . 'inc/parser/renderer.php';
-require_once DOKU_INC . 'inc/html.php';
-
 /**
  * The Renderer
  */
@@ -562,6 +559,12 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      * $search,$returnonly & $linktype are not for the renderer but are used
      * elsewhere - no need to implement them in other renderers
      *
+     * @param string $id pageid
+     * @param string|null $name link name
+     * @param string|null $search adds search url param
+     * @param bool $returnonly whether to return html or write to doc attribute
+     * @param string $linktype type to set use of headings
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
      * @author Andreas Gohr <andi@splitbrain.org>
      */
     function internallink($id, $name = null, $search=null,$returnonly=false,$linktype='content') {
@@ -1096,48 +1099,30 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
 
             $ret .= ' />';
 
-        }elseif(media_supportedav($mime, 'video')){
+        }elseif(media_supportedav($mime, 'video') || media_supportedav($mime, 'audio')){
             // first get the $title
-            if (!is_null($title)) {
-                $title  = $this->_xmlEntities($title);
-            }
-            if (!$title) {
-                // just show the sourcename
-                $title = $this->_xmlEntities(utf8_basename(noNS($src)));
-            }
+            $title = !is_null($title) ? $this->_xmlEntities($title) : false;
             if (!$render) {
-                // if the video is not supposed to be rendered
-                // return the title of the video
-                return $title;
+                // if the file is not supposed to be rendered
+                // return the title of the file (just the sourcename if there is no title)
+                return $title ? $title : $this->_xmlEntities(utf8_basename(noNS($src)));
             }
 
             $att = array();
             $att['class'] = "media$align";
-
-            //add video(s)
-            $ret .= $this->_video($src, $width, $height, $att);
-
-        }elseif(media_supportedav($mime, 'audio')){
-            // first get the $title
-            if (!is_null($title)) {
-                $title  = $this->_xmlEntities($title);
+            if ($title) {
+                $att['title'] = $title;
             }
-            if (!$title) {
-                // just show the sourcename
-                $title = $this->_xmlEntities(utf8_basename(noNS($src)));
+
+            if (media_supportedav($mime, 'video')) {
+                //add video
+                $ret .= $this->_video($src, $width, $height, $att);
             }
-            if (!$render) {
-                // if the video is not supposed to be rendered
-                // return the title of the video
-                return $title;
+            if (media_supportedav($mime, 'audio')) {
+                //add audio
+                $ret .= $this->_audio($src, $att);
             }
 
-            $att = array();
-            $att['class'] = "media$align";
-
-            //add audio
-            $ret .= $this->_audio($src, $att);
-
         }elseif($mime == 'application/x-shockwave-flash'){
             if (!$render) {
                 // if the flash is not supposed to be rendered
@@ -1282,7 +1267,6 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      * @return string
      */
     function _video($src,$width,$height,$atts=null){
-
         // prepare width and height
         if(is_null($atts)) $atts = array();
         $atts['width']  = (int) $width;
@@ -1309,7 +1293,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
         // output source for each alternative video format
         foreach($alternatives as $mime => $file) {
             $url = ml($file,array('cache'=>$cache),true,'&');
-            $title = $this->_xmlEntities(utf8_basename(noNS($file)));
+            $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
 
             $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
             // alternative content (just a link to the file)
@@ -1345,7 +1329,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
         // output source for each alternative audio format
         foreach($alternatives as $mime => $file) {
             $url = ml($file,array('cache'=>$cache),true,'&');
-            $title = $this->_xmlEntities(utf8_basename(noNS($file)));
+            $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
 
             $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
             // alternative content (just a link to the file)
diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php
index 95f86cbef6c1d30aab40ce0457aac160ad597562..867b71f6ab2a9be1e785dfc25d5227f375eb3ba6 100644
--- a/inc/parser/xhtmlsummary.php
+++ b/inc/parser/xhtmlsummary.php
@@ -1,6 +1,5 @@
 <?php
 if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/xhtml.php';
 
 /**
  * The summary XHTML form selects either up to the first two paragraphs
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 4df273f1144224aed1f6d0ad2c9e5fca338ae673..06bd6dbb837de1e21e9c26e0d17ccf7c81a059f6 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -430,8 +430,9 @@ function p_render_metadata($id, $orig){
     global $ID, $METADATA_RENDERERS;
 
     // avoid recursive rendering processes for the same id
-    if (isset($METADATA_RENDERERS[$id]))
+    if (isset($METADATA_RENDERERS[$id])) {
         return $orig;
+    }
 
     // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it
     $METADATA_RENDERERS[$id] =& $orig;
@@ -444,8 +445,6 @@ function p_render_metadata($id, $orig){
     $evt = new Doku_Event('PARSER_METADATA_RENDER', $orig);
     if ($evt->advise_before()) {
 
-        require_once DOKU_INC."inc/parser/metadata.php";
-
         // get instructions
         $instructions = p_cached_instructions(wikiFN($id),false,$id);
         if(is_null($instructions)){
@@ -588,7 +587,7 @@ function p_sort_modes($a, $b){
 function p_render($mode,$instructions,&$info){
     if(is_null($instructions)) return '';
 
-    $Renderer =& p_get_renderer($mode);
+    $Renderer = p_get_renderer($mode);
     if (is_null($Renderer)) return null;
 
     $Renderer->reset();
@@ -616,43 +615,54 @@ function p_render($mode,$instructions,&$info){
 }
 
 /**
+ * Figure out the correct renderer class to use for $mode,
+ * instantiate and return it
+ *
  * @param $mode string Mode of the renderer to get
  * @return null|Doku_Renderer The renderer
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
  */
-function & p_get_renderer($mode) {
+function p_get_renderer($mode) {
     /** @var Doku_Plugin_Controller $plugin_controller */
     global $conf, $plugin_controller;
 
     $rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
     $rclass = "Doku_Renderer_$rname";
 
+    // if requested earlier or a bundled renderer
     if( class_exists($rclass) ) {
         $Renderer = new $rclass();
         return $Renderer;
     }
 
-    // try default renderer first:
-    $file = DOKU_INC."inc/parser/$rname.php";
-    if(@file_exists($file)){
-        require_once $file;
+    // not bundled, see if its an enabled plugin for rendering $mode
+    $Renderer = $plugin_controller->load('renderer',$rname);
+    if ($Renderer && is_a($Renderer, 'Doku_Renderer')  && ($mode == $Renderer->getFormat())) {
+        return $Renderer;
+    }
 
-        if ( !class_exists($rclass) ) {
-            trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
-            msg("Renderer '$rname' for $mode not valid",-1);
-            return null;
+    // there is a configuration error!
+    // not bundled, not a valid enabled plugin, use $mode to try to fallback to a bundled renderer
+    $rclass = "Doku_Renderer_$mode";
+    if ( class_exists($rclass) ) {
+        // viewers should see renderered output, so restrict the warning to admins only
+        $msg = "No renderer '$rname' found for mode '$mode', check your plugins";
+        if ($mode == 'xhtml') {
+            $msg .= " and the 'renderer_xhtml' config setting";
         }
-        $Renderer = new $rclass();
-    }else{
-        // Maybe a plugin/component is available?
-        $Renderer = $plugin_controller->load('renderer',$rname);
+        $msg .= ".<br/>Attempting to fallback to the bundled renderer.";
+        msg($msg,-1,'','',MSG_ADMINS_ONLY);
 
-        if(!isset($Renderer) || is_null($Renderer)){
-            msg("No renderer '$rname' found for mode '$mode'",-1);
-            return null;
-        }
+        $Renderer = new $rclass;
+        $Renderer->nocache();     // fallback only (and may include admin alerts), don't cache
+        return $Renderer;
     }
 
-    return $Renderer;
+    // fallback failed, alert the world
+    trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
+    msg("No renderer '$rname' found for mode '$mode'",-1);
+    return null;
 }
 
 /**
diff --git a/inc/pluginutils.php b/inc/pluginutils.php
index 894bbefb6c7512effc89cc86a3b62e574326866f..911c4e5c0811076aa250ba93ef30c46f69ac9761 100644
--- a/inc/pluginutils.php
+++ b/inc/pluginutils.php
@@ -37,7 +37,7 @@ function plugin_list($type='',$all=false) {
  * @param  $name     string name of the plugin to load
  * @param  $new      bool   true to return a new instance of the plugin, false to use an already loaded instance
  * @param  $disabled bool   true to load even disabled plugins
- * @return DokuWiki_Plugin|DokuWiki_Syntax_Plugin|null  the plugin object or null on failure
+ * @return DokuWiki_Plugin|null  the plugin object or null on failure
  */
 function plugin_load($type,$name,$new=false,$disabled=false) {
     /** @var $plugin_controller Doku_Plugin_Controller */
diff --git a/inc/subscription.php b/inc/subscription.php
index ddf2f39e6ca9ac8101c72a2961715333976dbf26..ddf30706b668d3b791ab3b4dbf10d57ca7813c24 100644
--- a/inc/subscription.php
+++ b/inc/subscription.php
@@ -288,7 +288,7 @@ class Subscription {
     public function send_bulk($page) {
         if(!$this->isenabled()) return 0;
 
-        /** @var auth_basic $auth */
+        /** @var DokuWiki_Auth_Plugin $auth */
         global $auth;
         global $conf;
         global $USERINFO;
@@ -651,7 +651,7 @@ class Subscription {
     public function notifyaddresses(&$data) {
         if(!$this->isenabled()) return;
 
-        /** @var auth_basic $auth */
+        /** @var DokuWiki_Auth_Plugin $auth */
         global $auth;
         global $conf;
 
diff --git a/lib/exe/ajax.php b/lib/exe/ajax.php
index 6e2011cd93520858085c9e0f4ace818f7e214d61..1000094bcb08543161341f909d374be01d58bb11 100644
--- a/lib/exe/ajax.php
+++ b/lib/exe/ajax.php
@@ -41,7 +41,6 @@ if(function_exists($callfn)){
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function ajax_qsearch(){
-    global $conf;
     global $lang;
     global $INPUT;
 
@@ -89,15 +88,12 @@ function ajax_qsearch(){
  * @author Mike Frysinger <vapier@gentoo.org>
  */
 function ajax_suggestions() {
-    global $conf;
-    global $lang;
     global $INPUT;
 
     $query = cleanID($INPUT->post->str('q'));
     if(empty($query)) $query = cleanID($INPUT->get->str('q'));
     if(empty($query)) return;
 
-    $data = array();
     $data = ft_pageLookup($query);
     if(!count($data)) return;
     $data = array_keys($data);
@@ -214,7 +210,6 @@ function ajax_medians(){
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function ajax_medialist(){
-    global $conf;
     global $NS;
     global $INPUT;
 
@@ -234,13 +229,15 @@ function ajax_medialist(){
  * @author Kate Arzamastseva <pshns@ukr.net>
  */
 function ajax_mediadetails(){
-    global $DEL, $NS, $IMG, $AUTH, $JUMPTO, $REV, $lang, $fullscreen, $conf, $INPUT;
+    global $IMG, $JUMPTO, $REV, $fullscreen, $INPUT;
     $fullscreen = true;
     require_once(DOKU_INC.'lib/exe/mediamanager.php');
 
+    $image = '';
     if ($INPUT->has('image')) $image = cleanID($INPUT->str('image'));
     if (isset($IMG)) $image = $IMG;
     if (isset($JUMPTO)) $image = $JUMPTO;
+    $rev = false;
     if (isset($REV) && !$JUMPTO) $rev = $REV;
 
     html_msgarea();
@@ -255,6 +252,7 @@ function ajax_mediadiff(){
     global $NS;
     global $INPUT;
 
+    $image = '';
     if ($INPUT->has('image')) $image = cleanID($INPUT->str('image'));
     $NS = $INPUT->post->str('ns');
     $auth = auth_quickaclcheck("$NS:*");
@@ -264,6 +262,7 @@ function ajax_mediadiff(){
 function ajax_mediaupload(){
     global $NS, $MSG, $INPUT;
 
+    $id = '';
     if ($_FILES['qqfile']['tmp_name']) {
         $id = $INPUT->post->str('mediaid', $_FILES['qqfile']['name']);
     } elseif ($INPUT->get->has('qqfile')) {
@@ -280,44 +279,33 @@ function ajax_mediaupload(){
 
     if ($_FILES['qqfile']['error']) unset($_FILES['qqfile']);
 
+    $res = false;
     if ($_FILES['qqfile']['tmp_name']) $res = media_upload($NS, $AUTH, $_FILES['qqfile']);
     if ($INPUT->get->has('qqfile')) $res = media_upload_xhr($NS, $AUTH);
 
-    if ($res) $result = array('success' => true,
-        'link' => media_managerURL(array('ns' => $ns, 'image' => $NS.':'.$id), '&'),
-        'id' => $NS.':'.$id, 'ns' => $NS);
-
-    if (!$result) {
+    if($res) {
+        $result = array(
+            'success' => true,
+            'link' => media_managerURL(array('ns' => $ns, 'image' => $NS . ':' . $id), '&'),
+            'id' => $NS . ':' . $id,
+            'ns' => $NS
+        );
+    } else {
         $error = '';
-        if (isset($MSG)) {
-            foreach($MSG as $msg) $error .= $msg['msg'];
+        if(isset($MSG)) {
+            foreach($MSG as $msg) {
+                $error .= $msg['msg'];
+            }
         }
-        $result = array('error' => $msg['msg'], 'ns' => $NS);
+        $result = array(
+            'error' => $error,
+            'ns' => $NS
+        );
     }
     $json = new JSON;
     echo htmlspecialchars($json->encode($result), ENT_NOQUOTES);
 }
 
-function dir_delete($path) {
-    if (!is_string($path) || $path == "") return false;
-
-    if (is_dir($path) && !is_link($path)) {
-        if (!$dh = @opendir($path)) return false;
-
-        while ($f = readdir($dh)) {
-            if ($f == '..' || $f == '.') continue;
-            dir_delete("$path/$f");
-        }
-
-        closedir($dh);
-        return @rmdir($path);
-    } else {
-        return @unlink($path);
-    }
-
-    return false;
-}
-
 /**
  * Return sub index for index view
  *
@@ -359,13 +347,11 @@ function ajax_linkwiz(){
     $id = cleanID($id);
 
     $nsd  = utf8_encodeFN(str_replace(':','/',$ns));
-    $idd  = utf8_encodeFN(str_replace(':','/',$id));
 
     $data = array();
     if($q && !$ns){
 
         // use index to lookup matching pages
-        $pages = array();
         $pages = ft_pageLookup($id,true);
 
         // result contains matches in pages and namespaces
diff --git a/lib/exe/css.php b/lib/exe/css.php
index f273b7ee4cf1ebb0ada85e4622325e270d5be93d..cab7384b2c456f3eb773a9e6777d3679150ffa6a 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -70,6 +70,7 @@ function css_out(){
         $files[$mediatype] = array();
         // load core styles
         $files[$mediatype][DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/';
+
         // load jQuery-UI theme
         if ($mediatype == 'screen') {
             $files[$mediatype][DOKU_INC.'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE.'lib/scripts/jquery/jquery-ui-theme/';
diff --git a/lib/exe/js.php b/lib/exe/js.php
index 04413b40966225906bcea14a8e44c94d177d3495..8f16f4a9623294c470bf32f595c430f309ab203c 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -220,6 +220,12 @@ function js_pluginstrings() {
     return $pluginstrings;
 }
 
+/**
+ * Return an two-dimensional array with strings from the language file of current active template.
+ *
+ * - $lang['js'] must be an array.
+ * - Nothing is returned for template without an entry for $lang['js']
+ */
 function js_templatestrings() {
     global $conf;
     $templatestrings = array();
diff --git a/lib/plugins/auth.php b/lib/plugins/auth.php
index dc66d63805234b31a81fd678a794c9c872136f50..b0473563914601a864251414f0de2a7ef90f2ceb 100644
--- a/lib/plugins/auth.php
+++ b/lib/plugins/auth.php
@@ -316,11 +316,11 @@ class DokuWiki_Auth_Plugin extends DokuWiki_Plugin {
      *
      * @author  Chris Smith <chris@jalakai.co.uk>
      * @param   int   $start     index of first user to be returned
-     * @param   int   $limit     max number of users to be returned
+     * @param   int   $limit     max number of users to be returned, 0 for unlimited
      * @param   array $filter    array of field/pattern pairs, null for no filter
      * @return  array list of userinfo (refer getUserData for internal userinfo details)
      */
-    public function retrieveUsers($start = 0, $limit = -1, $filter = null) {
+    public function retrieveUsers($start = 0, $limit = 0, $filter = null) {
         msg("authorisation method does not support mass retrieval of user data", -1);
         return array();
     }
diff --git a/lib/plugins/authad/auth.php b/lib/plugins/authad/auth.php
index e1d758fb862414749f9dc29da3bc8881c5844293..a0fec7b52b890d494d8927aa58be0b3f01d84df0 100644
--- a/lib/plugins/authad/auth.php
+++ b/lib/plugins/authad/auth.php
@@ -332,11 +332,11 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
      * @param   array $filter    array of field/pattern pairs, null for no filter
      * @return  array userinfo (refer getUserData for internal userinfo details)
      */
-    public function retrieveUsers($start = 0, $limit = -1, $filter = array()) {
+    public function retrieveUsers($start = 0, $limit = 0, $filter = array()) {
         $adldap = $this->_adldap(null);
         if(!$adldap) return false;
 
-        if($this->users === null) {
+        if(!$this->users) {
             //get info for given user
             $result = $adldap->user()->all();
             if (!$result) return array();
@@ -357,7 +357,7 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
             }
             if($this->_filter($user, $info)) {
                 $result[$user] = $info;
-                if(($limit >= 0) && (++$count >= $limit)) break;
+                if(($limit > 0) && (++$count >= $limit)) break;
             }
         }
         return $result;
diff --git a/lib/plugins/authad/lang/hu/settings.php b/lib/plugins/authad/lang/hu/settings.php
index 05acbdc2daac559f7de2a696b356a48ef2e6b59c..be0592d6868ed30ffc642469ac03084922067d28 100644
--- a/lib/plugins/authad/lang/hu/settings.php
+++ b/lib/plugins/authad/lang/hu/settings.php
@@ -11,11 +11,11 @@ $lang['base_dn']               = 'Bázis DN, pl. <code>DC=my,DC=domain,DC=org</c
 $lang['domain_controllers']    = 'Tartománykezelők listája vesszővel elválasztva, pl. <code>srv1.domain.org,srv2.domain.org</code>.';
 $lang['admin_username']        = 'Privilegizált AD felhasználó, aki az összes feéhasználó adatait elérheti. Elhagyható, de bizonyos funkciókhoz, például a feliratkozási e-mailek kiküldéséhez szükséges.';
 $lang['admin_password']        = 'Ehhez tartozó jelszó.';
-$lang['sso']                   = 'Single-Sign-On Kerberos-szal vagy NTML használata?';
+$lang['sso']                   = 'Kerberos egyszeri bejelentkezés vagy NTLM használata?';
 $lang['sso_charset']           = 'A webkiszolgáló karakterkészlete megfelel a Kerberos- és NTLM-felhasználóneveknek. Üres UTF-8 és Latin-1-hez. Szükséges az iconv bővítmény.';
 $lang['real_primarygroup']     = 'A valódi elsődleges csoport feloldása a "Tartományfelhasználók" csoport használata helyett? (lassabb)';
 $lang['use_ssl']               = 'SSL használata? Ha használjuk, tiltsuk le a TLS-t!';
 $lang['use_tls']               = 'TLS használata? Ha használjuk, tiltsuk le az SSL-t!';
-$lang['debug']                 = 'Debug-üzenetek megjelenítése?';
+$lang['debug']                 = 'További hibakeresési üzenetek megjelenítése hiba esetén';
 $lang['expirywarn']            = 'Felhasználók értesítése ennyi nappal a jelszavuk lejárata előtt. 0 a funkció kikapcsolásához.';
-$lang['additional']            = 'Vesszővel elválasztott lista a további AD attribútumok lekéréshez. Néhány plugin használhatja.';
+$lang['additional']            = 'Vesszővel elválasztott lista a további AD attribútumok lekéréséhez. Néhány bővítmény használhatja.';
diff --git a/lib/plugins/authldap/auth.php b/lib/plugins/authldap/auth.php
index 94f3be8d2f3e7a025ede5d1ca63b82ca964a1c34..6c3637e157049faebbaf8a8b407630f6a8a57262 100644
--- a/lib/plugins/authldap/auth.php
+++ b/lib/plugins/authldap/auth.php
@@ -281,7 +281,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
      * @param   array $filter  array of field/pattern pairs, null for no filter
      * @return  array of userinfo (refer getUserData for internal userinfo details)
      */
-    function retrieveUsers($start = 0, $limit = -1, $filter = array()) {
+    function retrieveUsers($start = 0, $limit = 0, $filter = array()) {
         if(!$this->_openLDAP()) return false;
 
         if(is_null($this->users)) {
@@ -316,7 +316,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
             }
             if($this->_filter($user, $info)) {
                 $result[$user] = $info;
-                if(($limit >= 0) && (++$count >= $limit)) break;
+                if(($limit > 0) && (++$count >= $limit)) break;
             }
         }
         return $result;
diff --git a/lib/plugins/authldap/lang/hu/settings.php b/lib/plugins/authldap/lang/hu/settings.php
index 041f827553ccc73c9db51e92bdd6e43b0376107f..1e6608dabc9b6d4504e01a013022ad801165a90f 100644
--- a/lib/plugins/authldap/lang/hu/settings.php
+++ b/lib/plugins/authldap/lang/hu/settings.php
@@ -4,9 +4,10 @@
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * 
  * @author Marton Sebok <sebokmarton@gmail.com>
+ * @author Marina Vladi <deldadam@gmail.com>
  */
-$lang['server']                = 'LDAP-szerver. Hosztnév (<code>localhost</code>) vagy abszolút URL portszámmal (<code>ldap://server.tld:389</code>)';
-$lang['port']                  = 'LDAP-szerver port, ha nem URL lett megadva';
+$lang['server']                = 'LDAP-szerver. Kiszolgálónév (<code>localhost</code>) vagy teljes URL-cím (<code>ldap://server.tld:389</code>)';
+$lang['port']                  = 'LDAP-kiszolgáló portja, ha URL-cím nem lett megadva';
 $lang['usertree']              = 'Hol találom a felhasználókat? Pl. <code>ou=People, dc=server, dc=tld</code>';
 $lang['grouptree']             = 'Hol találom a csoportokat? Pl. <code>ou=Group, dc=server, dc=tld</code>';
 $lang['userfilter']            = 'LDAP szűrő a felhasználók kereséséhez, pl. <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
@@ -20,7 +21,7 @@ $lang['bindpw']                = 'Ehhez tartozó jelszó.';
 $lang['userscope']             = 'A keresési tartomány korlátozása erre a felhasználókra való keresésnél';
 $lang['groupscope']            = 'A keresési tartomány korlátozása erre a csoportokra való keresésnél';
 $lang['groupkey']              = 'Csoport meghatározása a következő attribútumból (az alapértelmezett AD csoporttagság helyett), pl. a szervezeti egység vagy a telefonszám';
-$lang['debug']                 = 'Debug-üzenetek megjelenítése?';
+$lang['debug']                 = 'Továbi hibakeresési információk megjelenítése hiba esetén';
 $lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
 $lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
 $lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
diff --git a/lib/plugins/authmysql/auth.php b/lib/plugins/authmysql/auth.php
index 036644a6797361e24312d5e1a403402346671121..1e6e6a4a97eb49ee1451627d6f8d0345e700ef39 100644
--- a/lib/plugins/authmysql/auth.php
+++ b/lib/plugins/authmysql/auth.php
@@ -352,13 +352,18 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin {
      * @param  array|string $filter array of field/pattern pairs
      * @return  array userinfo (refer getUserData for internal userinfo details)
      */
-    public function retrieveUsers($first = 0, $limit = 10, $filter = array()) {
+    public function retrieveUsers($first = 0, $limit = 0, $filter = array()) {
         $out = array();
 
         if($this->_openDB()) {
             $this->_lockTables("READ");
             $sql = $this->_createSQLFilter($this->getConf('getUsers'), $filter);
-            $sql .= " ".$this->getConf('SortOrder')." LIMIT $first, $limit";
+            $sql .= " ".$this->getConf('SortOrder');
+            if($limit) {
+                $sql .= " LIMIT $first, $limit";
+            } elseif($first) {
+                $sql .= " LIMIT $first";
+            }
             $result = $this->_queryDB($sql);
 
             if(!empty($result)) {
diff --git a/lib/plugins/authmysql/lang/hu/settings.php b/lib/plugins/authmysql/lang/hu/settings.php
index 5936203fa5c08a5386748ca9c547cf900d7dcbe5..cf7b26bb91c80325443cd5165a669b30ffab6e4d 100644
--- a/lib/plugins/authmysql/lang/hu/settings.php
+++ b/lib/plugins/authmysql/lang/hu/settings.php
@@ -6,8 +6,8 @@
  * @author Marton Sebok <sebokmarton@gmail.com>
  * @author Marina Vladi <deldadam@gmail.com>
  */
-$lang['server']                = 'MySQL-szerver';
-$lang['user']                  = 'MySQL felhasználónév';
+$lang['server']                = 'MySQL-kiszolgáló';
+$lang['user']                  = 'MySQL-felhasználónév';
 $lang['password']              = 'Fenti felhasználó jelszava';
 $lang['database']              = 'Adatbázis';
 $lang['charset']               = 'Az adatbázisban használt karakterkészlet';
diff --git a/lib/plugins/authpgsql/auth.php b/lib/plugins/authpgsql/auth.php
index 3f8ff3249506d3e0bc75f5076e7ad94e435a588e..e51b39858148a782e0dddc5c5f990442483b11c1 100644
--- a/lib/plugins/authpgsql/auth.php
+++ b/lib/plugins/authpgsql/auth.php
@@ -148,13 +148,15 @@ class auth_plugin_authpgsql extends auth_plugin_authmysql {
      * @param   array $filter    array of field/pattern pairs
      * @return  array userinfo (refer getUserData for internal userinfo details)
      */
-    public function retrieveUsers($first = 0, $limit = 10, $filter = array()) {
+    public function retrieveUsers($first = 0, $limit = 0, $filter = array()) {
         $out = array();
 
         if($this->_openDB()) {
             $this->_lockTables("READ");
             $sql = $this->_createSQLFilter($this->conf['getUsers'], $filter);
-            $sql .= " ".$this->conf['SortOrder']." LIMIT $limit OFFSET $first";
+            $sql .= " ".$this->conf['SortOrder'];
+            if($limit) $sql .= " LIMIT $limit";
+            if($first) $sql .= " OFFSET $first";
             $result = $this->_queryDB($sql);
 
             foreach($result as $user)
diff --git a/lib/plugins/extension/lang/de/intro_install.txt b/lib/plugins/extension/lang/de/intro_install.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4ecebe959b5473b67d25b57df4b74a4f7882f711
--- /dev/null
+++ b/lib/plugins/extension/lang/de/intro_install.txt
@@ -0,0 +1 @@
+Hier können Sie Plugins und Templates von Hand installieren indem Sie sie hochladen oder eine Download-URL angeben.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/de/intro_plugins.txt b/lib/plugins/extension/lang/de/intro_plugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1a15210501c26535c319e968a2f327bfbfb0e45b
--- /dev/null
+++ b/lib/plugins/extension/lang/de/intro_plugins.txt
@@ -0,0 +1 @@
+Dies sind die Plugins, die bereits installiert sind. Sie können sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installiereten Plugins angezeigt. Bitte lesen Sie vor einem Update die zugehörige Dokumentation.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/de/intro_search.txt b/lib/plugins/extension/lang/de/intro_search.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7df8de1851ad0f29ccc5db3a4c5e95c1740f6b36
--- /dev/null
+++ b/lib/plugins/extension/lang/de/intro_search.txt
@@ -0,0 +1 @@
+Dieser Tab gibt Ihnen Zugriff auf alle vorhandenen Plugins und Templates für DokuWiki. Bitte bedenken sie das jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Sie sollten vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/de/intro_templates.txt b/lib/plugins/extension/lang/de/intro_templates.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d71ce62373b7493f0f319890987e2cc30a641e24
--- /dev/null
+++ b/lib/plugins/extension/lang/de/intro_templates.txt
@@ -0,0 +1 @@
+Dies sind die in Ihrem Dokuwiki installierten Templates. Sie können das gewünschte Template im [[?do=admin&page=config|Konfigurations Manager]] aktivieren.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/de/lang.php b/lib/plugins/extension/lang/de/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..10d501130b7b48a0a4e635da0d185981f613a63b
--- /dev/null
+++ b/lib/plugins/extension/lang/de/lang.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author H. Richard <wanderer379@t-online.de>
+ */
+$lang['menu']                  = 'Erweiterungen verwalten';
+$lang['tab_plugins']           = 'Installierte Plugins';
+$lang['tab_templates']         = 'Installierte Templates';
+$lang['tab_search']            = 'Suchen und Installieren';
+$lang['tab_install']           = 'Händisch installieren';
+$lang['notimplemented']        = 'Dieses Fähigkeit/Eigenschaft wurde noch nicht implementiert';
+$lang['notinstalled']          = 'Diese Erweiterung ist nicht installiert';
+$lang['alreadyenabled']        = 'Diese Erweiterung ist bereits aktiviert';
+$lang['alreadydisabled']       = 'Diese Erweiterung ist bereits deaktiviert';
+$lang['pluginlistsaveerror']   = 'Es gab einen Fehler beim Speichern der Plugin-Liste';
+$lang['unknownauthor']         = 'Unbekannter Autor';
+$lang['unknownversion']        = 'Unbekannte Version';
+$lang['btn_info']              = 'Zeige weitere Info';
+$lang['btn_update']            = 'Update';
+$lang['btn_uninstall']         = 'Deinstallation';
+$lang['btn_enable']            = 'Aktivieren';
+$lang['btn_disable']           = 'Deaktivieren';
+$lang['btn_install']           = 'Installieren';
+$lang['btn_reinstall']         = 'Neu installieren';
+$lang['js']['reallydel']       = 'Wollen Sie diese Erweiterung wirklich löschen?';
+$lang['search_for']            = 'Erweiterung suchen:';
+$lang['search']                = 'Suchen';
+$lang['extensionby']           = '<strong>%s</strong> von %s';
+$lang['screenshot']            = 'Bildschirmfoto von %s';
+$lang['popularity']            = 'Popularität: %s%%';
+$lang['homepage_link']         = 'Doku';
+$lang['bugs_features']         = 'Bugs';
+$lang['tags']                  = 'Schlagworte';
+$lang['author_hint']           = 'Suche weitere Erweiterungen dieses Autors';
+$lang['installed']             = 'Installiert:';
+$lang['downloadurl']           = 'URL zum Herunterladen';
+$lang['unknown']               = '<em>unbekannt</em>';
+$lang['installed_version']     = 'Installierte Version';
+$lang['install_date']          = 'Ihr letztes Update:';
+$lang['available_version']     = 'Verfügbare Version: ';
+$lang['compatible']            = 'Kompatibel mit:';
+$lang['depends']               = 'Benötigt:';
+$lang['similar']               = 'Ist ähnlich zu:';
+$lang['conflicts']             = 'Nicht kompatibel mit:';
+$lang['donate']                = 'Nützlich?';
+$lang['donate_action']         = 'Spendieren Sie dem Autor einen Kaffee!';
+$lang['repo_retry']            = 'Neu versuchen';
+$lang['provides']              = 'Enthält';
+$lang['status']                = 'Status';
+$lang['status_installed']      = 'installiert';
+$lang['status_not_installed']  = 'nicht installiert';
+$lang['status_protected']      = 'geschützt';
+$lang['status_enabled']        = 'aktiviert';
+$lang['status_disabled']       = 'deaktiviert';
+$lang['status_unmodifiable']   = 'unveränderlich';
+$lang['status_plugin']         = 'Plugin';
+$lang['status_template']       = 'Template';
+$lang['msg_enabled']           = 'Plugin %s ist aktiviert';
+$lang['msg_disabled']          = 'Erweiterung %s ist deaktiviert';
+$lang['msg_delete_success']    = 'Erweiterung wurde entfernt';
+$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';
+$lang['msg_plugin_update_success'] = 'Das Update des Plugins %s war erfolgreich';
+$lang['msg_upload_failed']     = 'Fehler beim Hochladen der Datei';
+$lang['missing_dependency']    = '<strong>fehlende oder deaktivierte Abhängigkeit:<strong>%s';
+$lang['noperms']               = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt';
+$lang['notplperms']            = 'Das Template-Verzeichnis ist schreibgeschützt';
+$lang['nopluginperms']         = 'Das Plugin-Verzeichnis ist schreibgeschützt';
+$lang['install_url']           = 'Von Webadresse (URL) installieren';
+$lang['install_upload']        = 'Erweiterung hochladen:';
diff --git a/lib/plugins/extension/lang/eo/intro_install.txt b/lib/plugins/extension/lang/eo/intro_install.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d9c63da1dbfd0be991892bc9bdaf6e0f33de5985
--- /dev/null
+++ b/lib/plugins/extension/lang/eo/intro_install.txt
@@ -0,0 +1 @@
+Tie vi povas permane instali kromaĵojn kaj ŝablonojn tra alŝuto aŭ indiko de URL por rekta elŝuto.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/eo/intro_plugins.txt b/lib/plugins/extension/lang/eo/intro_plugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cc7ae6628b09d8fd815c3d51483e6c4b3be2950c
--- /dev/null
+++ b/lib/plugins/extension/lang/eo/intro_plugins.txt
@@ -0,0 +1 @@
+Jenaj kromaĵoj momente estas instalitaj en via DokuWiki. Vi povas ebligi, malebligi aŭ eĉ tute malinstali ilin tie. Ankaŭ montriĝos aktualigoj de kromaĵoj -- certiĝu, ke vi legis la dokumentadon de la kromaĵo antaŭ aktualigo.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/eo/intro_search.txt b/lib/plugins/extension/lang/eo/intro_search.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5d194948c0ba7a69653fe05fa559e19aadc6d95a
--- /dev/null
+++ b/lib/plugins/extension/lang/eo/intro_search.txt
@@ -0,0 +1 @@
+Tiu tabelo donas aliron al ĉiuj haveblaj eksteraj kromaĵoj kaj ŝablonoj por DokuWiki. Bonvolu konscii, ke instali eksteran kodaĵon povas enkonduki **sekurecriskon**, prefere legu antaŭe pri [[doku>security#plugin_security|sekureco de kromaĵo]].
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/eo/intro_templates.txt b/lib/plugins/extension/lang/eo/intro_templates.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6dc0ef6710bd47db7306072d1599f7e2b986d86e
--- /dev/null
+++ b/lib/plugins/extension/lang/eo/intro_templates.txt
@@ -0,0 +1 @@
+Jenaj ŝablonoj momente instaliĝis en via DokuWiki. Elektu la ŝablonon por uzi en la [[?do=admin&page=config|Opcia administrilo]].
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/eo/lang.php b/lib/plugins/extension/lang/eo/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ce840be8bdce2b9f748b84b3ebc916b1f899772
--- /dev/null
+++ b/lib/plugins/extension/lang/eo/lang.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Robert Bogenschneider <bogi@uea.org>
+ */
+$lang['menu']                  = 'Aldonaĵa administrado';
+$lang['tab_plugins']           = 'Instalitaj kromaĵoj';
+$lang['tab_templates']         = 'Instalitaj ŝablonoj';
+$lang['tab_search']            = 'Serĉi kaj instali';
+$lang['tab_install']           = 'Permana instalado';
+$lang['notimplemented']        = 'Tiu funkcio ankoraŭ ne realiĝis';
+$lang['notinstalled']          = 'Tiu aldonaĵo ne estas instalita';
+$lang['alreadyenabled']        = 'Tiu aldonaĵo jam ebliĝis';
+$lang['alreadydisabled']       = 'Tiu aldonaĵo jam malebliĝis';
+$lang['pluginlistsaveerror']   = 'Okazis eraro dum la kromaĵlisto konserviĝis';
+$lang['unknownauthor']         = 'Nekonata aÅ­toro';
+$lang['unknownversion']        = 'Nekonata versio';
+$lang['btn_info']              = 'Montri pliajn informojn';
+$lang['btn_update']            = 'Aktualigi';
+$lang['btn_uninstall']         = 'Malinstali';
+$lang['btn_enable']            = 'Ebligi';
+$lang['btn_disable']           = 'Malebligi';
+$lang['btn_install']           = 'Instali';
+$lang['btn_reinstall']         = 'Re-instali';
+$lang['js']['reallydel']       = 'Ĉu vere malinstali la aldonaĵon?';
+$lang['search_for']            = 'Serĉi la aldonaĵon:';
+$lang['search']                = 'Serĉi';
+$lang['extensionby']           = '<strong>%s</strong> fare de %s';
+$lang['screenshot']            = 'Ekrankopio de %s';
+$lang['popularity']            = 'Populareco: %s%%';
+$lang['homepage_link']         = 'Dokumentoj';
+$lang['bugs_features']         = 'Cimoj';
+$lang['tags']                  = 'Etikedoj:';
+$lang['author_hint']           = 'Serĉi aldonaĵojn laŭ tiu aŭtoro:';
+$lang['installed']             = 'Instalitaj:';
+$lang['downloadurl']           = 'URL por elŝuti:';
+$lang['repository']            = 'Kodbranĉo:';
+$lang['unknown']               = '<em>nekonata</em>';
+$lang['installed_version']     = 'Instalita versio:';
+$lang['install_date']          = 'Via lasta aktualigo:';
+$lang['available_version']     = 'Havebla versio:';
+$lang['compatible']            = 'Kompatibla kun:';
+$lang['depends']               = 'Dependas de:';
+$lang['similar']               = 'Simila al:';
+$lang['conflicts']             = 'Konfliktas kun:';
+$lang['donate']                = 'Ĉu vi ŝatas tion?';
+$lang['donate_action']         = 'Aĉetu kafon al la aŭtoro!';
+$lang['repo_retry']            = 'Reprovi';
+$lang['provides']              = 'Provizas per:';
+$lang['status']                = 'Statuso:';
+$lang['status_installed']      = 'instalita';
+$lang['status_not_installed']  = 'ne instalita';
+$lang['status_protected']      = 'protektita';
+$lang['status_enabled']        = 'ebligita';
+$lang['status_disabled']       = 'malebligita';
+$lang['status_unmodifiable']   = 'neŝanĝebla';
+$lang['status_plugin']         = 'kromaĵo';
+$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_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';
+$lang['msg_plugin_update_success'] = 'Kromaĵo %s sukcese aktualiĝis';
+$lang['msg_upload_failed']     = 'Ne eblis alŝuti la dosieron';
+$lang['missing_dependency']    = '<strong>Mankanta aÅ­ malebligita dependeco:</strong> %s';
+$lang['security_issue']        = '<strong>Sekureca problemo:</strong> %s';
+$lang['security_warning']      = '<strong>Sekureca averto:</strong> %s';
+$lang['update_available']      = '<strong>Aktualigo:</strong> Nova versio %s haveblas.';
+$lang['wrong_folder']          = '<strong>Kromaĵo instalita malĝuste:</strong> Renomu la kromaĵdosierujon "%s" al "%s".';
+$lang['url_change']            = '<strong>URL ŝanĝita:</strong> La elŝuta URL ŝanĝiĝis ekde la lasta elŝuto. Kontrolu, ĉu la nova URL validas antaŭ aktualigi aldonaĵon.<br />Nova: %s<br />Malnova: %s';
+$lang['error_badurl']          = 'URLoj komenciĝu per http aŭ https';
+$lang['error_dircreate']       = 'Ne eblis krei portempan dosierujon por akcepti la elŝuton';
+$lang['error_download']        = 'Ne eblis elŝuti la dosieron: %s';
+$lang['error_decompress']      = 'Ne eblis malpaki la elŝutitan dosieron. Kialo povus esti fuŝa elŝuto, kaj vi reprovu; aŭ la pakiga formato estas nekonata, kaj vi devas elŝuti kaj instali permane.';
+$lang['error_findfolder']      = 'Ne eblis rekoni la aldonaĵ-dosierujon, vi devas elŝuti kaj instali permane';
+$lang['error_copy']            = 'Okazis kopiad-eraro dum la provo instali dosierojn por la dosierujo <em>%s</em>: la disko povus esti plena aŭ la alirpermesoj por dosieroj malĝustaj. Rezulto eble estas nur parte instalita kromaĵo, kiu malstabiligas vian vikion';
+$lang['noperms']               = 'La aldonaĵ-dosierujo ne estas skribebla';
+$lang['notplperms']            = 'La ŝablon-dosierujo ne estas skribebla';
+$lang['nopluginperms']         = 'La kromaĵ-dosierujo ne estas skribebla';
+$lang['git']                   = 'Tiu aldonaĵo estis instalita pere de git, eble vi ne aktualigu ĝin ĉi tie.';
+$lang['install_url']           = 'Instali de URL:';
+$lang['install_upload']        = 'Alŝuti aldonaĵon:';
diff --git a/lib/plugins/extension/lang/fr/intro_install.txt b/lib/plugins/extension/lang/fr/intro_install.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6f68a260628622a0c28c2b8c87eaefd578b71ac7
--- /dev/null
+++ b/lib/plugins/extension/lang/fr/intro_install.txt
@@ -0,0 +1 @@
+Ici, vous pouvez installer des extensions, greffons et modèles. Soit en les téléversant, soit en indiquant un URL de téléchargement.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/fr/intro_plugins.txt b/lib/plugins/extension/lang/fr/intro_plugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a40b863d2a70ac4efa358a5250c4da37c71322f1
--- /dev/null
+++ b/lib/plugins/extension/lang/fr/intro_plugins.txt
@@ -0,0 +1 @@
+Voilà la liste des extensions actuellement installées. À partir d'ici, vous pouvez les activer, les désactiver ou même les désinstaller complètement. Cette page affiche également les mises à jour. Assurez vous de lire la documentation avant de faire la mise à jour.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/fr/intro_search.txt b/lib/plugins/extension/lang/fr/intro_search.txt
new file mode 100644
index 0000000000000000000000000000000000000000..418e359725878ea926693a3fbd9e953cd90e5348
--- /dev/null
+++ b/lib/plugins/extension/lang/fr/intro_search.txt
@@ -0,0 +1 @@
+Cet onglet vous donne accès à toutes les extensions de tierces parties. Restez conscients qu'installer du code de tierce partie peut poser un problème de **sécurité**.  Vous voudrez peut-être au préalable lire l'article sur la [[doku>fr:security##securite_des_plugins|sécurité des plugins]].
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/fr/intro_templates.txt b/lib/plugins/extension/lang/fr/intro_templates.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fefdb5538ea03be115abbcfee9b673ebd7392af3
--- /dev/null
+++ b/lib/plugins/extension/lang/fr/intro_templates.txt
@@ -0,0 +1 @@
+Voici la liste des modèles actuellement installés. Le [[?do=admin&page=config|gestionnaire de configuration]] vous permet de choisir le modèle à utiliser.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/fr/lang.php b/lib/plugins/extension/lang/fr/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2dae0fc9f2e2082cfd6ac35af36ad16a6418d07
--- /dev/null
+++ b/lib/plugins/extension/lang/fr/lang.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Schplurtz le Déboulonné <schplurtz@laposte.net>
+ */
+$lang['menu']                  = 'Gestionnaire d\'extension';
+$lang['tab_plugins']           = 'Greffons installés';
+$lang['tab_templates']         = 'Modèles installés';
+$lang['tab_search']            = 'Rechercher et installer';
+$lang['tab_install']           = 'Installation manuelle';
+$lang['notimplemented']        = 'Cette fonctionnalité n\'est pas encore installée';
+$lang['notinstalled']          = 'Cette extension n\'est pas installée';
+$lang['alreadyenabled']        = 'Cette extension a déjà été installée';
+$lang['alreadydisabled']       = 'Cette extension a déjà été désactivée';
+$lang['pluginlistsaveerror']   = 'Une erreur s\'est produite lors de l\'enregistrement de la liste des greffons.';
+$lang['unknownauthor']         = 'Auteur inconnu';
+$lang['unknownversion']        = 'Version inconnue';
+$lang['btn_info']              = 'Montrer plus d\'informations';
+$lang['btn_update']            = 'Mettre à jour';
+$lang['btn_uninstall']         = 'Désinstaller';
+$lang['btn_enable']            = 'Activer';
+$lang['btn_disable']           = 'Désactiver';
+$lang['btn_install']           = 'Installer';
+$lang['btn_reinstall']         = 'Réinstaller';
+$lang['js']['reallydel']       = 'Vraiment désinstaller cette extension';
+$lang['search_for']            = 'Rechercher l\'extension :';
+$lang['search']                = 'Chercher';
+$lang['extensionby']           = '<strong>%s</strong> de %s';
+$lang['screenshot']            = 'Aperçu de %s';
+$lang['popularity']            = 'Popularité : %s%%';
+$lang['homepage_link']         = 'Documents';
+$lang['bugs_features']         = 'Bugs';
+$lang['tags']                  = 'Étiquettes :';
+$lang['author_hint']           = 'Chercher les extensions de cet auteur';
+$lang['installed']             = 'Installés :';
+$lang['downloadurl']           = 'URL de téléchargement :';
+$lang['repository']            = 'Entrepôt : ';
+$lang['unknown']               = '<em>inconnu</em>';
+$lang['installed_version']     = 'Version installée :';
+$lang['install_date']          = 'Votre dernière mise à jour :';
+$lang['available_version']     = 'Version disponible :';
+$lang['compatible']            = 'Compatible avec :';
+$lang['depends']               = 'Dépend de :';
+$lang['similar']               = 'Similaire à :';
+$lang['conflicts']             = 'En conflit avec :';
+$lang['donate']                = 'Vous aimez ?';
+$lang['donate_action']         = 'Payer un café à l\'auteur !';
+$lang['repo_retry']            = 'Réessayer';
+$lang['provides']              = 'Fournit :';
+$lang['status']                = 'État :';
+$lang['status_installed']      = 'installé';
+$lang['status_not_installed']  = 'non installé';
+$lang['status_protected']      = 'protégé';
+$lang['status_enabled']        = 'activé';
+$lang['status_disabled']       = 'désactivé';
+$lang['status_unmodifiable']   = 'non modifiable';
+$lang['status_plugin']         = 'greffon';
+$lang['status_template']       = 'modèle';
+$lang['status_bundled']        = 'fourni';
+$lang['msg_enabled']           = 'Greffon %s activé';
+$lang['msg_disabled']          = 'Greffon %s désactivé';
+$lang['msg_delete_success']    = 'Extension désinstallée';
+$lang['msg_template_install_success'] = 'Modèle %s installée avec succès';
+$lang['msg_template_update_success'] = 'Modèle %s mis à jour avec succès';
+$lang['msg_plugin_install_success'] = 'Greffon %s installé avec succès';
+$lang['msg_plugin_update_success'] = 'Greffon %s mis à jour avec succès';
+$lang['msg_upload_failed']     = 'Téléversement échoué';
+$lang['missing_dependency']    = '<strong>Dépendance absente ou désactivée :</strong> %s';
+$lang['security_issue']        = '<strong>Problème de sécurité :</strong> %s';
+$lang['security_warning']      = '<strong>Avertissement deSécurité :</strong> %s';
+$lang['update_available']      = '<strong>Mise à jour :</strong> La version %s est disponible.';
+$lang['wrong_folder']          = '<strong>Greffon installé incorrectement :</strong> Renomer le dossier du greffon "%s" en "%s".';
+$lang['url_change']            = '<strong>URL modifié :</strong> L\'URL de téléchargement a changé depuis le dernier téléchargement. Vérifiez si l\'URL est valide avant de mettre à jour l\'extension.<br />Nouvel URL : %s<br />Ancien : %s';
+$lang['error_badurl']          = 'Les URL doivent commencer par http ou https';
+$lang['error_dircreate']       = 'Impossible de créer le dossier temporaire pour le téléchargement.';
+$lang['error_download']        = 'Impossible de télécharger le fichier : %s';
+$lang['error_decompress']      = 'Impossible de décompresser le fichier téléchargé. C\'est peut être le résultat d\'une erreur de téléchargement, auquel cas vous devriez réessayer. Le format de compression est peut-être inconnu. Dans ce cas il vous faudra procéder à une installation manuelle.';
+$lang['error_findfolder']      = 'Impossible d\'idnetifier le dossier de l\'extension. vous devez procéder à une installation manuelle.';
+$lang['error_copy']            = 'Une erreur de copie de fichier s\'est produite lors de l\'installation des fichiers dans le dossier <em>%s</em>. Il se peut que le disque soit plein, ou que les permissions d\'accès aux fichiers soient incorrectes. Il est possible que le greffon soit partiellement installé et que cela laisse votre installation de DoluWiki instable.';
+$lang['noperms']               = 'Impossible d\'écrire dans le dossier des extensions.';
+$lang['notplperms']            = 'Impossible d\'écrire dans le dossier des modèles.';
+$lang['nopluginperms']         = 'Impossible d\'écrire dans le dossier des greffons.';
+$lang['git']                   = 'Cette extension a été installé via git, vous voudrez peut-être ne pas la mettre à jour ici.';
+$lang['install_url']           = 'Installez depuis l\'URL :';
+$lang['install_upload']        = 'Téléversez l\'extension :';
diff --git a/lib/plugins/extension/lang/ja/intro_install.txt b/lib/plugins/extension/lang/ja/intro_install.txt
new file mode 100644
index 0000000000000000000000000000000000000000..889ed68799cf34679702306e34ad8cdaa61690ec
--- /dev/null
+++ b/lib/plugins/extension/lang/ja/intro_install.txt
@@ -0,0 +1 @@
+ここでは、アップロードするかダウンロードURLを指定して、手動でプラグインやテンプレートをインストールできます。
diff --git a/lib/plugins/extension/lang/ja/intro_plugins.txt b/lib/plugins/extension/lang/ja/intro_plugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9bfc684319a4739092bc0c4ea7f674b3ca159ad7
--- /dev/null
+++ b/lib/plugins/extension/lang/ja/intro_plugins.txt
@@ -0,0 +1 @@
+このDokuWikiに現在インストールされているプラグインです。ここでは、これらプラグインを有効化、無効化、アンインストールすることができます。同様にプラグインのアップデートも表示されます。アップデート前に、プラグインのマニュアルをお読みください。
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/ja/intro_search.txt b/lib/plugins/extension/lang/ja/intro_search.txt
new file mode 100644
index 0000000000000000000000000000000000000000..66d977b1b8d14a6670454856ff93f712642aa2dd
--- /dev/null
+++ b/lib/plugins/extension/lang/ja/intro_search.txt
@@ -0,0 +1 @@
+このタブでは、DokuWiki用の利用可能なすべてのサードパーティのプラグインとテンプレートにアクセスできます。サードパーティ製のコードには、**セキュリティ上のリスク**の可能性があることに注意してください、最初に[[doku>ja:security#プラグインのセキュリティ|プラグインのセキュリティ]]を読むことをお勧めします。
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/ja/intro_templates.txt b/lib/plugins/extension/lang/ja/intro_templates.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f97694aaaa04cbba96613d42e7f2f1da5c9981e3
--- /dev/null
+++ b/lib/plugins/extension/lang/ja/intro_templates.txt
@@ -0,0 +1 @@
+このDokuWikiに現在インストールされているテンプレートです。[[?do=admin&page=config|設定管理]]で使用するテンプレートを選択できます。
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/ja/lang.php b/lib/plugins/extension/lang/ja/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..0401d7630a80dc1af254aacef989cc703cc46752
--- /dev/null
+++ b/lib/plugins/extension/lang/ja/lang.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Hideaki SAWADA <chuno@live.jp>
+ */
+$lang['menu']                  = '拡張機能管理';
+$lang['tab_plugins']           = 'インストール済プラグイン';
+$lang['tab_templates']         = 'インストール済テンプレート';
+$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['downloadurl']           = 'ダウンロード URL:';
+$lang['repository']            = 'リポジトリ:';
+$lang['depends']               = '依存:';
+$lang['similar']               = '類似:';
+$lang['status_installed']      = 'インストール済';
+$lang['status_not_installed']  = '未インストール';
+$lang['status_enabled']        = '有効';
+$lang['status_disabled']       = '無効';
+$lang['status_plugin']         = 'プラグイン';
+$lang['status_template']       = 'テンプレート';
+$lang['status_bundled']        = '同梱';
+$lang['msg_enabled']           = '%s プラグインを有効化しました。';
+$lang['msg_disabled']          = '%s プラグインを無効化しました。';
+$lang['msg_delete_success']    = '拡張機能をアンインストールしました。';
+$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['security_issue']        = '<strong>セキュリティ問題:</strong> %s';
+$lang['security_warning']      = '<strong>セキュリティ警告:</strong> %s';
+$lang['update_available']      = '<strong>アップデート:</strong>%sの新バージョンが利用可能です。 ';
+$lang['error_badurl']          = 'URLはhttpかhttpsで始まる必要があります。';
+$lang['error_dircreate']       = 'ダウンロード用の一時フォルダが作成できません。';
+$lang['error_download']        = 'ファイルをダウンロードできません:%s';
+$lang['noperms']               = '拡張機能ディレクトリが書き込み不可です。';
+$lang['notplperms']            = 'テンプレートディレクトリが書き込み不可です。';
+$lang['nopluginperms']         = 'プラグインディレクトリが書き込み不可です。';
diff --git a/lib/plugins/extension/lang/nl/intro_install.txt b/lib/plugins/extension/lang/nl/intro_install.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6a0b41055fc234c26bf8abd40eee66f990f97d97
--- /dev/null
+++ b/lib/plugins/extension/lang/nl/intro_install.txt
@@ -0,0 +1 @@
+Hier kunt u handmatig plugins en templates installeren door deze te uploaden of door een directe download URL op te geven.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/nl/intro_plugins.txt b/lib/plugins/extension/lang/nl/intro_plugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0077aca30be1c895ca0b9f520bd38984a927a3c6
--- /dev/null
+++ b/lib/plugins/extension/lang/nl/intro_plugins.txt
@@ -0,0 +1 @@
+Dit zijn de momenteel in uw Dokuwiki geïnstalleerde plugins. U kunt deze hier aan of uitschakelen danwel geheel deïnstalleren. Plugin updates zijn hier ook opgenomen, lees de pluin documentatie voordat u update.
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/nl/intro_search.txt b/lib/plugins/extension/lang/nl/intro_search.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8fc3900adefae817201993568db03627e722baed
--- /dev/null
+++ b/lib/plugins/extension/lang/nl/intro_search.txt
@@ -0,0 +1 @@
+Deze tab verschaft u toegang tot alle plugins en templates vervaardigd door derden en bestemd voor Dokuwiki. Houdt er rekening meel dat indien u Plugins van derden installeerd deze een **veiligheids risico ** kunnen bevatten, geadviseerd wordt om eerst te lezen [[doku>security#plugin_security|plugin security]].
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/nl/intro_templates.txt b/lib/plugins/extension/lang/nl/intro_templates.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5ef23dadf1dc43dfcfaa4fa84790dc5ae1b2175c
--- /dev/null
+++ b/lib/plugins/extension/lang/nl/intro_templates.txt
@@ -0,0 +1 @@
+Deze templates zijn thans in DokuWiki geïnstalleerd. U kent een template selecteren middels [[?do=admin&page=config|Configuration Manager]] .
\ No newline at end of file
diff --git a/lib/plugins/extension/lang/nl/lang.php b/lib/plugins/extension/lang/nl/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..783168c2e620adcf49e6d42f13e002ecb6afeefb
--- /dev/null
+++ b/lib/plugins/extension/lang/nl/lang.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Rene <wllywlnt@yahoo.com>
+ */
+$lang['menu']                  = 'Extension Manager (Uitbreidings Beheerder)';
+$lang['tab_plugins']           = 'Geïnstalleerde Plugins';
+$lang['tab_templates']         = 'Geïnstalleerde Templates';
+$lang['tab_search']            = 'Zoek en installeer';
+$lang['tab_install']           = 'Handmatige installatie';
+$lang['notimplemented']        = 'Deze toepassing is nog niet geïnstalleerd';
+$lang['notinstalled']          = 'Deze uitbreiding is nog niet geïnstalleerd';
+$lang['alreadyenabled']        = 'Deze uitbreiding is reeds ingeschakeld';
+$lang['alreadydisabled']       = 'Deze uitbreiding is reeds uitgeschakeld';
+$lang['pluginlistsaveerror']   = 'Fout bij het opslaan van de plugin lijst';
+$lang['unknownauthor']         = 'Onbekende auteur';
+$lang['unknownversion']        = 'Onbekende versie';
+$lang['btn_info']              = 'Toon meer informatie';
+$lang['btn_update']            = 'Update';
+$lang['btn_uninstall']         = 'Deinstalleer';
+$lang['btn_enable']            = 'Schakel aan';
+$lang['btn_disable']           = 'Schakel uit';
+$lang['btn_install']           = 'Installeer';
+$lang['btn_reinstall']         = 'Her-installeer';
+$lang['js']['reallydel']       = 'Wilt u deze uitbreiding deinstalleren ?';
+$lang['search_for']            = 'Zoek Uitbreiding:';
+$lang['search']                = 'Zoek';
+$lang['extensionby']           = '<strong>%s</strong> by %s';
+$lang['screenshot']            = 'Schermafdruk bij %s';
+$lang['popularity']            = 'Populariteit:%s%%';
+$lang['homepage_link']         = 'Dokumenten';
+$lang['msg_delete_success']    = 'Uitbreiding gedeinstalleerd';
+$lang['msg_template_install_success'] = 'Template %s werd succesvol geïnstalleerd';
+$lang['msg_template_update_success'] = 'Template %s werd succesvol ge-update';
+$lang['msg_plugin_install_success'] = 'Plugin %s werd succesvol geïnstalleerd';
+$lang['msg_plugin_update_success'] = 'Plugin %s werd succesvol ge-update';
+$lang['msg_upload_failed']     = 'Uploaden van het bestand is mislukt';
+$lang['missing_dependency']    = '<strong>niet aanwezige of uitgeschakelde afhankelijkheid</strong> %s';
+$lang['security_issue']        = '<strong>Veiligheids kwestie:</strong> %s';
+$lang['security_warning']      = '<strong>Veiligheids Waarschuwing</strong> %s';
+$lang['update_available']      = '<strong>Update:</strong> Nieuwe versie %s is beschikbaar.';
+$lang['wrong_folder']          = '<strong>Plugin onjuist geïnstalleerd:</strong> Hernoem de plugin directory van "%s" naar"%s"';
+$lang['url_change']            = '<strong>URL gewijzigd:</strong> Download URL is gewijzigd sinds de laatste download. Controleer of de nieuwe URL juist is voordat u de uitbreiding update. <br />Nieuw:%s<Br /> Vorig: %s';
+$lang['error_badurl']          = 'URLs moeten beginnen met http of https';
+$lang['error_dircreate']       = 'De tijdelijke map kon niet worden gemaakt om de download te ontvangen';
+$lang['error_download']        = 'Het is niet mogelijk het bestand te downloaden: %s';
+$lang['error_decompress']      = 'Onmogelijk om het gedownloade bestand uit te pakken. Dit is wellicht het gevolg van een onvolledige/onjuiste download, in welk geval u het nog eens moet proberen; of het compressie formaat is onbekend in welk geval u het bestand handmatig moet downloaden en installeren.';
+$lang['error_findfolder']      = 'Onmogelijk om de uitbreidings directory te vinden, u moet het zelf downloaden en installeren';
+$lang['error_copy']            = 'Er was een bestand kopieer fout tijdens het installeren van bestanden in directory <em>%s</em>: de schijf kan vol zijn of de bestand toegangs rechten kunnen onjuist zijn. Dit kan tot gevolg hebben dat de plugin slechts gedeeltelijk werd geïnstalleerd waardoor uw wiki installatie onstabiel is ';
+$lang['noperms']               = 'Uitbreidings directory is niet schrijfbaar';
+$lang['notplperms']            = 'Template directory is niet schrijfbaar';
+$lang['nopluginperms']         = 'Plugin directory is niet schrijfbaar';
+$lang['git']                   = 'De uitbreiding werd geïnstalleerd via git, u wilt deze hier wellicht niet aanpassen.';
+$lang['install_url']           = 'Installeer vanaf URL:';
+$lang['install_upload']        = 'Upload Uitbreiding:';
+$lang['bugs_features']         = 'Bugs';
+$lang['tags']                  = 'Tags:';
+$lang['author_hint']           = 'Zoek uitbreidingen van deze auteur:';
+$lang['installed']             = 'Geinstalleerd:';
+$lang['downloadurl']           = 'Download URL:';
+$lang['repository']            = 'Repository ( centrale opslag)';
+$lang['unknown']               = '<em>onbekend</em>';
+$lang['installed_version']     = 'Geïnstalleerde versie';
+$lang['install_date']          = 'Uw laatste update :';
+$lang['available_version']     = 'Beschikbare versie:';
+$lang['compatible']            = 'Compatible met :';
+$lang['depends']               = 'Afhankelijk van :';
+$lang['similar']               = 'Soortgelijk :';
+$lang['conflicts']             = 'Conflicteerd met :';
+$lang['donate']                = 'Vindt u dit leuk ?';
+$lang['donate_action']         = 'Koop een kop koffie voor de auteur!';
+$lang['repo_retry']            = 'Herhaal';
+$lang['provides']              = 'Zorgt voor:';
+$lang['status']                = 'Status:';
+$lang['status_installed']      = 'Geïnstalleerd';
+$lang['status_not_installed']  = 'niet geïnstalleerd ';
+$lang['status_protected']      = 'beschermd';
+$lang['status_enabled']        = 'ingeschakeld';
+$lang['status_disabled']       = 'uitgeschakeld';
+$lang['status_unmodifiable']   = 'Niet wijzigbaar';
+$lang['status_plugin']         = 'plugin';
+$lang['status_template']       = 'template';
+$lang['status_bundled']        = 'Gebundeld';
+$lang['msg_enabled']           = 'Plugin %s ingeschakeld';
+$lang['msg_disabled']          = 'Plugin %s uitgeschakeld';
diff --git a/lib/plugins/extension/lang/sk/lang.php b/lib/plugins/extension/lang/sk/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..d00c2e32bac63ac73a4827d2392fc1d0aa09dff4
--- /dev/null
+++ b/lib/plugins/extension/lang/sk/lang.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Martin Michalek <michalek.dev@gmail.com>
+ */
+$lang['tab_plugins']           = 'Inštalované pluginy';
+$lang['tab_templates']         = 'Inštalované šablóny';
+$lang['tab_search']            = 'Hľadanie e inštalácia';
+$lang['tab_install']           = 'Manuálna inštalácia';
+$lang['notimplemented']        = 'Táto vlastnosť ešte nebola implementovaná';
+$lang['unknownauthor']         = 'Neznámy autor';
+$lang['unknownversion']        = 'Neznáma verzia';
+$lang['btn_info']              = 'Viac informácií';
+$lang['btn_update']            = 'Aktualizácia';
+$lang['btn_uninstall']         = 'Odinštalovanie';
+$lang['btn_enable']            = 'Povolenie';
+$lang['btn_disable']           = 'Zablokovanie';
+$lang['btn_install']           = 'Inštalácia';
+$lang['btn_reinstall']         = 'Re-Inštalácia';
+$lang['search']                = 'Vyhľadávanie';
+$lang['extensionby']           = '<strong>%s</strong> od %s';
+$lang['screenshot']            = 'Obrázok od %s';
+$lang['popularity']            = 'Popularita: %s%%';
+$lang['homepage_link']         = 'Dokumentácia';
+$lang['bugs_features']         = 'Chyby:';
+$lang['tags']                  = 'Kľúčové slová:';
+$lang['unknown']               = '<em>neznámy</em>';
+$lang['installed_version']     = 'Inštalovaná verzia:';
+$lang['install_date']          = 'Posledná aktualizácia:';
+$lang['available_version']     = 'Dostupné verzie:';
+$lang['compatible']            = 'Kompaktibilita:';
+$lang['similar']               = 'Podobné:';
+$lang['conflicts']             = 'V konflikte:';
+$lang['status_installed']      = 'inštalovaný';
+$lang['status_not_installed']  = 'neinštalovaný';
+$lang['status_protected']      = 'chránený';
+$lang['status_enabled']        = 'povolený';
+$lang['status_disabled']       = 'nepovolený';
+$lang['status_plugin']         = 'plugin';
+$lang['status_template']       = 'šablóna';
+$lang['msg_enabled']           = 'Plugin %s povolený';
+$lang['msg_disabled']          = 'Plugin %s nepovolený';
+$lang['msg_template_install_success'] = 'Šablóna %s úspešne nainštalovaná';
+$lang['msg_template_update_success'] = 'Šablóna %s úspešne aktualizovaná';
+$lang['msg_plugin_install_success'] = 'Plugin %s úspešne nainštalovaný';
+$lang['msg_plugin_update_success'] = 'Plugin %s úspešne aktualizovaný';
+$lang['msg_upload_failed']     = 'Nahrávanie súboru zlyhalo';
+$lang['update_available']      = '<strong>Aktualizácia:</strong> Nová verzia %s.';
+$lang['wrong_folder']          = '<strong>Plugin nesprávne nainštalovaný:</strong> Premenujte adresár s pluginom "%s" na "%s".';
+$lang['error_badurl']          = 'URL by mali mať na začiatku http alebo https';
+$lang['error_dircreate']       = 'Nie je možné vytvoriť dočasný adresár pre uloženie sťahovaného súboru';
+$lang['error_download']        = 'Nie je možné stiahnuť súbor: %s';
+$lang['error_decompress']      = 'Nie je možné dekomprimovať stiahnutý súbor. Môže to byť dôvodom chyby sťahovania (v tom prípade to skúste znova) alebo neznámym kompresným formátom (v tom prípade musíte stiahnuť a inštalovať manuálne).';
+$lang['error_copy']            = 'Chyba kopírovania pri inštalácii do adresára <em>%s</em>: disk môže byť plný alebo nemáte potrebné prístupové oprávnenie. Dôsledkom može byť čiastočne inštalovaný plugin a nestabilná wiki inštalácia.';
+$lang['nopluginperms']         = 'Adresár s pluginom nie je zapisovateľný.';
+$lang['install_url']           = 'Inštalácia z URL:';
diff --git a/lib/plugins/plugin/lang/cs/admin_plugin.txt b/lib/plugins/plugin/lang/cs/admin_plugin.txt
deleted file mode 100644
index 6ebf1e78feccc733be95b4db7edf4b484ec54de3..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/cs/admin_plugin.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== Správa pluginů ======
-
-Na této stránce lze spravovat pluginy DokuWiki [[doku>plugins|plugins]]. Aby bylo možné stahovat a instalovat pluginy, musí mít webový server přístup pro zápis do adresáře //plugin//.
diff --git a/lib/plugins/plugin/lang/cs/lang.php b/lib/plugins/plugin/lang/cs/lang.php
deleted file mode 100644
index 8917f8ef652b142429529e44a6a2602c5d28617d..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/cs/lang.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Tomas Valenta <t.valenta@sh.cvut.cz>
- * @author Zbynek Krivka <zbynek.krivka@seznam.cz>
- * @author Bohumir Zamecnik <bohumir@zamecnik.org>
- * @author tomas@valenta.cz
- * @author Marek Sacha <sachamar@fel.cvut.cz>
- * @author Lefty <lefty@multihost.cz>
- * @author Vojta Beran <xmamut@email.cz>
- * @author zbynek.krivka@seznam.cz
- * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
- * @author Jakub A. Těšínský (j@kub.cz)
- * @author mkucera66@seznam.cz
- * @author Zbyněk Křivka <krivka@fit.vutbr.cz>
- * @author Gerrit Uitslag <klapinklapin@gmail.com>
- * @author Petr Klíma <qaxi@seznam.cz>
- */
-$lang['menu']                  = 'Správa pluginů';
-$lang['download']              = 'Stáhnout a instalovat plugin';
-$lang['manage']                = 'Seznam instalovaných pluginů';
-$lang['btn_info']              = 'info';
-$lang['btn_update']            = 'aktualizovat';
-$lang['btn_delete']            = 'smazat';
-$lang['btn_settings']          = 'nastavení';
-$lang['btn_download']          = 'Stáhnout';
-$lang['btn_enable']            = 'Uložit';
-$lang['url']                   = 'URL';
-$lang['installed']             = 'Instalován:';
-$lang['lastupdate']            = 'Poslední aktualizace:';
-$lang['source']                = 'Zdroj:';
-$lang['unknown']               = 'neznámý';
-$lang['updating']              = 'Aktualizuji ...';
-$lang['updated']               = 'Modul %s úspěšně aktualizován';
-$lang['updates']               = 'Následující pluginy byly úspěšně aktualizovány';
-$lang['update_none']           = 'Žádné aktualizace nenalezeny.';
-$lang['deleting']              = 'Probíhá mazání ...';
-$lang['deleted']               = 'Plugin %s smazán.';
-$lang['downloading']           = 'Stahuji ...';
-$lang['downloaded']            = 'Plugin %s nainstalován';
-$lang['downloads']             = 'Následující pluginy byly úspěšně instalovány:';
-$lang['download_none']         = 'Žádné pluginy nebyly nenalezeny, nebo se vyskytla nějaká chyba při
-stahování a instalaci.';
-$lang['plugin']                = 'Plugin:';
-$lang['components']            = 'Součásti';
-$lang['noinfo']                = 'Plugin nevrátil žádné informace. Může být poškozen nebo špatný.';
-$lang['name']                  = 'Jméno:';
-$lang['date']                  = 'Datum:';
-$lang['type']                  = 'Typ:';
-$lang['desc']                  = 'Popis:';
-$lang['author']                = 'Autor:';
-$lang['www']                   = 'Web:';
-$lang['error']                 = 'Nastala neznámá chyba.';
-$lang['error_download']        = 'Nelze stáhnout soubor s pluginem: %s';
-$lang['error_badurl']          = 'URL je zřejmě chybná - nelze z ní určit název souboru';
-$lang['error_dircreate']       = 'Nelze vytvořit dočasný adresář ke stažení dat';
-$lang['error_decompress']      = 'Správce pluginů nemůže rozbalit stažený soubor. Toto může být způsobeno chybou při stahování. Můžete se pokusit stahování opakovat. Chyba může být také v kompresním formátu souboru. V tom případě bude nutné stáhnout a nainstalovat plugin ručně.';
-$lang['error_copy']            = 'Došlo k chybě při instalaci pluginu <em>%s</em>. Je možné, že na disku není volné místo, nebo mohou být špatně nastavena přístupová práva. Pozor, mohlo dojít k částečné a tudíž chybné instalaci pluginu a tím může být ohrožena stabilita wiki.';
-$lang['error_delete']          = 'Došlo k chybě při pokusu o smazání pluginu <em>%s</em>. Nejspíše je chyba v nastavení přístupových práv k některým souborům či adresářům.';
-$lang['enabled']               = 'Plugin %s aktivován.';
-$lang['notenabled']            = 'Plugin %s nelze aktivovat, zkontrolujte práva k souborům.';
-$lang['disabled']              = 'Plugin %s deaktivován.';
-$lang['notdisabled']           = 'Plugin %s nelze deaktivovat, zkontrolujte práva k souborům.';
-$lang['packageinstalled']      = 'Balíček pluginů (%d plugin(ů): %s) úspěšně nainstalován.';
diff --git a/lib/plugins/plugin/lang/el/admin_plugin.txt b/lib/plugins/plugin/lang/el/admin_plugin.txt
deleted file mode 100644
index 8b292935de329f939c8b8c66c85fcd92090a6a74..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/el/admin_plugin.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-====== Διαχείριση Επεκτάσεων ======
-
-Σε αυτή την σελίδα μπορείτε να διαχειριστείτε τις [[doku>plugins|επεκτάσεις]] του Dokuwiki σας. Για να μπορέσετε να εγκαταστήσετε νέες επεκτάσεις, ο αντίστοιχος φάκελος συστήματος θα πρέπει να είναι εγγράψιμος από τον χρήστη κάτω από τον οποίο εκτελείται η εφαρμογή του εξυπηρετητή σας.
-
-
diff --git a/lib/plugins/plugin/lang/el/lang.php b/lib/plugins/plugin/lang/el/lang.php
deleted file mode 100644
index f50e26c4636aa836800463e5ac1ff3f34d322388..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/el/lang.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Christopher Smith <chris@jalakai.co.uk>
- * @author Thanos Massias <tm@thriasio.gr>
- * @author Αθανάσιος Νταής <homunculus@wana.gr>
- * @author Konstantinos Koryllos <koryllos@gmail.com>
- * @author George Petsagourakis <petsagouris@gmail.com>
- * @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
- */
-$lang['menu']                  = 'Διαχείριση Επεκτάσεων';
-$lang['download']              = 'Κατεβάστε και εγκαταστήστε μια νέα επέκταση (plugin)';
-$lang['manage']                = 'Εγκατεστημένες επεκτάσεις';
-$lang['btn_info']              = 'πληροφορίες';
-$lang['btn_update']            = 'ενημέρωση';
-$lang['btn_delete']            = 'διαγραφή';
-$lang['btn_settings']          = 'ρυθμίσεις';
-$lang['btn_download']          = 'Μεταφόρτωση';
-$lang['btn_enable']            = 'Αποθήκευση';
-$lang['url']                   = 'URL';
-$lang['installed']             = 'Εγκατεστημένη:';
-$lang['lastupdate']            = 'Τελευταία ενημέρωση:';
-$lang['source']                = 'Προέλευση:';
-$lang['unknown']               = 'άγνωστο';
-$lang['updating']              = 'Σε διαδικασία ενημέρωσης ...';
-$lang['updated']               = 'Η επέκταση %s ενημερώθηκε με επιτυχία';
-$lang['updates']               = 'Οι παρακάτω επεκτάσεις ενημερώθηκαν με επιτυχία:';
-$lang['update_none']           = 'Δεν βρέθηκαν ενημερώσεις.';
-$lang['deleting']              = 'Σε διαδικασία διαγραφής ...';
-$lang['deleted']               = 'Η επέκταση %s διαγράφηκε.';
-$lang['downloading']           = 'Σε διαδικασία μεταφόρτωσης ...';
-$lang['downloaded']            = 'Η επέκταση %s εγκαταστάθηκε με επιτυχία';
-$lang['downloads']             = 'Οι παρακάτω επεκτάσεις εγκαταστάθηκαν με επιτυχία:';
-$lang['download_none']         = 'Δεν βρέθηκαν επεκτάσεις ή εμφανίστηκε κάποιο πρόβλημα κατά την σχετική διαδικασία.';
-$lang['plugin']                = 'Επέκταση:';
-$lang['components']            = 'Συστατικά';
-$lang['noinfo']                = 'Αυτή η επέκταση δεν επέστρεψε κάποια πληροφορία - η επέκταση μπορεί να μην λειτουργεί κανονικά.';
-$lang['name']                  = 'Όνομα:';
-$lang['date']                  = 'Ημερομηνία:';
-$lang['type']                  = 'Τύπος:';
-$lang['desc']                  = 'Περιγραφή:';
-$lang['author']                = 'Συγγραφέας:';
-$lang['www']                   = 'Διεύθυνση στο διαδίκτυο:';
-$lang['error']                 = 'Εμφανίστηκε άγνωστο σφάλμα.';
-$lang['error_download']        = 'Δεν είναι δυνατή η μεταφόρτωση του αρχείου: %s';
-$lang['error_badurl']          = 'Το URL είναι μάλλον λανθασμένο - είναι αδύνατον να εξαχθεί το όνομα αρχείου από αυτό το URL';
-$lang['error_dircreate']       = 'Δεν είναι δυνατή η δημιουργία ενός προσωρινού φακέλου αποθήκευσης των μεταφορτώσεων';
-$lang['error_decompress']      = 'Δεν είναι δυνατή η αποσυμπίεση των μεταφορτώσεων. Αυτό μπορεί να οφείλεται σε μερική λήψη των μεταφορτώσεων, οπότε θα πρέπει να επαναλάβετε την διαδικασία ή το σύστημά σας δεν μπορεί να διαχειριστεί το συγκεκριμένο είδος συμπίεσης, οπότε θα πρέπει να εγκαταστήσετε την επέκταση χειροκίνητα.';
-$lang['error_copy']            = 'Εμφανίστηκε ένα σφάλμα αντιγραφής αρχείων κατά την διάρκεια εγκατάστασης της επέκτασης <em>%s</em>: ο δίσκος μπορεί να είναι γεμάτος ή να μην είναι σωστά ρυθμισμένα τα δικαιώματα πρόσβασης. Αυτό το γεγονός μπορεί να οδήγησε σε μερική εγκατάσταση της επέκτασης και άρα η DokuWiki εγκατάστασή σας να εμφανίσει προβλήματα σταθερότητας.';
-$lang['error_delete']          = 'Εμφανίστηκε ένα σφάλμα κατά την διαδικασία διαγραφής της επέκτασης <em>%s</em>.  Η πιθανότερη αιτία είναι να μην είναι σωστά ρυθμισμένα τα δικαιώματα πρόσβασης.';
-$lang['enabled']               = 'Η επέκταση %s ενεργοποιήθηκε.';
-$lang['notenabled']            = 'Η επέκταση %s δεν μπορεί να ενεργοποιηθεί. Ελέγξτε τα δικαιώματα πρόσβασης.';
-$lang['disabled']              = 'Η επέκταση %s απενεργοποιήθηκε.';
-$lang['notdisabled']           = 'Η επέκταση %s δεν μπορεί να απενεργοποιηθεί. Ελέγξτε τα δικαιώματα πρόσβασης.';
-$lang['packageinstalled']      = 'Το πακέτο της επέκτασης (%d επέκταση(εις): %s) εγκαστήθηκε επιτυχημένα.';
diff --git a/lib/plugins/plugin/lang/fr/admin_plugin.txt b/lib/plugins/plugin/lang/fr/admin_plugin.txt
deleted file mode 100644
index b7beba25a0b77b1dd90cda8dab2267a8a002017a..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/fr/admin_plugin.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Gestion des extensions ======
-
-Cette page vous permet de gérer tout ce qui a trait aux [[doku>fr:plugins|extensions]] de DokuWiki. Pour pouvoir télécharger et installer un module, le répertoire « ''plugin'' » doit être accessible en écriture pour le serveur web.
-
diff --git a/lib/plugins/plugin/lang/fr/lang.php b/lib/plugins/plugin/lang/fr/lang.php
deleted file mode 100644
index 0592f3c7defaf2f409993c118213b531cf135704..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/fr/lang.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Guy Brand <gb@unistra.fr>
- * @author Delassaux Julien <julien@delassaux.fr>
- * @author Maurice A. LeBlanc <leblancma@cooptel.qc.ca>
- * @author stephane.gully@gmail.com
- * @author Guillaume Turri <guillaume.turri@gmail.com>
- * @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author olivier duperray <duperray.olivier@laposte.net>
- * @author Vincent Feltz <psycho@feltzv.fr>
- * @author Philippe Bajoit <philippe.bajoit@gmail.com>
- * @author Florian Gaub <floriang@floriang.net>
- * @author Samuel Dorsaz samuel.dorsaz@novelion.net
- * @author Johan Guilbaud <guilbaud.johan@gmail.com>
- * @author schplurtz@laposte.net
- * @author skimpax@gmail.com
- * @author Yannick Aure <yannick.aure@gmail.com>
- * @author Olivier DUVAL <zorky00@gmail.com>
- * @author Anael Mobilia <contrib@anael.eu>
- * @author Bruno Veilleux <bruno.vey@gmail.com>
- */
-$lang['menu']                  = 'Gestion des extensions';
-$lang['download']              = 'Télécharger et installer une nouvelle extension';
-$lang['manage']                = 'Extensions installées';
-$lang['btn_info']              = 'Info';
-$lang['btn_update']            = 'Mettre à jour';
-$lang['btn_delete']            = 'Supprimer';
-$lang['btn_settings']          = 'Paramètres';
-$lang['btn_download']          = 'Télécharger';
-$lang['btn_enable']            = 'Enregistrer';
-$lang['url']                   = 'URL';
-$lang['installed']             = 'Installé :';
-$lang['lastupdate']            = 'Dernière mise à jour :';
-$lang['source']                = 'Source :';
-$lang['unknown']               = 'inconnu';
-$lang['updating']              = 'Mise à jour…';
-$lang['updated']               = 'Extension %s mise à jour avec succès';
-$lang['updates']               = 'Les extensions suivantes ont été mises à jour avec succès';
-$lang['update_none']           = 'Aucune mise à jour n\'a été trouvée.';
-$lang['deleting']              = 'Suppression…';
-$lang['deleted']               = 'Extension %s supprimée.';
-$lang['downloading']           = 'Téléchargement…';
-$lang['downloaded']            = 'Extension %s installée avec succès';
-$lang['downloads']             = 'Les extensions suivantes ont été installées avec succès :';
-$lang['download_none']         = 'Aucune extension n\'a été trouvée, ou un problème inconnu est survenu durant le téléchargement et l\'installation.';
-$lang['plugin']                = 'Extension :';
-$lang['components']            = 'Composants';
-$lang['noinfo']                = 'Cette extension n\'a transmis aucune information, elle pourrait être invalide.';
-$lang['name']                  = 'Nom :';
-$lang['date']                  = 'Date :';
-$lang['type']                  = 'Type :';
-$lang['desc']                  = 'Description :';
-$lang['author']                = 'Auteur :';
-$lang['www']                   = 'Site web :';
-$lang['error']                 = 'Une erreur inconnue est survenue.';
-$lang['error_download']        = 'Impossible de télécharger le fichier de l\'extension : %s';
-$lang['error_badurl']          = 'URL suspecte : impossible de déterminer le nom du fichier à partir de l\'URL';
-$lang['error_dircreate']       = 'Impossible de créer le répertoire temporaire pour effectuer le téléchargement';
-$lang['error_decompress']      = 'Le gestionnaire d\'extensions a été incapable de décompresser le fichier téléchargé. Ceci peut être le résultat d\'un mauvais téléchargement, auquel cas vous devriez réessayer ; ou bien le format de compression est inconnu, auquel cas vous devez télécharger et installer l\'extension manuellement.';
-$lang['error_copy']            = 'Une erreur de copie est survenue lors de l\'installation des fichiers de l\'extension <em>%s</em> : le disque est peut-être plein ou les autorisations d\'accès sont incorrects. Il a pu en résulter une installation partielle de l\'extension et laisser votre installation du wiki instable.';
-$lang['error_delete']          = 'Une erreur est survenue lors de la suppression de l\'extension <em>%s</em>. La raison la plus probable est l\'insuffisance des autorisations sur les fichiers ou les répertoires.';
-$lang['enabled']               = 'Extension %s activée.';
-$lang['notenabled']            = 'L\'extension %s n\'a pas pu être activée, vérifiez les autorisations des fichiers.';
-$lang['disabled']              = 'Extension %s désactivée.';
-$lang['notdisabled']           = 'L\'extension %s n\'a pas pu être désactivée, vérifiez les autorisations des fichiers.';
-$lang['packageinstalled']      = 'Ensemble d\'extensions (%d extension(s): %s) installé avec succès.';
diff --git a/lib/plugins/plugin/lang/id/lang.php b/lib/plugins/plugin/lang/id/lang.php
deleted file mode 100644
index 2653b075eba009224133b5e25b893ea8651b04a2..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/id/lang.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Irwan Butar Butar <irwansah.putra@gmail.com>
- * @author Yustinus Waruwu <juswaruwu@gmail.com>
- */
-$lang['btn_info']              = 'Info';
-$lang['btn_update']            = 'Baharui';
-$lang['btn_delete']            = 'Hapus';
-$lang['btn_settings']          = 'Pengaturan';
-$lang['btn_download']          = 'Unduh';
-$lang['btn_enable']            = 'Simpan';
-$lang['url']                   = 'URL';
-$lang['installed']             = 'Instal';
-$lang['lastupdate']            = 'Pembaharuan terakhir:';
-$lang['source']                = 'Sumber:';
-$lang['unknown']               = 'Tidak kenal';
-$lang['updating']              = 'Terbaharui ...';
-$lang['update_none']           = 'Tidak ditemukan pembaharuan';
-$lang['deleting']              = 'Terhapus ...';
-$lang['deleted']               = 'Hapus Plugin %s.';
-$lang['downloading']           = 'Unduh ...';
-$lang['plugin']                = 'Plugin:';
-$lang['components']            = 'Komponen';
-$lang['name']                  = 'Nama:';
-$lang['date']                  = 'Tanggal:';
-$lang['type']                  = 'Tipe:';
-$lang['desc']                  = 'Penjelasan:';
-$lang['author']                = 'Autor:';
-$lang['www']                   = 'Web:';
diff --git a/lib/plugins/plugin/lang/pl/admin_plugin.txt b/lib/plugins/plugin/lang/pl/admin_plugin.txt
deleted file mode 100644
index f01048198e4754547bb667fb2d8434c0678dd113..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/pl/admin_plugin.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-====== Menadżer wtyczek ======
-
-Na tej stronie możesz zarządzać wszystkim co jest związane z [[doku>plugins|wtyczkami]] Dokuwiki. Aby móc ściągnąć i zainstalować wtyczkę, serwer WWW musi mieć prawo do zapisu w katalogu ''plugins''.
-
-
diff --git a/lib/plugins/plugin/lang/pl/lang.php b/lib/plugins/plugin/lang/pl/lang.php
deleted file mode 100644
index eae91f33ef5f8a232584d5d04cd51f6236b7fbac..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/pl/lang.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Michał Tkacz <mehow@autocom.pl>
- * @author Grzegorz Żur <grzegorz.zur@gmail.com>
- * @author Mariusz Kujawski <marinespl@gmail.com>
- * @author Maciej Kurczewski <pipijajko@gmail.com>
- * @author SÅ‚awomir Boczek <slawkens@gmail.com>
- * @author sleshek@wp.pl
- * @author Leszek Stachowski <shazarre@gmail.com>
- * @author maros <dobrimaros@yahoo.pl>
- * @author Grzegorz Widła <dzesdzes@gmail.com>
- * @author Łukasz Chmaj <teachmeter@gmail.com>
- * @author Begina Felicysym <begina.felicysym@wp.eu>
- * @author Aoi Karasu <aoikarasu@gmail.com>
- */
-$lang['menu']                  = 'Menadżer wtyczek';
-$lang['download']              = 'ÅšciÄ…gnij i zainstaluj nowÄ… wtyczkÄ™';
-$lang['manage']                = 'Zainstalowane Wtyczki';
-$lang['btn_info']              = 'Informacje';
-$lang['btn_update']            = 'Aktualizuj';
-$lang['btn_delete']            = 'Usuń';
-$lang['btn_settings']          = 'Ustawienia';
-$lang['btn_download']          = 'Pobierz';
-$lang['btn_enable']            = 'Zapisz';
-$lang['url']                   = 'Adres URL';
-$lang['installed']             = 'Instalacja:';
-$lang['lastupdate']            = 'Ostatnio zaktualizowana:';
-$lang['source']                = 'Źródło:';
-$lang['unknown']               = 'nieznane';
-$lang['updating']              = 'AktualizujÄ™...';
-$lang['updated']               = 'Aktualizacja wtyczki %s pomyślnie ściągnięta';
-$lang['updates']               = 'Aktualizacje następujących wtyczek zostały pomyślnie ściągnięte';
-$lang['update_none']           = 'Nie znaleziono aktualizacji.';
-$lang['deleting']              = 'Usuwam...';
-$lang['deleted']               = 'Wtyczka %s usunięta.';
-$lang['downloading']           = 'Pobieram...';
-$lang['downloaded']            = 'Wtyczka %s pomyślnie zainstalowana';
-$lang['downloads']             = 'Następujące wtyczki zostały pomyślnie zainstalowane:';
-$lang['download_none']         = 'Nie znaleziono wtyczek lub wystąpił nieznany problem podczas ściągania i instalacji.';
-$lang['plugin']                = 'Wtyczka:';
-$lang['components']            = 'Składniki';
-$lang['noinfo']                = 'Ta wtyczka nie zwróciła żadnych informacji, może być niepoprawna.';
-$lang['name']                  = 'Nazwa:';
-$lang['date']                  = 'Data:';
-$lang['type']                  = 'Typ:';
-$lang['desc']                  = 'Opis:';
-$lang['author']                = 'Autor:';
-$lang['www']                   = 'WWW:';
-$lang['error']                 = 'Wystąpił nieznany błąd.';
-$lang['error_download']        = 'Nie powiodło się ściągnięcie pliku wtyczki: %s';
-$lang['error_badurl']          = 'Prawdopodobnie zły url - nie da się ustalić nazwy pliku na podstawie urla';
-$lang['error_dircreate']       = 'Nie powiodło się stworzenie tymczasowego katalogu na pobrane pliki';
-$lang['error_decompress']      = 'Menadżer wtyczek nie był w stanie rozpakować ściągniętego pliku. Może to być spowodowane przez nieudany transfer (w takim przypadku powinieneś spróbować ponownie) lub nieznany format kompresji (w takim przypadku będziesz musiał ściągnąć i zainstalować wtyczkę ręcznie).';
-$lang['error_copy']            = 'Wystąpił błąd podczas kopiowania pliku w trakcie instalacji wtyczki %s: być może dysk jest pełny lub prawa dostępu są niepoprawne. Efektem może być częściowo zainstalowana wtyczka co może spowodować niestabilność Twojej instalacji wiki.';
-$lang['error_delete']          = 'Wystąpił błąd przy próbie usunięcia wtyczki <em>%s</em>. Prawdopodobną przyczyną są niewystarczające uprawnienia do katalogu.';
-$lang['enabled']               = 'Wtyczka %s włączona.';
-$lang['notenabled']            = 'Nie udało się uruchomić wtyczki %s, sprawdź uprawnienia dostępu do plików.';
-$lang['disabled']              = 'Wtyczka %s wyłączona.';
-$lang['notdisabled']           = 'Nie udało się wyłączyć wtyczki %s, sprawdź uprawnienia dostępu do plików.';
-$lang['packageinstalled']      = 'Pakiet wtyczek (%d wtyczki: %s) zainstalowany pomyślnie.';
diff --git a/lib/plugins/plugin/lang/sk/admin_plugin.txt b/lib/plugins/plugin/lang/sk/admin_plugin.txt
deleted file mode 100644
index ad3ae7f58508a102438387a7b758f4212a395ad8..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/sk/admin_plugin.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Správa pluginov ======
-
-Na tejto stránke je možné spravovať [[doku>plugins|pluginy]] Dokuwiki. Aby bolo možné sťahovať a inštalovať pluginy, musí mať webový server prístup pre zápis do adresára //plugin//.
-
diff --git a/lib/plugins/plugin/lang/sk/lang.php b/lib/plugins/plugin/lang/sk/lang.php
deleted file mode 100644
index 35c07cf8060a7468057d270c030e94d91ee7d656..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/sk/lang.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Ondrej Végh <ov@vsieti.sk>
- * @author Michal Mesko <michal.mesko@gmail.com>
- * @author exusik@gmail.com
- * @author Martin Michalek <michalek.dev@gmail.com>
- */
-$lang['menu']                  = 'Správa pluginov';
-$lang['download']              = 'Stiahnuť a nainštalovať plugin';
-$lang['manage']                = 'Nainštalované pluginy';
-$lang['btn_info']              = 'info';
-$lang['btn_update']            = 'aktualizovať';
-$lang['btn_delete']            = 'zmazať';
-$lang['btn_settings']          = 'nastavenia';
-$lang['btn_download']          = 'Stiahnuť';
-$lang['btn_enable']            = 'Uložiť';
-$lang['url']                   = 'URL';
-$lang['installed']             = 'Nainštalovaný:';
-$lang['lastupdate']            = 'Aktualizovaný:';
-$lang['source']                = 'Zdroj:';
-$lang['unknown']               = 'neznámy';
-$lang['updating']              = 'Aktualizuje sa ...';
-$lang['updated']               = 'Plugin %s bol úspešne aktualizovaný';
-$lang['updates']               = 'Nasledujúce pluginy bol úspešne aktualizované:';
-$lang['update_none']           = 'Neboli nájdené žiadne aktualizácie.';
-$lang['deleting']              = 'Vymazáva sa ...';
-$lang['deleted']               = 'Plugin %s bol zmazaný.';
-$lang['downloading']           = 'SÅ¥ahuje sa ...';
-$lang['downloaded']            = 'Plugin %s bol úspešne stiahnutý';
-$lang['downloads']             = 'Nasledujúce pluginy bol úspešne stiahnuté:';
-$lang['download_none']         = 'Neboli nájdené žiadne pluginy alebo nastal neznámy problém počas sťahovania a inštalácie pluginov.';
-$lang['plugin']                = 'Plugin:';
-$lang['components']            = 'Súčasti';
-$lang['noinfo']                = 'Tento plugin neobsahuje žiadne informácie, je možné, že je chybný.';
-$lang['name']                  = 'názov:';
-$lang['date']                  = 'Dátum:';
-$lang['type']                  = 'Typ:';
-$lang['desc']                  = 'Popis:';
-$lang['author']                = 'Autor:';
-$lang['www']                   = 'Web:';
-$lang['error']                 = 'Nastala neznáma chyba.';
-$lang['error_download']        = 'Nie je možné stiahnuť súbor pluginu: %s';
-$lang['error_badurl']          = 'Pravdepodobne zlá url adresa - nie je možné z nej určiť meno súboru';
-$lang['error_dircreate']       = 'Nie je možné vytvoriť dočasný adresár pre uloženie sťahovaného súboru';
-$lang['error_decompress']      = 'Správca pluginov nedokáže dekomprimovať stiahnutý súbor. Môže to byť dôsledok zlého stiahnutia, v tom prípade to skúste znovu, alebo môže ísť o neznámy formát súboru, v tom prípade musíte stiahnuť a nainštalovať plugin manuálne.';
-$lang['error_copy']            = 'Nastala chyba kopírovania súboru počas pokusu inštalovať súbory pluginu<em>%s</em>: disk môže byť plný alebo prístupové práva k súboru môžu byť nesprávne. Toto môže mať za následok čiastočne nainštalovanie pluginu a nestabilitu vašej DokuWiki.';
-$lang['error_delete']          = 'Nastala chyba počas pokusu o zmazanie pluginu <em>%s</em>.  Najpravdepodobnejším dôvodom môžu byť nedostatočné prístupové práva pre súbor alebo adresár';
-$lang['enabled']               = 'Plugin %s aktivovaný.';
-$lang['notenabled']            = 'Plugin %s nemôže byť aktivovaný, skontrolujte prístupové práva.';
-$lang['disabled']              = 'Plugin %s deaktivovaný.';
-$lang['notdisabled']           = 'Plugin %s nemôže byť deaktivovaný, skontrolujte prístupové práva.';
-$lang['packageinstalled']      = 'Plugin package (%d plugin(s): %s) úspešne inštalovaný.';
diff --git a/lib/plugins/plugin/lang/sl/admin_plugin.txt b/lib/plugins/plugin/lang/sl/admin_plugin.txt
deleted file mode 100644
index 5fd02e1bafc7375f40fc1210c8b3e9d13e48ad4e..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/sl/admin_plugin.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== Upravljanje vstavkov ======
-
-Na tej strani je mogoče spreminjati in prilagajati nastavitve DokuWiki [[doku>plugins|vstavkov]]. Za prejemanje in nameščanje vstavkov v ustrezne mape, morajo imeti te določena ustrezna dovoljenja za pisanje spletnega strežnika.
diff --git a/lib/plugins/plugin/lang/sl/lang.php b/lib/plugins/plugin/lang/sl/lang.php
deleted file mode 100644
index e205c57f56a17b1b40eff356753b3d5a58c84457..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/sl/lang.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Dejan Levec <webphp@gmail.com>
- * @author Boštjan Seničar <senicar@gmail.com>
- * @author Gregor Skumavc (grega.skumavc@gmail.com)
- * @author Matej Urbančič (mateju@svn.gnome.org)
- */
-$lang['menu']                  = 'Upravljanje vstavkov';
-$lang['download']              = 'Prejmi in namesti nov vstavek';
-$lang['manage']                = 'Nameščeni vstavki';
-$lang['btn_info']              = 'Podrobnosti';
-$lang['btn_update']            = 'Posodobi';
-$lang['btn_delete']            = 'Izbriši';
-$lang['btn_settings']          = 'Nastavitve';
-$lang['btn_download']          = 'Prejmi';
-$lang['btn_enable']            = 'Shrani';
-$lang['url']                   = 'URL';
-$lang['installed']             = 'Nameščeno:';
-$lang['lastupdate']            = 'Nazadnje posodobljeno:';
-$lang['source']                = 'Vir:';
-$lang['unknown']               = 'neznano';
-$lang['updating']              = 'Posodabljanje ...';
-$lang['updated']               = 'Vstavek %s je uspešno posodobljen';
-$lang['updates']               = 'Navedeni vstavki so uspešno posodobljeni';
-$lang['update_none']           = 'Posodobitev ni mogoče najti.';
-$lang['deleting']              = 'Brisanje ...';
-$lang['deleted']               = 'Vstavek %s je izbrisan.';
-$lang['downloading']           = 'Prejemanje ...';
-$lang['downloaded']            = 'Vstavek %s je uspešno nameščen';
-$lang['downloads']             = 'Navedeni vstavki so uspešno nameščeni:';
-$lang['download_none']         = 'Vstavkov ni mogoče najti ali pa je prišlo do napake med prejemanjem in nameščanjem.';
-$lang['plugin']                = 'Vstavek:';
-$lang['components']            = 'Sestavni deli';
-$lang['noinfo']                = 'Vstavek nima vpisanih podrobnih podatkov, kar pomeni, da je morda neveljaven.';
-$lang['name']                  = 'Ime:';
-$lang['date']                  = 'Datum:';
-$lang['type']                  = 'Vrsta:';
-$lang['desc']                  = 'Opis:';
-$lang['author']                = 'Avtor:';
-$lang['www']                   = 'Spletna stran:';
-$lang['error']                 = 'Prišlo je do neznane napake.';
-$lang['error_download']        = 'Ni mogoče prejeti datoteke vstavka: %s';
-$lang['error_badurl']          = 'Napaka naslova URL - ni mogoče določiti imena datoteke iz naslova URL';
-$lang['error_dircreate']       = 'Ni mogoče ustvariti začasne mape za prejemanje';
-$lang['error_decompress']      = 'Z upravljalnikom vstavkov ni mogoče razširiti prejetega arhiva vstavka. Najverjetneje je prišlo do napake med prejemanjem datoteke ali pa zapis arhiva ni znan. Poskusite znova ali pa napako odpravite z ročnim nameščanjem vstavka.';
-$lang['error_copy']            = 'Prišlo je do napake med nameščanjem datotek vstavka <em>%s</em>: najverjetneje so težave s prostorom za namestitev ali pa ni ustreznih dovoljenj za nameščanje. Zaradi nepopolne namestitve lahko nastopijo težave v delovanju sistema Wiki.';
-$lang['error_delete']          = 'Prišlo je do napake med brisanjem vstavka <em>%s</em>: najverjetneje ni ustreznih dovoljenj za dostop do datoteke ali mape';
-$lang['enabled']               = 'Vstavek %s je omogočen.';
-$lang['notenabled']            = 'Vstavka %s ni mogoče omogočiti zaradi neustreznih dovoljen.';
-$lang['disabled']              = 'Vstavek %s je onemogočen.';
-$lang['notdisabled']           = 'Vstavka %s ni mogoče onemogočiti zaradi neustreznih dovoljen.';
-$lang['packageinstalled']      = 'Paket vstavka (%d vstavkov: %s) je uspešno nameščen.';
diff --git a/lib/plugins/plugin/lang/tr/admin_plugin.txt b/lib/plugins/plugin/lang/tr/admin_plugin.txt
deleted file mode 100644
index 956d701f66a3eadbfe40ae86ef89a8e514bf7eda..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/tr/admin_plugin.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== Eklenti Yönetimi ======
-
-Bu sayfada DokuWiki [[doku>plugins|eklentileri]] ile ilgili herşeyi düzenleyebilirsiniz. Eklenti kurup indirmek için, eklenti dizininin yazılabilir olması gerekmektedir.
diff --git a/lib/plugins/plugin/lang/tr/lang.php b/lib/plugins/plugin/lang/tr/lang.php
deleted file mode 100644
index a4feea8cd512471e7ce52ae54aec637977d7cc2a..0000000000000000000000000000000000000000
--- a/lib/plugins/plugin/lang/tr/lang.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/**
- * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * 
- * @author Aydın Coşkuner <aydinweb@gmail.com>
- * @author Cihan Kahveci <kahvecicihan@gmail.com>
- * @author Yavuz Selim <yavuzselim@gmail.com>
- * @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
- */
-$lang['menu']                  = 'Eklenti Yönetimi';
-$lang['download']              = 'Yeni bir eklenti indirip kur';
-$lang['manage']                = 'KurulmuÅŸ Eklentiler';
-$lang['btn_info']              = 'bilgi';
-$lang['btn_update']            = 'güncelle';
-$lang['btn_delete']            = 'sil';
-$lang['btn_settings']          = 'Ayarlar';
-$lang['btn_download']          = 'Ä°ndir';
-$lang['btn_enable']            = 'Kaydet';
-$lang['url']                   = 'Web Adresi';
-$lang['installed']             = 'Kuruldu:';
-$lang['lastupdate']            = 'Son güncelleştirme:';
-$lang['source']                = 'Kaynak:';
-$lang['unknown']               = 'bilinmiyor';
-$lang['updating']              = 'Güncelleştiriyor ...';
-$lang['updated']               = '%s eklentisi başarıyla güncellendi';
-$lang['updates']               = 'Şu eklentiler başarıyla güncellendi';
-$lang['update_none']           = 'Yeni bir güncelleme bulunamadı.';
-$lang['deleting']              = 'Siliniyor ...';
-$lang['deleted']               = '%s eklentisi silindi.';
-$lang['downloading']           = 'Ä°ndiriyor ...';
-$lang['downloaded']            = '%s eklentisi başarıyla kuruldu';
-$lang['downloads']             = 'Şu eklentiler başarıyla kuruldu:';
-$lang['download_none']         = 'Eklenti bulunamadı veya indirirken/kurarken bilinmeyen bir hata oluştu.';
-$lang['plugin']                = 'Eklenti:';
-$lang['components']            = 'Parçalar';
-$lang['noinfo']                = 'Bu eklentinin bilgileri alınamadı, geçerli bir eklenti olmayabilir.';
-$lang['name']                  = 'Ad:';
-$lang['date']                  = 'Tarih:';
-$lang['type']                  = 'Tür:';
-$lang['desc']                  = 'Açıklama:';
-$lang['author']                = 'Yazar:';
-$lang['www']                   = 'Web Adresi:';
-$lang['error']                 = 'Bilinmeyen bir hata oluÅŸtu.';
-$lang['error_download']        = 'Åžu eklenti indirilemedi: %s';
-$lang['error_badurl']          = 'Yanlış adres olabilir - verilen adresten dosya adı alınamadı';
-$lang['error_dircreate']       = 'İndirmek için geçici klasör oluşturulamadı';
-$lang['error_decompress']      = 'Eklenti yöneticisi indirilen sıkıştırılmış dosyayı açamadı. Bu yanlış indirmeden kaynaklanabilir (bu durumda tekrar denemelisiniz). Ya da indirilen dosyanın sıkıştırma biçimi bilinmemektedir (bu durumda eklentiyi indirerek kendiniz kurmalısınız).';
-$lang['error_copy']            = '<em>%s</em> eklentisi dosyalarını kurmaya çalışırken kopyalama hatası ortaya çıktı. Sürücü dolu olabilir veya yazma yetkisi bulunmuyor olabilir. Bunun sebebi tam kurulmamış bir eklentinin wiki kurulumunu bozması olabilir.';
-$lang['error_delete']          = '<em>%s</em> eklentisini silerken bir hata oluştu. Bu hata yetersiz dosya/klasör erişim yetkisinden kaynaklanabilir.';
-$lang['enabled']               = '%s eklentisi etkinleÅŸtirildi.';
-$lang['notenabled']            = '%s eklentisi etkinleÅŸtirilemedi, dosya yetkilerini kontrol edin.';
-$lang['disabled']              = '%s eklentisi devre dışı bırakıldı.';
-$lang['notdisabled']           = '%s eklentisi devre dışı bırakılamadı, dosya yetkilerini kontrol edin.';
diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php
index 156037f0929b49a3a944d57adfb906f3587d17ec..eadfb76add6d12192b5569f0758aa78ede5f8011 100644
--- a/lib/plugins/usermanager/admin.php
+++ b/lib/plugins/usermanager/admin.php
@@ -277,6 +277,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
     protected function _htmlUserForm($cmd,$user='',$userdata=array(),$indent=0) {
         global $conf;
         global $ID;
+        global $lang;
 
         $name = $mail = $groups = '';
         $notes = array();
@@ -299,6 +300,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
 
         $this->_htmlInputField($cmd."_userid",    "userid",    $this->lang["user_id"],    $user,  $this->_auth->canDo("modLogin"), $indent+6);
         $this->_htmlInputField($cmd."_userpass",  "userpass",  $this->lang["user_pass"],  "",     $this->_auth->canDo("modPass"),  $indent+6);
+        $this->_htmlInputField($cmd."_userpass2", "userpass2", $lang["passchk"],          "",     $this->_auth->canDo("modPass"),  $indent+6);
         $this->_htmlInputField($cmd."_username",  "username",  $this->lang["user_name"],  $name,  $this->_auth->canDo("modName"),  $indent+6);
         $this->_htmlInputField($cmd."_usermail",  "usermail",  $this->lang["user_mail"],  $mail,  $this->_auth->canDo("modMail"),  $indent+6);
         $this->_htmlInputField($cmd."_usergroups","usergroups",$this->lang["user_groups"],$groups,$this->_auth->canDo("modGroups"),$indent+6);
@@ -358,7 +360,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         $class = $cando ? '' : ' class="disabled"';
         echo str_pad('',$indent);
 
-        if($name == 'userpass'){
+        if($name == 'userpass' || $name == 'userpass2'){
             $fieldtype = 'password';
             $autocomp  = 'autocomplete="off"';
         }elseif($name == 'usermail'){
@@ -475,7 +477,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         if (!checkSecurityToken()) return false;
         if (!$this->_auth->canDo('addUser')) return false;
 
-        list($user,$pass,$name,$mail,$grps) = $this->_retrieveUser();
+        list($user,$pass,$name,$mail,$grps,$passconfirm) = $this->_retrieveUser();
         if (empty($user)) return false;
 
         if ($this->_auth->canDo('modPass')){
@@ -486,6 +488,10 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
                     msg($this->lang['add_fail'], -1);
                     return false;
                 }
+            } else {
+                if (!$this->_verifyPassword($pass,$passconfirm)) {
+                    return false;
+                }
             }
         } else {
             if (!empty($pass)){
@@ -606,7 +612,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         $oldinfo = $this->_auth->getUserData($olduser);
 
         // get new user data subject to change
-        list($newuser,$newpass,$newname,$newmail,$newgrps) = $this->_retrieveUser();
+        list($newuser,$newpass,$newname,$newmail,$newgrps,$passconfirm) = $this->_retrieveUser();
         if (empty($newuser)) return false;
 
         $changes = array();
@@ -625,27 +631,37 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
                 $changes['user'] = $newuser;
             }
         }
-
-        // generate password if left empty and notification is on
-        if($INPUT->has('usernotify') && empty($newpass)){
-            $newpass = auth_pwgen($olduser);
+        if ($this->_auth->canDo('modPass')) {
+            if ($newpass || $passconfirm) {
+                if ($this->_verifyPassword($newpass,$passconfirm)) {
+                    $changes['pass'] = $newpass;
+                } else {
+                    return false;
+                }
+            } else {
+                // no new password supplied, check if we need to generate one (or it stays unchanged)
+                if ($INPUT->has('usernotify')) {
+                    $changes['pass'] = auth_pwgen($olduser);
+                }
+            }
         }
 
-        if (!empty($newpass) && $this->_auth->canDo('modPass'))
-          $changes['pass'] = $newpass;
-        if (!empty($newname) && $this->_auth->canDo('modName') && $newname != $oldinfo['name'])
-          $changes['name'] = $newname;
-        if (!empty($newmail) && $this->_auth->canDo('modMail') && $newmail != $oldinfo['mail'])
-          $changes['mail'] = $newmail;
-        if (!empty($newgrps) && $this->_auth->canDo('modGroups') && $newgrps != $oldinfo['grps'])
-          $changes['grps'] = $newgrps;
+        if (!empty($newname) && $this->_auth->canDo('modName') && $newname != $oldinfo['name']) {
+            $changes['name'] = $newname;
+        }
+        if (!empty($newmail) && $this->_auth->canDo('modMail') && $newmail != $oldinfo['mail']) {
+            $changes['mail'] = $newmail;
+        }
+        if (!empty($newgrps) && $this->_auth->canDo('modGroups') && $newgrps != $oldinfo['grps']) {
+            $changes['grps'] = $newgrps;
+        }
 
         if ($ok = $this->_auth->triggerUserMod('modify', array($olduser, $changes))) {
             msg($this->lang['update_ok'],1);
 
-            if ($INPUT->has('usernotify') && $newpass) {
+            if ($INPUT->has('usernotify') && !empty($changes['pass'])) {
                 $notify = empty($changes['user']) ? $olduser : $newuser;
-                $this->_notifyUser($notify,$newpass);
+                $this->_notifyUser($notify,$changes['pass']);
             }
 
             // invalidate all sessions
@@ -685,6 +701,32 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         return $sent;
     }
 
+    /**
+     * Verify password meets minimum requirements
+     * :TODO: extend to support password strength
+     *
+     * @param string  $password   candidate string for new password
+     * @param string  $confirm    repeated password for confirmation
+     * @return bool   true if meets requirements, false otherwise
+     */
+    protected function _verifyPassword($password, $confirm) {
+        global $lang;
+
+        if (empty($password) && empty($confirm)) {
+            return false;
+        }
+
+        if ($password !== $confirm) {
+            msg($lang['regbadpass'], -1);
+            return false;
+        }
+
+        // :TODO: test password for required strength
+
+        // if we make it this far the password is good
+        return true;
+    }
+
     /**
      * Retrieve & clean user data from the form
      *
@@ -701,6 +743,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
         $user[2] = $INPUT->str('username');
         $user[3] = $INPUT->str('usermail');
         $user[4] = explode(',',$INPUT->str('usergroups'));
+        $user[5] = $INPUT->str('userpass2');                // repeated password for confirmation
 
         $user[4] = array_map('trim',$user[4]);
         if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]);
diff --git a/lib/plugins/usermanager/lang/en/lang.php b/lib/plugins/usermanager/lang/en/lang.php
index f87c77afb3abc3577bf7c7cd2bc00dfcfad69f01..b55ecc998e9d9643121da1c73ae2fd397b9fe351 100644
--- a/lib/plugins/usermanager/lang/en/lang.php
+++ b/lib/plugins/usermanager/lang/en/lang.php
@@ -76,4 +76,3 @@ $lang['import_error_create']  = 'Unable to create the user';
 $lang['import_notify_fail']   = 'Notification message could not be sent for imported user, %s with email %s.';
 $lang['import_downloadfailures'] = 'Download Failures as CSV for correction';
 
-
diff --git a/lib/styles/geshi.less b/lib/styles/geshi.less
new file mode 100644
index 0000000000000000000000000000000000000000..2c7ac6a5707df798344b462b29e76935ff3b8986
--- /dev/null
+++ b/lib/styles/geshi.less
@@ -0,0 +1,127 @@
+/**
+ * GeSHi syntax highlighting styles
+ *
+ * Generated with https://www.dokuwiki.org/tips:geshi_style_builder
+ * Cleaned up with http://cleancss.com/
+ * Manulally LESSified
+ */
+.code {
+    .co0 {
+        color: #666666;
+        font-style: italic;
+    }
+
+    .co4 {
+        color: #cc0000;
+        font-style: italic;
+    }
+
+    .es5 {
+        color: #006699;
+        font-weight: bold;
+    }
+
+    .es6 {
+        color: #009933;
+        font-weight: bold;
+    }
+
+    .kw2 {
+        color: #000000;
+        font-weight: bold;
+    }
+
+    .kw5 {
+        color: #008000;
+    }
+
+    .kw6 {
+        color: #f08;
+        font-weight: bold;
+    }
+
+    .me0 {
+        color: #004000;
+    }
+
+    .nu0 {
+        color: #cc66cc;
+    }
+
+    .re0 {
+        color: #0000ff;
+    }
+
+    .re3 {
+        color: #ff3333;
+        font-weight: bold;
+    }
+
+    .re4 {
+        color: #009999;
+    }
+
+    .re5 {
+        color: #660033;
+    }
+
+    .sc-2 {
+        color: #404040;
+    }
+
+    .sy3 {
+        color: #000040;
+    }
+
+    .br0, .sy0 {
+        color: #66cc66;
+    }
+
+    .co1, .coMULTI, .sc-1 {
+        color: #808080;
+        font-style: italic;
+    }
+
+    .co2, .sy1 {
+        color: #339933;
+    }
+
+    .co3, .sy4 {
+        color: #008080;
+    }
+
+    .es0, .es1, .esHARD {
+        color: #000099;
+        font-weight: bold;
+    }
+
+    .es2, .es3, .es4 {
+        color: #660099;
+        font-weight: bold;
+    }
+
+    .kw1, .kw8 {
+        color: #b1b100;
+    }
+
+    .kw10, .kw11, .kw12, .kw9 {
+        color: #003399;
+        font-weight: bold;
+    }
+
+    .kw13, .kw14, .kw15, .kw16, .me1, .me2 {
+        color: #006600;
+    }
+
+    .kw3, .kw7, .sy2 {
+        color: #000066;
+    }
+
+    .kw4, .re2 {
+        color: #993333;
+    }
+
+    .re1, .st0, .st_h {
+        color: #ff0000;
+    }
+}
\ No newline at end of file
diff --git a/lib/styles/screen.css b/lib/styles/screen.css
index 2d84f65eb882878551beccf4eb8a68732bb4152c..bbc1e86be9f4e65bed854ce52b7ce7c4914bb449 100644
--- a/lib/styles/screen.css
+++ b/lib/styles/screen.css
@@ -93,26 +93,4 @@ div.notify {
     right: -99999em !important;
 }
 
-/* syntax highlighting code */
-.code .br0  { color: #66cc66; }
-.code .co0  { color: #808080; font-style: italic; }
-.code .co1  { color: #808080; font-style: italic; }
-.code .co2  { color: #808080; font-style: italic; }
-.code .co3  { color: #808080; }
-.code .coMULTI  { color: #808080; font-style: italic; }
-.code .es0  { color: #000099; font-weight: bold; }
-.code .kw1  { color: #b1b100; }
-.code .kw2  { color: #000000; font-weight: bold; }
-.code .kw3  { color: #000066; }
-.code .kw4  { color: #993333; }
-.code .kw5  { color: #0000ff; }
-.code .me1  { color: #006600; }
-.code .me2  { color: #006600; }
-.code .nu0  { color: #cc66cc; }
-.code .re0  { color: #0000ff; }
-.code .re1  { color: #0000ff; }
-.code .re2  { color: #0000ff; }
-.code .re3  { color: #ff3333; font-weight:bold; }
-.code .re4  { color: #009999; }
-.code .st0  { color: #ff0000; }
-.code .sy0  { color: #66cc66; }
+@import "geshi.less";
diff --git a/lib/tpl/dokuwiki/css/content.less b/lib/tpl/dokuwiki/css/content.less
index a5ffbf2be44bcd95cc9c67c602a2aad93a546a86..a2e343a33b200fa57d987393129a95c74994836a 100644
--- a/lib/tpl/dokuwiki/css/content.less
+++ b/lib/tpl/dokuwiki/css/content.less
@@ -67,19 +67,19 @@
 
 /*____________ lists ____________*/
 
-#dokuwiki__content ul li,
-#dokuwiki__aside ul li {
-    color: @ini_text_alt;
-}
+.dokuwiki .page,
+.dokuwiki .aside {
+    ul li {
+        color: @ini_text_alt;
+    }
 
-#dokuwiki__content ol li,
-#dokuwiki__aside ol li {
-    color: @ini_text_neu;
-}
+    ol li {
+        color: @ini_text_neu;
+    }
 
-#dokuwiki__content li .li,
-#dokuwiki__aside li .li {
-    color: @ini_text;
+    li .li {
+        color: @ini_text;
+    }
 }
 
 /*____________ tables ____________*/
diff --git a/lib/tpl/dokuwiki/css/design.less b/lib/tpl/dokuwiki/css/design.less
index 42292de4998a1852f821a571bed2757a6bedc762..46b4a045b599782a7e29cea4ceca129489928a06 100644
--- a/lib/tpl/dokuwiki/css/design.less
+++ b/lib/tpl/dokuwiki/css/design.less
@@ -186,50 +186,50 @@
     text-align: right;
 
     form.search {
-        display: block;
         font-size: 0.875em;
-        position: relative;
+    }
+}
 
-        input.edit {
-            width: 18em;
-            padding: .35em 22px .35em .1em;
-        }
+[dir=rtl] #dokuwiki__sitetools {
+    text-align: left;
+}
 
-        input.button {
-            background: transparent url(images/search.png) no-repeat 0 0;
-            border-width: 0;
-            width: 19px;
-            height: 14px;
-            text-indent: -99999px;
-            margin-left: -20px;
-            box-shadow: none;
-            padding: 0;
-        }
+form.search {
+    display: block;
+    position: relative;
+    margin-bottom: 0.5em;
+
+    input.edit {
+        width: 18em;
+        padding: .35em 22px .35em .1em;
     }
 
-    ul {
-        margin-top: 0.5em;
+    input.button {
+        background: transparent url(images/search.png) no-repeat 0 0;
+        border-width: 0;
+        width: 19px;
+        height: 14px;
+        text-indent: -99999px;
+        margin-left: -20px;
+        box-shadow: none;
+        padding: 0;
     }
 }
 
-[dir=rtl] #dokuwiki__sitetools {
-    text-align: left;
-
-    form.search {
-        input.edit {
-            padding: .35em .1em .35em 22px;
-        }
+[dir=rtl] form.search {
+    input.edit {
+        padding: .35em .1em .35em 22px;
+    }
 
-        input.button {
-            background-position: 5px 0;
-            margin-left: 0;
-            margin-right: -20px;
-            position: relative;
-        }
+    input.button {
+        background-position: 5px 0;
+        margin-left: 0;
+        margin-right: -20px;
+        position: relative;
     }
 }
 
-#IE7 #dokuwiki__sitetools form.search {
+#IE7 form.search {
     min-height: 1px;
     z-index: 21;
 }
@@ -278,13 +278,10 @@
 /* sidebar
 ********************************************************************/
 
-#dokuwiki__aside {
-
-    > .pad {
-        font-size: 0.875em;
-        overflow: hidden;
-        word-wrap: break-word;
-    }
+.dokuwiki .aside {
+    font-size: 0.875em;
+    overflow: hidden;
+    word-wrap: break-word;
 
     /* make sidebar more condensed */
 
@@ -340,8 +337,8 @@
     }
 }
 
-[dir=rtl] #dokuwiki__aside ul,
-[dir=rtl] #dokuwiki__aside ol {
+[dir=rtl] .dokuwiki .aside ul,
+[dir=rtl] .dokuwiki .aside ol {
     padding-right: .5em;
 }
 
diff --git a/lib/tpl/dokuwiki/css/mobile.less b/lib/tpl/dokuwiki/css/mobile.less
index 0fbd0e8fe606bcd60e36578b3a3e64fe14611ea3..75ae5dbe4139374f7d33e7a786250d6ca59760d7 100644
--- a/lib/tpl/dokuwiki/css/mobile.less
+++ b/lib/tpl/dokuwiki/css/mobile.less
@@ -105,6 +105,15 @@
     overflow: auto;
 }
 
+/* push pagetools closer to content */
+#dokuwiki__pagetools {
+    top: 0;
+}
+.showSidebar #dokuwiki__pagetools {
+    top: 3.5em;
+}
+
+
 /* _edit */
 .dokuwiki div.section_highlight {
     margin: 0 -1em;
@@ -299,5 +308,17 @@ body {
 }
 
 
+} /* /@media */
+
+
+/* for screen heights smaller than the pagetools permit
+********************************************************************/
+@media only screen and (max-height: 400px) {
+// 400px is only roughly the required value, this may be wrong under non-standard circumstances
+
+#dokuwiki__pagetools div.tools {
+    position: static;
+}
+
 
 } /* /@media */
diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php
index 3bc46406a8435ad771adc396ae54dc9d6e4bf828..44fef81ebad5e67a7cf387c31646831fb3b0a7cd 100644
--- a/lib/tpl/dokuwiki/main.php
+++ b/lib/tpl/dokuwiki/main.php
@@ -36,7 +36,7 @@ $showSidebar = $hasSidebar && ($ACT=='show');
 
             <?php if($showSidebar): ?>
                 <!-- ********** ASIDE ********** -->
-                <div id="dokuwiki__aside"><div class="pad include group">
+                <div id="dokuwiki__aside"><div class="pad aside include group">
                     <h3 class="toggle"><?php echo $lang['sidebar'] ?></h3>
                     <div class="content">
                         <?php tpl_flush() ?>