diff --git includes/theme.inc includes/theme.inc
index 0a82a8a..c579e97 100644
--- includes/theme.inc
+++ includes/theme.inc
@@ -149,6 +149,7 @@ function _drupal_theme_initialize($theme, $base_theme = array(), $registry_callb
   // We work it this way so that we can have child themes override parent
   // theme stylesheets easily.
   $final_stylesheets = array();
+  $final_stylesheets_conditional = array();
 
   // Grab stylesheets from base theme
   foreach ($base_theme as $base) {
@@ -159,6 +160,15 @@ function _drupal_theme_initialize($theme, $base_theme = array(), $registry_callb
         }
       }
     }
+    if (!empty($base->stylesheets_conditional)) {
+      foreach ($base->stylesheets_conditional as $condition => $stylesheets_conditional) {
+        foreach ($stylesheets_conditional as $media => $stylesheets) {
+          foreach ($stylesheets as $name => $stylesheet) {
+            $final_stylesheets_conditional[$condition][$media][$name] = $stylesheet;
+          }
+        }
+      }
+    }
   }
 
   // Add stylesheets used by this theme.
@@ -170,6 +180,17 @@ function _drupal_theme_initialize($theme, $base_theme = array(), $registry_callb
     }
   }
 
+  // Add conditional stylesheets used by this theme.
+  if (!empty($theme->stylesheets_conditional)) {
+    foreach ($theme->stylesheets_conditional as $condition => $stylesheets_conditional) {
+      foreach ($stylesheets_conditional as $media => $stylesheets) {
+        foreach ($stylesheets as $name => $stylesheet) {
+          $final_stylesheets_conditional[$condition][$media][$name] = $stylesheet;
+        }
+      }
+    }
+  }
+
   // And now add the stylesheets properly
   foreach ($final_stylesheets as $media => $stylesheets) {
     foreach ($stylesheets as $stylesheet) {
@@ -177,6 +198,22 @@ function _drupal_theme_initialize($theme, $base_theme = array(), $registry_callb
     }
   }
 
+  // And now add the conditional stylesheets properly.
+  foreach ($final_stylesheets_conditional as $condition => $stylesheets_conditional) {
+    foreach ($stylesheets_conditional as $media => $stylesheets) {
+      foreach ($stylesheets as $name => $stylesheet) {
+        // Set '!IE' to FALSE, because within .info files, we only support the
+        // more common use-case of Internet Explorer downlevel-hidden
+        // conditional comments. It is much less common for themes to want
+        // conditional stylesheets for non-IE browsers, so we keep the .info
+        // file syntax as simple as possible by ignoring those use-cases; to
+        // handle those use-cases, a theme may call drupal_add_css() from within
+        // a THEME_preprocess_html() implementation, and set '!IE' to TRUE.
+        drupal_add_css($stylesheet, array('group' => CSS_THEME, 'every_page' => TRUE, 'media' => $media, 'browsers' => array('IE' => $condition, '!IE' => FALSE)));
+      }
+    }
+  }
+
   // Do basically the same as the above for scripts
   $final_scripts = array();
 
@@ -570,6 +607,14 @@ function _theme_build_registry($theme, $base_theme, $theme_engine) {
  *     'media' attribute (e.g. 'all'), the second for the name of the file
  *     (e.g. style.css). The value is a complete filepath
  *     (e.g. themes/bartik/style.css).
+ *   - 'stylesheets_conditional': A three dimensional array. The first key is a
+ *     string containing an expression for Internet Explorer to evaluate as
+ *     part of a conditional comment (for example, 'lt IE 7'), the second key
+ *     represents the 'media' attribute (e.g. 'all'), and the third key
+ *     represents the name of the file (e.g. style.css). The value is a
+ *     complete filepath (e.g. themes/bartik/style.css). Stylesheets added via
+ *     this array will not be rendered by browsers other than Internet
+ *     Explorer.
  *   - 'scripts': An associative array of JavaScripts, using the filename as key
  *     and the complete filepath as value.
  *   - 'engine': The name of the theme engine.
@@ -608,6 +653,13 @@ function list_themes($refresh = FALSE) {
           $theme->stylesheets[$media][$stylesheet] = $path;
         }
       }
+      foreach ($theme->info['stylesheets-conditional'] as $condition => $stylesheets_conditional) {
+        foreach ($stylesheets_conditional as $media => $stylesheets) {
+          foreach ($stylesheets as $stylesheet => $path) {
+            $theme->stylesheets_conditional[$condition][$media][$stylesheet] = $path;
+          }
+        }
+      }
       foreach ($theme->info['scripts'] as $script => $path) {
         $theme->scripts[$script] = $path;
       }
diff --git modules/simpletest/tests/common.test modules/simpletest/tests/common.test
index 19dd70c..fb1e63b 100644
--- modules/simpletest/tests/common.test
+++ modules/simpletest/tests/common.test
@@ -599,6 +599,10 @@ class CascadingStylesheetsTestCase extends DrupalWebTestCase {
       ':filename' => 'tests/common_test.print.css',
     ));
     $this->assertTrue(count($elements), "Stylesheet with media 'print' in module .info file found.");
