diff --git a/data/css/tablesorter.css b/data/css/tablesorter.css
deleted file mode 100644
index d8b64ed69e8049a5b7f3392726f589310b4dbca1..0000000000000000000000000000000000000000
--- a/data/css/tablesorter.css
+++ /dev/null
@@ -1,83 +0,0 @@
-/* SB Theme */
-table.tablesorter {
-    width: 100%;
-    margin-left:auto;
-    margin-right:auto;
-    text-align:left;
-    color: #000;
-    background-color: #fff;
-    border-spacing: 0;
-}
-table.tablesorter th,
-table.tablesorter td {
-    padding: 4px;
-    border-left: #fff 1px solid;
-    border-top: #fff 1px solid;
-}
-/* remove extra border from left edge */
-table.tablesorter th:first-child,
-table.tablesorter td:first-child {
-    border-left: none;
-}
-table.tablesorter th {
-    border-collapse: collapse;
-    background-color: #333;
-    color: #fff;
-    text-shadow: -1px -1px 0 rgba(0,0,0,0.3);
-    text-align: center;
-}
-table.tablesorter .tablesorter-header {
-/*    background-image: url(../images/tablesorter/bg.gif); */
-    background-repeat: no-repeat;
-    background-position: center right;
-    padding: 4px 18px 4px 4px;
-    cursor: pointer;
-}
-table.tablesorter th.tablesorter-headerSortUp {
-    background-color: #57442B;
-/*    background-image: url(../images/tablesorter/asc.gif); */
-}
-table.tablesorter th.tablesorter-headerSortDown {
-    background-color: #57442B;
-/*    background-image: url(../images/tablesorter/desc.gif); */
-}
-
-/* Zebra Widget - row alternating colors */
-table.tablesorter tr.odd td {
-    background-color: #f5f1e4;
-}
-table.tablesorter tr.even td {
-    background-color: #dfdacf;
-}
-/* filter widget */
-table.tablesorter input.tablesorter-filter {
-    width: 98%;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-}
-table.tablesorter tr.tablesorter-filter,
-table.tablesorter tr.tablesorter-filter td {
-    text-align: center;
-    background: #eee;
-}
-/* optional disabled input styling */ 
-table.tablesorter input.tablesorter-filter.disabled {
-    display: none;
-}
-
-
-/* xtra css for sb */
-.tablesorter-header-inner {
-    text-align: center;
-    padding: 0 2px;
-}
-tr.tablesorter-stickyHeader {
-    background-color: #fff;
-    padding: 2px 0;
-}
-
-table.tablesorter tfoot a {
-    color:#fff;
-    text-decoration: none;
-}
diff --git a/data/interfaces/default/history.tmpl b/data/interfaces/default/history.tmpl
index e1b73d70d73dec3e8d41a95925067104c5abe0c8..43c656eaa95f21bb12fec3ae28b07b992cc08a34 100644
--- a/data/interfaces/default/history.tmpl
+++ b/data/interfaces/default/history.tmpl
@@ -16,7 +16,6 @@
 <script type="text/javascript" src="$sbRoot/js/lib/jquery.dataTables.min.js"></script>
 <script type="text/javascript" src="$sbRoot/js/jquery.dataTables.reloadAjax.js"></script>
 <script type="text/javascript" src="$sbRoot/js/jquery.dataTables.sorting.js"></script>
-<script type="text/javascript" src="$sbRoot/js/home.js"></script>
 
 <script type="text/javascript">
 <!--
