diff --git flag.inc flag.inc
index 16f8680..2c00050 100644
--- flag.inc
+++ flag.inc
@@ -1398,27 +1398,17 @@ class flag_node extends flag_flag {
   }
 
   function get_labels_token_types() {
     return array_merge(array('node'), parent::get_labels_token_types());
   }
 
   function replace_tokens($label, $contexts, $options, $content_id) {
-    if (is_numeric($content_id) && ($node = $this->fetch_content($content_id))) {
+    if ($content_id && ($node = $this->fetch_content($content_id))) {
       $contexts['node'] = $node;
     }
-    // Nodes accept the node-type as a $content_id in the case that a new node
-    // is being created and a full node object does not yet exist.
-    elseif (!empty($content_id) && ($type = node_type_get_type($content_id))) {
-      $content_id = NULL;
-      $contexts['node'] = (object) array(
-        'nid' => NULL,
-        'type' => $type->type,
-        'title' => '',
-      );
-    }
     return parent::replace_tokens($label, $contexts, $options, $content_id);
   }
 
   function get_flag_action($content_id) {
     $flag_action = parent::get_flag_action($content_id);
     $node = $this->fetch_content($content_id);
     $flag_action->content_title = $node->title;
diff --git flag.module flag.module
index 928208d..2382f8a 100644
--- flag.module
+++ flag.module
@@ -382,19 +382,25 @@ function flag_field_extra_fields() {
  */
 function flag_form_alter(&$form, &$form_state, $form_id) {
   global $user;
 
   if ($form_id == 'node_type_form') {
     $flags = flag_get_flags('node', $form['#node_type']->type, $user);
     foreach ($flags as $flag) {
+      // To be able to process node tokens in flag labels, we create a bogus node.
+      $flag->remember_content('bogus', (object) array(
+        'nid' => NULL,
+        'type' => $form['#node_type']->type,
+        'title' => '',
+      ));
       if ($flag->show_on_form) {
         $var = 'flag_'. $flag->name .'_default';
         $form['workflow']['flag'][$var] = array(
           '#type' => 'checkbox',
-          '#title' => $flag->get_label('flag_short', $form['#node_type']->type),
+          '#title' => $flag->get_label('flag_short', 'bogus'),
           '#default_value' => variable_get($var .'_'. $form['#node_type']->type, 0),
           '#return_value' => 1,
         );
       }
     }
 
     if (isset($form['workflow']['flag'])) {
@@ -433,19 +439,26 @@ function flag_form_alter(&$form, &$form_state, $form_id) {
       // to it, similar to the way "published" and "promote" keep the default
       // values even if the user doesn't have "administer nodes" permission.
       $access = $flag->access($nid, $flag_status ? 'unflag' : 'flag', $user);
       if (!$access && !$flag->global) {
         continue;
       }
 
+      if (!$nid) {
+        // To be able to process node tokens for a node which hasn't yet been
+        // saved (e.g., on node/add/story), we "save" it to the flag's cache
+        // under a pseudo ID.
+        $flag->remember_content('new', $form['#node']);
+      }
+
       // Add the flag checkbox if displaying on the form.
       $form['flag'][$flag->name] = array(
         '#type' => 'checkbox',
-        '#title' => $flag->get_label('flag_short', $nid ? $nid : $form['type']['#value']),
-        '#description' => $flag->get_label('flag_long', $nid ? $nid : $form['type']['#value']),
+        '#title' => $flag->get_label('flag_short', $nid ? $nid : 'new'),
+        '#description' => $flag->get_label('flag_long', $nid ? $nid : 'new'),
         '#default_value' => $flag_status,
         '#return_value' => 1,
         '#attributes' => array('title' => $flag->get_title()), // Used by our drupalSetSummary().
       );
       // If the user does not have access to the flag, set as a value.
       if (!$access) {
         $form['flag'][$flag->name]['#type'] = 'value';
