diff --git a/includes/ajax.inc b/includes/ajax.inc
index 6bfd86d77554ab9435d524f3e7f5aa67af911a7a..dca3cc76e0a73fe43577db602df64696c2a33618 100644
--- a/includes/ajax.inc
+++ b/includes/ajax.inc
@@ -105,8 +105,8 @@
  *   A list of macro commands generated by the use of ajax_command_*()
  *   functions.
  * @param $header
- *   If set to FALSE the 'text/javascript' header used by drupal_json() will
- *   not be used, which is necessary when using an IFRAME. If set to
+ *   If set to FALSE the 'text/javascript' header used by drupal_json_output()
+ *   will not be used, which is necessary when using an IFRAME. If set to
  *   'multipart' the output will be wrapped in a textarea, which can also be
  *   used as an alternative method when uploading files.
  */
@@ -123,17 +123,17 @@ function ajax_render($commands = array(), $header = TRUE) {
 
   // Use === here so that bool TRUE doesn't match 'multipart'.
   if ($header === 'multipart') {
-    // We do not use drupal_json() here because the header is not true. We are
-    // not really returning JSON, strictly-speaking, but rather JSON content
-    // wrapped in a textarea as per the "file uploads" example here:
+    // We do not use drupal_json_output() here because the header is not true.
+    // We are not really returning JSON, strictly-speaking, but rather JSON
+    // content wrapped in a textarea as per the "file uploads" example here:
     // http://malsup.com/jquery/form/#code-samples
-    print '<textarea>' . drupal_to_js($commands) . '</textarea>';
+    print '<textarea>' . drupal_json_encode($commands) . '</textarea>';
   }
   else if ($header) {
-    drupal_json($commands);
+    drupal_json_output($commands);
   }
   else {
-    print drupal_to_js($commands);
+    print drupal_json_encode($commands);
   }
   exit;
 }
diff --git a/includes/batch.inc b/includes/batch.inc
index 5fe876f9d518d9e50f2f029f7748360680b185ab..5cdcec0bd905543cf1a2ac05c087ffa743ecdcf2 100644
--- a/includes/batch.inc
+++ b/includes/batch.inc
@@ -140,7 +140,7 @@ function _batch_do() {
   // Perform actual processing.
   list($percentage, $message) = _batch_process();
 
-  drupal_json(array('status' => TRUE, 'percentage' => $percentage, 'message' => $message));
+  drupal_json_output(array('status' => TRUE, 'percentage' => $percentage, 'message' => $message));
 }
 
 /**
diff --git a/includes/common.inc b/includes/common.inc
index 479d0952eaaecf99add7428e58fdae8d9d75be50..9037365ff18383929220765a37036464ac85b5aa 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -3167,7 +3167,7 @@ function drupal_get_js($scope = 'header', $javascript = NULL) {
   foreach ($items as $item) {
     switch ($item['type']) {
       case 'setting':
-        $output .= '<script type="text/javascript">' . $embed_prefix . 'jQuery.extend(Drupal.settings, ' . drupal_to_js(call_user_func_array('array_merge_recursive', $item['data'])) . ");" . $embed_suffix . "</script>\n";
+        $output .= '<script type="text/javascript">' . $embed_prefix . 'jQuery.extend(Drupal.settings, ' . drupal_json_encode(call_user_func_array('array_merge_recursive', $item['data'])) . ");" . $embed_suffix . "</script>\n";
         break;
 
       case 'inline':
@@ -3585,7 +3585,7 @@ function drupal_clear_js_cache() {
  *
  * We use HTML-safe strings, i.e. with <, > and & escaped.
  */