@@ -24,8 +23,12 @@
 { 
     \$("#historyTable").dataTable({
         "bJQueryUI": true,
-        "sPaginationType": "full_numbers",
-        "bStateSave": true,
+        "bStateSave": false,
+        "aaSorting": [[0, 'desc']],
+        "iDisplayLength": 50,
+
+        "sPaginationType": "two_button",
+
         "aoColumnDefs": [
             { "asSorting": [ "desc", "asc" ], "aTargets": [0] },
             
diff --git a/data/interfaces/default/home_addExistingShow.tmpl b/data/interfaces/default/home_addExistingShow.tmpl
index 7ac6a079b45600c95da692eb03b79c44d1ac214d..8e1b85a0d5ffc68b88c175de31e9845304bbec4c 100644
--- a/data/interfaces/default/home_addExistingShow.tmpl
+++ b/data/interfaces/default/home_addExistingShow.tmpl
@@ -13,6 +13,8 @@
 
 <form id="addShowForm" method="post" action="$sbRoot/home/addShows/addNewShow" accept-charset="utf-8">
 
+<script type="text/javascript" src="$sbRoot/js/lib/jquery.dataTables.min.js"></script>
+<script type="text/javascript" src="$sbRoot/js/jquery.dataTables.sorting.js"></script>
 <script type="text/javascript" src="$sbRoot/js/addExistingShow.js"></script>
 <script type="text/javascript" src="$sbRoot/js/rootDirs.js"></script>
 <script type="text/javascript" src="$sbRoot/js/addShowOptions.js"></script> 
diff --git a/data/interfaces/default/home_massAddTable.tmpl b/data/interfaces/default/home_massAddTable.tmpl
index b37fedccb669a16b51f483a05706655bac5cf7ad..774b98da2cc61a78805720d48678db833d06234c 100644
--- a/data/interfaces/default/home_massAddTable.tmpl
+++ b/data/interfaces/default/home_massAddTable.tmpl
@@ -1,4 +1,4 @@
-<table id="addRootDirTable" class="sickbeardTable tablesorter">
+<table id="addRootDirTable">
   <thead><tr><th width="1%"><input type="checkbox" id="checkAll" checked=checked></th><th>Directory</th><th width="20%">Show Name (tvshow.nfo)</td></tr></thead>
   <tfoot>
     <tr>
diff --git a/data/interfaces/default/inc_top.tmpl b/data/interfaces/default/inc_top.tmpl
index 994ca3caef8cbf966447f2d7a5c6364ab815abe1..6d5dd67f38d780dbeff2103a814ee69d0639a239 100644
--- a/data/interfaces/default/inc_top.tmpl
+++ b/data/interfaces/default/inc_top.tmpl
@@ -18,7 +18,6 @@
     <link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/jquery.pnotify.default.css" />
     <link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/sickbeard-jquery/jquery-ui-1.8.18.custom.css" />
     <link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/superfish.css" />
-    <link rel="stylesheet" type="text/css" href="$sbRoot/css/tablesorter.css"/>
     <link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/jquery.qtip2.css"/>
     <link rel="stylesheet" type="text/css" media="only screen and (max-device-width: 480px)" href="$sbRoot/css/iphone.css" />
 
@@ -27,9 +26,6 @@
 #contentWrapper { background: url("$sbRoot/images/bg.gif") repeat scroll 0 0 transparent; }
 .sf-sub-indicator { background: url("$sbRoot/images/arrows.png") no-repeat -10px -100px; }
 .sf-shadow ul { background: url("$sbRoot/images/shadow.png") no-repeat bottom right; }
-th.tablesorter-header { background-image: url("$sbRoot/images/tablesorter/bg.gif"); }
-th.tablesorter-headerSortUp { background-image: url("$sbRoot/images/tablesorter/asc.gif"); }
-th.tablesorter-headerSortDown { background-image: url("$sbRoot/images/tablesorter/desc.gif"); }
 
 .browserDialog.busy .ui-dialog-buttonpane { background: url("$sbRoot/images/loading.gif") 10px 50% no-repeat !important; }
 
@@ -47,8 +43,6 @@ th.tablesorter-headerSortDown { background-image: url("$sbRoot/images/tablesorte
     <script type="text/javascript" src="$sbRoot/js/lib/jquery.cookiejar.js"></script>
     <script type="text/javascript" src="$sbRoot/js/lib/jquery.json-2.2.min.js"></script>
     <script type="text/javascript" src="$sbRoot/js/lib/jquery.selectboxes.min.js"></script>
-    <script type="text/javascript" src="$sbRoot/js/lib/jquery.tablesorter-2.1.10.min.js"></script>
-    <script type="text/javascript" src="$sbRoot/js/lib/jquery.tablesorter.widgets.min.js"></script>
     <script type="text/javascript" src="$sbRoot/js/lib/jquery.qtip-2011-11-14.min.js"></script>
     <script type="text/javascript" src="$sbRoot/js/lib/jquery.pnotify-1.0.2.min.js"></script>
     <script type="text/javascript" src="$sbRoot/js/lib/jquery.expand-1.3.8.js"></script>
diff --git a/data/interfaces/default/manage.tmpl b/data/interfaces/default/manage.tmpl
index 13277862fcac5a36d91aacb278911b30733a0aa3..aaad67f043a0aa00c8c8d619a0ac9b83d711c762 100644
--- a/data/interfaces/default/manage.tmpl
+++ b/data/interfaces/default/manage.tmpl
@@ -8,8 +8,12 @@
 #import os.path
 #include $os.path.join($sickbeard.PROG_DIR, "data/interfaces/default/inc_top.tmpl")
 
+<script type="text/javascript" src="$sbRoot/js/lib/jquery.dataTables.min.js"></script>
+<script type="text/javascript" src="$sbRoot/js/jquery.dataTables.sorting.js"></script>
+
 <script type="text/javascript" charset="utf-8">
 <!--
+/*
 \$.tablesorter.addParser({
     id: 'showNames',
     is: function(s) {
@@ -51,7 +55,73 @@
             9: { sorter: false},
             10: { sorter: false}
         }
-    }); 
+    });
+ });
+*/
+
+\$(document).ready(function() 
+{ 
+    \$("#massUpdateTable").dataTable({
+        "bPaginate": false,
+        "bInfo": false,
+        "bFilter": false,
+        "bAutoWidth": false,
+        "bProcessing": false,
+        "sDom": "lftipr",
+        "bJQueryUI": true,
+
+        // use localstorage to save state
+        "bStateSave": true,
+        "fnStateSave": function (oSettings, oData) {
+            localStorage.setItem( 'DataTables_'+window.location.pathname, JSON.stringify(oData) );
+        },
+        "fnStateLoad": function (oSettings) {
+            var data = localStorage.getItem('DataTables_'+window.location.pathname);
+            return JSON.parse(data);
+        },
+
+
+        "aoColumnDefs": [
+            {
+                "sClass": "center",
+                "aTargets": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10]
+            },
+
+            { "asSorting": [ "desc", "asc" ], "aTargets": [0] },
+            
+            {
+                "bSortable": false,
+                "bSearchable": false,
+                "aTargets": [0, 7, 8, 9, 10]
+            },
+            
+            { 
+                "sType": "quality",
+                "bUseRendered": false,
+
+                // render the quality in a span
+                "fnRender": function ( oObj, sVal ) {
+                    return '<span class="quality '+sVal+'">'+sVal+'</span>';
+                },
+                "aDataSort": [3, 1],
+                "aTargets": [ 3 ],
+            },
+        
+            {
+                "sType": "alt-string",
+                "bUseRendered": true,
+                "aTargets": [4, 5],
+            },
+        
+            { 
+                "sType": "titles",
+                "bUseRendered": false,
+                "aTargets": [ 6 ],
+            },
+            
+        ]
+    });
+     
 });
 //-->
 </script>
@@ -59,7 +129,7 @@
 
 <form name="massUpdateForm" method="post" action="massUpdate">
 
-<table id="massUpdateTable" class="sickbeardTable tablesorter" cellspacing="1" border="0" cellpadding="0">
+<table id="massUpdateTable" cellspacing="1" border="0" cellpadding="0">
   <thead>
     <tr>
       <th width="1%">Edit&nbsp;<input type="checkbox" class="bulkCheck" id="editCheck" /></th>
@@ -110,22 +180,26 @@ $myShowList.sort(lambda x, y: cmp(x.name, y.name))
 #set $curDelete = "<input type=\"checkbox\" class=\"deleteCheck\" id=\"delete-"+str($curShow.tvdbid)+"\" "+$curDelete_disabled+"/>"
 
   <tr>
-    <td align="center"><input type="checkbox" class="editCheck" id="edit-$curShow.tvdbid" /></td>
-    <td align="center"><img src="$sbRoot/images/flags/${curShow.lang}.png" width="16" height="11" alt="$curShow.lang" /></td>
+    <td><input type="checkbox" class="editCheck" id="edit-$curShow.tvdbid" /></td>
+    <td><img src="$sbRoot/images/flags/${curShow.lang}.png" width="16" height="11" alt="$curShow.lang" /></td>
     <td class="tvShow"><a href="$sbRoot/home/displayShow?show=$curShow.tvdbid">$curShow.name</a></td>
-#if $curShow.quality in $qualityPresets:
-    <td align="center"><span class="quality $qualityPresetStrings[$curShow.quality]">$qualityPresetStrings[$curShow.quality]</span></td>
+#if False and $curShow.quality in $qualityPresets:
+    <td><span class="quality $qualityPresetStrings[$curShow.quality]">$qualityPresetStrings[$curShow.quality]</span></td>
+#elif False:
+    <td><span class="quality Custom">Custom</span></td>
+#elif $curShow.quality in $qualityPresets:
+    <td>$qualityPresetStrings[$curShow.quality]</td>
 #else:
-    <td align="center"><span class="quality Custom">Custom</span></td>
+    <td>Custom</td>
 #end if 
-    <td align="center"><img src="$sbRoot/images/#if int($curShow.seasonfolders) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
-    <td align="center"><img src="$sbRoot/images/#if int($curShow.paused) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
-    <td align="center">$curShow.status</td>
-    <td align="center">$curUpdate</td>
-    <td align="center">$curRefresh</td>
-    <td align="center">$curRename</td>
+    <td><img src="$sbRoot/images/#if int($curShow.seasonfolders) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
+    <td><img src="$sbRoot/images/#if int($curShow.paused) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
+    <td>$curShow.status</td>
+    <td>$curUpdate</td>
+    <td>$curRefresh</td>
+    <td>$curRename</td>
 <!--    <td align="center"><input type="checkbox" class="metadataCheck" id="metadata-$curShow.tvdbid" /></td>//-->
-    <td align="center">$curDelete</td>
+    <td>$curDelete</td>
   </tr>
 #end for
 </tbody>
diff --git a/data/js/addExistingShow.js b/data/js/addExistingShow.js
index cca6667a2d37fe550154a6eca6b56a954c6ac520..08a8feda5d97125a0291f73f5c25ffa280fcb1ae 100644
--- a/data/js/addExistingShow.js
+++ b/data/js/addExistingShow.js
@@ -45,12 +45,42 @@ $(document).ready(function() {
         $('#tableDiv').html('<img id="searchingAnim" src="'+sbRoot+'/images/loading32.gif" height="32" width="32" /> loading folders...');
         $.get(sbRoot+'/home/addShows/massAddTable', url, function(data) {
             $('#tableDiv').html(data);
-            $("#addRootDirTable").tablesorter({
-                //sortList: [[1,0]],
-                widgets: ['zebra'],
-                headers: {
-                    0: { sorter: false }
-                }
+            $("#addRootDirTable").dataTable({
+            	
+        		// disable most stuff for the table
+                "bPaginate": false,
+                "bInfo": false,
+                "bFilter": false,
+                "bAutoWidth": false,
+                "bProcessing": false,
+
+        		// only show the basic DOM elements
+        		"sDom": "lftipr",
+                "bJQueryUI": true,
+                
+                "aoColumnDefs": [
+                	{ "sClass": "center", "aTargets": [0] },
+
+        			// checkbox
+                    {
+        				"bSortable": false,
+        				"bSearchable": false,
+        				"aTargets": [0],
+                    },
+                    
+        			// path
+                    {
+                    	"sType": "titles",
+                    	"aTargets": [ 1 ]
+                    },
+                    
+        			// TVDB link
+                    {
+                    	"sType": "link-text",
+                    	"aTargets": [ 2 ]
+                    },
+                    
+            	],
             });
         });
 
diff --git a/data/js/home.js b/data/js/home.js
index 997fc0730600a6dd7670c0900532891ad43ae01e..4c0004e126bf27ae36bb815c94b405fb3837d5c7 100644
--- a/data/js/home.js
+++ b/data/js/home.js
@@ -60,7 +60,7 @@ $(document).ready(function(){
         	{
         		"sClass": "center",
         		"aTargets": [0, 2, 3, 4, 5, 6]
-             },
+            },
 
 			// Date
 			{
@@ -135,7 +135,8 @@ $(document).ready(function(){
             	"aTargets": [6]
 			},
     	],
-        "aoColumns": [
+
+    	"aoColumns": [
             { "mDataProp": "next_airdate" },
             { "mDataProp": "name" },
             { "mDataProp": "network" },
@@ -143,9 +144,11 @@ $(document).ready(function(){
             { "mDataProp": "percent_downloaded" },
             { "mDataProp": "active" },
             { "mDataProp": "status" }
-        ]
-    });
+        ],
+        
+        "aaSorting": [[5, 'asc'], [1, 'asc']]
+	});
 	
 	// start watching the show list crcs
-    check_crc();
+    //check_crc();
 });
diff --git a/data/js/jquery.dataTables.sorting.js b/data/js/jquery.dataTables.sorting.js
index aaa206c55c5896d55246e4f4d90740c1cc1f7ec5..9f5d96c66f3f8e49833929944e225aadbd7c418d 100644
--- a/data/js/jquery.dataTables.sorting.js
+++ b/data/js/jquery.dataTables.sorting.js
@@ -56,13 +56,33 @@ $(document).ready(function(){
 	   var y = b.match(/alt="(.*?)"/)[1].toLowerCase();
 	   return ((x < y) ? -1 : ((x > y) ?  1 : 0));
 	};
-	 
+		 
 	$.fn.dataTableExt.oSort['alt-string-desc'] = function(a,b) {
 	   var x = a.match(/alt="(.*?)"/)[1].toLowerCase();
 	   var y = b.match(/alt="(.*?)"/)[1].toLowerCase();
 	   return ((x < y) ?  1 : ((x > y) ? -1 : 0));
 	};
 
+	$.fn.dataTableExt.oSort['link-text-asc']  = function(a,b) {
+	   var x = a.match(/>\s*(.*?)\s*<\s*\/\s*a\s*>/);
+	   var y = b.match(/>\s*(.*?)\s*<\s*\/\s*a\s*>/);
+
+	   x = x != null ? x[1].toLowerCase() : a.toLowerCase();
+	   y = y != null ? y[1].toLowerCase() : b.toLowerCase();
+	   
+	   return ((x < y) ? -1 : ((x > y) ?  1 : 0));
+	};
+		 
+	$.fn.dataTableExt.oSort['link-text-desc'] = function(a,b) {
+	   var x = a.match(/>\s*(.*?)\s*<\s*\/\s*a\s*>/);
+	   var y = b.match(/>\s*(.*?)\s*<\s*\/\s*a\s*>/);
+
+	   x = x != null ? x[1].toLowerCase() : a.toLowerCase();
+	   y = y != null ? y[1].toLowerCase() : b.toLowerCase();
+	   
+	   return ((x < y) ?  1 : ((x > y) ? -1 : 0));
+	};
+
 	$.fn.dataTableExt.oSort['empty-last-asc']  = function(a,b) {
 		if (a == "")
 			return 1;