Index: modules/filter/filter.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.admin.inc,v
retrieving revision 1.51
diff -u -p -r1.51 filter.admin.inc
--- modules/filter/filter.admin.inc	22 Nov 2009 08:14:27 -0000	1.51
+++ modules/filter/filter.admin.inc	2 Dec 2009 12:25:28 -0000
@@ -135,7 +135,8 @@ function filter_admin_format_form($form,
   }
   // Table with filters
   $filter_info = filter_get_filters();
-  $filters = filter_list_format($format->format);
+  // Load all configured filters for existing text formats.
+  $filters = !empty($format->format) ? filter_list_format($format->format) : array();
 
   $form['filters'] = array('#type' => 'fieldset',
     '#title' => t('Filters'),
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.304
diff -u -p -r1.304 filter.module
--- modules/filter/filter.module	1 Dec 2009 13:14:42 -0000	1.304
+++ modules/filter/filter.module	2 Dec 2009 12:42:30 -0000
@@ -193,21 +193,22 @@ function filter_format_save(&$format) {
   }
 
   // Get the current filters in the format, to add new filters to the bottom.
-  $current = filter_list_format($format->format);
+  $current = ($return != SAVED_NEW ? filter_list_format($format->format) : array());
   $filter_info = filter_get_filters();
+  // Programmatic saves may not contain any filters.
   if (!isset($format->filters)) {
     $format->filters = array();
   }
-  foreach ($format->filters as $name => $filter) {
+  foreach ($filter_info as $name => $filter) {
     $fields = array();
     // Add new filters to the bottom.
     $fields['weight'] = isset($current[$name]->weight) ? $current[$name]->weight : 10;
-    $fields['status'] = $filter['status'];
+    $fields['status'] = isset($format->filters[$name]['status']) ? $format->filters[$name]['status'] : 0;
     $fields['module'] = $filter_info[$name]['module'];
     $format->filters[$name]['module'] = $filter_info[$name]['module'];
     // Only update settings if there are any.
-    if (!empty($filter['settings'])) {
-      $fields['settings'] = serialize($filter['settings']);
+    if (!empty($format->filters[$name]['settings'])) {
+      $fields['settings'] = serialize($format->filters[$name]['settings']);
     }
     db_merge('filter')
       ->key(array(
@@ -556,16 +557,16 @@ function filter_list_format($format_id) 
   $filters = &drupal_static(__FUNCTION__, array());
   $filter_info = filter_get_filters();
 
+  if (!isset($filters['all'])) {
+    $result = db_query('SELECT * FROM {filter} ORDER BY weight, module, name');
+    foreach ($result as $record) {
+      $filters['all'][$record->format][$record->name] = $record;
+    }
+  }
+
   if (!isset($filters[$format_id])) {
     $format_filters = array();
-    $query = db_select('filter', 'filter')
-      ->fields('filter')
-      ->condition('format', $format_id)
-      ->orderBy('weight')
-      ->orderBy('module')
-      ->orderBy('name');
-    $result = $query->execute()->fetchAllAssoc('name');
-    foreach ($result as $name => $filter) {
+    foreach ($filters['all'][$format_id] as $name => $filter) {
       if (isset($filter_info[$name])) {
         $filter->title = $filter_info[$name]['title'];
         // Unpack stored filter settings.
