diff --git a/SickBeard.py b/SickBeard.py
index 2d9df1f15222031aab502e73e478522c882e2ecf..fe5bb2c77f26535f1f3ba7508fa4f1d40b22be33 100755
--- a/SickBeard.py
+++ b/SickBeard.py
@@ -415,9 +415,13 @@ class SickRage(object):
 
         os.setsid()  # @UndefinedVariable - only available in UNIX
 
-        # Make sure I can read my own files and shut out others
-        prev = os.umask(0)
-        os.umask(prev and int('077', 8))
+        # https://github.com/SiCKRAGETV/sickrage-issues/issues/2969
+        # http://www.microhowto.info/howto/cause_a_process_to_become_a_daemon_in_c.html#idp23920
+        # https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch06s08.html
+        # Previous code simply set the umask to whatever it was because it was ANDing instead of ORring
+        # Daemons traditionally run with umask 0 anyways and this should not have repercussions
+        os.umask(0)
+
 
         # Make the child a session-leader by detaching from the terminal
         try:
diff --git a/gui/slick/css/dark.css b/gui/slick/css/dark.css
index b9ffa8e060d021a202781c0b68b1aee4f3ccb491..efcee90aa3f48f9f9d4004a2cc5da42f50d857db 100644
--- a/gui/slick/css/dark.css
+++ b/gui/slick/css/dark.css
@@ -1076,7 +1076,7 @@ jquery.confirm.css
 }
 
 /* =======================================================================
-bootstarp modal
+bootstrap modal
 ========================================================================== */
 
 .modal-content {
@@ -1098,3 +1098,17 @@ bootstarp modal
 	 border-top-left-radius: 5px;
 	 border-top-right-radius: 5px;
 }
+
+/* =======================================================================
+bootstrap panel
+========================================================================== */
+
+.panel-default {
+	background-color: #3D3D3D;
+	border-color: #111111;
+}
+
+.panel-heading {
+	background-color: #3D3D3D !important;
+	color: #FFFFFF !important;
+}
diff --git a/gui/slick/images/network/+globosat.png b/gui/slick/images/network/+globosat.png
new file mode 100644
index 0000000000000000000000000000000000000000..b52748ec3c871595bad272a24e74ef367b2e9d54
Binary files /dev/null and b/gui/slick/images/network/+globosat.png differ
diff --git a/gui/slick/images/network/canal off.png b/gui/slick/images/network/canal off.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc5d23fabe1a7c349fa73548ec02d0cd7171ad58
Binary files /dev/null and b/gui/slick/images/network/canal off.png differ
diff --git a/gui/slick/images/network/gnt.png b/gui/slick/images/network/gnt.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c035db09fe284aa02a8c8b8ed50b0ec9aa3919c
Binary files /dev/null and b/gui/slick/images/network/gnt.png differ
diff --git a/gui/slick/images/network/hbo latin america.png b/gui/slick/images/network/hbo latin america.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d4cadda4c2022c725e882d1943432bc85e29424
Binary files /dev/null and b/gui/slick/images/network/hbo latin america.png differ
diff --git a/gui/slick/images/network/mtv brazil.png b/gui/slick/images/network/mtv brazil.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f49892da1600044ece436ca5294def158e685fe
Binary files /dev/null and b/gui/slick/images/network/mtv brazil.png differ
diff --git a/gui/slick/images/network/multishow.png b/gui/slick/images/network/multishow.png
new file mode 100644
index 0000000000000000000000000000000000000000..28b71d1bc2830490f0f8d737bc1559a3b7240448
Binary files /dev/null and b/gui/slick/images/network/multishow.png differ
diff --git a/gui/slick/images/network/record.png b/gui/slick/images/network/record.png
new file mode 100644
index 0000000000000000000000000000000000000000..a123fe88676781d12ba73577faffe58aeaa5d5fe
Binary files /dev/null and b/gui/slick/images/network/record.png differ
diff --git a/gui/slick/images/network/rede bandeirantes.png b/gui/slick/images/network/rede bandeirantes.png
new file mode 100644
index 0000000000000000000000000000000000000000..b16a2cceb0cc2fc7c5c68bc998d031713f7530f1
Binary files /dev/null and b/gui/slick/images/network/rede bandeirantes.png differ
diff --git a/gui/slick/images/network/rede globo.png b/gui/slick/images/network/rede globo.png
new file mode 100644
index 0000000000000000000000000000000000000000..e16c65fcc06d3d47d2877dd51f1ee829072ed25e
Binary files /dev/null and b/gui/slick/images/network/rede globo.png differ
diff --git a/gui/slick/images/network/sbt.png b/gui/slick/images/network/sbt.png
new file mode 100644
index 0000000000000000000000000000000000000000..36368e4e19ea7f28809be7cb286ff748e7ff85c1
Binary files /dev/null and b/gui/slick/images/network/sbt.png differ
diff --git a/gui/slick/images/network/tv cultura.png b/gui/slick/images/network/tv cultura.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d462c984a1a954d3afed866e87e3e0f7d8c9eb2
Binary files /dev/null and b/gui/slick/images/network/tv cultura.png differ
diff --git a/gui/slick/images/network/universal channel.png b/gui/slick/images/network/universal channel.png
index c806132243d13c2a17ba486ff1045efd3cf86501..35a0a5c51e1d92c708ac4f43b766c88decc811d1 100644
Binary files a/gui/slick/images/network/universal channel.png and b/gui/slick/images/network/universal channel.png differ
diff --git a/gui/slick/images/providers/6box.png b/gui/slick/images/providers/6box.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf611ac5b6d154eadaf24add51e2b3b698c551cf
Binary files /dev/null and b/gui/slick/images/providers/6box.png differ
diff --git a/gui/slick/images/providers/6box_me.png b/gui/slick/images/providers/6box_me.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf611ac5b6d154eadaf24add51e2b3b698c551cf
Binary files /dev/null and b/gui/slick/images/providers/6box_me.png differ
diff --git a/gui/slick/images/providers/ezrss.png b/gui/slick/images/providers/ezrss.png
deleted file mode 100644
index 30805041bd802f9cf8590eef2dda65114d8ff249..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/ezrss.png and /dev/null differ
diff --git a/gui/slick/images/providers/eztv_bt_chat.png b/gui/slick/images/providers/eztv_bt_chat.png
deleted file mode 100644
index 5ccd1a4b3e0222b6a010311025bb703b309b19fb..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/eztv_bt_chat.png and /dev/null differ
diff --git a/gui/slick/images/providers/oldpiratebay.png b/gui/slick/images/providers/oldpiratebay.png
deleted file mode 100644
index 6e52fd53d9bae6e991c591d14a1a61af8f640c77..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/oldpiratebay.png and /dev/null differ
diff --git a/gui/slick/images/providers/sick_beard_index.png b/gui/slick/images/providers/sick_beard_index.png
deleted file mode 100644
index 2ba4d236a4bc8196a9574bb4282530793ddbab4a..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/sick_beard_index.png and /dev/null differ
diff --git a/gui/slick/images/providers/sixbox.png b/gui/slick/images/providers/sixbox.png
index 42819b21a34ae46042651d074bb1cab9c70b0b81..cf611ac5b6d154eadaf24add51e2b3b698c551cf 100644
Binary files a/gui/slick/images/providers/sixbox.png and b/gui/slick/images/providers/sixbox.png differ
diff --git a/gui/slick/images/providers/sixbox_me.png b/gui/slick/images/providers/sixbox_me.png
index 42819b21a34ae46042651d074bb1cab9c70b0b81..cf611ac5b6d154eadaf24add51e2b3b698c551cf 100644
Binary files a/gui/slick/images/providers/sixbox_me.png and b/gui/slick/images/providers/sixbox_me.png differ
diff --git a/gui/slick/images/providers/torrentproject.png b/gui/slick/images/providers/torrentproject.png
new file mode 100644
index 0000000000000000000000000000000000000000..6823df0185fca65bb377286e5647ecea42bf2087
Binary files /dev/null and b/gui/slick/images/providers/torrentproject.png differ
diff --git a/gui/slick/js/addExistingShow.js b/gui/slick/js/addExistingShow.js
index 6b13cba3e94b00007ae916088413d6b670f68fea..851628a09ed85cef5d0e5214cf87d1793ba8fa8a 100644
--- a/gui/slick/js/addExistingShow.js
+++ b/gui/slick/js/addExistingShow.js
@@ -1,16 +1,13 @@
 $(document).ready(function() {
 
     $('#tableDiv').on('click', '#checkAll', function() {
-
         var seasCheck = this;
         $('.dirCheck').each(function() {
             this.checked = seasCheck.checked;
         });
-
     });
 
     $('#submitShowDirs').click(function() {
-
         var dirArr = [];
         $('.dirCheck').each(function(i,w) {
             if (this.checked === true) {
@@ -24,11 +21,10 @@ $(document).ready(function() {
             return false;
         }
 
-        url = sbRoot + '/home/addShows/addExistingShows?promptForSettings=' + ($('#promptForSettings').prop('checked') ? 'on' : 'off');
+        url = srRoot + '/home/addShows/addExistingShows?promptForSettings=' + ($('#promptForSettings').prop('checked') ? 'on' : 'off');
         url += '&shows_to_add=' + dirArr.join('&shows_to_add=');
 
         window.location.href = url;
-
     });
 
 
@@ -43,8 +39,8 @@ $(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('<img id="searchingAnim" src="' + srRoot + '/images/loading32.gif" height="32" width="32" /> loading folders...');
+        $.get(srRoot + '/home/addShows/massAddTable/', url, function(data) {
             $('#tableDiv').html(data);
             $("#addRootDirTable").tablesorter({
                 //sortList: [[1,0]],
@@ -54,7 +50,6 @@ $(document).ready(function() {
                 }
             });
         });
-
     }
 
     var last_txt = '';
@@ -78,5 +73,4 @@ $(document).ready(function() {
         $("#tabs").tabs('option', 'active', 0);
         $('html,body').animate({scrollTop:0}, 1000);
     });
-
 });
diff --git a/gui/slick/js/addShowOptions.js b/gui/slick/js/addShowOptions.js
index 03653a49f54340c6007167f5582510ed25fa8791..ac0605c69f60aad70bf37bed977231d9b23ca5eb 100644
--- a/gui/slick/js/addShowOptions.js
+++ b/gui/slick/js/addShowOptions.js
@@ -1,5 +1,4 @@
 $(document).ready(function () {
-
     $('#saveDefaultsButton').click(function () {
         var anyQualArray = [];
         var bestQualArray = [];
@@ -10,7 +9,7 @@ $(document).ready(function () {
             bestQualArray.push($(d).val());
         });
 
-        $.get(sbRoot + '/config/general/saveAddShowDefaults', {
+        $.get(srRoot + '/config/general/saveAddShowDefaults', {
             defaultStatus: $('#statusSelect').val(),
             anyQualities: anyQualArray.join(','),
             bestQualities: bestQualArray.join(','),
@@ -18,7 +17,8 @@ $(document).ready(function () {
             subtitles: $('#subtitles').prop('checked'),
             anime: $('#anime').prop('checked'),
             scene: $('#scene').prop('checked'),
-            defaultStatusAfter: $('#statusSelectAfter').val()
+            defaultStatusAfter: $('#statusSelectAfter').val(),
+            archive: $('#archive').prop('checked')
         });
 
         $(this).attr('disabled', true);
@@ -29,8 +29,7 @@ $(document).ready(function () {
         });
     });
 
-    $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles, #scene, #anime, #statusSelectAfter').change(function () {
+    $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles, #scene, #anime, #statusSelectAfter, #archive').change(function () {
         $('#saveDefaultsButton').attr('disabled', false);
     });
-
 });
diff --git a/gui/slick/js/addTrendingShow.js b/gui/slick/js/addTrendingShow.js
index 137acce016a8ee9a2b5738c393db47a31698e32d..12f5440b51ce13b1860095821dcb45c42008fe1f 100644
--- a/gui/slick/js/addTrendingShow.js
+++ b/gui/slick/js/addTrendingShow.js
@@ -4,9 +4,9 @@ $(document).ready(function() {
     function loadContent() {
         if (trendingRequestXhr) trendingRequestXhr.abort();
 
-        $('#trendingShows').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> loading trending shows...');
+        $('#trendingShows').html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> loading trending shows...');
         trendingRequestXhr = $.ajax({
-            url: sbRoot + '/home/addShows/getTrendingShows/',
+            url: srRoot + '/home/addShows/getTrendingShows/',
             timeout: 60 * 1000,
             error: function () {
                 $('#trendingShows').empty().html('Trakt timed out, refresh page to try again');
diff --git a/gui/slick/js/ajaxEpSearch.js b/gui/slick/js/ajaxEpSearch.js
index 8f0ce9d8e4876b891c89da2f1421d1b5e1fbf278..6c01dcfd10064dbdaec7060d74701e2bd386dfa6 100644
--- a/gui/slick/js/ajaxEpSearch.js
+++ b/gui/slick/js/ajaxEpSearch.js
@@ -1,4 +1,4 @@
-var search_status_url = sbRoot + '/home/getManualSearchStatus';
+var search_status_url = srRoot + '/home/getManualSearchStatus';
 var failedDownload = false;
 var qualityDownload = false;
 var selectedEpisode = '';
@@ -46,38 +46,36 @@ function updateImages(data) {
         img=el.children('img');
         parent=el.parent();
         if (el) {
+            var rSearchTerm = '';
             if (ep.searchstatus == 'searching') {
                 //el=$('td#' + ep.season + 'x' + ep.episode + '.search img');
                 img.prop('title','Searching');
                 img.prop('alt','Searching');
-                img.prop('src',sbRoot+'/images/' + loadingImage);
+                img.prop('src',srRoot+'/images/' + loadingImage);
                 disableLink(el);
                 // Update Status and Quality
-                var rSearchTerm = /(\w+)\s\((.+?)\)/;
+                rSearchTerm = /(\w+)\s\((.+?)\)/;
                 HtmlContent = ep.searchstatus;
 
-            }
-            else if (ep.searchstatus == 'queued') {
+            } else if (ep.searchstatus == 'queued') {
                 //el=$('td#' + ep.season + 'x' + ep.episode + '.search img');
                 img.prop('title','Queued');
                 img.prop('alt','queued');
-                img.prop('src',sbRoot+'/images/' + queuedImage );
+                img.prop('src',srRoot+'/images/' + queuedImage );
                 disableLink(el);
                 HtmlContent = ep.searchstatus;
-            }
-            else if (ep.searchstatus == 'finished') {
+            } else if (ep.searchstatus == 'finished') {
                 //el=$('td#' + ep.season + 'x' + ep.episode + '.search img');
                 img.prop('title','Searching');
                 img.prop('alt','searching');
                 img.parent().prop('class','epRetry');
-                img.prop('src',sbRoot+'/images/' + searchImage);
+                img.prop('src',srRoot+'/images/' + searchImage);
                 enableLink(el);
 
                 // Update Status and Quality
-                var rSearchTerm = /(\w+)\s\((.+?)\)/;
+                rSearchTerm = /(\w+)\s\((.+?)\)/;
                 HtmlContent = ep.status.replace(rSearchTerm,"$1"+' <span class="quality '+ep.quality+'">'+"$2"+'</span>');
                 parent.closest('tr').prop("class", ep.overview + " season-" + ep.season + " seasonstyle");
-
             }
             // update the status column if it exists
             parent.siblings('.col-status').html(HtmlContent);
@@ -89,16 +87,16 @@ function updateImages(data) {
             if (ep.searchstatus == 'searching') {
                 img_comEps.prop('title','Searching');
                 img_comEps.prop('alt','Searching');
-                img_comEps.prop('src',sbRoot+'/images/' + loadingImage);
+                img_comEps.prop('src',srRoot+'/images/' + loadingImage);
                 disableLink(el_comEps);
             } else if (ep.searchstatus == 'queued') {
                 img_comEps.prop('title','Queued');
                 img_comEps.prop('alt','queued');
-                img_comEps.prop('src',sbRoot+'/images/' + queuedImage );
+                img_comEps.prop('src',srRoot+'/images/' + queuedImage );
             } else if (ep.searchstatus == 'finished') {
                 img_comEps.prop('title','Manual Search');
                 img_comEps.prop('alt','[search]');
-                img_comEps.prop('src',sbRoot+'/images/' + searchImage);
+                img_comEps.prop('src',srRoot+'/images/' + searchImage);
                 if (ep.overview == 'snatched') {
                     el_comEps.closest('tr').remove();
                 } else {
@@ -167,22 +165,12 @@ function disableLink(el) {
         });
 
         $('#manualSearchModalFailed .btn').click(function(){
-            val=$(this).text();
-            if(val=='Yes'){
-                failedDownload = true;
-            } else {
-                failedDownload = false;
-            }
+            failedDownload = ($(this).text() == 'Yes');
             $("#manualSearchModalQuality").modal('show');
         });
 
         $('#manualSearchModalQuality .btn').click(function(){
-            val=$(this).text();
-            if(val=='Yes'){
-                qualityDownload = true;
-            } else {
-                qualityDownload = false;
-            }
+            qualityDownload = ($(this).text() == 'Yes');
             manualSearch();
         });
 
@@ -196,7 +184,7 @@ function disableLink(el) {
             img=selectedEpisode.children('img');
             img.prop('title','loading');
             img.prop('alt','');
-            img.prop('src',sbRoot+'/images/' + options.loadingImage);
+            img.prop('src',srRoot+'/images/' + options.loadingImage);
 
             var url = selectedEpisode.prop('href');
 
@@ -204,11 +192,7 @@ function disableLink(el) {
                 url = url.replace("retryEpisode", "searchEpisode");
             }
 
-            if (qualityDownload === true) {
-                url = url + "&downCurQuality=1";
-            } else {
-                url = url + "&downCurQuality=0";
-            }
+            url = url + "&downCurQuality=" + (qualityDownload ? '1' : '0');
 
             $.getJSON(url, function(data){
 
@@ -237,9 +221,8 @@ function disableLink(el) {
                 img.prop('title',img_result);
                 img.prop('alt',img_result);
                 img.prop('height', options.size);
-                img.prop('src',sbRoot+"/images/"+img_name);
+                img.prop('src',srRoot+"/images/"+img_name);
             });
-            //
 
             // don't follow the link
             return false;
diff --git a/gui/slick/js/ajaxEpSubtitles.js b/gui/slick/js/ajaxEpSubtitles.js
index 261bf1a778b3c8bc345931b3c0060788d6445223..241ed7f698360dfc8012c966205cb8eeda0deae8 100644
--- a/gui/slick/js/ajaxEpSubtitles.js
+++ b/gui/slick/js/ajaxEpSubtitles.js
@@ -5,7 +5,7 @@
             var subtitles_search_link = $(this);
             // fill with the ajax loading gif
             subtitles_search_link.empty();
-            subtitles_search_link.append($("<img/>").attr({"src": sbRoot+"/images/loading16.gif", "alt": "", "title": "loading"}));
+            subtitles_search_link.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"}));
             $.getJSON($(this).attr('href'), function(data){
                 if (data.result != "failure" && data.result != "No subtitles downloaded") {
                 // clear and update the subtitles column with new informations
@@ -14,9 +14,9 @@
                 $.each(subtitles,function(index, language){
                     if (language !== "" && language != "und") {
                         if (index != subtitles.length - 1) {
-                            subtitles_td.append($("<img/>").attr({"src": sbRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11}));
+                            subtitles_td.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11}));
                         } else {
-                            subtitles_td.append($("<img/>").attr({"src": sbRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11}));
+                            subtitles_td.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11}));
                         }
                     }
                 });
@@ -37,7 +37,7 @@
             var subtitles_merge_link = $(this);
             // fill with the ajax loading gif
             subtitles_merge_link.empty();
-            subtitles_merge_link.append($("<img/>").attr({"src": sbRoot+"/images/loading16.gif", "alt": "", "title": "loading"}));
+            subtitles_merge_link.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"}));
             $.getJSON($(this).attr('href'), function(data){
                 // don't allow other merges
                 subtitles_merge_link.remove();
diff --git a/gui/slick/js/ajaxNotifications.js b/gui/slick/js/ajaxNotifications.js
index f1b38d7cdfab4198322c67ad140574a0332e5ab2..80e2a359cbbc4ca11e7ca8d9973be386ec5f6099 100644
--- a/gui/slick/js/ajaxNotifications.js
+++ b/gui/slick/js/ajaxNotifications.js
@@ -1,5 +1,5 @@
-var message_url = sbRoot + '/ui/get_messages',
-	test = !1;
+var message_url = srRoot + '/ui/get_messages',
+    test = !1;
 
 PNotify.prototype.options.addclass = 'stack-bottomright';
 PNotify.prototype.options.buttons.closer_hover = !1;
@@ -14,29 +14,30 @@ PNotify.prototype.options.width = '340px';
 PNotify.desktop.permission();
 
 function displayPNotify(type, title, message) {
-	var notification = new PNotify({
-		type: type, title: title,
-		text: message.replace(/<br[\s\/]*(?:\s[^>]*)?>/ig, "\n")
-			.replace(/<[\/]?b(?:\s[^>]*)?>/ig, '*')
-			.replace(/<i(?:\s[^>]*)?>/ig, '[').replace(/<[\/]i>/ig, ']')
-			.replace(/<(?:[\/]?ul|\/li)(?:\s[^>]*)?>/ig, '').replace(/<li(?:\s[^>]*)?>/ig, "\n" + '* ')
-	});
+    var notification = new PNotify({
+        type: type, title: title,
+        text: message.replace(/<br[\s\/]*(?:\s[^>]*)?>/ig, "\n")
+            .replace(/<[\/]?b(?:\s[^>]*)?>/ig, '*')
+            .replace(/<i(?:\s[^>]*)?>/ig, '[').replace(/<[\/]i>/ig, ']')
+            .replace(/<(?:[\/]?ul|\/li)(?:\s[^>]*)?>/ig, '').replace(/<li(?:\s[^>]*)?>/ig, "\n" + '* ')
+    });
 }
 
 function check_notifications() {
-	if ('visible' == document.visibilityState) {
-		$.getJSON(message_url, function (data) {
-			$.each(data, function (name, data) {
-				displayPNotify(data.type, data.title, data.message)
-			});
-		});
-	}
-	setTimeout(check_notifications, 3000)
+    if ('visible' == document.visibilityState) {
+        $.getJSON(message_url, function (data) {
+            $.each(data, function (name, data) {
+                displayPNotify(data.type, data.title, data.message);
+            });
+        });
+    }
+    setTimeout(function () {
+        "use strict";
+        check_notifications();
+    }, 3000);
 }
 
 $(document).ready(function(){
-	check_notifications();
-	if (test) {
-		displayPNotify('notice', 'test', 'test<br/><i class="test-class">hello <b>world</b></i><ul><li>item 1</li><li>item 2</li></ul>');
-	}
-});
\ No newline at end of file
+    check_notifications();
+    if(test) displayPNotify('notice', 'test', 'test<br/><i class="test-class">hello <b>world</b></i><ul><li>item 1</li><li>item 2</li></ul>');
+});
diff --git a/gui/slick/js/apibuilder.js b/gui/slick/js/apibuilder.js
index 65a53e704f2e55e04e0ded72c044a61930ef4436..c5f456ffb23902a2abd85aeb54733da7550277ce 100644
--- a/gui/slick/js/apibuilder.js
+++ b/gui/slick/js/apibuilder.js
@@ -1,641 +1,108 @@
-// Chained Selects
-
-// Copyright Xin Yang 2004
-// Web Site: www.yxScripts.com
-// EMail: m_yangxin@hotmail.com
-// Last Updated: Jan. 31, 2009
-
-// This script is free as long as the copyright notice remains intact.
-
-var _disable_empty_list=false;
-var _hide_empty_list=false;
-var _image_commands=['?cmd=show.getbanner', '?cmd=show.getfanart', '?cmd=show.getnetworklogo', '?cmd=show.getposter'];
-
-function goListGroup(apikey, L7, L6, L5, L4, L3, L2, L1){
-    var html, GlobalOptions = "";
-    $('.global').each(function(){
-        var checked = $(this).prop('checked');
-        if(checked) {
-            var globalID = $(this).attr('id');
-            // handle jsonp/callback global option differently
-            if(globalID == "jsonp") {
-                GlobalOptions = GlobalOptions + "&" + globalID + "=foo";
-            } else {
-                GlobalOptions = GlobalOptions + "&" + globalID + "=1";
+$(document).ready(function() {
+    // Perform an API call
+    $('[data-action=api-call]').on('click', function() {
+        var parameters = $('[data-command=' + $(this).data('command-name') + ']');
+        var profile = $('#option-profile').is(':checked');
+        var targetId = $(this).data('target');
+        var timeId = $(this).data('time');
+        var url = $('#' + $(this).data('base-url')).text();
+        var urlId = $(this).data('url');
+
+        $.each(parameters, function (index, item) {
+            var name = $(item).attr('name');
+            var value = $(item).val();
+
+            if(name !== undefined && value !== undefined && name != value && value) {
+                if($.isArray(value)) {
+                    value = value.join('|');
+                }
+
+                url += '&' + name + '=' + value;
             }
-        }
-    });
-
-    // Some commands return an image instead of JSON
-    if ($.inArray(L1, _image_commands) > -1) {
-        var imgcache = sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions;
-        html = imgcache + '<br/><br/><img src="' + sbRoot + '/images/loading16.gif" id="imgcache">';
-        $('#apiResponse').html(html);
-        $.ajax({
-          url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions,
-          async: false,
-          cache: false,
-          dataType: "html",
-          success: function (img) {
-            $('#imgcache').attr('src', imgcache);
-          }
         });
-    } else {
-        html = sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions + "<br/><pre>";
-        html += $.ajax({
-          url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions,
-          async: false,
-          dataType: "html"
-        }).responseText;
-
-        html += '</pre>';
-        $('#apiResponse').html(html);
-    }
-}
-
-// ------
-if (typeof(disable_empty_list)=="undefined") { disable_empty_list=_disable_empty_list; }
-if (typeof(hide_empty_list)=="undefined") { hide_empty_list=_hide_empty_list; }
-
-var cs_goodContent=true, cs_M="M", cs_L="L", cs_G="G", cs_EG="EG";
-var cs_names = [];
-var cs_supportDOM=document.createElement;
-var cs_nav=navigator.userAgent.toLowerCase();
-var cs_isIE7=(cs_nav.indexOf("msie 7")!=-1 || cs_nav.indexOf("msie 8")!=-1);
-var cs_isOpera=(cs_nav.indexOf("opera")!=-1);
-var cs_isMac=(cs_nav.indexOf("mac")!=-1);
-
-function cs_findOBJ(obj,n) {
-  for (var i=0; i<obj.length; i++) {
-    if (obj[i].name==n) { return obj[i]; }
-  }
-  return null;
-}
-function cs_findContent(n) { return cs_findOBJ(cs_content,n); }
-function cs_findSubContent(n) { return cs_findOBJ(cs_subContent,n); }
-
-function cs_findM(m,n) {
-  if (m.name==n) { return m; }
-
-  var sm=null;
-  for (var i=0; i<m.items.length; i++) {
-    if (m.items[i].type==cs_M) {
-      sm=cs_findM(m.items[i],n);
-      if (sm !== null) break;
-    }
-  }
-  return sm;
-}
-
-function cs_subContentOBJ(n,list) {
-  this.name=n;
-  this.list=list;
-
-  this.ifm=document.createElement("IFRAME");
-  this.ifm.style.position="absolute"; left="-200px"; top="-200px"; visibility="hidden"; width="100px"; height="100px";
-  document.body.appendChild(this.ifm);
-  this.ifm.src=n;
-}
-
-cs_subContent = [];
-
-function cs_contentOBJ(n,obj){
-  this.name=n;
-  this.menu=obj;
-  this.lists = [];
-  this.cookie="";
-  this.callback=null;
-  this.count=1;
-}
-
-cs_subContent = [];
-
-function cs_topmenuOBJ(tm) {
-  this.name=tm;
-  this.type=cs_M;
-  this.items = [];
-  this.df=",";
-  this.oidx=0;
-
-  this.addM=cs_addM; this.addL=cs_addL; this.addG=cs_addG; this.endG=cs_endG;
-}
-
-function cs_submenuOBJ(dis,link,sub,label,css) {
-    this.name=sub;
-    this.type=cs_M;
-    this.dis=dis;
-    this.link=link;
-    this.label=label;
-    this.css=css;
-    this.df=",";
-    this.oidx=0;
-
-    this.addM=cs_addM; this.addL=cs_addL; this.addG=cs_addG; this.endG=cs_endG;
-
-    if (typeof(cs_names[sub])=="undefined") {
-        this.items = [];
-        cs_names[sub] = this;
-    } else {
-        this.items = cs_names[sub].items;
-    }
-}
-function cs_linkOBJ(dis,link,label,css) {
-  this.type=cs_L;
-  this.dis=dis;
-  this.link=link;
-  this.label=label;
-  this.css=css;
-}
-function cs_groupOBJ(label,css) {
-  this.type=cs_G;
-  this.dis="";
-  this.link="";
-  this.label=label;
-  this.css=css;
-}
-function cs_groupOBJ2() {
-  this.type=cs_EG;
-  this.dis="";
-  this.link="";
-  this.label="";
-}
-
-function cs_addM(dis,link,sub,label,css) {
-  var x=new cs_submenuOBJ(dis,link,sub,label,css);
-  this.items[this.items.length]=x;
-}
-function cs_addL(dis,link,label,css) { this.items[this.items.length]=new cs_linkOBJ(dis,link,label,css); }
-function cs_addG(label,css) { this.items[this.items.length]=new cs_groupOBJ(label,css); }
-function cs_endG() { this.items[this.items.length]=new cs_groupOBJ2(); }
-
-function cs_showMsg(msg) { window.status=msg; }
-function cs_badContent(n) { cs_goodContent=false; cs_showMsg("["+n+"] Not Found."); }
-
-function _setCookie(name, value) {
-  document.cookie=name+"="+value;
-}
-function cs_setCookie(name, value) {
-  setTimeout("_setCookie('"+name+"','"+value+"')",0);
-}
-
-function cs_getCookie(name) {
-  var cookieRE=new RegExp(name+"=([^;]+)");
-  if (document.cookie.search(cookieRE)!=-1) {
-    return RegExp.$1;
-  }
-  else {
-    return "";
-  }
-}
-
-function cs_optionOBJ(type,text,value,label,css) { this.type=type; this.text=text; this.value=value; this.label=label; this.css=css; }
-function cs_getOptions(menu,list) {
-  var opt=[];
-  for (var i=0; i<menu.items.length; i++) {
-    opt[i]=new cs_optionOBJ(menu.items[i].type, menu.items[i].dis, menu.items[i].link, menu.items[i].label, menu.items[i].css);
-  }
-  if (opt.length===0 && menu.name !== '') {
-    cs_getSubList(menu.name,list);
-    //opt[0]=new cs_optionOBJ(cs_L, "loading ...", "", "", "");
-  }
-  return opt;
-}
-function cs_emptyList(list) {
-  if (cs_supportDOM && !cs_isMac && !cs_isIE7) {
-    while (list.lastChild) {
-      list.removeChild(list.lastChild);
-    }
-  }
-  else {
-    for (var i=list.options.length-1; i>=0; i--) {
-      list.options[i]=null;
-    }
-  }
-}
-function cs_refreshList(list,opt,df,key) {
-  var l=list.options.length;
-  var optGroup=null, newOpt=null, optCount=0, optPool=list;
-
-  if (cs_isMac) {
-    var l=list.options.length;
-    var iCount=0;
-
-    for (var i=0; i<opt.length; i++) {
-      if (opt[i].type!=cs_G && opt[i].type!=cs_EG) {
-        iCount=l+optCount;
-
-        list.options[iCount]=new Option(opt[i].text, opt[i].value, df.indexOf(","+optCount+",")!=-1, df.indexOf(","+optCount+",")!=-1);
-        list.options[iCount].oidx=optCount;
-        list.options[iCount].idx=i;
-        list.options[iCount].key=key;
-
-        if (opt[i].label !== '') {
-          list.options[iCount].label=opt[i].label;
-        }
-        if (opt[i].css !== '') {
-          list.options[iCount].className=opt[i].css;
-        }
-
-        optCount++;
-      }
-    }
-
-    return;
-  }
-
-  for (var i=0; i<opt.length; i++) {
-    if (opt[i].type==cs_G) {
-      optGroup=document.createElement("optgroup");
-      optGroup.setAttribute("label", opt[i].label);
-      if (opt[i].css !== '') {
-        optGroup.setAttribute("className", opt[i].css);
-      }
-      list.appendChild(optGroup);
-      optPool=optGroup;
-    }
-    else if (opt[i].type==cs_EG) {
-      optGroup=null;
-      optPool=list;
-    }
-    else {
-      newOpt=new Option(opt[i].text,opt[i].value);
-      if (cs_supportDOM && !cs_isIE7) {
-        optPool.appendChild(newOpt);
-      }
-      else {
-        list.options[l+optCount]=newOpt;
-      }
-
-      newOpt.oidx=optCount;
-      newOpt.idx=i;
-      newOpt.key=key;
-
-      // a workaround for IE, but will screw up with Opera
-      if (!cs_isOpera) {
-        newOpt.text=opt[i].text;
-        newOpt.value=opt[i].value;
-      }
-
-      if (df.indexOf(","+optCount+",")!=-1) {
-        newOpt.selected=true;
-      }
-      if (opt[i].label !== '') {
-        newOpt.label=opt[i].label;
-      }
-      if (opt[i].css !== '') {
-        newOpt.className=opt[i].css;
-      }
-
-      optCount++;
-    }
-  }
-}
-
-function cs_getList(content,key) {
-  var menu=content.menu;
-
-  if (key!="[]") {
-    var paths=key.substring(1,key.length-1).split(",");
-    for (var i=0; i<paths.length; i++) {
-      menu=menu.items[parseInt(paths[i],10)];
-    }
-  }
-
-  return menu;
-}
-function cs_getKey(key,idx) {
-  return "["+(key=="[]"?"":(key.substring(1,key.length-1)+","))+idx+"]";
-}
-function cs_getSelected(mode,name,idx,key,df) {
-  if (mode) {
-    var cookies=cs_getCookie(name+"_"+idx);
-    if (cookies !== '') {
-      var mc=cookies.split("-");
-      for (var i=0; i<mc.length; i++) {
-        if (mc[i].indexOf(key)!=-1) {
-          df=mc[i].substring(key.length);
-          break;
-        }
-      }
-    }
-  }
-  return df;
-}
 
-function cs_updateListGroup(content,idx,mode) {
-  var menu=null, list=content.lists[idx], options=list.options, has_sublist=false;
-  var key="", option=",", cookies="";
+        if(profile) url += '&profile=1';
 
-  //if (list.selectedIndex<0) {
-  //  list.selectedIndex=0;
-  //}
+        var requestTime = new Date().getTime();
+        $.get(url, function (data, textStatus, jqXHR) {
+            var responseTime = new Date().getTime() - requestTime;
+            var jsonp = $('#option-jsonp').is(':checked');
+            var responseType = jqXHR.getResponseHeader('content-type') || '';
+            var target = $(targetId);
 
-  for (var i=0; i<options.length; i++) {
-    if (options[i].selected) {
-      if (key!=options[i].key) {
-        cookies+=key === '' ? '' : ((cookies === '' ? '' : '-')+key+option);
+            $(timeId).text(responseTime + 'ms');
+            $(urlId).text(url + (jsonp ? '&jsonp=foo' : ''));
 
-        key=options[i].key;
-        option=",";
-        menu=cs_getList(content,key);
-      }
-
-      option+=options[i].oidx+",";
-
-      if (idx+1<content.lists.length) {
-        if (menu.items.length > options[i].idx && menu.items[options[i].idx].type==cs_M) {
-          if (!has_sublist) {
-            has_sublist=true;
-            cs_emptyList(content.lists[idx+1]);
-          }
-          var subkey=cs_getKey(key,options[i].idx), df=cs_getSelected(mode,content.cookie,idx+1,subkey,menu.items[options[i].idx].df);
-          cs_refreshList(content.lists[idx+1],cs_getOptions(menu.items[options[i].idx],list),df,subkey);
-        }
-      }
-    }
-  }
-
-  if (key !== '') {
-    cookies+=(cookies === '' ? '' : '-')+key+option;
-  }
-
-  if (content.cookie) {
-    cs_setCookie(content.cookie+"_"+idx,cookies);
-  }
-
-  if (has_sublist && idx+1<content.lists.length) {
-    if (disable_empty_list) {
-      content.lists[idx+1].disabled=false;
-    }
-    if (hide_empty_list) {
-      content.lists[idx+1].style.display="block";
-    }
-    cs_updateListGroup(content,idx+1,mode);
-  }
-  else {
-    for (var s=idx+1; s<content.lists.length; s++) {
-      cs_emptyList(content.lists[s]);
-
-      if (disable_empty_list) {
-        content.lists[s].disabled=true;
-      }
-      if (hide_empty_list) {
-        content.lists[s].style.display="none";
-      }
-
-      if (content.cookie) {
-        cs_setCookie(content.cookie+"_"+s,"");
-      }
-    }
-  }
-}
+            if(responseType.slice(0, 6) == 'image/') {
+                target.html($('<img/>').attr('src', url));
+            } else {
+                var json = JSON.stringify(data, null, 4);
 
-function cs_initListGroup(content,mode) {
-  var key="[]", df=cs_getSelected(mode,content.cookie,0,key,content.menu.df);
+                if(jsonp) {
+                    target.text('foo(' + json + ');');
+                } else {
+                    target.text(json);
+                }
+            }
 
-  cs_emptyList(content.lists[0]);
-  cs_refreshList(content.lists[0],cs_getOptions(content.menu,content.lists[0]),df,key);
-  cs_updateListGroup(content,0,mode);
-}
+            target.parents('.result-wrapper').removeClass('hidden');
+        });
+    });
 
-function cs_updateList() {
-  var content=this.content;
-  for (var i=0; i<content.lists.length; i++) {
-    if (content.lists[i]==this) {
-      cs_updateListGroup(content,i,content.cookie);
+    // Remove the result of an API call
+    $('[data-action=clear-result]').on('click', function() {
+        $($(this).data('target')).html('').parents('.result-wrapper').addClass('hidden');
+    });
 
-      if (content.callback) {
-        var opt="";
-        for (var j=0; j<this.options.length; j++) {
-          if (this.options[j].selected) {
-            if (opt !== '') {
-              opt+=",";
-            }
-            if (this.options[j].value !== '') {
-              opt+=this.options[j].value;
-            }
-            else if (this.options[j].text !== '') {
-              opt+=this.options[j].text;
+    // Update the list of episodes
+    $('[data-action=update-episodes').on('change', function() {
+        var command = $(this).data('command');
+        var select = $('[data-command=' + command + '][name=episode]');
+        var season = $(this).val();
+        var show = $('[data-command=' + command + '][name=indexerid]').val();
+
+        if(select !== undefined) {
+            select.removeClass('hidden');
+            select.find('option:gt(0)').remove();
+
+            for(var episode in episodes[show][season]) {
+                select.append($('<option>', {
+                    value: episodes[show][season][episode],
+                    label: 'Episode ' + episodes[show][season][episode],
+                }));
             }
-            else if (this.options[j].label !== '') {
-              opt+=this.options[j].label;
-            }
-          }
         }
-        content.callback(this,i+1,content.count,opt);
-      }
-
-      if (this.handler) {
-        this.handler();
-      }
-
-      break;
-    }
-  }
-}
-
-function cs_getSubList(n,list) {
-  if (cs_goodContent && cs_supportDOM) {
-    var cs_subList=cs_findSubContent(n);
-    if (cs_subList===null) {
-      cs_subContent[cs_subContent.length]=new cs_subContentOBJ(n,list);
-    }
-  }
-}
-
-function cs_updateSubList(cn,sn) {
-  var cc=cs_findContent(cn), sc=cs_findContent(sn);
-  if (cc!==null && sc!==null) {
-    var cs_sub=cs_findM(cc.menu,sn);
-    if (cs_sub!==null) {
-      cs_sub.df=sc.menu.df;
-      cs_sub.oidx=sc.menu.oidx;
-      cs_sub.items=sc.menu.items;
-    }
-  }
-
-  var cs_subList=cs_findSubContent(sn);
-  if (cs_subList!==null) {
-    cs_subList.list.onchange();
-
-    cs_subList.ifm.src="";
-    document.body.removeChild(cs_subList.ifm);
-    cs_subList.ifm=null;
-  }
-}
-
-// ------
-function addListGroup(n,tm) {
-  if (cs_goodContent) {
-    cs_names[tm]=new cs_topmenuOBJ(tm);
-
-    var c=cs_findContent(n);
-    if (c===null) {
-      cs_content[cs_content.length]=new cs_contentOBJ(n,cs_names[tm]);
-    }
-    else {
-      delete(c.menu); c.menu=cs_names[tm];
-    }
-  }
-}
-
-function addList(n,dis,link,sub,df,label,css) {
-  if (typeof(sub)=="undefined" || sub === '') {
-    addOption(n,dis,link||"",df||"",label||"",css||"");
-  }
-  else if (cs_goodContent) {
-    if (typeof(cs_names[n])!="undefined") {
-      cs_names[n].addM(dis,link||"",sub+"",label||"",css||"");
-      if (typeof(df)!="undefined" && df) {
-        cs_names[n].df+=cs_names[n].oidx+",";
-      }
-      cs_names[n].oidx++;
-    }
-    else {
-      cs_badContent(n);
-    }
-  }
-}
-
-function addOption(n,dis,link,df,label,css) {
-  if (cs_goodContent) {
-    if (typeof(cs_names[n])!="undefined") {
-      cs_names[n].addL(dis,link||"",label||"",css||"");
-      if (typeof(df)!="undefined" && df) {
-        cs_names[n].df+=cs_names[n].oidx+",";
-      }
-      cs_names[n].oidx++;
-    }
-    else {
-      cs_badContent(n);
-    }
-  }
-}
-
-function addOptGroup(n,label,css) {
-  if (cs_goodContent && cs_supportDOM && !cs_isOpera) {
-    if (typeof(cs_names[n])!="undefined") {
-      cs_names[n].addG(label,css||"");
-    }
-    else {
-      cs_badContent(n);
-    }
-  }
-}
-
-function endOptGroup(n) {
-  if (cs_goodContent && cs_supportDOM && !cs_isOpera) {
-    if (typeof(cs_names[n])!="undefined") {
-      cs_names[n].endG();
-    }
-    else {
-      cs_badContent(n);
-    }
-  }
-}
-
-function initListGroup(n) {
-  var _content=cs_findContent(n), count=0;
-  if (_content!==null) {
-    var content=new cs_contentOBJ("cs_"+_content.count+"_"+n,_content.menu);
-    content.count=_content.count++;
-    cs_content[cs_content.length]=content;
-
-    for (var i=1; i<initListGroup.arguments.length; i++) {
-      if (typeof(arguments[i])=="object" && arguments[i].tagName && arguments[i].tagName=="SELECT") {
-        content.lists[count]=arguments[i];
-
-        arguments[i].handler=arguments[i].onchange;
-        arguments[i].onchange=cs_updateList;
-        arguments[i].content=content; arguments[i].idx=count++;
-      }
-      else if (typeof(arguments[i])=="string" && /^[a-zA-Z_]\w*$/.test(arguments[i])) {
-        content.cookie=arguments[i];
-      }
-      else if (typeof(arguments[i])=="function") {
-        content.callback=arguments[i];
-      }
-      else {
-        cs_showMsg("Warning: Unexpected argument in initListGroup() for ["+n+"]");
-      }
-    }
-
-    if (content.lists.length>0) {
-      cs_initListGroup(content,content.cookie);
-    }
-  }
-}
-
-function initListGroups(n) {
-  var listCount=0;
-  for (var i=1; i<initListGroups.arguments.length; i++) {
-    // opera takes select array as function
-    if ((typeof(arguments[i])=="object" || typeof(arguments[i])=="function") && arguments[i].length && typeof(arguments[i][0])!="undefined" && arguments[i][0].tagName && arguments[i][0].tagName=="SELECT") {
-      if (listCount>arguments[i].length || listCount===0) {
-        listCount=arguments[i].length;
-      }
-    }
-  }
-
-  var _content=cs_findContent(n), count=0, content=null;
-  if (_content!==null) {
-    for (var l=0; l<listCount; l++) {
-      count=0;
-      content=new cs_contentOBJ("cs_"+_content.count+"_"+n,_content.menu);
-      content.count=_content.count++;
-      cs_content[cs_content.length]=content;
-
-      for (var i=1; i<initListGroups.arguments.length; i++) {
-        if ((typeof(arguments[i])=="object" || typeof(arguments[i])=="function") && arguments[i].length && typeof(arguments[i][0])!="undefined" && arguments[i][0].tagName && arguments[i][0].tagName=="SELECT") {
-          content.lists[count]=arguments[i][l];
+    });
 
-          arguments[i][l].handler=arguments[i][l].onchange;
-          arguments[i][l].onchange=cs_updateList;
-          arguments[i][l].content=content; arguments[i][l].idx=count++;
-        }
-        else if (typeof(arguments[i])=="string" && /^[a-zA-Z_]\w*$/.test(arguments[i])) {
-          content.cookie=arguments[i]+"_"+l;
-        }
-        else if (typeof(arguments[i])=="function") {
-          content.callback=arguments[i];
-        }
-        else {
-          cs_showMsg("Warning: Unexpected argument in initListGroups() for ["+n+"]");
+    // Update the list of seasons
+    $('[data-action=update-seasons').on('change', function() {
+        var command = $(this).data('command');
+        var select = $('[data-command=' + command + '][name=season]');
+        var show = $(this).val();
+
+        if(select !== undefined) {
+            select.removeClass('hidden');
+            select.find('option:gt(0)').remove();
+
+            for(var season in episodes[show]) {
+                select.append($('<option>', {
+                    value: season,
+                    label: (season === 0) ? 'Specials' : 'Season ' + season,
+                }));
+            }
         }
-      }
-
-      if (content.lists.length>0) {
-        cs_initListGroup(content,content.cookie);
-      }
-    }
-  }
-}
+    });
 
-function resetListGroup(n,count) {
-  var content=cs_findContent("cs_"+(count||1)+"_"+n);
-  if (content!==null && content.lists.length>0) {
-    cs_initListGroup(content,"");
-  }
-}
+    // Enable command search
+    $('#command-search').typeahead({
+        source: commands,
+    });
+    $('#command-search').on('change', function() {
+        var command = $(this).typeahead('getActive');
 
-function selectOptions(n,opts,mode) {
-  var content=cs_findContent(n);
-  if (content!==null) {
-    var optss=opts.split(":"), menu=content.menu, path=true;
-    for (var i=0; i<optss.length; i+=2) {
-      if (menu.type==cs_M && path) {
-        path=false;
-        for (var o=0; o<menu.items.length; o++) {
-          if (mode===0 && menu.items[o].dis==optss[i] || mode==1 && menu.items[o].link==optss[i] || mode==2 && o==optss[i]) {
-            path=true;
-            if (optss[i+1]!="-") {
-              menu.df=","+o+",";
-            }
-            menu=menu.items[o];
-            break;
-          }
+        if(command) {
+            var commandId = command.replace('.', '-');
+            $('[href=#command-' + commandId + ']').click();
         }
-      }
-    }
-  }
-}
+    });
+});
diff --git a/gui/slick/js/blackwhite.js b/gui/slick/js/blackwhite.js
index 49a86fedef94201ca269090fe2c1cd0dfb1bc8f1..e8618899c95ebd24c0d385f35375e579231eb83a 100644
--- a/gui/slick/js/blackwhite.js
+++ b/gui/slick/js/blackwhite.js
@@ -18,7 +18,7 @@ function update_bwlist(show_name) {
 
         $('#blackwhitelist').show();
         if (show_name) {
-            $.getJSON(sbRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) {
+            $.getJSON(srRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) {
             if (data.result == 'success') {
                 $.each(data.groups, function(i, group) {
                     var option = $("<option>");
diff --git a/gui/slick/js/browser.js b/gui/slick/js/browser.js
index 9da6a8bafe019f9dfa2d49b2cd658e9a7518d768..24ca3e4edb90a86ff97dda7349d14223e0ece144 100644
--- a/gui/slick/js/browser.js
+++ b/gui/slick/js/browser.js
@@ -4,8 +4,8 @@
     $.Browser = {
         defaults: {
             title:             'Choose Directory',
-            url:               sbRoot + '/browser/',
-            autocompleteURL:   sbRoot + '/browser/complete',
+            url:               srRoot + '/browser/',
+            autocompleteURL:   srRoot + '/browser/complete',
             includeFiles:      0
         }
     };
diff --git a/gui/slick/js/config.js b/gui/slick/js/config.js
index 62d3579804f9c9f30bf8bba876275737124c34ec..7c852360b89e1f1ea408996f73d007bc5d69b81d 100644
--- a/gui/slick/js/config.js
+++ b/gui/slick/js/config.js
@@ -1,14 +1,14 @@
 $(document).ready(function(){
     $(".enabler").each(function(){
-        if (!$(this).prop('checked'))
-            $('#content_'+$(this).attr('id')).hide();
+        if (!$(this).prop('checked')) $('#content_'+$(this).attr('id')).hide();
     });
 
     $(".enabler").click(function() {
-        if ($(this).prop('checked'))
+        if ($(this).prop('checked')){
             $('#content_'+$(this).attr('id')).fadeIn("fast", "linear");
-        else
+        } else {
             $('#content_'+$(this).attr('id')).fadeOut("fast", "linear");
+        }
     });
 
     $(".viewIf").click(function() {
@@ -22,45 +22,51 @@ $(document).ready(function(){
     });
 
     $(".datePresets").click(function() {
-        var def = $('#date_presets').val()
+        var def = $('#date_presets').val();
         if ($(this).prop('checked') && '%x' == def) {
-            def = '%a, %b %d, %Y'
-            $('#date_use_system_default').html('1')
-        } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html())
-            def = '%x'
+            def = '%a, %b %d, %Y';
+            $('#date_use_system_default').html('1');
+        } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html()){
+            def = '%x';
+        }
 
-        $('#date_presets').attr('name', 'date_preset_old')
-        $('#date_presets').attr('id', 'date_presets_old')
+        $('#date_presets').attr('name', 'date_preset_old');
+        $('#date_presets').attr('id', 'date_presets_old');
 
-        $('#date_presets_na').attr('name', 'date_preset')
-        $('#date_presets_na').attr('id', 'date_presets')
+        $('#date_presets_na').attr('name', 'date_preset');
+        $('#date_presets_na').attr('id', 'date_presets');
 
-        $('#date_presets_old').attr('name', 'date_preset_na')
-        $('#date_presets_old').attr('id', 'date_presets_na')
+        $('#date_presets_old').attr('name', 'date_preset_na');
+        $('#date_presets_old').attr('id', 'date_presets_na');
 
-        if (def)
-            $('#date_presets').val(def)
+        if (def) $('#date_presets').val(def);
     });
 
-    // bind 'myForm' and provide a simple callback function 
+    // bind 'myForm' and provide a simple callback function
     $('#configForm').ajaxForm({
         beforeSubmit: function(){
             $('.config_submitter .config_submitter_refresh').each(function(){
                 $(this).attr("disabled", "disabled");
-                $(this).after('<span><img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>');
+                $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>');
                 $(this).hide();
             });
         },
         success: function(){
-            setTimeout('config_success()', 2000)
+            setTimeout(function () {
+                "use strict";
+                config_success();
+            }, 2000);
         }
     });
 
-    $('#api_key').click(function(){ $('#api_key').select() });
+    $('#api_key').click(function(){
+        $('#api_key').select();
+    });
+
     $("#generate_new_apikey").click(function(){
-        $.get(sbRoot + '/config/general/generateApiKey',
+        $.get(srRoot + '/config/general/generateApiKey',
             function(data){
-                if (data.error != undefined) {
+                if (data.error !== undefined) {
                     alert(data.error);
                     return;
                 }
@@ -69,27 +75,27 @@ $(document).ready(function(){
     });
 
     $('#branchCheckout').click(function() {
-    	var url = sbRoot+'/home/branchCheckout?branch='+$("#branchVersion").val();
-    	var  checkDBversion = sbRoot + "/home/getDBcompare"
-    	$.getJSON(checkDBversion, function(data){
-    		if (data.status == "success") {
-    			if (data.message == "equal") {
-    				//Checkout Branch
-    				window.location.href = url;
-    			}
-    			if (data.message == "upgrade") {
-    				if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) {
-    					//Checkout Branch
-    					window.location.href = url;
-    				}
-    			}
-    			if (data.message == "downgrade") {
-    				alert("Can't switch branch as this will result in a database downgrade.")
-    			}
-    		}
-    	});
+        var url = srRoot+'/home/branchCheckout?branch='+$("#branchVersion").val();
+        var  checkDBversion = srRoot + "/home/getDBcompare";
+        $.getJSON(checkDBversion, function(data){
+            if (data.status == "success") {
+                if (data.message == "equal") {
+                    //Checkout Branch
+                    window.location.href = url;
+                }
+                if (data.message == "upgrade") {
+                    if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) {
+                        //Checkout Branch
+                        window.location.href = url;
+                    }
+                }
+                if (data.message == "downgrade") {
+                    alert("Can't switch branch as this will result in a database downgrade.");
+                }
+            }
+        });
     });
-	
+
 });
 
 function config_success(){
@@ -102,8 +108,8 @@ function config_success(){
         $(this).removeAttr("disabled");
         $(this).next().remove();
         $(this).show();
-        url = sbRoot+'/config/providers/';
-	window.location.href = url;
+        url = srRoot+'/config/providers/';
+        window.location.href = url;
     });
     $('#email_show').trigger('notify');
 }
diff --git a/gui/slick/js/configBackupRestore.js b/gui/slick/js/configBackupRestore.js
index af00757da5f6ae8869883bd64ad2e9353dab0dd2..fc690ba76973405d6f071490c702db11a12bfc6b 100644
--- a/gui/slick/js/configBackupRestore.js
+++ b/gui/slick/js/configBackupRestore.js
@@ -1,11 +1,11 @@
 $(document).ready(function(){
-    var loading = '<img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />';
+    var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />';
 
     $('#Backup').click(function() {
         $("#Backup").attr("disabled", true);
         $('#Backup-result').html(loading);
         var backupDir = $("#backupDir").val();
-        $.get(sbRoot + "/config/backuprestore/backup", {'backupDir': backupDir})
+        $.get(srRoot + "/config/backuprestore/backup", {'backupDir': backupDir})
             .done(function (data) {
                 $('#Backup-result').html(data);
                 $("#Backup").attr("disabled", false);
@@ -15,10 +15,10 @@ $(document).ready(function(){
         $("#Restore").attr("disabled", true);
         $('#Restore-result').html(loading);
         var backupFile = $("#backupFile").val();
-        $.get(sbRoot + "/config/backuprestore/restore", {'backupFile': backupFile})
+        $.get(srRoot + "/config/backuprestore/restore", {'backupFile': backupFile})
             .done(function (data) {
                 $('#Restore-result').html(data);
                 $("#Restore").attr("disabled", false);
             });
     });
-});
\ No newline at end of file
+});
diff --git a/gui/slick/js/configNotifications.js b/gui/slick/js/configNotifications.js
index 4222f207be2df8fbf7d1a5845a0bb2de455a89af..5c69d7d47e8b187334cf3036df63256b0073f203 100644
--- a/gui/slick/js/configNotifications.js
+++ b/gui/slick/js/configNotifications.js
@@ -1,5 +1,5 @@
 $(document).ready(function(){
-    var loading = '<img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />';
+    var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />';
 
     $('#testGrowl').click(function () {
         var growl_host = $.trim($('#growl_host').val());
@@ -12,7 +12,7 @@ $(document).ready(function(){
         $('#growl_host').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testGrowl-result').html(loading);
-        $.get(sbRoot + '/home/testGrowl', {'host': growl_host, 'password': growl_password})
+        $.get(srRoot + '/home/testGrowl', {'host': growl_host, 'password': growl_password})
             .done(function (data) {
                 $('#testGrowl-result').html(data);
                 $('#testGrowl').prop('disabled', false);
@@ -30,11 +30,10 @@ $(document).ready(function(){
         $('#prowl_api').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testProwl-result').html(loading);
-        $.get(sbRoot + '/home/testProwl', {'prowl_api': prowl_api, 'prowl_priority': prowl_priority})
-            .done(function (data) {
-                $('#testProwl-result').html(data);
-                $('#testProwl').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testProwl', {'prowl_api': prowl_api, 'prowl_priority': prowl_priority}).done(function (data) {
+            $('#testProwl-result').html(data);
+            $('#testProwl').prop('disabled', false);
+        });
     });
 
     $('#testKODI').click(function () {
@@ -49,11 +48,10 @@ $(document).ready(function(){
         $('#kodi_host').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testKODI-result').html(loading);
-        $.get(sbRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password})
-            .done(function (data) {
-                $('#testKODI-result').html(data);
-                $('#testKODI').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password}).done(function (data) {
+            $('#testKODI-result').html(data);
+            $('#testKODI').prop('disabled', false);
+        });
     });
 
     $('#testPMC').click(function () {
@@ -68,11 +66,10 @@ $(document).ready(function(){
         $('#plex_host').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testPMC-result').html(loading);
-        $.get(sbRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password})
-            .done(function (data) {
-                $('#testPMC-result').html(data);
-                $('#testPMC').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password}).done(function (data) {
+            $('#testPMC-result').html(data);
+            $('#testPMC').prop('disabled', false);
+        });
     });
 
     $('#testPMS').click(function () {
@@ -88,11 +85,10 @@ $(document).ready(function(){
         $('#plex_server_host').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testPMS-result').html(loading);
-        $.get(sbRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token})
-            .done(function (data) {
-                $('#testPMS-result').html(data);
-                $('#testPMS').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token}).done(function (data) {
+            $('#testPMS-result').html(data);
+            $('#testPMS').prop('disabled', false);
+        });
     });
 
     $('#testEMBY').click(function () {
@@ -115,11 +111,10 @@ $(document).ready(function(){
         $('#emby_host,#emby_apikey').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testEMBY-result').html(loading);
-        $.get(sbRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey})
-            .done(function (data) {
-                $('#testEMBY-result').html(data);
-                $('#testEMBY').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey}).done(function (data) {
+            $('#testEMBY-result').html(data);
+            $('#testEMBY').prop('disabled', false);
+        });
     });
 
     $('#testBoxcar').click(function() {
@@ -132,11 +127,10 @@ $(document).ready(function(){
         $('#boxcar_username').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testBoxcar-result').html(loading);
-        $.get(sbRoot + '/home/testBoxcar', {'username': boxcar_username})
-            .done(function (data) {
-                $('#testBoxcar-result').html(data);
-                $('#testBoxcar').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testBoxcar', {'username': boxcar_username}).done(function (data) {
+            $('#testBoxcar-result').html(data);
+            $('#testBoxcar').prop('disabled', false);
+        });
     });
 
     $('#testBoxcar2').click(function () {
@@ -149,11 +143,10 @@ $(document).ready(function(){
         $('#boxcar2_accesstoken').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testBoxcar2-result').html(loading);
-        $.get(sbRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken})
-            .done(function (data) {
-                $('#testBoxcar2-result').html(data);
-                $('#testBoxcar2').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken}).done(function (data) {
+            $('#testBoxcar2-result').html(data);
+            $('#testBoxcar2').prop('disabled', false);
+        });
     });
 
     $('#testPushover').click(function () {
@@ -176,23 +169,26 @@ $(document).ready(function(){
         $('#pushover_userkey,#pushover_apikey').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testPushover-result').html(loading);
-        $.get(sbRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey})
-            .done(function (data) {
-                $('#testPushover-result').html(data);
-                $('#testPushover').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey}).done(function (data) {
+            $('#testPushover-result').html(data);
+            $('#testPushover').prop('disabled', false);
+        });
     });
 
     $('#testLibnotify').click(function() {
         $('#testLibnotify-result').html(loading);
-        $.get(sbRoot + '/home/testLibnotify',
-            function (data) { $('#testLibnotify-result').html(data); });
+        $.get(srRoot + '/home/testLibnotify', function (data) {
+            $('#testLibnotify-result').html(data);
+        });
     });
 
     $('#twitterStep1').click(function() {
         $('#testTwitter-result').html(loading);
-        $.get(sbRoot + '/home/twitterStep1', function (data) {window.open(data); })
-            .done(function () { $('#testTwitter-result').html('<b>Step1:</b> Confirm Authorization'); });
+        $.get(srRoot + '/home/twitterStep1', function (data) {
+            window.open(data);
+        }).done(function() {
+            $('#testTwitter-result').html('<b>Step1:</b> Confirm Authorization');
+        });
     });
 
     $('#twitterStep2').click(function () {
@@ -204,13 +200,15 @@ $(document).ready(function(){
         }
         $('#twitter_key').removeClass('warning');
         $('#testTwitter-result').html(loading);
-        $.get(sbRoot + '/home/twitterStep2', {'key': twitter_key},
-            function (data) { $('#testTwitter-result').html(data); });
+        $.get(srRoot + '/home/twitterStep2', {'key': twitter_key}, function(data) {
+            $('#testTwitter-result').html(data);
+        });
     });
 
     $('#testTwitter').click(function() {
-        $.get(sbRoot + '/home/testTwitter',
-            function (data) { $('#testTwitter-result').html(data); });
+        $.get(srRoot + '/home/testTwitter', function(data) {
+            $('#testTwitter-result').html(data);
+        });
     });
 
     $('#settingsNMJ').click(function() {
@@ -222,28 +220,27 @@ $(document).ready(function(){
         $('#testNMJ-result').html(loading);
         var nmj_host = $('#nmj_host').val();
 
-        $.get(sbRoot + '/home/settingsNMJ', {'host': nmj_host},
-            function (data) {
-                if (data === null) {
-                    $('#nmj_database').removeAttr('readonly');
-                    $('#nmj_mount').removeAttr('readonly');
-                }
-                var JSONData = $.parseJSON(data);
-                $('#testNMJ-result').html(JSONData.message);
-                $('#nmj_database').val(JSONData.database);
-                $('#nmj_mount').val(JSONData.mount);
-
-                if (JSONData.database) {
-                    $('#nmj_database').attr('readonly', true);
-                } else {
-                    $('#nmj_database').removeAttr('readonly');
-                }
-                if (JSONData.mount) {
-                    $('#nmj_mount').attr('readonly', true);
-                } else {
-                    $('#nmj_mount').removeAttr('readonly');
-                }
-            });
+        $.get(srRoot + '/home/settingsNMJ', {'host': nmj_host}, function (data) {
+            if (data === null) {
+                $('#nmj_database').removeAttr('readonly');
+                $('#nmj_mount').removeAttr('readonly');
+            }
+            var JSONData = $.parseJSON(data);
+            $('#testNMJ-result').html(JSONData.message);
+            $('#nmj_database').val(JSONData.database);
+            $('#nmj_mount').val(JSONData.mount);
+
+            if (JSONData.database) {
+                $('#nmj_database').attr('readonly', true);
+            } else {
+                $('#nmj_database').removeAttr('readonly');
+            }
+            if (JSONData.mount) {
+                $('#nmj_mount').attr('readonly', true);
+            } else {
+                $('#nmj_mount').removeAttr('readonly');
+            }
+        });
     });
 
     $('#testNMJ').click(function () {
@@ -258,11 +255,10 @@ $(document).ready(function(){
         $('#nmj_host').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testNMJ-result').html(loading);
-        $.get(sbRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount})
-            .done(function (data) {
-                $('#testNMJ-result').html(data);
-                $('#testNMJ').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount}).done(function (data) {
+            $('#testNMJ-result').html(data);
+            $('#testNMJ').prop('disabled', false);
+        });
     });
 
     $('#settingsNMJv2').click(function() {
@@ -283,8 +279,7 @@ $(document).ready(function(){
         }
 
         var nmjv2_dbinstance=$('#NMJv2db_instance').val();
-        $.get(sbRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance},
-        function (data){
+        $.get(srRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance}, function (data){
             if (data === null) {
                 $('#nmjv2_database').removeAttr('readonly');
             }
@@ -292,10 +287,11 @@ $(document).ready(function(){
             $('#testNMJv2-result').html(JSONData.message);
             $('#nmjv2_database').val(JSONData.database);
 
-            if (JSONData.database)
+            if (JSONData.database){
                 $('#nmjv2_database').attr('readonly', true);
-            else
+            } else {
                 $('#nmjv2_database').removeAttr('readonly');
+            }
         });
     });
 
@@ -309,11 +305,10 @@ $(document).ready(function(){
         $('#nmjv2_host').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testNMJv2-result').html(loading);
-        $.get(sbRoot + '/home/testNMJv2', {'host': nmjv2_host})
-            .done(function (data) {
-                $('#testNMJv2-result').html(data);
-                $('#testNMJv2').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testNMJv2', {'host': nmjv2_host}) .done(function (data) {
+            $('#testNMJv2-result').html(data);
+            $('#testNMJv2').prop('disabled', false);
+        });
     });
 
     $('#testFreeMobile').click(function () {
@@ -336,11 +331,10 @@ $(document).ready(function(){
         $('#freemobile_id,#freemobile_apikey').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testFreeMobile-result').html(loading);
-        $.get(sbRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey})
-            .done(function (data) {
-                $('#testFreeMobile-result').html(data);
-                $('#testFreeMobile').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey}).done(function (data) {
+            $('#testFreeMobile-result').html(data);
+            $('#testFreeMobile').prop('disabled', false);
+        });
     });
 
     $('#TraktGetPin').click(function () {
@@ -350,27 +344,13 @@ $(document).ready(function(){
          $('#trakt_pin').removeClass('hide');
     });
 
-    $('#trakt_pin').change(function() {
-        var trakt_pin = $('#trakt_pin').val();
-
-        if (trakt_pin.length !== 0) {
-            $('#TraktGetPin').addClass('hide');
-            $('#authTrakt').removeClass('hide');
-        }
-        else {
-            $('#TraktGetPin').removeClass('hide');
-            $('#authTrakt').addClass('hide');
-        }
-    });
-
-    $('#trakt_pin').keyup(function () {
+    $('#trakt_pin').on('keyup change', function(){
         var trakt_pin = $('#trakt_pin').val();
 
         if (trakt_pin.length !== 0) {
             $('#TraktGetPin').addClass('hide');
             $('#authTrakt').removeClass('hide');
-        }
-        else {
+        } else {
             $('#TraktGetPin').removeClass('hide');
             $('#authTrakt').addClass('hide');
         }
@@ -379,12 +359,11 @@ $(document).ready(function(){
     $('#authTrakt').click(function() {
         var trakt_pin = $('#trakt_pin').val();
         if (trakt_pin.length !== 0) {
-            $.get(sbRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin })
-                .done(function (data) {
-                    $('#testTrakt-result').html(data);
-                    $('#authTrakt').addClass('hide');
-                    $('#trakt_pin').addClass('hide');
-                    $('#TraktGetPin').addClass('hide');
+            $.get(srRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin }).done(function (data) {
+                $('#testTrakt-result').html(data);
+                $('#authTrakt').addClass('hide');
+                $('#trakt_pin').addClass('hide');
+                $('#TraktGetPin').addClass('hide');
             });
         }
     });
@@ -404,18 +383,17 @@ $(document).ready(function(){
 
         if (/\s/g.test(trakt_trending_blacklist)) {
             $('#testTrakt-result').html('Check blacklist name; the value need to be a trakt slug');
-        $('#trakt_blacklist_name').addClass('warning');
+            $('#trakt_blacklist_name').addClass('warning');
             return;
         }
         $('#trakt_username').removeClass('warning');
-            $('#trakt_blacklist_name').removeClass('warning');
+        $('#trakt_blacklist_name').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testTrakt-result').html(loading);
-        $.get(sbRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist})
-            .done(function (data) {
-                $('#testTrakt-result').html(data);
-                $('#testTrakt').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist}).done(function (data) {
+            $('#testTrakt-result').html(data);
+            $('#testTrakt').prop('disabled', false);
+        });
     });
 
     $('#testEmail').click(function () {
@@ -448,8 +426,9 @@ $(document).ready(function(){
             if (to === null || to.length === 0 || to.match(/.*@.*/) === null) {
                 status.html('<p style="color: red;">You must provide a recipient email address!</p>');
             } else {
-                $.get(sbRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to},
-                    function (msg) { $('#testEmail-result').html(msg); });
+                $.get(srRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to}, function (msg) {
+                    $('#testEmail-result').html(msg);
+                });
             }
         }
     });
@@ -465,11 +444,10 @@ $(document).ready(function(){
         $('#nma_api').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testNMA-result').html(loading);
-        $.get(sbRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority})
-            .done(function (data) {
-                $('#testNMA-result').html(data);
-                $('#testNMA').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority}).done(function (data) {
+            $('#testNMA-result').html(data);
+            $('#testNMA').prop('disabled', false);
+        });
     });
 
     $('#testPushalot').click(function () {
@@ -482,11 +460,10 @@ $(document).ready(function(){
         $('#pushalot_authorizationtoken').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testPushalot-result').html(loading);
-        $.get(sbRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken})
-            .done(function (data) {
-                $('#testPushalot-result').html(data);
-                $('#testPushalot').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken}).done(function (data) {
+            $('#testPushalot-result').html(data);
+            $('#testPushalot').prop('disabled', false);
+        });
     });
 
     $('#testPushbullet').click(function () {
@@ -499,18 +476,15 @@ $(document).ready(function(){
         $('#pushbullet_api').removeClass('warning');
         $(this).prop('disabled', true);
         $('#testPushbullet-result').html(loading);
-        $.get(sbRoot + '/home/testPushbullet', {'api': pushbullet_api})
-            .done(function (data) {
-                $('#testPushbullet-result').html(data);
-                $('#testPushbullet').prop('disabled', false);
-            });
+        $.get(srRoot + '/home/testPushbullet', {'api': pushbullet_api}).done(function (data) {
+            $('#testPushbullet-result').html(data);
+            $('#testPushbullet').prop('disabled', false);
+        });
     });
 
     function get_pushbullet_devices(msg){
 
-        if(msg){
-            $('#testPushbullet-result').html(loading);
-        }
+        if(msg) $('#testPushbullet-result').html(loading);
 
         var pushbullet_api = $("#pushbullet_api").val();
 
@@ -520,30 +494,26 @@ $(document).ready(function(){
             return false;
         }
 
-        $.get(sbRoot + "/home/getPushbulletDevices", {'api': pushbullet_api},
-            function (data) {
-                var devices = jQuery.parseJSON(data).devices;
-                var current_pushbullet_device = $("#pushbullet_device").val();
-                $("#pushbullet_device_list").html('');
-                for (var i = 0; i < devices.length; i++) {
-                    if(devices[i].active === true) {
-                        if(current_pushbullet_device == devices[i].iden) {
-                            $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>');
-                        } else {
-                            $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>');
-                        }
+        $.get(srRoot + "/home/getPushbulletDevices", {'api': pushbullet_api}, function (data) {
+            var devices = jQuery.parseJSON(data).devices;
+            var current_pushbullet_device = $("#pushbullet_device").val();
+            $("#pushbullet_device_list").html('');
+            for (var i = 0; i < devices.length; i++) {
+                if(devices[i].active === true) {
+                    if(current_pushbullet_device == devices[i].iden) {
+                        $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>');
+                    } else {
+                        $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>');
                     }
                 }
-                if (current_pushbullet_device === '') {
-                    $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>');
-                } else {
-                    $("#pushbullet_device_list").prepend('<option value="">All devices</option>');
-                }
-                if(msg) {
-                    $('#testPushbullet-result').html(msg);
-                }
             }
-        );
+            if (current_pushbullet_device === '') {
+                $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>');
+            } else {
+                $("#pushbullet_device_list").prepend('<option value="">All devices</option>');
+            }
+            if(msg) $('#testPushbullet-result').html(msg);
+        });
 
         $("#pushbullet_device_list").change(function(){
             $("#pushbullet_device").val($("#pushbullet_device_list").val());
@@ -558,22 +528,22 @@ $(document).ready(function(){
     // we have to call this function on dom ready to create the devices select
     get_pushbullet_devices();
 
-    $('#email_show').change(function () {
+    $('#email_show').change(function() {
         var key = parseInt($('#email_show').val(), 10);
         $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : '');
     });
 
     // Update the internal data struct anytime settings are saved to the server
-    $('#email_show').bind('notify', function () { load_show_notify_lists(); });
+    $('#email_show').bind('notify', function() {
+        load_show_notify_lists();
+    });
 
     function load_show_notify_lists() {
-        $.get(sbRoot + "/home/loadShowNotifyLists", function (data) {
+        $.get(srRoot + "/home/loadShowNotifyLists", function(data) {
             var list, html, s;
             list = $.parseJSON(data);
             notify_data = list;
-            if (list._size === 0) {
-                return;
-            }
+            if (list._size === 0) return;
             html = '<option value="-1">-- Select --</option>';
             for (s in list) {
                 if (s.charAt(0) !== '_') {
@@ -588,7 +558,7 @@ $(document).ready(function(){
     load_show_notify_lists();
 
     $('#email_show_save').click(function() {
-        $.post(sbRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) {
+        $.post(srRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) {
             // Reload the per show notify lists to reflect changes
             load_show_notify_lists();
         });
@@ -596,11 +566,10 @@ $(document).ready(function(){
 
     // show instructions for plex when enabled
     $('#use_plex').click(function() {
-        if ( $(this).is(':checked') ) {
+        if ($(this).is(':checked')) {
             $('.plexinfo').removeClass('hide');
         } else {
             $('.plexinfo').addClass('hide');
         }
     });
-
 });
diff --git a/gui/slick/js/configPostProcessing.js b/gui/slick/js/configPostProcessing.js
index 0f6b36787004d106f7f86bbb1b16e618edac55f7..ff1bb61ad46f8bebfb6df6d349a7650056aa441d 100644
--- a/gui/slick/js/configPostProcessing.js
+++ b/gui/slick/js/configPostProcessing.js
@@ -1,5 +1,4 @@
 $(document).ready(function () {
-
     // http://stackoverflow.com/questions/2219924/idiomatic-jquery-delayed-event-only-after-a-short-pause-in-typing-e-g-timew
     var typewatch = (function () {
         var timer = 0;
@@ -11,19 +10,16 @@ $(document).ready(function () {
 
     function israr_supported() {
         var pattern = $('#naming_pattern').val();
-        $.get(sbRoot + '/config/postProcessing/isRarSupported',
-            function (data) {
-                if (data == "supported") {
-                } else {
-                    $('#unpack').qtip('option', {
-                        'content.text': 'Unrar Executable not found.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#unpack').qtip('toggle', true);
-                    $('#unpack').css('background-color', '#FFFFDD');
-
-                }
-            });
+        $.get(srRoot + '/config/postProcessing/isRarSupported', function (data) {
+            if (data !== "supported") {
+                $('#unpack').qtip('option', {
+                    'content.text': 'Unrar Executable not found.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#unpack').qtip('toggle', true);
+                $('#unpack').css('background-color', '#FFFFDD');
+            }
+        });
     }
 
     function fill_examples() {
@@ -31,134 +27,124 @@ $(document).ready(function () {
         var multi = $('#naming_multi_ep :selected').val();
         var anime_type = $('input[name="naming_anime"]:checked').val();
 
-        $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3},
-            function (data) {
-                if (data) {
-                    $('#naming_example').text(data + '.ext');
-                    $('#naming_example_div').show();
-                } else {
-                    $('#naming_example_div').hide();
-                }
-            });
-
-        $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3},
-            function (data) {
-                if (data) {
-                    $('#naming_example_multi').text(data + '.ext');
-                    $('#naming_example_multi_div').show();
-                } else {
-                    $('#naming_example_multi_div').hide();
-                }
-            });
-
-        $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type},
-            function (data) {
-                if (data == "invalid") {
-                    $('#naming_pattern').qtip('option', {
-                        'content.text': 'This pattern is invalid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_pattern').qtip('toggle', true);
-                    $('#naming_pattern').css('background-color', '#FFDDDD');
-                } else if (data == "seasonfolders") {
-                    $('#naming_pattern').qtip('option', {
-                        'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_pattern').qtip('toggle', true);
-                    $('#naming_pattern').css('background-color', '#FFFFDD');
-                } else {
-                    $('#naming_pattern').qtip('option', {
-                        'content.text': 'This pattern is valid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-green'
-                    });
-                    $('#naming_pattern').qtip('toggle', false);
-                    $('#naming_pattern').css('background-color', '#FFFFFF');
-                }
-            });
+        $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3}, function (data) {
+            if (data) {
+                $('#naming_example').text(data + '.ext');
+                $('#naming_example_div').show();
+            } else {
+                $('#naming_example_div').hide();
+            }
+        });
+
+        $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3}, function (data) {
+            if (data) {
+                $('#naming_example_multi').text(data + '.ext');
+                $('#naming_example_multi_div').show();
+            } else {
+                $('#naming_example_multi_div').hide();
+            }
+        });
 
+        $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) {
+            if (data == "invalid") {
+                $('#naming_pattern').qtip('option', {
+                    'content.text': 'This pattern is invalid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_pattern').qtip('toggle', true);
+                $('#naming_pattern').css('background-color', '#FFDDDD');
+            } else if (data == "seasonfolders") {
+                $('#naming_pattern').qtip('option', {
+                    'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_pattern').qtip('toggle', true);
+                $('#naming_pattern').css('background-color', '#FFFFDD');
+            } else {
+                $('#naming_pattern').qtip('option', {
+                    'content.text': 'This pattern is valid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-green'
+                });
+                $('#naming_pattern').qtip('toggle', false);
+                $('#naming_pattern').css('background-color', '#FFFFFF');
+            }
+        });
     }
 
     function fill_abd_examples() {
         var pattern = $('#naming_abd_pattern').val();
 
-        $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'},
-            function (data) {
-                if (data) {
-                    $('#naming_abd_example').text(data + '.ext');
-                    $('#naming_abd_example_div').show();
-                } else {
-                    $('#naming_abd_example_div').hide();
-                }
-            });
-
-        $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'},
-            function (data) {
-                if (data == "invalid") {
-                    $('#naming_abd_pattern').qtip('option', {
-                        'content.text': 'This pattern is invalid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_abd_pattern').qtip('toggle', true);
-                    $('#naming_abd_pattern').css('background-color', '#FFDDDD');
-                } else if (data == "seasonfolders") {
-                    $('#naming_abd_pattern').qtip('option', {
-                        'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_abd_pattern').qtip('toggle', true);
-                    $('#naming_abd_pattern').css('background-color', '#FFFFDD');
-                } else {
-                    $('#naming_abd_pattern').qtip('option', {
-                        'content.text': 'This pattern is valid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-green'
-                    });
-                    $('#naming_abd_pattern').qtip('toggle', false);
-                    $('#naming_abd_pattern').css('background-color', '#FFFFFF');
-                }
-            });
+        $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'}, function (data) {
+            if (data) {
+                $('#naming_abd_example').text(data + '.ext');
+                $('#naming_abd_example_div').show();
+            } else {
+                $('#naming_abd_example_div').hide();
+            }
+        });
 
+        $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, function (data) {
+            if (data == "invalid") {
+                $('#naming_abd_pattern').qtip('option', {
+                    'content.text': 'This pattern is invalid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_abd_pattern').qtip('toggle', true);
+                $('#naming_abd_pattern').css('background-color', '#FFDDDD');
+            } else if (data == "seasonfolders") {
+                $('#naming_abd_pattern').qtip('option', {
+                    'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_abd_pattern').qtip('toggle', true);
+                $('#naming_abd_pattern').css('background-color', '#FFFFDD');
+            } else {
+                $('#naming_abd_pattern').qtip('option', {
+                    'content.text': 'This pattern is valid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-green'
+                });
+                $('#naming_abd_pattern').qtip('toggle', false);
+                $('#naming_abd_pattern').css('background-color', '#FFFFFF');
+            }
+        });
     }
 
     function fill_sports_examples() {
         var pattern = $('#naming_sports_pattern').val();
 
-        $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'},
-            function (data) {
-                if (data) {
-                    $('#naming_sports_example').text(data + '.ext');
-                    $('#naming_sports_example_div').show();
-                } else {
-                    $('#naming_sports_example_div').hide();
-                }
-            });
-
-        $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'},
-            function (data) {
-                if (data == "invalid") {
-                    $('#naming_sports_pattern').qtip('option', {
-                        'content.text': 'This pattern is invalid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_sports_pattern').qtip('toggle', true);
-                    $('#naming_sports_pattern').css('background-color', '#FFDDDD');
-                } else if (data == "seasonfolders") {
-                    $('#naming_sports_pattern').qtip('option', {
-                        'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_sports_pattern').qtip('toggle', true);
-                    $('#naming_sports_pattern').css('background-color', '#FFFFDD');
-                } else {
-                    $('#naming_sports_pattern').qtip('option', {
-                        'content.text': 'This pattern is valid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-green'
-                    });
-                    $('#naming_sports_pattern').qtip('toggle', false);
-                    $('#naming_sports_pattern').css('background-color', '#FFFFFF');
-                }
-            });
+        $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'}, function (data) {
+            if (data) {
+                $('#naming_sports_example').text(data + '.ext');
+                $('#naming_sports_example_div').show();
+            } else {
+                $('#naming_sports_example_div').hide();
+            }
+        });
 
+        $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'}, function (data) {
+            if (data == "invalid") {
+                $('#naming_sports_pattern').qtip('option', {
+                    'content.text': 'This pattern is invalid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_sports_pattern').qtip('toggle', true);
+                $('#naming_sports_pattern').css('background-color', '#FFDDDD');
+            } else if (data == "seasonfolders") {
+                $('#naming_sports_pattern').qtip('option', {
+                    'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_sports_pattern').qtip('toggle', true);
+                $('#naming_sports_pattern').css('background-color', '#FFFFDD');
+            } else {
+                $('#naming_sports_pattern').qtip('option', {
+                    'content.text': 'This pattern is valid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-green'
+                });
+                $('#naming_sports_pattern').qtip('toggle', false);
+                $('#naming_sports_pattern').css('background-color', '#FFFFFF');
+            }
+        });
     }
 
     function fill_anime_examples() {
@@ -166,51 +152,48 @@ $(document).ready(function () {
         var multi = $('#naming_anime_multi_ep :selected').val();
         var anime_type = $('input[name="naming_anime"]:checked').val();
 
-        $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type},
-            function (data) {
-                if (data) {
-                    $('#naming_example_anime').text(data + '.ext');
-                    $('#naming_example_anime_div').show();
-                } else {
-                    $('#naming_example_anime_div').hide();
-                }
-            });
-
-        $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type},
-            function (data) {
-                if (data) {
-                    $('#naming_example_multi_anime').text(data + '.ext');
-                    $('#naming_example_multi_anime_div').show();
-                } else {
-                    $('#naming_example_multi_anime_div').hide();
-                }
-            });
-
-        $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type},
-            function (data) {
-                if (data == "invalid") {
-                    $('#naming_pattern').qtip('option', {
-                        'content.text': 'This pattern is invalid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_pattern').qtip('toggle', true);
-                    $('#naming_pattern').css('background-color', '#FFDDDD');
-                } else if (data == "seasonfolders") {
-                    $('#naming_pattern').qtip('option', {
-                        'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-red'
-                    });
-                    $('#naming_pattern').qtip('toggle', true);
-                    $('#naming_pattern').css('background-color', '#FFFFDD');
-                } else {
-                    $('#naming_pattern').qtip('option', {
-                        'content.text': 'This pattern is valid.',
-                        'style.classes': 'qtip-rounded qtip-shadow qtip-green'
-                    });
-                    $('#naming_pattern').qtip('toggle', false);
-                    $('#naming_pattern').css('background-color', '#FFFFFF');
-                }
-            });
+        $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type}, function (data) {
+            if (data) {
+                $('#naming_example_anime').text(data + '.ext');
+                $('#naming_example_anime_div').show();
+            } else {
+                $('#naming_example_anime_div').hide();
+            }
+        });
+
+        $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) {
+            if (data) {
+                $('#naming_example_multi_anime').text(data + '.ext');
+                $('#naming_example_multi_anime_div').show();
+            } else {
+                $('#naming_example_multi_anime_div').hide();
+            }
+        });
+
+        $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) {
+            if (data == "invalid") {
+                $('#naming_pattern').qtip('option', {
+                    'content.text': 'This pattern is invalid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_pattern').qtip('toggle', true);
+                $('#naming_pattern').css('background-color', '#FFDDDD');
+            } else if (data == "seasonfolders") {
+                $('#naming_pattern').qtip('option', {
+                    'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-red'
+                });
+                $('#naming_pattern').qtip('toggle', true);
+                $('#naming_pattern').css('background-color', '#FFFFDD');
+            } else {
+                $('#naming_pattern').qtip('option', {
+                    'content.text': 'This pattern is valid.',
+                    'style.classes': 'qtip-rounded qtip-shadow qtip-green'
+                });
+                $('#naming_pattern').qtip('toggle', false);
+                $('#naming_pattern').css('background-color', '#FFFFFF');
+            }
+        });
     }
 
     function setup_naming() {
@@ -257,7 +240,7 @@ $(document).ready(function () {
         fill_anime_examples();
     }
 
-    $('#unpack').change(function () {
+    $('#unpack').on('change', function(){
         if(this.checked) {
             israr_supported();
         } else {
@@ -265,35 +248,35 @@ $(document).ready(function () {
         }
     });
 
-    $('#name_presets').change(function () {
+    $('#name_presets').on('change', function(){
         setup_naming();
     });
 
-    $('#name_abd_presets').change(function () {
+    $('#name_abd_presets').on('change', function(){
         setup_abd_naming();
     });
 
-    $('#naming_custom_abd').change(function () {
+    $('#naming_custom_abd').on('change', function(){
         setup_abd_naming();
     });
 
-    $('#name_sports_presets').change(function () {
+    $('#name_sports_presets').on('change', function(){
         setup_sports_naming();
     });
 
-    $('#naming_custom_sports').change(function () {
+    $('#naming_custom_sports').on('change', function(){
         setup_sports_naming();
     });
 
-    $('#name_anime_presets').change(function () {
+    $('#name_anime_presets').on('change', function(){
         setup_anime_naming();
     });
 
-    $('#naming_custom_anime').change(function () {
+    $('#naming_custom_anime').on('change', function(){
         setup_anime_naming();
     });
 
-    $('input[name="naming_anime"]').click(function(){
+    $('input[name="naming_anime"]').on('click', function(){
         setup_anime_naming();
     });
 
@@ -334,19 +317,19 @@ $(document).ready(function () {
         }, 500);
     });
 
-    $('#show_naming_key').click(function () {
+    $('#show_naming_key').on('click', function(){
         $('#naming_key').toggle();
     });
-    $('#show_naming_abd_key').click(function () {
+    $('#show_naming_abd_key').on('click', function(){
         $('#naming_abd_key').toggle();
     });
-    $('#show_naming_sports_key').click(function () {
+    $('#show_naming_sports_key').on('click', function(){
         $('#naming_sports_key').toggle();
     });
-    $('#show_naming_anime_key').click(function () {
+    $('#show_naming_anime_key').on('click', function(){
         $('#naming_anime_key').toggle();
     });
-    $('#do_custom').click(function () {
+    $('#do_custom').on('click', function(){
         $('#naming_pattern').val($('#name_presets :selected').attr('id'));
         $('#naming_custom').show();
         $('#naming_pattern').focus();
@@ -356,7 +339,6 @@ $(document).ready(function () {
     setup_sports_naming();
     setup_anime_naming();
 
-
     // -- start of metadata options div toggle code --
     $('#metadataType').on('change keyup', function () {
         $(this).showHideMetadata();
@@ -378,12 +360,11 @@ $(document).ready(function () {
     $(this).showHideMetadata();
     // -- end of metadata options div toggle code --
 
-    $('.metadata_checkbox').click(function () {
+    $('.metadata_checkbox').on('click', function(){
         $(this).refreshMetadataConfig(false);
     });
 
     $.fn.refreshMetadataConfig = function (first) {
-
         var cur_most = 0;
         var cur_most_provider = '';
 
@@ -440,11 +421,10 @@ $(document).ready(function () {
             $('#metadataType option[value=' + cur_most_provider + ']').attr('selected', 'selected');
             $(this).showHideMetadata();
         }
-
     };
 
     $(this).refreshMetadataConfig(true);
-    $('img[title]').qtip( {
+    $('img[title]').qtip({
         position: {
             viewport: $(window),
             at: 'bottom center',
@@ -458,7 +438,7 @@ $(document).ready(function () {
             classes: 'qtip-shadow qtip-dark'
         }
     });
-    $('i[title]').qtip( {
+    $('i[title]').qtip({
         position: {
             viewport: $(window),
             at: 'top center',
@@ -472,7 +452,7 @@ $(document).ready(function () {
             classes: 'qtip-rounded qtip-shadow ui-tooltip-sb'
         }
     });
-    $('.custom-pattern,#unpack').qtip( {
+    $('.custom-pattern,#unpack').qtip({
         content: 'validating...',
         show: {
             event: false,
@@ -492,5 +472,4 @@ $(document).ready(function () {
             classes: 'qtip-rounded qtip-shadow qtip-red'
         }
     });
-
 });
diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js
index f9560b362ef6eb3553da436b5b1e669161446d01..466df5ceb8c2b47b3e72ae5b12235185359cd8bd 100644
--- a/gui/slick/js/configProviders.js
+++ b/gui/slick/js/configProviders.js
@@ -1,5 +1,4 @@
 $(document).ready(function(){
-
     $.fn.showHideProviders = function() {
         $('.providerDiv').each(function(){
             var providerName = $(this).attr('id');
@@ -37,8 +36,8 @@ $(document).ready(function(){
         var params = {url: url, name: name, key: key};
         var returnData;
 
-        $(".updating_categories").wrapInner('<span><img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>');
-        var jqxhr = $.getJSON(sbRoot + '/config/providers/getNewznabCategories', params,
+        $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>');
+        var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params,
                 function(data){
                     $(this).updateNewznabCaps( data, selectedProvider );
                     console.debug(data.tv_categories);
@@ -67,7 +66,7 @@ $(document).ready(function(){
         }
 
         if ($('#provider_order_list > #'+id).length === 0 && showProvider !== false) {
-            var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + sbRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>';
+            var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>';
 
             $('#provider_order_list').append(toAdd);
             $('#provider_order_list').sortable("refresh");
@@ -85,7 +84,7 @@ $(document).ready(function(){
         $(this).populateTorrentRssSection();
 
         if ($('#provider_order_list > #'+id).length === 0) {
-            var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + sbRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>';
+            var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>';
 
             $('#provider_order_list').append(toAdd);
             $('#provider_order_list').sortable("refresh");
@@ -467,14 +466,12 @@ $(document).ready(function(){
         var params = {name: name};
 
         // send to the form with ajax, get a return value
-        $.getJSON(sbRoot + '/config/providers/canAddNewznabProvider', params,
-            function(data){
-                if (data.error !== undefined) {
-                    alert(data.error);
-                    return;
-                }
-
-                $(this).addProvider(data.success, name, url, key, cat, 0);
+        $.getJSON(srRoot + '/config/providers/canAddNewznabProvider', params, function(data){
+            if (data.error !== undefined) {
+                alert(data.error);
+                return;
+            }
+            $(this).addProvider(data.success, name, url, key, cat, 0);
         });
 
     });
@@ -494,7 +491,7 @@ $(document).ready(function(){
         var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG};
 
         // send to the form with ajax, get a return value
-        $.getJSON(sbRoot + '/config/providers/canAddTorrentRssProvider', params,
+        $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params,
             function(data){
                 if (data.error !== undefined) {
                     alert(data.error);
diff --git a/gui/slick/js/configSearch.js b/gui/slick/js/configSearch.js
index 14c839b61748a7646ec99d15a10de8c16aca0640..35dfd6b00c9c1c03e52c0ce85a8aaed4374068bb 100644
--- a/gui/slick/js/configSearch.js
+++ b/gui/slick/js/configSearch.js
@@ -1,15 +1,15 @@
 $(document).ready(function(){
-    var loading = '<img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />';
+    var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />';
 
     function toggle_torrent_title(){
-        if ($('#use_torrents').prop('checked'))
+        if ($('#use_torrents').prop('checked')){
             $('#no_torrents').show();
-        else
+        } else {
             $('#no_torrents').hide();
+        }
     }
 
     $.fn.nzb_method_handler = function() {
-
         var selectedProvider = $('#nzb_method :selected').val(),
             blackhole_settings = '#blackhole_settings',
             sabnzbd_settings = '#sabnzbd_settings',
@@ -188,8 +188,10 @@ $(document).ready(function(){
         var sab_password = $('#sab_password').val();
         var sab_apiKey = $('#sab_apikey').val();
 
-        $.get(sbRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey},
-        function (data){ $('#testSABnzbd_result').html(data); });
+        $.get(srRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey},
+        function(data){
+            $('#testSABnzbd_result').html(data);
+        });
     });
 
 
@@ -208,8 +210,8 @@ $(document).ready(function(){
         var torrent_username = $('#torrent_username').val();
         var torrent_password = $('#torrent_password').val();
 
-        $.get(sbRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password},
-        function (data){ $('#test_torrent_result').html(data); });
+        $.get(srRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password},
+        function(data){ $('#test_torrent_result').html(data); });
     });
 
     $('#torrent_host').change($(this).rtorrent_scgi);
diff --git a/gui/slick/js/configSubtitles.js b/gui/slick/js/configSubtitles.js
index 6a3f2f5f1a7374808800f1fecb60062f6c080502..05974d6dfb467491a8f66bbdbabb7a5e4c1418c2 100644
--- a/gui/slick/js/configSubtitles.js
+++ b/gui/slick/js/configSubtitles.js
@@ -5,11 +5,11 @@ $(document).ready(function(){
             var serviceName = $(this).attr('id');
             var selectedService = $('#editAService :selected').val();
 
-            if (selectedService+'Div' == serviceName)
+            if (selectedService+'Div' == serviceName){
                 $(this).show();
-            else
+            } else {
                 $(this).hide();
-
+            }
         });
     };
 
@@ -19,12 +19,11 @@ $(document).ready(function(){
         var newData = [isDefault, [name, url, key]];
 
         if ($('#service_order_list > #'+id).length === 0 && showService !== false) {
-            var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + sbRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>';
+            var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>';
 
             $('#service_order_list').append(toAdd);
             $('#service_order_list').sortable("refresh");
         }
-
     };
 
     $.fn.deleteService = function (id) {
@@ -32,14 +31,14 @@ $(document).ready(function(){
     };
 
     $.fn.refreshServiceList = function() {
-            var idArr = $("#service_order_list").sortable('toArray');
-            var finalArr = [];
-            $.each(idArr, function(key, val) {
-                    var checked = + $('#enable_'+val).prop('checked') ? '1' : '0';
-                    finalArr.push(val + ':' + checked);
-            });
-
-            $("#service_order").val(finalArr.join(' '));
+        var idArr = $("#service_order_list").sortable('toArray');
+        var finalArr = [];
+        $.each(idArr, function(key, val) {
+                var checked = + $('#enable_'+val).prop('checked') ? '1' : '0';
+                finalArr.push(val + ':' + checked);
+        });
+
+        $("#service_order").val(finalArr.join(' '));
     };
 
     $('#editAService').change(function(){
@@ -63,5 +62,4 @@ $(document).ready(function(){
     });
 
     $("#service_order_list").disableSelection();
-
 });
diff --git a/gui/slick/js/confirmations.js b/gui/slick/js/confirmations.js
index b88dab2f21b12de2a0dc1c40cff4fdbdfec3e48b..2746732902d192ee5bd37f1985addd59ebf5493b 100644
--- a/gui/slick/js/confirmations.js
+++ b/gui/slick/js/confirmations.js
@@ -1,5 +1,5 @@
 $(document).ready(function () {
-    $('a.shutdown').bind('click', function(e) {
+    $('a.shutdown').on('click', function(e) {
         e.preventDefault();
         var target = $(this).attr('href');
         $.confirm({
@@ -20,7 +20,7 @@ $(document).ready(function () {
         });
     });
 
-    $('a.restart').bind('click', function(e) {
+    $('a.restart').on('click', function(e) {
         e.preventDefault();
         var target = $(this).attr('href');
         $.confirm({
@@ -64,7 +64,7 @@ $(document).ready(function () {
         });
     });
 
-    $('a.clearhistory').bind('click', function(e) {
+    $('a.clearhistory').on('click', function(e) {
         e.preventDefault();
         var target = $(this).attr('href');
         $.confirm({
@@ -85,7 +85,7 @@ $(document).ready(function () {
         });
     });
 
-    $('a.trimhistory').bind('click', function(e) {
+    $('a.trimhistory').on('click', function(e) {
         e.preventDefault();
         var target = $(this).attr('href');
         $.confirm({
diff --git a/gui/slick/js/displayShow.js b/gui/slick/js/displayShow.js
index 8f413118b1cf5c9e4d49022e9a763970a2c3bc5d..138abad496103bb89f8775aadf5aa922474c2e53 100644
--- a/gui/slick/js/displayShow.js
+++ b/gui/slick/js/displayShow.js
@@ -1,10 +1,10 @@
 $(document).ready(function () {
 
-    $('#sbRoot').ajaxEpSearch({'colorRow': true});
+    $('#srRoot').ajaxEpSearch({'colorRow': true});
 
-    $('#sbRoot').ajaxEpSubtitlesSearch();
+    $('#srRoot').ajaxEpSubtitlesSearch();
 
-    $('#seasonJump').change(function () {
+    $('#seasonJump').on('change', function(){
         var id = $('#seasonJump option:selected').val();
         if (id && id != 'jump') {
             var season = $('#seasonJump option:selected').data('season');
@@ -15,18 +15,18 @@ $(document).ready(function () {
         $(this).val('jump');
     });
 
-    $("#prevShow").click(function () {
+    $("#prevShow").on('click', function(){
         $('#pickShow option:selected').prev('option').prop('selected', 'selected');
         $("#pickShow").change();
     });
 
-    $("#nextShow").click(function () {
+    $("#nextShow").on('click', function(){
         $('#pickShow option:selected').next('option').prop('selected', 'selected');
         $("#pickShow").change();
     });
 
-    $('#changeStatus').click(function () {
-        var sbRoot = $('#sbRoot').val();
+    $('#changeStatus').on('click', function(){
+        var srRoot = $('#srRoot').val();
         var epArr = [];
 
         $('.epCheck').each(function () {
@@ -35,12 +35,11 @@ $(document).ready(function () {
 
         if (epArr.length === 0) return false;
 
-        url = sbRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val();
+        url = srRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val();
         window.location.href = url;
-
     });
 
-    $('.seasonCheck').click(function () {
+    $('.seasonCheck').on('click', function(){
         var seasCheck = this;
         var seasNo = $(seasCheck).attr('id');
 
@@ -52,7 +51,7 @@ $(document).ready(function () {
     });
 
     var lastCheck = null;
-    $('.epCheck').click(function (event) {
+    $('.epCheck').on('click', function (event) {
 
         if (!lastCheck || !event.shiftKey) {
             lastCheck = this;
@@ -62,7 +61,7 @@ $(document).ready(function () {
         var check = this;
         var found = 0;
 
-        $('.epCheck').each(function () {
+        $('.epCheck').each(function() {
             switch (found) {
                 case 2:
                     return false;
@@ -78,7 +77,7 @@ $(document).ready(function () {
     });
 
     // selects all visible episode checkboxes.
-    $('.seriesCheck').click(function () {
+    $('.seriesCheck').on('click', function () {
         $('.epCheck:visible').each(function () {
             this.checked = true;
         });
@@ -88,7 +87,7 @@ $(document).ready(function () {
     });
 
     // clears all visible episode checkboxes and the season selectors
-    $('.clearAll').click(function () {
+    $('.clearAll').on('click', function () {
         $('.epCheck:visible').each(function () {
             this.checked = false;
         });
@@ -98,11 +97,11 @@ $(document).ready(function () {
     });
 
     // handle the show selection dropbox
-    $('#pickShow').change(function () {
-        var sbRoot = $('#sbRoot').val();
+    $('#pickShow').on('change', function () {
+        var srRoot = $('#srRoot').val();
         var val = $(this).val();
         if (val === 0) return;
-        url = sbRoot + '/home/displayShow?show=' + val;
+        url = srRoot + '/home/displayShow?show=' + val;
         window.location.href = url;
     });
 
@@ -124,8 +123,7 @@ $(document).ready(function () {
         });
     });
 
-    $.fn.showHideRows = function (whichClass) {
-
+    $.fn.showHideRows = function(whichClass) {
         var status = $('#checkboxControls > input, #' + whichClass).prop('checked');
         $("tr." + whichClass).each(function (e) {
             if (status) {
@@ -153,75 +151,68 @@ $(document).ready(function () {
     };
 
     function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {
-        var sbRoot = $('#sbRoot').val();
+        var srRoot = $('#srRoot').val();
         var showId = $('#showID').val();
         var indexer = $('#indexer').val();
 
         if (sceneSeason === '') sceneSeason = null;
         if (sceneEpisode === '') sceneEpisode = null;
 
-        $.getJSON(sbRoot + '/home/setSceneNumbering',
-            {
-                'show': showId,
-                'indexer': indexer,
-                'forSeason': forSeason,
-                'forEpisode': forEpisode,
-                'sceneSeason': sceneSeason,
-                'sceneEpisode': sceneEpisode
-            },
-            function (data) {
-                //	Set the values we get back
-                if (data.sceneSeason === null || data.sceneEpisode === null) {
-                    $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val('');
-                }
-                else {
-                    $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode);
-                }
-                if (!data.success) {
-                    if (data.errorMessage) {
-                        alert(data.errorMessage);
-                    } else {
-                        alert('Update failed.');
-                    }
+        $.getJSON(srRoot + '/home/setSceneNumbering',{
+            'show': showId,
+            'indexer': indexer,
+            'forSeason': forSeason,
+            'forEpisode': forEpisode,
+            'sceneSeason': sceneSeason,
+            'sceneEpisode': sceneEpisode
+        }, function(data) {
+            //	Set the values we get back
+            if (data.sceneSeason === null || data.sceneEpisode === null) {
+                $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val('');
+            } else {
+                $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode);
+            }
+            if (!data.success) {
+                if (data.errorMessage) {
+                    alert(data.errorMessage);
+                } else {
+                    alert('Update failed.');
                 }
             }
-        );
+        });
     }
 
     function setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) {
-        var sbRoot = $('#sbRoot').val();
+        var srRoot = $('#srRoot').val();
         var showId = $('#showID').val();
         var indexer = $('#indexer').val();
 
         if (sceneAbsolute === '') sceneAbsolute = null;
 
-        $.getJSON(sbRoot + '/home/setSceneNumbering',
-            {
-                'show': showId,
-                'indexer': indexer,
-                'forAbsolute': forAbsolute,
-                'sceneAbsolute': sceneAbsolute
-            },
-            function (data) {
-                //	Set the values we get back
-                if (data.sceneAbsolute === null) {
-                    $('#sceneAbsolute_' + showId + '_' + forAbsolute).val('');
-                }
-                else {
-                    $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(data.sceneAbsolute);
-                }
-                if (!data.success) {
-                    if (data.errorMessage) {
-                        alert(data.errorMessage);
-                    } else {
-                        alert('Update failed.');
-                    }
+        $.getJSON(srRoot + '/home/setSceneNumbering', {
+            'show': showId,
+            'indexer': indexer,
+            'forAbsolute': forAbsolute,
+            'sceneAbsolute': sceneAbsolute
+        },
+        function(data) {
+            //	Set the values we get back
+            if (data.sceneAbsolute === null) {
+                $('#sceneAbsolute_' + showId + '_' + forAbsolute).val('');
+            } else {
+                $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(data.sceneAbsolute);
+            }
+            if (!data.success) {
+                if (data.errorMessage) {
+                    alert(data.errorMessage);
+                } else {
+                    alert('Update failed.');
                 }
             }
-        );
+        });
     }
 
-    $('.sceneSeasonXEpisode').change(function () {
+    $('.sceneSeasonXEpisode').on('change', function() {
         //	Strip non-numeric characters
         $(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
         var forSeason = $(this).attr('data-for-season');
@@ -239,7 +230,7 @@ $(document).ready(function () {
         setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);
     });
 
-    $('.sceneAbsolute').change(function () {
+    $('.sceneAbsolute').on('change', function() {
         //	Strip non-numeric characters
         $(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
         var forAbsolute = $(this).attr('data-for-absolute');
diff --git a/gui/slick/js/failedDownloads.js b/gui/slick/js/failedDownloads.js
index 7d7fe27349804729fb14055dc8133a9eab859f6f..62b2fea48d175a327bd3ce63adca11ccb7406195 100644
--- a/gui/slick/js/failedDownloads.js
+++ b/gui/slick/js/failedDownloads.js
@@ -1,5 +1,5 @@
 $(document).ready(function(){
-    $('#submitMassRemove').click(function(){
+    $('#submitMassRemove').on('click', function(){
         var removeArr = [];
 
         $('.removeCheck').each(function() {
@@ -10,11 +10,11 @@ $(document).ready(function(){
 
         if (removeArr.length === 0) return false;
 
-        url = sbRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|');
+        url = srRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|');
         window.location.href = url;
     });
 
-    $('.bulkCheck').click(function(){
+    $('.bulkCheck').on('click', function(){
         var bulkCheck = this;
         var whichBulkCheck = $(bulkCheck).attr('id');
 
diff --git a/gui/slick/js/fuzzyMoment.js b/gui/slick/js/fuzzyMoment.js
deleted file mode 100644
index 60c83bb825bcc7c9e2eaffa2ed399d6d995d6b81..0000000000000000000000000000000000000000
--- a/gui/slick/js/fuzzyMoment.js
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * Fuzzy Moment - convert an absolute date text into a fuzzy moment
- *
- * containerClass string The class name of dom element to convert (default: 'fuzzydate')
- * dateHasTime boolean Whether containerClass contains a time (default: false)
- * dateFormat string The python token date formatting
- * timeFormat string The python token time formatting
- * trimZero Whether to trim leading "0"s (default : false)
- * dtGlue string To insert between the output of date and time (default: '<br />')
- * dtInline Bool Whether to output date inline or use more than one line
- */
- function fuzzyMoment(fmConfig) {
-
-    var containerClass = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.containerClass)) ? '.fuzzydate' : fmConfig.containerClass),
-        dateWithTime = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dateHasTime)) ? false : !!fmConfig.dateHasTime),
-        dateFormat = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dateFormat)) ? '' : fmConfig.dateFormat),
-        timeFormat = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.timeFormat)) ? '' : fmConfig.timeFormat),
-        trimZero = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.trimZero)) ? false : !!fmConfig.trimZero),
-        dtGlue = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dtGlue)) ? '<br />' : fmConfig.dtGlue),
-        dtInline = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dtInline)) ? false : fmConfig.dtInline),
-
-        jd = (function (str) {
-            var token_map = ['a', 'ddd', 'A', 'dddd', 'b', 'MMM', 'B', 'MMMM', 'd', 'DD', 'm', 'MM', 'y', 'YY', 'Y', 'YYYY', 'x', 'L',
-                             'H', 'HH', 'I', 'hh', 'M', 'mm', 'S', 'ss', 'p', 'A'],
-                result = '';
-
-            for (var i = 0; i < str.length; i++)
-                if (/[aAbBdmyYxHIMSp]/.test(str[i])) {
-                    for (var t = 0; t < token_map.length; t = t + 2)
-                        if (str[i] == token_map[t]) {
-                            result += token_map[t + 1];
-                            break;
-                        }
-                } else if ('%' != str[i])
-                    result += str[i];
-
-            return result;
-        }),
-        dateToken = jd(dateFormat),
-        timeToken = jd(timeFormat),
-
-        addQTip = (function() {
-            $(this).css('cursor', 'help');
-            $(this).qtip({
-                show: {
-                    solo: true
-                },
-                position: {
-                    viewport: $(window),
-                    my: 'left center',
-                    adjust: {
-                        y: -10,
-                        x: 2
-                    }
-                },
-                style: {
-                    tip: {
-                        corner: true,
-                        method: 'polygon'
-                    },
-                    classes: 'qtip-rounded qtip-dark qtip-shadow ui-tooltip-sb'
-                }
-            });
-        });
-
-    if (trimZero) {
-        timeToken = timeToken.replace(/hh/g, 'h');
-        timeToken = timeToken.replace(/HH/g, 'H');
-        dateToken = dateToken.replace(/\bDD\b/g, 'D');
-    }
-
-    $(containerClass).each(function() {
-        var input = $(this).text(),
-            dateA = '[<span class="fd">',
-            dtSeparator = ' ',
-            timeA = '</span>]', timeB = '[' + timeA;
-
-        if (dateWithTime) {
-            var timeMeta = input.match(/^.{6,}?([,\s]+)(\d{1,2}).(?:\d{2,2})(?:.(\d{2,2}))?(?:\s([ap]m))?$/im);
-            if (null != timeMeta) {
-                dtSeparator = (! /undefined/i.test(typeof(timeMeta[1])) ? timeMeta[1] : dtSeparator);
-                // adjust timeToken to num digits of input hours
-                timeToken = (! /undefined/i.test(typeof(timeMeta[2])) && 1 == timeMeta[2].length ? timeToken.replace(/hh/ig, 'h') : timeToken);
-                // adjust timeToken to use seconds if input has them
-                timeToken = (! /undefined/i.test(typeof(timeMeta[3])) && 2 == timeMeta[3].length ? timeToken : timeToken.replace(/.ss/, ''));
-                // adjust timeToken to am/pm or AM/PM if input has it
-                timeToken = (! /undefined/i.test(typeof(timeMeta[4])) && 2 == timeMeta[4].length ? timeToken.replace(/A$/, (/[ap]m/.test(timeMeta[4]) ? 'a' : 'A')) : timeToken);
-            }
-            timeA = '</span>' + dtGlue + '<span class="ft">]' + timeToken + '[' + timeA;
-            timeB = '[</span>' + dtGlue + '<span class="ft">]' + timeToken + timeB;
-        }
-
-        var inputTokens = dateToken + dtSeparator + (dateWithTime ?  timeToken : 'HH:mm:ss');
-
-        if (! moment(input + (dateWithTime ? '' : dtSeparator + '00:00:00'), inputTokens).isValid())
-            return;
-
-        moment.lang('en', {
-            calendar: {
-                lastDay:dateA + 'Yesterday' + timeA, sameDay:dateA + 'Today' + timeA, nextDay:dateA + 'Tomorrow' + timeA,
-                lastWeek:dateA + 'Last] ddd' + timeB, nextWeek:dateA + 'On] ddd' + timeB,
-                sameElse:dateA + ']ddd, MMM D YYYY[' + timeA
-            },
-            relativeTime: {
-                future:'In %s', past:'%s ago', s:'seconds', m:'A minute', mm:'%d minutes', h:'An hour', hh:'%d hours',
-                d:'A day', dd:'%d days', M:'A month', MM:'%d months', y:'A year', yy:'%d years'
-            }
-        });
-
-        var airdatetime = moment(input + (dateWithTime ? '' : dtSeparator + '00:00:00'), inputTokens),
-            airdate = airdatetime.clone().hour(0).minute(0).second(0).millisecond(0),
-            today = moment({}),
-            day = Math.abs(airdate.diff(today, 'days')),
-            week = Math.abs(weekdiff = airdate.diff(today, 'week')), isPast = weekdiff < 0,
-            titleThis = false, qTipTime = false,
-            result = (0 == week ? airdatetime.calendar() : '');
-
-        if (/\bOn\b/i.test(result)) {
-           var fuzzer = false, weekday = today.day();
-            if (3 == weekday)
-                fuzzer = (5 <= day);
-            else if (4 == weekday || 5 == weekday)
-                fuzzer = (4 <= day);
-            else
-                fuzzer = (6 == day);
-            if (fuzzer)
-                result = result.replace(/\bOn\b/i, 'Next');
-
-        } else if (! /\b((Yester|To)day\b|Tomo|Last\b)/i.test(result)) {
-            if (14 > day)
-                result = airdate.from(today) + (dateWithTime ? dtGlue + airdatetime.format(timeToken) : '');
-            else if (4 > week) {
-                result = (isPast ? '' : 'In ') + (1 == week ? 'A' : week) + ' week' + (1 == week ? '' : 's') + (isPast ? ' ago' : '');
-                qTipTime = true;
-            } else {
-                result = airdate.from(today);
-                qTipTime = true;
-                var month = airdate.diff(today, 'month');
-                if (1 == parseInt(airdate.year() - today.year()))
-                    result += (dtInline ? ' ' : '<br />') + '(Next Year)';
-            }
-            titleThis = true;
-        }
-        result = day < 7 ? result.replace(/\bLast \b/i, '') : result;
-
-        var n = false; // disable for prod
-        $(this).html(result);
-        if (dateWithTime && /(Yester|To)day/i.test(result))
-            $(this).find('.fd').attr('title',(n?'1) ':'') + moment.duration(airdatetime.diff(moment(),'seconds'),'seconds').humanize(true)).each(addQTip);
-        else if (dateWithTime)
-            $(this).find('.fd').attr('title',(n?'2) ':'') + airdate.from(today)).each(addQTip);
-        else if (! /Today/i.test(result))
-            $(this).find('.fd').attr('title',(n?'3) ':'') + airdate.from(today)).each(addQTip);
-        else
-            titleThis = false;
-
-        if (titleThis)
-            if (dateWithTime && qTipTime)
-                $(this).attr('title',(n?'4) ':'') + airdatetime.format(inputTokens)).each(addQTip);
-            else
-                $(this).attr('title',(n?'5) ':'') + airdate.format(dateToken)).each(addQTip);
-        else
-            if (dateWithTime && qTipTime)
-                $(this).find('.ft').attr('title',(n?'6) ':'') + airdatetime.format(inputTokens)).each(addQTip);
-            else
-                $(this).find('.ft').attr('title',(n?'7) ':'') + airdate.format(dateToken)).each(addQTip);
-    });
-}
diff --git a/gui/slick/js/lib/bootstrap3-typeahead.min.js b/gui/slick/js/lib/bootstrap3-typeahead.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..89959ab83d2f84143b287846dcf0c5c41d39200d
Binary files /dev/null and b/gui/slick/js/lib/bootstrap3-typeahead.min.js differ
diff --git a/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js b/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js
index 4a6b4d10d1fc8e96ab14e2613c3a6313828e6abb..a914012a03db2ea885fff998706878bb4a4735ae 100644
--- a/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js
+++ b/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js
@@ -9,7 +9,7 @@ var scrolltotop={
 	//startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control
 	//scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top).
 	setting: {startline:100, scrollto: 0, scrollduration:1000, fadeduration:[500, 100]},
-	controlHTML: top_image_html,//set in inc_top.tmpl so it can be $sbRooted
+	controlHTML: top_image_html,//set in inc_top.tmpl so it can be $srRooted
 	controlattrs: {offsetx:10, offsety:10}, //offset of control relative to right/ bottom of window corner
 	anchorkeyword: '#top', //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links
 
diff --git a/gui/slick/js/lib/jquery.tokeninput.js b/gui/slick/js/lib/jquery.tokeninput.js
index bf309d79fd17d3638703f596c3cdcceb25189213..5ef1b848253697db47349dbe156fee3a0a2952f5 100644
--- a/gui/slick/js/lib/jquery.tokeninput.js
+++ b/gui/slick/js/lib/jquery.tokeninput.js
@@ -43,8 +43,8 @@ var DEFAULT_SETTINGS = {
     idPrefix: "token-input-",
 
 	// Formatters
-    resultsFormatter: function(item){ return "<li><img src='"+sbRoot+"/images/subtitles/flags/"+item["id"]+".png' /> " + item[this.propertyToSearch]+ "</li>" },
-    tokenFormatter: function(item) { return "<li><img src='"+sbRoot+"/images/subtitles/flags/"+item["id"]+".png' /> <p>" + item[this.propertyToSearch] + "</p></li>" },
+    resultsFormatter: function(item){ return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' /> " + item[this.propertyToSearch]+ "</li>" },
+    tokenFormatter: function(item) { return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' /> <p>" + item[this.propertyToSearch] + "</p></li>" },
     flag: "flag",
 
 	// Callbacks
diff --git a/gui/slick/js/manageEpisodeStatuses.js b/gui/slick/js/manageEpisodeStatuses.js
index 61fad70d6c8dea4d2a2366c3ff62a7a1893d3e35..313087e304d70118e8fce0284910cea75c99af3d 100644
--- a/gui/slick/js/manageEpisodeStatuses.js
+++ b/gui/slick/js/manageEpisodeStatuses.js
@@ -28,31 +28,27 @@ $(document).ready(function() {
         var action = $(this).attr('value');
 
         if (!clicked)  {
-            $.getJSON(sbRoot+'/manage/showEpisodeStatuses',
-                      {
-                       indexer_id: cur_indexer_id,
-                       whichStatus: $('#oldStatus').val()
-                      },
-                      function (data) {
-                          $.each(data, function(season,eps){
-                              $.each(eps, function(episode, name) {
-                                  //alert(season+'x'+episode+': '+name);
-                                  last_row.after(make_row(cur_indexer_id, season, episode, name, checked));
-                              });
-                          });
-                      });
+            $.getJSON(srRoot+'/manage/showEpisodeStatuses',{
+                indexer_id: cur_indexer_id,
+                whichStatus: $('#oldStatus').val()
+            }, function (data) {
+                $.each(data, function(season,eps){
+                    $.each(eps, function(episode, name) {
+                        //alert(season+'x'+episode+': '+name);
+                        last_row.after(make_row(cur_indexer_id, season, episode, name, checked));
+                    });
+                });
+            });
             $(this).attr('data-clicked',1);
             $(this).prop('value', 'Collapse');
         } else {
             if (action === 'Collapse') {
                 $('table tr').filter('.show-'+cur_indexer_id).hide();
                 $(this).prop('value', 'Expand');
-            }
-            else if (action === 'Expand') {
+            } else if (action === 'Expand') {
                 $('table tr').filter('.show-'+cur_indexer_id).show();
                 $(this).prop('value', 'Collapse');
             }
-
         }
     });
 
diff --git a/gui/slick/js/manageSubtitleMissed.js b/gui/slick/js/manageSubtitleMissed.js
index cc292030c15c51f15848cb8c361e45cc7ad897ca..a05ff4480d55b3c2d199b24ab3670a784b562cba 100644
--- a/gui/slick/js/manageSubtitleMissed.js
+++ b/gui/slick/js/manageSubtitleMissed.js
@@ -32,27 +32,24 @@ $(document).ready(function() {
         var action = $(this).attr('value');
 
         if (!clicked) {
-            $.getJSON(sbRoot + '/manage/showSubtitleMissed',
-                  {
-                   indexer_id: cur_indexer_id,
-                   whichSubs: $('#selectSubLang').val()
-                  },
-                  function (data) {
-                      $.each(data, function(season, eps) {
-                          $.each(eps, function(episode, data) {
-                              //alert(season+'x'+episode+': '+name);
-                              last_row.after(make_row(cur_indexer_id, season, episode, data.name, data.subtitles, checked));
-                          });
-                      });
-                  });
+            $.getJSON(srRoot + '/manage/showSubtitleMissed', {
+                indexer_id: cur_indexer_id,
+                whichSubs: $('#selectSubLang').val()
+            }, function(data) {
+                $.each(data, function(season, eps) {
+                    $.each(eps, function(episode, data) {
+                        //alert(season+'x'+episode+': '+name);
+                        last_row.after(make_row(cur_indexer_id, season, episode, data.name, data.subtitles, checked));
+                    });
+                });
+            });
             $(this).attr('data-clicked', 1);
             $(this).prop('value', 'Collapse');
         } else {
             if (action === 'Collapse') {
                 $('table tr').filter('.show-' + cur_indexer_id).hide();
                 $(this).prop('value', 'Expand');
-            }
-            else if (action === 'Expand') {
+            } else if (action === 'Expand') {
                 $('table tr').filter('.show-' + cur_indexer_id).show();
                 $(this).prop('value', 'Collapse');
             }
diff --git a/gui/slick/js/massEdit.js b/gui/slick/js/massEdit.js
index 523149c642a90bb3f7d3a76155533c8ca040e268..116792887eaf4d95a1bce6655e8b532a143e0108 100644
--- a/gui/slick/js/massEdit.js
+++ b/gui/slick/js/massEdit.js
@@ -1,5 +1,4 @@
 $(document).ready(function(){
-
     function find_dir_index(which){
         var dir_parts = which.split('_');
         return dir_parts[dir_parts.length-1];
@@ -19,14 +18,11 @@ $(document).ready(function(){
         var cur_id = find_dir_index($(this).attr('id'));
         var initial_dir = $("#new_root_dir_"+cur_id).val();
         $(this).nFileBrowser(edit_root_dir, {initialDir: initial_dir, which_id: cur_id});
-        
     });
-	
-	$('.delete_root_dir').click(function(){
-		var cur_id = find_dir_index($(this).attr('id'));
-
-		$('#new_root_dir_'+cur_id).val(null);
-		$('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>');
-	});
 
+    $('.delete_root_dir').click(function(){
+        var cur_id = find_dir_index($(this).attr('id'));
+        $('#new_root_dir_'+cur_id).val(null);
+        $('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>');
+    });
 });
diff --git a/gui/slick/js/massUpdate.js b/gui/slick/js/massUpdate.js
index 1a149f6e078f60cc0f0e781269d01ca952bd98a1..7ec531d6213ae7a7339e0ce322867c83c068ec35 100644
--- a/gui/slick/js/massUpdate.js
+++ b/gui/slick/js/massUpdate.js
@@ -1,18 +1,18 @@
 $(document).ready(function(){
-    $('#submitMassEdit').click(function(){
+    $('#submitMassEdit').on('click', function(){
         var editArr = [];
 
         $('.editCheck').each(function() {
-            if (this.checked === true) editArr.push($(this).attr('id').split('-')[1]);
+            if(this.checked === true) editArr.push($(this).attr('id').split('-')[1]);
         });
 
-        if (editArr.length === 0) return;
+        if(editArr.length === 0) return;
 
         url = 'massEdit?toEdit='+editArr.join('|');
         window.location.href = url;
     });
 
-    $('#submitMassUpdate').click(function(){
+    $('#submitMassUpdate').on('click', function(){
 
     var updateArr = [];
     var refreshArr = [];
@@ -23,52 +23,52 @@ $(document).ready(function(){
     var metadataArr = [];
 
     $('.updateCheck').each(function() {
-        if (this.checked === true) updateArr.push($(this).attr('id').split('-')[1]);
+        if(this.checked === true) updateArr.push($(this).attr('id').split('-')[1]);
     });
 
     $('.refreshCheck').each(function() {
-        if (this.checked === true) refreshArr.push($(this).attr('id').split('-')[1]);
+        if(this.checked === true) refreshArr.push($(this).attr('id').split('-')[1]);
     });
 
     $('.renameCheck').each(function() {
-        if (this.checked === true) renameArr.push($(this).attr('id').split('-')[1]);
+        if(this.checked === true) renameArr.push($(this).attr('id').split('-')[1]);
     });
 
     $('.subtitleCheck').each(function() {
-        if (this.checked === true) subtitleArr.push($(this).attr('id').split('-')[1]);
+        if(this.checked === true) subtitleArr.push($(this).attr('id').split('-')[1]);
     });
 
     $('.removeCheck').each(function() {
-        if (this.checked === true) removeArr.push($(this).attr('id').split('-')[1]);
+        if(this.checked === true) removeArr.push($(this).attr('id').split('-')[1]);
     });
 
     var deleteCount = 0;
 
     $('.deleteCheck').each(function() {
-        if (this.checked === true) deleteCount++;
+        if(this.checked === true) deleteCount++;
     });
 
-    if (deleteCount >= 1) {
+    if(deleteCount >= 1) {
         bootbox.confirm("You have selected to delete " + deleteCount + " show(s).  Are you sure you wish to cntinue? All files will be removed from your system.", function(result) {
-            if (result) {
+            if(result) {
                 $('.deleteCheck').each(function() {
-                    if (this.checked === true) {
+                    if(this.checked === true) {
                         deleteArr.push($(this).attr('id').split('-')[1]);
                     }
                 });
             }
-            if (updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false;
+            if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false;
             url = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|');
             window.location.href = url;
         });
     } else {
-        if (updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false;
+        if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false;
         url = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|');
         window.location.href = url;
     }
 /*
     $('.metadataCheck').each(function() {
-      if (this.checked == true) {
+      if(this.checked == true) {
         metadataArr.push($(this).attr('id').split('-')[1])
       }
     });
@@ -76,19 +76,19 @@ $(document).ready(function(){
 
   });
 
-    $('.bulkCheck').click(function(){
+    $('.bulkCheck').on('click', function(){
         var bulkCheck = this;
         var whichBulkCheck = $(bulkCheck).attr('id');
 
         $('.'+whichBulkCheck).each(function(){
-            if (!this.disabled) this.checked = !this.checked;
+            if(!this.disabled) this.checked = !this.checked;
         });
     });
 
   ['.editCheck', '.updateCheck', '.refreshCheck', '.renameCheck', '.deleteCheck', '.removeCheck'].forEach(function(name) {
         var lastCheck = null;
 
-        $(name).click(function(event) {
+        $(name).on('click', function(event) {
             if(!lastCheck || !event.shiftKey) {
                 lastCheck = this;
                 return;
@@ -101,9 +101,9 @@ $(document).ready(function(){
                 switch (found) {
                     case 2: return false;
                     case 1:
-                    if (!this.disabled) this.checked = lastCheck.checked;
+                    if(!this.disabled) this.checked = lastCheck.checked;
                 }
-                if (this == check || this == lastCheck) found++;
+                if(this == check || this == lastCheck) found++;
             });
             lastClick = this;
         });
diff --git a/gui/slick/js/new/comingEpisodes.js b/gui/slick/js/new/comingEpisodes.js
index b739fd6f6b06727a6c2db454807931e29b5a4ed9..62ba8e4305099bcd10e10ceb66f02377134e524e 100644
--- a/gui/slick/js/new/comingEpisodes.js
+++ b/gui/slick/js/new/comingEpisodes.js
@@ -1,40 +1,3 @@
-if($('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'list'){
-    $.tablesorter.addParser({
-        id: 'loadingNames',
-        is: function(s) {
-            return false;
-        },
-        format: function(s) {
-            if (0 === s.indexOf('Loading...')){
-                return s.replace('Loading...', '000');
-            } else {
-                return ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'False' ? (s || '') : (s || '').replace(/^(The|A|An)\s/i,''));
-            }
-        },
-        type: 'text'
-    });
-    $.tablesorter.addParser({
-        id: 'quality',
-        is: function(s) {
-            return false;
-        },
-        format: function(s) {
-            return s.replace('hd1080p', 5).replace('hd720p', 4).replace('hd', 3).replace('sd', 2).replace('any', 1).replace('best', 0).replace('custom', 7);
-        },
-        type: 'numeric'
-    });
-    $.tablesorter.addParser({
-        id: 'cDate',
-        is: function(s) {
-            return false;
-        },
-        format: function(s) {
-            return new Date(s).getTime();
-        },
-        type: 'numeric'
-    });
-}
-
 $(document).ready(function(){
     if($('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'list'){
         var sortCodes = {'date': 0, 'show': 1, 'network': 4};
@@ -49,7 +12,7 @@ $(document).ready(function(){
                 5: function(node) { return $(node).find('span').text().toLowerCase(); }
             },
             headers: {
-                0: { sorter: 'cDate' },
+                0: { sorter: 'realISODate' },
                 1: { sorter: 'loadingNames' },
                 2: { sorter: false },
                 3: { sorter: false },
@@ -61,10 +24,10 @@ $(document).ready(function(){
             }
         });
 
-        $('#sbRoot').ajaxEpSearch();
+        $('#srRoot').ajaxEpSearch();
     }
     if($('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'banner' || $('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'poster'){
-        $('#sbRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'});
+        $('#srRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'});
         $('.ep_summary').hide();
         $('.ep_summaryTrigger').click(function() {
             $(this).next('.ep_summary').slideToggle('normal', function() {
diff --git a/gui/slick/js/new/config_postProcessing.js b/gui/slick/js/new/config_postProcessing.js
new file mode 100644
index 0000000000000000000000000000000000000000..b09818bbde162ac33d4ccf2226e67b51f05a3a58
--- /dev/null
+++ b/gui/slick/js/new/config_postProcessing.js
@@ -0,0 +1,2 @@
+$('#config-components').tabs();
+$('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' });
diff --git a/gui/slick/js/new/config_search.js b/gui/slick/js/new/config_search.js
new file mode 100644
index 0000000000000000000000000000000000000000..a2ee476715d1ac3a2c2a6e7ea07be5c3cad6e630
--- /dev/null
+++ b/gui/slick/js/new/config_search.js
@@ -0,0 +1,5 @@
+$('#config-components').tabs();
+$('#nzb_dir').fileBrowser({ title: 'Select .nzb black hole/watch location' });
+$('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' });
+$('#torrent_path').fileBrowser({ title: 'Select .torrent download location' });
+$('#tv_download_dir').fileBrowser({ title: 'Select TV download location' });
diff --git a/gui/slick/js/new/config_subtitles.js b/gui/slick/js/new/config_subtitles.js
new file mode 100644
index 0000000000000000000000000000000000000000..f970bf657070a5fcf85c6c918b205ed1c07fbca4
--- /dev/null
+++ b/gui/slick/js/new/config_subtitles.js
@@ -0,0 +1,10 @@
+$(document).ready(function() {
+    $("#subtitles_languages").tokenInput([$('meta[data-var="subtitles.subtitleLanguageFilter"]').data('content')], {
+        method: "POST",
+        hintText: "Write to search a language and select it",
+        preventDuplicates: true,
+        prePopulate: [$('meta[data-var="prePopulate"]').data('content')]
+    });
+});
+$('#config-components').tabs();
+$('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' });
diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js
new file mode 100644
index 0000000000000000000000000000000000000000..17344f7c692cf79bd3389eec25f05b4f0e090d11
--- /dev/null
+++ b/gui/slick/js/new/displayShow.js
@@ -0,0 +1,35 @@
+$(document).ready(function(){
+    $('.addQTip').each(function () {
+        $(this).css({'cursor':'help', 'text-shadow':'0px 0px 0.5px #666'});
+        $(this).qtip({
+            show: {solo:true},
+            position: {viewport:$(window), my:'left center', adjust:{ y: -10, x: 2 }},
+            style: {tip:{corner:true, method:'polygon'}, classes:'qtip-rounded qtip-shadow ui-tooltip-sb'}
+        });
+    });
+    $.fn.generateStars = function() {
+        return this.each(function(i,e){$(e).html($('<span/>').width($(e).text()*12));});
+    };
+
+    $('.imdbstars').generateStars();
+
+    $("#showTable, #animeTable").tablesorter({
+        widgets: ['saveSort', 'stickyHeaders', 'columnSelector'],
+        widgetOptions : {
+            columnSelector_saveColumns: true,
+            columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>',
+            columnSelector_mediaquery: false,
+            columnSelector_cssChecked : 'checked'
+        },
+    });
+
+    $('#popover').popover({
+        placement: 'bottom',
+        html: true, // required if content has HTML
+        content: '<div id="popover-target"></div>'
+    })
+    // bootstrap popover event triggered when the popover opens
+    .on('shown.bs.popover', function () {
+        $.tablesorter.columnSelector.attachTo( $("#showTable, #animeTable"), '#popover-target');
+    });
+});
diff --git a/gui/slick/js/new/errorlogs.js b/gui/slick/js/new/errorlogs.js
new file mode 100644
index 0000000000000000000000000000000000000000..377fe7ae9063b4aba963505c174721256284b057
--- /dev/null
+++ b/gui/slick/js/new/errorlogs.js
@@ -0,0 +1,4 @@
+setTimeout(function () {
+    "use strict";
+    location.reload(true);
+}, 60000);
diff --git a/gui/slick/js/new/history.js b/gui/slick/js/new/history.js
index d1fda4e62418a0715859b5f54162a9a73765bfc0..6897dc21ac9ae9187f86569e9ff4f65fb9c92ed4 100644
--- a/gui/slick/js/new/history.js
+++ b/gui/slick/js/new/history.js
@@ -1,14 +1,3 @@
-$.tablesorter.addParser({
-    id: 'cDate',
-    is: function(s) {
-        return false;
-    },
-    format: function(s) {
-        return s;
-    },
-    type: 'numeric'
-});
-
 $(document).ready(function(){
     $("#historyTable:has(tbody tr)").tablesorter({
         widgets: ['zebra', 'filter'],
@@ -16,61 +5,36 @@ $(document).ready(function(){
         textExtraction: (function(){
             if($('meta[data-var="layout"]').data('content') == 'detailed'){
                 return {
-                    0: function(node) { return $(node).find("span").text().toLowerCase(); },
+                    0: function(node) { return $(node).find('time').attr('datetime'); },
                     4: function(node) { return $(node).find("span").text().toLowerCase(); }
                 };
             } else {
                 return {
-                    0: function(node) { return $(node).find("span").text().toLowerCase(); },
+                    0: function(node) { return $(node).find('time').attr('datetime'); },
                     1: function(node) { return $(node).find("span").text().toLowerCase(); },
                     2: function(node) { return $(node).attr("provider").toLowerCase(); },
                     5: function(node) { return $(node).attr("quality").toLowerCase(); }
                 };
             }
-        }),
+        }()),
         headers: (function(){
             if($('meta[data-var="layout"]').data('content') == 'detailed'){
                 return {
-                    0: { sorter: 'cDate' },
+                    0: { sorter: 'realISODate' },
                     4: { sorter: 'quality' }
                 };
             } else {
                 return {
-                    0: { sorter: 'cDate' },
+                    0: { sorter: 'realISODate' },
                     4: { sorter: false },
                     5: { sorter: 'quality' }
                 };
             }
-        })
+        }())
     });
 
     $('#history_limit').on('change', function() {
-        var url = sbRoot + '/history/?limit=' + $(this).val();
+        var url = srRoot + '/history/?limit=' + $(this).val();
         window.location.href = url;
     });
-
-    if(['True', 1].indexOf($('meta[data-var="sickbeard.FUZZY_DATING"]').data('content')) >= 0){
-        $.timeago.settings.allowFuture = true;
-        $.timeago.settings.strings = {
-            prefixAgo: null,
-            prefixFromNow: 'In ',
-            suffixAgo: "ago",
-            suffixFromNow: "",
-            seconds: "less than a minute",
-            minute: "about a minute",
-            minutes: "%d minutes",
-            hour: "about an hour",
-            hours: "about %d hours",
-            day: "a day",
-            days: "%d days",
-            month: "about a month",
-            months: "%d months",
-            year: "about a year",
-            years: "%d years",
-            wordSeparator: " ",
-            numbers: []
-        };
-        $("[datetime]").timeago();
-    }
-
 });
diff --git a/gui/slick/js/new/home.js b/gui/slick/js/new/home.js
index 30ece0195542a13156644d703c2615992f33a54a..c2f342c60dc4715122de4435129c16eb926873ba 100644
--- a/gui/slick/js/new/home.js
+++ b/gui/slick/js/new/home.js
@@ -190,30 +190,6 @@ $(document).ready(function(){
         }
     }
 
-    if(['True', 1].indexOf($('meta[data-var="sickbeard.FUZZY_DATING"]').data('content')) >= 0){
-        $.timeago.settings.allowFuture = true;
-        $.timeago.settings.strings = {
-            prefixAgo: null,
-            prefixFromNow: 'In ',
-            suffixAgo: "ago",
-            suffixFromNow: "",
-            seconds: "less than a minute",
-            minute: "about a minute",
-            minutes: "%d minutes",
-            hour: "about an hour",
-            hours: "about %d hours",
-            day: "a day",
-            days: "%d days",
-            month: "about a month",
-            months: "%d months",
-            year: "about a year",
-            years: "%d years",
-            wordSeparator: " ",
-            numbers: []
-        };
-        $("[datetime]").timeago();
-    }
-
     var $container = [$('#container'), $('#container-anime')];
 
     $.each($container, function (j) {
diff --git a/gui/slick/js/new/home_addExistingShow.js b/gui/slick/js/new/home_addExistingShow.js
new file mode 100644
index 0000000000000000000000000000000000000000..744d4877dd8dafc6140a16da7552779e1ca3982f
--- /dev/null
+++ b/gui/slick/js/new/home_addExistingShow.js
@@ -0,0 +1,6 @@
+$(document).ready(function(){
+    $( "#tabs" ).tabs({
+        collapsible: true,
+        selected: ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'True' ? -1 : 0)
+    });
+});
diff --git a/gui/slick/js/new/home_postprocess.js b/gui/slick/js/new/home_postprocess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1449181d942143c4692485c5e009fc37d57a2b28
--- /dev/null
+++ b/gui/slick/js/new/home_postprocess.js
@@ -0,0 +1 @@
+$('#episodeDir').fileBrowser({ title: 'Select Unprocessed Episode Folder', key: 'postprocessPath' });
diff --git a/gui/slick/js/new/home_recommendedShows.js b/gui/slick/js/new/home_recommendedShows.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e292d5854ff0918dc4a1f38c0bec27afa41dc1b
--- /dev/null
+++ b/gui/slick/js/new/home_recommendedShows.js
@@ -0,0 +1,62 @@
+$(document).ready(function(){
+    $( "#tabs" ).tabs({
+        collapsible: true,
+        selected: ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'True' ? -1 : 0)
+    });
+
+    // initialise combos for dirty page refreshes
+    $('#showsort').val('original');
+    $('#showsortdirection').val('asc');
+
+    var $container = [$('#container')];
+    $.each($container, function (j) {
+        this.isotope({
+            itemSelector: '.trakt_show',
+            sortBy: 'original-order',
+            layoutMode: 'fitRows',
+            getSortData: {
+                name: function( itemElem ) {
+                    var name = $( itemElem ).attr('data-name');
+                    return ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'True' ? (name || '') : (name || '').replace(/^(The|A|An)\s/i,''));
+                },
+                rating: '[data-rating] parseInt',
+                votes: '[data-votes] parseInt',
+            }
+        });
+    });
+
+    $('#showsort').on( 'change', function() {
+        var sortCriteria;
+        switch (this.value) {
+            case 'original':
+                sortCriteria = 'original-order';
+                break;
+            case 'rating':
+                /* randomise, else the rating_votes can already
+                 * have sorted leaving this with nothing to do.
+                 */
+                $('#container').isotope({sortBy: 'random'});
+                sortCriteria = 'rating';
+                break;
+            case 'rating_votes':
+                sortCriteria = ['rating', 'votes'];
+                break;
+            case 'votes':
+                sortCriteria = 'votes';
+                break;
+            default:
+                sortCriteria = 'name';
+                break;
+        }
+        $('#container').isotope({sortBy: sortCriteria});
+    });
+
+    $('#showsortdirection').on( 'change', function() {
+        $('#container').isotope({sortAscending: ('asc' == this.value)});
+    });
+});
+
+setTimeout(function () {
+    "use strict";
+    location.reload(true);
+}, 60000);
diff --git a/gui/slick/js/new/manage_backlogOverview.js b/gui/slick/js/new/manage_backlogOverview.js
new file mode 100644
index 0000000000000000000000000000000000000000..d61b28a48d8b8fe2ce6c9996a5c937c6b44a0f3a
--- /dev/null
+++ b/gui/slick/js/new/manage_backlogOverview.js
@@ -0,0 +1,8 @@
+$(document).ready(function(){
+    $('#pickShow').change(function(){
+        var id = $(this).val();
+        if (id) {
+            $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow');
+        }
+    });
+});
diff --git a/gui/slick/js/new/manage_failedDownloads.js b/gui/slick/js/new/manage_failedDownloads.js
new file mode 100644
index 0000000000000000000000000000000000000000..9186bac811cd71d3f6f9d2f8c803093c9198671d
--- /dev/null
+++ b/gui/slick/js/new/manage_failedDownloads.js
@@ -0,0 +1,11 @@
+$(document).ready(function(){
+    $("#failedTable:has(tbody tr)").tablesorter({
+        widgets: ['zebra'],
+        sortList: [[0,0]],
+        headers: { 3: { sorter: false } }
+    });
+    $('#limit').change(function(){
+        url = srRoot + '/manage/failedDownloads/?limit='+$(this).val();
+        window.location.href = url;
+    });
+});
diff --git a/gui/slick/js/new/manage_massEdit.js b/gui/slick/js/new/manage_massEdit.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5406abafaec22c07b604edfe2f726ebcf6525c8
--- /dev/null
+++ b/gui/slick/js/new/manage_massEdit.js
@@ -0,0 +1 @@
+$('#location').fileBrowser({ title: 'Select Show Location' });
diff --git a/gui/slick/js/new/parsers.js b/gui/slick/js/new/parsers.js
new file mode 100644
index 0000000000000000000000000000000000000000..a4d0bba30e2b6a423acfc793e6b483d8ecbbc784
--- /dev/null
+++ b/gui/slick/js/new/parsers.js
@@ -0,0 +1,45 @@
+$.tablesorter.addParser({
+    id: 'loadingNames',
+    is: function(s) {
+        return false;
+    },
+    format: function(s) {
+        if (0 === s.indexOf('Loading...')){
+            return s.replace('Loading...', '000');
+        } else {
+            return ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'False' ? (s || '') : (s || '').replace(/^(The|A|An)\s/i,''));
+        }
+    },
+    type: 'text'
+});
+$.tablesorter.addParser({
+    id: 'quality',
+    is: function(s) {
+        return false;
+    },
+    format: function(s) {
+        return s.replace('hd1080p', 5).replace('hd720p', 4).replace('hd', 3).replace('sd', 2).replace('any', 1).replace('best', 0).replace('custom', 7);
+    },
+    type: 'numeric'
+});
+$.tablesorter.addParser({
+    id: 'realISODate',
+    is: function(s) {
+        return false;
+    },
+    format: function(s) {
+        return new Date(s).getTime();
+    },
+    type: 'numeric'
+});
+
+$.tablesorter.addParser({
+    id: 'cDate',
+    is: function(s) {
+        return false;
+    },
+    format: function(s) {
+        return s;
+    },
+    type: 'numeric'
+});
diff --git a/gui/slick/js/new/status.js b/gui/slick/js/new/status.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c3c461cd66050c43490bd4083a0db5ee59e5a8a
--- /dev/null
+++ b/gui/slick/js/new/status.js
@@ -0,0 +1,9 @@
+$(document).ready(function() {
+    $("#schedulerStatusTable").tablesorter({
+        widgets: ['saveSort', 'zebra']
+    });
+    $("#queueStatusTable").tablesorter({
+        widgets: ['saveSort', 'zebra'],
+        sortList: [[3,0], [4,0], [2,1]]
+    });
+});
diff --git a/gui/slick/js/new/viewlogs.js b/gui/slick/js/new/viewlogs.js
index 0f94159940bd158ecfad41bf4f2edb2950161994..dea989b1fe4b2ce25b6d0bd9f70f54c1421ee92b 100644
--- a/gui/slick/js/new/viewlogs.js
+++ b/gui/slick/js/new/viewlogs.js
@@ -8,7 +8,7 @@ $(document).ready(function(){
         $('#minLevel').prop('disabled', true);
         $('#logFilter').prop('disabled', true);
         $('#logSearch').prop('disabled', true);
-        url = sbRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val();
+        url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val();
         $.get(url, function(data){
             history.pushState('data', '', url);
             $('pre').html($(data).find('pre').html());
@@ -38,7 +38,7 @@ $(document).ready(function(){
             $('#minLevel option[value=20]').prop('selected', true);
             $('#minLevel').prop('disabled', false);
             $('#logFilter').prop('disabled', false);
-            url = sbRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val();
+            url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val();
             $.get(url, function(data){
                 history.pushState('data', '', url);
                 $('pre').html($(data).find('pre').html());
diff --git a/gui/slick/js/newShow.js b/gui/slick/js/newShow.js
index 60d2576ac7f40558d76390f8d3b1abf3457f9910..c347253fb5164bc715aac310501c510bc0b0cbfe 100644
--- a/gui/slick/js/newShow.js
+++ b/gui/slick/js/newShow.js
@@ -8,10 +8,10 @@ $(document).ready(function () {
         if (searchRequestXhr) searchRequestXhr.abort();
 
         var searchingFor = $('#nameToSearch').val().trim() + ' on ' + $('#providedIndexer option:selected').text() + ' in ' + $('#indexerLangSelect').val();
-        $('#searchResults').empty().html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> searching ' + searchingFor + '...');
+        $('#searchResults').empty().html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> searching ' + searchingFor + '...');
 
         searchRequestXhr = $.ajax({
-            url: sbRoot + '/home/addShows/searchIndexersForShowName',
+            url: srRoot + '/home/addShows/searchIndexersForShowName',
             data: {'search_term': $('#nameToSearch').val().trim(), 'lang': $('#indexerLangSelect').val(), 'indexer': $('#providedIndexer').val()},
             timeout: parseInt($('#indexer_timeout').val(), 10) * 1000,
             dataType: 'json',
@@ -166,7 +166,7 @@ $(document).ready(function () {
 
         // if we have a show name then sanitize and use it for the dir name
         if (show_name.length) {
-            $.get(sbRoot + '/home/addShows/sanitizeFileName', {name: show_name}, function (data) {
+            $.get(srRoot + '/home/addShows/sanitizeFileName', {name: show_name}, function (data) {
                 $('#displayText').html(sample_text.replace('||', data));
             });
         // if not then it's unknown
@@ -205,7 +205,7 @@ $(document).ready(function () {
         if ($('#anime').prop('checked')) {
             $('#blackwhitelist').show();
             if (show_name) {
-                $.getJSON(sbRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) {
+                $.getJSON(srRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) {
                 if (data.result == 'success') {
                     $.each(data.groups, function(i, group) {
                         var option = $("<option>");
diff --git a/gui/slick/js/plotTooltip.js b/gui/slick/js/plotTooltip.js
index 6f7379220405b03d5630437831fe273672026a5f..a29e5f86919457eb1f28cb359196c6145bd1c869 100644
--- a/gui/slick/js/plotTooltip.js
+++ b/gui/slick/js/plotTooltip.js
@@ -5,7 +5,7 @@ $(function () {
             content: {
                 text: 'Loading...',
                 ajax: {
-                    url: $("#sbRoot").val() + '/home/plotDetails',
+                    url: $("#srRoot").val() + '/home/plotDetails',
                     type: 'GET',
                     data: {
                         show: match[1],
diff --git a/gui/slick/js/qualityChooser.js b/gui/slick/js/qualityChooser.js
index 1fb8b4981e2a6aefef4a46489b797c952dd7453e..8cf90a5d32b6b49c97654756e47f5ebff65333df 100644
--- a/gui/slick/js/qualityChooser.js
+++ b/gui/slick/js/qualityChooser.js
@@ -1,6 +1,6 @@
 $(document).ready(function() {
     function setFromPresets (preset) {
-        if (preset == 0) {
+        if (parseInt(preset) === 0) {
             $('#customQuality').show();
             return;
         } else {
diff --git a/gui/slick/js/recommendedShows.js b/gui/slick/js/recommendedShows.js
index 649f00bad2c32ff0c7667417728473637bc7c5dc..81c60af84987c92521239f9532a96fdc23e7c817 100644
--- a/gui/slick/js/recommendedShows.js
+++ b/gui/slick/js/recommendedShows.js
@@ -4,9 +4,9 @@ $(document).ready(function() {
     function loadContent() {
         if (trendingRequestXhr) trendingRequestXhr.abort();
 
-        $('#trendingShows').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> Loading Recommended Shows...');
+        $('#trendingShows').html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> Loading Recommended Shows...');
         trendingRequestXhr = $.ajax({
-            url: sbRoot + '/home/addShows/getRecommendedShows/',
+            url: srRoot + '/home/addShows/getRecommendedShows/',
             timeout: 60 * 1000,
             error: function () {
                 $('#trendingShows').empty().html('Trakt timed out, refresh page to try again');
diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js
index 07f741bbdd10da629bcaac2780a81dbc7d8846dc..7e6fd4b7a528cebb424ff599dd5439dd85bb6134 100644
--- a/gui/slick/js/restart.js
+++ b/gui/slick/js/restart.js
@@ -3,7 +3,7 @@ $(document).ready(function() {
     window.console_prefix = 'Restart: ';
     window.current_pid = '';
 
-    var is_alive_url = sbRoot + '/home/is_alive/';
+    var is_alive_url = srRoot + '/home/is_alive/';
 
     var check_isAlive = setInterval(is_alive, 1000);
 
@@ -38,7 +38,7 @@ $(document).ready(function() {
                     $('#restart_loading').hide();
                     $('#restart_success').show();
                     $('#refresh_message').show();
-                    setTimeout(function(){window.location = sbRoot + '/' + sbDefaultPage + '/';}, 5000);
+                    setTimeout(function(){window.location = srRoot + '/' + sbDefaultPage + '/';}, 5000);
                 }
             }
 
diff --git a/gui/slick/js/rootDirs.js b/gui/slick/js/rootDirs.js
index 286ba763eafe7c2ed59b578993a6b569c6f4f441..d9e0e52dfb5e1aae7123a497fbcddec9cf5c670e 100644
--- a/gui/slick/js/rootDirs.js
+++ b/gui/slick/js/rootDirs.js
@@ -41,7 +41,7 @@ $(document).ready(function() {
             setDefault($('#rootDirs option').attr('id'));
 
         refreshRootDirs();
-        $.get(sbRoot+'/config/general/saveRootDirs', { rootDirString: $('#rootDirText').val() });
+        $.get(srRoot+'/config/general/saveRootDirs', { rootDirString: $('#rootDirText').val() });
     }
 
     function editRootDir(path) {
@@ -61,7 +61,7 @@ $(document).ready(function() {
         }
 
         refreshRootDirs();
-        $.get(sbRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()});
+        $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()});
     }
 
     $('#addRootDir').click(function(){$(this).nFileBrowser(addRootDir);});
@@ -96,14 +96,14 @@ $(document).ready(function() {
 
         }
         refreshRootDirs();
-        $.get(sbRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()});
+        $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()});
     });
 
     $('#defaultRootDir').click(function(){
         if ($("#rootDirs option:selected").length)
             setDefault($("#rootDirs option:selected").attr('id'));
         refreshRootDirs();
-        $.get(sbRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()});
+        $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()});
     });
 
     function setDefault(which, force){
diff --git a/gui/slick/js/sceneExceptionsTooltip.js b/gui/slick/js/sceneExceptionsTooltip.js
index 20c04e88ff2737d47fe9324df94c0a3aedb3f208..2be78993531d180af40997ac31bed8ba14c4a27d 100644
--- a/gui/slick/js/sceneExceptionsTooltip.js
+++ b/gui/slick/js/sceneExceptionsTooltip.js
@@ -5,7 +5,7 @@ $(function () {
             content: {
                 text: 'Loading...',
                 ajax: {
-                    url: $("#sbRoot").val() + '/home/sceneExceptions',
+                    url: $("#srRoot").val() + '/home/sceneExceptions',
                     type: 'GET',
                     data: {
                         show: match[1]
diff --git a/gui/slick/js/script.js b/gui/slick/js/script.js
index cb4e383fb647a8e86c79c740ae466c6cbb46f813..63ccea508dd32364b498f9792ad2b5334b34cb74 100644
--- a/gui/slick/js/script.js
+++ b/gui/slick/js/script.js
@@ -61,8 +61,8 @@ function resetFilters(text) {
 
 function initFancybox() {
     if ($("a[rel=dialog]").length > 0) {
-        $.getScript(sbRoot + '/js/fancybox/jquery.fancybox.pack.js', function () {
-            $("head").append("<link rel='stylesheet' href='" + sbRoot + "/js/fancybox/jquery.fancybox.css'>");
+        $.getScript(srRoot + '/js/fancybox/jquery.fancybox.pack.js', function () {
+            $("head").append("<link rel='stylesheet' href='" + srRoot + "/js/fancybox/jquery.fancybox.css'>");
             $("a[rel=dialog]").fancybox({
                 type: "image",
                 padding: 0,
@@ -131,4 +131,30 @@ function init() {
 
 $(document).ready(function () {
     init();
+    $(document).ready(function() {
+        $('.dropdown-toggle').dropdownHover();
+        if(['True', 1].indexOf($('meta[data-var="sickbeard.FUZZY_DATING"]').data('content')) >= 0){
+            $.timeago.settings.allowFuture = true;
+            $.timeago.settings.strings = {
+                prefixAgo: null,
+                prefixFromNow: 'In ',
+                suffixAgo: "ago",
+                suffixFromNow: "",
+                seconds: "less than a minute",
+                minute: "about a minute",
+                minutes: "%d minutes",
+                hour: "about an hour",
+                hours: "about %d hours",
+                day: "a day",
+                days: "%d days",
+                month: "about a month",
+                months: "%d months",
+                year: "about a year",
+                years: "%d years",
+                wordSeparator: " ",
+                numbers: []
+            };
+            $("[datetime]").timeago();
+        }
+    });
 });
diff --git a/gui/slick/js/testRename.js b/gui/slick/js/testRename.js
index f59879991c7feb98db87befc2897c59058795ed5..b0972122ab2171de2a82d2138a5e4b5006e78745 100644
--- a/gui/slick/js/testRename.js
+++ b/gui/slick/js/testRename.js
@@ -35,7 +35,7 @@ $(document).ready(function(){
 
         if (epArr.length === 0) return false;
 
-        url = sbRoot+'/home/doRename?show='+$('#showID').attr('value')+'&eps='+epArr.join('|');
+        url = srRoot+'/home/doRename?show='+$('#showID').attr('value')+'&eps='+epArr.join('|');
         window.location.href = url;
     });
 
diff --git a/gui/slick/views/apiBuilder.mako b/gui/slick/views/apiBuilder.mako
index 7a42cf0bee1d00515eab718e69402c49891fffa8..9e5a6bdf7203805fce643c889fe4bd7ff211894e 100644
--- a/gui/slick/views/apiBuilder.mako
+++ b/gui/slick/views/apiBuilder.mako
@@ -1,401 +1,263 @@
-<!DOCTYPE HTML>
+<%!
+    import sickbeard
+%>
+<!DOCTYPE html>
 <html>
-    <head>
-        <meta charset="utf-8">
-        <title>SickRage - API Builder</title>
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width">
-        <meta name="robots" content="noindex">
-
-        <script type="text/javascript" charset="utf-8">
-            sbRoot = '${sbRoot}';
-        </script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/apibuilder.js?${sbPID}"></script>
+<head>
+    <meta charset="utf-8">
+    <meta name="robots" content="noindex, nofollow">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width">
+
+    <!-- These values come from css/dark.css and css/light.css -->
+    % if sbThemeName == "dark":
+    <meta name="theme-color" content="#15528F">
+    % elif sbThemeName == "light":
+    <meta name="theme-color" content="#333333">
+    % endif
+
+    <title>SickRage - BRANCH:[${sickbeard.BRANCH}] - ${title}</title>
+
+    <!--[if lt IE 9]>
+    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+    <meta name="msapplication-TileColor" content="#FFFFFF">
+    <meta name="msapplication-TileImage" content="${srRoot}/images/ico/favicon-144.png">
+    <meta name="msapplication-config" content="${srRoot}/css/browserconfig.xml">
+
+    <link rel="shortcut icon" href="${srRoot}/images/ico/favicon.ico">
+    <link rel="icon" sizes="16x16 32x32 64x64" href="${srRoot}/images/ico/favicon.ico">
+    <link rel="icon" type="image/png" sizes="196x196" href="${srRoot}/images/ico/favicon-196.png">
+    <link rel="icon" type="image/png" sizes="160x160" href="${srRoot}/images/ico/favicon-160.png">
+    <link rel="icon" type="image/png" sizes="96x96" href="${srRoot}/images/ico/favicon-96.png">
+    <link rel="icon" type="image/png" sizes="64x64" href="${srRoot}/images/ico/favicon-64.png">
+    <link rel="icon" type="image/png" sizes="32x32" href="${srRoot}/images/ico/favicon-32.png">
+    <link rel="icon" type="image/png" sizes="16x16" href="${srRoot}/images/ico/favicon-16.png">
+    <link rel="apple-touch-icon" sizes="152x152" href="${srRoot}/images/ico/favicon-152.png">
+    <link rel="apple-touch-icon" sizes="144x144" href="${srRoot}/images/ico/favicon-144.png">
+    <link rel="apple-touch-icon" sizes="120x120" href="${srRoot}/images/ico/favicon-120.png">
+    <link rel="apple-touch-icon" sizes="114x114" href="${srRoot}/images/ico/favicon-114.png">
+    <link rel="apple-touch-icon" sizes="76x76" href="${srRoot}/images/ico/favicon-76.png">
+    <link rel="apple-touch-icon" sizes="72x72" href="${srRoot}/images/ico/favicon-72.png">
+    <link rel="apple-touch-icon" href="${srRoot}/images/ico/favicon-57.png">
+
+    <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/bootstrap.min.css?${sbPID}"/>
+    <link rel="stylesheet" type="text/css" href="${srRoot}/css/browser.css?${sbPID}" />
+    <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" />
+    <link rel="stylesheet" type="text/css" href="${srRoot}/css/style.css?${sbPID}"/>
+    <link rel="stylesheet" type="text/css" href="${srRoot}/css/${sbThemeName}.css?${sbPID}" />
+</head>
+<body>
+<nav class="navbar navbar-default navbar-fixed-top hidden-print" role="navigation">
+    <div class="container-fluid">
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-collapsed">
+                <span class="sr-only">Toggle navigation</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="${srRoot}/apibuilder/" title="SickRage">
+                <img alt="SickRage" src="${srRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" />
+                <p class="navbar-text hidden-xs">${title}</p>
+            </a>
+        </div>
+
+        <div class="collapse navbar-collapse" id="nav-collapsed">
+            <div class="btn-group navbar-btn" data-toggle="buttons">
+                <label class="btn btn-primary">
+                    <input autocomplete="off" id="option-profile" type="checkbox" /> Profile
+                </label>
+                <label class="btn btn-primary">
+                    <input autocomplete="off" id="option-jsonp" type="checkbox" /> JSONP
+                </label>
+            </div>
 
-        <style type="text/css">
-            #apibuilder select { padding: 2px 2px 2px 6px; display: block; float: left; margin: auto 8px 4px auto; }
-            #apibuilder select option { padding: 1px 6px; line-height: 1.2em; }
-            #apibuilder .disabled { color: #ccc; }
-            #apibuilder .action { background-color: #efefef; }
-        </style>
+            <ul class="nav navbar-nav navbar-right">
+                <li><a href="${srRoot}/home/">Back to SickRage</a></li>
+                <li class="hidden-xs">
+                    <a href="https://github.com/SiCKRAGETV/SickRage/wiki/Donations" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href); return false;">
+                        <img src="${srRoot}/images/donate.jpg" alt="[donate]" class="navbaricon" />
+                    </a>
+                </li>
+            </ul>
+
+            <form class="navbar-form navbar-right">
+                <div class="form-group">
+                    <input autocomplete="off" class="form-control" id="command-search" placeholder="Command name" type="search"/>
+                </div>
+            </form>
+        </div>
+    </div>
+</nav>
+
+<div id="content">
+    <div class="panel-group" id="commands_list">
+        % for command in sorted(commands):
+        <%
+            command_id = command.replace('.', '-')
+            help = commands[command]((), {'help': 1}).run()
+        %>
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h4 class="panel-title">
+                    <a data-toggle="collapse" data-parent="#commands_list" href="#command-${command_id}">${command}</a>
+                </h4>
+            </div>
+            <div class="panel-collapse collapse" id="command-${command_id}">
+                <div class="panel-body">
+                    <blockquote>${help['message']}</blockquote>
+
+                    % if help['data']['optionalParameters'] or help['data']['requiredParameters']:
+                    <h4>Parameters</h4>
+
+                    <table class="tablesorter">
+                    <thead>
+                        <tr>
+                            <th>Name</th>
+                            <th>Required</th>
+                            <th>Description</th>
+                            <th>Type</th>
+                            <th>Default value</th>
+                            <th>Allowed values</th>
+                        </tr>
+                    </thead>
+                    ${display_parameters_doc(help['data']['requiredParameters'], True)}
+                    ${display_parameters_doc(help['data']['optionalParameters'], False)}
+                    </table>
+                    % endif
+
+                    <h4>Playground</h4>
+
+                    URL: <kbd id="command-${command_id}-base-url">/api/${apikey}/?cmd=${command}</kbd><br />
+
+                    % if help['data']['requiredParameters']:
+                        Required parameters: ${display_parameters_playground(help['data']['requiredParameters'], True, command_id)}<br />
+                    % endif
+
+                    % if help['data']['optionalParameters']:
+                        Optional parameters: ${display_parameters_playground(help['data']['optionalParameters'], False, command_id)}<br />
+                    % endif
+
+                    <button class="btn btn-primary" data-action="api-call" data-command-name="${command_id}" data-base-url="command-${command_id}-base-url" data-target="#command-${command_id}-response" data-time="#command-${command_id}-time" data-url="#command-${command_id}-url">Call API</button><br />
+
+                    <div class="result-wrapper hidden">
+                        <div class="clearfix">
+                            <span class="pull-left">
+                                Response: <strong id="command-${command_id}-time"></strong><br />
+                                URL: <kbd id="command-${command_id}-url"></kbd>
+                            </span>
+                            <span class="pull-right">
+                                <button class="btn btn-default" data-action="clear-result" data-target="#command-${command_id}-response">Clear</button>
+                            </span>
+                        </div>
+
+                        <pre><code id="command-${command_id}-response"></code></pre>
+                    </div>
+                </div>
+            </div>
+        </div>
+        % endfor
+    </div>
+</div>
 
 <script type="text/javascript">
-var hide_empty_list=true;
-var disable_empty_list=true;
-
-addListGroup("api", "Command");
-
-addOption("Command", "SickRage", "?cmd=sb", 1); //make default
-addList("Command", "SickRage.AddRootDir", "?cmd=sb.addrootdir", "sb.addrootdir", "", "", "action");
-addOption("Command", "SickRage.CheckScheduler", "?cmd=sb.checkscheduler", "", "", "action");
-addOption("Command", "SickRage.CheckVersion", "?cmd=sb.checkversion", "", "", "action");
-addList("Command", "SickRage.DeleteRootDir", "?cmd=sb.deleterootdir", "sb.deleterootdir", "", "", "action");
-addOption("Command", "SickRage.GetDefaults", "?cmd=sb.getdefaults", "", "", "action");
-addOption("Command", "SickRage.GetMessages", "?cmd=sb.getmessages", "", "", "action");
-addOption("Command", "SickRage.GetRootDirs", "?cmd=sb.getrootdirs", "", "", "action");
-addList("Command", "SickRage.PauseBacklog", "?cmd=sb.pausebacklog", "sb.pausebacklog", "", "", "action");
-addOption("Command", "SickRage.Ping", "?cmd=sb.ping", "", "", "action");
-addOption("Command", "SickRage.Restart", "?cmd=sb.restart", "", "", "action");
-addList("Command", "SickRage.SearchIndexers", "?cmd=sb.searchindexers", "sb.searchindexers", "", "", "action");
-addList("Command", "SickRage.SearchTVDb", "?cmd=sb.searchtvdb", "sb.searchindexers", "", "", "action");
-addList("Command", "SickRage.SearchTVRage", "?cmd=sb.searchtvrage", "sb.searchindexers", "", "", "action");
-addList("Command", "SickRage.SetDefaults", "?cmd=sb.setdefaults", "sb.setdefaults", "", "", "action");
-addOption("Command", "SickRage.Shutdown", "?cmd=sb.shutdown", "", "", "action");
-addOption("Command", "SickRage.Update", "?cmd=sb.update", "", "", "action");
-addOption("Command", "Backlog", "?cmd=backlog", "", "", "action");
-addList("Command", "Coming Episodes", "?cmd=future", "future");
-addList("Command", "Episode", "?cmd=episode", "episode");
-addList("Command", "Episode.Search", "?cmd=episode.search", "episode.search", "", "", "action");
-addList("Command", "Episode.SetStatus", "?cmd=episode.setstatus", "episode.setstatus", "", "", "action");
-addList("Command", "Episode.SubtitleSearch", "?cmd=episode.subtitlesearch", "episode.search", "", "", "action");
-addList("Command", "Scene Exceptions", "?cmd=exceptions", "exceptions");
-addOption("Command", "Failed", "?cmd=failed", "", "", "action");
-addList("Command", "History", "?cmd=history", "history");
-addOption("Command", "History.Clear", "?cmd=history.clear", "", "", "action");
-addOption("Command", "History.Trim", "?cmd=history.trim", "", "", "action");
-addList("Command", "Logs", "?cmd=logs", "logs");
-addList("Command", "Show", "?cmd=show", "indexerid");
-addList("Command", "Show.AddExisting", "?cmd=show.addexisting", "show.addexisting", "", "", "action");
-addList("Command", "Show.AddNew", "?cmd=show.addnew", "show.addnew", "", "", "action");
-addList("Command", "Show.Cache", "?cmd=show.cache", "indexerid", "", "", "action");
-addList("Command", "Show.Delete", "?cmd=show.delete", "show.delete", "", "", "action");
-addList("Command", "Show.GetBanner", "?cmd=show.getbanner", "indexerid", "", "", "action");
-addList("Command", "Show.GetFanArt", "?cmd=show.getfanart", "indexerid", "", "", "action");
-addList("Command", "Show.GetNetworkLogo", "?cmd=show.getnetworklogo", "indexerid", "", "", "action");
-addList("Command", "Show.GetPoster", "?cmd=show.getposter", "indexerid", "", "", "action");
-addList("Command", "Show.GetQuality", "?cmd=show.getquality", "indexerid", "", "", "action");
-addList("Command", "Show.Pause", "?cmd=show.pause", "show.pause", "", "", "action");
-addList("Command", "Show.Refresh", "?cmd=show.refresh", "indexerid", "", "", "action");
-addList("Command", "Show.SeasonList", "?cmd=show.seasonlist", "show.seasonlist", "", "", "action");
-addList("Command", "Show.Seasons", "?cmd=show.seasons", "seasons", "", "", "action");
-addList("Command", "Show.SetQuality", "?cmd=show.setquality", "show.setquality", "", "", "action");
-addList("Command", "Show.Stats", "?cmd=show.stats", "indexerid", "", "", "action");
-addList("Command", "Show.Update", "?cmd=show.update", "indexerid", "", "", "action");
-addList("Command", "Shows", "?cmd=shows", "shows");
-addOption("Command", "Shows.Stats", "?cmd=shows.stats", "", "", "action");
-
-// addOption("indexerid", "Optional Param", "", 1);
-% for curShow in sortedShowList:
-addOption("indexerid", "${curShow.name}", "&indexerid=${curShow.indexerid}");
-% endfor
-
-addOption("logs", "Optional Param", "", 1);
-addOption("logs", "Debug", "&min_level=debug");
-addOption("logs", "Info", "&min_level=info");
-addOption("logs", "Warning", "&min_level=warning");
-addOption("logs", "Error", "&min_level=error");
-
-addOption("sb.setdefaults", "Optional Param", "", 1);
-addList("sb.setdefaults", "Exclude Paused Shows on ComingEps", "&future_show_paused=0", "sb.setdefaults-status");
-addList("sb.setdefaults", "Include Paused Shows on ComingEps", "&future_show_paused=1", "sb.setdefaults-status");
-
-addOption("sb.setdefaults-status", "Optional Param", "", 1);
-addList("sb.setdefaults-status", "Wanted", "&status=wanted", "sb.setdefaults-opt");
-addList("sb.setdefaults-status", "Skipped", "&status=skipped", "sb.setdefaults-opt");
-addList("sb.setdefaults-status", "Archived", "&status=archived", "sb.setdefaults-opt");
-addList("sb.setdefaults-status", "Ignored", "&status=ignored", "sb.setdefaults-opt");
-
-addOption("sb.setdefaults-opt", "Optional Param", "", 1);
-addList("sb.setdefaults-opt", "Flatten (No Season Folder)", "&flatten_folders=1", "quality");
-addList("sb.setdefaults-opt", "Use Season Folder", "&flatten_folders=0", "quality");
-
-addOption("shows", "Optional Param", "", 1);
-addOption("shows", "Show Only Paused", "&paused=1");
-addOption("shows", "Show Only Not Paused", "&paused=0");
-addOption("shows", "Sort by Show Name", "&sort=name");
-addOption("shows", "Sort by INDEXER ID", "&sort=id");
-
-addList("show.addexisting", "C:\\temp\\show1", "&location=C:\\temp\\show1", "show.addexisting-indexerid");
-addList("show.addexisting", "D:\\Temp\\show2", "&location=D:\\Temp\\show2", "show.addexisting-indexerid");
-addList("show.addexisting", "S:\\TV\\Ancient Aliens", "&location=S:\\TV\\Ancient Aliens", "show.addexisting-indexerid");
-addList("show.addexisting", "S:\\TV\\Chuck", "&location=S:\\TV\\Chuck", "show.addexisting-indexerid");
-
-addList("show.addexisting-indexerid", "101501 (Ancient Aliens)", "&indexerid=101501", "show.addexisting-opt");
-addList("show.addexisting-indexerid", "80348 (Chuck)", "&indexerid=80348", "show.addexisting-opt");
-
-addOption("show.addexisting-opt", "Optional Param", "", 1);
-addList("show.addexisting-opt", "Flatten (No Season Folder)", "&flatten_folders=1", "quality");
-addList("show.addexisting-opt", "Use Season Folder", "&flatten_folders=0", "quality");
-
-addList("show.addnew", "101501 (Ancient Aliens)", "&indexerid=101501", "show.addnew-loc");
-addList("show.addnew", "80348 (Chuck)", "&indexerid=80348", "show.addnew-loc");
-
-addOption("show.addnew-loc", "Optional Param", "", 1);
-addList("show.addnew-loc", "C:\\Temp", "&location=C:\\temp", "show.addnew-status");
-addList("show.addnew-loc", "D:\\Temp", "&location=D:\\Temp", "show.addnew-status");
-addList("show.addnew-loc", "S:\\TV", "&location=S:\\TV", "show.addnew-status");
-addList("show.addnew-loc", "/usr/bin", "&location=/usr/bin", "show.addnew-status");
-
-addOption("show.addnew-status", "Optional Param", "", 1);
-addList("show.addnew-status", "Wanted", "&status=wanted", "show.addnew-opt");
-addList("show.addnew-status", "Skipped", "&status=skipped", "show.addnew-opt");
-addList("show.addnew-status", "Archived", "&status=archived", "show.addnew-opt");
-addList("show.addnew-status", "Ignored", "&status=ignored", "show.addnew-opt");
-
-addOption("show.addnew-opt", "Optional Param", "", 1);
-addList("show.addnew-opt", "Flatten (No Season Folder)", "&flatten_folders=1", "quality");
-addList("show.addnew-opt", "Use Season Folder", "&flatten_folders=0", "quality");
-
-addOptGroup("sb.searchindexers", "Search by Name");
-addList("sb.searchindexers", "Lost", "&name=Lost", "sb.searchindexers-lang");
-addList("sb.searchindexers", "office", "&name=office", "sb.searchindexers-lang");
-addList("sb.searchindexers", "OffiCE", "&name=OffiCE", "sb.searchindexers-lang");
-addList("sb.searchindexers", "Leno", "&name=leno", "sb.searchindexers-lang");
-addList("sb.searchindexers", "Top Gear", "&name=Top Gear", "sb.searchindexers-lang");
-endOptGroup("sb.searchindexers");
-addOptGroup("sb.searchindexers", "Search by indexerid");
-addList("sb.searchindexers", "73739", "&indexerid=73739", "sb.searchindexers-lang");
-addList("sb.searchindexers", "74608", "&indexerid=74608", "sb.searchindexers-lang");
-addList("sb.searchindexers", "199051", "&indexerid=199051", "sb.searchindexers-lang");
-addList("sb.searchindexers", "123456 (invalid show)", "&indexerid=123456", "sb.searchindexers-lang");
-endOptGroup("sb.searchindexers");
-
-addOption("sb.searchindexers-lang", "Optional Param", "", 1);
-addOption("sb.searchindexers-lang", "Chinese", "&lang=zh");   // 27
-addOption("sb.searchindexers-lang", "Croatian", "&lang=hr");  // 31
-addOption("sb.searchindexers-lang", "Czech", "&lang=cs");     // 28
-addOption("sb.searchindexers-lang", "Danish", "&lang=da");    // 10
-addOption("sb.searchindexers-lang", "Dutch", "&lang=nl");     // 13
-addOption("sb.searchindexers-lang", "English", "&lang=en");   // 7
-addOption("sb.searchindexers-lang", "Finnish", "&lang=fi");   // 11 -- Suomeksi
-addOption("sb.searchindexers-lang", "French", "&lang=fr");    // 17
-addOption("sb.searchindexers-lang", "German", "&lang=de");    // 14
-addOption("sb.searchindexers-lang", "Greek", "&lang=el");     // 20
-addOption("sb.searchindexers-lang", "Hebrew", "&lang=he");    // 24
-addOption("sb.searchindexers-lang", "Hungarian", "&lang=hu"); // 19 -- Magyar
-addOption("sb.searchindexers-lang", "Italian", "&lang=it");   // 15
-addOption("sb.searchindexers-lang", "Japanese", "&lang=ja");  // 25
-addOption("sb.searchindexers-lang", "Korean", "&lang=ko");    // 32
-addOption("sb.searchindexers-lang", "Norwegian", "&lang=no"); // 9
-addOption("sb.searchindexers-lang", "Polish", "&lang=pl");    // 18
-addOption("sb.searchindexers-lang", "Portuguese", "&lang=pt");// 26
-addOption("sb.searchindexers-lang", "Russian", "&lang=ru");   // 22
-addOption("sb.searchindexers-lang", "Slovenian", "&lang=sl"); // 30
-addOption("sb.searchindexers-lang", "Spanish", "&lang=es");   // 16
-addOption("sb.searchindexers-lang", "Swedish", "&lang=sv");   // 8
-addOption("sb.searchindexers-lang", "Turkish", "&lang=tr");   // 21
-
-% for curShow in sortedShowList:
-addList("seasons", "${curShow.name}", "&indexerid=${curShow.indexerid}", "seasons-${curShow.indexerid}");
-% endfor
-
-% for curShow in sortedShowList:
-addList("show.seasonlist", "${curShow.name}", "&indexerid=${curShow.indexerid}", "show.seasonlist-sort");
-% endfor
-
-addOption("show.seasonlist-sort", "Optional Param", "", 1);
-addOption("show.seasonlist-sort", "Sort by Ascending", "&sort=asc");
-
-% for curShow in sortedShowList:
-addList("show.setquality", "${curShow.name}", "&indexerid=${curShow.indexerid}", "quality");
-% endfor
-
-//build out generic quality options
-addOptGroup("quality", "Quality Templates");
-addOption("quality", "SD", "&initial=sdtv|sddvd");
-addOption("quality", "HD", "&initial=hdtv|fullhdtv|hdwebdl|fullhdwebdl|hdbluray|fullhdbluray");
-addOption("quality", "HD720p", "&initial=hdtv|hdwebdl|hdbluray");
-addOption("quality", "HD1080p", "&initial=fullhdtv|fullhdwebdl|fullhdbluray");
-addOption("quality", "ANY", "&initial=sdtv|sddvd|hdtv|fullhdtv|hdwebdl|fullhdwebdl|hdbluray|fullhdbluray|unknown");
-endOptGroup("quality");
-addOptGroup("quality", "Inital (Custom)");
-addList("quality", "SD TV", "&initial=sdtv", "quality-archive");
-addList("quality", "SD DVD", "&initial=sddvd", "quality-archive");
-addList("quality", "HD TV", "&initial=hdtv", "quality-archive");
-addList("quality", "RawHD TV", "&initial=rawhdtv", "quality-archive");
-addList("quality", "1080p HD TV", "&initial=fullhdtv", "quality-archive");
-addList("quality", "720p Web-DL", "&initial=hdwebdl", "quality-archive");
-addList("quality", "1080p Web-DL", "&initial=fullhdwebdl", "quality-archive");
-addList("quality", "720p BluRay", "&initial=hdbluray", "quality-archive");
-addList("quality", "1080p BluRay", "&initial=fullhdbluray", "quality-archive");
-addList("quality", "Unknown", "&initial=unknown", "quality-archive");
-endOptGroup("quality");
-addOptGroup("quality", "Random (Custom)");
-addList("quality", "SD DVD/720p Web-DL", "&initial=sddvd|hdwebdl", "quality-archive");
-addList("quality", "SD TV/HD TV", "&initial=sdtv|hdtv", "quality-archive");
-endOptGroup("quality");
-
-addOption("quality-archive", "Optional Param", "", 1);
-addOptGroup("quality-archive", "Archive (Custom)");
-addList("quality-archive", "SD DVD", "&archive=sddvd");
-addList("quality-archive", "HD TV", "&archive=hdtv");
-addList("quality-archive", "RawHD TV", "&archive=rawhdtv");
-addList("quality-archive", "1080p HD TV", "&archive=fullhdtv");
-addList("quality-archive", "720p Web-DL", "&archive=hdwebdl");
-addList("quality-archive", "1080p Web-DL", "&archive=fullhdwebdl");
-addList("quality-archive", "720p BluRay", "&archive=hdbluray");
-addList("quality-archive", "1080p BluRay", "&archive=fullhdbluray");
-endOptGroup("quality-archive");
-addOptGroup("quality-archive", "Random (Custom)");
-addList("quality-archive", "HD TV/1080p BluRay", "&archive=hdtv|fullhdbluray");
-addList("quality-archive", "720p Web-DL/720p BluRay", "&archive=hdwebdl|hdbluray");
-endOptGroup("quality-archive");
-
-// build out each show's season list for season cmd
-% for curShow in seasonSQLResults:
-addOption("seasons-${curShow}", "Optional Param", "", 1);
-    % for curShowSeason in seasonSQLResults[curShow]:
-addOption("seasons-${curShow}", "${curShowSeason['season']}", "&season=${curShowSeason['season']}");
-    % endfor
-% endfor
-
-% for curShow in sortedShowList:
-addList("episode", "${curShow.name}", "&indexerid=${curShow.indexerid}", "episode-${curShow.indexerid}");
-% endfor
-
-// build out each show's season+episode list for episode cmd
-% for curShow in episodeSQLResults:
-    % for curShowSeason in episodeSQLResults[curShow]:
-addList("episode-${curShow}", "${curShowSeason['season']} x ${curShowSeason['episode']}", "&season=${curShowSeason['season']}&episode=${curShowSeason['episode']}", "episode-${curShow}-full");
-    % endfor
-addOption("episode-${curShow}-full", "Optional Param", "", 1);
-addOption("episode-${curShow}-full", "Show Full Path", "&full_path=1");
-% endfor
-
-// build out tvshow list for episode.search
-% for curShow in sortedShowList:
-addList("episode.search", "${curShow.name}", "&indexerid=${curShow.indexerid}", "episode.search-${curShow.indexerid}");
-% endfor
-
-// build out each show's season+episode list for episode.search cmd
-% for curShow in episodeSQLResults:
-    % for curShowSeason in episodeSQLResults[curShow]:
-addOption("episode.search-${curShow}", "${curShowSeason['season']} x ${curShowSeason['episode']}", "&season=${curShowSeason['season']}&episode=${curShowSeason['episode']}");
-    % endfor
-% endfor
-
-// build out tvshow list for episode.setstatus
-% for curShow in sortedShowList:
-addList("episode.setstatus", "${curShow.name}", "&indexerid=${curShow.indexerid}", "episode.setstatus-${curShow.indexerid}");
-% endfor
-
-// build out each show's season+episode list for episode.setstatus cmd
-% for curShow in episodeSQLResults:
-    <% curSeason = -1 %>
-    % for curShowSeason in episodeSQLResults[curShow]:
-        % if curShowSeason['season'] != curSeason and curShowSeason['season'] != 0:
-            // insert just the season as the ep number is now optional
-            addList("episode.setstatus-${curShow}", "Season ${curShowSeason['season']}", "&season=${curShowSeason['season']}", "episode-status-${curShow}");
-        % endif
-        <% curSeason = int(curShowSeason['season']) %>
-addList("episode.setstatus-${curShow}", "${curShowSeason['season']} x ${curShowSeason['episode']}", "&season=${curShowSeason['season']}&episode=${curShowSeason['episode']}", "episode-status-${curShow}");
-    % endfor
-addList("episode-status-${curShow}", "Wanted", "&status=wanted", "force");
-addList("episode-status-${curShow}", "Skipped", "&status=skipped", "force");
-addList("episode-status-${curShow}", "Archived", "&status=archived", "force");
-addList("episode-status-${curShow}", "Ignored", "&status=ignored", "force");
-% endfor
-
-addOption("force", "Optional Param", "", 1);
-addOption("force", "Replace Downloaded EP", "&force=1");
-addOption("force", "Skip Downloaded EP", "&force=0");
-
-addOption("future", "Optional Param", "", 1);
-addList("future", "Sort by Date", "&sort=date", "future-type");
-addList("future", "Sort by Network", "&sort=network", "future-type");
-addList("future", "Sort by Show Name", "&sort=show", "future-type");
-
-addOption("future-type", "Optional Param", "", 1);
-addList("future-type", "Show All Types", "&type=today|missed|soon|later", "future-paused");
-addList("future-type", "Show Today", "&type=today", "future-paused");
-addList("future-type", "Show Missed", "&type=missed", "future-paused");
-addList("future-type", "Show Soon", "&type=soon", "future-paused");
-addList("future-type", "Show Later", "&type=later", "future-paused");
-addList("future-type", "Show Today & Missed", "&type=today|missed", "future-paused");
-
-addOption("future-paused", "Optional Param", "", 1);
-addOption("future-paused", "Include Paused Shows", "&paused=1");
-addOption("future-paused", "Exclude Paused Shows", "&paused=0");
-
-addOption("history", "Optional Param", "", 1);
-addList("history", "Show Only Downloaded", "&type=downloaded", "history-type");
-addList("history", "Show Only Snatched", "&type=snatched", "history-type");
-//addOptGroup("history", "Limit Results");
-addList("history", "Limit Results (2)", "&limit=2", "history-limit");
-addList("history", "Limit Results (25)", "&limit=25", "history-limit");
-addList("history", "Limit Results (50)", "&limit=50", "history-limit");
-//endOptGroup("history");
-
-addOption("history-type", "Optional Param", "", 1);
-addOption("history-type", "Limit Results (2)", "&limit=2");
-addOption("history-type", "Limit Results (25)", "&limit=25");
-addOption("history-type", "Limit Results (50)", "&limit=50");
-
-addOption("history-limit", "Optional Param", "", 1);
-addOption("history-limit", "Show Only Downloaded", "&type=downloaded");
-addOption("history-limit", "Show Only Snatched", "&type=snatched");
-
-addOption("exceptions", "Optional Param", "", 1);
-% for curShow in sortedShowList:
-addOption("exceptions", "${curShow.name}", "&indexerid=${curShow.indexerid}");
-% endfor
-
-addOption("sb.pausebacklog", "Optional Param", "", 1);
-addOption("sb.pausebacklog", "Pause", "&pause=1");
-addOption("sb.pausebacklog", "Unpause", "&pause=0");
-
-addList("sb.addrootdir", "C:\\Temp", "&location=C:\\Temp", "sb.addrootdir-opt");
-addList("sb.addrootdir", "/usr/bin", "&location=/usr/bin/", "sb.addrootdir-opt");
-addList("sb.addrootdir", "S:\\Invalid_Location", "&location=S:\\Invalid_Location", "sb.addrootdir-opt");
-
-addOption("sb.addrootdir-opt", "Optional Param", "", 1);
-addOption("sb.addrootdir-opt", "Default", "&default=1");
-addOption("sb.addrootdir-opt", "Not Default", "&default=0");
-
-addOption("sb.deleterootdir", "C:\\Temp", "&location=C:\\Temp", "", 1);
-addOption("sb.deleterootdir", "/usr/bin", "&location=/usr/bin/");
-addOption("sb.deleterootdir", "S:\\Invalid_Location", "&location=S:\\Invalid_Location");
-
-% for curShow in sortedShowList:
-addList("show.pause", "${curShow.name}", "&indexerid=${curShow.indexerid}", "show.pause-opt");
-% endfor
-addOption("show.pause-opt", "Optional Param", "", 1);
-addOption("show.pause-opt", "Unpause", "&pause=0");
-addOption("show.pause-opt", "Pause", "&pause=1");
-
-% for curShow in sortedShowList:
-addList("show.delete", "${curShow.name}", "&indexerid=${curShow.indexerid}", "show.delete-opt");
-% endfor
-addOption("show.delete-opt", "Remove Files", "&removefiles=1");
-addOption("show.delete-opt", "Don't Remove Files", "&removefiles=0");
-
+var commands = ${sorted(commands)};
+var episodes = ${episodes};
 </script>
-</head>
-
-<body onload="initListGroup('api', document.apibuilder.firstlevel, document.apibuilder.secondlevel, document.apibuilder.thirdlevel, document.apibuilder.forthlevel, document.apibuilder.fifthlevel, document.apibuilder.sixthlevel, document.apibuilder.seventhlevel)">
+<script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/bootstrap.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/bootstrap3-typeahead.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/apibuilder.js?${sbPID}"></script>
+</body>
+</html>
 
-<form name="apibuilder" id="apibuilder" action="">
-<table align="center">
+<%def name="display_parameters_doc(parameters, required)">
+<tbody>
+% for parameter in parameters:
+    <% parameter_help = parameters[parameter] %>
     <tr>
         <td>
-            <input type="text" size="40" id="apikey" name="apikey" value="${apikey}">
-            <input type="checkbox" id="debug" class="global"><label for="debug"> Debug?</label>
-            <input type="checkbox" id="profile" class="global"><label for="profile"> Profile?</label>
-            <input type="checkbox" id="jsonp" class="global"><label for="jsonp"> JSONP?</label>
-            <input type="checkbox" id="help" class="global"><label for="help"> Help?</label>
+            % if required:
+                <strong>${parameter}</strong>
+            % else:
+                ${parameter}
+            % endif
         </td>
-    </tr>
-    <tr>
-        <td>
-            <select name="firstlevel"><option></option></select>
-            <select name="secondlevel"><option></option></select>
-            <select name="thirdlevel"><option></option></select>
-            <select name="forthlevel"><option></option></select>
-            <select name="fifthlevel"><option></option></select>
-            <select name="sixthlevel"><option></option></select>
-            <select name="seventhlevel"><option></option></select>
-            <div style="float: left; ">
-                <input type="button" value="Reset" onclick="resetListGroup('api',1)" />
-                <input type="button" value="Go" onclick="goListGroup(this.form['apikey'].value, this.form['seventhlevel'].value, this.form['sixthlevel'].value, this.form['fifthlevel'].value, this.form['forthlevel'].value, this.form['thirdlevel'].value, this.form['secondlevel'].value, this.form['firstlevel'].value)" />
-            </div>
+        <td class="text-center">
+            % if required:
+                <span class="glyphicon glyphicon-ok text-success" title="Yes"></span>
+            % else:
+                <span class="glyphicon glyphicon-remove text-muted" title="No"></span>
+            % endif
         </td>
+        <td>${parameter_help['desc'] if 'desc' in parameter_help else ''}</td>
+        <td>${parameter_help['type'] if 'type' in parameter_help else ''}</td>
+        <td>${parameter_help['defaultValue'] if 'defaultValue' in parameter_help else ''}</td>
+        <td>${parameter_help['allowedValues'] if 'allowedValues' in parameter_help else ''}</td>
     </tr>
-</table>
-</form>
-
-<div id="apiResponse"></div>
-
-</body>
+% endfor
+</tbody>
+</%def>
+
+<%def name="display_parameters_playground(parameters, required, command)">
+<div class="form-inline">
+    % for parameter in parameters:
+    <%
+        parameter_help = parameters[parameter]
+        allowed_values = parameter_help['allowedValues'] if 'allowedValues' in parameter_help else ''
+        type = parameter_help['type'] if 'type' in parameter_help else ''
+    %>
+
+    % if isinstance(allowed_values, list):
+        <select class="form-control"${('', ' multiple="multiple"')[type == 'list']} name="${parameter}" data-command="${command}">
+            <option>${parameter}</option>
+
+            % if allowed_values == [0, 1]:
+                <option value="0">No</option>
+                <option value="1">Yes</option>
+            % else:
+                % for allowed_value in allowed_values:
+                <option value="${allowed_value}">${allowed_value}</option>
+                % endfor
+            % endif
+        </select>
+    % elif parameter == 'indexerid':
+        <select class="form-control" name="${parameter}" data-action="update-seasons" data-command="${command}">
+            <option>${parameter}</option>
+
+            % for show in shows:
+            <option value="${show.indexerid}">${show.name}</option>
+            % endfor
+        </select>
+
+        % if 'season' in parameters:
+        <select class="form-control hidden" name="season" data-action="update-episodes" data-command="${command}">
+            <option>season</option>
+        </select>
+        % endif
 
-</html>
+        % if 'episode' in parameters:
+        <select class="form-control hidden" name="episode" data-command="${command}">
+            <option>episode</option>
+        </select>
+        % endif
+    % elif parameter == 'tvdbid':
+        <select class="form-control" name="${parameter}" data-command="${command}">
+            <option>${parameter}</option>
+
+            % for show in shows:
+            <option value="${show.indexerid}">${show.name}</option>
+            % endfor
+        </select>
+    % elif type == 'int':
+        % if parameter not in ('episode', 'season'):
+        <input class="form-control" name="${parameter}" placeholder="${parameter}" type="number" data-command="${command}" />
+        % endif
+    % elif type == 'string':
+        <input class="form-control" name="${parameter}" placeholder="${parameter}" type="text" data-command="${command}" />
+    % endif
+% endfor
+</div>
+</%def>
diff --git a/gui/slick/views/comingEpisodes.mako b/gui/slick/views/comingEpisodes.mako
index d462f4dba77eb0a5764c0d9cc9c62fc9f73bd446..75740dbbc377376e7e3717ccf2f9407177203ccf 100644
--- a/gui/slick/views/comingEpisodes.mako
+++ b/gui/slick/views/comingEpisodes.mako
@@ -12,9 +12,9 @@
 <meta data-var="sickbeard.COMING_EPS_LAYOUT" data-content="${sickbeard.COMING_EPS_LAYOUT}">
 </%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/ajaxEpSearch.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/comingEpisodes.js"></script>
+<script type="text/javascript" src="${srRoot}/js/ajaxEpSearch.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/comingEpisodes.js"></script>
 </%block>
 <%block name="css">
 <style type="text/css">
@@ -24,33 +24,32 @@
 </%block>
 <%block name="content">
 <% sort = sickbeard.COMING_EPS_SORT %>
-<% fuzzydate = 'airdate' %>
 <%namespace file="/inc_defs.mako" import="renderQualityPill"/>
 <h1 class="header">${header}</h1>
 <div class="h2footer pull-right">
     <span>Layout:
         <select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
-            <option value="${sbRoot}/setComingEpsLayout/?layout=poster" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'poster']} >Poster</option>
-            <option value="${sbRoot}/setComingEpsLayout/?layout=calendar" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'calendar']} >Calendar</option>
-            <option value="${sbRoot}/setComingEpsLayout/?layout=banner" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'banner']} >Banner</option>
-            <option value="${sbRoot}/setComingEpsLayout/?layout=list" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'list']} >List</option>
+            <option value="${srRoot}/setComingEpsLayout/?layout=poster" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'poster']} >Poster</option>
+            <option value="${srRoot}/setComingEpsLayout/?layout=calendar" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'calendar']} >Calendar</option>
+            <option value="${srRoot}/setComingEpsLayout/?layout=banner" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'banner']} >Banner</option>
+            <option value="${srRoot}/setComingEpsLayout/?layout=list" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'list']} >List</option>
         </select>
     </span>
     &nbsp;
 
     <span>Sort By:
         <select name="sort" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
-            <option value="${sbRoot}/setComingEpsSort/?sort=date" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'date']} >Date</option>
-            <option value="${sbRoot}/setComingEpsSort/?sort=network" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'network']} >Network</option>
-            <option value="${sbRoot}/setComingEpsSort/?sort=show" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'show']} >Show</option>
+            <option value="${srRoot}/setComingEpsSort/?sort=date" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'date']} >Date</option>
+            <option value="${srRoot}/setComingEpsSort/?sort=network" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'network']} >Network</option>
+            <option value="${srRoot}/setComingEpsSort/?sort=show" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'show']} >Show</option>
         </select>
     </span>
     &nbsp;
 
     <span>View Paused:
         <select name="viewpaused" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
-            <option value="${sbRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[not bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Hidden</option>
-            <option value="${sbRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Shown</option>
+            <option value="${srRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[not bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Hidden</option>
+            <option value="${srRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Shown</option>
         </select>
     </span>
 </div>
@@ -73,7 +72,7 @@
 <!-- start list view //-->
 <% show_div = 'listing-default' %>
 
-<input type="hidden" id="sbRoot" value="${sbRoot}" />
+<input type="hidden" id="srRoot" value="${srRoot}" />
 
 <table id="showListTable" class="sickbeardTable tablesorter seasonstyle" cellspacing="1" border="0" cellpadding="0">
 
@@ -116,17 +115,13 @@
 %>
 
         <tr class="${show_div}">
-            ## forced to use a div to wrap airdate, the column sort went crazy with a span
             <td align="center" nowrap="nowrap">
                 <% airDate = sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING) %>
                 <% isoDate = sbdatetime.sbdatetime.convert_to_setting(cur_result['localtime']).isoformat('T') %>
-                <span class="${fuzzydate}">
-                    <time datetime="${isoDate}" class="date">${airDate}</time>
-                </span>
-                <span class="sort_data">${time.mktime(cur_result['localtime'].timetuple())}</span>
+                <time datetime="${isoDate}" class="date">${airDate}</time>
             </td>
 
-            <td class="tvShow" nowrap="nowrap"><a href="${sbRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']}</a>
+            <td class="tvShow" nowrap="nowrap"><a href="${srRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']}</a>
 % if int(cur_result['paused']):
                 <span class="pause">[paused]</span>
 % endif
@@ -138,9 +133,9 @@
 
             <td>
 % if cur_result['description']:
-                <img alt='' src='${sbRoot}/images/info32.png' height='16' width='16' class='plotInfo' id="plot_info_${'%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode']))}" />
+                <img alt='' src='${srRoot}/images/info32.png' height='16' width='16' class='plotInfo' id="plot_info_${'%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode']))}" />
 % else:
-                <img alt="" src="${sbRoot}/images/info32.png" width="16" height="16" class="plotInfoNone"  />
+                <img alt="" src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfoNone"  />
 % endif
                 ${cur_result['name']}
             </td>
@@ -155,13 +150,13 @@
 
             <td align="center" style="vertical-align: middle;">
 % if cur_result['imdb_id']:
-                <a href="${anon_url('http://www.imdb.com/title/', cur_result['imdb_id'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="${sbRoot}/images/imdb.png" />
+                <a href="${anon_url('http://www.imdb.com/title/', cur_result['imdb_id'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="${srRoot}/images/imdb.png" />
 % endif
-                <a href="${anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="${sickbeard.indexerApi(cur_indexer).config['show_url']}${cur_result['showid']}"><img alt="${sickbeard.indexerApi(cur_indexer).name}" height="16" width="16" src="${sbRoot}/images/${sickbeard.indexerApi(cur_indexer).config['icon']}" /></a>
+                <a href="${anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="${sickbeard.indexerApi(cur_indexer).config['show_url']}${cur_result['showid']}"><img alt="${sickbeard.indexerApi(cur_indexer).name}" height="16" width="16" src="${srRoot}/images/${sickbeard.indexerApi(cur_indexer).config['icon']}" /></a>
             </td>
 
             <td align="center">
-                <a href="${sbRoot}/home/searchEpisode?show=${cur_result['showid']}&amp;season=${cur_result['season']}&amp;episode=${cur_result['episode']}" title="Manual Search" id="forceUpdate-${cur_result['showid']}x${cur_result['season']}x${cur_result['episode']}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="${sbRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a>
+                <a href="${srRoot}/home/searchEpisode?show=${cur_result['showid']}&amp;season=${cur_result['season']}&amp;episode=${cur_result['episode']}" title="Manual Search" id="forceUpdate-${cur_result['showid']}x${cur_result['season']}x${cur_result['episode']}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="${srRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a>
             </td>
         </tr>
 % endfor
@@ -290,7 +285,7 @@
         <table width="100%" border="0" cellpadding="0" cellspacing="0">
         <tr>
             <th ${('class="nobg"', 'rowspan="2"')[banner == layout]} valign="top">
-                <a href="${sbRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" class="${('posterThumb', 'bannerThumb')[layout == 'banner']}" src="${sbRoot}/showPoster/?show=${cur_result['showid']}&amp;which=${(layout, 'poster_thumb')[layout == 'poster']}" /></a>
+                <a href="${srRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" class="${('posterThumb', 'bannerThumb')[layout == 'banner']}" src="${srRoot}/showPoster/?show=${cur_result['showid']}&amp;which=${(layout, 'poster_thumb')[layout == 'poster']}" /></a>
             </th>
 % if 'banner' == layout:
         </tr>
@@ -299,7 +294,7 @@
             <td class="next_episode">
                 <div class="clearfix">
                     <span class="tvshowTitle">
-                        <a href="${sbRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']}
+                        <a href="${srRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']}
                     % if int(cur_result['paused']):
                         <span class="pause">[paused]</span>
                     % endif
@@ -307,10 +302,10 @@
 
                     <span class="tvshowTitleIcons">
 % if cur_result['imdb_id']:
-                        <a href="${anon_url('http://www.imdb.com/title/', cur_result['imdb_id'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="${sbRoot}/images/imdb.png" />
+                        <a href="${anon_url('http://www.imdb.com/title/', cur_result['imdb_id'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="${srRoot}/images/imdb.png" />
 % endif
-                        <a href="${anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="${sickbeard.indexerApi(cur_indexer).config['show_url']}"><img alt="${sickbeard.indexerApi(cur_indexer).name}" height="16" width="16" src="${sbRoot}/images/${sickbeard.indexerApi(cur_indexer).config['icon']}" /></a>
-                        <span><a href="${sbRoot}/home/searchEpisode?show=${cur_result['showid']}&amp;season=${cur_result['season']}&amp;episode=${cur_result['episode']}" title="Manual Search" id="forceUpdate-${cur_result['showid']}" class="epSearch forceUpdate"><img alt="[search]" height="16" width="16" src="${sbRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a></span>
+                        <a href="${anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid'])}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="${sickbeard.indexerApi(cur_indexer).config['show_url']}"><img alt="${sickbeard.indexerApi(cur_indexer).name}" height="16" width="16" src="${srRoot}/images/${sickbeard.indexerApi(cur_indexer).config['icon']}" /></a>
+                        <span><a href="${srRoot}/home/searchEpisode?show=${cur_result['showid']}&amp;season=${cur_result['season']}&amp;episode=${cur_result['episode']}" title="Manual Search" id="forceUpdate-${cur_result['showid']}" class="epSearch forceUpdate"><img alt="[search]" height="16" width="16" src="${srRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a></span>
                     </span>
                 </div>
 
@@ -318,7 +313,7 @@
 
                 <div class="clearfix">
 
-                    <span class="title">Airs: </span><span class="${fuzzydate}">${sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING)}</span>${('', '<span> on %s</span>' % str(cur_result['network']))[bool(cur_result['network'])]}
+                    <span class="title">Airs: </span><span class="airdate">${sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING)}</span>${('', '<span> on %s</span>' % str(cur_result['network']))[bool(cur_result['network'])]}
                 </div>
 
                 <div class="clearfix">
@@ -332,10 +327,10 @@
                 <div>
 % if cur_result['description']:
                         <span class="title" style="vertical-align:middle;">Plot:</span>
-                        <img class="ep_summaryTrigger" src="${sbRoot}/images/plus.png" height="16" width="16" alt="" title="Toggle Summary" /><div class="ep_summary">${cur_result['description']}</div>
+                        <img class="ep_summaryTrigger" src="${srRoot}/images/plus.png" height="16" width="16" alt="" title="Toggle Summary" /><div class="ep_summary">${cur_result['description']}</div>
 % else:
                         <span class="title ep_summaryTriggerNone" style="vertical-align:middle;">Plot:</span>
-                        <img class="ep_summaryTriggerNone" src="${sbRoot}/images/plus.png" height="16" width="16" alt="" />
+                        <img class="ep_summaryTriggerNone" src="${srRoot}/images/plus.png" height="16" width="16" alt="" />
 % endif
                 </div>
         </td>
@@ -358,7 +353,7 @@
 <br>
 <br>
 <div class="calendarWrapper">
-<input type="hidden" id="sbRoot" value="${sbRoot}" />
+<input type="hidden" id="srRoot" value="${srRoot}" />
     % for day in dates:
     <% tbl_day += 1 %>
         <table class="sickbeardTable tablesorter calendarTable ${'cal-%s' % (('even', 'odd')[bool(tbl_day % 2)])}" cellspacing="0" border="0" cellpadding="0">
@@ -388,7 +383,7 @@
                 <tr>
                     <td class="calendarShow">
                         <div class="poster">
-                            <a title="${cur_result['show_name']}" href="${sbRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" src="${sbRoot}/showPoster/?show=${cur_result['showid']}&amp;which=poster_thumb" /></a>
+                            <a title="${cur_result['show_name']}" href="${srRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" src="${srRoot}/showPoster/?show=${cur_result['showid']}&amp;which=poster_thumb" /></a>
                         </div>
                         <div class="text">
                             <span class="airtime">
diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako
index 2c2b0db61b11982e6836b72ccde2d98ce78a666f..172fd34b3ee6c14325eff3596cf38d8e58c7cb4c 100644
--- a/gui/slick/views/config_anime.mako
+++ b/gui/slick/views/config_anime.mako
@@ -5,8 +5,8 @@
 %>
 
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configAnime.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/configAnime.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 <div id="content960">
@@ -25,7 +25,7 @@
 
                 <div id="core-component-group1" class="tab-pane active component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/anidb24.png" alt="AniDB" title="AniDB" width="24" height="24" />
+                        <img class="notifier-icon" src="${srRoot}/images/anidb24.png" alt="AniDB" title="AniDB" width="24" height="24" />
                         <h3><a href="${anon_url('http://anidb.info')}" onclick="window.open(this.href, '_blank'); return false;">AniDB</a></h3>
                         <p>AniDB is non-profit database of anime information that is freely open to the public</p>
                     </div>
diff --git a/gui/slick/views/config_backuprestore.mako b/gui/slick/views/config_backuprestore.mako
index 1813c2d6af58fa510d452891c47f7a41ff379bea..3f7cffa618816a038f5ae67b93dff2a0c0dd97d6 100644
--- a/gui/slick/views/config_backuprestore.mako
+++ b/gui/slick/views/config_backuprestore.mako
@@ -11,8 +11,8 @@
     from sickbeard.metadata.generic import GenericMetadata
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configBackupRestore.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/config_backuprestore.js"></script>
+<script type="text/javascript" src="${srRoot}/js/configBackupRestore.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/config_backuprestore.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -26,7 +26,7 @@
     <% indexer = sickbeard.INDEXER_DEFAULT %>
 % endif
 
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
 
 <div id="config">
     <div id="config-content">
diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako
index 2ac46d862ca57dcc39f675d07220f5497674571a..22ae8d9ff2a4d14cc2ddeaa48054a02f7c43a4a0 100644
--- a/gui/slick/views/config_general.mako
+++ b/gui/slick/views/config_general.mako
@@ -12,10 +12,10 @@
     from sickbeard.helpers import anon_url
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/config_general.js"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/config_general.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -399,7 +399,10 @@
                                 <span class="component-desc">
                                     <input type="text" name="api_key" id="api_key" value="${sickbeard.API_KEY}" class="form-control input-sm input300" readonly="readonly" />
                                     <input class="btn btn-inline" type="button" id="generate_new_apikey" value="Generate">
-                                    <div class="clear-left"><p>used to give 3rd party programs limited access to SickRage</p></div>
+                                    <div class="clear-left">
+                                        <p>used to give 3rd party programs limited access to SickRage</p>
+                                        <p>you can try all the features of the API <a href="${srRoot}/apibuilder/">here</a></p>
+                                    </div>
                                 </span>
                             </label>
                         </div>
@@ -614,13 +617,13 @@
                                     <span class="component-desc">
 % if not sickbeard.SKIP_REMOVED_FILES:
                                         <select name="ep_default_deleted_status" id="ep_default_deleted_status" class="form-control input-sm">
-                                        % for defStatus in [ARCHIVED, IGNORED]:
+                                        % for defStatus in [SKIPPED, IGNORED]:
                                             <option value="${defStatus}" ${('', 'selected="selected"')[sickbeard.EP_DEFAULT_DELETED_STATUS == defStatus]}>${statusStrings[defStatus]}</option>
                                         % endfor
                                         </select>
 % else:
                                         <select name="ep_default_deleted_status" id="ep_default_deleted_status" class="form-control input-sm" disabled="disabled">
-                                        % for defStatus in [ARCHIVED, IGNORED]:
+                                        % for defStatus in [SKIPPED, IGNORED]:
                                             <option value="${defStatus}" ${('', 'selected="selected"')[sickbeard.EP_DEFAULT_DELETED_STATUS == defStatus]}>${statusStrings[defStatus]}</option>
                                         % endfor
                                         </select>
diff --git a/gui/slick/views/config_notifications.mako b/gui/slick/views/config_notifications.mako
index f3e88e477ca0b5df6e599be1415abdf7d6471096..c2771c1a975210b701381bc5b86faa38ff312f03 100644
--- a/gui/slick/views/config_notifications.mako
+++ b/gui/slick/views/config_notifications.mako
@@ -8,9 +8,9 @@
 %>
 
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configNotifications.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/config_notifications.js"></script>
+<script type="text/javascript" src="${srRoot}/js/configNotifications.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/config_notifications.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -33,7 +33,7 @@
                 <div class="component-group">
 
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/kodi.png" alt="" title="KODI" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/kodi.png" alt="" title="KODI" />
                         <h3><a href="${anon_url('http://kodi.tv/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">KODI</a></h3>
                         <p>A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.</p>
                     </div>
@@ -158,7 +158,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/plex.png" alt="" title="Plex Media Server" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/plex.png" alt="" title="Plex Media Server" />
                         <h3><a href="${anon_url('http://www.plexapp.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Plex Media Server</a></h3>
                         <p>Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!</p>
                         <p class="plexinfo hide">For sending notifications to Plex Home Theater (PHT) clients, use the KODI notifier with port <b>3005</b>.</p>
@@ -247,7 +247,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/plex.png" alt="" title="Plex Media Client" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/plex.png" alt="" title="Plex Media Client" />
                         <h3><a href="${anon_url('http://www.plexapp.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Plex Media Client</a></h3>
                     </div>
                     <fieldset class="component-group-list">
@@ -334,7 +334,7 @@
 
                  <div class="component-group">
                      <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/emby.png" alt="" title="Emby" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/emby.png" alt="" title="Emby" />
                         <h3><a href="${anon_url('http://emby.media/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Emby</a></h3>
                         <p>A home media server built using other popular open source technologies.</p>
                     </div>
@@ -376,7 +376,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox" />
                         <h3><a href="${anon_url('http://www.popcornhour.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">NMJ</a></h3>
                         <p>The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.</p>
                     </div>
@@ -442,7 +442,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox v2"/>
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox v2"/>
                         <h3><a href="${anon_url('http://www.popcornhour.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">NMJv2</a></h3>
                         <p>The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.</p>
                     </div>
@@ -530,7 +530,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/synoindex.png" alt="" title="Synology" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/synoindex.png" alt="" title="Synology" />
                         <h3><a href="${anon_url('http://synology.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Synology</a></h3>
                         <p>The Synology DiskStation NAS.</p>
                         <p>Synology Indexer is the daemon running on the Synology NAS to build its media database.</p>
@@ -561,7 +561,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/synologynotifier.png" alt="" title="Synology Indexer" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/synologynotifier.png" alt="" title="Synology Indexer" />
                         <h3><a href="${anon_url('http://synology.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Synology Notifier</a></h3>
                         <p>Synology Notifier is the notification system of Synology DSM</p>
                     </div>
@@ -616,7 +616,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/pytivo.png" alt="" title="pyTivo" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/pytivo.png" alt="" title="pyTivo" />
                         <h3><a href="${anon_url('http://pytivo.sourceforge.net/wiki/index.php/PyTivo')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">pyTivo</a></h3>
                         <p>pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.</p>
                     </div>
@@ -678,7 +678,7 @@
             <div id="tabs-2">
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/growl.png" alt="" title="Growl" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/growl.png" alt="" title="Growl" />
                         <h3><a href="${anon_url('http://growl.info/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Growl</a></h3>
                         <p>A cross-platform unobtrusive global notification system.</p>
                     </div>
@@ -756,7 +756,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/prowl.png" alt="Prowl" title="Prowl" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/prowl.png" alt="Prowl" title="Prowl" />
                         <h3><a href="${anon_url('http://www.prowlapp.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Prowl</a></h3>
                         <p>A Growl client for iOS.</p>
                     </div>
@@ -836,7 +836,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/libnotify.png" alt="" title="Libnotify" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/libnotify.png" alt="" title="Libnotify" />
                         <h3><a href="${anon_url('http://library.gnome.org/devel/libnotify/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Libnotify</a></h3>
                         <p>The standard desktop notification API for Linux/*nix systems.  This notifier will only function if the pynotify module is installed (Ubuntu/Debian package <a href="apt:python-notify">python-notify</a>).</p>
                     </div>
@@ -890,7 +890,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/pushover.png" alt="" title="Pushover" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/pushover.png" alt="" title="Pushover" />
                         <h3><a href="${anon_url('https://pushover.net/apps/clone/sickrage')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Pushover</a></h3>
                         <p>Pushover makes it easy to send real-time notifications to your Android and iOS devices.</p>
                     </div>
@@ -1007,7 +1007,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/boxcar.png" alt="" title="Boxcar" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/boxcar.png" alt="" title="Boxcar" />
                         <h3><a href="${anon_url('http://boxcar.io/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Boxcar</a></h3>
                         <p>Universal push notification for iOS. Read your messages where and when you want them! A subscription will be sent if needed.</p>
                     </div>
@@ -1070,7 +1070,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/boxcar2.png" alt="" title="Boxcar2"/>
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/boxcar2.png" alt="" title="Boxcar2"/>
                         <h3><a href="${anon_url('https://new.boxcar.io/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Boxcar2</a></h3>
                         <p>Read your messages where and when you want them!</p>
                     </div>
@@ -1133,7 +1133,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/nma.png" alt="" title="NMA"/>
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/nma.png" alt="" title="NMA"/>
                         <h3><a href="${anon_url('http://nma.usk.bz')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Notify My Android</a></h3>
                         <p>Notify My Android is a Prowl-like Android App and API that offers an easy way to send notifications from your application directly to your Android device.</p>
                     </div>
@@ -1212,7 +1212,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/pushalot.png" alt="" title="Pushalot" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/pushalot.png" alt="" title="Pushalot" />
                         <h3><a href="${anon_url('https://pushalot.com')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Pushalot</a></h3>
                         <p>Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.</p>
                     </div>
@@ -1275,7 +1275,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/pushbullet.png" alt="" title="Pushbullet" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/pushbullet.png" alt="" title="Pushbullet" />
                         <h3><a href="${anon_url('https://www.pushbullet.com')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Pushbullet</a></h3>
                         <p>Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.</p>
                     </div>
@@ -1349,7 +1349,7 @@
                 </div><!-- /pushbullet component-group //-->
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/freemobile.png" alt="" title="Free Mobile" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/freemobile.png" alt="" title="Free Mobile" />
                         <h3><a href="${anon_url('http://mobile.free.fr/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Free Mobile</a></h3>
                         <p>Free Mobile is a famous French cellular network provider.<br> It provides to their customer a free SMS API.</p>
                     </div>
@@ -1425,7 +1425,7 @@
             <div id="tabs-3">
                 <div class="component-group">
                        <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/twitter.png" alt="" title="Twitter"/>
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/twitter.png" alt="" title="Twitter"/>
                         <h3><a href="${anon_url('http://www.twitter.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Twitter</a></h3>
                         <p>A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.</p>
                     </div>
@@ -1527,7 +1527,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/trakt.png" alt="" title="Trakt"/>
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/trakt.png" alt="" title="Trakt"/>
                         <h3><a href="${anon_url('http://trakt.tv/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Trakt</a></h3>
                         <p>trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!</p>
                     </div>
@@ -1688,7 +1688,7 @@
 
                 <div class="component-group">
                     <div class="component-group-desc">
-                        <img class="notifier-icon" src="${sbRoot}/images/notifiers/email.png" alt="" title="Email" />
+                        <img class="notifier-icon" src="${srRoot}/images/notifiers/email.png" alt="" title="Email" />
                         <h3><a href="${anon_url('http://en.wikipedia.org/wiki/Comparison_of_webmail_providers')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Email</a></h3>
                         <p>Allows configuration of email notifications on a per show basis.</p>
                     </div>
diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako
index fd2240da6fa8c1a677744d3c66fe263db489b916..66ba675fa6351ed0fb14f24e9cececa0b802482f 100644
--- a/gui/slick/views/config_postProcessing.mako
+++ b/gui/slick/views/config_postProcessing.mako
@@ -11,12 +11,9 @@
 %>
 
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configPostProcessing.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
-<script type="text/javascript">
-    $('#config-components').tabs();
-    $('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' });
-</script>
+<script type="text/javascript" src="${srRoot}/js/configPostProcessing.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/home.js"></script>
 </%block>
 <%block name="content">
 <div id="content960">
@@ -300,7 +297,7 @@
                                     </span>
                                     <span class="component-desc">
                                         <input type="text" name="naming_pattern" id="naming_pattern" value="${sickbeard.NAMING_PATTERN}" class="form-control input-sm input350" />
-                                        <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_key" title="Toggle Naming Legend" class="legend" class="legend" />
+                                        <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_key" title="Toggle Naming Legend" class="legend" class="legend" />
                                     </span>
                                 </label>
                                 <label class="nocheck">
@@ -410,17 +407,17 @@
                                           <td>720p_BluRay</td>
                                         </tr>
                                         <tr class="even">
-                                          <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
+                                          <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
                                           <td>%RN</td>
                                           <td>Show.Name.S02E03.HDTV.XviD-RLSGROUP</td>
                                         </tr>
                                         <tr>
-                                          <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
+                                          <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
                                           <td>%RG</td>
                                           <td>RLSGROUP</td>
                                         </tr>
                                         <tr class="even">
-                                          <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
+                                          <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
                                           <td>%RT</td>
                                           <td>PROPER</td>
                                         </tr>
@@ -507,7 +504,7 @@
                                         </span>
                                         <span class="component-desc">
                                             <input type="text" name="naming_abd_pattern" id="naming_abd_pattern" value="${sickbeard.NAMING_ABD_PATTERN}" class="form-control input-sm input350" />
-                                            <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_abd_key" title="Toggle ABD Naming Legend" class="legend" />
+                                            <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_abd_key" title="Toggle ABD Naming Legend" class="legend" />
                                         </span>
                                     </label>
                                 </div>
@@ -618,17 +615,17 @@
                                               <td>09</td>
                                             </tr>
                                             <tr>
-                                              <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
                                               <td>%RN</td>
                                               <td>Show.Name.2010.03.09.HDTV.XviD-RLSGROUP</td>
                                             </tr>
                                             <tr class="even">
-                                              <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
                                               <td>%RG</td>
                                               <td>RLSGROUP</td>
                                             </tr>
                                             <tr>
-                                              <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
                                               <td>%RT</td>
                                               <td>PROPER</td>
                                             </tr>
@@ -684,7 +681,7 @@
                                         </span>
                                         <span class="component-desc">
                                             <input type="text" name="naming_sports_pattern" id="naming_sports_pattern" value="${sickbeard.NAMING_SPORTS_PATTERN}" class="form-control input-sm input350" />
-                                            <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_sports_key" title="Toggle Sports Naming Legend" class="legend" />
+                                            <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_sports_key" title="Toggle Sports Naming Legend" class="legend" />
                                         </span>
                                     </label>
                                 </div>
@@ -795,17 +792,17 @@
                                               <td>09</td>
                                             </tr>
                                             <tr>
-                                              <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
                                               <td>%RN</td>
                                               <td>Show.Name.9th.Mar.2011.HDTV.XviD-RLSGROUP</td>
                                             </tr>
                                             <tr class="even">
-                                              <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
                                               <td>%RG</td>
                                               <td>RLSGROUP</td>
                                             </tr>
                                             <tr>
-                                              <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
                                               <td>%RT</td>
                                               <td>PROPER</td>
                                             </tr>
@@ -862,7 +859,7 @@
                                         </span>
                                         <span class="component-desc">
                                             <input type="text" name="naming_anime_pattern" id="naming_anime_pattern" value="${sickbeard.NAMING_ANIME_PATTERN}" class="form-control input-sm input350" />
-                                            <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_anime_key" title="Toggle Anime Naming Legend" class="legend" />
+                                            <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_anime_key" title="Toggle Anime Naming Legend" class="legend" />
                                         </span>
                                     </label>
                                 </div>
@@ -968,17 +965,17 @@
                                               <td>720p_BluRay</td>
                                             </tr>
                                             <tr class="even">
-                                              <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td>
                                               <td>%RN</td>
                                               <td>Show.Name.S02E03.HDTV.XviD-RLSGROUP</td>
                                             </tr>
                                             <tr>
-                                              <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td>
                                               <td>%RG</td>
                                               <td>RLSGROUP</td>
                                             </tr>
                                             <tr class="even">
-                                              <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
+                                              <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td>
                                               <td>%RT</td>
                                               <td>PROPER</td>
                                             </tr>
diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako
index 09ed191ad52e1cc9cbfcaac45c865a42fee832c6..365951b34703c320827b0b3f98ae46a4aeb695f0 100644
--- a/gui/slick/views/config_providers.mako
+++ b/gui/slick/views/config_providers.mako
@@ -7,8 +7,8 @@
 
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configProviders.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/configProviders.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
 <script type="text/javascript">
 $(document).ready(function(){
     % if sickbeard.USE_NZBS:
@@ -57,7 +57,7 @@ $('#config-components').tabs();
                         <p>At least one provider is required but two are recommended.</p>
 
                         % if not sickbeard.USE_NZBS or not sickbeard.USE_TORRENTS:
-                        <blockquote style="margin: 20px 0;">NZB/Torrent providers can be toggled in <b><a href="${sbRoot}/config/search">Search Settings</a></b></blockquote>
+                        <blockquote style="margin: 20px 0;">NZB/Torrent providers can be toggled in <b><a href="${srRoot}/config/search">Search Settings</a></b></blockquote>
                         % else:
                         <br/>
                         % endif
@@ -81,7 +81,7 @@ $('#config-components').tabs();
                             %>
                             <li class="ui-state-default ${('nzb-provider', 'torrent-provider')[bool(curProvider.providerType == "torrent")]}" id="${curName}">
                                 <input type="checkbox" id="enable_${curName}" class="provider_enabler" ${('', 'checked="checked"')[curProvider.isEnabled() == True]}/>
-                                <a href="${anon_url(curProvider.url)}" class="imgLink" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><img src="${sbRoot}/images/providers/${curProvider.imageName()}" alt="${curProvider.name}" title="${curProvider.name}" width="16" height="16" style="vertical-align:middle;"/></a>
+                                <a href="${anon_url(curProvider.url)}" class="imgLink" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><img src="${srRoot}/images/providers/${curProvider.imageName()}" alt="${curProvider.name}" title="${curProvider.name}" width="16" height="16" style="vertical-align:middle;"/></a>
                                 <span style="vertical-align:middle;">${curProvider.name}</span>
                                 ${('*', '')[bool(curProvider.supportsBacklog)]}
                                 <span class="ui-icon ui-icon-arrowthick-2-n-s pull-right" style="vertical-align:middle;"></span>
diff --git a/gui/slick/views/config_search.mako b/gui/slick/views/config_search.mako
index 814d374eff34705e6297cd2cbd4ecfa11de0dbcd..8e74093c3c99014ca985b861de20a13ebf9d9f1d 100644
--- a/gui/slick/views/config_search.mako
+++ b/gui/slick/views/config_search.mako
@@ -4,15 +4,9 @@
     from sickbeard import clients
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configSearch.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script>
-<script type="text/javascript" charset="utf-8">
-    $('#config-components').tabs();
-    $('#nzb_dir').fileBrowser({ title: 'Select .nzb black hole/watch location' });
-    $('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' });
-    $('#torrent_path').fileBrowser({ title: 'Select .torrent download location' });
-    $('#tv_download_dir').fileBrowser({ title: 'Select TV download location' });
-</script>
+<script type="text/javascript" src="${srRoot}/js/configSearch.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/config_search.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -38,7 +32,7 @@
 
                     <div class="component-group-desc">
                         <h3>Episode Search</h3>
-                        <p>How to manage searching with <a href="${sbRoot}/config/providers">providers</a>.</p>
+                        <p>How to manage searching with <a href="${srRoot}/config/providers">providers</a>.</p>
                     </div>
 
                     <fieldset class="component-group-list">
diff --git a/gui/slick/views/config_subtitles.mako b/gui/slick/views/config_subtitles.mako
index 93104adf0d2cb523dd105543cf93ca385de3e071..3adac686d3b262e37a0799629cbcdfc7f69c0a23 100644
--- a/gui/slick/views/config_subtitles.mako
+++ b/gui/slick/views/config_subtitles.mako
@@ -4,24 +4,26 @@
     import sickbeard
     from sickbeard.helpers import anon_url
 %>
+<%block name="metas">
+## <meta data-var="subtitles.subtitleLanguageFilter" data-content="${','.join("{id: " + lang.opensubtitles + ", name: " + lang.name + "}" for lang in subtitles.subtitleLanguageFilter())}">
+## <meta data-var="prePopulate" data-content="${','.join("{id: " + subtitles.fromietf(lang).opensubtitles + ", name: " + subtitles.fromietf(lang).name + "}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}">
+</%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/configSubtitles.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/config.js"></script>
-<script type="text/javascript" src="${sbRoot}/js/lib/jquery.tokeninput.js"></script>
-<script type="text/javascript">
-    $(document).ready(function() {
-        $("#subtitles_languages").tokenInput(
-                [${",\r\n".join("{id: \"" + lang.opensubtitles + "\", name: \"" + lang.name + "\"}" for lang in subtitles.subtitleLanguageFilter())}],
-                {
-                    method: "POST",
-                    hintText: "Write to search a language and select it",
-                    preventDuplicates: true,
-                    prePopulate: [${",\r\n".join("{id: \"" + subtitles.fromietf(lang).opensubtitles + "\", name: \"" + subtitles.fromietf(lang).name + "\"}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}]
-                }
-            );
+<script type="text/javascript" src="${srRoot}/js/configSubtitles.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/config.js"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/jquery.tokeninput.js"></script>
+## <script type="text/javascript" src="${srRoot}/js/new/config_subtitles.js"></script>
+<script>
+$(document).ready(function() {
+    $("#subtitles_languages").tokenInput([${','.join("{\"id\": \"" + lang.opensubtitles + "\", name: \"" + lang.name + "\"}" for lang in subtitles.subtitleLanguageFilter())}], {
+        method: "POST",
+        hintText: "Write to search a language and select it",
+        preventDuplicates: true,
+        prePopulate: [${','.join("{\"id\": \"" + subtitles.fromietf(lang).opensubtitles + "\", name: \"" + subtitles.fromietf(lang).name + "\"}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}]
     });
-    $('#config-components').tabs();
-    $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' });
+});
+$('#config-components').tabs();
+$('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' });
 </script>
 </%block>
 <%block name="content">
@@ -160,7 +162,7 @@
                             <li class="ui-state-default" id="${curService['name']}">
                                 <input type="checkbox" id="enable_${curService['name']}" class="service_enabler" ${('', 'checked="checked"')[curService['enabled'] == True]}/>
                                 <a href="${anon_url(curService['url'])}" class="imgLink" target="_new">
-                                    <img src="${sbRoot}/images/subtitles/${curService['image']}" alt="${curService['url']}" title="${curService['url']}" width="16" height="16" style="vertical-align:middle;"/>
+                                    <img src="${srRoot}/images/subtitles/${curService['image']}" alt="${curService['url']}" title="${curService['url']}" width="16" height="16" style="vertical-align:middle;"/>
                                 </a>
                             <span style="vertical-align:middle;">${curService['name'].capitalize()}</span>
                             <span class="ui-icon ui-icon-arrowthick-2-n-s pull-right" style="vertical-align:middle;"></span>
diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako
index c80df153f9f7da47ff1250464a58fa6c0188cea0..b1914a82307c2e9b22b04462189397a350ead244 100644
--- a/gui/slick/views/displayShow.mako
+++ b/gui/slick/views/displayShow.mako
@@ -11,70 +11,23 @@
     from sickbeard.common import Quality, qualityPresets, statusStrings, Overview
 
     from sickbeard.helpers import anon_url
-
-    fuzzydate = 'airdate'
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/displayShow.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/sceneExceptionsTooltip.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/ratingTooltip.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/ajaxEpSearch.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/ajaxEpSubtitles.js?${sbPID}"></script>
-<script type="text/javascript" charset="utf-8">
-$(document).ready(function(){
-    % if sickbeard.FUZZY_DATING:
-    fuzzyMoment({
-        containerClass : '.${fuzzydate}',
-        dateHasTime : false,
-        dateFormat : '${sickbeard.DATE_PRESET}',
-        timeFormat : '${sickbeard.TIME_PRESET}',
-        trimZero : ${("false", "true")[bool(sickbeard.TRIM_ZERO)]}
-    });
-    % endif
-    $('.addQTip').each(function () {
-        $(this).css({'cursor':'help', 'text-shadow':'0px 0px 0.5px #666'});
-        $(this).qtip({
-            show: {solo:true},
-            position: {viewport:$(window), my:'left center', adjust:{ y: -10, x: 2 }},
-            style: {tip:{corner:true, method:'polygon'}, classes:'qtip-rounded qtip-shadow ui-tooltip-sb'}
-        });
-    });
-    $.fn.generateStars = function() {
-        return this.each(function(i,e){$(e).html($('<span/>').width($(e).text()*12));});
-    };
-
-    $('.imdbstars').generateStars();
-
-    $("${('#showTable', '#animeTable')[bool(show.is_anime)]}").tablesorter({
-        widgets: ['saveSort', 'stickyHeaders', 'columnSelector'],
-        widgetOptions : {
-            columnSelector_saveColumns: true,
-            columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>',
-            columnSelector_mediaquery: false,
-            columnSelector_cssChecked : 'checked'
-        },
-    });
-
-    $('#popover').popover({
-        placement: 'bottom',
-        html: true, // required if content has HTML
-        content: '<div id="popover-target"></div>'
-    })
-    // bootstrap popover event triggered when the popover opens
-    .on('shown.bs.popover', function () {
-        $.tablesorter.columnSelector.attachTo( $("${('#showTable', '#animeTable')[bool(show.is_anime)]}"), '#popover-target');
-    });
-});
-</script>
+<script type="text/javascript" src="${srRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/displayShow.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/sceneExceptionsTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/ratingTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/ajaxEpSearch.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/ajaxEpSubtitles.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/displayShow.js"></script>
 </%block>
 <%block name="content">
 <%namespace file="/inc_defs.mako" import="renderQualityPill"/>
-<input type="hidden" id="sbRoot" value="${sbRoot}" />
+<input type="hidden" id="srRoot" value="${srRoot}" />
     <div class="pull-left form-inline">
         Change Show:
-        <div class="navShow"><img id="prevShow" src="${sbRoot}/images/prev.png" alt="&lt;&lt;" title="Prev Show" /></div>
+        <div class="navShow"><img id="prevShow" src="${srRoot}/images/prev.png" alt="&lt;&lt;" title="Prev Show" /></div>
             <select id="pickShow" class="form-control form-control-inline input-sm">
             % for curShowList in sortedShowLists:
                 <% curShowType = curShowList[0] %>
@@ -91,7 +44,7 @@ $(document).ready(function(){
                 % endif
             % endfor
             </select>
-        <div class="navShow"><img id="nextShow" src="${sbRoot}/images/next.png" alt="&gt;&gt;" title="Next Show" /></div>
+        <div class="navShow"><img id="nextShow" src="${srRoot}/images/next.png" alt="&gt;&gt;" title="Next Show" /></div>
     </div>
 
     <div class="clearfix"></div>
@@ -113,7 +66,7 @@ $(document).ready(function(){
         <span class="h2footer displayspecials pull-right">
             % if season_special:
             Display Specials:
-                <a class="inner" href="${sbRoot}/toggleDisplayShowSpecials/?show=${show.indexerid}">${('Show', 'Hide')[bool(sickbeard.DISPLAY_SHOW_SPECIALS)]}</a>
+                <a class="inner" href="${srRoot}/toggleDisplayShowSpecials/?show=${show.indexerid}">${('Show', 'Hide')[bool(sickbeard.DISPLAY_SHOW_SPECIALS)]}</a>
             % endif
         </span>
 
@@ -155,7 +108,7 @@ $(document).ready(function(){
 
     <div id="container">
         <div id="posterCol">
-            <a href="${sbRoot}/showPoster/?show=${show.indexerid}&amp;which=poster" rel="dialog" title="View Poster for ${show.name}"><img src="${sbRoot}/showPoster/?show=${show.indexerid}&amp;which=poster_thumb" class="tvshowImg" alt=""/></a>
+            <a href="${srRoot}/showPoster/?show=${show.indexerid}&amp;which=poster" rel="dialog" title="View Poster for ${show.name}"><img src="${srRoot}/showPoster/?show=${show.indexerid}&amp;which=poster_thumb" class="tvshowImg" alt=""/></a>
         </div>
 
         <div id="showCol">
@@ -172,17 +125,17 @@ $(document).ready(function(){
 % else:
     % if 'country_codes' in show.imdb_info:
         % for country in show.imdb_info['country_codes'].split('|'):
-                <img src="${sbRoot}/images/blank.png" class="country-flag flag-${country}" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" />
+                <img src="${srRoot}/images/blank.png" class="country-flag flag-${country}" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" />
         % endfor
     % endif
     % if 'year' in show.imdb_info:
                 <span>(${show.imdb_info['year']}) - ${show.imdb_info['runtimes']} minutes - </span>
     % endif
-                <a href="${anon_url('http://www.imdb.com/title/', _show.imdbid)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://www.imdb.com/title/${show.imdbid}"><img alt="[imdb]" height="16" width="16" src="${sbRoot}/images/imdb.png" style="margin-top: -1px; vertical-align:middle;"/></a>
+                <a href="${anon_url('http://www.imdb.com/title/', _show.imdbid)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://www.imdb.com/title/${show.imdbid}"><img alt="[imdb]" height="16" width="16" src="${srRoot}/images/imdb.png" style="margin-top: -1px; vertical-align:middle;"/></a>
 % endif
-                <a href="${anon_url(sickbeard.indexerApi(_show.indexer).config['show_url'], _show.indexerid)}" onclick="window.open(this.href, '_blank'); return false;" title="${sickbeard.indexerApi(show.indexer).config["show_url"] + str(show.indexerid)}"><img alt="${sickbeard.indexerApi(show.indexer).name}" height="16" width="16" src="${sbRoot}/images/${sickbeard.indexerApi(show.indexer).config["icon"]}" style="margin-top: -1px; vertical-align:middle;"/></a>
+                <a href="${anon_url(sickbeard.indexerApi(_show.indexer).config['show_url'], _show.indexerid)}" onclick="window.open(this.href, '_blank'); return false;" title="${sickbeard.indexerApi(show.indexer).config["show_url"] + str(show.indexerid)}"><img alt="${sickbeard.indexerApi(show.indexer).name}" height="16" width="16" src="${srRoot}/images/${sickbeard.indexerApi(show.indexer).config["icon"]}" style="margin-top: -1px; vertical-align:middle;"/></a>
 % if xem_numbering or xem_absolute_numbering:
-                <a href="${anon_url('http://thexem.de/search?q=', _show.name)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://thexem.de/search?q-${show.name}"><img alt="[xem]" height="16" width="16" src="${sbRoot}/images/xem.png" style="margin-top: -1px; vertical-align:middle;"/></a>
+                <a href="${anon_url('http://thexem.de/search?q=', _show.name)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://thexem.de/search?q-${show.name}"><img alt="[xem]" height="16" width="16" src="${srRoot}/images/xem.png" style="margin-top: -1px; vertical-align:middle;"/></a>
 % endif
             </div>
 
@@ -257,19 +210,19 @@ $(document).ready(function(){
 
                 <table style="width:180px; float: right; vertical-align: middle; height: 100%;">
                     <% info_flag = subtitles.fromietf(show.lang).opensubtitles if show.lang else '' %>
-                    <tr><td class="showLegend">Info Language:</td><td><img src="${sbRoot}/images/subtitles/flags/${info_flag}.png" width="16" height="11" alt="${show.lang}" title="${show.lang}" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';"/></td></tr>
+                    <tr><td class="showLegend">Info Language:</td><td><img src="${srRoot}/images/subtitles/flags/${info_flag}.png" width="16" height="11" alt="${show.lang}" title="${show.lang}" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';"/></td></tr>
                     % if sickbeard.USE_SUBTITLES:
-                    <tr><td class="showLegend">Subtitles: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.subtitles)]}" alt="${("N", "Y")[bool(show.subtitles)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Subtitles: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.subtitles)]}" alt="${("N", "Y")[bool(show.subtitles)]}" width="16" height="16" /></td></tr>
                     % endif
-                    <tr><td class="showLegend">Flat Folders: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" alt=="${("N", "Y")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" width="16" height="16" /></td></tr>
-                    <tr><td class="showLegend">Paused: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.paused)]}" alt="${("N", "Y")[bool(show.paused)]}" width="16" height="16" /></td></tr>
-                    <tr><td class="showLegend">Air-by-Date: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.air_by_date)]}" alt="${("N", "Y")[bool(show.air_by_date)]}" width="16" height="16" /></td></tr>
-                    <tr><td class="showLegend">Sports: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.is_sports)]}" alt="${("N", "Y")[bool(show.is_sports)]}" width="16" height="16" /></td></tr>
-                    <tr><td class="showLegend">Anime: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.is_anime)]}" alt="${("N", "Y")[bool(show.is_anime)]}" width="16" height="16" /></td></tr>
-                    <tr><td class="showLegend">DVD Order: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.dvdorder)]}" alt="${("N", "Y")[bool(show.dvdorder)]}" width="16" height="16" /></td></tr>
-                    <tr><td class="showLegend">Scene Numbering: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.scene)]}" alt="${("N", "Y")[bool(show.scene)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Flat Folders: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" alt=="${("N", "Y")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Paused: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.paused)]}" alt="${("N", "Y")[bool(show.paused)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Air-by-Date: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.air_by_date)]}" alt="${("N", "Y")[bool(show.air_by_date)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Sports: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.is_sports)]}" alt="${("N", "Y")[bool(show.is_sports)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Anime: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.is_anime)]}" alt="${("N", "Y")[bool(show.is_anime)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">DVD Order: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.dvdorder)]}" alt="${("N", "Y")[bool(show.dvdorder)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Scene Numbering: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.scene)]}" alt="${("N", "Y")[bool(show.scene)]}" width="16" height="16" /></td></tr>
                     % if anyQualities and bestQualities:
-                    <tr><td class="showLegend">Archive First Match: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.archive_firstmatch)]}" alt="${("N", "Y")[bool(show.archive_firstmatch)]}" width="16" height="16" /></td></tr>
+                    <tr><td class="showLegend">Archive First Match: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.archive_firstmatch)]}" alt="${("N", "Y")[bool(show.archive_firstmatch)]}" width="16" height="16" /></td></tr>
                     % endif
                 </table>
             </div>
@@ -286,7 +239,7 @@ $(document).ready(function(){
         <% availableStatus.remove(FAILED) %>
         % endif
         % for curStatus in availableStatus + sorted(Quality.DOWNLOADED) + sorted(Quality.ARCHIVED):
-            % if curStatus != DOWNLOADED:
+            % if curStatus not in [DOWNLOADED, ARCHIVED]:
             <option value="${curStatus}">${statusStrings[curStatus]}</option>
             % endif
         % endfor
@@ -387,7 +340,6 @@ $(document).ready(function(){
                 % if sickbeard.DISPLAY_ALL_SEASONS == False:
                     <button id="showseason-${epResult['season']}" type="button" class="btn btn-xs pull-right" data-toggle="collapse" data-target="#collapseSeason-${epResult['season']}">Show Episodes</button>
                     <script type="text/javascript">
-                    <!--
                         $(function() {
                             $('#collapseSeason-${epResult['season']}').on('hide.bs.collapse', function () {
                                 $('#showseason-${epResult['season']}').text('Show Episodes');
@@ -396,7 +348,6 @@ $(document).ready(function(){
                                 $('#showseason-${epResult['season']}').text('Hide Episodes');
                             })
                         });
-                    //-->
                     </script>
                 % endif
             </th>
@@ -476,8 +427,8 @@ $(document).ready(function(){
                     <input type="checkbox" class="epCheck" id="${str(epResult["season"])+'x'+str(epResult["episode"])}" name="${str(epResult["season"]) +"x"+str(epResult["episode"])}" />
                 % endif
             </td>
-            <td align="center"><img src="${sbRoot}/images/${("nfo-no.gif", "nfo.gif")[epResult["hasnfo"]]}" alt="${("N", "Y")[epResult["hasnfo"]]}" width="23" height="11" /></td>
-            <td align="center"><img src="${sbRoot}/images/${("tbn-no.gif", "tbn.gif")[epResult["hastbn"]]}" alt="${("N", "Y")[epResult["hastbn"]]}" width="23" height="11" /></td>
+            <td align="center"><img src="${srRoot}/images/${("nfo-no.gif", "nfo.gif")[epResult["hasnfo"]]}" alt="${("N", "Y")[epResult["hasnfo"]]}" width="23" height="11" /></td>
+            <td align="center"><img src="${srRoot}/images/${("tbn-no.gif", "tbn.gif")[epResult["hastbn"]]}" alt="${("N", "Y")[epResult["hastbn"]]}" width="23" height="11" /></td>
             <td align="center">
             <%
                 if epLoc and show._location and epLoc.lower().startswith(show._location.lower()):
@@ -517,9 +468,9 @@ $(document).ready(function(){
             </td>
             <td class="col-name">
             % if epResult["description"] != "" and epResult["description"] != None:
-                <img src="${sbRoot}/images/info32.png" width="16" height="16" class="plotInfo" alt="" id="plot_info_${str(show.indexerid)}_${str(epResult["season"])}_${str(epResult["episode"])}" />
+                <img src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfo" alt="" id="plot_info_${str(show.indexerid)}_${str(epResult["season"])}_${str(epResult["episode"])}" />
             % else:
-                <img src="${sbRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" alt="" />
+                <img src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" alt="" />
             % endif
             ${epResult["name"]}
             </td>
@@ -540,8 +491,15 @@ $(document).ready(function(){
                     ${file_size}
                 % endif
             </td>
+            <% date = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(epResult['airdate'], show.airs, show.network)) %>
             <td class="col-airdate">
-                <span class="${fuzzydate}">${(sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(epResult['airdate'], show.airs, show.network))), 'never')[int(epResult['airdate']) == 1]}</span>
+                % if int(epResult['airdate']) != 1:
+                    <time datetime="${date.isoformat('T')}" class="date">${date}</time>
+                % else:
+                    Never
+                % endif
+                <span class="sort_data">${date.isoformat('T')}</span>
+
             </td>
             <td>
                 % if sickbeard.DOWNLOAD_URL and epResult['location']:
@@ -558,7 +516,7 @@ $(document).ready(function(){
             <td class="col-subtitles" align="center">
             % for sub_lang in [subtitles.fromietf(x) for x in epResult["subtitles"].split(',') if epResult["subtitles"]]:
                 <% flag = sub_lang.opensubtitles %>
-                <img src="${sbRoot}/images/subtitles/flags/${flag}.png" width="16" height="11" alt="${sub_lang.name}" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';" />
+                <img src="${srRoot}/images/subtitles/flags/${flag}.png" width="16" height="11" alt="${sub_lang.name}" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';" />
             % endfor
             </td>
                 <% curStatus, curQuality = Quality.splitCompositeStatus(int(epResult["status"])) %>
@@ -570,13 +528,13 @@ $(document).ready(function(){
             <td class="col-search">
                 % if int(epResult["season"]) != 0:
                     % if ( int(epResult["status"]) in Quality.SNATCHED + Quality.DOWNLOADED ) and sickbeard.USE_FAILED_DOWNLOADS:
-                        <a class="epRetry" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="retryEpisode?show=${show.indexerid}&amp;season=${epResult["season"]}&amp;episode=${epResult["episode"]}"><img src="${sbRoot}/images/search16.png" height="16" alt="retry" title="Retry Download" /></a>
+                        <a class="epRetry" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="retryEpisode?show=${show.indexerid}&amp;season=${epResult["season"]}&amp;episode=${epResult["episode"]}"><img src="${srRoot}/images/search16.png" height="16" alt="retry" title="Retry Download" /></a>
                     % else:
-                        <a class="epSearch" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="searchEpisode?show=${show.indexerid}&amp;season=${epResult["season"]}&amp;episode=${epResult["episode"]}"><img src="${sbRoot}/images/search16.png" width="16" height="16" alt="search" title="Manual Search" /></a>
+                        <a class="epSearch" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="searchEpisode?show=${show.indexerid}&amp;season=${epResult["season"]}&amp;episode=${epResult["episode"]}"><img src="${srRoot}/images/search16.png" width="16" height="16" alt="search" title="Manual Search" /></a>
                     % endif
                 % endif
                 % if sickbeard.USE_SUBTITLES and show.subtitles and epResult["location"] and frozenset(subtitles.wantedLanguages()).difference(epResult["subtitles"].split(',')):
-                    <a class="epSubtitlesSearch" href="searchEpisodeSubtitles?show=${show.indexerid}&amp;season=${epResult["season"]}&amp;episode=${epResult["episode"]}"><img src="${sbRoot}/images/closed_captioning.png" height="16" alt="search subtitles" title="Search Subtitles" /></a>
+                    <a class="epSubtitlesSearch" href="searchEpisodeSubtitles?show=${show.indexerid}&amp;season=${epResult["season"]}&amp;episode=${epResult["episode"]}"><img src="${srRoot}/images/closed_captioning.png" height="16" alt="search subtitles" title="Search Subtitles" /></a>
                 % endif
             </td>
         </tr>
diff --git a/gui/slick/views/editShow.mako b/gui/slick/views/editShow.mako
index 09e724a965f9adfffbdb714c17add6da110a52e5..411e84642ae9fefb25f3eeda8bcc5a272b0f0ea2 100644
--- a/gui/slick/views/editShow.mako
+++ b/gui/slick/views/editShow.mako
@@ -12,11 +12,11 @@
 <meta data-var="show.is_anime" data-content="${show.is_anime}">
 </%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/editShow.js"></script>
+<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/editShow.js"></script>
 % if show.is_anime:
-    <script type="text/javascript" src="${sbRoot}/js/blackwhite.js?${sbPID}"></script>
+    <script type="text/javascript" src="${srRoot}/js/blackwhite.js?${sbPID}"></script>
 % endif
 </%block>
 <%block name="content">
@@ -68,7 +68,7 @@ This will <b>affect the episode show search</b> on nzb and torrent provider.<br
 <b>Default Episode Status:</b><br />
 (this will set the status for future episodes)<br />
 <select name="defaultEpStatus" id="defaultEpStatusSelect" class="form-control form-control-inline input-sm">
-    % for curStatus in [WANTED, SKIPPED, ARCHIVED, IGNORED]:
+    % for curStatus in [WANTED, SKIPPED, IGNORED]:
     <option value="${curStatus}" ${('', 'selected="selected"')[curStatus == show.default_ep_status]}>${statusStrings[curStatus]}</option>
     % endfor
 </select><br />
diff --git a/gui/slick/views/errorlogs.mako b/gui/slick/views/errorlogs.mako
index 70b3f02b8eb41a70c5498aa8fc7a4f8754ffd634..3a397330a690d1a07dbad22e4a9304afeff4e7f7 100644
--- a/gui/slick/views/errorlogs.mako
+++ b/gui/slick/views/errorlogs.mako
@@ -5,9 +5,7 @@
     from sickbeard.logger import reverseNames
 %>
 <%block name="scripts">
-<script type="text/javascript" charset="utf-8">
-window.setInterval( "location.reload(true)", 600000); // Refresh every 10 minutes
-</script>
+<script type="text/javascript" src="${srRoot}/js/new/errorlogs.js"></script>
 </%block>
 <%block name="content">
 <h1 class="header">${title}</h1>
diff --git a/gui/slick/views/history.mako b/gui/slick/views/history.mako
index 3a603206118cb526ab7a1a7985f490a2549814c4..3092a237eb903ffda1fafd432389ab3368bbea1e 100644
--- a/gui/slick/views/history.mako
+++ b/gui/slick/views/history.mako
@@ -17,8 +17,6 @@
 
     layout = sickbeard.HISTORY_LAYOUT
     history_limit = sickbeard.HISTORY_LIMIT
-
-    fuzzydate = 'airdate'
 %>
 <%block name="css">
 <style type="text/css">
@@ -28,11 +26,9 @@
 <%block name="metas">
 <meta data-var="sickbeard.FUZZY_DATING" data-content="${sickbeard.FUZZY_DATING}">
 <meta data-var="layout" data-content="${layout}">
-<meta data-var="fuzzydate" data-content="${fuzzydate}">
 </%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/lib/jquery.timeago.js"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/history.js"></script>
+<script type="text/javascript" src="${srRoot}/js/new/history.js"></script>
 </%block>
 <%block name="content">
 <%namespace file="/inc_defs.mako" import="renderQualityPill"/>
@@ -54,8 +50,8 @@
 
     <span> Layout:
         <select name="HistoryLayout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
-            <option value="${sbRoot}/setHistoryLayout/?layout=compact"  ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'compact']}>Compact</option>
-            <option value="${sbRoot}/setHistoryLayout/?layout=detailed" ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'detailed']}>Detailed</option>
+            <option value="${srRoot}/setHistoryLayout/?layout=compact"  ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'compact']}>Compact</option>
+            <option value="${srRoot}/setHistoryLayout/?layout=detailed" ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'detailed']}>Detailed</option>
         </select>
     </span>
 </div>
@@ -83,12 +79,15 @@
         % for hItem in historyResults:
             <% curStatus, curQuality = Quality.splitCompositeStatus(int(hItem["action"])) %>
             <tr>
-                <% curdatetime = datetime.datetime.strptime(str(hItem["date"]), History.date_format) %>
-                <td align="center"><div class="${fuzzydate}">${sbdatetime.sbdatetime.sbfdatetime(curdatetime, show_seconds=True)}</div><span class="sort_data">${time.mktime(curdatetime.timetuple())}</span></td>
-                <td class="tvShow" width="35%"><a href="${sbRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])} ${('', '<span class="quality Proper">Proper</span>')["proper" in hItem["resource"].lower() or "repack" in hItem["resource"].lower()]}</a></td>
+                <td align="center">
+                    <% airDate = sbdatetime.sbdatetime.sbfdatetime(datetime.datetime.strptime(str(hItem["date"]), History.date_format), show_seconds=True) %>
+                    <% isoDate = datetime.datetime.strptime(str(hItem["date"]), History.date_format).isoformat('T') %>
+                    <time datetime="${isoDate}" class="date">${airDate}</time>
+                </td>
+                <td class="tvShow" width="35%"><a href="${srRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])} ${('', '<span class="quality Proper">Proper</span>')["proper" in hItem["resource"].lower() or "repack" in hItem["resource"].lower()]}</a></td>
                 <td align="center" ${('', 'class="subtitles_column"')[curStatus == SUBTITLED]}>
                 % if curStatus == SUBTITLED:
-                    <img width="16" height="11" style="vertical-align:middle;" src="${sbRoot}/images/subtitles/flags/${hItem['resource']}.png" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';">
+                    <img width="16" height="11" style="vertical-align:middle;" src="${srRoot}/images/subtitles/flags/${hItem['resource']}.png" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';">
                 % endif
                     <span style="cursor: help; vertical-align:middle;" title="${os.path.basename(hItem['resource'])}">${statusStrings[curStatus]}</span>
                 </td>
@@ -102,12 +101,12 @@
                         % if curStatus in [SNATCHED, FAILED]:
                             <% provider = providers.getProviderClass(generic.GenericProvider.makeID(hItem["provider"])) %>
                             % if provider != None:
-                                <img src="${sbRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${provider.name}</span>
+                                <img src="${srRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${provider.name}</span>
                             % else:
-                                <img src="${sbRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" title="missing provider"/> <span style="vertical-align:middle;">Missing Provider</span>
+                                <img src="${srRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" title="missing provider"/> <span style="vertical-align:middle;">Missing Provider</span>
                             % endif
                         % else:
-                                <img src="${sbRoot}/images/subtitles/${hItem['provider']}.png" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${hItem["provider"].capitalize()}</span>
+                                <img src="${srRoot}/images/subtitles/${hItem['provider']}.png" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${hItem["provider"].capitalize()}</span>
                         % endif
                     % endif
                 % endif
@@ -143,10 +142,13 @@
         <tbody>
         % for hItem in compactResults:
             <tr>
-                <% curdatetime = datetime.datetime.strptime(str(hItem["actions"][0]["time"]), History.date_format) %>
-                <td align="center"><div class="${fuzzydate}">${sbdatetime.sbdatetime.sbfdatetime(curdatetime, show_seconds=True)}</div><span class="sort_data">${time.mktime(curdatetime.timetuple())}</span></td>
+                <td align="center">
+                    <% airDate = sbdatetime.sbdatetime.sbfdatetime(datetime.datetime.strptime(str(hItem["actions"][0]["time"]), History.date_format), show_seconds=True) %>
+                    <% isoDate = datetime.datetime.strptime(str(hItem["actions"][0]["time"]), History.date_format).isoformat('T') %>
+                    <time datetime="${isoDate}" class="date">${airDate}</time>
+                </td>
                 <td class="tvShow" width="25%">
-                    <span><a href="${sbRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])}${('', ' <span class="quality Proper">Proper</span>')['proper' in hItem["resource"].lower() or 'repack' in hItem["resource"].lower()]}</a></span>
+                    <span><a href="${srRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])}${('', ' <span class="quality Proper">Proper</span>')['proper' in hItem["resource"].lower() or 'repack' in hItem["resource"].lower()]}</a></span>
                 </td>
                 <td align="center" provider="${str(sorted(hItem["actions"])[0]["provider"])}">
                     % for action in sorted(hItem["actions"]):
@@ -154,9 +156,9 @@
                         % if curStatus in [SNATCHED, FAILED]:
                             <% provider = providers.getProviderClass(generic.GenericProvider.makeID(action["provider"])) %>
                             % if provider != None:
-                                <img src="${sbRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" alt="${provider.name}" style="cursor: help;" title="${provider.name}: ${os.path.basename(action["resource"])}"/>
+                                <img src="${srRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" alt="${provider.name}" style="cursor: help;" title="${provider.name}: ${os.path.basename(action["resource"])}"/>
                             % else:
-                                <img src="${sbRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" alt="missing provider" title="missing provider"/>
+                                <img src="${srRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" alt="missing provider" title="missing provider"/>
                             % endif
                         % endif
                     % endfor
@@ -178,9 +180,9 @@
                     % for action in sorted(hItem["actions"]):
                         <% curStatus, curQuality = Quality.splitCompositeStatus(int(action["action"])) %>
                         % if curStatus == SUBTITLED:
-                            <img src="${sbRoot}/images/subtitles/${action['provider']}.png" width="16" height="16" style="vertical-align:middle;" alt="${action["provider"]}" title="${action["provider"].capitalize()}: ${os.path.basename(action["resource"])}"/>
+                            <img src="${srRoot}/images/subtitles/${action['provider']}.png" width="16" height="16" style="vertical-align:middle;" alt="${action["provider"]}" title="${action["provider"].capitalize()}: ${os.path.basename(action["resource"])}"/>
                             <span style="vertical-align:middle;"> / </span>
-                            <img width="16" height="11" style="vertical-align:middle;" src="${sbRoot}/images/subtitles/flags/${action['resource']}.png" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';" style="vertical-align: middle !important;">
+                            <img width="16" height="11" style="vertical-align:middle;" src="${srRoot}/images/subtitles/flags/${action['resource']}.png" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';" style="vertical-align: middle !important;">
                             &nbsp;
                         % endif
                     % endfor
diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako
index b6d954ca0505e3420c88ed5a5d774acc4ed08c1a..726cf77eace291acaf9a71ed07b5db75a0ff7191 100644
--- a/gui/slick/views/home.mako
+++ b/gui/slick/views/home.mako
@@ -11,10 +11,9 @@
     myDB = db.DBConnection()
     today = str(datetime.date.today().toordinal())
     layout = sickbeard.HOME_LAYOUT
-    fuzzydate = 'airdate'
 
     status_quality  = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')'
-    status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + [ARCHIVED]]) + ')'
+    status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + Quality.ARCHIVED]) + ')'
 
     sql_statement  = 'SELECT showid, '
 
@@ -52,11 +51,9 @@
 <meta data-var="sickbeard.TRIM_ZERO" data-content="${sickbeard.TRIM_ZERO}">
 <meta data-var="max_download_count" data-content="${max_download_count}">
 <meta data-var="layout" data-content="${layout}">
-<meta data-var="fuzzydate" data-content="${fuzzydate}">
 </%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/lib/jquery.timeago.js"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/home.js"></script>
+<script type="text/javascript" src="${srRoot}/js/new/home.js"></script>
 </%block>
 <%block name="content">
 <%namespace file="/inc_defs.mako" import="renderQualityPill"/>
@@ -72,10 +69,10 @@
     % endif
     <span> Layout:
         <select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
-            <option value="${sbRoot}/setHomeLayout/?layout=poster" ${('', 'selected="selected"')[layout == 'poster']}>Poster</option>
-            <option value="${sbRoot}/setHomeLayout/?layout=small" ${('', 'selected="selected"')[layout == 'small']}>Small Poster</option>
-            <option value="${sbRoot}/setHomeLayout/?layout=banner" ${('', 'selected="selected"')[layout == 'banner']}>Banner</option>
-            <option value="${sbRoot}/setHomeLayout/?layout=simple" ${('', 'selected="selected"')[layout == 'simple']}>Simple</option>
+            <option value="${srRoot}/setHomeLayout/?layout=poster" ${('', 'selected="selected"')[layout == 'poster']}>Poster</option>
+            <option value="${srRoot}/setHomeLayout/?layout=small" ${('', 'selected="selected"')[layout == 'small']}>Small Poster</option>
+            <option value="${srRoot}/setHomeLayout/?layout=banner" ${('', 'selected="selected"')[layout == 'banner']}>Banner</option>
+            <option value="${srRoot}/setHomeLayout/?layout=simple" ${('', 'selected="selected"')[layout == 'simple']}>Simple</option>
         </select>
         % if layout != 'poster':
         Search:
@@ -88,17 +85,17 @@
     &nbsp;
     <span> Sort By:
         <select id="postersort" class="form-control form-control-inline input-sm">
-            <option value="name" data-sort="${sbRoot}/setPosterSortBy/?sort=name" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'name']}>Name</option>
-            <option value="date" data-sort="${sbRoot}/setPosterSortBy/?sort=date" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'date']}>Next Episode</option>
-            <option value="network" data-sort="${sbRoot}/setPosterSortBy/?sort=network" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'network']}>Network</option>
-            <option value="progress" data-sort="${sbRoot}/setPosterSortBy/?sort=progress" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'progress']}>Progress</option>
+            <option value="name" data-sort="${srRoot}/setPosterSortBy/?sort=name" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'name']}>Name</option>
+            <option value="date" data-sort="${srRoot}/setPosterSortBy/?sort=date" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'date']}>Next Episode</option>
+            <option value="network" data-sort="${srRoot}/setPosterSortBy/?sort=network" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'network']}>Network</option>
+            <option value="progress" data-sort="${srRoot}/setPosterSortBy/?sort=progress" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'progress']}>Progress</option>
         </select>
     </span>
     &nbsp;
     <span> Sort Order:
         <select id="postersortdirection" class="form-control form-control-inline input-sm">
-            <option value="true" data-sort="${sbRoot}/setPosterSortDir/?direction=1" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 1]}>Asc</option>
-            <option value="false" data-sort="${sbRoot}/setPosterSortDir/?direction=0" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 0]}>Desc</option>
+            <option value="true" data-sort="${srRoot}/setPosterSortDir/?direction=1" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 1]}>Asc</option>
+            <option value="false" data-sort="${srRoot}/setPosterSortDir/?direction=0" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 0]}>Desc</option>
         </select>
     </span>
     &nbsp;
@@ -118,7 +115,7 @@
 % for curLoadingShow in sickbeard.showQueueScheduler.action.loadingShowList:
     % if curLoadingShow.show == None:
         <div class="show" data-name="0" data-date="010101" data-network="0" data-progress="101">
-            <img alt="" title="${curLoadingShow.show_name}" class="show-image" style="border-bottom: 1px solid #111;" src="${sbRoot}/images/poster.png" />
+            <img alt="" title="${curLoadingShow.show_name}" class="show-image" style="border-bottom: 1px solid #111;" src="${srRoot}/images/poster.png" />
             <div class="show-details">
                 <div class="show-add">Loading... (${curLoadingShow.show_name})</div>
             </div>
@@ -192,7 +189,7 @@
 %>
     <div class="show" id="show${curShow.indexerid}" data-name="${curShow.name}" data-date="${data_date}" data-network="${curShow.network}" data-progress="${progressbar_percent}">
         <div class="show-image">
-            <a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}"><img alt="" class="show-image" src="${sbRoot}/showPoster/?show=${curShow.indexerid}&amp;which=poster_thumb" /></a>
+            <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}"><img alt="" class="show-image" src="${srRoot}/showPoster/?show=${curShow.indexerid}&amp;which=poster_thumb" /></a>
         </div>
 
         <div class="progressbar hidden-print" style="position:relative;" data-show-id="${curShow.indexerid}" data-progress-percentage="${progressbar_percent}"></div>
@@ -204,7 +201,6 @@
         <div class="show-date">
 % if cur_airs_next:
     <% ldatetime = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(cur_airs_next, curShow.airs, curShow.network)) %>
-    <span class="${fuzzydate}">
     <%
         try:
             out = str(sbdatetime.sbdatetime.sbfdate(ldatetime))
@@ -213,7 +209,6 @@
             pass
     %>
         ${out}
-    </span>
 % else:
     <%
     output_html = '?'
@@ -237,9 +232,9 @@
                 <td class="show-table">
                     % if layout != 'simple':
                         % if curShow.network:
-                            <span title="${curShow.network}"><img class="show-network-image" src="${sbRoot}/showPoster/?show=${curShow.indexerid}&amp;which=network" alt="${curShow.network}" title="${curShow.network}" /></span>
+                            <span title="${curShow.network}"><img class="show-network-image" src="${srRoot}/showPoster/?show=${curShow.indexerid}&amp;which=network" alt="${curShow.network}" title="${curShow.network}" /></span>
                         % else:
-                            <span title="No Network"><img class="show-network-image" src="${sbRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span>
+                            <span title="No Network"><img class="show-network-image" src="${srRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span>
                         % endif
                     % else:
                         <span title="${curShow.network}">${curShow.network}</span>
@@ -278,7 +273,7 @@
 
     <tfoot class="hidden-print">
         <tr>
-            <th rowspan="1" colspan="1" align="center"><a href="${sbRoot}/home/addShows/">Add ${('Show', 'Anime')[curListType == 'Anime']}</a></th>
+            <th rowspan="1" colspan="1" align="center"><a href="${srRoot}/home/addShows/">Add ${('Show', 'Anime')[curListType == 'Anime']}</a></th>
             <th>&nbsp;</th>
             <th>&nbsp;</th>
             <th>&nbsp;</th>
@@ -372,9 +367,7 @@
             <% temp_sbfdate_next = sbdatetime.sbdatetime.sbfdate(ldatetime) %>
             <% temp_timegm_next = calendar.timegm(ldatetime.timetuple()) %>
             <td align="center" class="nowrap">
-                <div class="${fuzzydate}">
-                    <time datetime="${ldatetime.isoformat('T')}" class="date">${temp_sbfdate_next}</time>
-                </div>
+                <time datetime="${ldatetime.isoformat('T')}" class="date">${temp_sbfdate_next}</time>
                 <span class="sort_data">${temp_timegm_next}</span>
             </td>
         % except ValueError:
@@ -390,9 +383,7 @@
             <% temp_sbfdate_prev = sbdatetime.sbdatetime.sbfdate(pdatetime) %>
             <% temp_timegm_prev = calendar.timegm(pdatetime.timetuple()) %>
             <td align="center" class="nowrap">
-                <div class="${fuzzydate}">
-                    <time datetime="${pdatetime.isoformat('T')}" class="date">${temp_sbfdate_prev}</time>
-                </div>
+                <time datetime="${pdatetime.isoformat('T')}" class="date">${temp_sbfdate_prev}</time>
                 <span class="sort_data">${temp_timegm_prev}</span>
             </td>
         % except ValueError:
@@ -405,31 +396,31 @@
     % if layout == 'small':
         <td class="tvShow">
             <div class="imgsmallposter ${layout}">
-                <a href="${sbRoot}/showPoster/?show=${curShow.indexerid}&amp;which=${layout}" rel="dialog" title="${curShow.name}">
-                    <img src="${sbRoot}/showPoster/?show=${curShow.indexerid}&amp;which=poster_thumb" class="${layout}" alt="${curShow.indexerid}"/>
+                <a href="${srRoot}/showPoster/?show=${curShow.indexerid}&amp;which=${layout}" rel="dialog" title="${curShow.name}">
+                    <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&amp;which=poster_thumb" class="${layout}" alt="${curShow.indexerid}"/>
                 </a>
-                <a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}" style="vertical-align: middle;">${curShow.name}</a>
+                <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}" style="vertical-align: middle;">${curShow.name}</a>
             </div>
         </td>
     % elif layout == 'banner':
         <td>
             <span style="display: none;">${curShow.name}</span>
             <div class="imgbanner ${layout}">
-                <a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">
-                <img src="${sbRoot}/showPoster/?show=${curShow.indexerid}&amp;which=banner" class="${layout}" alt="${curShow.indexerid}" title="${curShow.name}"/>
+                <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">
+                <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&amp;which=banner" class="${layout}" alt="${curShow.indexerid}" title="${curShow.name}"/>
             </div>
         </td>
     % elif layout == 'simple':
-        <td class="tvShow"><a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td>
+        <td class="tvShow"><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td>
     % endif
 
     % if layout != 'simple':
         <td align="center">
         % if curShow.network:
-            <span title="${curShow.network}" class="hidden-print"><img id="network" width="54" height="27" src="${sbRoot}/showPoster/?show=${curShow.indexerid}&amp;which=network" alt="${curShow.network}" title="${curShow.network}" /></span>
+            <span title="${curShow.network}" class="hidden-print"><img id="network" width="54" height="27" src="${srRoot}/showPoster/?show=${curShow.indexerid}&amp;which=network" alt="${curShow.network}" title="${curShow.network}" /></span>
             <span class="visible-print-inline">${curShow.network}</span>
         % else:
-            <span title="No Network" class="hidden-print"><img id="network" width="54" height="27" src="${sbRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span>
+            <span title="No Network" class="hidden-print"><img id="network" width="54" height="27" src="${srRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span>
             <span class="visible-print-inline">No Network</span>
         % endif
         </td>
@@ -453,7 +444,7 @@
 
         <td align="center">
             <% paused = int(curShow.paused) == 0 and curShow.status == 'Continuing' %>
-            <img src="${sbRoot}/images/${('no16.png', 'yes16.png')[bool(paused)]}" alt="${('No', 'Yes')[bool(paused)]}" width="16" height="16" />
+            <img src="${srRoot}/images/${('no16.png', 'yes16.png')[bool(paused)]}" alt="${('No', 'Yes')[bool(paused)]}" width="16" height="16" />
         </td>
 
         <td align="center">
diff --git a/gui/slick/views/home_addExistingShow.mako b/gui/slick/views/home_addExistingShow.mako
index 1865363775befa5e872183ff2089ebc0b5ab50b5..2733d59359cd001346ea859ba215f89e3b23b948 100644
--- a/gui/slick/views/home_addExistingShow.mako
+++ b/gui/slick/views/home_addExistingShow.mako
@@ -2,19 +2,15 @@
 <%!
     import sickbeard
 %>
+<%block name="metas">
+<meta data-var="sickbeard.ROOT_DIRS" data-content="${sickbeard.ROOT_DIRS}">
+</%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/addExistingShow.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/addShowOptions.js?${sbPID}"></script>
-<script type="text/javascript" charset="utf-8">
-$(document).ready(function(){
-    $( "#tabs" ).tabs({
-        collapsible: true,
-        selected: '${('0', '-1')[bool(sickbeard.ROOT_DIRS)]}'
-    });
-});
-</script>
+<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/addExistingShow.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/addShowOptions.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/home_addExistingShow.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -29,7 +25,7 @@ $(document).ready(function(){
 
     <div id="core-component-group1" class="tab-pane active component-group">
 
-    <form id="addShowForm" method="post" action="${sbRoot}/home/addShows/addNewShow" accept-charset="utf-8">
+    <form id="addShowForm" method="post" action="${srRoot}/home/addShows/addNewShow" accept-charset="utf-8">
 
     <div id="tabs">
         <ul>
diff --git a/gui/slick/views/home_addShows.mako b/gui/slick/views/home_addShows.mako
index 19fce35681ab61eb6bf88f310fed97a9c8cbd5f0..c06e1e2b4316674af9272148f64edb6a7eb96d1c 100644
--- a/gui/slick/views/home_addShows.mako
+++ b/gui/slick/views/home_addShows.mako
@@ -12,7 +12,7 @@
 % endif
 
 <div id="addShowPortal">
-    <a href="${sbRoot}/home/addShows/newShow/" id="btnNewShow" class="btn btn-large">
+    <a href="${srRoot}/home/addShows/newShow/" id="btnNewShow" class="btn btn-large">
         <div class="button"><div class="icon-addnewshow"></div></div>
         <div class="buttontext">
             <h3>Add New Show</h3>
@@ -22,7 +22,7 @@
 
     <br/><br/>
     % if sickbeard.USE_TRAKT == True:
-    <a href="${sbRoot}/home/addShows/trendingShows/" id="btnNewShow" class="btn btn-large">
+    <a href="${srRoot}/home/addShows/trendingShows/" id="btnNewShow" class="btn btn-large">
         <div class="button"><div class="icon-addtrendingshow"></div></div>
         <div class="buttontext">
             <h3>Add Trending Show</h3>
@@ -32,7 +32,7 @@
 
     <br/><br/>
 
-    <a href="${sbRoot}/home/addShows/recommendedShows/" id="btnNewShow" class="btn btn-large">
+    <a href="${srRoot}/home/addShows/recommendedShows/" id="btnNewShow" class="btn btn-large">
         <div class="button"><div class="icon-addrecommendedshow"></div></div>
         <div class="buttontext">
             <h3>Add Recommended Shows</h3>
@@ -43,7 +43,7 @@
     <br/><br/>
     % endif
 
-    <a href="${sbRoot}/home/addShows/popularShows/" id="btnNewShow" class="btn btn-large">
+    <a href="${srRoot}/home/addShows/popularShows/" id="btnNewShow" class="btn btn-large">
         <div class="button"><div class="icon-addtrendingshow"></div></div>
         <div class="buttontext">
             <h3>View Popular Shows</h3>
@@ -53,7 +53,7 @@
 
     <br/><br/>
 
-    <a href="${sbRoot}/home/addShows/existingShows/" id="btnExistingShow" class="btn btn-large">
+    <a href="${srRoot}/home/addShows/existingShows/" id="btnExistingShow" class="btn btn-large">
         <div class="button"><div class="icon-addexistingshow"></div></div>
         <div class="buttontext">
             <h3>Add Existing Shows</h3>
diff --git a/gui/slick/views/home_newShow.mako b/gui/slick/views/home_newShow.mako
index 75f827b2898d70ecaa7017be07fe5920962671b9..4b982f2f590c16d012380db0dfd3c22991772049 100644
--- a/gui/slick/views/home_newShow.mako
+++ b/gui/slick/views/home_newShow.mako
@@ -4,13 +4,13 @@
     from sickbeard.helpers import anon_url
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/formwizard.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/newShow.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/addShowOptions.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/blackwhite.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/formwizard.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/newShow.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/addShowOptions.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/blackwhite.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -30,7 +30,7 @@
     <div id="displayText">aoeu</div>
     <br />
 
-    <form id="addShowForm" method="post" action="${sbRoot}/home/addShows/addNewShow" accept-charset="utf-8">
+    <form id="addShowForm" method="post" action="${srRoot}/home/addShows/addNewShow" accept-charset="utf-8">
 
     <fieldset class="sectionwrap">
         <legend class="legendStep">Find a show on theTVDB</legend>
diff --git a/gui/slick/views/home_popularShows.mako b/gui/slick/views/home_popularShows.mako
index 81128fa81f018e69cb349a53f62922be50e6176a..17fdc4498d61ac1fa1e1bf79393216d1150637c7 100644
--- a/gui/slick/views/home_popularShows.mako
+++ b/gui/slick/views/home_popularShows.mako
@@ -18,7 +18,7 @@
     % for cur_result in popular_shows:
         <div class="popularShow">
             <div class="left">
-                <img class="coverImage" src="${sbRoot}/cache/${cur_result['image_path']}" />
+                <img class="coverImage" src="${srRoot}/cache/${cur_result['image_path']}" />
             </div>
             <div class="right">
                 <h3>${cur_result['name']}</h3>
@@ -30,7 +30,7 @@
                 <p>${cur_result['outline']}<span class="year"> - Released ${cur_result['year']}<span></p>
                 <span class="imdb_url"><a href="${anon_url(cur_result['imdb_url'])}">View on IMDB</a></span>&nbsp;&nbsp;|&nbsp;&nbsp;
                 % if cur_result['imdb_tt'] not in imdb_tt:
-                <span class="imdb_sickrage_search"><a href="${sbRoot}/home/addShows/newShow/?search_string=${cur_result['name']}">
+                <span class="imdb_sickrage_search"><a href="${srRoot}/home/addShows/newShow/?search_string=${cur_result['name']}">
                     Add Show</a></span>
                 % else:
                 <span> Already added </span>
diff --git a/gui/slick/views/home_postprocess.mako b/gui/slick/views/home_postprocess.mako
index 68faecceac061befbf41dcded1c7406c6faac44f..795c3d3cddafa387d8b9a14801068b37554ec5cb 100644
--- a/gui/slick/views/home_postprocess.mako
+++ b/gui/slick/views/home_postprocess.mako
@@ -3,9 +3,7 @@
     import sickbeard
 %>
 <%block name="scripts">
-<script type="text/javascript">
-    $('#episodeDir').fileBrowser({ title: 'Select Unprocessed Episode Folder', key: 'postprocessPath' });
-</script>
+<script type="text/javascript" src="${srRoot}/js/new/home_postprocess.js"></script>
 </%block>
 <%block name="content">
 <div id="content800">
diff --git a/gui/slick/views/home_recommendedShows.mako b/gui/slick/views/home_recommendedShows.mako
index 89688574820db62705db25f8adb9bde7bb283800..a7f6c97517c2c789dda6974db02699b4644bd9de 100644
--- a/gui/slick/views/home_recommendedShows.mako
+++ b/gui/slick/views/home_recommendedShows.mako
@@ -2,74 +2,14 @@
 <%!
     import sickbeard
 %>
+<%block name="metas">
+<meta data-var="sickbeard.SORT_ARTICLE" data-content="${sickbeard.SORT_ARTICLE}">
+</%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/recommendedShows.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script>
-<script type="text/javascript" charset="utf-8">
-$(document).ready(function(){
-    $( "#tabs" ).tabs({
-        collapsible: true,
-        selected: ${('0', '-1')[bool(sickbeard.ROOT_DIRS)]}
-    });
-
-    // initialise combos for dirty page refreshes
-    $('#showsort').val('original');
-    $('#showsortdirection').val('asc');
-
-    var $container = [$('#container')];
-    $.each($container, function (j) {
-        this.isotope({
-            itemSelector: '.trakt_show',
-            sortBy: 'original-order',
-            layoutMode: 'fitRows',
-            getSortData: {
-                name: function( itemElem ) {
-                    var name = $( itemElem ).attr('data-name') || '';
-% if not sickbeard.SORT_ARTICLE:
-                    name = name.replace(/^(The|A|An)\s/i, '');
-% endif
-                    return name.toLowerCase();
-                },
-                rating: '[data-rating] parseInt',
-                votes: '[data-votes] parseInt',
-            }
-        });
-    });
-
-    $('#showsort').on( 'change', function() {
-        var sortCriteria;
-        switch (this.value) {
-            case 'original':
-                sortCriteria = 'original-order'
-                break;
-            case 'rating':
-                /* randomise, else the rating_votes can already
-                 * have sorted leaving this with nothing to do.
-                 */
-                $('#container').isotope({sortBy: 'random'});
-                sortCriteria = 'rating';
-                break;
-            case 'rating_votes':
-                sortCriteria = ['rating', 'votes'];
-                break;
-            case 'votes':
-                sortCriteria = 'votes';
-                break;
-            default:
-                sortCriteria = 'name'
-                break;
-        }
-        $('#container').isotope({sortBy: sortCriteria});
-    });
-
-    $('#showsortdirection').on( 'change', function() {
-        $('#container').isotope({sortAscending: ('asc' == this.value)});
-    });
-});
-
-window.setInterval('location.reload(true)', 600000); // Refresh every 10 minutes
-</script>
+<script type="text/javascript" src="${srRoot}/js/recommendedShows.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/home_recommendedShows.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
diff --git a/gui/slick/views/home_trendingShows.mako b/gui/slick/views/home_trendingShows.mako
index da97bd52feed048ebae3069fb19829d283e941d2..55c8dd0d253e2ba1d5291d8c14c9b6b8ea8c2f1d 100644
--- a/gui/slick/views/home_trendingShows.mako
+++ b/gui/slick/views/home_trendingShows.mako
@@ -12,10 +12,10 @@
 <meta data-var="sickbeard.SORT_ARTICLE" data-content="${sickbeard.SORT_ARTICLE}">
 </%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/addTrendingShow.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/home_trendingShows.js"></script>
+<script type="text/javascript" src="${srRoot}/js/addTrendingShow.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/home_trendingShows.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
diff --git a/gui/slick/views/inc_addShowOptions.mako b/gui/slick/views/inc_addShowOptions.mako
index 512a4b0acc018ff3a9c71a2c19e161f2016c3624..bfeb9b4653c54aa20618f28e1b5cbf3f9b737f90 100644
--- a/gui/slick/views/inc_addShowOptions.mako
+++ b/gui/slick/views/inc_addShowOptions.mako
@@ -21,7 +21,7 @@
                 <span class="component-title">Status for previously aired episodes</span>
                 <span class="component-desc">
                     <select name="defaultStatus" id="statusSelect" class="form-control form-control-inline input-sm">
-                    % for curStatus in [SKIPPED, WANTED, ARCHIVED, IGNORED]:
+                    % for curStatus in [SKIPPED, WANTED, IGNORED]:
                         <option value="${curStatus}" ${('', 'selected="selected"')[sickbeard.STATUS_DEFAULT == curStatus]}>${statusStrings[curStatus]}</option>
                     % endfor
                     </select>
@@ -33,7 +33,7 @@
                 <span class="component-title">Status for all future episodes</span>
                 <span class="component-desc">
                     <select name="defaultStatusAfter" id="statusSelectAfter" class="form-control form-control-inline input-sm">
-                    % for curStatus in [SKIPPED, WANTED, ARCHIVED, IGNORED]:
+                    % for curStatus in [SKIPPED, WANTED, IGNORED]:
                         <option value="${curStatus}" ${('', 'selected="selected"')[sickbeard.STATUS_DEFAULT_AFTER == curStatus]}>${statusStrings[curStatus]}</option>
                     % endfor
                     </select>
@@ -72,6 +72,16 @@
             </label>
         </div>
 
+        <div class="field-pair alt">
+            <label for="archive" class="clearfix">
+                <span class="component-title">Archive first match</span>
+                <span class="component-desc">
+                    <input type="checkbox" name="archive" id="archive" ${('', 'checked="checked"')[bool(sickbeard.ARCHIVE_DEFAULT)]} />
+                    <p>Archive episodes after downloading first match?</p>
+                </span>
+            </label>
+        </div>
+
         <% qualities = Quality.splitQuality(sickbeard.QUALITY_DEFAULT) %>
         <% anyQualities = qualities[0] %>
         <% bestQualities = qualities[1] %>
diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako
index e7d3bc29b2b41634c14b67689ed04ab0043f6b18..4b2ee1e66b42489a2820581012f728c110f52b38 100644
--- a/gui/slick/views/layouts/main.mako
+++ b/gui/slick/views/layouts/main.mako
@@ -16,7 +16,7 @@
         has_resource_module = False
 %>
 <%
-    sbRoot = sickbeard.WEB_ROOT
+    srRoot = sickbeard.WEB_ROOT
 %>
 <!DOCTYPE html>
 <html>
@@ -40,38 +40,38 @@
             <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
         <![endif]-->
         <meta name="msapplication-TileColor" content="#FFFFFF">
-        <meta name="msapplication-TileImage" content="${sbRoot}/images/ico/favicon-144.png">
-        <meta name="msapplication-config" content="${sbRoot}/css/browserconfig.xml">
+        <meta name="msapplication-TileImage" content="${srRoot}/images/ico/favicon-144.png">
+        <meta name="msapplication-config" content="${srRoot}/css/browserconfig.xml">
 
         <meta data-var="sickbeard.FUZZY_DATING" data-content="${sickbeard.FUZZY_DATING}">
         <%block name="metas" />
 
-        <link rel="shortcut icon" href="${sbRoot}/images/ico/favicon.ico">
-        <link rel="icon" sizes="16x16 32x32 64x64" href="${sbRoot}/images/ico/favicon.ico">
-        <link rel="icon" type="image/png" sizes="196x196" href="${sbRoot}/images/ico/favicon-196.png">
-        <link rel="icon" type="image/png" sizes="160x160" href="${sbRoot}/images/ico/favicon-160.png">
-        <link rel="icon" type="image/png" sizes="96x96" href="${sbRoot}/images/ico/favicon-96.png">
-        <link rel="icon" type="image/png" sizes="64x64" href="${sbRoot}/images/ico/favicon-64.png">
-        <link rel="icon" type="image/png" sizes="32x32" href="${sbRoot}/images/ico/favicon-32.png">
-        <link rel="icon" type="image/png" sizes="16x16" href="${sbRoot}/images/ico/favicon-16.png">
-        <link rel="apple-touch-icon" sizes="152x152" href="${sbRoot}/images/ico/favicon-152.png">
-        <link rel="apple-touch-icon" sizes="144x144" href="${sbRoot}/images/ico/favicon-144.png">
-        <link rel="apple-touch-icon" sizes="120x120" href="${sbRoot}/images/ico/favicon-120.png">
-        <link rel="apple-touch-icon" sizes="114x114" href="${sbRoot}/images/ico/favicon-114.png">
-        <link rel="apple-touch-icon" sizes="76x76" href="${sbRoot}/images/ico/favicon-76.png">
-        <link rel="apple-touch-icon" sizes="72x72" href="${sbRoot}/images/ico/favicon-72.png">
-        <link rel="apple-touch-icon" href="${sbRoot}/images/ico/favicon-57.png">
+        <link rel="shortcut icon" href="${srRoot}/images/ico/favicon.ico">
+        <link rel="icon" sizes="16x16 32x32 64x64" href="${srRoot}/images/ico/favicon.ico">
+        <link rel="icon" type="image/png" sizes="196x196" href="${srRoot}/images/ico/favicon-196.png">
+        <link rel="icon" type="image/png" sizes="160x160" href="${srRoot}/images/ico/favicon-160.png">
+        <link rel="icon" type="image/png" sizes="96x96" href="${srRoot}/images/ico/favicon-96.png">
+        <link rel="icon" type="image/png" sizes="64x64" href="${srRoot}/images/ico/favicon-64.png">
+        <link rel="icon" type="image/png" sizes="32x32" href="${srRoot}/images/ico/favicon-32.png">
+        <link rel="icon" type="image/png" sizes="16x16" href="${srRoot}/images/ico/favicon-16.png">
+        <link rel="apple-touch-icon" sizes="152x152" href="${srRoot}/images/ico/favicon-152.png">
+        <link rel="apple-touch-icon" sizes="144x144" href="${srRoot}/images/ico/favicon-144.png">
+        <link rel="apple-touch-icon" sizes="120x120" href="${srRoot}/images/ico/favicon-120.png">
+        <link rel="apple-touch-icon" sizes="114x114" href="${srRoot}/images/ico/favicon-114.png">
+        <link rel="apple-touch-icon" sizes="76x76" href="${srRoot}/images/ico/favicon-76.png">
+        <link rel="apple-touch-icon" sizes="72x72" href="${srRoot}/images/ico/favicon-72.png">
+        <link rel="apple-touch-icon" href="${srRoot}/images/ico/favicon-57.png">
 
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/bootstrap.min.css?${sbPID}"/>
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/browser.css?${sbPID}" />
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" />
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/jquery.qtip-2.2.1.min.css?${sbPID}"/>
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/style.css?${sbPID}"/>
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/${sickbeard.THEME_NAME}.css?${sbPID}" />
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/print.css?${sbPID}" />
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/bootstrap.min.css?${sbPID}"/>
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/browser.css?${sbPID}" />
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" />
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery.qtip-2.2.1.min.css?${sbPID}"/>
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/style.css?${sbPID}"/>
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/${sickbeard.THEME_NAME}.css?${sbPID}" />
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/print.css?${sbPID}" />
         % if sbLogin:
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/pnotify.custom.min.css?${sbPID}" />
-        <link rel="stylesheet" type="text/css" href="${sbRoot}/css/country-flags.css?${sbPID}"/>
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/pnotify.custom.min.css?${sbPID}" />
+        <link rel="stylesheet" type="text/css" href="${srRoot}/css/country-flags.css?${sbPID}"/>
         % endif
         <%block name="css" />
     </head>
@@ -86,93 +86,93 @@
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                     </button>
-                    <a class="navbar-brand" href="${sbRoot}/home/" title="SickRage"><img alt="SickRage" src="${sbRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" /></a>
+                    <a class="navbar-brand" href="${srRoot}/home/" title="SickRage"><img alt="SickRage" src="${srRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" /></a>
                 </div>
 
             % if sbLogin:
                 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                     <ul class="nav navbar-nav navbar-right">
                         <li id="NAVnews" ${('', 'class="active"')[topmenu == 'news']}>
-                            <a href="${sbRoot}/news/">News</a>
+                            <a href="${srRoot}/news/">News</a>
                         </li>
                         <li id="NAVirc" ${('', 'class="active"')[topmenu == 'irc']}>
-                            <a href="${sbRoot}/IRC/">IRC</a>
+                            <a href="${srRoot}/IRC/">IRC</a>
                         </li>
                         <li id="NAVhome" ${('', 'class="active"')[topmenu == 'home']}>
-                            <a href="${sbRoot}/home/">Shows</a>
+                            <a href="${srRoot}/home/">Shows</a>
                         </li>
 
                         <li id="NAVcomingEpisodes" ${('', 'class="active"')[topmenu == 'comingEpisodes']}>
-                            <a href="${sbRoot}/comingEpisodes/">Coming Episodes</a>
+                            <a href="${srRoot}/comingEpisodes/">Coming Episodes</a>
                         </li>
 
                         <li id="NAVhistory" ${('', 'class="active"')[topmenu == 'history']}>
-                            <a href="${sbRoot}/history/">History</a>
+                            <a href="${srRoot}/history/">History</a>
                         </li>
 
                         <li id="NAVmanage" class="dropdown ${('', 'active')[topmenu == 'manage']}">
-                            <a href="${sbRoot}/manage/" class="dropdown-toggle" data-toggle="dropdown">Manage <b class="caret"></b></a>
+                            <a href="${srRoot}/manage/" class="dropdown-toggle" data-toggle="dropdown">Manage <b class="caret"></b></a>
                             <ul class="dropdown-menu">
-                                <li><a href="${sbRoot}/manage/"><i class="menu-icon-manage"></i>&nbsp;Mass Update</a></li>
-                                <li><a href="${sbRoot}/manage/backlogOverview/"><i class="menu-icon-backlog-view"></i>&nbsp;Backlog Overview</a></li>
-                                <li><a href="${sbRoot}/manage/manageSearches/"><i class="menu-icon-manage-searches"></i>&nbsp;Manage Searches</a></li>
-                                <li><a href="${sbRoot}/manage/episodeStatuses/"><i class="menu-icon-backlog"></i>&nbsp;Episode Status Management</a></li>
+                                <li><a href="${srRoot}/manage/"><i class="menu-icon-manage"></i>&nbsp;Mass Update</a></li>
+                                <li><a href="${srRoot}/manage/backlogOverview/"><i class="menu-icon-backlog-view"></i>&nbsp;Backlog Overview</a></li>
+                                <li><a href="${srRoot}/manage/manageSearches/"><i class="menu-icon-manage-searches"></i>&nbsp;Manage Searches</a></li>
+                                <li><a href="${srRoot}/manage/episodeStatuses/"><i class="menu-icon-backlog"></i>&nbsp;Episode Status Management</a></li>
                             % if sickbeard.USE_PLEX and sickbeard.PLEX_SERVER_HOST != "":
-                                <li><a href="${sbRoot}/home/updatePLEX/"><i class="menu-icon-backlog-view"></i>&nbsp;Update PLEX</a></li>
+                                <li><a href="${srRoot}/home/updatePLEX/"><i class="menu-icon-backlog-view"></i>&nbsp;Update PLEX</a></li>
                             % endif
                             % if sickbeard.USE_KODI and sickbeard.KODI_HOST != "":
-                                <li><a href="${sbRoot}/home/updateKODI/"><i class="menu-icon-kodi"></i>&nbsp;Update KODI</a></li>
+                                <li><a href="${srRoot}/home/updateKODI/"><i class="menu-icon-kodi"></i>&nbsp;Update KODI</a></li>
                             % endif
                             % if sickbeard.USE_EMBY and sickbeard.EMBY_HOST != "" and sickbeard.EMBY_APIKEY != "":
-                                <li><a href="${sbRoot}/home/updateEMBY/"><i class="menu-icon-backlog-view"></i>&nbsp;Update Emby</a></li>
+                                <li><a href="${srRoot}/home/updateEMBY/"><i class="menu-icon-backlog-view"></i>&nbsp;Update Emby</a></li>
                             % endif
                             % if sickbeard.USE_TORRENTS and sickbeard.TORRENT_METHOD != 'blackhole' and (sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'https' or not sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'http:'):
-                                <li><a href="${sbRoot}/manage/manageTorrents/"><i class="menu-icon-bittorrent"></i>&nbsp;Manage Torrents</a></li>
+                                <li><a href="${srRoot}/manage/manageTorrents/"><i class="menu-icon-bittorrent"></i>&nbsp;Manage Torrents</a></li>
                             % endif
                             % if sickbeard.USE_FAILED_DOWNLOADS:
-                                <li><a href="${sbRoot}/manage/failedDownloads/"><i class="menu-icon-failed-download"></i>&nbsp;Failed Downloads</a></li>
+                                <li><a href="${srRoot}/manage/failedDownloads/"><i class="menu-icon-failed-download"></i>&nbsp;Failed Downloads</a></li>
                             % endif
                             % if sickbeard.USE_SUBTITLES:
-                                <li><a href="${sbRoot}/manage/subtitleMissed/"><i class="menu-icon-backlog"></i>&nbsp;Missed Subtitle Management</a></li>
+                                <li><a href="${srRoot}/manage/subtitleMissed/"><i class="menu-icon-backlog"></i>&nbsp;Missed Subtitle Management</a></li>
                             % endif
                             </ul>
                         </li>
 
                         <li id="NAVerrorlogs" class="dropdown" ${('', 'class="active"')[topmenu == 'errorlogs']}>
-                            <a href="${sbRoot}/errorlogs/" class="dropdown-toggle" data-toggle="dropdown">${logPageTitle} <b class="caret"></b></a>
+                            <a href="${srRoot}/errorlogs/" class="dropdown-toggle" data-toggle="dropdown">${logPageTitle} <b class="caret"></b></a>
                             <ul class="dropdown-menu">
-                                <li><a href="${sbRoot}/errorlogs/"><i class="menu-icon-viewlog-errors"></i>&nbsp;View Log (Errors)</a></li>
-                                <li><a href="${sbRoot}/errorlogs/viewlog/"><i class="menu-icon-viewlog"></i>&nbsp;View Log</a></li>
+                                <li><a href="${srRoot}/errorlogs/"><i class="menu-icon-viewlog-errors"></i>&nbsp;View Log (Errors)</a></li>
+                                <li><a href="${srRoot}/errorlogs/viewlog/"><i class="menu-icon-viewlog"></i>&nbsp;View Log</a></li>
                             </ul>
                         </li>
 
                         <li id="NAVconfig" class="dropdown" ${('', 'class="active"')[topmenu == 'config']}>
-                            <a href="${sbRoot}/config/" class="dropdown-toggle" data-toggle="dropdown"><img src="${sbRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">Config <b class="caret"></b></span></a>
+                            <a href="${srRoot}/config/" class="dropdown-toggle" data-toggle="dropdown"><img src="${srRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">Config <b class="caret"></b></span></a>
                             <ul class="dropdown-menu">
-                                <li><a href="${sbRoot}/config/"><i class="menu-icon-help"></i>&nbsp;Help &amp; Info</a></li>
-                                <li><a href="${sbRoot}/config/general/"><i class="menu-icon-config"></i>&nbsp;General</a></li>
-                                <li><a href="${sbRoot}/config/backuprestore/"><i class="menu-icon-config"></i>&nbsp;Backup &amp; Restore</a></li>
-                                <li><a href="${sbRoot}/config/search/"><i class="menu-icon-config"></i>&nbsp;Search Settings</a></li>
-                                <li><a href="${sbRoot}/config/providers/"><i class="menu-icon-config"></i>&nbsp;Search Providers</a></li>
-                                <li><a href="${sbRoot}/config/subtitles/"><i class="menu-icon-config"></i>&nbsp;Subtitles Settings</a></li>
-                                <li><a href="${sbRoot}/config/postProcessing/"><i class="menu-icon-config"></i>&nbsp;Post Processing</a></li>
-                                <li><a href="${sbRoot}/config/notifications/"><i class="menu-icon-config"></i>&nbsp;Notifications</a></li>
-                                <li><a href="${sbRoot}/config/anime/"><i class="menu-icon-config"></i>&nbsp;Anime</a></li>
+                                <li><a href="${srRoot}/config/"><i class="menu-icon-help"></i>&nbsp;Help &amp; Info</a></li>
+                                <li><a href="${srRoot}/config/general/"><i class="menu-icon-config"></i>&nbsp;General</a></li>
+                                <li><a href="${srRoot}/config/backuprestore/"><i class="menu-icon-config"></i>&nbsp;Backup &amp; Restore</a></li>
+                                <li><a href="${srRoot}/config/search/"><i class="menu-icon-config"></i>&nbsp;Search Settings</a></li>
+                                <li><a href="${srRoot}/config/providers/"><i class="menu-icon-config"></i>&nbsp;Search Providers</a></li>
+                                <li><a href="${srRoot}/config/subtitles/"><i class="menu-icon-config"></i>&nbsp;Subtitles Settings</a></li>
+                                <li><a href="${srRoot}/config/postProcessing/"><i class="menu-icon-config"></i>&nbsp;Post Processing</a></li>
+                                <li><a href="${srRoot}/config/notifications/"><i class="menu-icon-config"></i>&nbsp;Notifications</a></li>
+                                <li><a href="${srRoot}/config/anime/"><i class="menu-icon-config"></i>&nbsp;Anime</a></li>
                             </ul>
                         </li>
 
                         <li class="dropdown">
-                            <a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="${sbRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">System <b class="caret"></b></span></a>
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="${srRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">System <b class="caret"></b></span></a>
                             <ul class="dropdown-menu">
-                                <li><a href="${sbRoot}/home/updateCheck?pid=${sbPID}"><i class="menu-icon-update"></i>&nbsp;Check For Updates</a></li>
-                                <li><a href="${sbRoot}/changes"><i class="menu-icon-help"></i>&nbsp;Changelog</a></li>
-                                <li><a href="${sbRoot}/home/restart/?pid=${sbPID}" class="confirm restart"><i class="menu-icon-restart"></i>&nbsp;Restart</a></li>
-                                <li><a href="${sbRoot}/home/shutdown/?pid=${sbPID}" class="confirm shutdown"><i class="menu-icon-shutdown"></i>&nbsp;Shutdown</a></li>
-                                <li><a href="${sbRoot}/logout" class="confirm logout"><i class="menu-icon-shutdown"></i>&nbsp;Logout</a></li>
-                                <li><a href="${sbRoot}/home/status/"><i class="menu-icon-help"></i>&nbsp;Server Status</a></li>
+                                <li><a href="${srRoot}/home/updateCheck?pid=${sbPID}"><i class="menu-icon-update"></i>&nbsp;Check For Updates</a></li>
+                                <li><a href="${srRoot}/changes"><i class="menu-icon-help"></i>&nbsp;Changelog</a></li>
+                                <li><a href="${srRoot}/home/restart/?pid=${sbPID}" class="confirm restart"><i class="menu-icon-restart"></i>&nbsp;Restart</a></li>
+                                <li><a href="${srRoot}/home/shutdown/?pid=${sbPID}" class="confirm shutdown"><i class="menu-icon-shutdown"></i>&nbsp;Shutdown</a></li>
+                                <li><a href="${srRoot}/logout" class="confirm logout"><i class="menu-icon-shutdown"></i>&nbsp;Logout</a></li>
+                                <li><a href="${srRoot}/home/status/"><i class="menu-icon-help"></i>&nbsp;Server Status</a></li>
                             </ul>
                         </li>
-                        <li id="donate"><a href="https://github.com/SiCKRAGETV/SickRage/wiki/Donations" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href); return false;"><img src="${sbRoot}/images/donate.jpg" alt="[donate]" class="navbaricon hidden-xs" /></a></li>
+                        <li id="donate"><a href="https://github.com/SiCKRAGETV/SickRage/wiki/Donations" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href); return false;"><img src="${srRoot}/images/donate.jpg" alt="[donate]" class="navbaricon hidden-xs" /></a></li>
                     </ul>
             % endif
                 </div><!-- /.navbar-collapse -->
@@ -193,11 +193,11 @@
                               inner_first = True
                           %>
                           % for cur_link in menuItem['path']:
-                              ${("&middot; ", "")[bool(inner_first)]}<a class="inner" href="${sbRoot}/${menuItem['path'][cur_link]}">${cur_link}</a>
+                              ${("&middot; ", "")[bool(inner_first)]}<a class="inner" href="${srRoot}/${menuItem['path'][cur_link]}">${cur_link}</a>
                               <% inner_first = False %>
                           % endfor
                       % else:
-                          <a href="${sbRoot}/${menuItem['path']}" class="btn${('', (' confirm ' + menuItem.get('class', '')))['confirm' in menuItem]}">${('', '<span class="pull-left ' + icon_class + '"></span> ')[bool(icon_class)]}${menuItem['title']}</a>
+                          <a href="${srRoot}/${menuItem['path']}" class="btn${('', (' confirm ' + menuItem.get('class', '')))['confirm' in menuItem]}">${('', '<span class="pull-left ' + icon_class + '"></span> ')[bool(icon_class)]}${menuItem['title']}</a>
                           <% first = False %>
                       % endif
                 % endif
@@ -230,7 +230,7 @@
                 myDB = db.DBConnection()
                 today = str(datetime.date.today().toordinal())
                 status_quality = '(%s)' % ','.join([str(quality) for quality in Quality.SNATCHED + Quality.SNATCHED_PROPER])
-                status_download = '(%s)' % ','.join([str(quality) for quality in Quality.DOWNLOADED + [ARCHIVED]])
+                status_download = '(%s)' % ','.join([str(quality) for quality in Quality.DOWNLOADED + Quality.ARCHIVED])
 
                 sql_statement = 'SELECT ' \
                 + '(SELECT COUNT(*) FROM tv_episodes WHERE season > 0 AND episode > 0 AND airdate > 1 AND status IN %s) AS ep_snatched, ' % status_quality \
@@ -255,7 +255,7 @@
                 ep_percentage = '' if ep_total == 0 else '(<span class="footerhighlight">%s%%</span>)' % re.sub(r'(\d+)(\.\d)\d+', r'\1\2', str((float(ep_downloaded)/float(ep_total))*100))
 
                 try:
-                    localRoot = sbRoot
+                    localRoot = srRoot
                 except NotFound:
                     localRoot = ''
 
@@ -285,46 +285,38 @@
                 </div>
             </div>
         </footer>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/bootstrap.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-hover-dropdown.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery-ui-1.10.4.custom.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.cookie.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/pnotify.custom.min.js"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.form-3.35.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.confirm.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/script.js?${sbPID}"></script>
-
-        % if sickbeard.FUZZY_DATING:
-        <script type="text/javascript" src="${sbRoot}/js/moment/moment.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${sbRoot}/js/fuzzyMoment.js?${sbPID}"></script>
-        % endif
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/bootstrap.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/bootstrap-hover-dropdown.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery-ui-1.10.4.custom.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookie.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/pnotify.custom.min.js"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.form-3.35.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.confirm.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.timeago.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/script.js?${sbPID}"></script>
         <script type="text/javascript">
-            sbRoot = '${sbRoot}'; // needed for browser.js & ajaxNotifications.js
+            srRoot = '${srRoot}'; // needed for browser.js & ajaxNotifications.js
             //HTML for scrolltopcontrol, which is auto wrapped in DIV w/ ID="topcontrol"
-            top_image_html = '<img src="${sbRoot}/images/top.gif" width="31" height="11" alt="Jump to top" />';
+            top_image_html = '<img src="${srRoot}/images/top.gif" width="31" height="11" alt="Jump to top" />';
             themeSpinner = '${('', '-dark')[sickbeard.THEME_NAME == 'dark']}';
             anonURL = '${sickbeard.ANON_REDIRECT}';
         </script>
-        <script type="text/javascript" src="${sbRoot}/js/lib/jquery.scrolltopcontrol-1.1.js"></script>
-        <script type="text/javascript" src="${sbRoot}/js/browser.js"></script>
-        <script type="text/javascript" src="${sbRoot}/js/ajaxNotifications.js"></script>
-        <script type="text/javascript" src="${sbRoot}/js/confirmations.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.scrolltopcontrol-1.1.js"></script>
+        <script type="text/javascript" src="${srRoot}/js/browser.js"></script>
+        <script type="text/javascript" src="${srRoot}/js/ajaxNotifications.js"></script>
+        <script type="text/javascript" src="${srRoot}/js/confirmations.js?${sbPID}"></script>
     % endif
-        <script type="text/javascript">
-            $(document).ready(function() {
-                $('.dropdown-toggle').dropdownHover();
-            });
-        </script>
         <%block name="scripts" />
     </body>
 </html>
diff --git a/gui/slick/views/manage.mako b/gui/slick/views/manage.mako
index 8d9c213dc7fd902331e7d50e4952981981f4931a..9aab23d0ad7d4e3284e6dbf40701319fdf7f8a04 100644
--- a/gui/slick/views/manage.mako
+++ b/gui/slick/views/manage.mako
@@ -5,9 +5,9 @@
     from sickbeard.common import statusStrings
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/lib/bootbox.min.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/new/manage.js"></script>
-<script type="text/javascript" src="${sbRoot}/js/massUpdate.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/bootbox.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/manage.js"></script>
+<script type="text/javascript" src="${srRoot}/js/massUpdate.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 <%namespace file="/inc_defs.mako" import="renderQualityPill"/>
@@ -101,14 +101,14 @@
         <% curRemove = "<input type=\"checkbox\" class=\"removeCheck\" id=\"remove-"+str(curShow.indexerid)+"\" "+curRemove_disabled+"/>" %>
         <tr>
             <td align="center"><input type="checkbox" class="editCheck" id="edit-${curShow.indexerid}" /></td>
-            <td class="tvShow"><a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td>
+            <td class="tvShow"><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td>
             <td align="center">${renderQualityPill(curShow.quality, showTitle=True)}</td>
-            <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_sports) == 1]} width="16" height="16" /></td>
-            <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_scene) == 1]} width="16" height="16" /></td>
-            <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_anime) == 1]} width="16" height="16" /></td>
-            <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.flatten_folders) == 1]} width="16" height="16" /></td>
-            <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.paused) == 1]} width="16" height="16" /></td>
-            <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.subtitles) == 1]} width="16" height="16" /></td>
+            <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_sports) == 1]} width="16" height="16" /></td>
+            <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_scene) == 1]} width="16" height="16" /></td>
+            <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_anime) == 1]} width="16" height="16" /></td>
+            <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.flatten_folders) == 1]} width="16" height="16" /></td>
+            <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.paused) == 1]} width="16" height="16" /></td>
+            <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.subtitles) == 1]} width="16" height="16" /></td>
             <td align="center">${statusStrings[curShow.default_ep_status]}</td>
             <td align="center">${curShow.status}</td>
             <td align="center">${curUpdate}</td>
diff --git a/gui/slick/views/manage_backlogOverview.mako b/gui/slick/views/manage_backlogOverview.mako
index 4065b16b61d4dbf01f1b4d1316307896dddb007b..5bdf25c59b91a37b0b53b1a5974de9b845b7dec7 100644
--- a/gui/slick/views/manage_backlogOverview.mako
+++ b/gui/slick/views/manage_backlogOverview.mako
@@ -5,30 +5,9 @@
     from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED
     from sickbeard.common import Overview, Quality, qualityPresets, qualityPresetStrings
     from sickbeard import sbdatetime, network_timezones
-
-    fuzzydate = 'airdate'
 %>
 <%block name="scripts">
 <script type="text/javascript">
-$(document).ready(function(){
-    $('#pickShow').change(function(){
-        var id = $(this).val();
-        if (id) {
-            $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow');
-        }
-    });
-
-    % if sickbeard.FUZZY_DATING:
-    fuzzyMoment({
-        containerClass : '.${fuzzydate}',
-        dateHasTime : false,
-        dateFormat : '${sickbeard.DATE_PRESET}',
-        timeFormat : '${sickbeard.TIME_PRESET}',
-        trimZero : ${('False', 'True')[bool(sickbeard.TRIM_ZERO)]}
-    });
-    % endif
-
-});
 </script>
 </%block>
 <%block name="content">
@@ -72,11 +51,11 @@ Jump to Show
     % endif
     <tr class="seasonheader" id="show-${curShow.indexerid}">
         <td colspan="3" class="align-left">
-            <br/><h2><a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2>
+            <br/><h2><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2>
             <div class="pull-right">
                 <span class="listing-key wanted">Wanted: <b>${showCounts[curShow.indexerid][Overview.WANTED]}</b></span>
                 <span class="listing-key qual">Low Quality: <b>${showCounts[curShow.indexerid][Overview.QUAL]}</b></span>
-                <a class="btn btn-inline forceBacklog" href="${sbRoot}/manage/backlogShow?indexer_id=${curShow.indexerid}"><i class="icon-play-circle icon-white"></i> Force Backlog</a>
+                <a class="btn btn-inline forceBacklog" href="${srRoot}/manage/backlogShow?indexer_id=${curShow.indexerid}"><i class="icon-play-circle icon-white"></i> Force Backlog</a>
             </div>
         </td>
     </tr>
@@ -98,9 +77,17 @@ Jump to Show
         <tr class="seasonstyle ${Overview.overviewStrings[showCats[curShow.indexerid][whichStr]]}">
             <td class="tableleft" align="center">${whichStr}</td>
             <td class="tableright" align="center" class="nowrap">
-                <div class="${fuzzydate}">${curResult["name"]}</div>
+                ${curResult["name"]}
+            </td>
+            <% date = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(curResult['airdate'], curShow.airs, curShow.network)) %>
+            <td>
+            % if int(curResult['airdate']) != 1:
+                <time datetime="${date.isoformat('T')}" class="date">${date}</time>
+            % else:
+                Never
+            % endif
+            <span class="sort_data">${date.isoformat('T')}</span>
             </td>
-            <td><div>${(sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(curResult['airdate'], curShow.airs, curShow.network))), 'never')[int(curResult['airdate']) == 1]}</div></td>
         </tr>
     % endfor
 % endfor
diff --git a/gui/slick/views/manage_episodeStatuses.mako b/gui/slick/views/manage_episodeStatuses.mako
index 1192b07fa98384b33e7d29d2431089eb5e61b5f7..1b4ffec630943ef4e413f81a6a9b0cdf8d6d6a90 100644
--- a/gui/slick/views/manage_episodeStatuses.mako
+++ b/gui/slick/views/manage_episodeStatuses.mako
@@ -5,7 +5,7 @@
 %>
 <%block name="scripts">
 % if whichStatus or (whichStatus and ep_counts):
-<script type="text/javascript" src="${sbRoot}/js/manageEpisodeStatuses.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/manageEpisodeStatuses.js?${sbPID}"></script>
 % endif:
 </%block>
 <%block name="content">
@@ -23,9 +23,9 @@
 <br />
 % endif
 
-<form action="${sbRoot}/manage/episodeStatuses" method="get">
+<form action="${srRoot}/manage/episodeStatuses" method="get">
 Manage episodes with status <select name="whichStatus" class="form-control form-control-inline input-sm">
-% for curStatus in [common.SKIPPED, common.SNATCHED, common.WANTED, common.ARCHIVED, common.IGNORED] + common.Quality.ARCHIVED:
+% for curStatus in [common.SKIPPED, common.SNATCHED, common.WANTED, common.IGNORED] + common.Quality.ARCHIVED:
 <option value="${curStatus}">${common.statusStrings[curStatus]}</option>
 % endfor
 </select>
@@ -34,7 +34,7 @@ Manage episodes with status <select name="whichStatus" class="form-control form-
 
 % else:
 
-<form action="${sbRoot}/manage/changeEpisodeStatuses" method="post">
+<form action="${srRoot}/manage/changeEpisodeStatuses" method="post">
 <input type="hidden" id="oldStatus" name="oldStatus" value="${whichStatus}" />
 
 <h2>Shows containing ${common.statusStrings[int(whichStatus)]} episodes</h2>
@@ -56,7 +56,7 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form-
     if int(whichStatus) in statusList:
         statusList.remove(int(whichStatus))
 
-    if int(whichStatus) in [common.SNATCHED, common.SNATCHED_PROPER, common.SNATCHED_BEST] + common.Quality.DOWNLOADED and sickbeard.USE_FAILED_DOWNLOADS:
+    if int(whichStatus) in [common.SNATCHED, common.SNATCHED_PROPER, common.SNATCHED_BEST] + common.Quality.ARCHIVED + common.Quality.DOWNLOADED and sickbeard.USE_FAILED_DOWNLOADS:
         statusList.append(common.FAILED)
 %>
 
@@ -78,7 +78,7 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form-
     % for cur_indexer_id in sorted_show_ids:
     <tr id="${cur_indexer_id}">
         <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all"checked="checked" /></th>
-        <th colspan="2" style="width: 100%; text-align: left;"><a class="whitelink" href="${sbRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th>
+        <th colspan="2" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th>
     </tr>
     % endfor
 </table>
diff --git a/gui/slick/views/manage_failedDownloads.mako b/gui/slick/views/manage_failedDownloads.mako
index b7149ccf7a1a0a8974699503adc4e3120b7b491d..759c930705ea555b1cea87f69385b94d9ded88f0 100644
--- a/gui/slick/views/manage_failedDownloads.mako
+++ b/gui/slick/views/manage_failedDownloads.mako
@@ -10,20 +10,8 @@
     from sickbeard.common import Quality, qualityPresets, qualityPresetStrings, statusStrings, Overview
 %>
 <%block name="scripts">
-<script type="text/javascript">
-$(document).ready(function(){
-    $("#failedTable:has(tbody tr)").tablesorter({
-        widgets: ['zebra'],
-        sortList: [[0,0]],
-        headers: { 3: { sorter: false } }
-    });
-    $('#limit').change(function(){
-        url = '${sbRoot}/manage/failedDownloads/?limit='+$(this).val()
-        window.location.href = url
-    });
-});
-</script>
-<script type="text/javascript" src="${sbRoot}/js/failedDownloads.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/manage_failedDownloads.js"></script>
+<script type="text/javascript" src="${srRoot}/js/failedDownloads.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
@@ -72,9 +60,9 @@ $(document).ready(function(){
     <td align="center">
     <% provider = providers.getProviderClass(generic.GenericProvider.makeID(hItem["provider"])) %>
     % if provider != None:
-        <img src="${sbRoot}/images/providers/${provider.imageName()}" width="16" height="16" alt="${provider.name}" title="${provider.name}"/>
+        <img src="${srRoot}/images/providers/${provider.imageName()}" width="16" height="16" alt="${provider.name}" title="${provider.name}"/>
     % else:
-        <img src="${sbRoot}/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider"/>
+        <img src="${srRoot}/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider"/>
     % endif
     </td>
     <td align="center">${curRemove}</td>
diff --git a/gui/slick/views/manage_manageSearches.mako b/gui/slick/views/manage_manageSearches.mako
index 647ed15f3d919edd30968447c470438fd513ecd2..78e3d36a79c87df0950a90d509cb00f96fd4554c 100644
--- a/gui/slick/views/manage_manageSearches.mako
+++ b/gui/slick/views/manage_manageSearches.mako
@@ -6,7 +6,7 @@
     from sickbeard.common import Quality, qualityPresets, statusStrings, qualityPresetStrings, cpu_presets
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 <div id="content800">
@@ -18,8 +18,8 @@
 
 <div id="summary2" class="align-left">
 <h3>Backlog Search:</h3>
-<a class="btn" href="${sbRoot}/manage/manageSearches/forceBacklog"><i class="icon-exclamation-sign"></i> Force</a>
-<a class="btn" href="${sbRoot}/manage/manageSearches/pauseBacklog?paused=${('1', '0')[bool(backlogPaused)]}"><i class="icon-${('paused', 'play')[bool(backlogPaused)]}"></i> ${('pause', 'Unpause')[bool(backlogPaused)]}</a>
+<a class="btn" href="${srRoot}/manage/manageSearches/forceBacklog"><i class="icon-exclamation-sign"></i> Force</a>
+<a class="btn" href="${srRoot}/manage/manageSearches/pauseBacklog?paused=${('1', '0')[bool(backlogPaused)]}"><i class="icon-${('paused', 'play')[bool(backlogPaused)]}"></i> ${('pause', 'Unpause')[bool(backlogPaused)]}</a>
 % if not backlogRunning:
     Not in progress<br />
 % else:
@@ -29,12 +29,12 @@
 <br />
 
 <h3>Daily Search:</h3>
-<a class="btn" href="${sbRoot}/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a>
+<a class="btn" href="${srRoot}/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a>
 ${('Not in progress', 'In Progress')[dailySearchStatus]}<br />
 <br />
 
 <h3>Find Propers Search:</h3>
-<a class="btn ${('disabled', '')[bool(sickbeard.DOWNLOAD_PROPERS)]}" href="${sbRoot}/manage/manageSearches/forceFindPropers"><i class="icon-exclamation-sign"></i> Force</a>
+<a class="btn ${('disabled', '')[bool(sickbeard.DOWNLOAD_PROPERS)]}" href="${srRoot}/manage/manageSearches/forceFindPropers"><i class="icon-exclamation-sign"></i> Force</a>
 % if not sickbeard.DOWNLOAD_PROPERS:
     Propers search disabled <br />
 % elif not findPropersStatus:
diff --git a/gui/slick/views/manage_massEdit.mako b/gui/slick/views/manage_massEdit.mako
index 19f5c0fa7beff0a38307a645ce71b6266acb567b..352311f17b40e9feb86730ff9214cbbc89f087d1 100644
--- a/gui/slick/views/manage_massEdit.mako
+++ b/gui/slick/views/manage_massEdit.mako
@@ -16,11 +16,9 @@
 
     anyQualities, bestQualities = common.Quality.splitQuality(initial_quality)
 %>
-<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/massEdit.js?${sbPID}"></script>
-<script type="text/javascript" charset="utf-8">
-    $('#location').fileBrowser({ title: 'Select Show Location' });
-</script>
+<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/massEdit.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/new/manage_massEdit.js"></script>
 </%block>
 <%block name="content">
 <%
@@ -133,7 +131,7 @@
     <div class="selectChoices">
       <select id="edit_default_ep_status" name="default_ep_status" class="form-control form-control-inline input-sm">
           <option value="keep">&lt; keep &gt;</option>
-          % for curStatus in [WANTED, SKIPPED, ARCHIVED, IGNORED]:
+          % for curStatus in [WANTED, SKIPPED, IGNORED]:
           <option value="${curStatus}" ${('', 'selected="selected"')[curStatus == default_ep_status_value]}>${statusStrings[curStatus]}</option>
           % endfor
       </select>
diff --git a/gui/slick/views/manage_subtitleMissed.mako b/gui/slick/views/manage_subtitleMissed.mako
index 8a43b58d897f1b68c72e7341f09572bab9c2ae71..c5367207098f4366a1d6bbe99bf04f4630ef0eaf 100644
--- a/gui/slick/views/manage_subtitleMissed.mako
+++ b/gui/slick/views/manage_subtitleMissed.mako
@@ -6,7 +6,7 @@
     from sickbeard import common
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/manageSubtitleMissed.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/manageSubtitleMissed.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 <div id="content960">
@@ -25,7 +25,7 @@
 <br />
 % endif
 
-<form action="${sbRoot}/manage/subtitleMissed" method="get">
+<form action="${srRoot}/manage/subtitleMissed" method="get">
 Manage episodes without <select name="whichSubs" class="form-control form-control-inline input-sm">
 <option value="all">All</option>
 <% sub_langs = [subtitles.fromietf(x) for x in subtitles.wantedLanguages()] %>
@@ -40,7 +40,7 @@ subtitles
 % else:
 <input type="hidden" id="selectSubLang" name="selectSubLang" value="${whichSubs}" />
 
-<form action="${sbRoot}/manage/downloadSubtitleMissed" method="post">
+<form action="${srRoot}/manage/downloadSubtitleMissed" method="post">
 <h2>Episodes without ${subsLanguage} subtitles.</h2>
 <br />
 Download missed subtitles for selected episodes <input class="btn btn-inline" type="submit" value="Go" />
@@ -53,7 +53,7 @@ Download missed subtitles for selected episodes <input class="btn btn-inline" ty
 % for cur_indexer_id in sorted_show_ids:
  <tr id="${cur_indexer_id}">
   <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all"checked="checked" /></th>
-  <th colspan="3" style="width: 100%; text-align: left;"><a class="whitelink" href="${sbRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th>
+  <th colspan="3" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th>
  </tr>
 % endfor
 </table>
diff --git a/gui/slick/views/manage_torrents.mako b/gui/slick/views/manage_torrents.mako
index 4754c8cf968321f7a2d22eba1e38565c58364c6b..b4a95fa31035ab0fb650a1c0bb7e792101646e31 100644
--- a/gui/slick/views/manage_torrents.mako
+++ b/gui/slick/views/manage_torrents.mako
@@ -1,6 +1,6 @@
 <%inherit file="/layouts/main.mako"/>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
diff --git a/gui/slick/views/restart.mako b/gui/slick/views/restart.mako
index d43038c53e48e2110727e0ef27c27c8858fb2d2c..67510c016e01f8d415b6389602de236b20886b7c 100644
--- a/gui/slick/views/restart.mako
+++ b/gui/slick/views/restart.mako
@@ -15,15 +15,15 @@
         themeSpinner = sickbeard.THEME_NAME
 %>
 <script type="text/javascript" charset="utf-8">
-sbRoot = "${sbRoot}";
+srRoot = "${srRoot}";
 sbHttpPort = "${curSBHttpPort}";
 sbHttpsEnabled = "${curSBHttpsEnabled}";
 sbHandleReverseProxy = "${curSBHandleReverseProxy}";
 sbHost = "${curSBHost}";
 sbDefaultPage = "${sbDefaultPage}";
 </script>
-<script type="text/javascript" src="${sbRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
-<script type="text/javascript" src="${sbRoot}/js/restart.js?${sbPID}&amp;${sbDefaultPage}"></script>
+<script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/restart.js?${sbPID}&amp;${sbDefaultPage}"></script>
 </%block>
 <%block name="css">
 <style>
@@ -52,20 +52,20 @@ sbDefaultPage = "${sbDefaultPage}";
 <br />
 <div id="shut_down_message">
 Waiting for SickRage to shut down:
-<img src="${sbRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="shut_down_loading" />
-<img src="${sbRoot}/images/yes16.png" height="16" width="16" id="shut_down_success" style="display: none;" />
+<img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="shut_down_loading" />
+<img src="${srRoot}/images/yes16.png" height="16" width="16" id="shut_down_success" style="display: none;" />
 </div>
 
 <div id="restart_message" style="display: none;">
 Waiting for SickRage to start again:
-<img src="${sbRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="restart_loading" />
-<img src="${sbRoot}/images/yes16.png" height="16" width="16" id="restart_success" style="display: none;" />
-<img src="${sbRoot}/images/no16.png" height="16" width="16" id="restart_failure" style="display: none;" />
+<img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="restart_loading" />
+<img src="${srRoot}/images/yes16.png" height="16" width="16" id="restart_success" style="display: none;" />
+<img src="${srRoot}/images/no16.png" height="16" width="16" id="restart_failure" style="display: none;" />
 </div>
 
 <div id="refresh_message" style="display: none;">
 Loading the default page:
-<img src="${sbRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="refresh_loading" />
+<img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="refresh_loading" />
 </div>
 
 <div id="restart_fail_message" style="display: none;">
diff --git a/gui/slick/views/status.mako b/gui/slick/views/status.mako
index 818f76144004df2ee6b465b4b6ec47ee367f40fe..443ae18bedf53b4362fd5020007a92ca57f46775 100644
--- a/gui/slick/views/status.mako
+++ b/gui/slick/views/status.mako
@@ -6,17 +6,7 @@
     from sickrage.helper.common import dateTimeFormat
 %>
 <%block name="scripts">
-<script type="text/javascript">
-    $(document).ready(function() {
-        $("#schedulerStatusTable").tablesorter({
-            widgets: ['saveSort', 'zebra']
-        });
-        $("#queueStatusTable").tablesorter({
-            widgets: ['saveSort', 'zebra'],
-            sortList: [[3,0], [4,0], [2,1]]
-        });
-    });
-</script>
+<script type="text/javascript" src="${srRoot}/js/new/status.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
diff --git a/gui/slick/views/testRename.mako b/gui/slick/views/testRename.mako
index 08539495e69789a1f686d4bb661bee4cf417023d..f7410d50049bb48c8330fefecf96f3d14c3c7d73 100644
--- a/gui/slick/views/testRename.mako
+++ b/gui/slick/views/testRename.mako
@@ -9,7 +9,7 @@
     import re
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/testRename.js"></script>
+<script type="text/javascript" src="${srRoot}/js/testRename.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
diff --git a/gui/slick/views/trendingShows.mako b/gui/slick/views/trendingShows.mako
index 55c227204d4f1fa8380637d4804fe8b8b0a320ed..54e196ab23ad9ef147188b124987e5d6145a7ae1 100644
--- a/gui/slick/views/trendingShows.mako
+++ b/gui/slick/views/trendingShows.mako
@@ -12,7 +12,7 @@
 <meta data-var="sickbeard.SORT_ARTICLE" data-content="${sickbeard.SORT_ARTICLE}">
 </%block>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/new/trendingShows.js"></script>
+<script type="text/javascript" src="${srRoot}/js/new/trendingShows.js"></script>
 </%block>
 <%block name="content">
 <div id="container">
@@ -35,12 +35,12 @@
             </div>
 
         <div class="clearfix">
-            <p>${int(cur_show['show']['rating']*10)}% <img src="${sbRoot}/images/heart.png"></p>
+            <p>${int(cur_show['show']['rating']*10)}% <img src="${srRoot}/images/heart.png"></p>
             <i>${cur_show['show']['votes']} votes</i>
             <div class="traktShowTitleIcons">
-                <a href="${sbRoot}/home/addShows/addTraktShow?indexer_id=${cur_show['show']['ids']['tvdb']}&amp;showName=${cur_show['show']['title']}" class="btn btn-xs">Add Show</a>
+                <a href="${srRoot}/home/addShows/addTraktShow?indexer_id=${cur_show['show']['ids']['tvdb']}&amp;showName=${cur_show['show']['title']}" class="btn btn-xs">Add Show</a>
                 % if blacklist:
-                <a href="${sbRoot}/home/addShows/addShowToBlacklist?indexer_id=${cur_show['show']['ids']['tvdb'] or cur_show['show']['ids']['tvrage']}" class="btn btn-xs">Remove Show</a>
+                <a href="${srRoot}/home/addShows/addShowToBlacklist?indexer_id=${cur_show['show']['ids']['tvdb'] or cur_show['show']['ids']['tvrage']}" class="btn btn-xs">Remove Show</a>
                 % endif
             </div>
         </div>
diff --git a/gui/slick/views/viewlogs.mako b/gui/slick/views/viewlogs.mako
index 7037ddcf8b5a17daba7f8b65d0c0205e70f0e34b..c6c809cd8efcd6c9c8450b8f9f4c3dc97c03d6fa 100644
--- a/gui/slick/views/viewlogs.mako
+++ b/gui/slick/views/viewlogs.mako
@@ -5,7 +5,7 @@
     from sickbeard.logger import reverseNames
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${sbRoot}/js/new/viewlogs.js"></script>
+<script type="text/javascript" src="${srRoot}/js/new/viewlogs.js"></script>
 </%block>
 <%block name="content">
 % if not header is UNDEFINED:
diff --git a/lib/lockfile/__init__.py b/lib/lockfile/__init__.py
index d905af961b9e3f41045512dc512f6d46e5a3d0ad..04b23503cfd8b8c1373490a695881dd8370d6e0d 100644
--- a/lib/lockfile/__init__.py
+++ b/lib/lockfile/__init__.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
 """
 lockfile.py - Platform-independent advisory file locks.
 
@@ -68,7 +70,7 @@ if not hasattr(threading.Thread, "get_name"):
 
 __all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked',
            'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock',
-           'LinkLockFile', 'MkdirLockFile', 'SQLiteLockFile',
+           'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock',
            'LockBase', 'locked']
 
 class Error(Exception):
@@ -154,14 +156,58 @@ class NotMyLock(UnlockError):
     """
     pass
 
-class LockBase:
+class _SharedBase(object):
+    def __init__(self, path):
+        self.path = path
+
+    def acquire(self, timeout=None):
+        """
+        Acquire the lock.
+
+        * If timeout is omitted (or None), wait forever trying to lock the
+          file.
+
+        * If timeout > 0, try to acquire the lock for that many seconds.  If
+          the lock period expires and the file is still locked, raise
+          LockTimeout.
+
+        * If timeout <= 0, raise AlreadyLocked immediately if the file is
+          already locked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def release(self):
+        """
+        Release the lock.
+
+        If the file is not locked, raise NotLocked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def __enter__(self):
+        """
+        Context manager support.
+        """
+        self.acquire()
+        return self
+
+    def __exit__(self, *_exc):
+        """
+        Context manager support.
+        """
+        self.release()
+
+    def __repr__(self):
+        return "<%s: %r>" % (self.__class__.__name__, self.path)
+
+class LockBase(_SharedBase):
     """Base class for platform-specific lock classes."""
     def __init__(self, path, threaded=True, timeout=None):
         """
         >>> lock = LockBase('somefile')
         >>> lock = LockBase('somefile', threaded=False)
         """
-        self.path = path
+        super(LockBase, self).__init__(path)
         self.lock_file = os.path.abspath(path) + ".lock"
         self.hostname = socket.gethostname()
         self.pid = os.getpid()
@@ -189,30 +235,6 @@ class LockBase:
                                                        hash(self.path)))
         self.timeout = timeout
 
-    def acquire(self, timeout=None):
-        """
-        Acquire the lock.
-
-        * If timeout is omitted (or None), wait forever trying to lock the
-          file.
-
-        * If timeout > 0, try to acquire the lock for that many seconds.  If
-          the lock period expires and the file is still locked, raise
-          LockTimeout.
-
-        * If timeout <= 0, raise AlreadyLocked immediately if the file is
-          already locked.
-        """
-        raise NotImplemented("implement in subclass")
-
-    def release(self):
-        """
-        Release the lock.
-
-        If the file is not locked, raise NotLocked.
-        """
-        raise NotImplemented("implement in subclass")
-
     def is_locked(self):
         """
         Tell whether or not the file is locked.
@@ -231,19 +253,6 @@ class LockBase:
         """
         raise NotImplemented("implement in subclass")
 
-    def __enter__(self):
-        """
-        Context manager support.
-        """
-        self.acquire()
-        return self
-
-    def __exit__(self, *_exc):
-        """
-        Context manager support.
-        """
-        self.release()
-
     def __repr__(self):
         return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name,
                                    self.path)
diff --git a/lib/lockfile/linklockfile.py b/lib/lockfile/linklockfile.py
index 770350f2ee8860844a3b41a84f8b7a97202d830b..ab5e1f21e18a36fb47d6599ef47c48709e34439e 100644
--- a/lib/lockfile/linklockfile.py
+++ b/lib/lockfile/linklockfile.py
@@ -5,7 +5,6 @@ import os
 
 from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout,
                AlreadyLocked)
-import errno
 
 class LinkLockFile(LockBase):
     """Lock access to a file using atomic property of link(2).
@@ -20,7 +19,7 @@ class LinkLockFile(LockBase):
         except IOError:
             raise LockFailed("failed to create %s" % self.unique_name)
 
-        timeout = timeout is not None and timeout or self.timeout
+        timeout = timeout if timeout is not None else self.timeout
         end_time = time.time()
         if timeout is not None and timeout > 0:
             end_time += timeout
@@ -29,9 +28,7 @@ class LinkLockFile(LockBase):
             # Try and create a hard link to it.
             try:
                 os.link(self.unique_name, self.lock_file)
-            except OSError as e:
-                if e.errno == errno.ENOSYS:
-                    raise LockFailed("%s" % e.strerror)
+            except OSError:
                 # Link creation failed.  Maybe we've double-locked?
                 nlinks = os.stat(self.unique_name).st_nlink
                 if nlinks == 2:
diff --git a/lib/lockfile/mkdirlockfile.py b/lib/lockfile/mkdirlockfile.py
index 8d2c801f9dc3d8a1f8adbbf9fa399e1b3b0d3e7b..caf462e8408d5e67e3ee086c38b64b66be2b8bc4 100644
--- a/lib/lockfile/mkdirlockfile.py
+++ b/lib/lockfile/mkdirlockfile.py
@@ -24,7 +24,7 @@ class MkdirLockFile(LockBase):
                                                       self.pid))
 
     def acquire(self, timeout=None):
-        timeout = timeout is not None and timeout or self.timeout
+        timeout = timeout if timeout is not None else self.timeout
         end_time = time.time()
         if timeout is not None and timeout > 0:
             end_time += timeout
diff --git a/lib/lockfile/pidlockfile.py b/lib/lockfile/pidlockfile.py
index e92f9eadcd497fa653ec1ff72e7552e499e6fac5..c4c8a39adb940b6e0ee98cb4e6ebe661aed2f9de 100644
--- a/lib/lockfile/pidlockfile.py
+++ b/lib/lockfile/pidlockfile.py
@@ -70,7 +70,7 @@ class PIDLockFile(LockBase):
         the lock could not be acquired.
         """
 
-        timeout = timeout is not None and timeout or self.timeout
+        timeout = timeout if timeout is not None else self.timeout
         end_time = time.time()
         if timeout is not None and timeout > 0:
             end_time += timeout
@@ -81,8 +81,8 @@ class PIDLockFile(LockBase):
             except OSError as exc:
                 if exc.errno == errno.EEXIST:
                     # The lock creation failed.  Maybe sleep a bit.
-                    if timeout is not None and time.time() > end_time:
-                        if timeout > 0:
+                    if time.time() > end_time:
+                        if timeout is not None and timeout > 0:
                             raise LockTimeout("Timeout waiting to acquire"
                                               " lock for %s" %
                                               self.path)
diff --git a/lib/lockfile/sqlitelockfile.py b/lib/lockfile/sqlitelockfile.py
index 7dee4a851df16058ec18d60f3faf8e04677af9ec..734ce0308bf71193fa76ce8b7ffea1b1384c77e4 100644
--- a/lib/lockfile/sqlitelockfile.py
+++ b/lib/lockfile/sqlitelockfile.py
@@ -50,7 +50,7 @@ class SQLiteLockFile(LockBase):
             atexit.register(os.unlink, SQLiteLockFile.testdb)
 
     def acquire(self, timeout=None):
-        timeout = timeout is not None and timeout or self.timeout
+        timeout = timeout if timeout is not None else self.timeout
         end_time = time.time()
         if timeout is not None and timeout > 0:
             end_time += timeout
diff --git a/lib/lockfile/symlinklockfile.py b/lib/lockfile/symlinklockfile.py
index 57551a36485363c3bd9776e4b5baf23905292e11..b5dd71f857580b05fa6132f414c1adc9580f730c 100644
--- a/lib/lockfile/symlinklockfile.py
+++ b/lib/lockfile/symlinklockfile.py
@@ -21,7 +21,7 @@ class SymlinkLockFile(LockBase):
         #    open(self.unique_name, "wb").close()
         #except IOError:
         #    raise LockFailed("failed to create %s" % self.unique_name)
-        timeout = timeout is not None and timeout or self.timeout
+        timeout = timeout if timeout is not None else self.timeout
         end_time = time.time()
         if timeout is not None and timeout > 0:
             end_time += timeout
diff --git a/lib/pkg_resources.py b/lib/pkg_resources.py
index 79db00b8c28de9ba8cd82d242a6150c820cbf31c..269398d7e754e53d6729414808413571f0a4566b 100644
--- a/lib/pkg_resources.py
+++ b/lib/pkg_resources.py
@@ -218,8 +218,12 @@ def get_build_platform():
     XXX Currently this is the same as ``distutils.util.get_platform()``, but it
     needs some hacks for Linux and Mac OS X.
     """
-    from distutils.util import get_platform
-    plat = get_platform()
+    try:
+        from distutils.util import get_platform
+        plat = get_platform()
+    except ImportError:
+        import platform
+        plat = platform.platform()
     if sys.platform == "darwin" and not plat.startswith('macosx-'):
         try:
             version = _macosx_vers()
diff --git a/lib/tvdb_api/tvdb_api.py b/lib/tvdb_api/tvdb_api.py
index de06dd88053334f96ca93f01ab5a89c4bf00cc3d..bf0180303a1a92e991c1f9c153929a06beea91f4 100644
--- a/lib/tvdb_api/tvdb_api.py
+++ b/lib/tvdb_api/tvdb_api.py
@@ -566,7 +566,7 @@ class Tvdb:
             # get response from TVDB
             if self.config['cache_enabled']:
 
-                session = CacheControl(sess=self.config['session'], cache=caches.FileCache(self.config['cache_location']), cache_etags=False)
+                session = CacheControl(sess=self.config['session'], cache=caches.FileCache(self.config['cache_location'], use_dir_lock=True), cache_etags=False)
                 if self.config['proxy']:
                     log().debug("Using proxy for URL: %s" % url)
                     session.proxies = {
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index 58defa1636bac444429e7056fec168cbd75bd1c4..4124b784b1cf139484292645af7dd01af07824be 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -39,7 +39,7 @@ from sickbeard import providers
 from sickbeard.providers.generic import GenericProvider
 from sickbeard.providers import btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \
     omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, bluetigers, cpasbien, fnt, xthor, torrentbytes, \
-    frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, \
+    frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, torrentproject, \
     scenetime, btdigg, strike, transmitthenet, tvchaosuk
 from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \
     naming_ep_type
@@ -212,6 +212,7 @@ INDEXER_DEFAULT = None
 INDEXER_TIMEOUT = None
 SCENE_DEFAULT = False
 ANIME_DEFAULT = False
+ARCHIVE_DEFAULT = False
 PROVIDER_ORDER = []
 
 NAMING_MULTI_EP = False
@@ -600,7 +601,7 @@ def initialize(consoleLogging=True):
             USE_FAILED_DOWNLOADS, DELETE_FAILED, ANON_REDIRECT, LOCALHOST_IP, TMDB_API_KEY, DEBUG, DEFAULT_PAGE, PROXY_SETTING, PROXY_INDEXERS, \
             AUTOPOSTPROCESSER_FREQUENCY, SHOWUPDATE_HOUR, DEFAULT_AUTOPOSTPROCESSER_FREQUENCY, MIN_AUTOPOSTPROCESSER_FREQUENCY, \
             ANIME_DEFAULT, NAMING_ANIME, ANIMESUPPORT, USE_ANIDB, ANIDB_USERNAME, ANIDB_PASSWORD, ANIDB_USE_MYLIST, \
-            ANIME_SPLIT_HOME, SCENE_DEFAULT, DOWNLOAD_URL, BACKLOG_DAYS, GIT_ORG, GIT_REPO, GIT_USERNAME, GIT_PASSWORD, \
+            ANIME_SPLIT_HOME, SCENE_DEFAULT, ARCHIVE_DEFAULT, DOWNLOAD_URL, BACKLOG_DAYS, GIT_ORG, GIT_REPO, GIT_USERNAME, GIT_PASSWORD, \
             GIT_AUTOISSUES, DEVELOPER, gh, DISPLAY_ALL_SEASONS, SSL_VERIFY
 
         if __INITIALIZED__:
@@ -806,6 +807,7 @@ def initialize(consoleLogging=True):
         INDEXER_TIMEOUT = check_setting_int(CFG, 'General', 'indexer_timeout', 20)
         ANIME_DEFAULT = bool(check_setting_int(CFG, 'General', 'anime_default', 0))
         SCENE_DEFAULT = bool(check_setting_int(CFG, 'General', 'scene_default', 0))
+        ARCHIVE_DEFAULT = bool(check_setting_int(CFG, 'General', 'archive_default', 0))
 
         PROVIDER_ORDER = check_setting_str(CFG, 'General', 'provider_order', '').split()
 
@@ -1668,6 +1670,7 @@ def save_config():
     new_config['General']['indexer_timeout'] = int(INDEXER_TIMEOUT)
     new_config['General']['anime_default'] = int(ANIME_DEFAULT)
     new_config['General']['scene_default'] = int(SCENE_DEFAULT)
+    new_config['General']['archive_default'] = int(ARCHIVE_DEFAULT)
     new_config['General']['provider_order'] = ' '.join(PROVIDER_ORDER)
     new_config['General']['version_notify'] = int(VERSION_NOTIFY)
     new_config['General']['auto_update'] = int(AUTO_UPDATE)
diff --git a/sickbeard/common.py b/sickbeard/common.py
index 92703e7aa940a105c865ce9d0fcdfa1c0c90fc03..c96d6d24a7b65e2e9f0b49c80adeb7b0b37674fc 100644
--- a/sickbeard/common.py
+++ b/sickbeard/common.py
@@ -268,7 +268,7 @@ class Quality:
         if checkName([r"(pdtv|hd.?tv|dsr|tvrip).(xvid|x26[45]|h.?26[45])"], all) and not checkName([r"(720|1080)[pi]"], all) and\
                 not checkName([r"hr.ws.pdtv.x26[45]"], any):
             ret = Quality.SDTV
-        elif checkName([r"web.dl|webrip", r"xvid|x26[45]|h.?26[45]"], all) and not checkName([r"(720|1080)[pi]"], all):
+        elif checkName([r"web.?dl|webrip", r"xvid|x26[45]|h.?26[45]"], all) and not checkName([r"(720|1080)[pi]"], all):
             ret = Quality.SDTV
         elif checkName([r"(dvdrip|b[rd]rip|blue?-?ray)(.ws)?.(xvid|divx|x26[45])"], any) and not checkName([r"(720|1080)[pi]"], all):
             ret = Quality.SDDVD
@@ -360,8 +360,8 @@ class Quality:
             return Quality.UNKNOWN
 
         base_filename = os.path.basename(filename)
-        bluray = re.search(r'blue?-?ray', base_filename, re.I) is not None
-        webdl = re.search(r'web-?dl', base_filename, re.I) is not None
+        bluray = re.search(r'b[rd]rip|blue?-?ray', base_filename, re.I) is not None
+        webdl = re.search(r'web.?dl|webrip', base_filename, re.I) is not None
 
         ret = Quality.UNKNOWN
         if height > 1000:
@@ -369,7 +369,7 @@ class Quality:
         elif height > 680 and height < 800:
             ret = ((Quality.HDTV, Quality.HDBLURAY)[bluray], Quality.HDWEBDL)[webdl]
         elif height < 680:
-            ret = (Quality.SDTV, Quality.SDDVD)[re.search(r'dvd', base_filename, re.I) is not None]
+            ret = (Quality.SDTV, Quality.SDDVD)[re.search(r'dvd|b[rd]rip|blue?-?ray', base_filename, re.I) is not None]
 
         return ret
 
@@ -459,19 +459,23 @@ class StatusStrings:
                               FAILED: "Failed",
                               SNATCHED_BEST: "Snatched (Best)"}
 
-    def __getitem__(self, name):
-        if name in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED:
-            status, quality = Quality.splitCompositeStatus(name)
+    def __getitem__(self, key):
+        key = int(key)
+        if key in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED:
+            status, quality = Quality.splitCompositeStatus(key)
             if quality == Quality.NONE:
                 return self.statusStrings[status]
             else:
                 return self.statusStrings[status] + " (" + Quality.qualityStrings[quality] + ")"
         else:
-            return self.statusStrings[name] if self.statusStrings.has_key(name) else ''
+            return self.statusStrings[key] if self.statusStrings.has_key(key) else ''
 
-    def has_key(self, name):
-        return name in self.statusStrings or name in Quality.DOWNLOADED or name in Quality.SNATCHED or name in Quality.SNATCHED_PROPER or name in Quality.SNATCHED_BEST
+    def has_key(self, key):
+        key = int(key)
+        return key in self.statusStrings or key in Quality.DOWNLOADED + Quality.ARCHIVED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST
 
+    def __contains__(self, key):
+        return self.has_key(key)
 
 statusStrings = StatusStrings()
 
diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py
index 40012f5d5f0348abb1c91cfa0ea02d8c6f5b4d0d..cbe45a0bf599a6a09589e251debd60a2d767ce7d 100644
--- a/sickbeard/databases/mainDB.py
+++ b/sickbeard/databases/mainDB.py
@@ -27,7 +27,7 @@ from sickbeard.name_parser.parser import NameParser, InvalidNameException, Inval
 from sickrage.helper.common import dateTimeFormat
 from sickrage.helper.encoding import ek
 
-from babelfish import language_converters
+from babelfish import language_converters, Language
 
 MIN_DB_VERSION = 9  # oldest db version we support migrating from
 MAX_DB_VERSION = 42
@@ -241,6 +241,8 @@ class MainSanityCheck(db.DBSanityCheck):
             "SELECT subtitles, episode_id FROM tv_episodes WHERE subtitles != '' AND subtitles_lastsearch < ?;",
                 [datetime.datetime(2015, 7, 15, 17, 20, 44, 326380).strftime(dateTimeFormat)])
 
+        validLanguages = [Language.fromopensubtitles(language).opensubtitles for language in language_converters['opensubtitles'].codes if len(language) == 3]
+
         if not sqlResults:
             return
 
@@ -251,7 +253,7 @@ class MainSanityCheck(db.DBSanityCheck):
                 (sqlResult['episode_id'], sqlResult['subtitles']), logger.DEBUG)
 
             for subcode in sqlResult['subtitles'].split(','):
-                if not len(subcode) is 3 or not subcode in language_converters['opensubtitles'].codes:
+                if not len(subcode) is 3 or not subcode in validLanguages:
                     logger.log("Fixing subtitle codes for episode_id: %s, invalid code: %s" %
                         (sqlResult['episode_id'], subcode), logger.DEBUG)
                     continue
diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index 08a42bad346bfbc241cabe2bfc6fb3ee0544e7af..8e1738be846f2933440235f64fbaae4ad91546b2 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -117,6 +117,7 @@ def remove_extension(name):
     """
 
     if name and "." in name:
+        # pylint: disable=W0612
         base_name, sep, extension = name.rpartition('.')  # @UnusedVariable
         if base_name and extension.lower() in ['nzb', 'torrent'] + mediaExtensions:
             name = base_name
@@ -136,37 +137,37 @@ def remove_non_release_groups(name):
     # Check your database for funky release_names and add them here, to improve failed handling, archiving, and history.
     # select release_name from tv_episodes WHERE LENGTH(release_name);
     # [eSc], [SSG], [GWC] are valid release groups for non-anime
-    removeWordsList = {'\[rartv\]$':       'searchre',
-                       '\[rarbg\]$':       'searchre',
-                       '\[eztv\]$':        'searchre',
-                       '\[ettv\]$':        'searchre',
-                       '\[vtv\]$':         'searchre',
-                       '\[GloDLS\]$':      'searchre',
-                       '\[silv4\]$':       'searchre',
-                       '\[Seedbox\]$':     'searchre',
-                       '\[AndroidTwoU\]$': 'searchre',
-                       '\.\[BT\]$': 'searchre',
-                       ' \[1044\]$':       'searchre',
-                       '\.RiPSaLoT$':      'searchre',
-                       '\.GiuseppeTnT$':   'searchre',
-                       '\.Renc$':   'searchre',
-                       '-NZBGEEK$':        'searchre',
-                       '-Siklopentan$':        'searchre',
-                       '-RP$':             'searchre',
-                       '-20-40$':          'searchre',
-                       '\.\[www\.usabit\.com\]$': 'searchre',
-                       '\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre',
-                       '- \[ www\.torrentday\.com \]$': 'searchre',
-                       '- \{ www\.SceneTime\.com \}$': 'searchre',
-                       '^\{ www\.SceneTime\.com \} - ': 'searchre',
-                       '^\[ www\.TorrentDay\.com \] - ': 'searchre',
-                       '^\]\.\[ www\.tensiontorrent.com \] - ': 'searchre',
-                       '^\]\.\[www\.tensiontorrent.com\] - ': 'searchre',
-                       '^\[ www\.Cpasbien\.pw \] ': 'searchre',
-                       '^\[ www\.Cpasbien\.com \] ': 'searchre',
-                       '^\[www\.Cpasbien\.com\] ': 'searchre',
-                       '^\[www\.Cpasbien\.pe\] ': 'searchre',
-                       '^\[www\.frenchtorrentdb\.com\] ': 'searchre',
+    removeWordsList = {r'\[rartv\]$':       'searchre',
+                       r'\[rarbg\]$':       'searchre',
+                       r'\[eztv\]$':        'searchre',
+                       r'\[ettv\]$':        'searchre',
+                       r'\[vtv\]$':         'searchre',
+                       r'\[GloDLS\]$':      'searchre',
+                       r'\[silv4\]$':       'searchre',
+                       r'\[Seedbox\]$':     'searchre',
+                       r'\[AndroidTwoU\]$': 'searchre',
+                       r'\.\[BT\]$':        'searchre',
+                       r' \[1044\]$':       'searchre',
+                       r'\.RiPSaLoT$':      'searchre',
+                       r'\.GiuseppeTnT$':   'searchre',
+                       r'\.Renc$':          'searchre',
+                       r'-NZBGEEK$':        'searchre',
+                       r'-Siklopentan$':    'searchre',
+                       r'-RP$':                             'searchre',
+                       r'-20-40$':                          'searchre',
+                       r'\.\[www\.usabit\.com\]$':          'searchre',
+                       r'^\[www\.Cpasbien\.pe\] ':          'searchre',
+                       r'^\[www\.Cpasbien\.com\] ':         'searchre',
+                       r'^\[ www\.Cpasbien\.pw \] ':        'searchre',
+                       r'^\[ www\.Cpasbien\.com \] ':       'searchre',
+                       r'- \{ www\.SceneTime\.com \}$':     'searchre',
+                       r'^\{ www\.SceneTime\.com \} - ':    'searchre',
+                       r'- \[ www\.torrentday\.com \]$':    'searchre',
+                       r'^\[ www\.TorrentDay\.com \] - ':   'searchre',
+                       r'^\[www\.frenchtorrentdb\.com\] ':  'searchre',
+                       r'^\]\.\[www\.tensiontorrent.com\] - ':      'searchre',
+                       r'^\]\.\[ www\.tensiontorrent.com \] - ':    'searchre',
+                       r'\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre',
                       }
 
     _name = name
@@ -235,7 +236,7 @@ def isMediaFile(filename):
     """
 
     # ignore samples
-    if re.search('(^|[\W_])(sample\d*)[\W_]', filename, re.I):
+    if re.search(r'(^|[\W_])(sample\d*)[\W_]', filename, re.I):
         return False
 
     # ignore MAC OS's retarded "resource fork" files
@@ -261,7 +262,7 @@ def isRarFile(filename):
     :return: True if this is RAR/Part file, False if not
     """
 
-    archive_regex = '(?P<file>^(?P<base>(?:(?!\.part\d+\.rar$).)*)\.(?:(?:part0*1\.)?rar)$)'
+    archive_regex = r'(?P<file>^(?P<base>(?:(?!\.part\d+\.rar$).)*)\.(?:(?:part0*1\.)?rar)$)'
 
     if re.search(archive_regex, filename):
         return True
@@ -308,7 +309,7 @@ def sanitizeFileName(name):
     return name
 
 
-def _remove_file_failed(file):
+def _remove_file_failed(failed_file):
     """
     Remove file from filesystem
 
@@ -316,8 +317,8 @@ def _remove_file_failed(file):
     """
 
     try:
-        ek(os.remove, file)
-    except:
+        ek(os.remove, failed_file)
+    except Exception:
         pass
 
 
@@ -372,7 +373,7 @@ def searchDBForShow(regShowName, log=False):
 
     showNames = [re.sub('[. -]', ' ', regShowName)]
 
-    yearRegex = "([^()]+?)\s*(\()?(\d{4})(?(2)\))$"
+    yearRegex = r"([^()]+?)\s*(\()?(\d{4})(?(2)\))$"
 
     myDB = db.DBConnection()
     for showName in showNames:
@@ -423,7 +424,8 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None):
     for i in sickbeard.indexerApi().indexers if not indexer else int(indexer or []):
         # Query Indexers for each search term and build the list of results
         lINDEXER_API_PARMS = sickbeard.indexerApi(i).api_params.copy()
-        if ui is not None: lINDEXER_API_PARMS['custom_ui'] = ui
+        if ui is not None:
+            lINDEXER_API_PARMS['custom_ui'] = ui
         t = sickbeard.indexerApi(i).indexer(**lINDEXER_API_PARMS)
 
         for name in showNames:
@@ -431,17 +433,17 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None):
 
             try:
                 search = t[indexer_id] if indexer_id else t[name]
-            except:
+            except Exception:
                 continue
 
             try:
                 seriesname = search[0]['seriesname']
-            except:
+            except Exception:
                 seriesname = None
 
             try:
                 series_id = search[0]['id']
-            except:
+            except Exception:
                 series_id = None
 
             if not (seriesname and series_id):
@@ -544,9 +546,8 @@ def link(src, dst):
     """
 
     if os.name == 'nt':
-        import ctypes
-
-        if ctypes.windll.kernel32.CreateHardLinkW(unicode(dst), unicode(src), 0) == 0: raise ctypes.WinError()
+        if ctypes.windll.kernel32.CreateHardLinkW(unicode(dst), unicode(src), 0) == 0:
+            raise ctypes.WinError()
     else:
         os.link(src, dst)
 
@@ -577,10 +578,8 @@ def symlink(src, dst):
     """
 
     if os.name == 'nt':
-        import ctypes
-
-        if ctypes.windll.kernel32.CreateSymbolicLinkW(unicode(dst), unicode(src), 1 if os.path.isdir(src) else 0) in [0,
-                                                                                                                      1280]: raise ctypes.WinError()
+        if ctypes.windll.kernel32.CreateSymbolicLinkW(unicode(dst), unicode(src), 1 if os.path.isdir(src) else 0) in [0, 1280]:
+            raise ctypes.WinError()
     else:
         os.symlink(src, dst)
 
@@ -598,7 +597,7 @@ def moveAndSymlinkFile(srcFile, destFile):
         ek(shutil.move, srcFile, destFile)
         fixSetGroupID(destFile)
         ek(symlink, destFile, srcFile)
-    except:
+    except Exception:
         logger.log(u"Failed to create symlink of " + srcFile + " at " + destFile + ". Copying instead", logger.ERROR)
         copyFile(srcFile, destFile)
 
@@ -918,7 +917,7 @@ def sanitizeSceneName(name, anime=False):
 
     # tidy up stuff that doesn't belong in scene names
     name = name.replace("- ", ".").replace(" ", ".").replace("&", "and").replace('/', '.')
-    name = re.sub("\.\.*", ".", name)
+    name = re.sub(r"\.\.*", ".", name)
 
     if name.endswith('.'):
         name = name[:-1]
@@ -971,7 +970,7 @@ def create_https_certificates(ssl_cert, ssl_key):
         from OpenSSL import crypto  # @UnresolvedImport
         from certgen import createKeyPair, createCertRequest, createCertificate, TYPE_RSA, \
             serial  # @UnresolvedImport
-    except Exception as e:
+    except Exception:
         logger.log(u"pyopenssl module missing, please install for https access", logger.WARNING)
         return False
 
@@ -989,7 +988,7 @@ def create_https_certificates(ssl_cert, ssl_key):
     try:
         open(ssl_key, 'w').write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey))
         open(ssl_cert, 'w').write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
-    except:
+    except Exception:
         logger.log(u"Error creating SSL key and certificate", logger.ERROR)
         return False
 
@@ -1097,7 +1096,7 @@ def tryInt(s, s_default=0):
 
     try:
         return int(s)
-    except:
+    except Exception:
         return s_default
 
 
@@ -1127,8 +1126,10 @@ def md5_for_file(filename, block_size=2 ** 16):
 def get_lan_ip():
     """Returns IP of system"""
 
-    try:return [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][0]
-    except:return socket.gethostname()
+    try:
+        return [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][0]
+    except Exception:
+        return socket.gethostname()
 
 def check_url(url):
     """
@@ -1389,7 +1390,7 @@ def extractZip(archive, targetDir):
         return False
 
 
-def backupConfigZip(fileList, archive, arcname = None):
+def backupConfigZip(fileList, archive, arcname=None):
     """
     Store the config file as a ZIP
 
@@ -1563,7 +1564,7 @@ def _setUpSession(session, headers):
 
     # request session
     cache_dir = sickbeard.CACHE_DIR or _getTempDir()
-    session = CacheControl(sess=session, cache=caches.FileCache(os.path.join(cache_dir, 'sessions')), cache_etags=False)
+    session = CacheControl(sess=session, cache=caches.FileCache(os.path.join(cache_dir, 'sessions'), use_dir_lock=True), cache_etags=False)
 
     # request session clear residual referer
     if 'Referer' in session.headers and not 'Referer' in headers:
@@ -1689,7 +1690,7 @@ def download_file(url, filename, session=None, headers={}):
                             fp.flush()
 
                 chmodAsParent(filename)
-            except:
+            except Exception:
                 logger.log(u"Problem setting permissions or writing file to: %s" % filename, logger.WARNING)
 
     except requests.exceptions.HTTPError as e:
@@ -1842,16 +1843,16 @@ def verify_freespace(src, dest, oldfile=None):
 
     try:
         diskfree = disk_usage(dest)
-    except:
+    except Exception:
         logger.log("Unable to determine free space, so I will assume there is enough.", logger.WARNING)
         return True
 
     neededspace = ek(os.path.getsize, src)
 
     if oldfile:
-        for file in oldfile:
-            if ek(os.path.isfile, file.location):
-                diskfree += ek(os.path.getsize, file.location)
+        for f in oldfile:
+            if ek(os.path.isfile, f.location):
+                diskfree += ek(os.path.getsize, f.location)
 
     if diskfree > neededspace:
         return True
@@ -1879,7 +1880,7 @@ def pretty_time_delta(seconds):
 
     return time_delta
 
-def isFileLocked(file, writeLockCheck=False):
+def isFileLocked(checkfile, writeLockCheck=False):
     '''
     Checks to see if a file is locked. Performs three checks
         1. Checks if the file even exists
@@ -1891,22 +1892,22 @@ def isFileLocked(file, writeLockCheck=False):
     :param file: the file being checked
     :param writeLockCheck: when true will check if the file is locked for writing (prevents move operations)
     '''
-    if not ek(os.path.exists, file):
+    if not ek(os.path.exists, checkfile):
         return True
     try:
-        f = ek(open, file, 'r')
+        f = ek(open, checkfile, 'r')
         f.close()
     except IOError:
         return True
 
     if writeLockCheck:
-        lockFile = file + ".lckchk"
+        lockFile = checkfile + ".lckchk"
         if ek(os.path.exists, lockFile):
             ek(os.remove, lockFile)
         try:
-            ek(os.rename, file, lockFile)
+            ek(os.rename, checkfile, lockFile)
             time.sleep(1)
-            ek(os.rename, lockFile, file)
+            ek(os.rename, lockFile, checkfile)
         except (OSError, IOError):
             return True
 
diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py
index 8314f0467776b8d49f196ed411bdfba50e6e622b..40bc790c8b38d1e6c0509edbc6a6a6dbee330ba7 100644
--- a/sickbeard/providers/__init__.py
+++ b/sickbeard/providers/__init__.py
@@ -54,7 +54,8 @@ __all__ = ['womble',
            'btdigg',
            'strike',
            'transmitthenet',
-           'tvchaosuk'
+           'tvchaosuk',
+           'torrentproject'
 ]
 
 import sickbeard
diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py
index 2d6c03fd2459bc59655d759c98ca341217f6d68b..37fe0f583d158e0cb326bf6cceff028a88116a95 100644
--- a/sickbeard/providers/newznab.py
+++ b/sickbeard/providers/newznab.py
@@ -135,45 +135,41 @@ class NewznabProvider(generic.NZBProvider):
     def _get_season_search_strings(self, ep_obj):
 
         to_return = []
-        cur_params = {}
+        params = {}
         if not ep_obj:
             return to_return
 
-        cur_params['maxage'] = (datetime.datetime.now() - datetime.datetime.combine(ep_obj.airdate, datetime.datetime.min.time())).days + 1
+        params['maxage'] = (datetime.datetime.now() - datetime.datetime.combine(ep_obj.airdate, datetime.datetime.min.time())).days + 1
+        params['tvdbid'] = ep_obj.show.indexerid
 
         # season
         if ep_obj.show.air_by_date or ep_obj.show.sports:
             date_str = str(ep_obj.airdate).split('-')[0]
-            cur_params['season'] = date_str
-            cur_params['q'] = date_str.replace('-', '.')
+            params['season'] = date_str
+            params['q'] = date_str.replace('-', '.')
         else:
-            cur_params['season'] = str(ep_obj.scene_season)
+            params['season'] = str(ep_obj.scene_season)
 
-        if 'rid' in cur_params:
-            cur_params.pop('rid')
-            cur_params.pop('attrs')
+        save_q = ' ' + params['q'] if 'q' in params else ''
 
-        save_q = ''
-        if 'q' in cur_params:
-            save_q = ' ' + cur_params['q']
 
         # add new query strings for exceptions
         name_exceptions = list(
             set([ep_obj.show.name] + scene_exceptions.get_scene_exceptions(ep_obj.show.indexerid)))
         for cur_exception in name_exceptions:
-            cur_params['q'] = helpers.sanitizeSceneName(cur_exception) + save_q
-            to_return.append(dict(cur_params))
+            params['q'] = helpers.sanitizeSceneName(cur_exception) + save_q
+            to_return.append(dict(params))
 
         return to_return
 
     def _get_episode_search_strings(self, ep_obj, add_string=''):
         to_return = []
         params = {}
-
         if not ep_obj:
             return to_return
 
         params['maxage'] = (datetime.datetime.now() - datetime.datetime.combine(ep_obj.airdate, datetime.datetime.min.time())).days + 1
+        params['tvdbid'] = ep_obj.show.indexerid
 
         if ep_obj.show.air_by_date or ep_obj.show.sports:
             date_str = str(ep_obj.airdate)
@@ -183,10 +179,6 @@ class NewznabProvider(generic.NZBProvider):
             params['season'] = ep_obj.scene_season
             params['ep'] = ep_obj.scene_episode
 
-        if 'rid' in params:
-            params.pop('rid')
-            params.pop('attrs')
-
         # add new query strings for exceptions
         name_exceptions = list(
             set([ep_obj.show.name] + scene_exceptions.get_scene_exceptions(ep_obj.show.indexerid)))
@@ -367,7 +359,6 @@ class NewznabCache(tvcache.TVCache):
 
         params = {"t": "tvsearch",
                   "cat": self.provider.catIDs + ',5060,5070',
-                  "attrs": "rageid",
                   "maxage": 4,
                  }
 
diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1a6958040f6a144074c4074ab9472039408da49
--- /dev/null
+++ b/sickbeard/providers/torrentproject.py
@@ -0,0 +1,175 @@
+# Author: duramato <matigonkas@outlook.com>
+# URL: https://github.com/SiCKRAGETV/sickrage
+#
+# This file is part of SickRage.
+#
+# SickRage is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# SickRage is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with SickRage.  If not, see <http://www.gnu.org/licenses/>.
+
+import datetime
+import generic
+import json
+
+from sickbeard import logger
+from sickbeard import tvcache
+from sickbeard import show_name_helpers
+from sickbeard import db
+from sickbeard.common import WANTED
+from sickbeard.config import naming_ep_type
+from sickbeard.helpers import sanitizeSceneName
+
+class TORRENTPROJECTProvider(generic.TorrentProvider):
+
+    def __init__(self):
+        generic.TorrentProvider.__init__(self, "TorrentProject")
+
+        self.supportsBacklog = True
+        self.public = True
+        
+        self.urls = {'api': u'https://torrentproject.se/',}
+        self.url = self.urls['api']
+        self.minseed = None
+        self.minleech = None
+        self.cache = TORRENTPROJECTCache(self)
+
+    def isEnabled(self):
+        return self.enabled
+
+
+    def imageName(self):
+        return 'torrentproject.png'
+
+
+    def _get_airbydate_season_range(self, season):
+        if season == None:
+            return ()
+        year, month = map(int, season.split('-'))
+        min_date = datetime.date(year, month, 1)
+        if month == 12:
+            max_date = datetime.date(year, month, 31)
+        else:
+            max_date = datetime.date(year, month+1, 1) -  datetime.timedelta(days=1)
+        return (min_date, max_date)
+
+
+    def _get_season_search_strings(self, show, season=None):
+        search_string = []
+
+        if not (show and season):
+            return []
+
+        myDB = db.DBConnection()
+
+        if show.air_by_date:
+            (min_date, max_date) = self._get_airbydate_season_range(season)
+            sqlResults = myDB.select("SELECT DISTINCT airdate FROM tv_episodes WHERE showid = ? AND airdate >= ? AND airdate <= ? AND status = ?", [show.tvdbid,  min_date.toordinal(), max_date.toordinal(), WANTED])
+        else:
+            sqlResults = myDB.select("SELECT DISTINCT season FROM tv_episodes WHERE showid = ? AND season = ? AND status = ?", [show.tvdbid, season, WANTED])
+
+        for sqlEp in sqlResults:
+            for show_name in set(show_name_helpers.allPossibleShowNames(show)):
+                if show.air_by_date:
+                    ep_string = sanitizeSceneName(show_name) +' '+ str(datetime.date.fromordinal(sqlEp["airdate"])).replace('-', '.')
+                    search_string.append(ep_string)
+                else:
+                    ep_string = sanitizeSceneName(show_name) + ' S%02d' % sqlEp["season"]
+                    search_string.append(ep_string)
+
+        return search_string
+
+
+    def _get_episode_search_strings(self, ep_obj, add_string=''):
+
+        if not ep_obj:
+            return []
+
+        search_string = []
+
+        for show_name in set(show_name_helpers.allPossibleShowNames(ep_obj.show)):
+            ep_string = sanitizeSceneName(show_name)
+            if ep_obj.show.air_by_date:
+                ep_string += ' ' + str(ep_obj.airdate).replace('-', '.')
+            else:
+                ep_string += ' ' + naming_ep_type[2] % {'seasonnumber': ep_obj.season, 'episodenumber': ep_obj.episode}
+
+            if len(add_string):
+                ep_string += ' %s' % add_string
+
+            search_string.append(ep_string)
+
+        return search_string
+
+
+    def _get_title_and_url(self, item):
+        title, url, size = item
+        if title:
+            title = self._clean_title_from_provider(title)
+
+        if url:
+            url = str(url).replace('&amp;', '&')
+
+        return (title, url)
+
+
+    def _get_size(self, item):
+        title, url, size = item
+        logger.log(u'Size: %s' % size, logger.DEBUG)
+
+        return size
+
+
+    def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None):
+
+        logger.log("Performing Search: {0}".format(search_params))
+
+        searchUrl = self.urls['api'] + "?s=" + search_params + "&out=json"
+		
+        torrents = self.getURL(searchUrl, json=True)
+        del torrents["total_found"]
+		
+		
+        results = []
+        for i in torrents:
+            name = torrents[i]["title"]
+            seeders = torrents[i]["seeds"]
+            leechers = torrents[i]["leechs"]
+            if seeders < self.minseed or leechers < self.minleech:
+                logger.log("Torrent doesn't meet minimum seeds & leechers not selecting :   " + name, logger.DEBUG)
+                continue
+            hash = torrents[i]["torrent_hash"]
+            size = torrents[i]["torrent_size"]
+			
+            magnet = "magnet:?xt=urn:btih:" + hash + "&tr=udp://open.demonii.com:1337/announce&tr=udp://tracker.openbittorrent.com:80/announce&tr=udp://tracker.leechers-paradise.org:6969/announce&tr=http://tracker.dler.org:6969/announce&tr=http://bt.careland.com.cn:6969/announce&tr=http://tracker.tfile.me/announce&tr=http://mgtracker.org:2710/announce&tr=http://tracker1.wasabii.com.tw:6969/announce"
+            #logger.log(u'magnet : ' + magnet, logger.DEBUG)
+            results.append((name, magnet, size))
+
+        logger.log("URL to be parsed: " + searchUrl, logger.DEBUG)
+
+
+        return results
+
+
+class TORRENTPROJECTCache(tvcache.TVCache):
+    def __init__(self, provider):
+
+        tvcache.TVCache.__init__(self, provider)
+
+        # set this 0 to suppress log line, since we aren't updating it anyways
+        self.minTime = 0
+
+    def _getRSSData(self):
+        # no rss for torrentproject afaik,& can't search with empty string
+        # newest results are always > 1 day since added anyways
+        return {'entries': {}}
+
+provider = TORRENTPROJECTProvider()
diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py
index 86da31a79a9e4dccd1fd7e6a9bd46de4bd70f1b4..3683116041b482887de6d94102875280c01e1f26 100644
--- a/sickbeard/show_queue.py
+++ b/sickbeard/show_queue.py
@@ -140,13 +140,13 @@ class ShowQueue(generic_queue.GenericQueue):
         return queueItemObj
 
     def addShow(self, indexer, indexer_id, showDir, default_status=None, quality=None, flatten_folders=None,
-                lang=None, subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None, default_status_after=None):
+                lang=None, subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None, default_status_after=None, archive=None):
 
         if lang is None:
             lang = sickbeard.INDEXER_DEFAULT_LANGUAGE
 
         queueItemObj = QueueItemAdd(indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang,
-                                    subtitles, anime, scene, paused, blacklist, whitelist, default_status_after)
+                                    subtitles, anime, scene, paused, blacklist, whitelist, default_status_after, archive)
 
         self.add_item(queueItemObj)
 
@@ -218,7 +218,7 @@ class ShowQueueItem(generic_queue.QueueItem):
 
 class QueueItemAdd(ShowQueueItem):
     def __init__(self, indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, subtitles, anime,
-                 scene, paused, blacklist, whitelist, default_status_after):
+                 scene, paused, blacklist, whitelist, default_status_after, archive):
 
         self.indexer = indexer
         self.indexer_id = indexer_id
@@ -234,6 +234,7 @@ class QueueItemAdd(ShowQueueItem):
         self.blacklist = blacklist
         self.whitelist = whitelist
         self.default_status_after = default_status_after
+        self.archive = archive
 
         self.show = None
 
@@ -347,6 +348,7 @@ class QueueItemAdd(ShowQueueItem):
             self.show.flatten_folders = self.flatten_folders if self.flatten_folders != None else sickbeard.FLATTEN_FOLDERS_DEFAULT
             self.show.anime = self.anime if self.anime != None else sickbeard.ANIME_DEFAULT
             self.show.scene = self.scene if self.scene != None else sickbeard.SCENE_DEFAULT
+            self.show.archive_firstmatch = self.archive if self.archive != None else sickbeard.ARCHIVE_DEFAULT
             self.show.paused = self.paused if self.paused != None else False
 
             # set up default new/missing episode status
diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py
index 3850a5333537fe9954fbef69fa2fa7df9482ad3c..906d766d890e9cb37654b3b4f751d1182c142004 100644
--- a/sickbeard/subtitles.py
+++ b/sickbeard/subtitles.py
@@ -84,7 +84,7 @@ def getLanguageName(language):
 
 # TODO: Filter here for non-languages in sickbeard.SUBTITLES_LANGUAGES
 def wantedLanguages(sqlLike = False):
-    wantedLanguages = [x for x in sorted(sickbeard.SUBTITLES_LANGUAGES) if x in babelfish.language_converters['opensubtitles'].codes]
+    wantedLanguages = [x for x in sorted(sickbeard.SUBTITLES_LANGUAGES) if x in subtitleCodeFilter()]
     if sqlLike:
         return '%' + ','.join(wantedLanguages) + '%'
     return wantedLanguages
@@ -114,8 +114,6 @@ def subtitlesLanguages(video_path):
             resultList.append(language.alpha2)
 
     defaultLang = wantedLanguages()
-    if len(resultList) is 1 and len(defaultLang) is 1:
-        return defaultLang
 
     if ('pob' in defaultLang or 'pb' in defaultLang) and ('pt' not in defaultLang and 'por' not in defaultLang):
             resultList = [x if not x in ['por', 'pt'] else u'pob' for x in resultList]
@@ -126,6 +124,9 @@ def subtitlesLanguages(video_path):
 def subtitleLanguageFilter():
     return [babelfish.Language.fromopensubtitles(language) for language in babelfish.language_converters['opensubtitles'].codes if len(language) == 3]
 
+def subtitleCodeFilter():
+    return [babelfish.Language.fromopensubtitles(language).opensubtitles for language in babelfish.language_converters['opensubtitles'].codes if len(language) == 3]
+
 class SubtitlesFinder():
     """
     The SubtitlesFinder will be executed every hour but will not necessarly search
@@ -141,7 +142,7 @@ class SubtitlesFinder():
             return
 
         if len(sickbeard.subtitles.getEnabledServiceList()) < 1:
-            logger.log(u'Not enough services selected. At least 1 service is required to search subtitles in the background', logger.ERROR)
+            logger.log(u'Not enough services selected. At least 1 service is required to search subtitles in the background', logger.WARNING)
             return
 
         logger.log(u'Checking for subtitles', logger.INFO)
diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py
index 7fb995cdaaf5a699f3c04b648346ad06005f29a9..8b7248401b6d8bddaf67f00890ec31d62681b683 100644
--- a/sickbeard/traktChecker.py
+++ b/sickbeard/traktChecker.py
@@ -430,7 +430,8 @@ class TraktChecker():
                                                             quality=int(sickbeard.QUALITY_DEFAULT),
                                                             flatten_folders=int(sickbeard.FLATTEN_FOLDERS_DEFAULT),
                                                             paused=sickbeard.TRAKT_START_PAUSED,
-                                                            default_status_after=status)
+                                                            default_status_after=status,
+                                                            archive=sickbeard.ARCHIVE_DEFAULT)
             else:
                 logger.log(u"There was an error creating the show, no root directory setting found", logger.ERROR)
                 return
diff --git a/sickbeard/tv.py b/sickbeard/tv.py
index 442677c1324ff75b574f65425dbb8bff6708de0f..2b96aa233aa310e30010cb8c1780c6cb0082d54a 100644
--- a/sickbeard/tv.py
+++ b/sickbeard/tv.py
@@ -719,9 +719,7 @@ class TVShow(object):
 
 
             # check for status/quality changes as long as it's a new file
-            elif not same_file and sickbeard.helpers.isMediaFile(file) and curEp.status not in Quality.DOWNLOADED + [
-                ARCHIVED, IGNORED]:
-
+            elif not same_file and sickbeard.helpers.isMediaFile(file) and curEp.status not in Quality.DOWNLOADED + Quality.ARCHIVED + [IGNORED]:
                 oldStatus, oldQuality = Quality.splitCompositeStatus(curEp.status)
                 newQuality = Quality.nameQuality(file, self.is_anime)
                 if newQuality == Quality.UNKNOWN:
@@ -1260,7 +1258,7 @@ class TVShow(object):
         logger.log(u"Existing episode status: " + str(epStatus) + " (" + epStatus_text + ")", logger.DEBUG)
 
         # if we know we don't want it then just say no
-        if epStatus in (UNAIRED, SKIPPED, IGNORED, ARCHIVED) and not manualSearch:
+        if epStatus in Quality.ARCHIVED + [UNAIRED, SKIPPED, IGNORED] and not manualSearch:
             logger.log(u"Existing episode status is unaired/skipped/ignored/archived, ignoring found episode", logger.DEBUG)
             return False
 
@@ -1305,9 +1303,9 @@ class TVShow(object):
             return Overview.UNAIRED
         elif epStatus in (SKIPPED, IGNORED):
             return Overview.SKIPPED
-        elif epStatus == ARCHIVED:
+        elif epStatus in Quality.ARCHIVED:
             return Overview.GOOD
-        elif epStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.FAILED + Quality.SNATCHED_BEST + Quality.ARCHIVED:
+        elif epStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.FAILED + Quality.SNATCHED_BEST:
 
             anyQualities, bestQualities = Quality.splitQuality(self.quality)  # @UnusedVariable
             if bestQualities:
@@ -1429,9 +1427,19 @@ class TVEpisode(object):
 
     location = property(lambda self: self._location, _set_location)
 
-    def refreshSubtitles(self):
-        """Look for subtitles files and refresh the subtitles property"""
-        self.subtitles = subtitles.subtitlesLanguages(self.location)
+    def getSubtitlesPath(self):
+        if sickbeard.SUBTITLES_DIR and ek(os.path.exists, sickbeard.SUBTITLES_DIR):
+            subs_new_path = sickbeard.SUBTITLES_DIR
+        elif sickbeard.SUBTITLES_DIR:
+            subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location), sickbeard.SUBTITLES_DIR)
+            dir_exists = helpers.makeDir(subs_new_path)
+            if not dir_exists:
+                logger.log(u'Unable to create subtitles folder ' + subs_new_path, logger.ERROR)
+            else:
+                helpers.chmodAsParent(subs_new_path)
+        else:
+            subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location))
+        return subs_new_path
 
     def getWantedLanguages(self):
         languages = set()
@@ -1440,6 +1448,10 @@ class TVEpisode(object):
         self.refreshSubtitles()
         return languages
 
+    def refreshSubtitles(self):
+        """Look for subtitles files and refresh the subtitles property"""
+        self.subtitles = subtitles.subtitlesLanguages(self.location)
+
     def downloadSubtitles(self, force=False):
         if not ek(os.path.isfile, self.location):
             logger.log(u"%s: Episode file doesn't exist, can't download subtitles for S%02dE%02d" %
@@ -1456,11 +1468,12 @@ class TVEpisode(object):
         #logging.getLogger('subliminal').setLevel(logging.DEBUG)
 
         try:
-            providers = sickbeard.subtitles.getEnabledServiceList()
+            subs_path = self.getSubtitlesPath();
             languages = self.getWantedLanguages();
             if not languages:
                 logger.log(u'%s: No missing subtitles for S%02dE%02d' % (self.show.indexerid, self.season, self.episode), logger.DEBUG)
                 return
+            providers = sickbeard.subtitles.getEnabledServiceList()
             vname = self.location
             video = None
             try:
@@ -1480,25 +1493,12 @@ class TVEpisode(object):
                 logger.log(u'%s: No subtitles found for S%02dE%02d on any provider' % (self.show.indexerid, self.season, self.episode), logger.DEBUG)
                 return
 
-            # Select the correct subtitles path
-            if sickbeard.SUBTITLES_DIR and ek(os.path.exists, sickbeard.SUBTITLES_DIR):
-                subs_new_path = sickbeard.SUBTITLES_DIR
-            elif sickbeard.SUBTITLES_DIR:
-                subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location), sickbeard.SUBTITLES_DIR)
-                dir_exists = helpers.makeDir(subs_new_path)
-                if not dir_exists:
-	                logger.log(u'Unable to create subtitles folder ' + subs_new_path, logger.ERROR)
-                else:
-	                helpers.chmodAsParent(subs_new_path)
-            else:
-                subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location))
-
-            subliminal.save_subtitles(foundSubs, directory=subs_new_path, single=not sickbeard.SUBTITLES_MULTI)
+            subliminal.save_subtitles(foundSubs, directory=subs_path, single=not sickbeard.SUBTITLES_MULTI)
 
             for video, subs in foundSubs.iteritems():
                 for sub in subs:
                     # Get the file name out of video.name and use the path from above
-                    video_path = subs_new_path + "/" + video.name.rsplit("/", 1)[-1]
+                    video_path = subs_path + "/" + video.name.rsplit("/", 1)[-1]
                     subpath = subliminal.subtitle.get_subtitle_path(video_path, sub.language if sickbeard.SUBTITLES_MULTI else None)
                     helpers.chmodAsParent(subpath)
                     helpers.fixSetGroupID(subpath)
@@ -1536,7 +1536,6 @@ class TVEpisode(object):
 
         return self.subtitles
 
-
     def checkForMetaFiles(self):
 
         oldhasnfo = self.hasnfo
@@ -1809,7 +1808,7 @@ class TVEpisode(object):
         # if we have a media file then it's downloaded
         elif sickbeard.helpers.isMediaFile(self.location):
             # leave propers alone, you have to either post-process them or manually change them back
-            if self.status not in Quality.SNATCHED_PROPER + Quality.DOWNLOADED + Quality.SNATCHED + [ARCHIVED]:
+            if self.status not in Quality.SNATCHED_PROPER + Quality.DOWNLOADED + Quality.SNATCHED + Quality.ARCHIVED:
                 logger.log(
                     u"5 Status changes from " + str(self.status) + " to " + str(Quality.statusFromName(self.location)),
                     logger.DEBUG)
diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py
index 8f98be9a042776185c3982e47bad6e9e22222ad8..5b867723d914f575e2b644954fa5d835b8fc6df8 100644
--- a/sickbeard/webapi.py
+++ b/sickbeard/webapi.py
@@ -59,6 +59,7 @@ from sickbeard.common import SNATCHED_PROPER
 from sickbeard.common import UNAIRED
 from sickbeard.common import UNKNOWN
 from sickbeard.common import WANTED
+from sickbeard.common import ARCHIVED
 from sickbeard.common import statusStrings
 import codecs
 
@@ -126,20 +127,17 @@ class ApiHandler(RequestHandler):
             _call_dispatcher = profile(_call_dispatcher, immediate=True)
             del kwargs["profile"]
 
-        # if debug was set call the "_call_dispatcher"
-        if 'debug' in kwargs:
-            outDict = _call_dispatcher(args, kwargs)  # this way we can debug the cherry.py traceback in the browser
-            del kwargs["debug"]
-        else:  # if debug was not set we wrap the "call_dispatcher" in a try block to assure a json output
-            try:
-                outDict = _call_dispatcher(args, kwargs)
-            except Exception, e:  # real internal error oohhh nooo :(
-                logger.log(u"API :: " + ex(e), logger.ERROR)
-                errorData = {"error_msg": ex(e),
-                             "args": args,
-                             "kwargs": kwargs}
-                outDict = _responds(RESULT_FATAL, errorData,
-                                    "SickRage encountered an internal error! Please report to the Devs")
+        try:
+            outDict = _call_dispatcher(args, kwargs)
+        except Exception, e:  # real internal error oohhh nooo :(
+            logger.log(u"API :: " + ex(e), logger.ERROR)
+            errorData = {
+                "error_msg": ex(e),
+                "args": args,
+                "kwargs": kwargs
+            }
+            outDict = _responds(RESULT_FATAL, errorData,
+                                "SickRage encountered an internal error! Please report to the Devs")
 
         if 'outputType' in outDict:
             outputCallback = outputCallbackDict[outDict['outputType']]
@@ -197,9 +195,9 @@ class ApiHandler(RequestHandler):
                 logger.log(u"API :: " + cmd + ": curKwargs " + str(curKwargs), logger.DEBUG)
                 if not (multiCmds and cmd in ('show.getbanner', 'show.getfanart', 'show.getnetworklogo', 'show.getposter')):  # skip these cmd while chaining
                     try:
-                        if cmd in _functionMaper:
+                        if cmd in function_mapper:
                             # map function
-                            func = _functionMaper.get(cmd)
+                            func = function_mapper.get(cmd)
 
                             # add request handler to function
                             func.rh = self
@@ -313,6 +311,7 @@ class ApiCall(ApiHandler):
                     else:
                         self._help[type][paramName]["allowedValues"] = "see desc"
                     self._help[type][paramName]["defaultValue"] = paramDict[paramName]["defaultValue"]
+                    self._help[type][paramName]["type"] = paramDict[paramName]["type"]
 
             elif paramDict:
                 for paramName in paramDict:
@@ -323,7 +322,6 @@ class ApiCall(ApiHandler):
         msg = "No description available"
         if "desc" in self._help:
             msg = self._help["desc"]
-            del self._help["desc"]
         return _responds(RESULT_SUCCESS, self._help, msg)
 
     def return_missing(self):
@@ -366,18 +364,21 @@ class ApiCall(ApiHandler):
             except AttributeError:
                 self._missing = []
                 self._requiredParams = {key: {"allowedValues": allowedValues,
-                                              "defaultValue": orgDefault}}
+                                              "defaultValue": orgDefault,
+                                              "type": type}}
 
             if missing and key not in self._missing:
                 self._missing.append(key)
         else:
             try:
                 self._optionalParams[key] = {"allowedValues": allowedValues,
-                                             "defaultValue": orgDefault}
+                                             "defaultValue": orgDefault,
+                                             "type": type}
             except AttributeError:
                 self._optionalParams = {}
                 self._optionalParams[key] = {"allowedValues": allowedValues,
-                                             "defaultValue": orgDefault}
+                                             "defaultValue": orgDefault,
+                                             "type": type}
 
         if default:
             default = self._check_param_type(default, key, type)
@@ -639,13 +640,13 @@ class CMD_Help(ApiCall):
     def __init__(self, args, kwargs):
         # required
         # optional
-        self.subject, args = self.check_params(args, kwargs, "subject", "help", False, "string", _functionMaper.keys())
+        self.subject, args = self.check_params(args, kwargs, "subject", "help", False, "string", function_mapper.keys())
         ApiCall.__init__(self, args, kwargs)
 
     def run(self):
         """ Get help about a given command """
-        if self.subject in _functionMaper:
-            out = _responds(RESULT_SUCCESS, _functionMaper.get(self.subject)((), {"help": 1}).run())
+        if self.subject in function_mapper:
+            out = _responds(RESULT_SUCCESS, function_mapper.get(self.subject)((), {"help": 1}).run())
         else:
             out = _responds(RESULT_FAILURE, msg="No such cmd")
         return out
@@ -905,7 +906,7 @@ class CMD_EpisodeSetStatus(ApiCall):
                     continue
 
                 # allow the user to force setting the status for an already downloaded episode
-                if epObj.status in Quality.DOWNLOADED and not self.force:
+                if epObj.status in Quality.DOWNLOADED + Quality.ARCHIVED and not self.force:
                     ep_results.append(_epResult(RESULT_FAILURE, epObj, "Refusing to change status because it is already marked as DOWNLOADED"))
                     failure = True
                     continue
@@ -1314,7 +1315,7 @@ class CMD_SickBeard(ApiCall):
     def run(self):
         """ dGet miscellaneous information about SickRage """
         data = {"sr_version": sickbeard.BRANCH, "api_version": self.version,
-                "api_commands": sorted(_functionMaper.keys())}
+                "api_commands": sorted(function_mapper.keys())}
         return _responds(RESULT_SUCCESS, data)
 
 
@@ -2039,6 +2040,7 @@ class CMD_ShowAddNew(ApiCall):
             "anime": {"desc": "True to mark the show as an anime, False otherwise"},
             "scene": {"desc": "True if episodes search should be made by scene numbering, False otherwise"},
             "future_status": {"desc": "The status of future episodes"},
+            "archive_firstmatch": {"desc": "True if episodes should be archived when first match is downloaded, False otherwise"},
         }
     }
 
@@ -2069,6 +2071,9 @@ class CMD_ShowAddNew(ApiCall):
         self.future_status, args = self.check_params(args, kwargs, "future_status", None, False, "string",
                                                      ["wanted", "skipped", "ignored"])
 
+        self.archive_firstmatch, args = self.check_params(args, kwargs, "archive_firstmatch",
+                                             int(sickbeard.ARCHIVE_DEFAULT), False, "bool", [])
+
         # super, missing, help
         ApiCall.__init__(self, args, kwargs)
 
@@ -2181,7 +2186,7 @@ class CMD_ShowAddNew(ApiCall):
         sickbeard.showQueueScheduler.action.addShow(int(indexer), int(self.indexerid), showPath, newStatus,
                                                     newQuality,
                                                     int(self.flatten_folders), self.lang, self.subtitles, self.anime,
-                                                    self.scene, default_status_after=default_ep_status_after)  # @UndefinedVariable
+                                                    self.scene, default_status_after=default_ep_status_after, archive=self.archive_firstmatch)  # @UndefinedVariable
 
         return _responds(RESULT_SUCCESS, {"name": indexerName}, indexerName + " has been queued to be added")
 
@@ -2656,14 +2661,14 @@ class CMD_ShowStats(ApiCall):
         episode_status_counts_total = {}
         episode_status_counts_total["total"] = 0
         for status in statusStrings.statusStrings.keys():
-            if status in [UNKNOWN, DOWNLOADED, SNATCHED, SNATCHED_PROPER]:
+            if status in [UNKNOWN, DOWNLOADED, SNATCHED, SNATCHED_PROPER, ARCHIVED]:
                 continue
             episode_status_counts_total[status] = 0
 
         # add all the downloaded qualities
         episode_qualities_counts_download = {}
         episode_qualities_counts_download["total"] = 0
-        for statusCode in Quality.DOWNLOADED:
+        for statusCode in Quality.DOWNLOADED + Quality.ARCHIVED:
             status, quality = Quality.splitCompositeStatus(statusCode)
             if quality in [Quality.NONE]:
                 continue
@@ -2687,7 +2692,7 @@ class CMD_ShowStats(ApiCall):
 
             episode_status_counts_total["total"] += 1
 
-            if status in Quality.DOWNLOADED:
+            if status in Quality.DOWNLOADED + Quality.ARCHIVED:
                 episode_qualities_counts_download["total"] += 1
                 episode_qualities_counts_download[int(row["status"])] += 1
             elif status in Quality.SNATCHED + Quality.SNATCHED_PROPER:
@@ -2853,7 +2858,7 @@ class CMD_ShowsStats(ApiCall):
         stats["ep_snatched"] = myDB.select("SELECT COUNT(*) FROM tv_episodes WHERE status IN (" + ",".join(
             [str(show) for show in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ") AND season != 0 and episode != 0 AND airdate <= " + today + "")[0][0]
         stats["ep_total"] = myDB.select("SELECT COUNT(*) FROM tv_episodes WHERE season != 0 AND episode != 0 AND (airdate != 1 OR status IN (" + ",".join(
-                [str(show) for show in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.ARCHIVED]) + ")) AND airdate <= " + today + " AND status != " + str(IGNORED) + "")[0][0]
+            [str(show) for show in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.ARCHIVED]) + ")) AND airdate <= " + today + " AND status != " + str(IGNORED) + "")[0][0]
 
         return _responds(RESULT_SUCCESS, stats)
 
@@ -2862,7 +2867,7 @@ class CMD_ShowsStats(ApiCall):
 
 # WARNING: never define a param name that contains a "." (dot)
 # this is reserved for cmd namespaces used while cmd chaining
-_functionMaper = {
+function_mapper = {
     "help": CMD_Help,
     "future": CMD_ComingEpisodes,
     "episode": CMD_Episode,
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index 2805537dc992c2a2620ee0ab2550ea6d5cd992e4..40de74d7935709e7514fb4e0ed859148dd780de4 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -36,13 +36,14 @@ from sickbeard import subtitles
 from sickbeard import network_timezones
 from sickbeard.providers import newznab, rsstorrent
 from sickbeard.common import Quality, Overview, statusStrings, qualityPresetStrings, cpu_presets
-from sickbeard.common import SNATCHED, UNAIRED, IGNORED, ARCHIVED, WANTED, FAILED, SKIPPED
+from sickbeard.common import SNATCHED, UNAIRED, IGNORED, WANTED, FAILED, SKIPPED
 from sickbeard.common import SD, HD720p, HD1080p
 from sickbeard.blackandwhitelist import BlackAndWhiteList, short_group_names
 from sickbeard.browser import foldersAtPath
 from sickbeard.scene_numbering import get_scene_numbering, set_scene_numbering, get_scene_numbering_for_show, \
     get_xem_numbering_for_show, get_scene_absolute_numbering_for_show, get_xem_absolute_numbering_for_show, \
     get_scene_absolute_numbering
+from sickbeard.webapi import function_mapper
 
 from imdbPopular import imdb_popular
 
@@ -114,7 +115,7 @@ class PageTemplate(MakoTemplate):
 
         super(PageTemplate, self).__init__(*args, **kwargs)
 
-        self.arguments['sbRoot'] = sickbeard.WEB_ROOT
+        self.arguments['srRoot'] = sickbeard.WEB_ROOT
         self.arguments['sbHttpPort'] = sickbeard.WEB_PORT
         self.arguments['sbHttpsPort'] = sickbeard.WEB_PORT
         self.arguments['sbHttpsEnabled'] = sickbeard.ENABLE_HTTPS
@@ -351,36 +352,36 @@ class WebRoot(WebHandler):
         return "User-agent: *\nDisallow: /"
 
     def apibuilder(self):
-        t = PageTemplate(rh=self, file="apiBuilder.mako")
-
         def titler(x):
             return (helpers.remove_article(x), x)[not x or sickbeard.SORT_ARTICLE]
 
-        sortedShowList = sorted(sickbeard.showList, lambda x, y: cmp(titler(x.name), titler(y.name)))
-
-        myDB = db.DBConnection(row_type="dict")
+        myDB = db.DBConnection(row_type='dict')
+        shows = sorted(sickbeard.showList, lambda x, y: cmp(titler(x.name), titler(y.name)))
+        episodes = {}
 
-        seasonSQLResults = {}
-        episodeSQLResults = {}
+        results = myDB.select(
+            'SELECT episode, season, showid '
+            'FROM tv_episodes '
+            'ORDER BY season ASC, episode ASC'
+        )
 
-        for curShow in sortedShowList:
-            seasonSQLResults[curShow.indexerid] = myDB.select(
-                "SELECT DISTINCT season FROM tv_episodes WHERE showid = ? ORDER BY season DESC", [curShow.indexerid])
+        for result in results:
+            if result['showid'] not in episodes:
+                episodes[result['showid']] = {}
 
-        for curShow in sortedShowList:
-            episodeSQLResults[curShow.indexerid] = myDB.select(
-                "SELECT DISTINCT season,episode FROM tv_episodes WHERE showid = ? ORDER BY season DESC, episode DESC",
-                [curShow.indexerid])
+            if result['season'] not in episodes[result['showid']]:
+                episodes[result['showid']][result['season']] = []
 
-        seasonSQLResults = seasonSQLResults
-        episodeSQLResults = episodeSQLResults
+            episodes[result['showid']][result['season']].append(result['episode'])
 
         if len(sickbeard.API_KEY) == 32:
             apikey = sickbeard.API_KEY
         else:
-            apikey = "api key not generated"
+            apikey = 'API Key not generated'
 
-        return t.render(title="Api Builder", header="Api Builder", sortedShowList=sortedShowList, seasonSQLResults=seasonSQLResults, episodeSQLResults=episodeSQLResults, apikey=apikey)
+        t = PageTemplate(rh=self, file='apiBuilder.mako')
+        return t.render(title='API Builder', header='API Builder', shows=shows, episodes=episodes, apikey=apikey,
+                        commands=function_mapper)
 
     def showPoster(self, show=None, which=None):
         media = None
@@ -1691,13 +1692,13 @@ class Home(WebRoot):
                             logger.ERROR)
                         continue
 
-                    if int(status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED:
+                    if int(status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED + Quality.ARCHIVED:
                         logger.log(
                             u"Refusing to change status of " + curEp + " to FAILED because it's not SNATCHED/DOWNLOADED",
                             logger.ERROR)
                         continue
 
-                    if epObj.status in Quality.DOWNLOADED and int(status) == WANTED:
+                    if epObj.status in Quality.DOWNLOADED + Quality.ARCHIVED and int(status) == WANTED:
                         logger.log(u"Removing release_name for episode as you want to set a downloaded episode back to wanted, so obviously you want it replaced")
                         epObj.release_name = ""
 
@@ -1714,7 +1715,7 @@ class Home(WebRoot):
                 if int(status) in [WANTED, FAILED]:
                     logger.log(u"Add episodes, showid: indexerid " + str(showObj.indexerid) + ", Title " + str(showObj.name) + " to Watchlist", logger.DEBUG)
                     upd = "add"
-                elif int(status) in [ARCHIVED, IGNORED, SKIPPED ] + Quality.DOWNLOADED:
+                elif int(status) in [IGNORED, SKIPPED] + Quality.DOWNLOADED + Quality.ARCHIVED:
                     logger.log(u"Remove episodes, showid: indexerid " + str(showObj.indexerid) + ", Title " + str(showObj.name) + " from Watchlist", logger.DEBUG)
                     upd = "remove"
 
@@ -2108,7 +2109,7 @@ class HomeNews(Home):
             news = 'Could not load news from the repo. [Click here for news.md](http://sickragetv.github.io/sickrage-news/news.md)'
 
         t = PageTemplate(rh=self, file="markdown.mako")
-        data = markdown2.markdown(news if news else "The was a problem connecting to github, please refresh and try again")
+        data = markdown2.markdown(news if news else "The was a problem connecting to github, please refresh and try again", extras=['header-ids'])
 
         return t.render(title="News", header="News", topmenu="news", data=data, submenu=self.HomeMenu())
 
@@ -2126,7 +2127,7 @@ class HomeChangeLog(Home):
             changes = 'Could not load changes from the repo. [Click here for CHANGES.md](http://sickragetv.github.io/sickrage-news/CHANGES.md)'
 
         t = PageTemplate(rh=self, file="markdown.mako")
-        data = markdown2.markdown(changes if changes else "The was a problem connecting to github, please refresh and try again")
+        data = markdown2.markdown(changes if changes else "The was a problem connecting to github, please refresh and try again", extras=['header-ids'])
 
         return t.render(title="Changelog", header="Changelog", topmenu="system", data=data, submenu=self.HomeMenu())
 
@@ -2527,7 +2528,8 @@ class HomeAddShows(Home):
                                                         subtitles=sickbeard.SUBTITLES_DEFAULT,
                                                         anime=sickbeard.ANIME_DEFAULT,
                                                         scene=sickbeard.SCENE_DEFAULT,
-                                                        default_status_after=sickbeard.STATUS_DEFAULT_AFTER)
+                                                        default_status_after=sickbeard.STATUS_DEFAULT_AFTER,
+                                                        archive=sickbeard.ARCHIVE_DEFAULT)
 
             ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir)
         else:
@@ -2540,7 +2542,7 @@ class HomeAddShows(Home):
     def addNewShow(self, whichSeries=None, indexerLang=None, rootDir=None, defaultStatus=None,
                    anyQualities=None, bestQualities=None, flatten_folders=None, subtitles=None,
                    fullShowPath=None, other_shows=None, skipShow=None, providedIndexer=None, anime=None,
-                   scene=None, blacklist=None, whitelist=None, defaultStatusAfter=None):
+                   scene=None, blacklist=None, whitelist=None, defaultStatusAfter=None, archive=None):
         """
         Receive tvdb id, dir, and other options and create a show from them. If extra show dirs are
         provided then it forwards back to newShow, if not it goes to /home.
@@ -2628,6 +2630,7 @@ class HomeAddShows(Home):
         anime = config.checkbox_to_value(anime)
         flatten_folders = config.checkbox_to_value(flatten_folders)
         subtitles = config.checkbox_to_value(subtitles)
+        archive = config.checkbox_to_value(archive)
 
         if whitelist:
             whitelist = short_group_names(whitelist)
@@ -2647,7 +2650,7 @@ class HomeAddShows(Home):
         # add the show
         sickbeard.showQueueScheduler.action.addShow(indexer, indexer_id, show_dir, int(defaultStatus), newQuality,
                                                     flatten_folders, indexerLang, subtitles, anime,
-                                                    scene, None, blacklist, whitelist, int(defaultStatusAfter))
+                                                    scene, None, blacklist, whitelist, int(defaultStatusAfter), archive)
         ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir)
 
         return finishAddShow()
@@ -2721,7 +2724,8 @@ class HomeAddShows(Home):
                                                             subtitles=sickbeard.SUBTITLES_DEFAULT,
                                                             anime=sickbeard.ANIME_DEFAULT,
                                                             scene=sickbeard.SCENE_DEFAULT,
-                                                            default_status_after=sickbeard.STATUS_DEFAULT_AFTER)
+                                                            default_status_after=sickbeard.STATUS_DEFAULT_AFTER,
+                                                            archive=sickbeard.ARCHIVE_DEFAULT)
                 num_added += 1
 
         if num_added:
@@ -3497,7 +3501,7 @@ class History(WebRoot):
         self.history = HistoryTool()
 
     def index(self, limit=None):
-    
+
         if limit is None:
             if sickbeard.HISTORY_LIMIT:
                 limit = int(sickbeard.HISTORY_LIMIT)
@@ -3505,9 +3509,9 @@ class History(WebRoot):
                 limit = 100
         else:
             limit = int(limit)
-            
+
         sickbeard.HISTORY_LIMIT = limit
-        
+
         sickbeard.save_config()
 
         compact = []
@@ -3611,7 +3615,7 @@ class ConfigGeneral(Config):
         sickbeard.ROOT_DIRS = rootDirString
 
     def saveAddShowDefaults(self, defaultStatus, anyQualities, bestQualities, defaultFlattenFolders, subtitles=False,
-                            anime=False, scene=False, defaultStatusAfter=WANTED):
+                            anime=False, scene=False, defaultStatusAfter=WANTED, archive=False):
 
         if anyQualities:
             anyQualities = anyQualities.split(',')
@@ -3634,6 +3638,7 @@ class ConfigGeneral(Config):
 
         sickbeard.ANIME_DEFAULT = config.checkbox_to_value(anime)
         sickbeard.SCENE_DEFAULT = config.checkbox_to_value(scene)
+        sickbeard.ARCHIVE_DEFAULT = config.checkbox_to_value(archive)
 
         sickbeard.save_config()