diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index 820e351ecba6468db8ea219b2c51dbdd9c39a42e..bf499efd3e441befabac967820fd264e9cf44fe2 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -1128,6 +1128,44 @@ function hook_xmlrpc() {
   );
 }
 
+/**
+ * Alter the definition of XML-RPC methods before they are called.
+ *
+ * This hook lets at module modify the callback definition for already
+ * declared XML-RPC methods, when they are being invoked by a client.
+ *
+ * This hook is invoked by xmlrpc.php. The method definitions are
+ * passed in by reference. Each element of the $methods array is one
+ * callback definition returned by a module from hook_xmlrpc. Additional
+ * methods may be added, or existing items altered.
+ *
+ * Modules implementing this hook must take care of the fact that
+ * hook_xmlrpc allows two distinct and incompatible formats for callback
+ * definition, so module must be prepared to handle either format for
+ * each callback being altered.
+ *
+ * @see hook_xmlrpc()
+ *
+ * @param $methods
+ *   Associative array of method callback definitions returned from
+ *   hook_xmlrpc.
+ */
+function hook_xmlrpc_alter(&$methods) {
+
+  // Direct update for methods defined the simple way
+  $methods['drupal.login'] = 'mymodule_login';
+
+  // Lookup update for methods defined the complex way
+  foreach ($methods as $key => &$method) {
+    if (!is_int($key)) {
+      continue;
+    }
+    if ($method[0] == 'drupal.site.ping') {
+      $method[1] = 'mymodule_directory_ping';
+    }
+  }
+}
+
 /**
  * Log an event message
  *
diff --git a/xmlrpc.php b/xmlrpc.php
index fee29fd5e60cad0b4922964ea1512127b76885e9..5787f5b195a1074b97822d8a4e1aabad54e56582 100644
--- a/xmlrpc.php
+++ b/xmlrpc.php
@@ -17,5 +17,5 @@
 include_once DRUPAL_ROOT . '/includes/xmlrpcs.inc';
 
 $services = module_invoke_all('xmlrpc');
-drupal_alter('xmlrpc_alter', $services);
+drupal_alter('xmlrpc', $services);
 xmlrpc_server($services);