diff -urp node_gallery/node_gallery.css node_gallerySORT/node_gallery.css
--- node_gallery/node_gallery.css	2009-06-21 05:13:16.000000000 -0700
+++ node_gallerySORT/node_gallery.css	2009-10-29 01:15:27.000000000 -0700
@@ -10,4 +10,6 @@
 
 table.image-navigator td.image-navigator-left {width:33%}
 table.image-navigator td.image-navigator-mid {width:33%; text-align:center}
-table.image-navigator td.image-navigator-right {width:33%}
\ No newline at end of file
+table.image-navigator td.image-navigator-right {width:33%}
+
+.gallery-upload-thumb img { width: 100px; }
\ No newline at end of file
diff -urp node_gallery/node_gallery.inc node_gallerySORT/node_gallery.inc
--- node_gallery/node_gallery.inc	2009-10-28 18:57:10.000000000 -0700
+++ node_gallerySORT/node_gallery.inc	2009-10-29 02:02:42.000000000 -0700
@@ -126,14 +126,19 @@ function node_gallery_get_all_images($no
   return $items;
 }
 
-function node_gallery_get_gallery_images(&$node) {
+function node_gallery_get_gallery_images(&$node, $ignore_pager = FALSE) {
   if (in_array($node->type, node_gallery_get_types())) {
     $sql = "SELECT n.nid, n.vid, n.title, n.type, n.created, nr.body, ng.*, f.* FROM {node} n 
       INNER JOIN {node_revisions} nr ON n.vid = nr.vid INNER JOIN {node_galleries} ng 
       ON n.nid = ng.nid INNER JOIN {files} f ON ng.fid = f.fid WHERE n.nid IN (SELECT g.nid FROM {node_galleries} g WHERE g.gid = %d) AND n.status = 1
        ORDER BY ng.weight, ng.nid";
     //$result = db_query($sql, $node->nid);
-    $result = pager_query(db_rewrite_sql($sql), variable_get('node_images_page_number', 20), NODE_GALLERY_IMAGE_PAGER_ELEMENT, NULL, $node->nid);
+    if ($ignore_pager == FALSE) {
+      $result = pager_query(db_rewrite_sql($sql), variable_get('node_images_page_number', 20), NODE_GALLERY_IMAGE_PAGER_ELEMENT, NULL, $node->nid);
+    }
+    else {
+      $result = db_query(db_rewrite_sql($sql), $node->nid);
+    }
     while ($object = db_fetch_object($result)) {
       $images[$object->fid] = $object;
     }
diff -urp node_gallery/node_gallery.module node_gallerySORT/node_gallery.module
--- node_gallery/node_gallery.module	2009-10-28 19:21:52.000000000 -0700
+++ node_gallerySORT/node_gallery.module	2009-10-29 02:08:34.000000000 -0700
@@ -139,6 +139,15 @@ function node_gallery_menu() {
     'file' => 'node_gallery.pages.inc',
     'type' => MENU_LOCAL_TASK,
   );
+  $items['node/%node_gallery_gallery/sort'] = array(
+    'title' => 'Sort Images',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_gallery_sort_images_form', 1),
+    'access callback' => 'node_gallery_user_access',
+    'access arguments' => array('edit image', 1),
+    'file' => 'node_gallery.pages.inc',
+    'type' => MENU_LOCAL_TASK,
+  );
   
   $items['node_gallery/upload/js'] = array(
     'title' => 'Gallery Image Upload',
@@ -216,6 +225,9 @@ function node_gallery_theme() {
     'gallery_edit_images_form' => array(
       'arguments' => array('form' => NULL),
     ),
+    'gallery_sort_images_form' => array(
+      'arguments' => array('form' => NULL),
+    ),
   );
   foreach ($themes as &$theme) {
     $theme['path'] = $path;
@@ -247,7 +259,13 @@ function node_gallery_nodeapi(&$node, $o
   switch ($op) {
     case 'load':
       if (in_array($node->type, (array)node_gallery_get_types())) {
-        $node->images = node_gallery_get_gallery_images($node);
+        // If we are sorting images, we don't want to load the pager
+        if (arg(2) == 'sort' || arg(2) == 'images') {
+          $node->images = node_gallery_get_gallery_images($node, TRUE);
+        }
+        else {
+          $node->images = node_gallery_get_gallery_images($node);
+        }
         $node->config = node_gallery_get_config($node->type);
       }
       if (in_array($node->type, (array)node_gallery_get_types('image'))) {
diff -urp node_gallery/node_gallery.pages.inc node_gallerySORT/node_gallery.pages.inc
--- node_gallery/node_gallery.pages.inc	2009-10-27 18:36:48.000000000 -0700
+++ node_gallerySORT/node_gallery.pages.inc	2009-10-29 02:11:00.000000000 -0700
@@ -42,8 +42,8 @@ function node_gallery_upload_form($form_
   );
   
   $form['upload_wrapper'] = array(
-    '#prefix' => "<div id='gallery-upload-wrapper'>",
-    '#suffix' => "</div>",
+    '#prefix' => '<div id="gallery-upload-wrapper">',
+    '#suffix' => '</div>',
   );
   
   $upload_number = is_numeric($config['number_uploads']) ? $config['number_uploads'] : 5;
@@ -296,7 +296,7 @@ function node_gallery_edit_images_form($
       $form['files'][$key]['filemime'] = array('#type' => 'value',  '#value' => $file->filemime);
       $form['files'][$key]['filesize'] = array('#type' => 'value',  '#value' => $file->filesize);
       $form['files'][$key]['fid'] = array('#type' => 'value',  '#value' => $file->fid);
-      $form['files'][$key]['gid'] = array('#type' => 'select',  '#default_value' => $gallery->nid, '#options' => $gallery_list);
+      $form['files'][$key]['gid'] = array('#type' => 'select', '#title' => 'Gallery', '#default_value' => $gallery->nid, '#options' => $gallery_list);
       
       //get the required fields for image node edit and saving.
       $file->type = empty($file->type) ? $gallery->config['image_type'] : $file->type;
@@ -306,9 +306,88 @@ function node_gallery_edit_images_form($
   }
   
   //pager if it exists;
+  /* Using the pager appears to break the order of images
   $form['pager'] = array(
     '#value' => theme('pager', NULL, variable_get('node_images_page_number', 20), NODE_GALLERY_IMAGE_PAGER_ELEMENT),
   );
+  */
+  
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#weight' => 20,
+    //need this because this form is used in image upload ahah also.
+    '#submit' => array('node_gallery_images_edit_submit'),
+    '#validate' => array('node_gallery_images_edit_validate'),
+  );
+  
+  return $form;
+}
+
+/**
+ * This is exactly like the edit images form except it removes the ability
+ * to edit the image content and removes pagination
+ */
+function node_gallery_sort_images_form($form_state, $gallery) {
+  global $user;
+  
+  drupal_set_breadcrumb(array(
+    l(t('Galleries'), 'galleries'),
+    l(t('!user\'s Galleries', array('!user' => $gallery->name)), 'galleries/'. $gallery->uid),
+    l($gallery->title, 'node/'. $gallery->nid)
+    ));
+   
+  $form = array(
+    '#theme' => 'gallery_sort_images_form',
+    '#cache' => TRUE,
+  );
+  //if this is new upload, then fid is file id;
+  //if this is edit images, then fid is node id;
+  //but fid is just an identifier here, so needn't care it.
+  foreach ($gallery->images as $fid => $f) {
+    $options[$fid] = '';
+    if ($f->is_cover) {
+      $cover_fid = $fid;
+    }
+  }
+  $form['is_cover'] = array(
+    '#type' => 'radios',
+    '#default_value' => $cover_fid,
+    '#options' => $options,
+  );
+  //we need this to verify if image was updated later.
+  $form['#gallery'] = $gallery;
+  
+  //for display in theme;
+  $form['#thumb_imagecache'] = $gallery->config['image_size']['thumbnail'];
+  
+  if (!empty($gallery->images) && is_array($gallery->images)) {
+    $form['files']['#tree'] = TRUE;
+    
+    foreach ($gallery->images as $key => $file) {
+      $file = (object)$file;
+      
+      $form['files'][$key]['remove'] = array('#type' => 'checkbox', '#default_value' => $file->remove);
+      $form['files'][$key]['weight'] = array('#type' => 'weight', '#delta' => count($gallery->images), '#default_value' => $file->weight);
+      $form['files'][$key]['filename'] = array('#type' => 'value',  '#value' => $file->filename);
+      $form['files'][$key]['filepath'] = array('#type' => 'value',  '#value' => $file->filepath);
+      $form['files'][$key]['filemime'] = array('#type' => 'value',  '#value' => $file->filemime);
+      $form['files'][$key]['filesize'] = array('#type' => 'value',  '#value' => $file->filesize);
+      $form['files'][$key]['fid'] = array('#type' => 'value',  '#value' => $file->fid);
+      $form['files'][$key]['gid'] = array('#type' => 'value', '#default_value' => $gallery->nid);
+      
+      //get the required fields for image node edit and saving.
+      $file->type = empty($file->type) ? $gallery->config['image_type'] : $file->type;
+      $file->gid = empty($file->gid) ? $gallery->nid : $file->gid;
+      $form['files'][$key]['edit_form'] = node_gallery_image_item_edit_form($form_state['values']['files'][$key]['edit_form'], $file, $gallery->config);
+      
+      foreach ($form['files'][$key]['edit_form'] as $item_key => $item) {
+        unset($form['files'][$key]['edit_form'][$item_key]['#title']);
+        $form['files'][$key]['edit_form'][$item_key]['#type'] = 'value';
+      }
+      unset($item_key, $item);
+    }
+  }
   
   $form['submit'] = array(
     '#type' => 'submit',
Only in node_gallerySORT/theme: .DS_Store
diff -urp node_gallery/theme/theme.inc node_gallerySORT/theme/theme.inc
--- node_gallery/theme/theme.inc	2009-10-28 18:57:10.000000000 -0700
+++ node_gallerySORT/theme/theme.inc	2009-10-29 01:54:07.000000000 -0700
@@ -127,18 +127,42 @@ function theme_gallery_edit_images_form(
   drupal_add_tabledrag('upload-attachments', 'order', 'sibling', 'upload-weight');
   
   $thumb_imagecache = $form['#thumb_imagecache'];
-  $header = array('', t('Delete'), t('Thumbnail'), t('Edit'), t('Weight'), t('Gallery'), t('Cover'));
+  $header = array('', t('Delete'), t('Thumbnail'), t('Edit'), t('Weight'), t('Cover'));
   foreach (element_children($form['files']) as $key) {
     // Add class to group weight fields for drag and drop.
     $form['files'][$key]['weight']['#attributes']['class'] = 'upload-weight';
 
     $row = array('');
     $row[] = drupal_render($form['files'][$key]['remove']);
-    $row[] = theme('imagecache', $thumb_imagecache, 
-      $form['files'][$key]['filepath']['#value'], $form['files'][$key]['filename']['#value'], $form['files'][$key]['filename']['#value']);
-    $row[] = drupal_render($form['files'][$key]['edit_form']);
+    $row[] = '<span class="gallery-upload-thumb">'. theme('imagecache', $thumb_imagecache, 
+      $form['files'][$key]['filepath']['#value'], $form['files'][$key]['filename']['#value'], $form['files'][$key]['filename']['#value']) .'</span>';
+    $row[] = drupal_render($form['files'][$key]['edit_form']) . drupal_render($form['files'][$key]['gid']);
+    $row[] = drupal_render($form['files'][$key]['weight']);
+    if ($form['is_cover']) {
+      $row[] = drupal_render($form['is_cover'][$key]);
+    }
+    $rows[] = array('data' => $row, 'class' => 'draggable');
+  }
+  $output = theme('table', $header, $rows, array('id' => 'upload-attachments'));
+  $output .= drupal_render($form);
+  return $output;
+}
+
+function theme_gallery_sort_images_form(&$form) {
+  drupal_add_tabledrag('upload-attachments', 'order', 'sibling', 'upload-weight');
+  
+  $thumb_imagecache = $form['#thumb_imagecache'];
+  $header = array('', t('Delete'), t('Thumbnail'), t('Weight'), t('Cover'));
+  foreach (element_children($form['files']) as $key) {
+    // Add class to group weight fields for drag and drop.
+    $form['files'][$key]['weight']['#attributes']['class'] = 'upload-weight';
+
+    $row = array('');
+    $row[] = drupal_render($form['files'][$key]['remove']);
+    $row[] = '<span class="gallery-upload-thumb">'. theme('imagecache', $thumb_imagecache, 
+      $form['files'][$key]['filepath']['#value'], $form['files'][$key]['filename']['#value'], $form['files'][$key]['filename']['#value']) .'</span>';
+    //$row[] = drupal_render($form['files'][$key]['edit_form']) . drupal_render($form['files'][$key]['gid']);
     $row[] = drupal_render($form['files'][$key]['weight']);
-    $row[] = drupal_render($form['files'][$key]['gid']);
     if ($form['is_cover']) {
       $row[] = drupal_render($form['is_cover'][$key]);
     }
