diff --git a/webform_validation.admin.inc b/webform_validation.admin.inc
index 2f1ed19..16b5042 100644
--- a/webform_validation.admin.inc
+++ b/webform_validation.admin.inc
@@ -11,7 +11,7 @@
 function webform_validation_manage($node) {
   $rules = webform_validation_get_webform_rules($node);
   $output = '';
-  $output .= theme('webform_validation_manage_overview', array('rules' => $rules, 'node' => $node));
+  $output .= drupal_render(drupal_get_form('webform_validation_manage_overview_form', $rules, $node));
   $output .= theme('webform_validation_manage_add_rule', array('nid' => $node->nid));
   return $output;
 }
@@ -27,38 +27,37 @@ function webform_validation_get_webform_rules($node) {
   return $rules;
 }
 
+
 /**
- * Themable function to list the rules assigned to a webform
+ * Themable function to list and re-order the rules assigned to a webform
  */
-function theme_webform_validation_manage_overview($variables) {
-  $rules = $variables['rules'];
-  $node = $variables['node'];
+function theme_webform_validation_manage_overview_form($variables) {
+  $form = $variables['form'];
+  $header = array(t('Rule name'), t('Validator'), t('Components'), t('Weight'), array(
+    'data' => t('Operations'),
+    'colspan' => 2,
+  ));
 
-  $header = array(t('Rule name'), t('Validator'), t('Components'), array(
-      'data' => t('Operations'),
-      'colspan' => 2,
-    ));
-  $validators = webform_validation_get_validators_selection();
-  if (!empty($rules)) {
-    foreach ($rules as $rule) {
-      $component_info = webform_validation_rule_components_basic($rule['components']);
+  if (is_array(element_children($form))) {
+    foreach (element_children($form) as $rule) {
       $row = array();
-      $row[] = array(
-        'data' => check_plain($rule['rulename']),
-      );
-      $row[] = array(
-        'data' => $validators[$rule['validator']],
-      );
-      $row[] = array(
-        'data' => theme('item_list', array('items' => $component_info)),
-      );
-      $row[] = array(
-        'data' => l(t('Edit'), 'node/' . $node->nid . '/webform/validation/edit/' . $rule['validator'] . '/' . $rule['ruleid'], array("query" => drupal_get_destination())),
-      );
-      $row[] = array(
-        'data' => l(t('Delete'), 'node/' . $node->nid . '/webform/validation/delete/' . $rule['ruleid'], array("query" => drupal_get_destination())),
+      foreach (element_children($form[$rule]) as $item) {
+        //unset the titles of the form elements, since we are displaying them in a table with a header.
+        unset($form[$rule][$item]['#title']);
+        //add a class to the weight field
+        $form[$rule]['weight']['#attributes']['class'] = array('ruleid-weight');
+        $row[] = array(
+          'data' => drupal_render($form[$rule][$item]),
+        );
+      }
+      $rows[] = array(
+        'data' => $row,
+        'class' => array('draggable'),
       );
-      $rows[] = $row;
+      //hide any fieldsets, since we are displaying the form in a table.
+      if($form[$rule]['#type'] == 'fieldset') {
+        hide($form[$rule]);
+      }
     }
   }
   else {
@@ -67,8 +66,80 @@ function theme_webform_validation_manage_overview($variables) {
       'colspan' => 5,
     );
   }
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'webform-validation-overview-form')));
+  $output .= drupal_render_children($form);
+  drupal_add_tabledrag('webform-validation-overview-form', 'order', 'sibling', 'ruleid-weight');
+  return $output;
+}
+
+/**
+ * Form to list and reorder the rules assigned to a webform
+ */
+function webform_validation_manage_overview_form($form, &$form_state, $rules, $node) {
+  $form = array();
+  $form['#tree'] = TRUE;
+  $validators = webform_validation_get_validators_selection();
 
-  return theme('table', array('header' => $header, 'rows' => $rows));
+  foreach ($rules as $rule) {
+    $component_info = webform_validation_rule_components_basic($rule['components']);
+    $form[$rule['ruleid']] = array(
+      '#type' => 'fieldset',
+    );
+    $form[$rule['ruleid']]['name'] = array(
+      '#type' => 'item',
+      '#title' => t('Name'),
+      '#markup' => check_plain($rule['rulename']),
+    );
+    $form[$rule['ruleid']]['validator'] = array(
+      '#type' => 'item',
+      '#title' => t('Validator'),
+      '#markup' => $validators[$rule['validator']],
+    );
+    $form[$rule['ruleid']]['components'] = array(
+      '#type' => 'item',
+      '#title' => t('Components'),
+      '#markup' => theme('item_list', array('items' => $component_info)),
+    );
+    $form[$rule['ruleid']]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight'),
+      '#default_value' => $rule['weight'],
+      '#description' => t('Optional. By changing the order of validation rules, you can use code that relies on earlier validation functions being completed.'),
+    );
+    $form[$rule['ruleid']]['actions'] = array('#type' => 'actions');
+    $form[$rule['ruleid']]['actions']['edit'] = array(
+      '#type' => 'item',
+      '#markup' => l(t('Edit'), 'node/' . $node->nid . '/webform/validation/edit/' . $rule['validator'] . '/' . $rule['ruleid'], array("query" => drupal_get_destination())),
+    );
+    $form[$rule['ruleid']]['actions']['delete'] = array(
+      '#type' => 'item',
+      '#markup' => l(t('Delete'), 'node/' . $node->nid . '/webform/validation/delete/' . $rule['ruleid'], array("query" => drupal_get_destination())),
+    );
+  }
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit function for rule overview form.
+ */
+function webform_validation_manage_overview_form_submit($form, $form_state) {
+  //Save the rule weights.
+  foreach ($form_state['values'] as $ruleid => $value) {
+    if (is_numeric($ruleid)) {
+      $update = db_update('webform_validation_rule')
+        ->fields(array(
+          'weight' => $value['weight'],
+         ))
+        ->condition('ruleid', $ruleid)
+        ->execute();
+    }
+  }
+  drupal_set_message(t('The order of the validation rules has been saved.'));
 }
 
 /**
diff --git a/webform_validation.install b/webform_validation.install
index 4a1aa7b..d876540 100644
--- a/webform_validation.install
+++ b/webform_validation.install
@@ -58,6 +58,13 @@ function webform_validation_schema() {
         'not null' => TRUE,
         'default' => 0,
       ),
+      'weight' => array (
+        'description' => 'Weight of the rule order.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'unsigned' => FALSE,
+        'default' => 0,
+      ),
     ),
     'primary key' => array('ruleid'),
     'indexes' => array(
@@ -189,3 +196,17 @@ function webform_validation_update_7104() {
     ->condition('validator', array('oneoftwo', 'oneofseveral'), 'IN')
     ->execute();
 }
+
+/**
+ * Add a weight field to webform_validation rules, so they can be sorted.
+ */
+function webform_validation_update_7105() {
+  $spec = array(
+    'description' => 'Weight of the rule order.',
+    'type' => 'int',
+    'not null' => TRUE,
+    'unsigned' => FALSE,
+    'default' => 0,
+  );
+  db_add_field('webform_validation_rule', 'weight', $spec);
+}
diff --git a/webform_validation.module b/webform_validation.module
index 571e632..488b82d 100644
--- a/webform_validation.module
+++ b/webform_validation.module
@@ -76,11 +76,8 @@ function webform_validation_theme() {
         'nid' => NULL,
       ),
     ),
