diff --git flag.module flag.module
index d626a7a..46248e8 100644
--- flag.module
+++ flag.module
@@ -222,7 +222,7 @@ function flag_link($type, $object = NULL, $teaser = FALSE) {
 }
 
 /**
- * Implementation of hook_flag_link().
+ * Default flag_link() implementation.
  *
  * When Flag uses a link type provided by this module, it will call this
  * implementation of hook_flag_link(). It returns a single link's attributes,
@@ -240,9 +240,14 @@ function flag_link($type, $object = NULL, $teaser = FALSE) {
  */
 function flag_flag_link($flag, $action, $content_id) {
   $token = flag_get_token($content_id);
+  $link_types = flag_get_link_types();
+
+  $link = $link_types[$flag->link_type];
+
   return array(
-    'href' => 'flag/'. ($flag->link_type == 'confirm' ? 'confirm/' : '') ."$action/$flag->name/$content_id",
-    'query' => drupal_get_destination() . ($flag->link_type == 'confirm' ? '' : '&token='. $token),
+    'href' => $link['href'] . "/$action/$flag->name/$content_id",
+    'query' => drupal_get_destination() . ($link['token']  ? '&token=' . $token : ''),
+    'attributes' => $link['attributes'],
   );
 }
 
@@ -250,24 +255,31 @@ function flag_flag_link($flag, $action, $content_id) {
  * Implementation of hook_flag_link_types().
  */
 function flag_flag_link_types() {
-  return array(
-    'toggle' => array(
-      'title' => t('JavaScript toggle'),
-      'description' => t('An AJAX request will be made and degrades to type "Normal link" if JavaScript is not available.'),
-    ),
-    'normal' => array(
-      'title' => t('Normal link'),
-      'description' => t('A normal non-JavaScript request will be made and the current page will be reloaded.'),
-    ),
-    'confirm' => array(
-      'title' => t('Confirmation form'),
-      'description' => t('The user will be taken to a confirmation form on a separate page to confirm the flag.'),
-      'options' => array(
-        'flag_confirmation' => '',
-        'unflag_confirmation' => '',
-      ),
+  $items = array();
+
+  $items['toggle'] = array(
+    'title' => t('JavaScript toggle'),
+    'description' => t('An AJAX request will be made and degrades to type "Normal link" if JavaScript is not available.'),
+    'token' => TRUE,
+  );
+
+  $items['normal'] = array(
+    'title' => t('Normal link'),
+    'description' => t('A normal non-JavaScript request will be made and the current page will be reloaded.'),
+    'token' => TRUE,
+  );
+
+  $items['confirm'] = array(
+    'title' => t('Confirmation form'),
+    'description' => t('The user will be taken to a confirmation form on a separate page to confirm the flag.'),
+    'options' => array(
+      'flag_confirmation' => '',
+      'unflag_confirmation' => '',
     ),
+    'href' => 'flag/confirm',
   );
+
+  return $items;
 }
 
 /**
@@ -1096,7 +1108,10 @@ function template_preprocess_flag(&$variables) {
 
   // Generate the link URL.
   $link_type = $flag->get_link_type();
-  $link = module_invoke($link_type['module'], 'flag_link', $flag, $action, $content_id);
+  // Use the flag's own link generator, or a default one.
+  $func = function_exists($link_type['module'] . '_flag_link') ? $link_type['module'] . '_flag_link' : 'flag_flag_link';
+  $link = $func($flag, $action, $content_id);
+
   if (isset($link['title']) && empty($link['html'])) {
     $link['title'] = check_plain($link['title']);
   }
@@ -1630,6 +1645,9 @@ function flag_get_link_types($reset = FALSE) {
           'title' => '',
           'description' => '',
           'options' => array(),
+          'href' => 'flag',
+          'token' => FALSE,
+          'attributes' => array(),
         );
       }
     }
