diff --git a/flag.inc b/flag.inc
index 1eb474b..a29b407 100644
--- a/flag.inc
+++ b/flag.inc
@@ -193,6 +193,7 @@ class flag_flag {
         'flag' => array(DRUPAL_AUTHENTICATED_RID),
         'unflag' => array(DRUPAL_AUTHENTICATED_RID),
       ),
+      'weight' => 0,
     );
 
     // Merge in options from the current link type.
@@ -1868,4 +1869,3 @@ class FlagNonGlobalCookieStorage extends FlagCookieStorage {
     }
   }
 }
-
diff --git a/flag.module b/flag.module
index a4a9fdf..3481373 100644
--- a/flag.module
+++ b/flag.module
@@ -1488,6 +1488,9 @@ function flag_get_flags($content_type = NULL, $content_subtype = NULL, $account
       }
     }
 
+    // Sort the list of flags by weight.
+    uasort($flags, '_flag_compare_weight');
+
     // Allow modules implementing hook_flag_alter(&$flag) to modify each flag.
     foreach ($flags as $flag) {
       drupal_alter('flag', $flag);
@@ -1521,6 +1524,16 @@ function flag_get_flags($content_type = NULL, $content_subtype = NULL, $account
 }
 
 /**
+ * Comparison function for uasort().
+ */
+function _flag_compare_weight($flag1, $flag2) {
+  if ($flag1->weight == $flag2->weight) {
+    return 0;
+  }
+  return $flag1->weight < $flag2->weight ? -1 : 1;
+}
+
+/**
  * Utility function: Checks whether a flag applies to a certain type, and
  * possibly subtype, of content.
  *
@@ -1558,6 +1571,7 @@ function flag_get_default_flags($include_disabled = FALSE) {
       $flag_info += array(
         'name' => $flag_name,
         'module' => $module,
+        'weight' => 0,
       );
       $flag = flag_flag::factory_by_array($flag_info);
 
diff --git a/includes/flag.admin.inc b/includes/flag.admin.inc
index 8ff9ffa..0621afe 100644
--- a/includes/flag.admin.inc
+++ b/includes/flag.admin.inc
@@ -295,7 +295,7 @@ function flag_form($form, &$form_state, $flag) {
     '#tree' => FALSE,
     '#weight' => 10,
   );
-  
+
   $options = array();
   $node_types = node_type_get_types();
   foreach ($node_types as $node_type) {
@@ -416,6 +416,14 @@ function flag_form($form, &$form_state, $flag) {
     '#access' => empty($flag->locked['unflag_confirmation']),
   );
 
+  $form['display']['weight'] = array(
+    '#type' => 'weight',
+    '#delta' => 10,
+    '#title' => t('The weight of this flag in relation to other flags'),
+    '#description' => t('This value is used when displaying a list of flags to the user. Lower values are shown first.'),
+    '#default_value' => isset($flag->weight) ? $flag->weight : 0,
+  );
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Submit'),
