Index: flag.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/flag/Attic/flag.inc,v
retrieving revision 1.1.4.19
diff -u -p -r1.1.4.19 flag.inc
--- flag.inc	16 Oct 2008 16:15:34 -0000	1.1.4.19
+++ flag.inc	12 Nov 2008 02:02:23 -0000
@@ -194,6 +194,14 @@ class flag_flag {
    * Update the flag with settings entered in a form.
    */
   function form_input($form_values) {
+    // Ensure default values for default flags.
+    if (isset($this->default)) {
+      foreach ($this->default->types as $type) {
+        $form_values['types'][$type] = $type;
+      }
+      $form_values['global'] = $this->default->global;
+      $form_values['overridden'] = TRUE;
+    }
     // Load the form fields indiscriminately unto the flag (we don't care about
     // stray FormAPI fields because we aren't touching unknown properties anyway.
     foreach ($form_values as $field => $value) {
Index: flag.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/flag/Attic/flag.module,v
retrieving revision 1.1.2.63
diff -u -p -r1.1.2.63 flag.module
--- flag.module	9 Nov 2008 09:46:09 -0000	1.1.2.63
+++ flag.module	12 Nov 2008 02:04:59 -0000
@@ -1074,15 +1074,37 @@ function flag_get_flags($content_type = 
   // Retrieve a list of all flags, regardless of the parameters.
   if (!isset($flags) || $reset) {
     $flags = array();
+    $default_flags = array();
+    foreach (module_implements('flag_default_flags') as $module) {
+      $function = $module . '_flag_default_flags';
+      foreach ($function() as $name => $row) {
+        settype($row, 'object');
+        $default_flags[$name] = flag_flag::factory($row);
+        $default_flags[$name]->module = $module;
+      }
+    }
     $result = db_query("SELECT f.*, fn.type FROM {flags} f LEFT JOIN {flag_types} fn ON fn.fid = f.fid");
     while ($row = db_fetch_object($result)) {
       if (!isset($flags[$row->name])) {
         $flags[$row->name] = flag_flag::factory($row);
+        // Handle overridden flags.
+        if (isset($default_flags[$row->name])) {
+          // Since users can enhance default flag definitions, we need a copy of
+          // the default values to merge them upon saving a flag.
+          $flags[$row->name]->default = $default_flags[$row->name];
+          unset($default_flags[$row->name]);
+        }
       }
       else {
         $flags[$row->name]->types[] = $row->type;
       }
     }
+    // Add remaining default flags.
+    // @todo Needs $flags[$name]->fid. Alternative: Don't allow to use default
+    //   flags directly; "install" them by enabling from a "also available" list.
+    foreach ($default_flags as $name => $flag) {
+      $flags[$name] = $flag;
+    }
   }
 
   // Make a variable copy to filter types and account.
