diff --git a/_test/cases/inc/remote.test.php b/_test/cases/inc/remote.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..f03d13ce1453c30280e0123f8ed139450f952428
--- /dev/null
+++ b/_test/cases/inc/remote.test.php
@@ -0,0 +1,324 @@
+<?php
+
+require_once DOKU_INC . 'inc/init.php';
+require_once DOKU_INC . 'inc/RemoteAPICore.php';
+require_once DOKU_INC . 'inc/auth/basic.class.php';
+
+Mock::generate('Doku_Plugin_Controller');
+
+class MockAuth extends auth_basic {
+    function isCaseSensitive() { return true; }
+}
+
+class RemoteAPICoreTest {
+
+    function __getRemoteInfo() {
+        return array(
+            'wiki.stringTestMethod' => array(
+                'args' => array(),
+                'return' => 'string',
+                'doc' => 'Test method',
+                'name' => 'stringTestMethod',
+            ), 'wiki.intTestMethod' => array(
+                'args' => array(),
+                'return' => 'int',
+                'doc' => 'Test method',
+                'name' => 'intTestMethod',
+            ), 'wiki.floatTestMethod' => array(
+                'args' => array(),
+                'return' => 'float',
+                'doc' => 'Test method',
+                'name' => 'floatTestMethod',
+            ), 'wiki.dateTestMethod' => array(
+                'args' => array(),
+                'return' => 'date',
+                'doc' => 'Test method',
+                'name' => 'dateTestMethod',
+            ), 'wiki.fileTestMethod' => array(
+                'args' => array(),
+                'return' => 'file',
+                'doc' => 'Test method',
+                'name' => 'fileTestMethod',
+            ), 'wiki.voidTestMethod' => array(
+                'args' => array(),
+                'return' => 'void',
+                'doc' => 'Test method',
+                'name' => 'voidTestMethod',
+            ),  'wiki.oneStringArgMethod' => array(
+                'args' => array('string'),
+                'return' => 'string',
+                'doc' => 'Test method',
+                'name' => 'oneStringArgMethod',
+            ), 'wiki.twoArgMethod' => array(
+                'args' => array('string', 'int'),
+                'return' => 'array',
+                'doc' => 'Test method',
+                'name' => 'twoArgMethod',
+            ), 'wiki.twoArgWithDefaultArg' => array(
+                'args' => array('string', 'string'),
+                'return' => 'string',
+                'doc' => 'Test method',
+                'name' => 'twoArgWithDefaultArg',
+            ), 'wiki.publicCall' => array(
+                'args' => array(),
+                'return' => 'boolean',
+                'doc' => 'testing for public access',
+                'name' => 'publicCall',
+                'public' => 1
+            )
+        );
+    }
+    function stringTestMethod() { return 'success'; }
+    function intTestMethod() { return 42; }
+    function floatTestMethod() { return 3.14159265; }
+    function dateTestMethod() { return 2623452346; }
+    function fileTestMethod() { return 'file content'; }
+    function voidTestMethod() { return null; }
+    function oneStringArgMethod($arg) {return $arg; }
+    function twoArgMethod($string, $int) { return array($string, $int); }
+    function twoArgWithDefaultArg($string1, $string2 = 'default') { return array($string1, $string2); }
+    function publicCall() {return true;}
+
+}
+
+class remote_plugin_testplugin extends DokuWiki_Remote_Plugin {
+    function _getMethods() {
+        return array(
+            'method1' => array(
+                'args' => array(),
+                'return' => 'void'
+            ), 'methodString' => array(
+                'args' => array(),
+                'return' => 'string'
+            ), 'method2' => array(
+                'args' => array('string', 'int'),
+                'return' => 'array',
+                'name' => 'method2',
+            ), 'method2ext' => array(
+                'args' => array('string', 'int', 'bool'),
+                'return' => 'array',
+                'name' => 'method2',
+            ), 'publicCall' => array(
+                'args' => array(),
+                'return' => 'boolean',
+                'doc' => 'testing for public access',
+                'name' => 'publicCall',
+                'public' => 1
+            )
+        );
+    }
+
+    function method1() { return null; }
+    function methodString() { return 'success'; }
+    function method2($str, $int, $bool = false) { return array($str, $int, $bool); }
+    function publicCall() {return true;}
+
+}
+
+
+class remote_test extends UnitTestCase {
+
+    var $originalConf;
+    var $userinfo;
+
+    var $remote;
+
+    function setUp() {
+        global $plugin_controller;
+        global $conf;
+        global $USERINFO;
+        global $auth;
+
+        parent::setUp();
+        $pluginManager = new MockDoku_Plugin_Controller();
+        $pluginManager->setReturnValue('getList', array('testplugin'));
+        $pluginManager->setReturnValue('load', new remote_plugin_testplugin());
+        $plugin_controller = $pluginManager;
+
+        $this->originalConf = $conf;
+        $conf['remote'] = 1;
+        $conf['remoteuser'] = '!!not set!!';
+        $conf['useacl'] = 0;
+
+        $this->userinfo = $USERINFO;
+        $this->remote = new RemoteAPI();
+
+        $auth = new MockAuth();
+    }
+
+    function tearDown() {
+        global $conf;
+        global $USERINFO;
+        $conf = $this->originalConf;
+        $USERINFO = $this->userinfo;
+
+    }
+
+    function test_pluginMethods() {
+        $methods = $this->remote->getPluginMethods();
+        $actual = array_keys($methods);
+        sort($actual);
+        $expect = array('plugin.testplugin.method1', 'plugin.testplugin.method2', 'plugin.testplugin.methodString', 'plugin.testplugin.method2ext', 'plugin.testplugin.publicCall');
+        sort($expect);
+        $this->assertEqual($expect,$actual);
+    }
+
+    function test_hasAccessSuccess() {
+        $this->assertTrue($this->remote->hasAccess());
+    }
+
+    function test_hasAccessFail() {
+        global $conf;
+        $conf['remote'] = 0;
+        $this->assertFalse($this->remote->hasAccess());
+    }
+
+    function test_hasAccessFailAcl() {
+        global $conf;
+        $conf['useacl'] = 1;
+        $this->assertFalse($this->remote->hasAccess());
+    }
+
+    function test_hasAccessSuccessAclEmptyRemoteUser() {
+        global $conf;
+        $conf['useacl'] = 1;
+        $conf['remoteuser'] = '';
+
+        $this->assertTrue($this->remote->hasAccess());
+    }
+
+    function test_hasAccessSuccessAcl() {
+        global $conf;
+        global $USERINFO;
+        $conf['useacl'] = 1;
+        $conf['remoteuser'] = '@grp,@grp2';
+        $USERINFO['grps'] = array('grp');
+        $this->assertTrue($this->remote->hasAccess());
+    }
+
+    function test_hasAccessFailAcl2() {
+        global $conf;
+        global $USERINFO;
+        $conf['useacl'] = 1;
+        $conf['remoteuser'] = '@grp';
+        $USERINFO['grps'] = array('grp1');
+
+        $this->assertFalse($this->remote->hasAccess());
+    }
+
+
+    function test_forceAccessSuccess() {
+        global $conf;
+        $conf['remote'] = 1;
+        $this->remote->forceAccess(); // no exception should occur
+    }
+
+    function test_forceAccessFail() {
+        global $conf;
+        $conf['remote'] = 0;
+        $this->expectException('RemoteException');
+        $this->remote->forceAccess();
+    }
+
+    function test_generalCoreFunctionWithoutArguments() {
+        global $conf;
+        $conf['remote'] = 1;
+        $remoteApi = new RemoteApi();
+        $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+        $this->assertEqual($remoteApi->call('wiki.stringTestMethod'), 'success');
+        $this->assertEqual($remoteApi->call('wiki.intTestMethod'), 42);
+        $this->assertEqual($remoteApi->call('wiki.floatTestMethod'), 3.14159265);
+        $this->assertEqual($remoteApi->call('wiki.dateTestMethod'), 2623452346);
+        $this->assertEqual($remoteApi->call('wiki.fileTestMethod'), 'file content');
+        $this->assertEqual($remoteApi->call('wiki.voidTestMethod'), null);
+    }
+
+    function test_generalCoreFunctionOnArgumentMismatch() {
+        global $conf;
+        $conf['remote'] = 1;
+        $remoteApi = new RemoteApi();
+        $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+        $this->expectException('RemoteException');
+        $remoteApi->call('wiki.voidTestMethod', array('something'));
+    }
+
+    function test_generalCoreFunctionWithArguments() {
+        global $conf;
+        $conf['remote'] = 1;
+
+        $remoteApi = new RemoteApi();
+        $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+        $this->assertEqual($remoteApi->call('wiki.oneStringArgMethod', array('string')), 'string');
+        $this->assertEqual($remoteApi->call('wiki.twoArgMethod', array('string', 1)), array('string' , 1));
+        $this->assertEqual($remoteApi->call('wiki.twoArgWithDefaultArg', array('string')), array('string', 'default'));
+        $this->assertEqual($remoteApi->call('wiki.twoArgWithDefaultArg', array('string', 'another')), array('string', 'another'));
+    }
+
+    function test_pluginCallMethods() {
+        global $conf;
+        $conf['remote'] = 1;
+
+        $remoteApi = new RemoteApi();
+        $this->assertEqual($remoteApi->call('plugin.testplugin.method1'), null);
+        $this->assertEqual($remoteApi->call('plugin.testplugin.method2', array('string', 7)), array('string', 7, false));
+        $this->assertEqual($remoteApi->call('plugin.testplugin.method2ext', array('string', 7, true)), array('string', 7, true));
+        $this->assertEqual($remoteApi->call('plugin.testplugin.methodString'), 'success');
+    }
+
+    function test_notExistingCall() {
+        global $conf;
+        $conf['remote'] = 1;
+
+        $remoteApi = new RemoteApi();
+        $this->expectException('RemoteException');
+        $remoteApi->call('dose not exist');
+    }
+
+    function test_publicCallCore() {
+        global $conf;
+        $conf['useacl'] = 1;
+        $remoteApi = new RemoteApi();
+        $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+        $this->assertTrue($remoteApi->call('wiki.publicCall'));
+    }
+
+    function test_publicCallPlugin() {
+        global $conf;
+        $conf['useacl'] = 1;
+        $remoteApi = new RemoteApi();
+        $this->assertTrue($remoteApi->call('plugin.testplugin.publicCall'));
+    }
+
+    function test_publicCallCoreDeny() {
+        global $conf;
+        $conf['useacl'] = 1;
+        $remoteApi = new RemoteApi();
+        $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+        $this->expectException('RemoteAccessDeniedException');
+        $remoteApi->call('wiki.stringTestMethod');
+    }
+
+    function test_publicCallPluginDeny() {
+        global $conf;
+        $conf['useacl'] = 1;
+        $remoteApi = new RemoteApi();
+        $this->expectException('RemoteAccessDeniedException');
+        $remoteApi->call('plugin.testplugin.methodString');
+    }
+
+    function test_pluginCallCustomPath() {
+        global $EVENT_HANDLER;
+        $EVENT_HANDLER->register_hook('RPC_CALL_ADD', 'BEFORE', &$this, 'pluginCallCustomPathRegister');
+
+        $remoteApi = new RemoteAPI();
+        $result = $remoteApi->call('custom.path');
+        $this->assertEqual($result, 'success');
+    }
+
+    function pluginCallCustomPathRegister(&$event, $param) {
+        $event->data['custom.path'] = array('testplugin', 'methodString');
+    }
+}
diff --git a/_test/index.php b/_test/index.php
index f59c44cf43bd7a8397368bc4c3bb548a2d2169c2..64ece47624db320c0850c9dfe81a52273d35d2de 100644
--- a/_test/index.php
+++ b/_test/index.php
@@ -11,7 +11,7 @@ if(@file_exists(DOKU_CONF.'local.php')){ require_once(DOKU_CONF.'local.php'); }
 $conf['lang'] = 'en'; 
 define('TEST_ROOT', dirname(__FILE__));
 define('TMPL_FILESCHEME_PATH', TEST_ROOT . '/filescheme/');
-error_reporting(E_ALL);
+error_reporting(E_ALL & ~E_DEPRECATED);
 
 set_time_limit(600);
 ini_set('memory_limit','128M');
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index 8da818638459f2385691f42bbe1ee929caec9ce8..fd89a90ede428db9a4b5b7e843c03e1a0dc32ec2 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -81,8 +81,8 @@ $conf['sneaky_index']   = 0;             //check for namespace read permission i
 $conf['auth_security_timeout'] = 900;    //time (seconds) auth data is considered valid, set to 0 to recheck on every page view
 $conf['securecookie'] = 1;               //never send HTTPS cookies via HTTP
 
-$conf['xmlrpc']      = 0;                //Enable/disable XML-RPC interface
-$conf['xmlrpcuser']  = '!!not set!!';    //Restrict XML-RPC access to this groups/users
+$conf['remote']      = 0;                //Enable/disable remote interfaces
+$conf['remoteuser']  = '!!not set !!';   //user/groups that have access to remote interface (comma separated)
 
 /* Advanced Options */
 
diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php
index 80b534b2e1dda2228030fdfdbfbc53f9815988a9..d1e87781311d7b6c82220b6e2c00e18d9a47acd1 100644
--- a/inc/IXR_Library.php
+++ b/inc/IXR_Library.php
@@ -302,11 +302,12 @@ class IXR_Server {
     }
     function serve($data = false) {
         if (!$data) {
-            global $HTTP_RAW_POST_DATA;
-            if (!$HTTP_RAW_POST_DATA) {
+
+            $postData = trim(http_get_raw_post_data());
+            if (!$postData) {
                 die('XML-RPC server accepts POST requests only.');
             }
-            $data = $HTTP_RAW_POST_DATA;
+            $data = $postData;
         }
         $this->message = new IXR_Message($data);
         if (!$this->message->parse()) {
diff --git a/inc/RemoteAPICore.php b/inc/RemoteAPICore.php
new file mode 100644
index 0000000000000000000000000000000000000000..450c6f39eacc4b82b81619354fd732033515cf9f
--- /dev/null
+++ b/inc/RemoteAPICore.php
@@ -0,0 +1,767 @@
+<?php
+
+/**
+ * Increased whenever the API is changed
+ */
+define('DOKU_API_VERSION', 7);
+
+class RemoteAPICore {
+
+    private $api;
+
+    public function __construct(RemoteAPI $api) {
+        $this->api = $api;
+    }
+
+    function __getRemoteInfo() {
+        return array(
+            'dokuwiki.getVersion' => array(
+                'args' => array(),
+                'return' => 'string',
+                'doc' => 'Returns the running DokuWiki version.'
+            ), 'dokuwiki.login' => array(
+                'args' => array('string', 'string'),
+                'return' => 'int',
+                'doc' => 'Tries to login with the given credentials and sets auth cookies.',
+                'public' => '1'
+            ), 'dokuwiki.getPagelist' => array(
+                'args' => array('string', 'array'),
+                'return' => 'array',
+                'doc' => 'List all pages within the given namespace.',
+                'name' => 'readNamespace'
+            ), 'dokuwiki.search' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Perform a fulltext search and return a list of matching pages'
+            ), 'dokuwiki.getTime' => array(
+                'args' => array(),
+                'return' => 'int',
+                'doc' =>  'Returns the current time at the remote wiki server as Unix timestamp.',
+            ), 'dokuwiki.setLocks' => array(
+                'args' => array('array'),
+                'return' => 'array',
+                'doc' => 'Lock or unlock pages.'
+            ), 'dokuwiki.getTitle' => array(
+                'args' => array(),
+                'return' => 'string',
+                'doc' => 'Returns the wiki title.'
+            ), 'dokuwiki.appendPage' => array(
+                'args' => array('string', 'string', 'array'),
+                'return' => 'int',
+                'doc' => 'Append text to a wiki page.'
+            ),  'wiki.getPage' => array(
+                'args' => array('string'),
+                'return' => 'string',
+                'doc' => 'Get the raw Wiki text of page, latest version.',
+                'name' => 'rawPage',
+            ), 'wiki.getPageVersion' => array(
+                'args' => array('string', 'int'),
+                'name' => 'rawPage',
+                'return' => 'string',
+                'doc' => 'Return a raw wiki page'
+            ), 'wiki.getPageHTML' => array(
+                'args' => array('string'),
+                'return' => 'string',
+                'doc' => 'Return page in rendered HTML, latest version.',
+                'name' => 'htmlPage'
+            ), 'wiki.getPageHTMLVersion' => array(
+                'args' => array('string', 'int'),
+                'return' => 'string',
+                'doc' => 'Return page in rendered HTML.',
+                'name' => 'htmlPage'
+            ), 'wiki.getAllPages' => array(
+                'args' => array(),
+                'return' => 'array',
+                'doc' => 'Returns a list of all pages. The result is an array of utf8 pagenames.',
+                'name' => 'listPages'
+            ), 'wiki.getAttachments' => array(
+                'args' => array('string', 'array'),
+                'return' => 'array',
+                'doc' => 'Returns a list of all media files.',
+                'name' => 'listAttachments'
+            ), 'wiki.getBackLinks' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Returns the pages that link to this page.',
+                'name' => 'listBackLinks'
+            ), 'wiki.getPageInfo' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Returns a struct with infos about the page.',
+                'name' => 'pageInfo'
+            ), 'wiki.getPageInfoVersion' => array(
+                'args' => array('string', 'int'),
+                'return' => 'array',
+                'doc' => 'Returns a struct with infos about the page.',
+                'name' => 'pageInfo'
+            ), 'wiki.getPageVersions' => array(
+                'args' => array('string', 'int'),
+                'return' => 'array',
+                'doc' => 'Returns the available revisions of the page.',
+                'name' => 'pageVersions'
+            ), 'wiki.putPage' => array(
+                'args' => array('string', 'string', 'array'),
+                'return' => 'int',
+                'doc' => 'Saves a wiki page.'
+            ), 'wiki.listLinks' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Lists all links contained in a wiki page.'
+            ), 'wiki.getRecentChanges' => array(
+                'args' => array('int'),
+                'return' => 'array',
+                'Returns a struct about all recent changes since given timestamp.'
+            ), 'wiki.getRecentMediaChanges' => array(
+                'args' => array('int'),
+                'return' => 'array',
+                'Returns a struct about all recent media changes since given timestamp.'
+            ), 'wiki.aclCheck' => array(
+                'args' => array('string'),
+                'return' => 'int',
+                'doc' => 'Returns the permissions of a given wiki page.'
+            ), 'wiki.putAttachment' => array(
+                'args' => array('string', 'file', 'array'),
+                'return' => 'array',
+                'doc' => 'Upload a file to the wiki.'
+            ), 'wiki.deleteAttachment' => array(
+                'args' => array('string'),
+                'return' => 'int',
+                'doc' => 'Delete a file from the wiki.'
+            ), 'wiki.getAttachment' => array(
+                'args' => array('string'),
+                'doc' => 'Return a media file',
+                'return' => 'file',
+                'name' => 'getAttachment',
+            ), 'wiki.getAttachmentInfo' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Returns a struct with infos about the attachment.'
+            ), 'dokuwiki.getXMLRPCAPIVersion' => array(
+                'args' => array(),
+                'name' => 'getAPIVersion',
+                'return' => 'int',
+                'doc' => 'Returns the XMLRPC API version.',
+                'public' => '1',
+            ), 'wiki.getRPCVersionSupported' => array(
+                'args' => array(),
+                'name' => 'wiki_RPCVersion',
+                'return' => 'int',
+                'doc' => 'Returns 2 with the supported RPC API version.',
+                'public' => '1'
+            ),
+
+        );
+    }
+
+    function getVersion() {
+        return getVersion();
+    }
+
+    function getTime() {
+        return time();
+    }
+
+    /**
+     * Return a raw wiki page
+     * @param string $id wiki page id
+     * @param string $rev revision number of the page
+     * @return page text.
+     */
+    function rawPage($id,$rev=''){
+        $id = cleanID($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this file', 111);
+        }
+        $text = rawWiki($id,$rev);
+        if(!$text) {
+            return pageTemplate($id);
+        } else {
+            return $text;
+        }
+    }
+
+    /**
+     * Return a media file
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     * @param string $id file id
+     * @return media file
+     */
+    function getAttachment($id){
+        $id = cleanID($id);
+        if (auth_quickaclcheck(getNS($id).':*') < AUTH_READ) {
+            throw new RemoteAccessDeniedException('You are not allowed to read this file', 211);
+        }
+
+        $file = mediaFN($id);
+        if (!@ file_exists($file)) {
+            throw new RemoteException('The requested file does not exist', 221);
+        }
+
+        $data = io_readFile($file, false);
+        return $this->api->toFile($data);
+    }
+
+    /**
+     * Return info about a media file
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     */
+    function getAttachmentInfo($id){
+        $id = cleanID($id);
+        $info = array(
+            'lastModified' => $this->api->toDate(0),
+            'size' => 0,
+        );
+
+        $file = mediaFN($id);
+        if ((auth_quickaclcheck(getNS($id).':*') >= AUTH_READ) && file_exists($file)){
+            $info['lastModified'] = $this->api->toDate(filemtime($file));
+            $info['size'] = filesize($file);
+        }
+
+        return $info;
+    }
+
+    /**
+     * Return a wiki page rendered to html
+     */
+    function htmlPage($id,$rev=''){
+        $id = cleanID($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        return p_wiki_xhtml($id,$rev,false);
+    }
+
+    /**
+     * List all pages - we use the indexer list here
+     */
+    function listPages(){
+        $list  = array();
+        $pages = idx_get_indexer()->getPages();
+        $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
+
+        foreach(array_keys($pages) as $idx) {
+            $perm = auth_quickaclcheck($pages[$idx]);
+            if($perm < AUTH_READ) {
+                continue;
+            }
+            $page = array();
+            $page['id'] = trim($pages[$idx]);
+            $page['perms'] = $perm;
+            $page['size'] = @filesize(wikiFN($pages[$idx]));
+            $page['lastModified'] = $this->api->toDate(@filemtime(wikiFN($pages[$idx])));
+            $list[] = $page;
+        }
+
+        return $list;
+    }
+
+    /**
+     * List all pages in the given namespace (and below)
+     */
+    function readNamespace($ns,$opts){
+        global $conf;
+
+        if(!is_array($opts)) $opts=array();
+
+        $ns = cleanID($ns);
+        $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+        $data = array();
+        $opts['skipacl'] = 0; // no ACL skipping for XMLRPC
+        search($data, $conf['datadir'], 'search_allpages', $opts, $dir);
+        return $data;
+    }
+
+    /**
+     * List all pages in the given namespace (and below)
+     */
+    function search($query){
+        $regex = '';
+        $data  = ft_pageSearch($query,$regex);
+        $pages = array();
+
+        // prepare additional data
+        $idx = 0;
+        foreach($data as $id => $score){
+            $file = wikiFN($id);
+
+            if($idx < FT_SNIPPET_NUMBER){
+                $snippet = ft_snippet($id,$regex);
+                $idx++;
+            }else{
+                $snippet = '';
+            }
+
+            $pages[] = array(
+                'id'      => $id,
+                'score'   => intval($score),
+                'rev'     => filemtime($file),
+                'mtime'   => filemtime($file),
+                'size'    => filesize($file),
+                'snippet' => $snippet,
+            );
+        }
+        return $pages;
+    }
+
+    /**
+     * Returns the wiki title.
+     */
+    function getTitle(){
+        global $conf;
+        return $conf['title'];
+    }
+
+    /**
+     * List all media files.
+     *
+     * Available options are 'recursive' for also including the subnamespaces
+     * in the listing, and 'pattern' for filtering the returned files against
+     * a regular expression matching their name.
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     */
+    function listAttachments($ns, $options = array()) {
+        global $conf;
+
+        $ns = cleanID($ns);
+
+        if (!is_array($options)) $options = array();
+        $options['skipacl'] = 0; // no ACL skipping for XMLRPC
+
+
+        if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
+            $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+
+            $data = array();
+            search($data, $conf['mediadir'], 'search_media', $options, $dir);
+            $len = count($data);
+            if(!$len) return array();
+
+            for($i=0; $i<$len; $i++) {
+                unset($data[$i]['meta']);
+                $data[$i]['lastModified'] = $this->api->toDate($data[$i]['mtime']);
+            }
+            return $data;
+        } else {
+            throw new RemoteAccessDeniedException('You are not allowed to list media files.', 215);
+        }
+    }
+
+    /**
+     * Return a list of backlinks
+     */
+    function listBackLinks($id){
+        return ft_backlinks(cleanID($id));
+    }
+
+    /**
+     * Return some basic data about a page
+     */
+    function pageInfo($id,$rev=''){
+        $id = cleanID($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        $file = wikiFN($id,$rev);
+        $time = @filemtime($file);
+        if(!$time){
+            throw new RemoteException(10, 'The requested page does not exist', 121);
+        }
+
+        $info = getRevisionInfo($id, $time, 1024);
+
+        $data = array(
+            'name'         => $id,
+            'lastModified' => $this->api->toDate($time),
+            'author'       => (($info['user']) ? $info['user'] : $info['ip']),
+            'version'      => $time
+        );
+
+        return ($data);
+    }
+
+    /**
+     * Save a wiki page
+     *
+     * @author Michael Klier <chi@chimeric.de>
+     */
+    function putPage($id, $text, $params) {
+        global $TEXT;
+        global $lang;
+
+        $id    = cleanID($id);
+        $TEXT  = cleanText($text);
+        $sum   = $params['sum'];
+        $minor = $params['minor'];
+
+        if(empty($id)) {
+            throw new RemoteException('Empty page ID', 131);
+        }
+
+        if(!page_exists($id) && trim($TEXT) == '' ) {
+            throw new RemoteException('Refusing to write an empty new wiki page', 132);
+        }
+
+        if(auth_quickaclcheck($id) < AUTH_EDIT) {
+            throw new RemoteAccessDeniedException('You are not allowed to edit this page', 112);
+        }
+
+        // Check, if page is locked
+        if(checklock($id)) {
+            throw new RemoteException('The page is currently locked', 133);
+        }
+
+        // SPAM check
+        if(checkwordblock()) {
+            throw new RemoteException('Positive wordblock check', 134);
+        }
+
+        // autoset summary on new pages
+        if(!page_exists($id) && empty($sum)) {
+            $sum = $lang['created'];
+        }
+
+        // autoset summary on deleted pages
+        if(page_exists($id) && empty($TEXT) && empty($sum)) {
+            $sum = $lang['deleted'];
+        }
+
+        lock($id);
+
+        saveWikiText($id,$TEXT,$sum,$minor);
+
+        unlock($id);
+
+        // run the indexer if page wasn't indexed yet
+        idx_addPage($id);
+
+        return 0;
+    }
+
+    /**
+     * Appends text to a wiki page.
+     */
+    function appendPage($id, $text, $params) {
+        $currentpage = $this->rawPage($id);
+        if (!is_string($currentpage)) {
+            return $currentpage;
+        }
+        return $this->putPage($id, $currentpage.$text, $params);
+    }
+
+    /**
+     * Uploads a file to the wiki.
+     *
+     * Michael Klier <chi@chimeric.de>
+     */
+    function putAttachment($id, $file, $params) {
+        $id = cleanID($id);
+        $auth = auth_quickaclcheck(getNS($id).':*');
+
+        if(!isset($id)) {
+            throw new RemoteException('Filename not given.', 231);
+        }
+
+        global $conf;
+
+        $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
+
+        // save temporary file
+        @unlink($ftmp);
+        io_saveFile($ftmp, $file->getValue());
+
+        $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename');
+        if (is_array($res)) {
+            throw new RemoteException($res[0], -$res[1]);
+        } else {
+            return $res;
+        }
+    }
+
+    /**
+     * Deletes a file from the wiki.
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     */
+    function deleteAttachment($id){
+        $id = cleanID($id);
+        $auth = auth_quickaclcheck(getNS($id).':*');
+        $res = media_delete($id, $auth);
+        if ($res & DOKU_MEDIA_DELETED) {
+            return 0;
+        } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
+            throw new RemoteAccessDeniedException('You don\'t have permissions to delete files.', 212);
+        } elseif ($res & DOKU_MEDIA_INUSE) {
+            throw new RemoteException('File is still referenced', 232);
+        } else {
+            throw new RemoteException('Could not delete file', 233);
+        }
+    }
+
+    /**
+    * Returns the permissions of a given wiki page
+    */
+    function aclCheck($id) {
+        $id = cleanID($id);
+        return auth_quickaclcheck($id);
+    }
+
+    /**
+     * Lists all links contained in a wiki page
+     *
+     * @author Michael Klier <chi@chimeric.de>
+     */
+    function listLinks($id) {
+        $id = cleanID($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        $links = array();
+
+        // resolve page instructions
+        $ins   = p_cached_instructions(wikiFN($id));
+
+        // instantiate new Renderer - needed for interwiki links
+        include(DOKU_INC.'inc/parser/xhtml.php');
+        $Renderer = new Doku_Renderer_xhtml();
+        $Renderer->interwiki = getInterwiki();
+
+        // parse parse instructions
+        foreach($ins as $in) {
+            $link = array();
+            switch($in[0]) {
+                case 'internallink':
+                    $link['type'] = 'local';
+                    $link['page'] = $in[1][0];
+                    $link['href'] = wl($in[1][0]);
+                    array_push($links,$link);
+                    break;
+                case 'externallink':
+                    $link['type'] = 'extern';
+                    $link['page'] = $in[1][0];
+                    $link['href'] = $in[1][0];
+                    array_push($links,$link);
+                    break;
+                case 'interwikilink':
+                    $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]);
+                    $link['type'] = 'extern';
+                    $link['page'] = $url;
+                    $link['href'] = $url;
+                    array_push($links,$link);
+                    break;
+            }
+        }
+
+        return ($links);
+    }
+
+    /**
+     * Returns a list of recent changes since give timestamp
+     *
+     * @author Michael Hamann <michael@content-space.de>
+     * @author Michael Klier <chi@chimeric.de>
+     */
+    function getRecentChanges($timestamp) {
+        if(strlen($timestamp) != 10) {
+            throw new RemoteException('The provided value is not a valid timestamp', 311);
+        }
+
+        $recents = getRecentsSince($timestamp);
+
+        $changes = array();
+
+        foreach ($recents as $recent) {
+            $change = array();
+            $change['name']         = $recent['id'];
+            $change['lastModified'] = $this->api->toDate($recent['date']);
+            $change['author']       = $recent['user'];
+            $change['version']      = $recent['date'];
+            $change['perms']        = $recent['perms'];
+            $change['size']         = @filesize(wikiFN($recent['id']));
+            array_push($changes, $change);
+        }
+
+        if (!empty($changes)) {
+            return $changes;
+        } else {
+            // in case we still have nothing at this point
+            return new RemoteException('There are no changes in the specified timeframe', 321);
+        }
+    }
+
+    /**
+     * Returns a list of recent media changes since give timestamp
+     *
+     * @author Michael Hamann <michael@content-space.de>
+     * @author Michael Klier <chi@chimeric.de>
+     */
+    function getRecentMediaChanges($timestamp) {
+        if(strlen($timestamp) != 10)
+            throw new RemoteException('The provided value is not a valid timestamp', 311);
+
+        $recents = getRecentsSince($timestamp, null, '', RECENTS_MEDIA_CHANGES);
+
+        $changes = array();
+
+        foreach ($recents as $recent) {
+            $change = array();
+            $change['name']         = $recent['id'];
+            $change['lastModified'] = $this->api->toDate($recent['date']);
+            $change['author']       = $recent['user'];
+            $change['version']      = $recent['date'];
+            $change['perms']        = $recent['perms'];
+            $change['size']         = @filesize(mediaFN($recent['id']));
+            array_push($changes, $change);
+        }
+
+        if (!empty($changes)) {
+            return $changes;
+        } else {
+            // in case we still have nothing at this point
+            throw new RemoteException('There are no changes in the specified timeframe', 321);
+        }
+    }
+
+    /**
+     * Returns a list of available revisions of a given wiki page
+     *
+     * @author Michael Klier <chi@chimeric.de>
+     */
+    function pageVersions($id, $first) {
+        $id = cleanID($id);
+        if(auth_quickaclcheck($id) < AUTH_READ) {
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        global $conf;
+
+        $versions = array();
+
+        if(empty($id)) {
+            throw new RemoteException('Empty page ID', 131);
+        }
+
+        $revisions = getRevisions($id, $first, $conf['recent']+1);
+
+        if(count($revisions)==0 && $first!=0) {
+            $first=0;
+            $revisions = getRevisions($id, $first, $conf['recent']+1);
+        }
+
+        if(count($revisions)>0 && $first==0) {
+            array_unshift($revisions, '');  // include current revision
+            array_pop($revisions);          // remove extra log entry
+        }
+
+        if(count($revisions) > $conf['recent']) {
+            array_pop($revisions); // remove extra log entry
+        }
+
+        if(!empty($revisions)) {
+            foreach($revisions as $rev) {
+                $file = wikiFN($id,$rev);
+                $time = @filemtime($file);
+                // we check if the page actually exists, if this is not the
+                // case this can lead to less pages being returned than
+                // specified via $conf['recent']
+                if($time){
+                    $info = getRevisionInfo($id, $time, 1024);
+                    if(!empty($info)) {
+                        $data['user'] = $info['user'];
+                        $data['ip']   = $info['ip'];
+                        $data['type'] = $info['type'];
+                        $data['sum']  = $info['sum'];
+                        $data['modified'] = $this->api->toDate($info['date']);
+                        $data['version'] = $info['date'];
+                        array_push($versions, $data);
+                    }
+                }
+            }
+            return $versions;
+        } else {
+            return array();
+        }
+    }
+
+    /**
+     * The version of Wiki RPC API supported
+     */
+    function wiki_RPCVersion(){
+        return 2;
+    }
+
+
+    /**
+     * Locks or unlocks a given batch of pages
+     *
+     * Give an associative array with two keys: lock and unlock. Both should contain a
+     * list of pages to lock or unlock
+     *
+     * Returns an associative array with the keys locked, lockfail, unlocked and
+     * unlockfail, each containing lists of pages.
+     */
+    function setLocks($set){
+        $locked     = array();
+        $lockfail   = array();
+        $unlocked   = array();
+        $unlockfail = array();
+
+        foreach((array) $set['lock'] as $id){
+            $id = cleanID($id);
+            if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
+                $lockfail[] = $id;
+            }else{
+                lock($id);
+                $locked[] = $id;
+            }
+        }
+
+        foreach((array) $set['unlock'] as $id){
+            $id = cleanID($id);
+            if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
+                $unlockfail[] = $id;
+            }else{
+                $unlocked[] = $id;
+            }
+        }
+
+        return array(
+            'locked'     => $locked,
+            'lockfail'   => $lockfail,
+            'unlocked'   => $unlocked,
+            'unlockfail' => $unlockfail,
+        );
+    }
+
+    function getAPIVersion(){
+        return DOKU_API_VERSION;
+    }
+
+    function login($user,$pass){
+        global $conf;
+        global $auth;
+        if(!$conf['useacl']) return 0;
+        if(!$auth) return 0;
+
+        @session_start(); // reopen session for login
+        if($auth->canDo('external')){
+            $ok = $auth->trustExternal($user,$pass,false);
+        }else{
+            $evdata = array(
+                'user'     => $user,
+                'password' => $pass,
+                'sticky'   => false,
+                'silent'   => true,
+            );
+            $ok = trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
+        }
+        session_write_close(); // we're done with the session
+
+        return $ok;
+    }
+
+
+}
+
diff --git a/inc/auth.php b/inc/auth.php
index cd0f612aa8e0cff63b31f5da8bd5ec1c93708cdb..59ef1cb54decae1e7437d7de13ee921f3318a057 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -422,7 +422,7 @@ function auth_isadmin($user=null,$groups=null){
  * @param $memberlist string commaseparated list of allowed users and groups
  * @param $user       string user to match against
  * @param $groups     array  groups the user is member of
- * @returns bool      true for membership acknowledged
+ * @return bool       true for membership acknowledged
  */
 function auth_isMember($memberlist,$user,array $groups){
     global $auth;
diff --git a/inc/httputils.php b/inc/httputils.php
index 0ad97a9a18169261b4dc745c2f9768308837505a..b815f3ca69aa90253637606e0bbc2001e6df6ba2 100644
--- a/inc/httputils.php
+++ b/inc/httputils.php
@@ -249,3 +249,11 @@ function http_cached_finish($file, $content) {
         print $content;
     }
 }
+
+function http_get_raw_post_data() {
+    static $postData = null;
+    if ($postData === null) {
+        $postData = file_get_contents('php://input');
+    }
+    return $postData;
+}
diff --git a/inc/init.php b/inc/init.php
index cfd023e951e1f897daa3654e639376c5a93b4144..d57e12d7b30a5188b1d727d684c9ffe9b10b6758 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -190,7 +190,7 @@ init_paths();
 init_files();
 
 // setup plugin controller class (can be overwritten in preload.php)
-$plugin_types = array('admin','syntax','action','renderer', 'helper');
+$plugin_types = array('admin','syntax','action','renderer', 'helper','remote');
 global $plugin_controller_class, $plugin_controller;
 if (empty($plugin_controller_class)) $plugin_controller_class = 'Doku_Plugin_Controller';
 
diff --git a/inc/load.php b/inc/load.php
index d30397f6ec1da3a21fc7ea802ef2602135b026d4..f3ab5bcdd8ab03fe527588da9c15fd0689529e1e 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -76,10 +76,13 @@ function load_autoload($name){
         'SafeFN'                => DOKU_INC.'inc/SafeFN.class.php',
         'Sitemapper'            => DOKU_INC.'inc/Sitemapper.php',
         'PassHash'              => DOKU_INC.'inc/PassHash.class.php',
+        'RemoteAPI'             => DOKU_INC.'inc/remote.php',
+        'RemoteAPICore'         => DOKU_INC.'inc/RemoteAPICore.php', 
 
         'DokuWiki_Action_Plugin' => DOKU_PLUGIN.'action.php',
         'DokuWiki_Admin_Plugin'  => DOKU_PLUGIN.'admin.php',
         'DokuWiki_Syntax_Plugin' => DOKU_PLUGIN.'syntax.php',
+        'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
 
     );
 
@@ -89,7 +92,7 @@ function load_autoload($name){
     }
 
     // Plugin loading
-    if(preg_match('/^(helper|syntax|action|admin|renderer)_plugin_([^_]+)(?:_([^_]+))?$/',
+    if(preg_match('/^(helper|syntax|action|admin|renderer|remote)_plugin_([^_]+)(?:_([^_]+))?$/',
                   $name, $m)) {
                 //try to load the wanted plugin file
         // include, but be silent. Maybe some other autoloader has an idea
diff --git a/inc/remote.php b/inc/remote.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ef28afd2765e018f56c51e9e98fcb7efe990063
--- /dev/null
+++ b/inc/remote.php
@@ -0,0 +1,253 @@
+<?php
+
+if (!defined('DOKU_INC')) die();
+
+class RemoteException extends Exception {}
+class RemoteAccessDeniedException extends RemoteException {}
+
+/**
+ * This class provides information about remote access to the wiki.
+ *
+ * == Types of methods ==
+ * There are two types of remote methods. The first is the core methods.
+ * These are always available and provided by dokuwiki.
+ * The other is plugin methods. These are provided by remote plugins.
+ *
+ * == Information structure ==
+ * The information about methods will be given in an array with the following structure:
+ * array(
+ *     'method.remoteName' => array(
+ *          'args' => array(
+ *              'type eg. string|int|...|date|file',
+ *          )
+ *          'name' => 'method name in class',
+ *          'return' => 'type',
+ *          'public' => 1/0 - method bypass default group check (used by login)
+ *          ['doc' = 'method documentation'],
+ *     )
+ * )
+ *
+ * plugin names are formed the following:
+ *   core methods begin by a 'dokuwiki' or 'wiki' followed by a . and the method name itself.
+ *   i.e.: dokuwiki.version or wiki.getPage
+ *
+ * plugin methods are formed like 'plugin.<plugin name>.<method name>'.
+ * i.e.: plugin.clock.getTime or plugin.clock_gmt.getTime
+ *
+ * @throws RemoteException
+ */
+class RemoteAPI {
+
+    /**
+     * @var RemoteAPICore
+     */
+    private $coreMethods = null;
+
+    /**
+     * @var array remote methods provided by dokuwiki plugins - will be filled lazy via
+     * {@see RemoteAPI#getPluginMethods}
+     */
+    private $pluginMethods = null;
+
+    /**
+     * @var array contains custom calls to the api. Plugins can use the XML_CALL_REGISTER event.
+     * The data inside is 'custom.call.something' => array('plugin name', 'remote method name')
+     *
+     * The remote method name is the same as in the remote name returned by _getMethods().
+     */
+    private $pluginCustomCalls = null;
+
+    private $dateTransformation;
+    private $fileTransformation;
+
+    public function __construct() {
+        $this->dateTransformation = array($this, 'dummyTransformation');
+        $this->fileTransformation = array($this, 'dummyTransformation');
+    }
+
+    /**
+     * Get all available methods with remote access.
+     *
+     * @return array with information to all available methods
+     */
+    public function getMethods() {
+        return array_merge($this->getCoreMethods(), $this->getPluginMethods());
+    }
+
+    /**
+     * call a method via remote api.
+     *
+     * @param string $method name of the method to call.
+     * @param array $args arguments to pass to the given method
+     * @return mixed result of method call, must be a primitive type.
+     */
+    public function call($method, $args = array()) {
+        if ($args === null) {
+            $args = array();
+        }
+        list($type, $pluginName, $call) = explode('.', $method, 3);
+        if ($type === 'plugin') {
+            return $this->callPlugin($pluginName, $method, $args);
+        }
+        if ($this->coreMethodExist($method)) {
+            return $this->callCoreMethod($method, $args);
+        }
+        return $this->callCustomCallPlugin($method, $args);
+    }
+
+    private function coreMethodExist($name) {
+        $coreMethods = $this->getCoreMethods();
+        return array_key_exists($name, $coreMethods);
+    }
+
+    private function  callCustomCallPlugin($method, $args) {
+        $customCalls = $this->getCustomCallPlugins();
+        if (!array_key_exists($method, $customCalls)) {
+            throw new RemoteException('Method does not exist', -32603);
+        }
+        $customCall = $customCalls[$method];
+        return $this->callPlugin($customCall[0], $customCall[1], $args);
+    }
+
+    private function getCustomCallPlugins() {
+        if ($this->pluginCustomCalls === null) {
+            $data = array();
+            trigger_event('RPC_CALL_ADD', $data);
+            $this->pluginCustomCalls = $data;
+        }
+        return $this->pluginCustomCalls;
+    }
+
+    private function callPlugin($pluginName, $method, $args) {
+        $plugin = plugin_load('remote', $pluginName);
+        $methods = $this->getPluginMethods();
+        if (!$plugin) {
+            throw new RemoteException('Method does not exist', -32603);
+        }
+        $this->checkAccess($methods[$method]);
+        $name = $this->getMethodName($methods, $method);
+        return call_user_func_array(array($plugin, $name), $args);
+    }
+
+    private function callCoreMethod($method, $args) {
+        $coreMethods = $this->getCoreMethods();
+        $this->checkAccess($coreMethods[$method]);
+        if (!isset($coreMethods[$method])) {
+            throw new RemoteException('Method does not exist', -32603);
+        }
+        $this->checkArgumentLength($coreMethods[$method], $args);
+        return call_user_func_array(array($this->coreMethods, $this->getMethodName($coreMethods, $method)), $args);
+    }
+
+    private function checkAccess($methodMeta) {
+        if (!isset($methodMeta['public'])) {
+            $this->forceAccess();
+        } else{
+            if ($methodMeta['public'] == '0') {
+                $this->forceAccess();
+            }
+        }
+    }
+
+    private function checkArgumentLength($method, $args) {
+        if (count($method['args']) < count($args)) {
+            throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
+        }
+    }
+
+    private function getMethodName($methodMeta, $method) {
+        if (isset($methodMeta[$method]['name'])) {
+            return $methodMeta[$method]['name'];
+        }
+        $method = explode('.', $method);
+        return $method[count($method)-1];
+    }
+
+    /**
+     * @return bool true if the current user has access to remote api.
+     */
+    public function hasAccess() {
+        global $conf;
+        global $USERINFO;
+        if (!$conf['remote']) {
+            return false;
+        }
+        if(!$conf['useacl']) {
+            return true;
+        }
+        if(trim($conf['remoteuser']) == '') {
+            return true;
+        }
+
+        return auth_isMember($conf['remoteuser'], $_SERVER['REMOTE_USER'], (array) $USERINFO['grps']);
+    }
+
+    /**
+     * @throws RemoteException On denied access.
+     * @return void
+     */
+    public function forceAccess() {
+        if (!$this->hasAccess()) {
+            throw new RemoteAccessDeniedException('server error. not authorized to call method', -32604);
+        }
+    }
+
+    /**
+     * @return array all plugin methods.
+     */
+    public function getPluginMethods() {
+        if ($this->pluginMethods === null) {
+            $this->pluginMethods = array();
+            $plugins = plugin_list('remote');
+
+            foreach ($plugins as $pluginName) {
+                $plugin = plugin_load('remote', $pluginName);
+                if (!is_subclass_of($plugin, 'DokuWiki_Remote_Plugin')) {
+                    throw new RemoteException("Plugin $pluginName does not implement DokuWiki_Remote_Plugin");
+                }
+
+                $methods = $plugin->_getMethods();
+                foreach ($methods as $method => $meta) {
+                    $this->pluginMethods["plugin.$pluginName.$method"] = $meta;
+                }
+            }
+        }
+        return $this->pluginMethods;
+    }
+
+    /**
+     * @param RemoteAPICore $apiCore this parameter is used for testing. Here you can pass a non-default RemoteAPICore
+     *                               instance. (for mocking)
+     * @return array all core methods.
+     */
+    public function getCoreMethods($apiCore = null) {
+        if ($this->coreMethods === null) {
+            if ($apiCore === null) {
+                $this->coreMethods = new RemoteAPICore($this);
+            } else {
+                $this->coreMethods = $apiCore;
+            }
+        }
+        return $this->coreMethods->__getRemoteInfo();
+    }
+
+    public function toFile($data) {
+        return call_user_func($this->fileTransformation, $data);
+    }
+
+    public function toDate($data) {
+        return call_user_func($this->dateTransformation, $data);
+    }
+
+    public function dummyTransformation($data) {
+        return $data;
+    }
+
+    public function setDateTransformation($dateTransformation) {
+        $this->dateTransformation = $dateTransformation;
+    }
+
+    public function setFileTransformation($fileTransformation) {
+        $this->fileTransformation = $fileTransformation;
+    }
+}
diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php
index 1264ff333be3bce8a26c546de4baa673ba15be0f..cf3682f11b6f3c7e506bff7dc8144001d00b5055 100644
--- a/lib/exe/xmlrpc.php
+++ b/lib/exe/xmlrpc.php
@@ -1,886 +1,51 @@
 <?php
 if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
 
-// fix when '< ?xml' isn't on the very first line
-if(isset($HTTP_RAW_POST_DATA)) $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
-
-/**
- * Increased whenever the API is changed
- */
-define('DOKU_XMLRPC_API_VERSION', 7);
-
 require_once(DOKU_INC.'inc/init.php');
 session_write_close();  //close session
 
-if(!$conf['xmlrpc']) die('XML-RPC server not enabled.');
+if(!$conf['remote']) die('XML-RPC server not enabled.');
 
 /**
  * Contains needed wrapper functions and registers all available
  * XMLRPC functions.
  */
-class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
-    var $methods       = array();
-    var $public_methods = array();
-
-    /**
-     * Checks if the current user is allowed to execute non anonymous methods
-     */
-    function checkAuth(){
-        global $conf;
-        global $USERINFO;
-
-        if(!$conf['useacl']) return true; //no ACL - then no checks
-        if(trim($conf['xmlrpcuser']) == '') return true; //no restrictions
-
-        return auth_isMember($conf['xmlrpcuser'],$_SERVER['REMOTE_USER'],(array) $USERINFO['grps']);
-    }
+class dokuwiki_xmlrpc_server extends IXR_Server {
+    var $remote;
 
     /**
-     * Adds a callback, extends parent method
-     *
-     * add another parameter to define if anonymous access to
-     * this method should be granted.
+     * Constructor. Register methods and run Server
      */
-    function addCallback($method, $callback, $args, $help, $public=false){
-        if($public) $this->public_methods[] = $method;
-        return parent::addCallback($method, $callback, $args, $help);
+    function dokuwiki_xmlrpc_server(){
+        $this->remote = new RemoteAPI();
+        $this->remote->setDateTransformation(array($this, 'toDate'));
+        $this->remote->setFileTransformation(array($this, 'toFile'));
+        $this->IXR_Server();
     }
 
-    /**
-     * Execute a call, extends parent method
-     *
-     * Checks for authentication first
-     */
     function call($methodname, $args){
-        if(!in_array($methodname,$this->public_methods) && !$this->checkAuth()){
+        try {
+            $result = $this->remote->call($methodname, $args);
+            return $result;
+        } catch (RemoteAccessDeniedException $e) {
             if (!isset($_SERVER['REMOTE_USER'])) {
                 header('HTTP/1.1 401 Unauthorized');
             } else {
                 header('HTTP/1.1 403 Forbidden');
             }
-            return new IXR_Error(-32603, 'server error. not authorized to call method "'.$methodname.'".');
-        }
-        return parent::call($methodname, $args);
-    }
-
-    /**
-     * Constructor. Register methods and run Server
-     */
-    function dokuwiki_xmlrpc_server(){
-        $this->IXR_IntrospectionServer();
-
-        /* DokuWiki's own methods */
-        $this->addCallback(
-            'dokuwiki.getXMLRPCAPIVersion',
-            'this:getAPIVersion',
-            array('integer'),
-            'Returns the XMLRPC API version.',
-            true
-        );
-
-        $this->addCallback(
-            'dokuwiki.getVersion',
-            'getVersion',
-            array('string'),
-            'Returns the running DokuWiki version.',
-            true
-        );
-
-        $this->addCallback(
-            'dokuwiki.login',
-            'this:login',
-            array('integer','string','string'),
-            'Tries to login with the given credentials and sets auth cookies.',
-            true
-        );
-
-        $this->addCallback(
-            'dokuwiki.getPagelist',
-            'this:readNamespace',
-            array('struct','string','struct'),
-            'List all pages within the given namespace.'
-        );
-
-        $this->addCallback(
-            'dokuwiki.search',
-            'this:search',
-            array('struct','string'),
-            'Perform a fulltext search and return a list of matching pages'
-        );
-
-        $this->addCallback(
-            'dokuwiki.getTime',
-            'time',
-            array('int'),
-            'Return the current time at the wiki server.'
-        );
-
-        $this->addCallback(
-            'dokuwiki.setLocks',
-            'this:setLocks',
-            array('struct','struct'),
-            'Lock or unlock pages.'
-        );
-
-
-        $this->addCallback(
-            'dokuwiki.getTitle',
-            'this:getTitle',
-            array('string'),
-            'Returns the wiki title.',
-            true
-        );
-
-        $this->addCallback(
-            'dokuwiki.appendPage',
-            'this:appendPage',
-            array('int', 'string', 'string', 'struct'),
-            'Append text to a wiki page.'
-        );
-
-        /* Wiki API v2 http://www.jspwiki.org/wiki/WikiRPCInterface2 */
-        $this->addCallback(
-            'wiki.getRPCVersionSupported',
-            'this:wiki_RPCVersion',
-            array('int'),
-            'Returns 2 with the supported RPC API version.',
-            true
-        );
-        $this->addCallback(
-            'wiki.getPage',
-            'this:rawPage',
-            array('string','string'),
-            'Get the raw Wiki text of page, latest version.'
-        );
-        $this->addCallback(
-            'wiki.getPageVersion',
-            'this:rawPage',
-            array('string','string','int'),
-            'Get the raw Wiki text of page.'
-        );
-        $this->addCallback(
-            'wiki.getPageHTML',
-            'this:htmlPage',
-            array('string','string'),
-            'Return page in rendered HTML, latest version.'
-        );
-        $this->addCallback(
-            'wiki.getPageHTMLVersion',
-            'this:htmlPage',
-            array('string','string','int'),
-            'Return page in rendered HTML.'
-        );
-        $this->addCallback(
-            'wiki.getAllPages',
-            'this:listPages',
-            array('struct'),
-            'Returns a list of all pages. The result is an array of utf8 pagenames.'
-        );
-        $this->addCallback(
-            'wiki.getAttachments',
-            'this:listAttachments',
-            array('struct', 'string', 'struct'),
-            'Returns a list of all media files.'
-        );
-        $this->addCallback(
-            'wiki.getBackLinks',
-            'this:listBackLinks',
-            array('struct','string'),
-            'Returns the pages that link to this page.'
-        );
-        $this->addCallback(
-            'wiki.getPageInfo',
-            'this:pageInfo',
-            array('struct','string'),
-            'Returns a struct with infos about the page.'
-        );
-        $this->addCallback(
-            'wiki.getPageInfoVersion',
-            'this:pageInfo',
-            array('struct','string','int'),
-            'Returns a struct with infos about the page.'
-        );
-        $this->addCallback(
-            'wiki.getPageVersions',
-            'this:pageVersions',
-            array('struct','string','int'),
-            'Returns the available revisions of the page.'
-        );
-        $this->addCallback(
-            'wiki.putPage',
-            'this:putPage',
-            array('int', 'string', 'string', 'struct'),
-            'Saves a wiki page.'
-        );
-        $this->addCallback(
-            'wiki.listLinks',
-            'this:listLinks',
-            array('struct','string'),
-            'Lists all links contained in a wiki page.'
-        );
-        $this->addCallback(
-            'wiki.getRecentChanges',
-            'this:getRecentChanges',
-            array('struct','int'),
-            'Returns a struct about all recent changes since given timestamp.'
-        );
-        $this->addCallback(
-            'wiki.getRecentMediaChanges',
-            'this:getRecentMediaChanges',
-            array('struct','int'),
-            'Returns a struct about all recent media changes since given timestamp.'
-        );
-        $this->addCallback(
-            'wiki.aclCheck',
-            'this:aclCheck',
-            array('int', 'string'),
-            'Returns the permissions of a given wiki page.'
-        );
-        $this->addCallback(
-            'wiki.putAttachment',
-            'this:putAttachment',
-            array('struct', 'string', 'base64', 'struct'),
-            'Upload a file to the wiki.'
-        );
-        $this->addCallback(
-            'wiki.deleteAttachment',
-            'this:deleteAttachment',
-            array('int', 'string'),
-            'Delete a file from the wiki.'
-        );
-        $this->addCallback(
-            'wiki.getAttachment',
-            'this:getAttachment',
-            array('base64', 'string'),
-            'Download a file from the wiki.'
-        );
-        $this->addCallback(
-            'wiki.getAttachmentInfo',
-            'this:getAttachmentInfo',
-            array('struct', 'string'),
-            'Returns a struct with infos about the attachment.'
-        );
-
-        /**
-         * Trigger XMLRPC_CALLBACK_REGISTER, action plugins can use this event
-         * to extend the XMLRPC interface and register their own callbacks.
-         *
-         * Event data:
-         *  The XMLRPC server object:
-         *
-         *  $event->data->addCallback() - register a callback, the second
-         *  paramter has to be of the form "plugin:<pluginname>:<plugin
-         *  method>"
-         *
-         *  $event->data->callbacks - an array which holds all awaylable
-         *  callbacks
-         */
-        trigger_event('XMLRPC_CALLBACK_REGISTER', $this);
-
-        $this->serve();
-    }
-
-    /**
-     * Return a raw wiki page
-     */
-    function rawPage($id,$rev=''){
-        $id = cleanID($id);
-        if(auth_quickaclcheck($id) < AUTH_READ){
-            return new IXR_Error(111, 'You are not allowed to read this page');
-        }
-        $text = rawWiki($id,$rev);
-        if(!$text) {
-            return pageTemplate($id);
-        } else {
-            return $text;
-        }
-    }
-
-    /**
-     * Return a media file encoded in base64
-     *
-     * @author Gina Haeussge <osd@foosel.net>
-     */
-    function getAttachment($id){
-        $id = cleanID($id);
-        if (auth_quickaclcheck(getNS($id).':*') < AUTH_READ)
-            return new IXR_Error(211, 'You are not allowed to read this file');
-
-        $file = mediaFN($id);
-        if (!@ file_exists($file))
-            return new IXR_Error(221, 'The requested file does not exist');
-
-        $data = io_readFile($file, false);
-        $base64 = new IXR_Base64($data);
-        return $base64;
-    }
-
-    /**
-     * Return info about a media file
-     *
-     * @author Gina Haeussge <osd@foosel.net>
-     */
-    function getAttachmentInfo($id){
-        $id = cleanID($id);
-        $info = array(
-            'lastModified' => 0,
-            'size' => 0,
-        );
-
-        $file = mediaFN($id);
-        if ((auth_quickaclcheck(getNS($id).':*') >= AUTH_READ) && file_exists($file)){
-            $info['lastModified'] = new IXR_Date(filemtime($file));
-            $info['size'] = filesize($file);
-        }
-
-        return $info;
-    }
-
-    /**
-     * Return a wiki page rendered to html
-     */
-    function htmlPage($id,$rev=''){
-        $id = cleanID($id);
-        if(auth_quickaclcheck($id) < AUTH_READ){
-            return new IXR_Error(111, 'You are not allowed to read this page');
-        }
-        return p_wiki_xhtml($id,$rev,false);
-    }
-
-    /**
-     * List all pages - we use the indexer list here
-     */
-    function listPages(){
-        $list  = array();
-        $pages = idx_get_indexer()->getPages();
-        $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
-
-        foreach(array_keys($pages) as $idx) {
-            $perm = auth_quickaclcheck($pages[$idx]);
-            if($perm < AUTH_READ) {
-                continue;
-            }
-            $page = array();
-            $page['id'] = trim($pages[$idx]);
-            $page['perms'] = $perm;
-            $page['size'] = @filesize(wikiFN($pages[$idx]));
-            $page['lastModified'] = new IXR_Date(@filemtime(wikiFN($pages[$idx])));
-            $list[] = $page;
-        }
-
-        return $list;
-    }
-
-    /**
-     * List all pages in the given namespace (and below)
-     */
-    function readNamespace($ns,$opts){
-        global $conf;
-
-        if(!is_array($opts)) $opts=array();
-
-        $ns = cleanID($ns);
-        $dir = utf8_encodeFN(str_replace(':', '/', $ns));
-        $data = array();
-        $opts['skipacl'] = 0; // no ACL skipping for XMLRPC
-        search($data, $conf['datadir'], 'search_allpages', $opts, $dir);
-        return $data;
-    }
-
-    /**
-     * List all pages in the given namespace (and below)
-     */
-    function search($query){
-        require_once(DOKU_INC.'inc/fulltext.php');
-
-        $regex = '';
-        $data  = ft_pageSearch($query,$regex);
-        $pages = array();
-
-        // prepare additional data
-        $idx = 0;
-        foreach($data as $id => $score){
-            $file = wikiFN($id);
-
-            if($idx < FT_SNIPPET_NUMBER){
-                $snippet = ft_snippet($id,$regex);
-                $idx++;
-            }else{
-                $snippet = '';
-            }
-
-            $pages[] = array(
-                'id'      => $id,
-                'score'   => intval($score),
-                'rev'     => filemtime($file),
-                'mtime'   => filemtime($file),
-                'size'    => filesize($file),
-                'snippet' => $snippet,
-            );
-        }
-        return $pages;
-    }
-
-    /**
-     * Returns the wiki title.
-     */
-    function getTitle(){
-        global $conf;
-        return $conf['title'];
-    }
-
-    /**
-     * List all media files.
-     *
-     * Available options are 'recursive' for also including the subnamespaces
-     * in the listing, and 'pattern' for filtering the returned files against
-     * a regular expression matching their name.
-     *
-     * @author Gina Haeussge <osd@foosel.net>
-     */
-    function listAttachments($ns, $options = array()) {
-        global $conf;
-        global $lang;
-
-        $ns = cleanID($ns);
-
-        if (!is_array($options)) $options = array();
-        $options['skipacl'] = 0; // no ACL skipping for XMLRPC
-
-
-        if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
-            $dir = utf8_encodeFN(str_replace(':', '/', $ns));
-
-            $data = array();
-            search($data, $conf['mediadir'], 'search_media', $options, $dir);
-            $len = count($data);
-            if(!$len) return array();
-
-            for($i=0; $i<$len; $i++) {
-                unset($data[$i]['meta']);
-                $data[$i]['lastModified'] = new IXR_Date($data[$i]['mtime']);
-            }
-            return $data;
-        } else {
-            return new IXR_Error(215, 'You are not allowed to list media files.');
-        }
-    }
-
-    /**
-     * Return a list of backlinks
-     */
-    function listBackLinks($id){
-        return ft_backlinks(cleanID($id));
-    }
-
-    /**
-     * Return some basic data about a page
-     */
-    function pageInfo($id,$rev=''){
-        $id = cleanID($id);
-        if(auth_quickaclcheck($id) < AUTH_READ){
-            return new IXR_Error(111, 'You are not allowed to read this page');
-        }
-        $file = wikiFN($id,$rev);
-        $time = @filemtime($file);
-        if(!$time){
-            return new IXR_Error(121, 'The requested page does not exist');
-        }
-
-        $info = getRevisionInfo($id, $time, 1024);
-
-        $data = array(
-            'name'         => $id,
-            'lastModified' => new IXR_Date($time),
-            'author'       => (($info['user']) ? $info['user'] : $info['ip']),
-            'version'      => $time
-        );
-
-        return ($data);
-    }
-
-    /**
-     * Save a wiki page
-     *
-     * @author Michael Klier <chi@chimeric.de>
-     */
-    function putPage($id, $text, $params) {
-        global $TEXT;
-        global $lang;
-        global $conf;
-
-        $id    = cleanID($id);
-        $TEXT  = cleanText($text);
-        $sum   = $params['sum'];
-        $minor = $params['minor'];
-
-        if(empty($id))
-            return new IXR_Error(131, 'Empty page ID');
-
-        if(!page_exists($id) && trim($TEXT) == '' ) {
-            return new IXR_ERROR(132, 'Refusing to write an empty new wiki page');
-        }
-
-        if(auth_quickaclcheck($id) < AUTH_EDIT)
-            return new IXR_Error(112, 'You are not allowed to edit this page');
-
-        // Check, if page is locked
-        if(checklock($id))
-            return new IXR_Error(133, 'The page is currently locked');
-
-        // SPAM check
-        if(checkwordblock())
-            return new IXR_Error(134, 'Positive wordblock check');
-
-        // autoset summary on new pages
-        if(!page_exists($id) && empty($sum)) {
-            $sum = $lang['created'];
-        }
-
-        // autoset summary on deleted pages
-        if(page_exists($id) && empty($TEXT) && empty($sum)) {
-            $sum = $lang['deleted'];
-        }
-
-        lock($id);
-
-        saveWikiText($id,$TEXT,$sum,$minor);
-
-        unlock($id);
-
-        // run the indexer if page wasn't indexed yet
-        idx_addPage($id);
-
-        return 0;
-    }
-
-    /**
-     * Appends text to a wiki page.
-     */
-    function appendPage($id, $text, $params) {
-        $currentpage = $this->rawPage($id);
-        if (!is_string($currentpage)) {
-            return $currentpage;
-        }
-        return $this->putPage($id, $currentpage.$text, $params);
-    }
-
-    /**
-     * Uploads a file to the wiki.
-     *
-     * Michael Klier <chi@chimeric.de>
-     */
-    function putAttachment($id, $file, $params) {
-        $id = cleanID($id);
-        $auth = auth_quickaclcheck(getNS($id).':*');
-
-        if(!isset($id)) {
-            return new IXR_ERROR(231, 'Filename not given.');
-        }
-
-        global $conf;
-
-        $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
-
-        // save temporary file
-        @unlink($ftmp);
-        if (preg_match('/^[A-Za-z0-9\+\/]*={0,2}$/', $file) === 1) {
-            // DEPRECATED: Double-decode file if it still looks like base64
-            // after first decoding (which is done by the library)
-            $file = base64_decode($file);
-        }
-        io_saveFile($ftmp, $file);
-
-        $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename');
-        if (is_array($res)) {
-            return new IXR_ERROR(-$res[1], $res[0]);
-        } else {
-            return $res;
-        }
-    }
-
-    /**
-     * Deletes a file from the wiki.
-     *
-     * @author Gina Haeussge <osd@foosel.net>
-     */
-    function deleteAttachment($id){
-        $id = cleanID($id);
-        $auth = auth_quickaclcheck(getNS($id).':*');
-        $res = media_delete($id, $auth);
-        if ($res & DOKU_MEDIA_DELETED) {
-            return 0;
-        } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
-            return new IXR_ERROR(212, "You don't have permissions to delete files.");
-        } elseif ($res & DOKU_MEDIA_INUSE) {
-            return new IXR_ERROR(232, 'File is still referenced');
-        } else {
-            return new IXR_ERROR(233, 'Could not delete file');
-        }
-    }
-
-    /**
-    * Returns the permissions of a given wiki page
-    */
-    function aclCheck($id) {
-        $id = cleanID($id);
-        return auth_quickaclcheck($id);
-    }
-
-    /**
-     * Lists all links contained in a wiki page
-     *
-     * @author Michael Klier <chi@chimeric.de>
-     */
-    function listLinks($id) {
-        $id = cleanID($id);
-        if(auth_quickaclcheck($id) < AUTH_READ){
-            return new IXR_Error(111, 'You are not allowed to read this page');
-        }
-        $links = array();
-
-        // resolve page instructions
-        $ins   = p_cached_instructions(wikiFN($id));
-
-        // instantiate new Renderer - needed for interwiki links
-        include(DOKU_INC.'inc/parser/xhtml.php');
-        $Renderer = new Doku_Renderer_xhtml();
-        $Renderer->interwiki = getInterwiki();
-
-        // parse parse instructions
-        foreach($ins as $in) {
-            $link = array();
-            switch($in[0]) {
-                case 'internallink':
-                    $link['type'] = 'local';
-                    $link['page'] = $in[1][0];
-                    $link['href'] = wl($in[1][0]);
-                    array_push($links,$link);
-                    break;
-                case 'externallink':
-                    $link['type'] = 'extern';
-                    $link['page'] = $in[1][0];
-                    $link['href'] = $in[1][0];
-                    array_push($links,$link);
-                    break;
-                case 'interwikilink':
-                    $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]);
-                    $link['type'] = 'extern';
-                    $link['page'] = $url;
-                    $link['href'] = $url;
-                    array_push($links,$link);
-                    break;
-            }
-        }
-
-        return ($links);
-    }
-
-    /**
-     * Returns a list of recent changes since give timestamp
-     *
-     * @author Michael Hamann <michael@content-space.de>
-     * @author Michael Klier <chi@chimeric.de>
-     */
-    function getRecentChanges($timestamp) {
-        if(strlen($timestamp) != 10)
-            return new IXR_Error(311, 'The provided value is not a valid timestamp');
-
-        $recents = getRecentsSince($timestamp);
-
-        $changes = array();
-
-        foreach ($recents as $recent) {
-            $change = array();
-            $change['name']         = $recent['id'];
-            $change['lastModified'] = new IXR_Date($recent['date']);
-            $change['author']       = $recent['user'];
-            $change['version']      = $recent['date'];
-            $change['perms']        = $recent['perms'];
-            $change['size']         = @filesize(wikiFN($recent['id']));
-            array_push($changes, $change);
-        }
-
-        if (!empty($changes)) {
-            return $changes;
-        } else {
-            // in case we still have nothing at this point
-            return new IXR_Error(321, 'There are no changes in the specified timeframe');
-        }
-    }
-
-    /**
-     * Returns a list of recent media changes since give timestamp
-     *
-     * @author Michael Hamann <michael@content-space.de>
-     * @author Michael Klier <chi@chimeric.de>
-     */
-    function getRecentMediaChanges($timestamp) {
-        if(strlen($timestamp) != 10)
-            return new IXR_Error(311, 'The provided value is not a valid timestamp');
-
-        $recents = getRecentsSince($timestamp, null, '', RECENTS_MEDIA_CHANGES);
-
-        $changes = array();
-
-        foreach ($recents as $recent) {
-            $change = array();
-            $change['name']         = $recent['id'];
-            $change['lastModified'] = new IXR_Date($recent['date']);
-            $change['author']       = $recent['user'];
-            $change['version']      = $recent['date'];
-            $change['perms']        = $recent['perms'];
-            $change['size']         = @filesize(mediaFN($recent['id']));
-            array_push($changes, $change);
-        }
-
-        if (!empty($changes)) {
-            return $changes;
-        } else {
-            // in case we still have nothing at this point
-            return new IXR_Error(321, 'There are no changes in the specified timeframe');
-        }
-    }
-
-    /**
-     * Returns a list of available revisions of a given wiki page
-     *
-     * @author Michael Klier <chi@chimeric.de>
-     */
-    function pageVersions($id, $first) {
-        $id = cleanID($id);
-        if(auth_quickaclcheck($id) < AUTH_READ){
-            return new IXR_Error(111, 'You are not allowed to read this page');
-        }
-        global $conf;
-
-        $versions = array();
-
-        if(empty($id))
-            return new IXR_Error(131, 'Empty page ID');
-
-        $revisions = getRevisions($id, $first, $conf['recent']+1);
-
-        if(count($revisions)==0 && $first!=0) {
-            $first=0;
-            $revisions = getRevisions($id, $first, $conf['recent']+1);
-        }
-
-        if(count($revisions)>0 && $first==0) {
-            array_unshift($revisions, '');  // include current revision
-            array_pop($revisions);          // remove extra log entry
-        }
-
-        $hasNext = false;
-        if(count($revisions)>$conf['recent']) {
-            $hasNext = true;
-            array_pop($revisions); // remove extra log entry
-        }
-
-        if(!empty($revisions)) {
-            foreach($revisions as $rev) {
-                $file = wikiFN($id,$rev);
-                $time = @filemtime($file);
-                // we check if the page actually exists, if this is not the
-                // case this can lead to less pages being returned than
-                // specified via $conf['recent']
-                if($time){
-                    $info = getRevisionInfo($id, $time, 1024);
-                    if(!empty($info)) {
-                        $data['user'] = $info['user'];
-                        $data['ip']   = $info['ip'];
-                        $data['type'] = $info['type'];
-                        $data['sum']  = $info['sum'];
-                        $data['modified'] = new IXR_Date($info['date']);
-                        $data['version'] = $info['date'];
-                        array_push($versions, $data);
-                    }
-                }
-            }
-            return $versions;
-        } else {
-            return array();
-        }
-    }
-
-    /**
-     * The version of Wiki RPC API supported
-     */
-    function wiki_RPCVersion(){
-        return 2;
-    }
-
-
-    /**
-     * Locks or unlocks a given batch of pages
-     *
-     * Give an associative array with two keys: lock and unlock. Both should contain a
-     * list of pages to lock or unlock
-     *
-     * Returns an associative array with the keys locked, lockfail, unlocked and
-     * unlockfail, each containing lists of pages.
-     */
-    function setLocks($set){
-        $locked     = array();
-        $lockfail   = array();
-        $unlocked   = array();
-        $unlockfail = array();
-
-        foreach((array) $set['lock'] as $id){
-            $id = cleanID($id);
-            if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
-                $lockfail[] = $id;
-            }else{
-                lock($id);
-                $locked[] = $id;
-            }
-        }
-
-        foreach((array) $set['unlock'] as $id){
-            $id = cleanID($id);
-            if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
-                $unlockfail[] = $id;
-            }else{
-                $unlocked[] = $id;
-            }
+            return new IXR_Error(-32603, "server error. not authorized to call method $methodname");
+        } catch (RemoteException $e) {
+            return new IXR_Error($e->getCode(), $e->getMessage());
         }
-
-        return array(
-            'locked'     => $locked,
-            'lockfail'   => $lockfail,
-            'unlocked'   => $unlocked,
-            'unlockfail' => $unlockfail,
-        );
     }
 
-    function getAPIVersion(){
-        return DOKU_XMLRPC_API_VERSION;
+    function toDate($data) {
+        return new IXR_Date($data);
     }
 
-    function login($user,$pass){
-        global $conf;
-        global $auth;
-        if(!$conf['useacl']) return 0;
-        if(!$auth) return 0;
-
-        @session_start(); // reopen session for login
-        if($auth->canDo('external')){
-            $ok = $auth->trustExternal($user,$pass,false);
-        }else{
-            $evdata = array(
-                'user'     => $user,
-                'password' => $pass,
-                'sticky'   => false,
-                'silent'   => true,
-            );
-            $ok = trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
-        }
-        session_write_close(); // we're done with the session
-
-        return $ok;
+    function toFile($data) {
+        return new IXR_Base64($data);
     }
-
-
 }
 
 $server = new dokuwiki_xmlrpc_server();
diff --git a/lib/plugins/acl/ajax.php b/lib/plugins/acl/ajax.php
index 71a2eb03a1feaa75d074333b8da0e20040292a27..3a5d89c0884dcf680326c1dc0277968bd3dd93c9 100644
--- a/lib/plugins/acl/ajax.php
+++ b/lib/plugins/acl/ajax.php
@@ -6,16 +6,17 @@
  * @author     Andreas Gohr <andi@splitbrain.org>
  */
 
-//fix for Opera XMLHttpRequests
-if(!count($_POST) && !empty($HTTP_RAW_POST_DATA)){
-  parse_str($HTTP_RAW_POST_DATA, $_POST);
-}
-
 if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../../');
 require_once(DOKU_INC.'inc/init.php');
 //close session
 session_write_close();
 
+//fix for Opera XMLHttpRequests
+$postData = http_get_raw_post_data();
+if(!count($_POST) && !empty($postData)){
+    parse_str($postData, $_POST);
+}
+
 if(!auth_isadmin()) die('for admins only');
 if(!checkSecurityToken()) die('CRSF Attack');
 
diff --git a/lib/plugins/config/lang/ar/lang.php b/lib/plugins/config/lang/ar/lang.php
index 63d25848501e8d20a29197c88326d02e0be76477..3855f4ac12ae81e8503f4e1930444f664365feb5 100644
--- a/lib/plugins/config/lang/ar/lang.php
+++ b/lib/plugins/config/lang/ar/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other']  = 'اجراءات أخرى (مفصولة بالف
 $lang['sneaky_index']          = 'افتراضيا، ستعرض دوكو ويكي كل اسماء النطاقات في عرض الفهرس. تفعيل هذا الخيار سيخفي مالا يملك المستخدم صلاحية قراءته. قد يؤدي هذا إلى اخفاء نطاقات فرعية متاحة. وقد يؤدي لجعل صفحة الفهرس معطلة في بعض اعدادات ACL.';
 $lang['auth_security_timeout'] = 'زمن انتهاء أمان المواثقة (ثوان)';
 $lang['securecookie']          = 'هل يفرض على كعكات التصفح المعدة عبر HTTPS ان ترسل فقط عبر HTTPS من قبل المتصفح؟ عطل هذا إن كان الولوج للويكي مؤمنا فقط عبر SSL لكن تصفح الويكي غير مؤمن.';
-$lang['xmlrpc']                = 'مكّن/عطل واجهة XML-RPC.';
-$lang['xmlrpcuser']            = 'احصر الوصول لـ XML-RPC بمستخدمين أو مجموعات مفصولة بالفاصلة هنا. اتركها فارغة لتمكين الوصول للجميع.';
 $lang['updatecheck']           = 'تحقق من التحديثات و تنبيهات الأمان؟ دوكو ويكي ستحتاج للاتصال ب update.dokuwiki.org لأجل ذلك';
 $lang['userewrite']            = 'استعمل عناوين URLs جميلة';
 $lang['useslash']              = 'استخدم الشرطة كفاصل النطاق في العناوين';
diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php
index ed29c079b4811035357702efce6ff94834a89f18..25f1da91ad163123a75d0c471d94064c6672f19b 100644
--- a/lib/plugins/config/lang/bg/lang.php
+++ b/lib/plugins/config/lang/bg/lang.php
@@ -89,8 +89,6 @@ $lang['sneaky_index']          = 'Стандартно DokuWiki ще показ
 $lang['auth_security_timeout'] = 'Автоматично проверяване на удостоверяването всеки (сек)';
 $lang['securecookie']          = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.
 ';
-$lang['xmlrpc']                = 'Включване/Изключване на интерфейса XML-RPC.';
-$lang['xmlrpcuser']            = 'Ограничаване на XML-RPC достъпа до отделени със запетая групи или потребители. Оставете празно, за да даде достъп на всеки.';
 $lang['updatecheck']           = 'Проверяване за за нови версии и предупреждения за сигурността? Необходимо е Dokiwiki да може да се свързва със update.dokuwiki.org за тази функционалност.';
 $lang['userewrite']            = 'Ползване на nice URL адреси';
 $lang['useslash']              = 'Ползване на наклонена черта за разделител на именните пространства в URL';
diff --git a/lib/plugins/config/lang/ca-valencia/lang.php b/lib/plugins/config/lang/ca-valencia/lang.php
index 76f11a4a594c093c08e9219e018516e879222100..4a8c1089581c7039027b33591aafef045fe8741b 100644
--- a/lib/plugins/config/lang/ca-valencia/lang.php
+++ b/lib/plugins/config/lang/ca-valencia/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other']  = 'Atres accions (separades per comes)';
 $lang['sneaky_index']          = 'Normalment, DokuWiki mostra tots els espais de noms en la vista d\'índex. Activant esta opció s\'ocultaran aquells per als que l\'usuari no tinga permís de llectura. Açò pot ocultar subespais accessibles i inutilisar l\'índex per a certes configuracions del ACL.';
 $lang['auth_security_timeout'] = 'Temps de seguritat màxim per a l\'autenticació (segons)';
 $lang['securecookie']          = '¿El navegador deuria enviar per HTTPS només les galletes que s\'han generat per HTTPS? Desactive esta opció quan utilise SSL només en la pàgina d\'inici de sessió.';
-$lang['xmlrpc']                = 'Activar/desactivar interfaç XML-RPC.';
-$lang['xmlrpcuser']            = 'Restringir l\'accés XML-RPC a la llista d\'usuaris i grups separada per comes definida ací. Deixar buit per a donar accés a tots.';
 $lang['updatecheck']           = '¿Buscar actualisacions i advertències de seguritat? DokuWiki necessita conectar a update.dokuwiki.org per ad açò.';
 $lang['userewrite']            = 'Utilisar URL millorades';
 $lang['useslash']              = 'Utilisar \'/\' per a separar espais de noms en les URL';
diff --git a/lib/plugins/config/lang/ca/lang.php b/lib/plugins/config/lang/ca/lang.php
index 1a2a22881a670f9fd87d39288e86fd48c7919e0a..84680450aae0a913e6bd33191248737983537d5e 100644
--- a/lib/plugins/config/lang/ca/lang.php
+++ b/lib/plugins/config/lang/ca/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other']  = 'Altres accions (separades per comes)';
 $lang['sneaky_index']          = 'Per defecte, DokuWiki mostrarà tots els espai en la visualització d\'índex. Si activeu aquest paràmetre, s\'ocultaran aquells espais en els quals l\'usuari no té accés de lectura. Això pot fer que s\'ocultin subespais que sí que són accessibles. En algunes configuracions ACL pot fer que l\'índex resulti inutilitzable.';
 $lang['auth_security_timeout'] = 'Temps d\'espera de seguretat en l\'autenticació (segons)';
 $lang['securecookie']          = 'Les galetes que s\'han creat via HTTPS, només s\'han d\'enviar des del navegador per HTTPS? Inhabiliteu aquesta opció si només l\'inici de sessió del wiki es fa amb SSL i la navegació del wiki es fa sense seguretat.';
-$lang['xmlrpc']                = 'Habilita/inhabilita la interfície XML-RPC';
-$lang['xmlrpcuser']            = 'Restringeix l\'accés per XML-RPC als usuaris o grups següents, separats per comes. Deixeu aquest camp en blanc per donar accés a tothom.';
 $lang['updatecheck']           = 'Comprova actualitzacions i avisos de seguretat. DokuWiki necessitarà contactar amb update.dokuwiki.org per utilitzar aquesta característica.';
 $lang['userewrite']            = 'Utilitza URL nets';
 $lang['useslash']              = 'Utilitza la barra / com a separador d\'espais en els URL';
diff --git a/lib/plugins/config/lang/cs/lang.php b/lib/plugins/config/lang/cs/lang.php
index 578198d86dc3c76bce8cabcc184d690f3a0441c8..091604aeabc34b13fb12d7dc87eeefdf2d77fed6 100644
--- a/lib/plugins/config/lang/cs/lang.php
+++ b/lib/plugins/config/lang/cs/lang.php
@@ -100,8 +100,6 @@ To může mít za následek, že index bude při některých
 nastaveních ACL nepoužitelný.';
 $lang['auth_security_timeout'] = 'Časový limit pro autentikaci (v sekundách)';
 $lang['securecookie']          = 'Má prohlížeč posílat cookies nastavené přes HTTPS opět jen přes HTTPS? Vypněte tuto volbu, pokud chcete, aby bylo pomocí SSL zabezpečeno pouze přihlašování do wiki, ale obsah budete prohlížet nezabezpečeně.';
-$lang['xmlrpc']                = 'Povolit/Zakázat rozhraní XML-RPC.';
-$lang['xmlrpcuser']            = 'Omezit přístup pomocí XML-RPC pouze na zde zadané skupiny či uživatele (oddělené čárkami). Necháte-li pole prázdné, dáte přístup komukoliv.';
 $lang['updatecheck']           = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k update.dokuwiki.org';
 $lang['userewrite']            = 'Používat "pěkná" URL';
 $lang['useslash']              = 'Používat lomítko jako oddělovač jmenných prostorů v URL';
diff --git a/lib/plugins/config/lang/da/lang.php b/lib/plugins/config/lang/da/lang.php
index a4c0bba758d6529383cbed8dc8768ca5b414600d..7e8fe95afcb4de4cb739bd3d1076962c55ea12d6 100644
--- a/lib/plugins/config/lang/da/lang.php
+++ b/lib/plugins/config/lang/da/lang.php
@@ -92,8 +92,6 @@ $lang['disableactions_other']  = 'Andre muligheder (kommasepareret)';
 $lang['sneaky_index']          = 'DokuWiki vil som standard vise alle navnerum i indholdsfortegnelsen. Ved at slå denne valgmulighed til vil skjule de navnerum, hvor brugeren ikke har læsetilladelse. Dette kan føre til, at tilgængelige undernavnerum bliver skjult. Ligeledes kan det også gøre indholdsfortegnelsen ubrugelig med visse ACL-opsætninger.';
 $lang['auth_security_timeout'] = 'Tidsudløb for bekræftelse (sekunder)';
 $lang['securecookie']          = 'Skal datafiler skabt af HTTPS kun sendes af HTTPS gennem browseren? Slå denne valgmulighed fra hvis kun brugen af din wiki er SSL-beskyttet, mens den almindelige tilgang udefra ikke er sikret.';
-$lang['xmlrpc']                = 'Slå XML-RPC-grænseflade til/fra.';
-$lang['xmlrpcuser']            = 'Begræns XML-RPC-adgang til de nævnte og med komma adskilte grupper eller brugere. Lad den stå tom for at give alle adgang.';
 $lang['updatecheck']           = 'Kig efter opdateringer og sikkerhedsadvarsler? DokuWiki er nødt til at kontakte update.dokuwiki.org for at tilgå denne funktion.';
 $lang['userewrite']            = 'Brug pæne netadresser';
 $lang['useslash']              = 'Brug skråstreg som navnerumsdeler i netadresser';
diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php
index 1a66c4a8eb80fefb9cc823328432a8fc858e78aa..52c705b4f112bb89052016cdbf7acb782bbd162c 100644
--- a/lib/plugins/config/lang/de-informal/lang.php
+++ b/lib/plugins/config/lang/de-informal/lang.php
@@ -89,8 +89,6 @@ $lang['disableactions_other']  = 'Weitere Aktionen (durch Komma getrennt)';
 $lang['sneaky_index']          = 'Standardmäßig zeigt DokuWiki alle Namensräume in der Indexansicht an. Bei Aktivierung dieser Einstellung werden alle Namensräume versteckt, in welchen der Benutzer keine Leserechte hat. Dies könnte dazu führen, dass lesbare Unternamensräume versteckt werden. Dies kann die Indexansicht bei bestimmten Zugangskontrolleinstellungen unbenutzbar machen.';
 $lang['auth_security_timeout'] = 'Zeitüberschreitung bei der Authentifizierung (Sekunden)';
 $lang['securecookie']          = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktiviere diese Option, wenn nur der Login deines Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.';
-$lang['xmlrpc']                = 'Aktiviere/Deaktiviere die XML-RPC-Schnittstelle';
-$lang['xmlrpcuser']            = 'XML-RPC-Zugriff auf folgende Gruppen oder Benutzer (kommasepariert) beschränken. Wenn du dieses Feld leer lässt, wir der Zugriff jedem gewährt.';
 $lang['updatecheck']           = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
 $lang['userewrite']            = 'Benutze schöne URLs';
 $lang['useslash']              = 'Benutze Schrägstrich als Namensraumtrenner in URLs';
diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php
index a9a27534997bf10ed3ddcd1a620f80ce81c0f8fc..1cc4e0a8afba01be4b3c8eff5f920a092f5fbd97 100644
--- a/lib/plugins/config/lang/de/lang.php
+++ b/lib/plugins/config/lang/de/lang.php
@@ -100,8 +100,6 @@ $lang['disableactions_other']  = 'Andere Aktionen (durch Komma getrennt)';
 $lang['sneaky_index']          = 'Standardmäßig zeigt DokuWiki alle Namensräume in der Übersicht. Wenn diese Option aktiviert wird, werden alle Namensräume, für die der Benutzer keine Lese-Rechte hat, nicht angezeigt. Dies kann unter Umständen dazu führen, das lesbare Unter-Namensräume nicht angezeigt werden und macht die Übersicht evtl. unbrauchbar in Kombination mit bestimmten ACL Einstellungen.';
 $lang['auth_security_timeout'] = 'Authentifikations-Timeout (Sekunden)';
 $lang['securecookie']          = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktivieren Sie diese Option, wenn nur der Login Ihres Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.';
-$lang['xmlrpc']                = 'XML-RPC-Zugriff erlauben.';
-$lang['xmlrpcuser']            = 'XML-RPC-Zugriff auf folgende Gruppen oder Benutzer (kommasepariert) beschränken. Wenn Sie dieses Feld leer lassen, wir der Zugriff jedem gewährt.';
 $lang['updatecheck']           = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
 $lang['userewrite']            = 'URL rewriting';
 $lang['useslash']              = 'Schrägstrich (/) als Namensraumtrenner in URLs verwenden';
diff --git a/lib/plugins/config/lang/el/lang.php b/lib/plugins/config/lang/el/lang.php
index 9f5d121de6405d30054bdaa0790c9a549a52c31e..09321266449b07150f88a5bc578e90a51b8f908f 100644
--- a/lib/plugins/config/lang/el/lang.php
+++ b/lib/plugins/config/lang/el/lang.php
@@ -93,8 +93,6 @@ $lang['disableactions_other']  = 'Άλλες λειτουργίες (διαχω
 $lang['sneaky_index']          = 'Εξ ορισμού, η εφαρμογή DokuWiki δείχνει όλους τους φακέλους στην προβολή Καταλόγου. Ενεργοποιώντας αυτή την επιλογή, δεν θα εμφανίζονται οι φάκελοι για τους οποίους ο χρήστης δεν έχει δικαιώματα ανάγνωσης αλλά και οι υπο-φάκελοί τους ανεξαρτήτως δικαιωμάτων πρόσβασης.';
 $lang['auth_security_timeout'] = 'Διάρκεια χρόνου για ασφάλεια πιστοποίησης (δευτερόλεπτα)';
 $lang['securecookie']          = 'Τα cookies που έχουν οριστεί μέσω HTTPS πρέπει επίσης να αποστέλλονται μόνο μέσω HTTPS από τον φυλλομετρητή? Απενεργοποιήστε αυτή την επιλογή όταν μόνο η είσοδος στο wiki σας διασφαλίζεται μέσω SSL αλλά η περιήγηση γίνεται και χωρίς αυτό.';
-$lang['xmlrpc']                = 'Ενεργοποίηση/Απενεργοποίηση της διασύνδεσης XML-RPC ';
-$lang['xmlrpcuser']            = 'Περιορισμός XML-RPC πρόσβασης στις ομάδες η τους χρήστες (διαχωριζόμενοι με κόμμα). Αφήστε το κενό για πρόσβαση από όλους.';
 $lang['updatecheck']           = 'Έλεγχος για ύπαρξη νέων εκδόσεων και ενημερώσεων ασφαλείας της εφαρμογής? Απαιτείται η σύνδεση με το update.dokuwiki.org για να λειτουργήσει σωστά αυτή η επιλογή.';
 $lang['userewrite']            = 'Χρήση ωραίων URLs';
 $lang['useslash']              = 'Χρήση slash σαν διαχωριστικό φακέλων στα URLs';
@@ -118,7 +116,7 @@ $lang['jpg_quality']           = 'Ποιότητα συμπίεσης JPG (0-100
 $lang['subscribers']           = 'Να επιτρέπεται η εγγραφή στην ενημέρωση αλλαγών σελίδας';
 $lang['subscribe_time']        = 'Χρόνος μετά τον οποίο οι λίστες ειδοποιήσεων και τα συνοπτικά θα αποστέλλονται (δευτερόλεπτα). Αυτό θα πρέπει να είναι μικρότερο από τον χρόνο που έχει η ρύθμιση recent_days.';
 $lang['compress']              = 'Συμπίεση αρχείων CSS και javascript';
-$lang['cssdatauri']            = 'Το μέγεθος σε bytes στο οποίο οι εικόνες που αναφέρονται σε CSS αρχεία θα πρέπει να είναι ενσωματωμένες για τη μείωση των απαιτήσεων μιας κεφαλίδας αίτησης HTTP . Αυτή η τεχνική δεν θα λειτουργήσει σε IE <8! <code> 400 </ code> με <code> 600 </ code> bytes είναι μια καλή τιμή. Ορίστε την τιμή <code> 0 </ code> για να το απενεργοποιήσετε.';
+$lang['cssdatauri']            = 'Το μέγεθος σε bytes στο οποίο οι εικόνες που αναφέρονται σε CSS αρχεία θα πρέπει να είναι ενσωματωμένες για τη μείωση των απαιτήσεων μιας κεφαλίδας αίτησης HTTP . Αυτή η τεχνική δεν θα λειτουργήσει σε IE <8! <code> 400 </code> με <code> 600 </code> bytes είναι μια καλή τιμή. Ορίστε την τιμή <code> 0 </code> για να το απενεργοποιήσετε.';
 $lang['hidepages']             = 'Φίλτρο απόκρυψης σελίδων (regular expressions)';
 $lang['send404']               = 'Αποστολή "HTTP 404/Page Not Found" για σελίδες που δεν υπάρχουν';
 $lang['sitemap']               = 'Δημιουργία Google sitemap (ημέρες)';
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index 8718b00ed6707a59da67544e6c6bb12354c5cc09..fe9e5458bd81d3aefb8a543ea9104ce03840de88 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -110,8 +110,8 @@ $lang['disableactions_other'] = 'Other actions (comma separated)';
 $lang['sneaky_index'] = 'By default, DokuWiki will show all namespaces in the index view. Enabling this option will hide those where the user doesn\'t have read permissions. This might result in hiding of accessable subnamespaces. This may make the index unusable with certain ACL setups.';
 $lang['auth_security_timeout'] = 'Authentication Security Timeout (seconds)';
 $lang['securecookie'] = 'Should cookies set via HTTPS only be sent via HTTPS by the browser? Disable this option when only the login of your wiki is secured with SSL but browsing the wiki is done unsecured.';
-$lang['xmlrpc']      = 'Enable/disable XML-RPC interface.';
-$lang['xmlrpcuser']  = 'Restrict XML-RPC access to the comma separated groups or users given here. Leave empty to give access to everyone.';
+$lang['remote']      = 'Enable/disable Remote interface.';
+$lang['remoteuser']  = 'Restrict Remote access to the comma separated groups or users given here. Leave empty to give access to everyone.';
 
 /* Advanced Options */
 $lang['updatecheck'] = 'Check for updates and security warnings? DokuWiki needs to contact update.dokuwiki.org for this feature.';
diff --git a/lib/plugins/config/lang/eo/lang.php b/lib/plugins/config/lang/eo/lang.php
index b0411ec141b48a5d17bffd88a3e251e9edcf24df..3acb0054534617b51b7e95f97c91379e9696418e 100644
--- a/lib/plugins/config/lang/eo/lang.php
+++ b/lib/plugins/config/lang/eo/lang.php
@@ -93,8 +93,6 @@ $lang['disableactions_other']  = 'Aliaj agoj (apartite per komoj)';
 $lang['sneaky_index']          = 'Apriore, DokuWiki montras ĉiujn nomspacojn en la indeksa modo. Ebligi tiun ĉi elekteblon kaŝus tion, kion la uzanto ne rajtas legi laŭ ACL. Tio povus rezulti ankaŭan kaŝon de alireblaj subnomspacoj. Kaj tiel la indekso estus neuzebla por kelkaj agordoj de ACL.';
 $lang['auth_security_timeout'] = 'Sekureca Templimo por aÅ­tentigo (sekundoj)';
 $lang['securecookie']          = 'Ĉu kuketoj difinitaj per HTTPS nur estu senditaj de la foliumilo per HTTPS? Malebligu tiun ĉi opcion kiam nur la ensaluto al via vikio estas sekurigita per SSL, sed foliumado de la vikio estas farita malsekure.';
-$lang['xmlrpc']                = 'Ebligi/malebligi la interfacon XML-RPC.';
-$lang['xmlrpcuser']            = 'Permesi XML-RPC-an aliron al certaj grupoj aŭ uzantoj, bonvolu meti iliajn komoseparitajn nomojn tie ĉi. Alirebli de ĉiu, ĝin lasu malplena.';
 $lang['updatecheck']           = 'Ĉu kontroli aktualigojn kaj sekurecajn avizojn? DokuWiki bezonas kontakti update.dokuwiki.org por tiu ĉi trajto.';
 $lang['userewrite']            = 'Uzi netajn URL-ojn';
 $lang['useslash']              = 'Uzi frakcistrekon kiel apartigsignaĵo por nomspacoj en URL-oj';
diff --git a/lib/plugins/config/lang/es/lang.php b/lib/plugins/config/lang/es/lang.php
index 9146633cfc4b5d7655c0935cae56ffbc1e22ee91..66d075d6b1d34e81e44f799acd8dd6f0c759f341 100644
--- a/lib/plugins/config/lang/es/lang.php
+++ b/lib/plugins/config/lang/es/lang.php
@@ -103,8 +103,6 @@ $lang['disableactions_other']  = 'Otras acciones (separadas por coma)';
 $lang['sneaky_index']          = 'Por defecto, DokuWiki mostrará todos los namespaces en el index. Habilitando esta opción los ocultará si el usuario no tiene permisos de lectura. Los sub-namespaces pueden resultar inaccesibles. El index puede hacerse poco usable dependiendo de las configuraciones ACL.';
 $lang['auth_security_timeout'] = 'Tiempo de Autenticación (en segundos), por motivos de seguridad';
 $lang['securecookie']          = 'Las cookies establecidas por HTTPS, ¿el naveagdor solo puede enviarlas por HTTPS? Inhabilite esta opción cuando solo se asegure con SSL la entrada, pero no la navegación de su wiki.';
-$lang['xmlrpc']                = 'Habilitar/Deshabilitar interfaz XML-RPC';
-$lang['xmlrpcuser']            = 'Restringir el acceso XML-RPC a los grupos o usuarios separados por coma mencionados aquí. Dejar en blanco para dar acceso a todo el mundo. ';
 $lang['updatecheck']           = '¿Comprobar actualizaciones y advertencias de seguridad? Esta característica requiere que DokuWiki se conecte a update.dokuwiki.org.';
 $lang['userewrite']            = 'Usar URLs bonitas';
 $lang['useslash']              = 'Usar barra (/) como separador de espacios de nombres en las URLs';
diff --git a/lib/plugins/config/lang/eu/lang.php b/lib/plugins/config/lang/eu/lang.php
index 9d001d494c0d24f248ac0b1de590f65bdc84f457..97addbb50422b62d7857731014bdcc9dbde2bc3e 100644
--- a/lib/plugins/config/lang/eu/lang.php
+++ b/lib/plugins/config/lang/eu/lang.php
@@ -83,8 +83,6 @@ $lang['disableactions_other']  = 'Beste ekintzak (komaz bereiztuak)';
 $lang['sneaky_index']          = 'Lehenespenez, DokuWiki-k izen-espazio guztiak indize bistan erakutsiko ditu. Aukera hau gaituta, erabiltzaieak irakurtzeko baimenik ez dituen izen-espazioak ezkutatuko dira. Honek atzigarriak diren azpi izen-espazioak ezkutatzen ditu. Agian honek indizea erabili ezin ahal izatea eragingo du AKL ezarpen batzuetan.';
 $lang['auth_security_timeout'] = 'Kautotze Segurtasun Denbora-Muga (segunduak)';
 $lang['securecookie']          = 'HTTPS bidez ezarritako cookie-ak HTTPS bidez bakarrik bidali beharko lituzke nabigatzaileak? Ezgaitu aukera hau bakarrik saio hasierak SSL bidezko segurtasuna badu baina wiki-areb nabigazioa modu ez seguruan egiten bada. ';
-$lang['xmlrpc']                = 'Gaitu/ezgaitu XML-RPC interfazea.';
-$lang['xmlrpcuser']            = 'XML-RPC atzipena mugatu hemen emandako komaz bereiztutako talde eta erabiltzaileei. Utzi hutsik atzipena guztiei emateko.';
 $lang['updatecheck']           = 'Konprobatu eguneratze eta segurtasun oharrak? DokuWiki-k honetarako update.dokuwiki.org kontaktatu behar du.';
 $lang['userewrite']            = 'Erabili URL politak';
 $lang['useslash']              = 'Erabili barra (/) izen-espazio banatzaile moduan URLetan';
diff --git a/lib/plugins/config/lang/fa/lang.php b/lib/plugins/config/lang/fa/lang.php
index 42cc3ed05d4fbb5ce1297d32aaa0f2b41367f3cd..c1a112365dd2a44a247b91087408f9fc3c2d64d6 100644
--- a/lib/plugins/config/lang/fa/lang.php
+++ b/lib/plugins/config/lang/fa/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other']  = 'فعالیت‌های دیگر (با ویرگ
 $lang['sneaky_index']          = 'به طور پیش‌فرض، DokuWiki در فهرست تمامی فضای‌نام‌ها را نمایش می‌دهد. فعال کردن این گزینه، مواردی را که کاربر حق خواندنشان را ندارد مخفی می‌کند. این گزینه ممکن است باعث دیده نشدن زیرفضای‌نام‌هایی شود که دسترسی خواندن به آن‌ها وجود دارد. و ممکن است باعث شود که فهرست در حالاتی از دسترسی‌ها، غیرقابل استفاده شود.';
 $lang['auth_security_timeout'] = 'زمان انقضای معتبرسازی به ثانیه';
 $lang['securecookie']          = 'آیا کوکی‌ها باید با قرارداد HTTPS ارسال شوند؟ این گزینه را زمانی که فقط صفحه‌ی ورود ویکی‌تان با SSL امن شده است، اما ویکی را ناامن مرور می‌کنید، غیرفعال نمایید.';
-$lang['xmlrpc']                = 'فعال/غیرفعال کردن XML-RPC';
-$lang['xmlrpcuser']            = 'محمدود کردن دسترسی به XML-RPC توسط گروه های جدا شده توسط ویرگول ویا اعضای داده شده در اینجا. این مکان را خالی بگزارید تا به همه دسترسی داده شود.';
 $lang['updatecheck']           = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار DokuWiki با سرور update.dokuwiki.org تماس خواهد گرفت.';
 $lang['userewrite']            = 'از زیباکننده‌ی آدرس‌ها استفاده شود';
 $lang['useslash']              = 'از اسلش «/» برای جداکننده‌ی آدرس فضای‌نام‌ها استفاده شود';
diff --git a/lib/plugins/config/lang/fi/lang.php b/lib/plugins/config/lang/fi/lang.php
index 9598a0d930e61c12b938565ffeb74c99f9a8e03d..f75a18ecd977cfbbd57d511a0650cb7eb88803ba 100644
--- a/lib/plugins/config/lang/fi/lang.php
+++ b/lib/plugins/config/lang/fi/lang.php
@@ -88,8 +88,6 @@ $lang['disableactions_other']  = 'Muut toiminnot (pilkulla erotettuna)';
 $lang['sneaky_index']          = 'Oletuksena DokuWiki näyttää kaikki nimiavaruudet index-näkymäsä. Tämä asetus piilottaa ne, joihin käyttäjällä ei ole lukuoikeuksia. Tämä voi piilottaa joitakin sallittuja alinimiavaruuksia. Tästä johtuen index-näkymä voi olla käyttökelvoton joillakin ACL-asetuksilla';
 $lang['auth_security_timeout'] = 'Autentikoinnin aikakatkaisu (sekunteja)';
 $lang['securecookie']          = 'Lähetetäänkö HTTPS:n kautta asetetut evästetiedot HTTPS-yhteydellä? Kytke pois, jos vain wikisi kirjautuminen on suojattu SSL:n avulla, mutta muuten wikiä käytetään ilman suojausta.';
-$lang['xmlrpc']                = 'Käytä/poista XML-RPC liityntää';
-$lang['xmlrpcuser']            = 'Estä XML-RPC:n käyttö pilkulla erotetun listan ryhmille tai käyttäjille. Jätä tyhjäksi salliaksesi käyttö kaikille.';
 $lang['updatecheck']           = 'Tarkista päivityksiä ja turvavaroituksia? Tätä varten DokuWikin pitää ottaa yhteys update.dokuwiki.orgiin.';
 $lang['userewrite']            = 'Käytä siivottuja URLeja';
 $lang['useslash']              = 'Käytä kauttaviivaa nimiavaruuksien erottimena URL-osoitteissa';
diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php
index 8dcd2103210e4e61e0f5a8d1df8cf7aeecb90862..4a67a0fc8f0b0fed58fdf5c2000ea89c5f20b43f 100644
--- a/lib/plugins/config/lang/fr/lang.php
+++ b/lib/plugins/config/lang/fr/lang.php
@@ -98,8 +98,6 @@ $lang['disableactions_other']  = 'Autres actions (séparées par des virgules)';
 $lang['sneaky_index']          = 'Par défaut, DokuWiki affichera toutes les catégories dans la vue par index. Activer cette option permet de cacher celles pour lesquelles l\'utilisateur n\'a pas la permission de lecture. Il peut en résulter le masquage de sous-catégories accessibles. Ceci peut rendre l\'index inutilisable avec certaines ACL.';
 $lang['auth_security_timeout'] = 'Délai d\'expiration de sécurité (secondes)';
 $lang['securecookie']          = 'Les cookies mis via HTTPS doivent-ils n\'être envoyé par le navigateur que via HTTPS ? Ne désactivez cette option que si la connexion à votre wiki est sécurisée avec SSL mais que la navigation sur le wiki n\'est pas sécurisée.';
-$lang['xmlrpc']                = 'Activer l\'interface XML-RPC.';
-$lang['xmlrpcuser']            = 'Restreindre l\'accès à XML-RPC aux groupes et utilisateurs indiqués ici. Laisser vide afin que tout le monde y ait accès.';
 $lang['updatecheck']           = 'Vérifier les mises à jour ? DokuWiki doit pouvoir contacter update.dokuwiki.org.';
 $lang['userewrite']            = 'URL esthétiques';
 $lang['useslash']              = 'Utiliser « / » comme séparateur de catégorie dans les URL';
diff --git a/lib/plugins/config/lang/gl/lang.php b/lib/plugins/config/lang/gl/lang.php
index da40b44e61a1774e9618a14c7e7e2985c18658e9..97b7ecdc854946f0971083f44d9f252d68ca8f9a 100644
--- a/lib/plugins/config/lang/gl/lang.php
+++ b/lib/plugins/config/lang/gl/lang.php
@@ -87,8 +87,6 @@ $lang['disableactions_other']  = 'Outras accións (separadas por comas)';
 $lang['sneaky_index']          = 'O DokuWiki amosará por defecto todos os nomes de espazo na vista de índice. Se activas isto agocharanse aqueles onde o usuario non teña permisos de lectura.';
 $lang['auth_security_timeout'] = 'Tempo Límite de Seguridade de Autenticación (segundos)';
 $lang['securecookie']          = 'Deben enviarse só vía HTTPS polo navegador as cookies configuradas vía HTTPS? Desactiva esta opción cando só o inicio de sesión do teu wiki estea asegurado con SSL pero a navegación do mesmo se faga de xeito inseguro.';
-$lang['xmlrpc']                = 'Activar/Desactivar interface XML-RPC';
-$lang['xmlrpcuser']            = 'Restrinxir o acceso mediante XML-RPC á lista separada por comas dos grupos e/ou usuarios proporcionados aquí. Déixao baleiro para darlle acceso a todas as persoas.';
 $lang['updatecheck']           = 'Comprobar se hai actualizacións e avisos de seguridade? O DokuWiki precisa contactar con update.dokuwiki.org para executar esta característica.';
 $lang['userewrite']            = 'Utilizar URLs amigábeis';
 $lang['useslash']              = 'Utilizar a barra inclinada (/) como separador de nome de espazo nos URLs';
diff --git a/lib/plugins/config/lang/he/lang.php b/lib/plugins/config/lang/he/lang.php
index e80a1bd7ab943d0e936814e89d6aa13d8323724b..b200082c9c74276b199118c5423b397702bc704a 100644
--- a/lib/plugins/config/lang/he/lang.php
+++ b/lib/plugins/config/lang/he/lang.php
@@ -82,7 +82,6 @@ $lang['disableactions_wikicode'] = 'הצגת המקור/יצוא גולמי';
 $lang['disableactions_other']  = 'פעולות אחרות (מופרדות בפסיק)';
 $lang['sneaky_index']          = 'כברירת מחדל, דוקוויקי יציג את כל מרחבי השמות בתצוגת תוכן הענינים. בחירה באפשרות זאת תסתיר את אלו שבהם למשתמש אין הרשאות קריאה. התוצאה עלולה להיות הסתרת תת מרחבי שמות אליהם יש למשתמש גישה. באופן זה תוכן הענינים עלול להפוך לחסר תועלת עם הגדרות ACL מסוימות';
 $lang['auth_security_timeout'] = 'מגבלת אבטח פסק הזמן להזדהות (שניות)';
-$lang['xmlrpc']                = 'לאפשר.לחסום את מנשק XML-RPC';
 $lang['updatecheck']           = 'בדיקת עידכוני אבטחה והתראות? על DokuWiki להתקשר אל update.dokuwiki.org לצורך כך.';
 $lang['userewrite']            = 'השתמש בכתובות URL יפות';
 $lang['useslash']              = 'השתמש בלוכסן להגדרת מרחבי שמות בכתובות';
diff --git a/lib/plugins/config/lang/hu/lang.php b/lib/plugins/config/lang/hu/lang.php
index f991b7c95159ba022aff6be0b9a54f80846e2b67..a1de941607be7d63b85a334ee8566510081173f2 100644
--- a/lib/plugins/config/lang/hu/lang.php
+++ b/lib/plugins/config/lang/hu/lang.php
@@ -89,8 +89,6 @@ $lang['disableactions_other']  = 'Egyéb tevékenységek (vesszővel elválasztv
 $lang['sneaky_index']          = 'Alapértelmezetten minden névtér látszik a DokuWiki áttekintő (index) oldalán. Ezen opció bekapcsolása után azok nem jelennek meg, melyekhez a felhasználónak nincs olvasás joga. De ezzel eltakarhatunk egyébként elérhető al-névtereket is, így bizonyos ACL beállításoknál használhatatlan indexet eredményez ez a beállítás.';
 $lang['auth_security_timeout'] = 'Authentikációs biztonsági időablak (másodperc)';
 $lang['securecookie']          = 'A böngészők a HTTPS felett beállított sütijüket csak HTTPS felett küldhetik? Kapcsoljuk ki ezt az opciót, ha csak a bejelentkezést védjük SSL-lel, a wiki tartalmának böngészése nyílt forgalommal történik.';
-$lang['xmlrpc']                = 'XML-RPC interfész engedélyezése/tiltása';
-$lang['xmlrpcuser']            = 'Korlátozza XML-RPC hozzáférést az itt megadott vesszővel elválasztott csoportok vagy felhasználók számára. Hagyja üresen, ha mindenki számára biztosítja a hozzáférést.';
 $lang['updatecheck']           = 'Frissítések és biztonsági figyelmeztetések figyelése. Ehhez a DokuWikinek kapcsolatba kell lépnie a update.dokuwiki.org-gal.';
 $lang['userewrite']            = 'Szép URL-ek használata';
 $lang['useslash']              = 'Per-jel használata névtér-elválasztóként az URL-ekben';
diff --git a/lib/plugins/config/lang/ia/lang.php b/lib/plugins/config/lang/ia/lang.php
index 689869b89132b1d189ceb50ebfb133af3c7c9520..fdb9d954e0d6d573a53eb70738165986db821bdb 100644
--- a/lib/plugins/config/lang/ia/lang.php
+++ b/lib/plugins/config/lang/ia/lang.php
@@ -83,8 +83,6 @@ $lang['disableactions_other']  = 'Altere actiones (separate per commas)';
 $lang['sneaky_index']          = 'Normalmente, DokuWiki monstra tote le spatios de nomines in le vista del indice. Si iste option es active, illos ubi le usator non ha le permission de lectura essera celate. Isto pote resultar in le celamento de subspatios de nomines accessibile. Isto pote render le indice inusabile con certe configurationes de ACL.';
 $lang['auth_security_timeout'] = 'Expiration pro securitate de authentication (secundas)';
 $lang['securecookie']          = 'Debe le cookies definite via HTTPS solmente esser inviate via HTTPS per le navigator? Disactiva iste option si solmente le apertura de sessiones a tu wiki es protegite con SSL ma le navigation del wiki es facite sin securitate.';
-$lang['xmlrpc']                = 'Activar/disactivar interfacie XML-RPC.';
-$lang['xmlrpcuser']            = 'Limitar le accesso a XML-RPC al gruppos o usatores date hic, separate per commas. Lassa isto vacue pro dar accesso a omnes.';
 $lang['updatecheck']           = 'Verificar si existe actualisationes e advertimentos de securitate? DokuWiki debe contactar update.dokuwiki.org pro exequer iste function.';
 $lang['userewrite']            = 'Usar URLs nette';
 $lang['useslash']              = 'Usar le barra oblique ("/") como separator de spatios de nomines in URLs';
diff --git a/lib/plugins/config/lang/id-ni/lang.php b/lib/plugins/config/lang/id-ni/lang.php
index edde733fb2cc84f3abc177b70889086b052045c3..7b7e14ce5c284e294bd063db4c180005e966f14c 100644
--- a/lib/plugins/config/lang/id-ni/lang.php
+++ b/lib/plugins/config/lang/id-ni/lang.php
@@ -5,7 +5,6 @@
  * @author Harefa <fidelis@harefa.com>
  * @author Yustinus Waruwu <juswaruwu@gmail.com>
  */
-$lang['xmlrpc']                = 'Orifi/böi\'orifi XML-RPC interface.';
 $lang['renderer_xhtml']        = 'Fake Renderer ba zito\'ölö (XHTML) Wiki-output.';
 $lang['renderer__core']        = '%s (dokuwiki core)';
 $lang['renderer__plugin']      = '%s (plugin)';
diff --git a/lib/plugins/config/lang/it/lang.php b/lib/plugins/config/lang/it/lang.php
index c4dd433ed7c763c748673bc6ab156aeb2f511ed3..9c348dcee1b634bf5d56f93b165251c4160743f0 100644
--- a/lib/plugins/config/lang/it/lang.php
+++ b/lib/plugins/config/lang/it/lang.php
@@ -94,8 +94,6 @@ $lang['disableactions_other']  = 'Altre azioni (separate da virgola)';
 $lang['sneaky_index']          = 'Normalmente, DokuWiki mostra tutte le categorie nella vista indice. Abilitando questa opzione, saranno nascoste quelle per cui l\'utente non ha il permesso in lettura. Questo potrebbe far sì che alcune sottocategorie accessibili siano nascoste. La pagina indice potrebbe quindi diventare inutilizzabile con alcune configurazioni dell\'ACL.';
 $lang['auth_security_timeout'] = 'Tempo di sicurezza per l\'autenticazione (secondi)';
 $lang['securecookie']          = 'Devono i cookies impostati tramite HTTPS essere inviati al browser solo tramite HTTPS? Disattiva questa opzione solo quando l\'accesso al tuo wiki viene effettuato con il protocollo SSL ma la navigazione del wiki non risulta sicura.';
-$lang['xmlrpc']                = 'Abilita/disabilita interfaccia XML-RPC.';
-$lang['xmlrpcuser']            = 'Limita l\'accesso XML-RPC ai gruppi o utenti indicati qui (separati da virgola). Lascia il campo vuoto per dare accesso a tutti.';
 $lang['updatecheck']           = 'Controllare aggiornamenti e avvisi di sicurezza? DokuWiki deve contattare update.dokuwiki.org per questa funzione.';
 $lang['userewrite']            = 'Usa il rewrite delle URL';
 $lang['useslash']              = 'Usa la barra rovescia (slash) come separatore nelle URL';
diff --git a/lib/plugins/config/lang/ja/lang.php b/lib/plugins/config/lang/ja/lang.php
index 500d4453948cdd526f1285962300d77e75f8b676..f1d2e3e8fd0d6b435da60037a56275d609ca48cd 100644
--- a/lib/plugins/config/lang/ja/lang.php
+++ b/lib/plugins/config/lang/ja/lang.php
@@ -91,8 +91,6 @@ $lang['disableactions_other']  = 'その他の動作(カンマ区切り)';
 $lang['sneaky_index']          = 'デフォルトでは索引にすべての名前空間を表示しますが、この機能はユーザーに閲覧権限のない名前空間を非表示にします。ただし、閲覧が可能な副名前空間まで表示されなくなるため、ACLの設定が適正でない場合は索引機能が使えなくなる場合があります。';
 $lang['auth_security_timeout'] = '認証タイムアウト設定(秒)';
 $lang['securecookie']          = 'クッキーをHTTPSにてセットする場合は、ブラウザよりHTTPS経由で送信された場合にみに制限しますか?ログインのみをSSLで行う場合は、この機能を無効にしてください。';
-$lang['xmlrpc']                = 'XML-RPCインターフェースを有効/無効にする';
-$lang['xmlrpcuser']            = 'XML-RPCアクセスを指定グループとユーザーに制限します(半角コンマ区切り)。 すべての人にアクセスを許可する場合は空のままにしてください。';
 $lang['updatecheck']           = 'DokuWikiの更新とセキュリティに関する情報をチェックしますか? この機能は update.dokuwiki.org への接続が必要です。';
 $lang['userewrite']            = 'URLの書き換え';
 $lang['useslash']              = 'URL上の名前空間の区切りにスラッシュを使用';
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index e71b9e3a463709d4498dacaaab30092c24c4c6ec..55207a37aca441be74a6340b066d4defa75bed77 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -95,8 +95,6 @@ $lang['sneaky_index']          = '기본적으로, DokuWiki는 색인 목록에
 특정 ACL 설정은 색인 사용이 불가능하게 할 수도 있습니다.';
 $lang['auth_security_timeout'] = '인증 보안 초과 시간(초)';
 $lang['securecookie']          = 'HTTPS로 보내진 쿠키는 HTTPS에만 적용 할까요? 위키의 로그인 페이지만 SSL로 암호화 하고 위키 페이지는 그렇지 않은경우 꺼야 합니다.';
-$lang['xmlrpc']                = 'XML-RPC 인터페이스 지원/무시';
-$lang['xmlrpcuser']            = '주어진 그룹이나 유저들에게만 XML-RPC접근을 허락하려면 컴마로 구분하여 적으세요. 비어두면 모두에게 허용됩니다.';
 $lang['updatecheck']           = '업데이트와 보안 문제를 검사(DokuWiki를 update.dokuwiki.org에 연결해야 합니다.)';
 $lang['userewrite']            = 'URL rewriting기능 사용';
 $lang['useslash']              = 'URL에서 네임스페이스 구분자로 슬래쉬 문자 사용';
diff --git a/lib/plugins/config/lang/la/lang.php b/lib/plugins/config/lang/la/lang.php
index 07d92ae362a90306a62b2b9a676df5b4d2384eff..057e69974692dce451f8b9e285872c59cff7fd1b 100644
--- a/lib/plugins/config/lang/la/lang.php
+++ b/lib/plugins/config/lang/la/lang.php
@@ -82,8 +82,6 @@ $lang['disableactions_other']  = 'Aliae actiones (uirgulis diuisae)';
 $lang['sneaky_index']          = 'Hic uicis omnia genera in indice inserit. Si ineptam hanc optionem facias, solum ea, quae Sodales uidere possunt, in indice erunt. Hoc suggreges et suggenera abscondere potest.';
 $lang['auth_security_timeout'] = 'Confirmationis Tempus (secundis)';
 $lang['securecookie']          = 'Formulae HTTPS mittine solum per HTTPS possunt? Ineptam hanc optio facias, si accessus uicis tutus est, sed interretis non.';
-$lang['xmlrpc']                = 'Aptam\Ineptam XML-RPC administrationem facere';
-$lang['xmlrpcuser']            = 'Accessus XML-RPC gregibus uel Sodalibus in hoc indice astringere. Nihil scribere ut omnes accessum habeant';
 $lang['updatecheck']           = 'Nouationes et fiducias inspicerene? Hic uicis connectere update.dokuwiki.org debes.';
 $lang['userewrite']            = 'VRL formosis uti';
 $lang['useslash']              = 'Repagula in URL, ut genera diuidas, uti';
diff --git a/lib/plugins/config/lang/lv/lang.php b/lib/plugins/config/lang/lv/lang.php
index 2f5883269133b52a28ce222037d6cfa80510b881..f95697c46dcf57c71774cc5a44c12bf7be55f31e 100644
--- a/lib/plugins/config/lang/lv/lang.php
+++ b/lib/plugins/config/lang/lv/lang.php
@@ -84,8 +84,6 @@ $lang['disableactions_other']  = 'citas darbības (atdalīt ar komatiem)';
 $lang['sneaky_index']          = 'Pēc noklusētā DokuWiki lapu sarakstā parāda visu nodaļu lapas. Ieslēdzot šo parametru, noslēps tās nodaļas, kuras apmeklētājam nav tiesības lasīt. Bet tad  tiks arī paslēptas dziļākas, bet atļautas nodaļas. Atsevišķos pieejas tiesību konfigurācijas gadījumos lapu saraksts var nedarboties.';
 $lang['auth_security_timeout'] = 'Autorizācijas drošības intervāls (sekundēs)';
 $lang['securecookie']          = 'Vai pa HTTPS sūtāmās sīkdatnes sūtīt tikai pa HTTPS? Atslēdz šo iespēju, kad tikai pieteikšanās wiki sistēmā notiek pa SSL šifrētu savienojumu, bet skatīšana  - pa nešifrētu.';
-$lang['xmlrpc']                = 'Ieslēgt/izslēgt XML-RPC interfeisu.';
-$lang['xmlrpcuser']            = 'Ierobežot  XML-RPC piekļuvi norādītām lietotāju grupām vai lietotājiem  (atdalīt ar komatiem!). Atstāt tukšu, lai piekļuve būtu visiem.';
 $lang['updatecheck']           = 'Pārbaudīt, vai pieejami atjauninājumi un drošības brīdinājumi? Dokuwiki sazināsies ar update.dokuwiki.org';
 $lang['userewrite']            = 'Ērti lasāmas adreses (URL)';
 $lang['useslash']              = 'Lietot slīpiņu  par URL atdalītāju';
diff --git a/lib/plugins/config/lang/mr/lang.php b/lib/plugins/config/lang/mr/lang.php
index 321e055465d3a8199d779a1716bcd7c37d19e057..4f33bfa7cea8435b634331e184030b17d2f9af3d 100644
--- a/lib/plugins/config/lang/mr/lang.php
+++ b/lib/plugins/config/lang/mr/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other']  = 'इतर क्रिया ( स्वल्
 $lang['sneaky_index']          = 'सूची दृश्यामधे डिफॉल्ट स्वरूपात डॉक्युविकी सगळे नेमस्पेस दाखवते. हा पर्याय चालू केल्यास सदस्याला वाचण्याची परवानगी नसलेले नेमस्पेस दिसणार नाहीत. यामुळे परवानगी असलेले उप - नेमस्पेस न दिसण्याची शक्यता आहे. यामुळे काही विशिष्ठ ACL सेटिंगसाठी सूची वापरता येण्यासारखी राहणार नाही.';
 $lang['auth_security_timeout'] = 'अधिकृत करण्याच्या प्रक्रियेची कालमर्यादा';
 $lang['securecookie']          = 'HTTPS वापरून सेट केलेले कूकीज ब्राउजरने HTTPS द्वाराच पाठवले पाहिजेत का? जर तुमच्या विकीचं फ़क्त लॉगिन पानच SSL वापरून सुरक्षित केलं असेल व पानांचं ब्राउजिंग असुरक्षित असेल तर हा पर्याय चालू करू नका.';
-$lang['xmlrpc']                = 'XML-RPC इंटरफेस चालू/बंद करा';
-$lang['xmlrpcuser']            = 'XML-RPC सुविधा फ़क्त इथे स्वल्पविरामाने अलग करून दिलेल्या गट किंवा वापरकर्त्याला उपलब्ध आहेत. सर्वाना ही सुविधा देण्यासाठी ही जागा रिकामी सोडा.';
 $lang['updatecheck']           = 'अपडेट आणि सुरक्षिततेविशयी सूचनान्वर पाळत ठेऊ का? या सुविधेसाठी डॉक्युविकीला update.dokuwiki.org शी संपर्क साधावा लागेल.';
 $lang['userewrite']            = 'छान छान URL वापर';
 $lang['useslash']              = 'URL  मधे नेमस्पेस अलग करण्यासाठी \'/\' चिह्न वापरा';
diff --git a/lib/plugins/config/lang/nl/lang.php b/lib/plugins/config/lang/nl/lang.php
index c98d05adb87568e01a9b09ee9589d5036d6c1759..77b8d6a1a1d51e1fc292927258492ef863b5a0cb 100644
--- a/lib/plugins/config/lang/nl/lang.php
+++ b/lib/plugins/config/lang/nl/lang.php
@@ -96,8 +96,6 @@ $lang['disableactions_other']  = 'Andere akties (gescheiden door komma\'s)';
 $lang['sneaky_index']          = 'Met de standaardinstellingen zal DokuWiki alle namespaces laten zien in de index. Het inschakelen van deze optie zorgt ervoor dat de namespaces waar de gebruiker geen leestoegang tot heeft, verborgen worden. Dit kan resulteren in het verbergen van subnamespaces waar de gebruiker wel toegang to heeft. Dit kan de index onbruikbaar maken met bepaalde ACL-instellingen.';
 $lang['auth_security_timeout'] = 'Authenticatiebeveiligings-timeout (seconden)';
 $lang['securecookie']          = 'Moeten cookies die via HTTPS gezet zijn alleen via HTTPS verzonden worden door de browser? Zet deze optie uit als alleen het inloggen op de wiki beveiligd is, maar het gebruik verder niet.';
-$lang['xmlrpc']                = 'Inschakelen/uitschakelen XML-RPC interface.';
-$lang['xmlrpcuser']            = 'Beperk XML-RPC toegang tot de lijst met kommagescheiden groepen of gebruikers die hier zijn opgegeven. Laat leeg om iedereen toegang te geven.';
 $lang['updatecheck']           = 'Controleer op nieuwe versies en beveiligingswaarschuwingen? DokuWiki moet hiervoor contact opnemen met update.dokuwiki.org.';
 $lang['userewrite']            = 'Gebruik nette URL\'s';
 $lang['useslash']              = 'Gebruik slash (/) als scheiding tussen namepaces in URL\'s';
diff --git a/lib/plugins/config/lang/no/lang.php b/lib/plugins/config/lang/no/lang.php
index c41b5e56649e310d47165c106b83958e49fbcd8e..ec97fe96622085cf03495e5c5128b3b41894fb24 100644
--- a/lib/plugins/config/lang/no/lang.php
+++ b/lib/plugins/config/lang/no/lang.php
@@ -101,9 +101,6 @@ $lang['disableactions_other']  = 'Andre kommandoer (kommaseparert)';
 $lang['sneaky_index']          = 'DokuWiki vil som standard vise alle navnerom i innholdsfortegnelsen. Hvis du skrur på dette alternativet vil brukere bare se de navnerommene der de har lesetilgang. Dette kan føre til at tilgjengelige undernavnerom skjules. Det kan gjøre innholdsfortegnelsen ubrukelig med enkelte ACL-oppsett.';
 $lang['auth_security_timeout'] = 'Autentisering utløper etter (sekunder)';
 $lang['securecookie']          = 'Skal informasjonskapsler satt via HTTPS kun sendes via HTTPS av nettleseren? Skal ikke velges dersom bare innloggingen til din wiki er sikret med SSL, og annen navigering  på wikien er usikret.';
-$lang['xmlrpc']                = 'Slå på/slå av XML-RPC-grensesnitt';
-$lang['xmlrpcuser']            = 'Å tillate XML-RPC-adgang til bestemte grupper eller brukere, sette deres navne (kommaseparert) her. Slik får du tilgang til alle, la feltet tomt.
-';
 $lang['updatecheck']           = 'Se etter oppdateringer og sikkerhetsadvarsler? Denne funksjonen er avhengig av å kontakte update.dokuwiki.org.';
 $lang['userewrite']            = 'Bruk pene URLer';
 $lang['useslash']              = 'Bruk / som skilletegn mellom navnerom i URLer';
diff --git a/lib/plugins/config/lang/pl/lang.php b/lib/plugins/config/lang/pl/lang.php
index a04f45c87402ef28c728937788759333ef853d21..7ebe5ba929d0568613861f4e3a1d65905d412003 100644
--- a/lib/plugins/config/lang/pl/lang.php
+++ b/lib/plugins/config/lang/pl/lang.php
@@ -97,8 +97,6 @@ $lang['disableactions_other']  = 'Inne akcje (oddzielone przecinkiem)';
 $lang['sneaky_index']          = 'Domyślnie, Dokuwiki pokazuje wszystkie katalogi w indeksie. Włączenie tej opcji ukryje katalogi, do których użytkownik nie ma praw. Może to spowodować ukrycie podkatalogów, do których użytkownik ma prawa. Ta opcja może spowodować błędne działanie indeksu w połączeniu z pewnymi konfiguracjami praw dostępu.';
 $lang['auth_security_timeout'] = 'Czas wygaśnięcia uwierzytelnienia (w sekundach)';
 $lang['securecookie']          = 'Czy ciasteczka wysłane do przeglądarki przez HTTPS powinny być przez nią odsyłane też tylko przez HTTPS? Odznacz tę opcję tylko wtedy, gdy logowanie użytkowników jest zabezpieczone SSL, ale przeglądanie stron odbywa się bez zabezpieczenia.';
-$lang['xmlrpc']                = 'Włącz/wyłącz interfejs XML-RPC';
-$lang['xmlrpcuser']            = 'Lista użytkowników i grup, którzy mogą korzystać z protokołu XML-RPC. Nazwy grup i użytkowników rozdziel przecinkami, puste pole oznacza dostęp dla wszystkich.';
 $lang['updatecheck']           = 'Sprawdzanie aktualizacji i bezpieczeństwa. DokuWiki będzie kontaktować się z serwerem update.dokuwiki.org.';
 $lang['userewrite']            = 'Proste adresy URL';
 $lang['useslash']              = 'Używanie ukośnika jako separatora w adresie URL';
diff --git a/lib/plugins/config/lang/pt-br/lang.php b/lib/plugins/config/lang/pt-br/lang.php
index 093e60ff808bf01bf13438fe3c8b63605b93867a..8c0ef713af5d8de0447e98f3a89353bf038fd6b7 100644
--- a/lib/plugins/config/lang/pt-br/lang.php
+++ b/lib/plugins/config/lang/pt-br/lang.php
@@ -98,8 +98,6 @@ $lang['disableactions_other']  = 'Outras ações (separadas por vírgula)';
 $lang['sneaky_index']          = 'Por padrão, o DokuWiki irá exibir todos os espaços de nomes na visualização do índice. Ao habilitar essa opção, serão escondidos aqueles que o usuário não tiver permissão de leitura. Isso pode resultar na omissão de subespaços de nomes, tornando o índice inútil para certas configurações de ACL.';
 $lang['auth_security_timeout'] = 'Tempo limite de segurança para autenticações (seg)';
 $lang['securecookie']          = 'Os cookies definidos via HTTPS devem ser enviados para o navegador somente via HTTPS? Desabilite essa opção quando somente a autenticação do seu wiki for realizada de maneira segura via SSL e a navegação, de maneira insegura.';
-$lang['xmlrpc']                = 'Habilitar/desabilitar interface XML-RPC.';
-$lang['xmlrpcuser']            = 'Acesso Restrito ao XML-RPC para grupos separados por virgula ou usuários aqui. Deixe em branco para conveder acesso a todos.';
 $lang['updatecheck']           = 'Verificar atualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efetuar esse recurso.';
 $lang['userewrite']            = 'Usar URLs "limpas"';
 $lang['useslash']              = 'Usar a barra como separador de espaços de nomes nas URLs';
diff --git a/lib/plugins/config/lang/pt/lang.php b/lib/plugins/config/lang/pt/lang.php
index fe05bd28121df54992cdccef3399e3b47cd32cd2..d0fe0ac0db841092ed7469aacd3f3be42863f095 100644
--- a/lib/plugins/config/lang/pt/lang.php
+++ b/lib/plugins/config/lang/pt/lang.php
@@ -87,8 +87,6 @@ $lang['disableactions_other']  = 'Outras acções (separadas por vírgula)';
 $lang['sneaky_index']          = 'Por norma, o DokuWiki irá exibir todos os espaços de nomes na visualização do índice. Ao habilitar essa opção, serão escondidos aqueles em que o utilizador não tenha permissão de leitura. Isto pode resultar na omissão de sub-ramos acessíveis, que poderá tornar o índice inútil para certas configurações de ACL.';
 $lang['auth_security_timeout'] = 'Tempo limite de segurança para autenticações (seg)';
 $lang['securecookie']          = 'Os cookies definidos via HTTPS deverão ser enviados para o navegador somente via HTTPS? Desabilite essa opção quando somente a autenticação do seu wiki for realizada de maneira segura via SSL e a navegação de maneira insegura.';
-$lang['xmlrpc']                = 'Habilitar/desabilitar interface XML-RPC.';
-$lang['xmlrpcuser']            = 'Restringir acesso XML-RPC para os grupos separados por vírgula ou utilizadores inseridos aqui. Deixar vazio para dar acesso a todos.';
 $lang['updatecheck']           = 'Verificar por actualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efectuar esta verificação.';
 $lang['userewrite']            = 'Usar URLs SEO';
 $lang['useslash']              = 'Usar a barra como separador de espaços de nomes nas URLs';
diff --git a/lib/plugins/config/lang/ro/lang.php b/lib/plugins/config/lang/ro/lang.php
index dcdea8f77f590790e3ea0071bc2087fd3523dd3d..d638e1eec7a874a3293dd0116275f7ce53e754ab 100644
--- a/lib/plugins/config/lang/ro/lang.php
+++ b/lib/plugins/config/lang/ro/lang.php
@@ -91,8 +91,6 @@ $lang['disableactions_other']  = 'Alte acţiuni (separate prin virgulă)';
 $lang['sneaky_index']          = 'Implicit, DokuWiki va arăta toate numele de spaţii la vizualizarea indexului. Activând această opţiune vor fi ascunse acelea la care utilizatorul nu are drepturi de citire. Aceasta poate determina ascunderea sub-numelor de spaţii accesibile. Aceasta poate face index-ul  inutilizabil cu anumite setări ale ACL';
 $lang['auth_security_timeout'] = 'Timpul de expirare al Autentificării Securizate (secunde)';
 $lang['securecookie']          = 'Cookies-urile setate via HTTPS să fie trimise doar via HTTPS de către browser? Dezactivaţi această opţiune numai când login-ul wiki-ului este securizat cu SSL dar navigarea wiki-ului se realizează nesecurizat.';
-$lang['xmlrpc']                = 'Activează/dezactivează interfaţa XML-RPC';
-$lang['xmlrpcuser']            = 'Restricţionaţi accesul XML-RPC la grupurile sau utilizatorii separaţi prin virgulă daţi aici. Lasaţi gol pentru a da acces tuturor.';
 $lang['updatecheck']           = 'Verificare actualizări şi avertismente privind securitatea? DokuWiki trebuie să contacteze update.dokuwiki.org pentru această facilitate.';
 $lang['userewrite']            = 'Folosire URL-uri "nice"';
 $lang['useslash']              = 'Foloseşte slash-ul ca separator de spaţii de nume în URL-uri';
diff --git a/lib/plugins/config/lang/ru/lang.php b/lib/plugins/config/lang/ru/lang.php
index 01cd1a8d58a393b5668ae7ff3ce082d4a86295f1..098cff534d4f3063072bb513ce83cf52c50103f2 100644
--- a/lib/plugins/config/lang/ru/lang.php
+++ b/lib/plugins/config/lang/ru/lang.php
@@ -100,8 +100,6 @@ $lang['disableactions_other']  = 'Другие операции (через за
 $lang['sneaky_index']          = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
 $lang['auth_security_timeout'] = 'Интервал для безопасности авторизации (сек.)';
 $lang['securecookie']          = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS. Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.';
-$lang['xmlrpc']                = 'Включить/выключить XML-RPC интерфейс.';
-$lang['xmlrpcuser']            = 'Запретить XML-RPC-доступ для списка групп и пользователей, перечисленных через запятую. Оставьте пустым, если хотите оставить доступ всем.';
 $lang['updatecheck']           = 'Проверять наличие обновлений и предупреждений о безопасности? Для этого «ДокуВики» потребуется связываться с сайтом <a href="http://www.splitbrain.org/">splitbrain.org</a>.';
 $lang['userewrite']            = 'Удобочитаемые адреса (URL)';
 $lang['useslash']              = 'Использовать слэш';
diff --git a/lib/plugins/config/lang/sk/lang.php b/lib/plugins/config/lang/sk/lang.php
index 9f55248a3a5b45bf3fbba4b9dd8cf1ef05290d72..cbd69eb9e3034b34bad42ead418f1733c3b6c5ec 100644
--- a/lib/plugins/config/lang/sk/lang.php
+++ b/lib/plugins/config/lang/sk/lang.php
@@ -87,8 +87,6 @@ $lang['disableactions_other']  = 'Iné akcie (oddelené čiarkou)';
 $lang['sneaky_index']          = 'DokuWiki implicitne ukazuje v indexe všetky menné priestory. Povolením tejto voľby sa nezobrazia menné priestory, ku ktorým nemá používateľ právo na čítanie. Dôsledkom môže byť nezobrazenie vnorených prístupných menných priestorov. Táto voľba môže mať za následok nepoužiteľnosť indexu s určitými ACL nastaveniami.';
 $lang['auth_security_timeout'] = 'Časový limit pri prihlasovaní (v sekundách)';
 $lang['securecookie']          = 'Mal by prehliadač posielať cookies nastavené cez HTTPS posielať iba cez HTTPS (bezpečné) pripojenie? Vypnite túto voľbu iba v prípade, ak je prihlasovanie do Vašej wiki zabezpečené SSL, ale prezeranie wiki je nezabezpečené.';
-$lang['xmlrpc']                = 'Povoliť/zakázať XML-RPC rozhranie.';
-$lang['xmlrpcuser']            = 'Obmedziť XML-RPC prístup iba pre uvedené skupiny alebo používateľov (oddelených čiarkami).';
 $lang['updatecheck']           = 'Kontrolovať aktualizácie a bezpečnostné upozornenia? DokuWiki potrebuje pre túto funkciu prístup k update.dokuwiki.org.';
 $lang['userewrite']            = 'Používať nice URLs';
 $lang['useslash']              = 'Používať lomku (/) ako oddeľovač v URL';
diff --git a/lib/plugins/config/lang/sl/lang.php b/lib/plugins/config/lang/sl/lang.php
index ba48368233377ef8434216f5d9296889a98a66b8..364e0fd7fef3e4366268321318905b4d98f0068e 100644
--- a/lib/plugins/config/lang/sl/lang.php
+++ b/lib/plugins/config/lang/sl/lang.php
@@ -89,8 +89,6 @@ $lang['disableactions_other']  = 'Druga dejanja (z vejico ločen seznam)';
 $lang['sneaky_index']          = 'Privzeto pokaže sistem DokuWiki vse imenske prostore v pogledu kazala. Z omogočanjem te možnosti bodo skriti vsi imenski prostori, v katere prijavljen uporabnik nima dovoljenj dostopa. S tem je mogoče preprečiti dostop do podrejenih strani. Možnost lahko vpliva na uporabnost nastavitev nadzora dostopa ACL.';
 $lang['auth_security_timeout'] = 'Varnostna časovna omejitev overitve (v sekundah)';
 $lang['securecookie']          = 'Ali naj se piškotki poslani preko varne povezave HTTPS v brskalniku pošiljajo le preko HTTPS? Onemogočanje možnosti je priporočljivo le takrat, ko je prijava varovana s protokolom  SSL, brskanje po strani pa ni posebej zavarovano.';
-$lang['xmlrpc']                = 'Omogoči/Onemogoči vmesnik XML-RPC.';
-$lang['xmlrpcuser']            = 'Omejitev dostopa do vmesnika XML-RPC z vejico ločenim seznamom skupin in uporabnikov. Prazno polje pomeni, prost dostop za vse uporabnike.';
 $lang['updatecheck']           = 'Ali naj sistem preveri za posodobitve in varnostna opozorila.';
 $lang['userewrite']            = 'Uporabi olepšan zapis naslovov URL';
 $lang['useslash']              = 'Uporabi poševnico kot ločilnik imenskih prostorov v naslovih URL';
diff --git a/lib/plugins/config/lang/sq/lang.php b/lib/plugins/config/lang/sq/lang.php
index adeb2a47dcce260dcb6737fa625938ae6e1d816f..69e283b11bf5e5b16e32f41fa280ebc341fe8616 100644
--- a/lib/plugins/config/lang/sq/lang.php
+++ b/lib/plugins/config/lang/sq/lang.php
@@ -83,8 +83,6 @@ $lang['disableactions_other']  = 'Veprime të tjera (të ndarë me presje)';
 $lang['sneaky_index']          = 'Vetiu DokuWiki tregon të gjithë hapësirat e emrit në shikimin e index-it. Aktivizimi i kësaj alternative do të fshehë ato ku përdoruesi nuk ka të drejta leximi. Kjo mund të përfundojë në fshehje të nënhapësirave të emrit të aksesueshme. Kjo mund ta bëjë index-in të papërdorshëm me disa konfigurime të caktuara të ACL-së.';
 $lang['auth_security_timeout'] = 'Koha e Përfundimit për Autentikim (sekonda)';
 $lang['securecookie']          = 'A duhet që cookies të vendosura nëpërmjet HTTPS të dërgohen vetëm nëpërmjet HTTPS nga shfletuesit? Caktivizojeni këtë alternativë kur vetëm hyrja në wiki-n tuaj sigurohet me SSL por shfletimi i wiki-t bëhet në mënyrë të pasigurtë.';
-$lang['xmlrpc']                = 'Aktivizo/Caktivizo ndërfaqen XML-RPC';
-$lang['xmlrpcuser']            = 'Kufizo aksesin XML-RPC vetëm tek grupet ose përdoruesit e ndarë me presje të dhënë këtu. Lëre bosh për t\'i dhënë akses të gjithëve.';
 $lang['updatecheck']           = 'Kontrollo për përditësime dhe paralajmërime sigurie? DokuWiki duhet të kontaktojë me update.dokuwiki.org për këtë veti.';
 $lang['userewrite']            = 'Përdor URL të këndshme.';
 $lang['useslash']              = 'Përdor / si ndarës të hapësirave të emrit në URL';
diff --git a/lib/plugins/config/lang/sr/lang.php b/lib/plugins/config/lang/sr/lang.php
index 5906dcd7ebb3235a18bb81180125a60db7c78fb0..c675b84e6c70278b20f3e3e793b0c31eb03b7525 100644
--- a/lib/plugins/config/lang/sr/lang.php
+++ b/lib/plugins/config/lang/sr/lang.php
@@ -84,8 +84,6 @@ $lang['disableactions_other']  = 'Остале наредбе (раздвоје
 $lang['sneaky_index']          = 'По инсталацији DokuWiki ће у индексу приказати све именске просторе. Укључивањем ове опције именски простори у којима корисник нема право читања ће бити сакривени. Консеквенца је да ће и доступни подпростори бити сакривени. Ово доводи до неупотребљивости Права приступа у неким поставкама.';
 $lang['auth_security_timeout'] = 'Временска пауза у аутентификацији (секунде)';
 $lang['securecookie']          = 'Да ли колачићи који су постављени преко ХТТПС треба слати веб читачу само преко ХТТПС? Искључите ову опцију само ако је пријављивање на вики заштићено ССЛом а остали део викија незаштићен.';
-$lang['xmlrpc']                = 'Укључи/искључи ИксМЛ-РПЦ интерфејс';
-$lang['xmlrpcuser']            = 'Ограничи ИксМЛ-РПЦ приступ на наведене групе корисника раздвојене зарезом. Остави празно да би свима дао приступ.';
 $lang['updatecheck']           = 'Провера надоградњи и сигурносних упозорења? Dokuwiki мора да контактира update.dokuwiki.org ради добијања информација.';
 $lang['userewrite']            = 'Направи леп УРЛ';
 $lang['useslash']              = 'Користи косу црту у УРЛу за раздвајање именских простора ';
diff --git a/lib/plugins/config/lang/sv/lang.php b/lib/plugins/config/lang/sv/lang.php
index dfd93d37d1ccb7f5f3c82e0d0c8a87b8fd786430..3d83928405a369bbe2ac5086d7a5ebf1aff899b4 100644
--- a/lib/plugins/config/lang/sv/lang.php
+++ b/lib/plugins/config/lang/sv/lang.php
@@ -97,8 +97,6 @@ $lang['disableactions_other']  = 'Andra funktioner (kommaseparerade)';
 $lang['sneaky_index']          = 'Som standard visar DokuWiki alla namnrymder på indexsidan. Genom att aktivera det här valet döljer man namnrymder som användaren inte har behörighet att läsa. Det kan leda till att man döljer åtkomliga undernamnrymder, och gör indexet oanvändbart med vissa ACL-inställningar.';
 $lang['auth_security_timeout'] = 'Autentisieringssäkerhets timeout (sekunder)';
 $lang['securecookie']          = 'Skall cookies som sätts via HTTPS endast skickas via HTTPS från webbläsaren? Avaktivera detta alternativ endast om inloggningen till din wiki är säkrad med SSL men läsning av wikin är osäkrad.';
-$lang['xmlrpc']                = 'Aktivera/avaktivera XML-RPC-gränssnitt';
-$lang['xmlrpcuser']            = 'Begränsa XML-RPC tillträde till komma separerade grupper eller användare som ges här. Lämna tomt för att ge tillgång till alla.';
 $lang['updatecheck']           = 'Kontrollera uppdateringar och säkerhetsvarningar? DokuWiki behöver kontakta update.dokuwiki.org för den här funktionen.';
 $lang['userewrite']            = 'Använd rena webbadresser';
 $lang['useslash']              = 'Använd snedstreck för att separera namnrymder i webbadresser';
diff --git a/lib/plugins/config/lang/th/lang.php b/lib/plugins/config/lang/th/lang.php
index ce7c55e919fec59e0e4568b138c936807c178d3a..140a287dfde5dedc1a46f66c7c2d0742d3f6e09b 100644
--- a/lib/plugins/config/lang/th/lang.php
+++ b/lib/plugins/config/lang/th/lang.php
@@ -41,7 +41,6 @@ $lang['defaultgroup']          = 'กลุ่มมาตรฐาน';
 $lang['profileconfirm']        = 'ใส่รหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงข้อมูล';
 $lang['disableactions_check']  = 'ตรวจสอบ';
 $lang['auth_security_timeout'] = 'ระยะเวลาที่จะตัดการเชื่อมต่อแบบการใช้งานด้วยสิทธิ์ผู้ใช้ (วินาที)';
-$lang['xmlrpc']                = 'ใช้งาน/ยกเลิก การเชื่อมต่อแบบ XML-RPC';
 $lang['userewrite']            = 'แสดงที่อยู่เว็บ (URL) แบบอ่านเข้าใจง่าย';
 $lang['cachetime']             = 'ระยะเวลาสำหรับการเก็บแคช (วินาที)';
 $lang['locktime']              = 'ระยะเวลานานสุด ที่จะล็อคไม่ให้แก้ไขไฟล์ (วินาที)';
diff --git a/lib/plugins/config/lang/uk/lang.php b/lib/plugins/config/lang/uk/lang.php
index 72d7e12f515c495c2d9f314282235d78bc779af5..375c5d3bfc361278875fd8378b358ea5604a46e8 100644
--- a/lib/plugins/config/lang/uk/lang.php
+++ b/lib/plugins/config/lang/uk/lang.php
@@ -91,8 +91,6 @@ $lang['disableactions_other']  = 'Інші дії (розділені комам
 $lang['sneaky_index']          = 'За замовчуванням, ДокуВікі показує всі простори імен в змісті. Активація цієї опції сховає ті простори, де користувач не має прав на читання. Результатом може бути неможливість доступу до певних відкритих просторів імен. Це зробить неможливим використання змісту при певних конфігураціях.';
 $lang['auth_security_timeout'] = 'Таймаут аутентифікації (в секундах)';
 $lang['securecookie']          = 'Чи повинен браузер надсилати файли cookies тільки через HTTPS? Вимкніть цей параметр, лише тоді, якщо вхід до Вікі захищено SSL, але перегляд сторінок відбувається у незахищеному режимі.';
-$lang['xmlrpc']                = 'Дозволити/заборонити XML-RPC інтерфейс';
-$lang['xmlrpcuser']            = 'Заборонити XML-RPC доступ до користувачів або груп поданих тут та розділених комою. Залишіть поле незаповненим, щоб дозволити доступ усім.';
 $lang['updatecheck']           = 'Перевірити наявність оновлень чи попереджень безпеки? Для цього ДокуВікі необхідно зв\'язатися зі update.dokuwiki.org.';
 $lang['userewrite']            = 'Красиві URL';
 $lang['useslash']              = 'Слеш, як розділювач просторів імен в URL';
diff --git a/lib/plugins/config/lang/zh-tw/lang.php b/lib/plugins/config/lang/zh-tw/lang.php
index 4f44eb60d0476bf67a1b63f1691de17d091e5550..dd5f287b9582839f27187eebdd30e3e6577e7577 100644
--- a/lib/plugins/config/lang/zh-tw/lang.php
+++ b/lib/plugins/config/lang/zh-tw/lang.php
@@ -90,8 +90,6 @@ $lang['disableactions_other']  = '其他功能 (逗號分隔)';
 $lang['sneaky_index']          = '預設情況下,DokuWiki 會在索引頁會顯示所有命名空間。啟用此選項會隱藏用戶沒有閱讀權限的頁面,但也可能將能閱讀的子頁面一併隱藏。在特定 ACL 設定下,這可能導致索引無法使用。';
 $lang['auth_security_timeout'] = '安全認證的計時 (秒)';
 $lang['securecookie']          = 'HTTPS 頁面設定的 cookie 是否只能由瀏覽器經 HTTPS 傳送?取消此選項後,只有登入維基會被 SSL 保護而瀏覽時不會。';
-$lang['xmlrpc']                = '啟用/停用 XML-RPC 介面';
-$lang['xmlrpcuser']            = 'XML-RPC 存取權限將局限於在此提供的群組或使用者 (逗號分隔)。若要開放權限給所有人請留白。';
 $lang['updatecheck']           = '檢查更新與安全性警告?DokuWiki 需要聯繫 update.dokuwiki.org 才能使用此功能。';
 $lang['userewrite']            = '使用好看的 URL';
 $lang['useslash']              = '在 URL 中使用斜線作為命名空間的分隔字元';
diff --git a/lib/plugins/config/lang/zh/lang.php b/lib/plugins/config/lang/zh/lang.php
index 2f6444ffa2d4956095ac8c19374d9d2c1feeabf2..5b7229c624ce812da41b6f8410a2f5f71b3b92a5 100644
--- a/lib/plugins/config/lang/zh/lang.php
+++ b/lib/plugins/config/lang/zh/lang.php
@@ -97,8 +97,6 @@ $lang['disableactions_other']  = '其他功能(用英文逗号分隔)';
 $lang['sneaky_index']          = '默认情况下,DokuWiki 在索引页会显示所有 namespace。启用该选项能隐藏那些用户没有权限阅读的页面。但也可能将用户能够阅读的子页面一并隐藏。这有可能导致在特定 ACL 设置下,索引功能不可用。';
 $lang['auth_security_timeout'] = '认证安全超时(秒)';
 $lang['securecookie']          = '要让浏览器须以HTTPS方式传送在HTTPS会话中设置的cookies吗?请只在登录过程为SSL加密而浏览维基为明文的情况下打开此选项。';
-$lang['xmlrpc']                = '启用/禁用 XML-RPC 交互界面。';
-$lang['xmlrpcuser']            = '将 XML-RPC 连接限制在用逗号分隔的组或用户中。留空对所有人开启连接权限。';
 $lang['updatecheck']           = '自动检查更新并接收安全警告吗?开启该功能后 DokuWiki 将自动访问 splitbrain.org。';
 $lang['userewrite']            = '使用更整洁的 URL';
 $lang['useslash']              = '在 URL 中使用斜杠作为命名空间的分隔符';
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index 83f47130c660e120fa54eaf934f1b8e03fa34103..a472a954b32f3034a92dd4e42df8005ad791cfeb 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -138,8 +138,8 @@ $meta['disableactions'] = array('disableactions',
 $meta['sneaky_index'] = array('onoff');
 $meta['auth_security_timeout'] = array('numeric');
 $meta['securecookie'] = array('onoff');
-$meta['xmlrpc']       = array('onoff');
-$meta['xmlrpcuser']   = array('string');
+$meta['remote']       = array('onoff');
+$meta['remoteuser']   = array('string');
 
 $meta['_anti_spam']  = array('fieldset');
 $meta['usewordblock']= array('onoff');
diff --git a/lib/plugins/remote.php b/lib/plugins/remote.php
new file mode 100644
index 0000000000000000000000000000000000000000..a51f701fbf87e7158cbe3246c5d74934dbeb9767
--- /dev/null
+++ b/lib/plugins/remote.php
@@ -0,0 +1,21 @@
+<?php
+
+abstract class DokuWiki_Remote_Plugin extends DokuWiki_Plugin {
+
+    private  $api;
+
+    public function __construct() {
+        $this->api = new RemoteAPI();
+    }
+
+    /**
+     * @abstract
+     * @return array Information to all provided methods. {@see RemoteAPI}.
+     */
+    public abstract function _getMethods();
+
+    protected function getApi() {
+        return $this->api;
+    }
+
+}