diff --git a/core/includes/authorize.inc b/core/includes/authorize.inc
index b4e7282..459b7a5 100644
--- a/core/includes/authorize.inc
+++ b/core/includes/authorize.inc
@@ -103,12 +103,6 @@ function authorize_filetransfer_form($form, &$form_state) {
 
     // Start non-JS code.
     if (isset($form_state['values']['connection_settings']['authorize_filetransfer_default']) && $form_state['values']['connection_settings']['authorize_filetransfer_default'] == $name) {
-
-      // If the user switches from JS to non-JS, Drupal (and Batch API) will
-      // barf. This is a known bug: http://drupal.org/node/229825.
-      setcookie('has_js', '', time() - 3600, '/');
-      unset($_COOKIE['has_js']);
-
       // Change the submit button to the submit_process one.
       $form['submit_process']['#attributes'] = array();
       unset($form['submit_connection']);
diff --git a/core/includes/batch.inc b/core/includes/batch.inc
index 83ddd30..9338f4d 100644
--- a/core/includes/batch.inc
+++ b/core/includes/batch.inc
@@ -72,7 +72,9 @@ function _batch_page() {
   $output = NULL;
   switch ($op) {
     case 'start':
-      $output = _batch_start();
+    case 'do_nojs':
+      // Non-JavaScript-based progress page.
+      $output = _batch_progress_page();
       break;
 
     case 'do':
@@ -80,11 +82,6 @@ function _batch_page() {
       _batch_do();
       break;
 
-    case 'do_nojs':
-      // Non-JavaScript-based progress page.
-      $output = _batch_progress_page_nojs();
-      break;
-
     case 'finished':
       $output = _batch_finished();
       break;
@@ -94,56 +91,6 @@ function _batch_page() {
 }
 
 /**
- * Initializes the batch processing.
- *
- * JavaScript-enabled clients are identified by the 'has_js' cookie set in
- * drupal.js. If no JavaScript-enabled page has been visited during the current
- * user's browser session, the non-JavaScript version is returned.
- */
-function _batch_start() {
-  if (isset($_COOKIE['has_js']) && $_COOKIE['has_js']) {
-    return _batch_progress_page_js();
-  }
-  else {
-    return _batch_progress_page_nojs();
-  }
-}
-
-/**
- * Outputs a batch processing page with JavaScript support.
- *
- * This initializes the batch and error messages. Note that in JavaScript-based
- * processing, the batch processing page is displayed only once and updated via
- * AHAH requests, so only the first batch set gets to define the page title.
- * Titles specified by subsequent batch sets are not displayed.
- *
- * @see batch_set()
- * @see _batch_do()
- */
-function _batch_progress_page_js() {
-  $batch = batch_get();
-
-  $current_set = _batch_current_set();
-  drupal_set_title($current_set['title'], PASS_THROUGH);
-
-  // Merge required query parameters for batch processing into those provided by
-  // batch_set() or hook_batch_alter().
-  $batch['url_options']['query']['id'] = $batch['id'];
-
-  $js_setting = array(
-    'batch' => array(
-      'errorMessage' => $current_set['error_message'] . '<br />' . $batch['error_message'],
-      'initMessage' => $current_set['init_message'],
-      'uri' => url($batch['url'], $batch['url_options']),
-    ),
-  );
-  drupal_add_js($js_setting, 'setting');
-  drupal_add_library('system', 'drupal.batch');
-
-  return '<div id="progress"></div>';
-}
-
-/**
  * Does one execution pass with JavaScript and returns progress to the browser.
  *
  * @see _batch_progress_page_js()
@@ -164,11 +111,11 @@ function _batch_do() {
 }
 
 /**
- * Outputs a batch processing page without JavaScript support.
+ * Outputs a batch processing page.
  *
  * @see _batch_process()
  */
-function _batch_progress_page_nojs() {
+function _batch_progress_page() {
   $batch = &batch_get();
 
   $current_set = _batch_current_set();
@@ -216,6 +163,9 @@ function _batch_progress_page_nojs() {
 
   $url = url($batch['url'], $batch['url_options']);
   $element = array(
+    // Redirect though a 'Refresh' meta tag if javascript if disabled.
+    '#prefix' => '<noscript>',
+    '#suffix' => '</noscript>',
     '#tag' => 'meta',
     '#attributes' => array(
       'http-equiv' => 'Refresh',
@@ -224,6 +174,17 @@ function _batch_progress_page_nojs() {
   );
   drupal_add_html_head($element, 'batch_progress_meta_refresh');
 
+  // Add the required javascript.
+  $js_setting = array(
+    'batch' => array(
+      'errorMessage' => $current_set['error_message'] . '<br />' . $batch['error_message'],
+      'initMessage' => $current_set['init_message'],
+      'uri' => $url,
+    ),
+  );
+  drupal_add_js($js_setting, 'setting');
+  drupal_add_library('system', 'drupal.batch');
+
   return theme('progress_bar', array('percent' => $percentage, 'message' => $message));
 }
 
diff --git a/core/misc/batch.js b/core/misc/batch.js
index b83776d..42efe30 100644
--- a/core/misc/batch.js
+++ b/core/misc/batch.js
@@ -9,6 +9,8 @@ Drupal.behaviors.batch = {
   attach: function (context, settings) {
     $(context).find('#progress').once('batch', function () {
       var holder = $(this);
+      // Remove HTML from no-js progressbar. The js progressbar is created later on.
+      holder.empty();
 
       // Success: redirect to the summary.
       var updateCallback = function (progress, status, pb) {
diff --git a/core/misc/drupal.js b/core/misc/drupal.js
index 75767d5..56a1ab8 100644
--- a/core/misc/drupal.js
+++ b/core/misc/drupal.js
@@ -381,9 +381,6 @@ Drupal.ajaxError = function (xmlhttp, uri) {
 // Class indicating that JS is enabled; used for styling purpose.
 $('html').addClass('js');
 
-// 'js enabled' cookie.
-document.cookie = 'has_js=1; path=/';
-
 //Attach all behaviors.
 $(function () {
   Drupal.attachBehaviors(document, Drupal.settings);
diff --git a/core/update.php b/core/update.php
index 9797833..1b8cc39 100644
--- a/core/update.php
+++ b/core/update.php
@@ -144,10 +144,6 @@ function update_script_selection_form($form, &$form_state) {
     else {
       $form['start']['#title'] = format_plural($count, '1 pending update', '@count pending updates');
     }
-    $form['has_js'] = array(
-      '#type' => 'hidden',
-      '#default_value' => FALSE,
-    );
     $form['actions'] = array('#type' => 'actions');
     $form['actions']['submit'] = array(
       '#type' => 'submit',
