diff --git a/nivo_slider.module b/nivo_slider.module
index f7402a7..ca8cd80 100755
--- a/nivo_slider.module
+++ b/nivo_slider.module
@@ -110,6 +110,11 @@ function nivo_slider_help($path, $arg) {
  */
 function nivo_slider_theme($existing, $type, $theme, $path) {
   return array(
+    'nivo_slider_slide_configuration_form' => array(
+      'render element' => 'form',
+      'file' => 'nivo_slider.theme.inc',
+      'path' => $path . '/themes',
+    ),
     'nivo_slider_wrapper' => array(
       'variables' => array(
         'theme' => NULL,
diff --git a/nivo_slider_slides.admin.inc b/nivo_slider_slides.admin.inc
index 1c89c1e..ab60bc3 100644
--- a/nivo_slider_slides.admin.inc
+++ b/nivo_slider_slides.admin.inc
@@ -17,7 +17,10 @@ function nivo_slider_slide_configuration_form($form, &$form_state) {
     '#title' => t('Upload a new slide image'),
   );
 
-  // Images
+  // Draggable table
+  $form['order'] = array();
+
+  // Vertical tab
   $form['images'] = array(
     '#type' => 'vertical_tabs',
     '#title' => t('Slider images'),
@@ -27,7 +30,7 @@ function nivo_slider_slide_configuration_form($form, &$form_state) {
   // Get all available slides
   $slides = variable_get('nivo_slider_banner_settings', array());
 
-  // Create a vertical tab filled with slide settings for each slide
+  // Create a vertical tab for each slide
   foreach ($slides as $slide => $settings) {
     $form['images'][$slide] = array(
       '#type' => 'fieldset',
@@ -38,6 +41,29 @@ function nivo_slider_slide_configuration_form($form, &$form_state) {
       ),
       '#weight' => $slide,
     );
+    $form['images'][$slide]['name'] = array(
+      '#markup' => t('Image !number: !title', array(
+        '!number' => $slide + 1,
+        '!title' => isset($settings['title']) ? $settings['title'] : '',
+        )
+      ),
+    );
+    $form['images'][$slide]['weight'] = array(
+      '#type' => 'weight',
+      '#delta' => 10,
+      '#default_value' => isset($settings['weight']) ? $settings['weight'] : 1,
+      '#attributes' => array(
+        'class' => array('slide-weight'),
+      ),
+    );
+    $form['images'][$slide]['published'] = array(
+      '#type' => 'checkbox',
+      '#default_value' => isset($settings['published']) ? $settings['published'] : '',
+    );
+    $form['images'][$slide]['delete'] = array(
+      '#type' => 'checkbox',
+      '#default_value' => FALSE,
+    );
     $form['images'][$slide]['preview'] = array(
       '#markup' => theme('image', array('path' => image_style_url('nivo_slider_slide', ($settings['path'])))),
     );
@@ -94,23 +120,11 @@ function nivo_slider_slide_configuration_form($form, &$form_state) {
     	'#description' => t('Select a transition. Selecting an option other than %default will force this slide to use the selected transition every time it appears. It overrides all other effect settings.', array('%default' => '- Default -')),
     	'#default_value' => isset($settings['transition']) ? $settings['transition'] : '',
     );
-    $form['images'][$slide]['weight'] = array(
-      '#type' => 'weight',
-      '#title' => t('Weight'),
-      '#default_value' => isset($settings['weight']) ? $settings['weight'] : 1,
-    );
-    $form['images'][$slide]['published'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Published'),
-      '#default_value' => isset($settings['published']) ? $settings['published'] : TRUE,
-    );
-    $form['images'][$slide]['delete'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Delete slide'),
-      '#default_value' => FALSE,
-    );
   }
 
+  // Add a theme function to theme the form
+  $form['#theme'][] = 'nivo_slider_slide_configuration_form';
+
   // Add a submit handler to save the slide settings
   $form['#submit'][] = 'nivo_slider_settings_submit';
 
@@ -130,31 +144,33 @@ function nivo_slider_settings_submit($form, &$form_state) {
   // Process the available slides
   foreach ($form_state['input']['images'] as $slide => $settings) {
     // Ensure that only slide settings are processed
-    if (is_array($settings)) {
-      // Delete the slide if required otherwise add it to the array of slides
-      if ($settings['delete']) {
-        // Find the URI of the slide to be deleted
-        $uri = $settings['path'];
-
-        // Find the file ID of the file with the URI
-        $fid = db_query('SELECT fid FROM {file_managed} WHERE uri = :uri', array(':uri' => $uri))->fetchField();
-
-        // Load the file with the file ID
-        if (!empty($fid)) {
-          $file_object = file_load($fid);
+    if (is_numeric($slide)){
+      if (is_array($settings)) {
+        // Delete the slide if required otherwise add it to the array of slides
+        if ($settings['delete']) {
+          // Find the URI of the slide to be deleted
+          $uri = $settings['path'];
+
+          // Find the file ID of the file with the URI
+          $fid = db_query('SELECT fid FROM {file_managed} WHERE uri = :uri', array(':uri' => $uri))->fetchField();
+
+          // Load the file with the file ID
+          if (!empty($fid)) {
+            $file_object = file_load($fid);
+          }
+          else {
+            $file_object = FALSE;
+          }
+
+          // Delete the file
+          if (!empty($file_object)) {
+            $result = file_delete($file_object);
+          }
         }
         else {
-          $file_object = FALSE;
-        }
-
-        // Delete the file
-        if (!empty($file_object)) {
-          $result = file_delete($file_object);
+          $slides[] = $settings;
         }
       }
-      else {
-        $slides[] = $settings;
-      }
     }
   }
 
diff --git a/themes/nivo_slider.theme.inc b/themes/nivo_slider.theme.inc
index 438d8fc..5668d07 100644
--- a/themes/nivo_slider.theme.inc
+++ b/themes/nivo_slider.theme.inc
@@ -5,6 +5,91 @@
  */
 
 /**
+ * Returns HTML for the slide configuration form into a table.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_nivo_slider_slide_configuration_form($variables) {
+  // Get the array of form elements from the available variables
+  $form = $variables['form'];
+
+  // Add the tableDrag JavaScript behavior
+  drupal_add_tabledrag('nivo-slider-slides', 'order', 'sibling', 'slide-weight');
+
+  // Create an array to hold the table rows
+  $rows = array();
+
+  // Generate an array of table rows from the available slides
+  foreach($form['images'] as $slide => &$property) {
+    if (is_numeric($slide)) {
+      // Create an array to hold the table row for the current slide
+      $row = array();
+
+      // Add a column containing the slide's title to the current row
+      $name = $property['name'];
+      $row[] = array(
+        'data' => drupal_render($name),
+      );
+      unset($property['name']);
+
+      // Add a column containing the slide's weight to the current row
+      $weight = $property['weight'];
+      $row[] = array(
+        'data' => drupal_render($weight),
+      );
+      unset($property['weight']);
+
+      // Add a column containing the slide's weight to the current row
+      $published = $property['published'];
+      $row[] = array(
+        'data' => drupal_render($published),
+      );
+      unset($property['published']);
+
+      // Add a column containing the slide's weight to the current row
+      $delete = $property['delete'];
+      $row[] = array(
+        'data' => drupal_render($delete),
+      );
+      unset($property['delete']);
+
+      // Store the individual row
+      $rows[] = array(
+        'data' => $row,
+        'class' => array('draggable'),
+      );
+    }
+  }
+
+  // Build the draggable table if any rows are available
+  if (!empty($rows)) {
+    // Create an array of table headers
+    $headers = array(
+      t('Name'),
+      t('Weight'),
+      t('Published'),
+      t('Delete'),
+    );
+
+    // Over-write the 'order' form element with the draggable table
+    $form['order'] = array(
+      '#theme' => 'table',
+      '#header' => $headers,
+      '#rows' => $rows,
+      '#attributes' => array(
+        'id' => 'nivo-slider-slides',
+      ),
+    );
+  }
+
+  return drupal_render_children($form);
+}
+
+/**
  * Implements template_preprocess_hook().
  */
 function template_preprocess_nivo_slider_wrapper(&$variables) {
