diff --git a/sources_custom/blocks/main_sortable_table.php b/sources_custom/blocks/main_sortable_table.php
index f8d42c97..9c8a54ca 100644
--- a/sources_custom/blocks/main_sortable_table.php
+++ b/sources_custom/blocks/main_sortable_table.php
@@ -237,22 +237,6 @@ class Block_main_sortable_table
                     continue;
                 }
 
-                foreach ($row as $j => $val) {
-                    foreach (is_array($transform) ? $transform : array($transform) as $_transform) {
-                        switch ($_transform) {
-                            case 'ucwords':
-                                $val = cms_mb_ucwords($val);
-                                break;
-
-                            case 'non-numeric-italics':
-                                if (!is_numeric($val)) {
-                                    $row[$j] = protect_from_escaping('<em>' . escape_html($val) . '</em>');
-                                }
-                                break;
-                        }
-                    }
-                }
-
                 $_rows[] = $row;
 
                 $i++;
@@ -400,6 +384,20 @@ class Block_main_sortable_table
         foreach ($_rows as $i => &$row) {
             foreach ($row as $j => &$value) {
                 $value = $this->apply_formatting($value, $headers[$j]['SORTABLE_TYPE']);
+
+                foreach (is_array($transform) ? $transform : array($transform) as $_transform) {
+                    switch ($_transform) {
+                        case 'ucwords':
+                            $value = cms_mb_ucwords($value);
+                            break;
+
+                        case 'non-numeric-italics':
+                            if ((!is_numeric($val)) && ($val != '')) {
+                                $value = protect_from_escaping('<em>' . escape_html($value) . '</em>');
+                            }
+                            break;
+                    }
+                }
             }
 
             $tooltip_values = array();
@@ -420,8 +418,13 @@ class Block_main_sortable_table
 
         // Final render...
 
-        $id = (preg_match('#^[\w_]+$#', $guid) != 0) ? $guid : uniqid('', false);
+        $id = (preg_match('#^[\w_\-]+$#', $guid) != 0) ? $guid : uniqid('', false);
 
+        $reverse_sorting = false;
+        if ((!empty($map['default_sort_column'])) && (substr($map['default_sort_column'], 0, 1) == '!')) {
+            $reverse_sorting = true;
+            $map['default_sort_column'] = substr($map['default_sort_column'], 1);
+        }
         $_default_sort_column = max(0, empty($map['default_sort_column']) ? 0 : (intval(str_replace($letters, $numbers, $map['default_sort_column'])) - 1));
         $default_sort_column = ($columns_display == array()) ? $_default_sort_column : array_search($_default_sort_column + 1, $columns_display);
         if ($default_sort_column === false) {
@@ -432,7 +435,7 @@ class Block_main_sortable_table
         return do_template('SORTABLE_TABLE', array(
             '_GUID' => $guid,
             'ID' => $id,
-            'DEFAULT_SORT_COLUMN' => strval($default_sort_column),
+            'DEFAULT_SORT_COLUMN' => ($reverse_sorting ? '!' : '') . strval($default_sort_column),
             'MAX' => strval($max),
             'HEADERS' => $headers,
             'ROWS' => $rows,
diff --git a/themes/default/javascript_custom/sortable_tables.js b/themes/default/javascript_custom/sortable_tables.js
index e489a94d..456fa7b0 100644
--- a/themes/default/javascript_custom/sortable_tables.js
+++ b/themes/default/javascript_custom/sortable_tables.js
@@ -731,6 +731,7 @@ var SortableTable = (function(){
     // Scrape each row of each tbody
     var bodies = t.tBodies;
     if (bodies==null || bodies.length==0) { return; }
+    var mostRecentVisibleRow = null;
     for (var i=0,L=bodies.length; i<L; i++) {
       var tb = bodies[i];
       for (var j=0,L2=tb.rows.length; j<L2; j++) {
@@ -780,19 +781,31 @@ var SortableTable = (function(){
         if (!hasClass(row,'table-nofilter'))
           row.style.display = hideRow?"none":"";
 
-        if (row.className.replace(/^(\s*(first|last)\s*)*$/, '') == '') {
+        if (row.className.replace(/^(\s*(first|last)\s*)*$/, '') == '') { // If no other styles on the row
             var classes = [];
-            if (unfilteredrowcount == pagestart) {
-                classes.push('first');
-            }
-            if (unfilteredrowcount == pageend) {
-                classes.push('last');
+            if (!hideRow) {
+                if (unfilteredrowcount == pagestart) {
+                    classes.push('first');
+                }
+                if (unfilteredrowcount == pageend) {
+                    classes.push('last');
+                }
+                mostRecentVisibleRow = row;
             }
             row.className = classes.join(' ');
         }
       }
     }
 
+    if (mostRecentVisibleRow !== null) {
+        var classes = [];
+        if (unfilteredrowcount == pagestart) {
+            classes.push('first');
+        }
+        classes.push('last');
+        mostRecentVisibleRow.className = classes.join(' ');
+    }
+
     if (def(page)) {
       // Check to see if filtering has put us past the requested page index. If it has, 
       // then go back to the last page and show it.
@@ -931,7 +944,12 @@ var SortableTable = (function(){
     }
     // Do auto-sort if necessary
     if ((val = classValue(t,table.AutoSortColumnPrefix)) || (hasClass(t,table.AutoSortClassName))) {
-      table.autosort(t,{'col':(val==null)?null:+val});
+      var autoSortArgs = {'col':(val==null)?null:window.parseInt(val.replace(/^!/,''))};
+      if (val.substr(0, 1) == '!') {
+        autoSortArgs['forcedirection'] = true;
+        autoSortArgs['desc'] = true;
+      }
+      table.autosort(t,autoSortArgs);
     }
     // Do auto-stripe if necessary
     if (tdata.stripeclass && hasClass(t,table.AutoStripeClassName)) {
@@ -1077,4 +1095,4 @@ var SortableTable = (function(){
   }
 
   return table;
-})();
\ No newline at end of file
+})();
