Index: modules/filter/filter.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.admin.inc,v
retrieving revision 1.68
diff -u -p -r1.68 filter.admin.inc
--- modules/filter/filter.admin.inc	20 Oct 2010 01:31:07 -0000	1.68
+++ modules/filter/filter.admin.inc	20 Oct 2010 22:18:29 -0000
@@ -136,7 +136,7 @@ function filter_admin_format_form($form,
     '#default_value' => $format->format,
     '#maxlength' => 255,
     '#machine_name' => array(
-      'exists' => 'filter_format_load',
+      'exists' => 'filter_format_exists',
     ),
     '#disabled' => !empty($format->format),
   );
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.354
diff -u -p -r1.354 filter.module
--- modules/filter/filter.module	20 Oct 2010 01:15:58 -0000	1.354
+++ modules/filter/filter.module	20 Oct 2010 22:18:29 -0000
@@ -153,7 +153,11 @@ function _filter_disable_format_access($
  *   The format ID.
  *
  * @return
- *   A fully-populated text format object.
+ *   A fully-populated text format object, if the requested format exists and
+ *   is enabled. If the format does not exist, or exists in the database but
+ *   has been marked as disabled, FALSE is returned.
+ *
+ * @see filter_format_exists()
  */
 function filter_format_load($format_id) {
   $formats = filter_formats();
@@ -165,9 +169,10 @@ function filter_format_load($format_id) 
  *
  * @param $format
  *   A format object using the properties:
+ *   - 'format': A machine-readable name representing the ID of the text format
+ *     to save. If this corresponds to an existing text format, that format
+ *     will be updated; otherwise, a new format will be created.
  *   - 'name': The title of the text format.
- *   - 'format': (optional) The internal ID of the text format. If omitted, a
- *     new text format is created.
  *   - 'weight': (optional) The weight of the text format, which controls its
  *     placement in text format lists. If omitted, the weight is set to 0.
  *   - 'filters': (optional) An associative, multi-dimensional array of filters
@@ -266,9 +271,9 @@ function filter_format_save($format) {
  * Disable a text format.
  *
  * There is no core facility to re-enable a disabled format. It is not deleted
- * to keep information for contrib and to make sure the format auto increment
- * id is never reused. As there might be content using the disabled format,
- * this would lead to data corruption.
+ * to keep information for contrib and to make sure the format ID is never
+ * reused. As there might be content using the disabled format, this would lead
+ * to data corruption.
  *
  * @param $format
  *   The text format object to be disabled.
@@ -288,6 +293,23 @@ function filter_format_disable($format) 
 }
 
 /**
+ * Determines if a text format exists.
+ *
+ * @param $format_id
+ *   The ID of the text format to check.
+ *
+ * @return
+ *   TRUE if the text format exists, or FALSE if it does not. Note that for a
+ *   format which has been disabled (and therefore is no longer available for
+ *   use) but still exists in the database, TRUE will be returned.
+ *
+ * @see filter_format_load()
+ */
+function filter_format_exists($format_id) {
+  return (bool) db_query_range('SELECT 1 FROM {filter_format} WHERE format = :format', 0, 1, array(':format' => $format_id))->fetchField();
+}
+
+/**
  * Display a text format form title.
  */
 function filter_admin_format_title($format) {
Index: modules/simpletest/simpletest.info
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.info,v
retrieving revision 1.25
diff -u -p -r1.25 simpletest.info
--- modules/simpletest/simpletest.info	15 Oct 2010 03:36:21 -0000	1.25
+++ modules/simpletest/simpletest.info	20 Oct 2010 22:18:29 -0000
@@ -41,6 +41,7 @@ files[] = tests/update.test
 files[] = tests/xmlrpc.test
 files[] = tests/upgrade/upgrade.test
 files[] = tests/upgrade/upgrade.comment.test
+files[] = tests/upgrade/upgrade.filter.test
 files[] = tests/upgrade/upgrade.node.test
 files[] = tests/upgrade/upgrade.taxonomy.test
 files[] = tests/upgrade/upgrade.upload.test
Index: modules/simpletest/tests/upgrade/upgrade.filter.test
===================================================================
RCS file: modules/simpletest/tests/upgrade/upgrade.filter.test
diff -N modules/simpletest/tests/upgrade/upgrade.filter.test
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/upgrade/upgrade.filter.test	20 Oct 2010 22:18:29 -0000
@@ -0,0 +1,56 @@
+<?php
+// $Id$
+
+/**
+ * Upgrade test for filter format identifiers.
+ *
+ * Filter format identifiers changed from sequential ids to machine names.
+ * Verify that filter formats and references to filter formats in core are
+ * converted properly.
+ */
+class FilterFormatUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Filter format upgrade path',
+      'description'  => 'Verifies that filter formats and references to filter formats are converted properly.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testFilterFormatUpgrade() {
+    $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));
+
+    $format = filter_format_load('1');
+    $this->assertTrue($format->format == '1', t('Filter format found.'));
+    $format->format = 'test_filter';
+    $format->name = 'Test filter';
+    filter_format_save($format);
+    $format = filter_format_load('test_filter');
+    $this->assertTrue($format->format == 'test_filter', t('Saved a filter format with machine name.'));
+
+    $account = user_load(4);
+    user_save($account, array('signature_format' => 'test_filter'));
+    $account = user_load(4);
+    $this->assertTrue($account->signature_format == 'test_filter', t('Signature format changed successfully to a filter format with machine name.'));
+
+    $delta = db_insert('block_custom')
+    ->fields(array(
+      'body' => 'Test block',
+      'info' => 'Test block',
+      'format' => 'test_filter',
+    ))
+    ->execute();
+    $this->assertTrue($delta > 0, t('Created a custom block using a filter format with machine name.'));
+  }
+}