+
+    // Verify common_test.conditional.css in a IE conditional comment.
+    $pattern = '/<!--\[if\ gte\ IE\ 1\]>.*common_test\.conditional\.css.*<!\[endif\]-->/simx';
+    $this->assertPattern($pattern, t('Conditional stylesheet added via module .info file was found.'));
   }
 
   /**
@@ -785,6 +789,16 @@ class CascadingStylesheetsTestCase extends DrupalWebTestCase {
     $this->assertRaw(drupal_get_path('module', 'node') . '/node.css?' . $query_string, t('Query string was appended correctly to css.'));
     $this->assertRaw(drupal_get_path('module', 'node') . '/node-fake.css?arg1=value1&amp;arg2=value2', t('Query string not escaped on a URI.'));
   }
+
+  /**
+   * Test the 'browsers' option in drupal_add_css().
+   */
+  function testConditionalStyles() {
+    drupal_add_css(drupal_get_path('module', 'simpletest') . '/simpletest.css', array('browsers' => array('IE' => 'lt IE 5', '!IE' => FALSE)));
+    $styles = drupal_get_css();
+    $pattern = '/<!--\[if\ lt\ IE\ 5\]>.*simpletest\.css.*<!\[endif\]-->/simx';
+    $this->assertTrue((bool) preg_match($pattern, $styles), t('Conditional stylesheet added by drupal_add_css() was found.'));
+  }
 }
 
 /**
diff --git modules/simpletest/tests/common_test.conditional.css modules/simpletest/tests/common_test.conditional.css
new file mode 100644
index 0000000..023eae6
--- /dev/null
+++ modules/simpletest/tests/common_test.conditional.css
@@ -0,0 +1,3 @@
+/* $Id$ */
+
+/* This file is for testing CSS file inclusion, no contents are necessary. */
diff --git modules/simpletest/tests/common_test.info modules/simpletest/tests/common_test.info
index de6ae6e..41f45fb 100644
--- modules/simpletest/tests/common_test.info
+++ modules/simpletest/tests/common_test.info
@@ -6,4 +6,5 @@ version = VERSION
 core = 7.x
 stylesheets[all][] = common_test.css
 stylesheets[print][] = common_test.print.css
+stylesheets-conditional[gte IE 1][all][] = common_test.conditional.css
 hidden = TRUE
diff --git modules/simpletest/tests/theme.test modules/simpletest/tests/theme.test
index 9e2f387..ba7f304 100644
--- modules/simpletest/tests/theme.test
+++ modules/simpletest/tests/theme.test
@@ -97,6 +97,18 @@ class ThemeUnitTest extends DrupalWebTestCase {
     $this->drupalGet('theme-test/suggestion');
     variable_set('preprocess_css', 0);
   }
