diff --git a/core/includes/common.inc b/core/includes/common.inc
index 4a8b1f0..80f63cb 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -7440,39 +7440,6 @@ function drupal_check_incompatibility($v, $current_version) {
 }
 
 /**
- * Performs one or more XML-RPC request(s).
- *
- * Usage example:
- * @code
- * $result = xmlrpc('http://example.com/xmlrpc.php', array(
- *   'service.methodName' => array($parameter, $second, $third),
- * ));
- * @endcode
- *
- * @param $url
- *   An absolute URL of the XML-RPC endpoint.
- * @param $args
- *   An associative array whose keys are the methods to call and whose values
- *   are the arguments to pass to the respective method. If multiple methods
- *   are specified, a system.multicall is performed.
- * @param $options
- *   (optional) An array of options to pass along to drupal_http_request().
- *
- * @return
- *   For one request:
- *     Either the return value of the method on success, or FALSE.
- *     If FALSE is returned, see xmlrpc_errno() and xmlrpc_error_msg().
- *   For multiple requests:
- *     An array of results. Each result will either be the result
- *     returned by the method called, or an xmlrpc_error object if the call
- *     failed. See xmlrpc_error().
- */
-function xmlrpc($url, $args, $options = array()) {
-  require_once DRUPAL_ROOT . '/core/includes/xmlrpc.inc';
-  return _xmlrpc($url, $args, $options);
-}
-
-/**
  * Retrieves a list of all available archivers.
  *
  * @see hook_archiver_info()
diff --git a/core/modules/system/system.info b/core/modules/system/system.info
index 1b87b85..00532b3 100644
--- a/core/modules/system/system.info
+++ b/core/modules/system/system.info
@@ -36,6 +36,5 @@ files[] = tests/theme.test
 files[] = tests/unicode.test
 files[] = tests/update.test
 files[] = tests/uuid.test
-files[] = tests/xmlrpc.test
 files[] = tests/upgrade/upgrade.test
 files[] = tests/upgrade/upgrade.language.test
diff --git a/core/modules/system/tests/xmlrpc.test b/core/modules/xmlrpc/tests/xmlrpc.test
similarity index 96%
rename from core/modules/system/tests/xmlrpc.test
rename to core/modules/xmlrpc/tests/xmlrpc.test
index b5c07ca..16b04b1 100644
--- a/core/modules/system/tests/xmlrpc.test
+++ b/core/modules/xmlrpc/tests/xmlrpc.test
@@ -15,6 +15,10 @@ class XMLRPCBasicTestCase extends WebTestBase {
     );
   }
 
+  function setUp() {
+    parent::setUp('xmlrpc');
+  }
+
   /**
    * Ensure that a basic XML-RPC call with no parameters works.
    */
@@ -31,7 +35,7 @@ class XMLRPCBasicTestCase extends WebTestBase {
     );
 
     // Invoke XML-RPC call to get list of methods.
-    $url = $base_url . '/core/xmlrpc.php';
+    $url = $base_url . '/xmlrpc.php';
     $methods = xmlrpc($url, array('system.listMethods' => array()));
 
     // Ensure that the minimum methods were found.