-    'webform_validation_manage_overview' => array(
-      'variables' => array(
-        'rules' => NULL,
-        'node' => NULL,
-      ),
+    'webform_validation_manage_overview_form' => array(
+      'render element' => 'form',
     ),
   );
 }
diff --git a/webform_validation.rules.inc b/webform_validation.rules.inc
index 166470c..8802905 100644
--- a/webform_validation.rules.inc
+++ b/webform_validation.rules.inc
@@ -9,7 +9,7 @@
  * Get a rule entry
  */
 function webform_validation_get_rule($ruleid) {
-  $result = db_query("SELECT ruleid, rulename, nid, validator, data, error_message, negate FROM {webform_validation_rule} WHERE ruleid = :ruleid", array(':ruleid' => $ruleid), array('fetch' => PDO::FETCH_ASSOC));
+  $result = db_query("SELECT ruleid, rulename, nid, validator, data, error_message, negate, weight FROM {webform_validation_rule} WHERE ruleid = :ruleid", array(':ruleid' => $ruleid), array('fetch' => PDO::FETCH_ASSOC));
   $rule = $result->fetchAssoc();
   $rule['components'] = webform_validation_get_rule_components($ruleid, $rule['nid']);
   $rule['negate'] = (bool) $rule['negate'];
@@ -21,7 +21,7 @@ function webform_validation_get_rule($ruleid) {
  */
 function webform_validation_get_node_rules($nid) {
   $rules = array();
-  $result = db_query("SELECT ruleid, rulename, nid, validator, data, error_message, negate FROM {webform_validation_rule} WHERE nid = :nid ORDER BY ruleid DESC", array(':nid' => $nid), array('fetch' => PDO::FETCH_ASSOC));
+  $result = db_query("SELECT ruleid, rulename, nid, validator, data, error_message, negate, weight FROM {webform_validation_rule} WHERE nid = :nid ORDER BY weight ASC, ruleid DESC", array(':nid' => $nid), array('fetch' => PDO::FETCH_ASSOC));
   foreach ($result as $rule) {
     $rule['components'] = webform_validation_get_rule_components($rule['ruleid'], $rule['nid']);
     $rule['negate'] = (bool) $rule['negate'];
diff --git a/webform_validation.validators.inc b/webform_validation.validators.inc
index 0edb1ce..ca7a016 100644
--- a/webform_validation.validators.inc
+++ b/webform_validation.validators.inc
@@ -376,6 +376,7 @@ function webform_validation_webform_validation_validators() {
  * Implements hook_webform_validation_validate().
  */
 function webform_validation_webform_validation_validate($validator_name, $items, $components, $rule) {
+  dpm($validator_name);
   if ($items) {
     $errors = array();
     switch ($validator_name) {