+
+  /**
+   * Ensure conditional stylesheets are added.
+   */
+  function testThemeConditionalStylesheets() {
+    // Set the test theme as the default, then visit the front page of the site
+    // and look for the expected CSS.
+    variable_set('theme_default', 'test_theme');
+    $this->drupalGet('');
+    $pattern = '/<!--\[if\ gte\ IE\ 1\]>.*test_theme\.conditional\.css.*<!\[endif\]-->/simx';
+    $this->assertPattern($pattern, t('Conditional stylesheet added via theme .info file was found.'));
+  }
 }
 
 /**
diff --git modules/system/system.module modules/system/system.module
index 383dc8a..235bbd0 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -1917,6 +1917,15 @@ function system_add_module_assets() {
         }
       }
     }
+    if (!empty($info['stylesheets-conditional'])) {
+      foreach ($info['stylesheets-conditional'] as $condition => $group) {
+        foreach ($group as $media => $stylesheets) {
+          foreach ($stylesheets as $stylesheet) {
+            drupal_add_css($stylesheet, array('every_page' => TRUE, 'media' => $media, 'browsers' => array('IE' => $condition, '!IE' => FALSE)));
+          }
+        }
+      }
+    }
     if (!empty($info['scripts'])) {
       foreach ($info['scripts'] as $script) {
         drupal_add_js($script, array('every_page' => TRUE));
@@ -2511,6 +2520,7 @@ function _system_rebuild_theme_data() {
     // Prefix stylesheets and scripts with module path.
     $path = dirname($theme->uri);
     $theme->info['stylesheets'] = _system_info_add_path($theme->info['stylesheets'], $path);
+    $theme->info['stylesheets-conditional'] = _system_info_add_path($theme->info['stylesheets-conditional'], $path);
     $theme->info['scripts'] = _system_info_add_path($theme->info['scripts'], $path);
 
     // Give the screenshot proper path information.
diff --git themes/bartik/bartik.info themes/bartik/bartik.info
index eadb4db..164eb87 100644
--- themes/bartik/bartik.info
+++ themes/bartik/bartik.info
@@ -11,6 +11,9 @@ stylesheets[all][] = css/style.css
 stylesheets[all][] = css/colors.css
 stylesheets[print][] = css/print.css
 
+stylesheets-conditional[lte IE 7][all][] = css/ie.css
+stylesheets-conditional[IE 6][all][] = css/ie6.css
+
 regions[header] = Header
 regions[help] = Help
 regions[page_top] = Page top
diff --git themes/bartik/template.php themes/bartik/template.php
index 685331a..482e36b 100644
--- themes/bartik/template.php
+++ themes/bartik/template.php
@@ -21,10 +21,6 @@ function bartik_preprocess_html(&$variables) {
     || !empty($variables['page']['footer_fourthcolumn'])) {
     $variables['classes_array'][] = 'footer-columns';
   }
-
-  // Add conditional stylesheets for IE
-  drupal_add_css(path_to_theme() . '/css/ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lte IE 7', '!IE' => FALSE), 'preprocess' => FALSE));
-  drupal_add_css(path_to_theme() . '/css/ie6.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'IE 6', '!IE' => FALSE), 'preprocess' => FALSE));
 }
 
 /**
diff --git themes/garland/garland.info themes/garland/garland.info
index c5cda0f..ee6e54d 100644
--- themes/garland/garland.info
+++ themes/garland/garland.info
@@ -6,4 +6,5 @@ version = VERSION
 core = 7.x
 stylesheets[all][] = style.css
 stylesheets[print][] = print.css
+stylesheets-conditional[lt IE 7][all][] = fix-ie.css
 settings[garland_width] = fluid
diff --git themes/garland/template.php themes/garland/template.php
index 45818aa..0dc4e45 100644
--- themes/garland/template.php
+++ themes/garland/template.php
@@ -41,8 +41,6 @@ function garland_preprocess_html(&$vars) {
   if (theme_get_setting('garland_width') == 'fluid') {
     $vars['classes_array'][] = 'fluid-width';
   }
-  // Add conditional CSS for IE6.
-  drupal_add_css(path_to_theme() . '/fix-ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lt IE 7', '!IE' => FALSE), 'preprocess' => FALSE));
 }
 
 /**
diff --git themes/seven/seven.info themes/seven/seven.info
index a457c82..0c73bf5 100644
--- themes/seven/seven.info
+++ themes/seven/seven.info
@@ -6,6 +6,8 @@ version = VERSION
 core = 7.x
 stylesheets[screen][] = reset.css
 stylesheets[screen][] = style.css
+stylesheets-conditional[lte IE 8][all][] = ie.css
+stylesheets-conditional[lt IE 7][all][] = ie6.css
 settings[shortcut_module_link] = 1
 regions[content] = Content
 regions[help] = Help
diff --git themes/seven/template.php themes/seven/template.php
index b01d8b9..a7353ec 100644
--- themes/seven/template.php
+++ themes/seven/template.php
@@ -2,28 +2,6 @@
 // $Id: template.php,v 1.25 2010/11/20 04:03:51 webchick Exp $
 
 /**
- * Override or insert variables into the maintenance page template.
- */
-function seven_preprocess_maintenance_page(&$vars) {
-  // While markup for normal pages is split into page.tpl.php and html.tpl.php,
-  // the markup for the maintenance page is all in the single
-  // maintenance-page.tpl.php template. So, to have what's done in
-  // seven_preprocess_html() also happen on the maintenance page, it has to be
-  // called here.
-  seven_preprocess_html($vars);
-}
-
-/**
- * Override or insert variables into the html template.
- */
-function seven_preprocess_html(&$vars) {
-  // Add conditional CSS for IE8 and below.
-  drupal_add_css(path_to_theme() . '/ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lte IE 8', '!IE' => FALSE), 'preprocess' => FALSE));
-  // Add conditional CSS for IE6.
-  drupal_add_css(path_to_theme() . '/ie6.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lt IE 7', '!IE' => FALSE), 'preprocess' => FALSE));
-}
-
-/**
  * Override or insert variables into the page template.
  */
 function seven_preprocess_page(&$vars) {
diff --git themes/tests/test_theme/test_theme.conditional.css themes/tests/test_theme/test_theme.conditional.css
new file mode 100644
index 0000000..023eae6
--- /dev/null
+++ themes/tests/test_theme/test_theme.conditional.css
@@ -0,0 +1,3 @@
+/* $Id$ */
+
+/* This file is for testing CSS file inclusion, no contents are necessary. */
diff --git themes/tests/test_theme/test_theme.info themes/tests/test_theme/test_theme.info
index 635f63f..6ab6145 100644
--- themes/tests/test_theme/test_theme.info
+++ themes/tests/test_theme/test_theme.info
@@ -15,3 +15,6 @@ hidden = TRUE
 ; version from being loaded, and that errors aren't caused by the lack of this
 ; file within the theme folder.
 stylesheets[all][] = system.base.css
+
+; Add a conditional stylesheet.
+stylesheets-conditional[gte IE 1][all][] = test_theme.conditional.css
