diff --git a/modules/system/system.module b/modules/system/system.module
index 5e65fd9e10ed7c310c2ac6ff904b37cc700e4f6b..eea5e90f058ad07752dddb9f53c5c0e20c7f5cf5 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2703,11 +2703,15 @@ function confirm_form($form, $question, $path, $description = NULL, $yes = NULL,
 }
 
 /**
- * Determine if a user is in compact mode.
+ * Determines if the current user is in compact mode.
+ *
+ * @return
+ *   TRUE when in compact mode, FALSE when in expanded mode.
  */
 function system_admin_compact_mode() {
-  global $user;
-  return (isset($user->admin_compact_mode)) ? $user->admin_compact_mode : variable_get('admin_compact_mode', FALSE);
+  // PHP converts dots into underscores in cookie names to avoid problems with
+  // its parser, so we use a converted cookie name.
+  return isset($_COOKIE['Drupal_visitor_admin_compact_mode']) ? $_COOKIE['Drupal_visitor_admin_compact_mode'] : variable_get('admin_compact_mode', FALSE);
 }
 
 /**
@@ -2717,8 +2721,7 @@ function system_admin_compact_mode() {
  *   Valid values are 'on' and 'off'.
  */
 function system_admin_compact_page($mode = 'off') {
-  global $user;
-  user_save($user, array('admin_compact_mode' => ($mode == 'on')));
+  user_cookie_save(array('admin_compact_mode' => ($mode == 'on')), array('admin_compact_mode'));
   drupal_goto();
 }
 
diff --git a/modules/system/system.test b/modules/system/system.test
index 55c4083a568894e0af0d0f41bb1556663e3b93d8..fa33ac3a7bb39b8e6636531ab209409f0cb45319 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -1719,7 +1719,7 @@ class ShutdownFunctionsTest extends DrupalWebTestCase {
   }
 
   /**
-   * Test flood control mechanism clean-up.
+   * Test shutdown functions.
    */
   function testShutdownFunctions() {
     $arg1 = $this->randomName();
@@ -1729,3 +1729,40 @@ class ShutdownFunctionsTest extends DrupalWebTestCase {
     $this->assertText(t('Second shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2)));
   }
 }
+
+/**
+ * Functional tests compact mode.
+ */
+class CompactModeTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Compact mode',
+      'description' => 'Tests compact mode functionality.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    $admin_user = $this->drupalCreateUser(array('access administration pages'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Test compact mode.
+   */
+  function testCompactMode() {
+    $this->drupalGet('admin/compact/on');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], t('Compact mode turns on.'));
+    $this->drupalGet('admin/compact/on');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], t('Compact mode remains on after a repeat call.'));
+    $this->drupalGet('');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], t('Compact mode persists on new requests.'));
+
+    $this->drupalGet('admin/compact/off');
+    $this->assertEqual($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'deleted', t('Compact mode turns off.'));
+    $this->drupalGet('admin/compact/off');
+    $this->assertEqual($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'deleted', t('Compact mode remains off after a repeat call.'));
+    $this->drupalGet('');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], t('Compact mode persists on new requests.'));
+  }
+}