diff --git a/core/modules/xmlrpc/lib/Drupal/xmlrpc/Tests/XmlRpcMessagesTest.php b/core/modules/xmlrpc/lib/Drupal/xmlrpc/Tests/XmlRpcMessagesTest.php
index 014c60b..a05fa9f 100644
--- a/core/modules/xmlrpc/lib/Drupal/xmlrpc/Tests/XmlRpcMessagesTest.php
+++ b/core/modules/xmlrpc/lib/Drupal/xmlrpc/Tests/XmlRpcMessagesTest.php
@@ -62,4 +62,34 @@ protected function testAlterListMethods() {
     $this->assertEqual($removed, 'system.methodSignature', 'Hiding builting system.methodSignature with hook_xmlrpc_alter works');
   }
 
+  /**
+   * Ensure that XML-RPC client sets correct encoding in request http headers.
+   */
+  function testRequestContentTypeDefinition() {
+    $url = url('xmlrpc.php', array('absolute' => TRUE));
+    $headers = xmlrpc($url, array('test.headerEcho' => array()));
+    $this->assertIdentical($headers['Content-Type'], 'text/xml; charset=utf-8');
+  }
+
+  /**
+   * Ensure that XML-RPC client sets correct processing instructions for XML documents.
+   * Ensure that XML-RPC server sets correct encoding in response http headers
+   * and processing instructions for XML documents.
+   */
+  function testRequestAndResponseEncodingDefinitions() {
+    $url = url('xmlrpc.php', array('absolute' => TRUE));
+    // We can't use the xmlrpc() function here,
+    // because we have to access the full response of drupal_http_request().
+    $xmlrpc_request = xmlrpc_request('system.listMethods', array());
+    $options['method'] = 'POST';
+    $options['headers']['Content-Type'] = 'text/xml; charset=utf-8';
+    $options['data'] = $xmlrpc_request->xml;
+    $result = drupal_http_request($url, $options);
+    // The string $result->request contains some header data before
+    // the xml itself starts with the processing instruction.
+    $this->assertTrue(strpos($result->request, '<?xml version="1.0" encoding="utf-8" ?>'), 'Request Processing Instruction is "&lt;?xml version="1.0" encoding="utf-8" ?&gt;"');
+    // The string $result->data has to start with the xml processing instruction.
+    $this->assertIdentical(strpos($result->data, '<?xml version="1.0" encoding="utf-8" ?>'), 0, 'Response Processing Instruction is "&lt;?xml version="1.0" encoding="utf-8" ?&gt;"');
+    $this->assertIdentical($result->headers['content-type'], 'text/xml; charset=utf-8');
+  }
 }
diff --git a/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module b/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module
index db8f113..bb4d74b 100644
--- a/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module
+++ b/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module
@@ -46,6 +46,13 @@ function xmlrpc_test_simpleStructReturnTest($number) {
 }
 
 /**
+ * Echos http headers to XML-RPC clients.
+ */
+function xmlrpc_test_header_echo() {
+  return getallheaders();
+}
+
+/**
  * Implements hook_xmlrpc().
  */
 function xmlrpc_test_xmlrpc() {
@@ -59,6 +66,7 @@ function xmlrpc_test_xmlrpc() {
     'validator1.nestedStructTest' => 'xmlrpc_test_nestedStructTest',
     'validator1.simpleStructReturnTest' => 'xmlrpc_test_simpleStructReturnTest',
     'messages.messageSizedInKB' => 'xmlrpc_test_message_sized_in_kb',
+    'test.headerEcho' => 'xmlrpc_test_header_echo',
   );
 }
 
diff --git a/core/modules/xmlrpc/xmlrpc.inc b/core/modules/xmlrpc/xmlrpc.inc
index b1c6f39..ed7a0e1 100644
--- a/core/modules/xmlrpc/xmlrpc.inc
+++ b/core/modules/xmlrpc/xmlrpc.inc
@@ -371,7 +371,7 @@ function xmlrpc_request($method, $args) {
   $xmlrpc_request->method = $method;
   $xmlrpc_request->args = $args;
   $xmlrpc_request->xml = <<<EOD
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <methodCall>
 <methodName>{$xmlrpc_request->method}</methodName>
 <params>
@@ -560,7 +560,7 @@ function _xmlrpc($url, $args, $options = array()) {
   $xmlrpc_request = xmlrpc_request($method, $args);
   // Required options which will replace any that are passed in.
   $options['method'] = 'POST';
-  $options['headers']['Content-Type'] = 'text/xml';
+  $options['headers']['Content-Type'] = 'text/xml; charset=utf-8';
   $options['data'] = $xmlrpc_request->xml;
   $result = drupal_http_request($url, $options);
   if ($result->code != 200) {
diff --git a/core/modules/xmlrpc/xmlrpc.server.inc b/core/modules/xmlrpc/xmlrpc.server.inc
index e1c160b..eb09892 100644
--- a/core/modules/xmlrpc/xmlrpc.server.inc
+++ b/core/modules/xmlrpc/xmlrpc.server.inc
@@ -130,9 +130,9 @@ function xmlrpc_server_error($error, $message = FALSE) {
  *   XML to send to the browser.
  */
 function xmlrpc_server_output($xml) {
-  $xml = '<?xml version="1.0"?>' . "\n" . $xml;
+  $xml = '<?xml version="1.0" encoding="utf-8" ?>' . "\n" . $xml;
   drupal_add_http_header('Content-Length', strlen($xml));
-  drupal_add_http_header('Content-Type', 'text/xml');
+  drupal_add_http_header('Content-Type', 'text/xml; charset=utf-8');
   echo $xml;
   drupal_exit();
 }