-function drupal_to_js($var) {
+function drupal_json_encode($var) {
   // json_encode() does not escape <, > and &, so we do it with str_replace()
   return str_replace(array("<", ">", "&"), array('\x3c', '\x3e', '\x26'), json_encode($var));
 }
@@ -3599,12 +3599,12 @@ function drupal_to_js($var) {
  * @param $var
  *   (optional) If set, the variable will be converted to JSON and output.
  */
-function drupal_json($var = NULL) {
+function drupal_json_output($var = NULL) {
   // We are returning JavaScript, so tell the browser.
   drupal_set_header('Content-Type', 'text/javascript; charset=utf-8');
 
   if (isset($var)) {
-    echo drupal_to_js($var);
+    echo drupal_json_encode($var);
   }
 }
 
diff --git a/includes/locale.inc b/includes/locale.inc
index 4962f2fd76d44e845eae639692227cc57a788dd8..6ee5baa8202583d5be840510b549dab0ddeaa811 100644
--- a/includes/locale.inc
+++ b/includes/locale.inc
@@ -2425,7 +2425,7 @@ function _locale_rebuild_js($langcode = NULL) {
       $data .= "'pluralFormula': function (\$n) { return Number({$language->formula}); }, ";
     }
 
-    $data .= "'strings': " . drupal_to_js($translations) . " };";
+    $data .= "'strings': " . drupal_json_encode($translations) . " };";
     $data_hash = md5($data);
   }
 
diff --git a/modules/field/field.test b/modules/field/field.test
index 34a5613928fca68fc88bbb65fe3c90343efe65dd..9d770076f3a811ad62f5726bc0aec7203d31ff92 100644
--- a/modules/field/field.test
+++ b/modules/field/field.test
@@ -1405,7 +1405,7 @@ class FieldFormTestCase extends FieldTestCase {
     $this->drupalPost(NULL, $edit, $submit);
     unset($this->additionalCurlOptions[CURLOPT_URL]);
 
-    // The response is drupal_json, so we need to undo some escaping.
+    // The response is drupal_json_output, so we need to undo some escaping.
     $commands = json_decode(str_replace(array('\x3c', '\x3e', '\x26'), array("<", ">", "&"), $this->drupalGetContent()));
 
     // The JSON response will be two AJAX commands. The first is a settings
diff --git a/modules/poll/poll.test b/modules/poll/poll.test
index a5f668efaaa765e635f842f63a60fff060efabf9..c7f8e5c17538c11522351b62b81c6842c4ecba85 100644
--- a/modules/poll/poll.test
+++ b/modules/poll/poll.test
@@ -344,7 +344,7 @@ class PollJSAddChoice extends DrupalWebTestCase {
     $this->drupalPost(NULL, $edit, t('More choices'));
     unset($this->additionalCurlOptions[CURLOPT_URL]);
 
-    // The response is drupal_json, so we need to undo some escaping.
+    // The response is drupal_json_output, so we need to undo some escaping.
     $commands = json_decode(str_replace(array('\x3c', '\x3e', '\x26'), array("<", ">", "&"), $this->drupalGetContent()));
 
     // The JSON response will be two AJAX commands. The first is a settings
diff --git a/modules/profile/profile.admin.inc b/modules/profile/profile.admin.inc
index b01d7a0be2296155158b881b961cae5618059a98..a9303e6e747e01c1d41f8c0cdfd4fdce98bb24c7 100644
--- a/modules/profile/profile.admin.inc
+++ b/modules/profile/profile.admin.inc
@@ -423,5 +423,5 @@ function profile_admin_settings_autocomplete($string) {
   foreach ($result as $data) {
     $matches[$data->category] = check_plain($data->category);
   }
-  drupal_json($matches);
+  drupal_json_output($matches);
 }
diff --git a/modules/profile/profile.pages.inc b/modules/profile/profile.pages.inc
index b338e86047c3ed4441bbffe541e9a27fa8f61de0..300e57cae64534a1040ee302cffa40f04fe40da3 100644
--- a/modules/profile/profile.pages.inc
+++ b/modules/profile/profile.pages.inc
@@ -134,5 +134,5 @@ function profile_autocomplete($field, $string) {
     }
   }
 
-  drupal_json($matches);
+  drupal_json_output($matches);
 }
diff --git a/modules/simpletest/tests/database_test.module b/modules/simpletest/tests/database_test.module
index df446deb8e0a2b4253fef97efe3619760c8634c4..422f097fcf361d199469a1873837b8cc5fe9422f 100644
--- a/modules/simpletest/tests/database_test.module
+++ b/modules/simpletest/tests/database_test.module
@@ -77,7 +77,7 @@ function database_test_menu() {
  */
 function database_test_db_query_temporary() {
   $table_name = db_query_temporary('SELECT status FROM {system}', array());
-  drupal_json(array(
+  drupal_json_output(array(
     'table_name' => $table_name,
     'row_count' => db_select($table_name)->countQuery()->execute()->fetchField(),
   ));
@@ -102,7 +102,7 @@ function database_test_even_pager_query($limit) {
 
   $names = $query->execute()->fetchCol();
 
-  drupal_json(array(
+  drupal_json_output(array(
     'names' => $names,
   ));
   exit;
@@ -126,7 +126,7 @@ function database_test_odd_pager_query($limit) {
 
   $names = $query->execute()->fetchCol();
 
-  drupal_json(array(
+  drupal_json_output(array(
     'names' => $names,
   ));
   exit;
@@ -155,7 +155,7 @@ function database_test_tablesort() {
   // We need all the results at once to check the sort.
   $tasks = $query->execute()->fetchAll();
 
-  drupal_json(array(
+  drupal_json_output(array(
     'tasks' => $tasks,
   ));
   exit;
@@ -184,7 +184,7 @@ function database_test_tablesort_first() {
   // We need all the results at once to check the sort.
   $tasks = $query->execute()->fetchAll();
 
-  drupal_json(array(
+  drupal_json_output(array(
     'tasks' => $tasks,
   ));
   exit;
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc
index 2d8c81713aaeb45c3e6e157b55c1b03628269bd8..74dbd47a8d1a7abe565808323d26ea51dd0706a9 100644
--- a/modules/system/system.admin.inc
+++ b/modules/system/system.admin.inc
@@ -1790,7 +1790,7 @@ function system_regional_settings_submit($form, &$form_state) {
  */
 function system_date_time_lookup() {
   $result = format_date(REQUEST_TIME, 'custom', $_GET['format']);
-  drupal_json($result);
+  drupal_json_output($result);
 }
 
 /**
diff --git a/modules/system/system.module b/modules/system/system.module
index ab3c966b53c85a55b2c7b2561e3954e9debc2158..7ed7a68186a357715d696f391139e124e218e8ef 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -816,7 +816,7 @@ function system_menu() {
   );
   $items['admin/config/search/clean-urls/check'] = array(
     'title' => 'Clean URL check',
-    'page callback' => 'drupal_json',
+    'page callback' => 'drupal_json_output',
     'page arguments' => array(array('status' => TRUE)),
     'access callback' => TRUE,
     'type' => MENU_CALLBACK,
@@ -2656,7 +2656,7 @@ function system_timezone($abbreviation = '', $offset = -1, $is_daylight_saving_t
   // interpreted as the empty string.
   $abbreviation = $abbreviation ? $abbreviation : '';
   $timezone = timezone_name_from_abbr($abbreviation, intval($offset), $is_daylight_saving_time);
-  drupal_json($timezone);
+  drupal_json_output($timezone);
 }
 
 /**
@@ -2768,7 +2768,7 @@ function system_page_build(&$page) {
       // Trigger cron run via AJAX.
       '#attached' => array(
         'js' => array(
-          '(function($){ $.get(' . drupal_to_js(url('system/run-cron-image')) . '); })(jQuery);' => array('type' => 'inline', 'scope' => 'header'),
+          '(function($){ $.get(' . drupal_json_encode(url('system/run-cron-image')) . '); })(jQuery);' => array('type' => 'inline', 'scope' => 'header'),
         ),
       ),
       // Trigger cron run for clients not supporting JavaScript (fall-back).
diff --git a/modules/taxonomy/taxonomy.pages.inc b/modules/taxonomy/taxonomy.pages.inc
index 488db57624211714f98cce7652663590acb8ab68..e6d68d2cc7d22e5ca85b5c75f560f89b744de9f9 100644
--- a/modules/taxonomy/taxonomy.pages.inc
+++ b/modules/taxonomy/taxonomy.pages.inc
@@ -135,7 +135,7 @@ function taxonomy_autocomplete_legacy($vid = 0, $tags_typed = '') {
     }
   }
 
-  drupal_json(array_merge($term_matches, $synonym_matches));
+  drupal_json_output(array_merge($term_matches, $synonym_matches));
 }
 
 /**
@@ -191,5 +191,5 @@ function taxonomy_autocomplete($field_name, $bundle, $tags_typed = '') {
     }
   }
 
-  drupal_json($term_matches);
+  drupal_json_output($term_matches);
 }
diff --git a/modules/upload/upload.module b/modules/upload/upload.module
index 055e0cd91f9f417e636f7263dac47f70d043570f..e4451c3aad5330153ee12321f3ad48f50c59a0cd 100644
--- a/modules/upload/upload.module
+++ b/modules/upload/upload.module
@@ -644,7 +644,7 @@ function upload_js() {
   if (!($cached_form = form_get_cache($_POST['form_build_id'], $cached_form_state)) || !isset($cached_form['#node']) || !isset($cached_form['attachments'])) {
     form_set_error('form_token', t('Validation error, please try again. If this error persists, please contact the site administrator.'));
     $output = theme('status_messages');
-    print drupal_to_js(array('status' => TRUE, 'data' => $output));
+    print drupal_json_encode(array('status' => TRUE, 'data' => $output));
     exit();
   }
 
diff --git a/modules/user/user.pages.inc b/modules/user/user.pages.inc
index 80e00ae49f141c1ff09ed748b6f0a9d292e7633e..cfe7015302a6a1ea02ca399f7bf0d64490207ea7 100644
--- a/modules/user/user.pages.inc
+++ b/modules/user/user.pages.inc
@@ -18,7 +18,7 @@ function user_autocomplete($string = '') {
     }
   }
 
-  drupal_json($matches);
+  drupal_json_output($matches);
 }
 
 /**