@@ -51,7 +55,7 @@ class XMLRPCBasicTestCase extends WebTestBase {
   protected function testMethodSignature() {
     global $base_url;
 
-    $url = $base_url . '/core/xmlrpc.php';
+    $url = $base_url . '/xmlrpc.php';
     $signature = xmlrpc($url, array('system.methodSignature' => array('system.listMethods')));
     $this->assert(is_array($signature) && !empty($signature) && is_array($signature[0]),
       t('system.methodSignature returns an array of signature arrays.'));
@@ -96,7 +100,7 @@ class XMLRPCValidator1IncTestCase extends WebTestBase {
   }
 
   function setUp() {
-    parent::setUp('xmlrpc_test');
+    parent::setUp('xmlrpc', 'xmlrpc_test');
   }
 
   /**
@@ -104,7 +108,7 @@ class XMLRPCValidator1IncTestCase extends WebTestBase {
    */
   function testValidator1() {
     global $base_url;
-    $xml_url = $base_url . '/core/xmlrpc.php';
+    $xml_url = $base_url . '/xmlrpc.php';
     srand();
     mt_srand();
 
@@ -211,7 +215,7 @@ class XMLRPCMessagesTestCase extends WebTestBase {
   }
 
   function setUp() {
-    parent::setUp('xmlrpc_test');
+    parent::setUp('xmlrpc', 'xmlrpc_test');
   }
 
   /**
@@ -220,7 +224,7 @@ class XMLRPCMessagesTestCase extends WebTestBase {
   function testSizedMessages() {
     global $base_url;
 
-    $xml_url = $base_url . '/core/xmlrpc.php';
+    $xml_url = $base_url . '/xmlrpc.php';
     $sizes = array(8, 80, 160);
     foreach ($sizes as $size) {
       $xml_message_l = xmlrpc_test_message_sized_in_kb($size);
@@ -238,7 +242,7 @@ class XMLRPCMessagesTestCase extends WebTestBase {
 
     // Ensure xmlrpc_test_xmlrpc_alter() is disabled and retrieve regular list of methods.
     variable_set('xmlrpc_test_xmlrpc_alter', FALSE);
-    $url = $base_url . '/core/xmlrpc.php';
+    $url = $base_url . '/xmlrpc.php';
     $methods1 = xmlrpc($url, array('system.listMethods' => array()));
 
     // Enable the alter hook and retrieve the list of methods again.
diff --git a/core/modules/system/tests/modules/xmlrpc_test/xmlrpc_test.info b/core/modules/xmlrpc/tests/xmlrpc_test/xmlrpc_test.info
similarity index 100%
rename from core/modules/system/tests/modules/xmlrpc_test/xmlrpc_test.info
rename to core/modules/xmlrpc/tests/xmlrpc_test/xmlrpc_test.info
diff --git a/core/modules/system/tests/modules/xmlrpc_test/xmlrpc_test.module b/core/modules/xmlrpc/tests/xmlrpc_test/xmlrpc_test.module
similarity index 100%
rename from core/modules/system/tests/modules/xmlrpc_test/xmlrpc_test.module
rename to core/modules/xmlrpc/tests/xmlrpc_test/xmlrpc_test.module
diff --git a/core/modules/xmlrpc/xmlrpc.info b/core/modules/xmlrpc/xmlrpc.info
new file mode 100644
index 0000000..7782abe
--- /dev/null
+++ b/core/modules/xmlrpc/xmlrpc.info
@@ -0,0 +1,7 @@
+name = XML-RPC
+description = Provides XML-RPC functionality.
+package = Core
+version = VERSION
+core = 8.x
+files[] = tests/xmlrpc.test
+
diff --git a/core/modules/xmlrpc/xmlrpc.module b/core/modules/xmlrpc/xmlrpc.module
new file mode 100644
index 0000000..2ab6494
--- /dev/null
+++ b/core/modules/xmlrpc/xmlrpc.module
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Enables XML-RPC functionality.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function xmlrpc_menu() {
+  $items['xmlrpc.php'] = array(
+    'title' => 'XML-RPC',
+    'page callback' => 'xmlrpc_server_page',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+    'file' => 'xmlrpc.server.inc',
+  );
+  return $items;
+}
+
+/**
+ * Performs one or more XML-RPC request(s).
+ *
+ * Usage example:
+ * @code
+ * $result = xmlrpc('http://example.com/xmlrpc.php', array(
+ *   'service.methodName' => array($parameter, $second, $third),
+ * ));
+ * @endcode
+ *
+ * @param $url
+ *   An absolute URL of the XML-RPC endpoint.
+ * @param $args
+ *   An associative array whose keys are the methods to call and whose values
+ *   are the arguments to pass to the respective method. If multiple methods
+ *   are specified, a system.multicall is performed.
+ * @param $options
+ *   (optional) An array of options to pass along to drupal_http_request().
+ *
+ * @return
+ *   For one request:
+ *     Either the return value of the method on success, or FALSE.
+ *     If FALSE is returned, see xmlrpc_errno() and xmlrpc_error_msg().
+ *   For multiple requests:
+ *     An array of results. Each result will either be the result
+ *     returned by the method called, or an xmlrpc_error object if the call
+ *     failed. See xmlrpc_error().
+ */
+function xmlrpc($url, $args, $options = array()) {
+  module_load_include('inc', 'xmlrpc');
+  return _xmlrpc($url, $args, $options);
+}
+
diff --git a/core/includes/xmlrpcs.inc b/core/modules/xmlrpc/xmlrpc.server.inc
similarity index 98%
rename from core/includes/xmlrpcs.inc
rename to core/modules/xmlrpc/xmlrpc.server.inc
index 118f652..1c0d8e5 100644
--- a/core/includes/xmlrpcs.inc
+++ b/core/modules/xmlrpc/xmlrpc.server.inc
@@ -2,8 +2,16 @@
 
 /**
  * @file
- * Provides API for defining and handling XML-RPC requests.
+ * Page callback file for the xmlrpc module.
  */
+ 
+/**
+ * Process an XML-RPC request.
+ */
+function xmlrpc_server_page() {
+  module_load_include('inc', 'xmlrpc');
+  xmlrpc_server(module_invoke_all('xmlrpc'));
+}
 
 /**
  * Invokes XML-RPC methods on this server.
diff --git a/core/xmlrpc.php b/core/xmlrpc.php
deleted file mode 100644
index 562aa81..0000000
--- a/core/xmlrpc.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/**
- * @file
- * PHP page for handling incoming XML-RPC requests from clients.
- */
-
-// Change the directory to the Drupal root.
-chdir('..');
-
-/**
- * Root directory of Drupal installation.
- */
-define('DRUPAL_ROOT', getcwd());
-
-include_once DRUPAL_ROOT . '/core/includes/bootstrap.inc';
-drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
-include_once DRUPAL_ROOT . '/core/includes/xmlrpc.inc';
-include_once DRUPAL_ROOT . '/core/includes/xmlrpcs.inc';
-
-xmlrpc_server(module_invoke_all('xmlrpc'));
