diff --git a/.build/Gruntfile.js b/.build/Gruntfile.js
index 56bac94ee9b502dd7bd2313c1666de48bcbe3308..c17b6261be3f3e1386b53992fd7ad1832b7e405f 100644
--- a/.build/Gruntfile.js
+++ b/.build/Gruntfile.js
@@ -17,6 +17,13 @@ module.exports = function(grunt) {
                     ],
                     'bootstrap-formhelpers': [
                         'dist/js/bootstrap-formhelpers.min.js'
+                    ],
+                    'isotope': [
+                        "dist/isotope.pkgd.min.js"
+                    ],
+                    "outlayer": [
+                        "item.js",
+                        "outlayer.js"
                     ]
                 },
                 bowerOptions: {
diff --git a/.build/bower.json b/.build/bower.json
index 8954ee4c899e14d3b29161f6f0de765951556877..e9a78d46ac93ce8ebb4983e0f39277a43e4ab102 100644
--- a/.build/bower.json
+++ b/.build/bower.json
@@ -14,7 +14,6 @@
     "bootstrap": "~3.3.5",
     "bootstrap-hover-dropdown": "~2.1.3",
     "jquery-ui": "~1.11.4",
-    "jquery-form": "~3.46.0",
     "jquery-timeago": "~1.4.3",
     "jquery-tokeninput": "~1.7.0",
     "bootstrap3-typeahead": "~3.1.1",
@@ -24,6 +23,7 @@
     "qtip2": "~2.2.1",
     "tablesorter": "jquery.tablesorter#~2.24.5",
     "jquery-confirm": "~2.5.2",
-    "bootstrap-formhelpers": "~2.3.0"
+    "bootstrap-formhelpers": "~2.3.0",
+    "isotope": "~2.2.2"
   }
 }
diff --git a/.jshintrc b/.jshintrc
index 7ec9ec8b693393d2ca5bffb94bdcc5e030309f43..d7a56347f30eba25d219bd053a83c8a6ab37b85b 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -28,6 +28,7 @@
         "_": true,
         "bootbox": true,
         "PNotify": true,
-        "anonURL": true
+        "anonURL": true,
+        "window": true
     }
 }
diff --git a/contributing.md b/contributing.md
index 48114d9cb15d7a323e6c62071735435ddafa9385..e933417c35695083248d5fb63e7eaacf096bfce8 100644
--- a/contributing.md
+++ b/contributing.md
@@ -1,6 +1,6 @@
 ### Questions about SickRage?
 
-To get your questions answered, please ask on the [SickRage Forum](http://sickrage.tv/),  or [#sickrage](http://webchat.freenode.net/?channels=sickrage) IRC channel on irc.freenode.net
+To get your questions answered, please ask on the [SickRage Forum](http://sickrage.tv/),  or [#sickrage-issues](http://webchat.freenode.net/?channels=sickrage-issues) IRC channel on irc.freenode.net
 
 # Contributing to SickRage
 
@@ -21,7 +21,7 @@ The goal of this guide is to provide the best way to contribute to the official
 
 The SickRage development team frequently tracks posts on the [SickRage Forum](http://sickrage.tv/). If you have longer posts or questions please feel free to post them there. If you think you've found a bug please [file it in the bug tracker](#how-to-report-bugs).
 
-Additionally most of the SickRage development team can be found in the [#sickrage](http://webchat.freenode.net/?channels=sickrage) IRC channel on irc.freenode.net.
+Additionally most of the SickRage development team can be found in the [#sickrage-issues](http://webchat.freenode.net/?channels=sickrage-issues) IRC channel on irc.freenode.net.
 
 
 ## How to Report Bugs
@@ -30,7 +30,7 @@ Additionally most of the SickRage development team can be found in the [#sickrag
 
 Many bugs reported are actually issues with the user mis-understanding of how something works (there are a bit of moving parts to an ideal setup) and most of the time can be fixed by just changing some settings to fit the users needs.
 
-If you are new to SickRage, it is usually a much better idea to ask for help first in the [Using SickRage Forum](http://sickrage.tv) or the [SickRage IRC channel](http://webchat.freenode.net/?channels=sickrage). You will get much quicker support, and you will help avoid tying up the SickRage team with invalid bug reports.
+If you are new to SickRage, it is usually a much better idea to ask for help first in the [Using SickRage Forum](http://sickrage.tv) or the [SickRage IRC channel](http://webchat.freenode.net/?channels=sickrage-issues). You will get much quicker support, and you will help avoid tying up the SickRage team with invalid bug reports.
 
 ### Try the latest version of SickRage
 
diff --git a/gui/slick/images/providers/nzbs4u.png b/gui/slick/images/providers/nzbs4u.png
deleted file mode 100644
index b2d709be95e5c81164609ff22f5d9f0b39a89ece..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/nzbs4u.png and /dev/null differ
diff --git a/gui/slick/images/providers/nzbs4u_net.png b/gui/slick/images/providers/nzbs4u_net.png
deleted file mode 100644
index b2d709be95e5c81164609ff22f5d9f0b39a89ece..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/nzbs4u_net.png and /dev/null differ
diff --git a/gui/slick/images/providers/spots4u.png b/gui/slick/images/providers/spots4u.png
deleted file mode 100644
index b2d709be95e5c81164609ff22f5d9f0b39a89ece..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/spots4u.png and /dev/null differ
diff --git a/gui/slick/images/providers/spots4u_nl.png b/gui/slick/images/providers/spots4u_nl.png
deleted file mode 100644
index b2d709be95e5c81164609ff22f5d9f0b39a89ece..0000000000000000000000000000000000000000
Binary files a/gui/slick/images/providers/spots4u_nl.png and /dev/null differ
diff --git a/gui/slick/js/ajaxEpSearch.js b/gui/slick/js/ajaxEpSearch.js
index ff66ca7c7916d12251b395946108eccbc4ab0ec2..5d5eea0f51db3d123554ead875e0e8db60fc95bf 100644
--- a/gui/slick/js/ajaxEpSearch.js
+++ b/gui/slick/js/ajaxEpSearch.js
@@ -213,7 +213,7 @@ $(document).ready(function () {
                     }
                     // applying the quality class
                     var rSearchTerm = /(\w+)\s\((.+?)\)/;
-                        htmlContent = data.result.replace(rSearchTerm,"$1"+' <span class="quality '+data.quality+'">'+"$2"+'</span>');
+                    htmlContent = data.result.replace(rSearchTerm,"$1"+' <span class="quality '+data.quality+'">'+"$2"+'</span>');
                     // update the status column if it exists
                     parent.siblings('.col-status').html(htmlContent);
                     // Only if the queuing was successful, disable the onClick event of the loading image
diff --git a/gui/slick/js/blackwhite.js b/gui/slick/js/blackwhite.js
index e8618899c95ebd24c0d385f35375e579231eb83a..82c51368715a39d2a6db0e6c67f361bab4461c83 100644
--- a/gui/slick/js/blackwhite.js
+++ b/gui/slick/js/blackwhite.js
@@ -1,24 +1,24 @@
 function generate_bwlist() {
     var realvalues = [];
 
-        $('#white option').each(function(i, selected) {
-            realvalues[i] = $(selected).val();
-        });
-        $("#whitelist").val(realvalues.join(","));
+    $('#white option').each(function(i, selected) {
+        realvalues[i] = $(selected).val();
+    });
+    $("#whitelist").val(realvalues.join(","));
 
-        realvalues = [];
-        $('#black option').each(function(i, selected) {
-            realvalues[i] = $(selected).val();
-        });
-        $("#blacklist").val(realvalues.join(","));
+    realvalues = [];
+    $('#black option').each(function(i, selected) {
+        realvalues[i] = $(selected).val();
+    });
+    $("#blacklist").val(realvalues.join(","));
 }
 
 function update_bwlist(show_name) {
-        $('#pool').children().remove();
+    $('#pool').children().remove();
 
-        $('#blackwhitelist').show();
-        if (show_name) {
-            $.getJSON(srRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) {
+    $('#blackwhitelist').show();
+    if (show_name) {
+        $.getJSON(srRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) {
             if (data.result == 'success') {
                 $.each(data.groups, function(i, group) {
                     var option = $("<option>");
@@ -27,9 +27,9 @@ function update_bwlist(show_name) {
                     option.appendTo('#pool');
                 });
             }
-         });
-        }
+        });
     }
+}
 
 $('#removeW').click(function() {
     !$('#white option:selected').remove().appendTo('#pool');
diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js
index e2a7a49ed83ad5aaceb102bef6a3b250c4bac9e8..da490f82544288ca55eb870a4b24a1ac401c202a 100644
--- a/gui/slick/js/configProviders.js
+++ b/gui/slick/js/configProviders.js
@@ -354,7 +354,7 @@ $(document).ready(function(){
         var selectedProvider = $('#editANewznabProvider :selected').val();
 
         if (selectedProvider === "addNewznab"){
-             return;
+            return;
         }
 
         var url = $('#newznab_url').val();
@@ -371,7 +371,7 @@ $(document).ready(function(){
         var selectedProvider = $('#editATorrentRssProvider :selected').val();
 
         if (selectedProvider === "addTorrentRss"){
-             return;
+            return;
         }
 
         var url = $('#torrentrss_url').val();
diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js
index 1fcbeae568427ab310002eb23a6e9d9f37aab25b..2fb725650a49a358b5f11dc53e20c34cac136e50 100644
--- a/gui/slick/js/core.js
+++ b/gui/slick/js/core.js
@@ -142,7 +142,7 @@ var SICKRAGE = {
                 if (!$(this).prop('checked')) { $('#content_'+$(this).attr('id')).hide(); }
             });
 
-            $(".enabler").click(function() {
+            $(".enabler").on('click', function() {
                 if ($(this).prop('checked')){
                     $('#content_'+$(this).attr('id')).fadeIn("fast", "linear");
                 } else {
@@ -150,7 +150,7 @@ var SICKRAGE = {
                 }
             });
 
-            $(".viewIf").click(function() {
+            $(".viewIf").on('click', function() {
                 if ($(this).prop('checked')) {
                     $('.hide_if_'+$(this).attr('id')).css('display','none');
                     $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear");
@@ -160,7 +160,7 @@ var SICKRAGE = {
                 }
             });
 
-            $(".datePresets").click(function() {
+            $(".datePresets").on('click', function() {
                 var def = $('#date_presets').val();
                 if ($(this).prop('checked') && '%x' === def) {
                     def = '%a, %b %d, %Y';
@@ -198,11 +198,11 @@ var SICKRAGE = {
                 }
             });
 
-            $('#api_key').click(function(){
+            $('#api_key').on('click', function(){
                 $('#api_key').select();
             });
 
-            $("#generate_new_apikey").click(function(){
+            $("#generate_new_apikey").on('click', function(){
                 $.get(srRoot + '/config/general/generateApiKey', function(data){
                     if (data.error !== undefined) {
                         alert(data.error);
@@ -212,7 +212,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#branchCheckout').click(function() {
+            $('#branchCheckout').on('click', function() {
                 var url = srRoot + '/home/branchCheckout?branch=' + $("#branchVersion").val();
                 var checkDBversion = srRoot + "/home/getDBcompare";
                 $.getJSON(checkDBversion, function(data){
@@ -252,7 +252,7 @@ var SICKRAGE = {
             $('#log_dir').fileBrowser({ title: 'Select log file folder location' });
         },
         backupRestore: function(){
-            $('#Backup').click(function() {
+            $('#Backup').on('click', function() {
                 $("#Backup").attr("disabled", true);
                 $('#Backup-result').html(loading);
                 var backupDir = $("#backupDir").val();
@@ -262,7 +262,7 @@ var SICKRAGE = {
                         $("#Backup").attr("disabled", false);
                     });
             });
-            $('#Restore').click(function() {
+            $('#Restore').on('click', function() {
                 $("#Restore").attr("disabled", true);
                 $('#Restore-result').html(loading);
                 var backupFile = $("#backupFile").val();
@@ -281,7 +281,7 @@ var SICKRAGE = {
                 if (!$(this).prop('checked')) { $('#content_'+$(this).attr('id')).hide(); }
             });
 
-            $(".enabler").click(function() {
+            $(".enabler").on('click', function() {
                 if ($(this).prop('checked')){
                     $('#content_'+$(this).attr('id')).fadeIn("fast", "linear");
                 } else {
@@ -289,7 +289,7 @@ var SICKRAGE = {
                 }
             });
 
-            $(".viewIf").click(function() {
+            $(".viewIf").on('click', function() {
                 if ($(this).prop('checked')) {
                     $('.hide_if_'+$(this).attr('id')).css('display','none');
                     $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear");
@@ -299,7 +299,7 @@ var SICKRAGE = {
                 }
             });
 
-            $(".datePresets").click(function() {
+            $(".datePresets").on('click', function() {
                 var def = $('#date_presets').val();
                 if ($(this).prop('checked') && '%x' == def) { // jshint ignore:line
                     def = '%a, %b %d, %Y';
@@ -337,11 +337,11 @@ var SICKRAGE = {
                 }
             });
 
-            $('#api_key').click(function(){
+            $('#api_key').on('click', function(){
                 $('#api_key').select();
             });
 
-            $("#generate_new_apikey").click(function(){
+            $("#generate_new_apikey").on('click', function(){
                 $.get(srRoot + '/config/general/generateApiKey', function(data){
                     if (data.error !== undefined) {
                         alert(data.error);
@@ -351,7 +351,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#branchCheckout').click(function() {
+            $('#branchCheckout').on('click', function() {
                 var url = srRoot+'/home/branchCheckout?branch='+$("#branchVersion").val();
                 var checkDBversion = srRoot + "/home/getDBcompare";
                 $.getJSON(checkDBversion, function(data){
@@ -376,7 +376,7 @@ var SICKRAGE = {
         notifications: function() {
             $('#config-components').tabs();
 
-            $('#testGrowl').click(function () {
+            $('#testGrowl').on('click', function () {
                 var growl = {};
                 growl.host = $.trim($('#growl_host').val());
                 growl.password = $.trim($('#growl_password').val());
@@ -394,7 +394,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testProwl').click(function () {
+            $('#testProwl').on('click', function () {
                 var prowl = {};
                 prowl.api = $.trim($('#prowl_api').val());
                 prowl.priority = $('#prowl_priority').val();
@@ -412,7 +412,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testKODI').click(function () {
+            $('#testKODI').on('click', function () {
                 var kodi = {};
                 kodi.host = $.trim($('#kodi_host').val());
                 kodi.username = $.trim($('#kodi_username').val());
@@ -431,7 +431,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testPMC').click(function () {
+            $('#testPMC').on('click', function () {
                 var plex = {};
                 plex.client = {};
                 plex.client.host = $.trim($('#plex_host').val());
@@ -451,7 +451,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testPMS').click(function () {
+            $('#testPMS').on('click', function () {
                 var plex = {};
                 plex.server = {};
                 plex.server.host = $.trim($('#plex_server_host').val());
@@ -472,7 +472,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testEMBY').click(function () {
+            $('#testEMBY').on('click', function () {
                 var emby = {};
                 emby.host = $('#emby_host').val();
                 emby.apikey = $('#emby_apikey').val();
@@ -499,7 +499,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testBoxcar').click(function() {
+            $('#testBoxcar').on('click', function() {
                 var boxcar = {};
                 boxcar.username = $.trim($('#boxcar_username').val());
                 if (!boxcar.username) {
@@ -516,7 +516,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testBoxcar2').click(function () {
+            $('#testBoxcar2').on('click', function () {
                 var boxcar2 = {};
                 boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());
                 if (!boxcar2.accesstoken) {
@@ -533,7 +533,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testPushover').click(function () {
+            $('#testPushover').on('click', function () {
                 var pushover = {};
                 pushover.userkey = $('#pushover_userkey').val();
                 pushover.apikey = $('#pushover_apikey').val();
@@ -560,14 +560,14 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testLibnotify').click(function() {
+            $('#testLibnotify').on('click', function() {
                 $('#testLibnotify-result').html(loading);
                 $.get(srRoot + '/home/testLibnotify', function (data) {
                     $('#testLibnotify-result').html(data);
                 });
             });
 
-            $('#twitterStep1').click(function() {
+            $('#twitterStep1').on('click', function() {
                 $('#testTwitter-result').html(loading);
                 $.get(srRoot + '/home/twitterStep1', function (data) {
                     window.open(data);
@@ -576,7 +576,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#twitterStep2').click(function () {
+            $('#twitterStep2').on('click', function () {
                 var twitter = {};
                 twitter.key = $.trim($('#twitter_key').val());
                 if (!twitter.key) {
@@ -591,13 +591,13 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testTwitter').click(function() {
+            $('#testTwitter').on('click', function() {
                 $.get(srRoot + '/home/testTwitter', function(data) {
                     $('#testTwitter-result').html(data);
                 });
             });
 
-            $('#settingsNMJ').click(function() {
+            $('#settingsNMJ').on('click', function() {
                 var nmj = {};
                 if (!$('#nmj_host').val()) {
                     alert('Please fill in the Popcorn IP address');
@@ -630,7 +630,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testNMJ').click(function () {
+            $('#testNMJ').on('click', function () {
                 var nmj = {};
                 nmj.host = $.trim($('#nmj_host').val());
                 nmj.database = $('#nmj_database').val();
@@ -649,7 +649,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#settingsNMJv2').click(function() {
+            $('#settingsNMJv2').on('click', function() {
                 var nmjv2 = {};
                 if(!$('#nmjv2_host').val()) {
                     alert('Please fill in the Popcorn IP address');
@@ -684,7 +684,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testNMJv2').click(function () {
+            $('#testNMJv2').on('click', function () {
                 var nmjv2 = {};
                 nmjv2.host = $.trim($('#nmjv2_host').val());
                 if (!nmjv2.host) {
@@ -701,7 +701,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testFreeMobile').click(function () {
+            $('#testFreeMobile').on('click', function () {
                 var freemobile = {};
                 freemobile.id = $.trim($('#freemobile_id').val());
                 freemobile.apikey = $.trim($('#freemobile_apikey').val());
@@ -728,7 +728,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#TraktGetPin').click(function () {
+            $('#TraktGetPin').on('click', function () {
                 var trakt = {};
                 trakt.pinUrl = $('#trakt_pin_url').val();
                 window.open(trakt.pinUrl, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550");
@@ -748,7 +748,7 @@ var SICKRAGE = {
                 }
             });
 
-            $('#authTrakt').click(function() {
+            $('#authTrakt').on('click', function() {
                 var trakt = {};
                 trakt.pin = $('#trakt_pin').val();
                 if (trakt.pin.length !== 0) {
@@ -761,7 +761,7 @@ var SICKRAGE = {
                 }
             });
 
-            $('#testTrakt').click(function () {
+            $('#testTrakt').on('click', function () {
                 var trakt = {};
                 trakt.username = $.trim($('#trakt_username').val());
                 trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());
@@ -790,7 +790,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testEmail').click(function () {
+            $('#testEmail').on('click', function () {
                 var status, host, port, tls, from, user, pwd, err, to;
                 status = $('#testEmail-result');
                 status.html(loading);
@@ -821,13 +821,13 @@ var SICKRAGE = {
                         status.html('<p style="color: red;">You must provide a recipient email address!</p>');
                     } else {
                         $.get(srRoot + '/home/testEmail', {
-                            host: host,
-                            port: port,
-                            smtp_from: from, // jshint ignore:line
-                            use_tls: tls, // jshint ignore:line
-                            user: user,
-                            pwd: pwd,
-                            to: to
+                            'host': host,
+                            'port': port,
+                            'smtp_from': from, // @TODO we shouldn't be using any reserved words like "from"
+                            'use_tls': tls,
+                            'user': user,
+                            'pwd': pwd,
+                            'to': to
                         }, function (msg) {
                             $('#testEmail-result').html(msg);
                         });
@@ -835,7 +835,7 @@ var SICKRAGE = {
                 }
             });
 
-            $('#testNMA').click(function () {
+            $('#testNMA').on('click', function () {
                 var nma = {};
                 nma.api = $.trim($('#nma_api').val());
                 nma.priority = $('#nma_priority').val();
@@ -853,7 +853,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testPushalot').click(function () {
+            $('#testPushalot').on('click', function () {
                 var pushalot = {};
                 pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());
                 if (!pushalot.authToken) {
@@ -870,7 +870,7 @@ var SICKRAGE = {
                 });
             });
 
-            $('#testPushbullet').click(function () {
+            $('#testPushbullet').on('click', function () {
                 var pushbullet = {};
                 pushbullet.api = $.trim($('#pushbullet_api').val());
                 if (!pushbullet.api) {
@@ -924,13 +924,13 @@ var SICKRAGE = {
                     }
                 });
 
-                $("#pushbullet_device_list").change(function(){
+                $("#pushbullet_device_list").on('change', function(){
                     $("#pushbullet_device").val($("#pushbullet_device_list").val());
                     $('#testPushbullet-result').html("Don't forget to save your new pushbullet settings.");
                 });
             }
 
-            $('#getPushbulletDevices').click(function(){
+            $('#getPushbulletDevices').on('click', function(){
                 getPushbulletDevices("Device list updated. Please choose a device to push to.");
             });
 
@@ -938,7 +938,7 @@ var SICKRAGE = {
             getPushbulletDevices();
 
             // @TODO Find out what notify_data actually does since it doesn't seem to be a real function
-            $('#email_show').change(function() {
+            $('#email_show').on('change', function() {
                 var key = parseInt($('#email_show').val(), 10);
                 $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); // jshint ignore:line
             });
@@ -967,7 +967,7 @@ var SICKRAGE = {
             // Load the per show notify lists everytime this page is loaded
             loadShowNotifyLists();
 
-            $('#email_show_save').click(function() {
+            $('#email_show_save').on('click', function() {
                 $.post(srRoot + "/home/saveShowNotifyList", {
                     show: $('#email_show').val(),
                     emails: $('#email_show_list').val()
@@ -978,7 +978,7 @@ var SICKRAGE = {
             });
 
             // show instructions for plex when enabled
-            $('#use_plex').click(function() {
+            $('#use_plex').on('click', function() {
                 if ($(this).is(':checked')) {
                     $('.plexinfo').removeClass('hide');
                 } else {
@@ -1020,8 +1020,8 @@ var SICKRAGE = {
                 example.animeType = $('input[name="naming_anime"]:checked').val();
 
                 $.get(srRoot + '/config/postProcessing/testNaming', {
-                    pattern: example.pattern,
-                    anime_type: 3 // jshint ignore:line
+                    'pattern': example.pattern,
+                    'anime_type': 3 // jshint ignore:line
                 }, function (data) {
                     if (data) {
                         $('#naming_example').text(data + '.ext');
@@ -1032,9 +1032,9 @@ var SICKRAGE = {
                 });
 
                 $.get(srRoot + '/config/postProcessing/testNaming', {
-                    pattern: example.pattern,
-                    multi: example.multi,
-                    anime_type: 3 // jshint ignore:line
+                    'pattern': example.pattern,
+                    'multi': example.multi,
+                    'anime_type': 3
                 }, function (data) {
                     if (data) {
                         $('#naming_example_multi').text(data + '.ext');
@@ -1045,9 +1045,9 @@ var SICKRAGE = {
                 });
 
                 $.get(srRoot + '/config/postProcessing/isNamingValid', {
-                    pattern: example.pattern,
-                    multi: example.multi,
-                    anime_type: example.animeType // jshint ignore:line
+                    'pattern': example.pattern,
+                    'multi': example.multi,
+                    'anime_type': example.animeType
                 }, function (data) {
                     if (data === "invalid") {
                         $('#naming_pattern').qtip('option', {
@@ -1078,8 +1078,8 @@ var SICKRAGE = {
                 var pattern = $('#naming_abd_pattern').val();
 
                 $.get(srRoot + '/config/postProcessing/testNaming', {
-                    pattern: pattern,
-                    abd: 'True'
+                    'pattern': pattern,
+                    'abd': 'True'
                 }, function (data) {
                     if (data) {
                         $('#naming_abd_example').text(data + '.ext');
@@ -1090,8 +1090,8 @@ var SICKRAGE = {
                 });
 
                 $.get(srRoot + '/config/postProcessing/isNamingValid', {
-                    pattern: pattern,
-                    abd: 'True'
+                    'pattern': pattern,
+                    'abd': 'True'
                 }, function (data) {
                     if (data === "invalid") {
                         $('#naming_abd_pattern').qtip('option', {
@@ -1122,8 +1122,8 @@ var SICKRAGE = {
                 var pattern = $('#naming_sports_pattern').val();
 
                 $.get(srRoot + '/config/postProcessing/testNaming', {
-                    pattern: pattern,
-                    sports: 'True'
+                    'pattern': pattern,
+                    'sports': 'True'
                 }, function (data) {
                     if (data) {
                         $('#naming_sports_example').text(data + '.ext');
@@ -1134,8 +1134,8 @@ var SICKRAGE = {
                 });
 
                 $.get(srRoot + '/config/postProcessing/isNamingValid', {
-                    pattern: pattern,
-                    sports: 'True'
+                    'pattern': pattern,
+                    'sports': 'True'
                 }, function (data) {
                     if (data === "invalid") {
                         $('#naming_sports_pattern').qtip('option', {
@@ -1169,8 +1169,8 @@ var SICKRAGE = {
                 example.animeType = $('input[name="naming_anime"]:checked').val();
 
                 $.get(srRoot + '/config/postProcessing/testNaming', {
-                    pattern: example.pattern,
-                    anime_type: example.animeType // jshint ignore:line
+                    'pattern': example.pattern,
+                    'anime_type': example.animeType
                 }, function (data) {
                     if (data) {
                         $('#naming_example_anime').text(data + '.ext');
@@ -1181,9 +1181,9 @@ var SICKRAGE = {
                 });
 
                 $.get(srRoot + '/config/postProcessing/testNaming', {
-                    pattern: example.pattern,
-                    multi: example.multi,
-                    anime_type: example.animeType // jshint ignore:line
+                    'pattern': example.pattern,
+                    'multi': example.multi,
+                    'anime_type': example.animeType
                 }, function (data) {
                     if (data) {
                         $('#naming_example_multi_anime').text(data + '.ext');
@@ -1194,9 +1194,9 @@ var SICKRAGE = {
                 });
 
                 $.get(srRoot + '/config/postProcessing/isNamingValid', {
-                    pattern: example.pattern,
-                    multi: example.multi,
-                    anime_type: example.animeType // jshint ignore:line
+                    'pattern': example.pattern,
+                    'multi': example.multi,
+                    'anime_type': example.animeType
                 }, function (data) {
                     if (data === "invalid") {
                         $('#naming_pattern').qtip('option', {
@@ -1307,38 +1307,38 @@ var SICKRAGE = {
                 setupAnimeNaming();
             });
 
-            $('#naming_multi_ep').change(fillExamples);
-            $('#naming_pattern').focusout(fillExamples);
-            $('#naming_pattern').keyup(function () {
+            $('#naming_multi_ep').on('change', fillExamples);
+            $('#naming_pattern').on('focusout', fillExamples);
+            $('#naming_pattern').on('keyup', function() {
                 typewatch(function () {
                     fillExamples();
                 }, 500);
             });
 
-            $('#naming_anime_multi_ep').change(fillAnimeExamples);
-            $('#naming_anime_pattern').focusout(fillAnimeExamples);
-            $('#naming_anime_pattern').keyup(function () {
+            $('#naming_anime_multi_ep').on('change', fillAnimeExamples);
+            $('#naming_anime_pattern').on('focusout', fillAnimeExamples);
+            $('#naming_anime_pattern').on('keyup', function() {
                 typewatch(function () {
                     fillAnimeExamples();
                 }, 500);
             });
 
-            $('#naming_abd_pattern').focusout(fillExamples);
-            $('#naming_abd_pattern').keyup(function () {
+            $('#naming_abd_pattern').on('focusout', fillExamples);
+            $('#naming_abd_pattern').on('keyup', function() {
                 typewatch(function () {
                     fillAbdExamples();
                 }, 500);
             });
 
-            $('#naming_sports_pattern').focusout(fillExamples);
-            $('#naming_sports_pattern').keyup(function () {
+            $('#naming_sports_pattern').on('focusout', fillExamples);
+            $('#naming_sports_pattern').on('keyup', function() {
                 typewatch(function () {
                     fillSportsExamples();
                 }, 500);
             });
 
-            $('#naming_anime_pattern').focusout(fillExamples);
-            $('#naming_anime_pattern').keyup(function () {
+            $('#naming_anime_pattern').on('focusout', fillExamples);
+            $('#naming_anime_pattern').on('keyup', function() {
                 typewatch(function () {
                     fillAnimeExamples();
                 }, 500);
@@ -1506,14 +1506,6 @@ var SICKRAGE = {
             $('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' });
             $('#torrent_path').fileBrowser({ title: 'Select .torrent download location' });
 
-            function toggleTorrentTitle(){
-                if ($('#use_torrents').prop('checked')){
-                    $('#no_torrents').show();
-                } else {
-                    $('#no_torrents').hide();
-                }
-            }
-
             $.fn.nzbMethodHandler = function() {
                 var selectedProvider = $('#nzb_method :selected').val(),
                     blackholeSettings = '#blackhole_settings',
@@ -1539,28 +1531,6 @@ var SICKRAGE = {
                 }
             };
 
-            $.fn.rtorrentScgi = function(){
-                var selectedProvider = $('#torrent_method :selected').val();
-
-                if (selectedProvider.toLowerCase() === 'rtorrent') {
-                    var hostname = $('#torrent_host').prop('value');
-                    var isMatch = hostname.substr(0, 7) === "scgi://";
-
-                    if (isMatch) {
-                        $('#torrent_username_option').hide();
-                        $('#torrent_username').prop('value', '');
-                        $('#torrent_password_option').hide();
-                        $('#torrent_password').prop('value', '');
-                        $('#torrent_auth_type_option').hide();
-                        $("#torrent_auth_type option[value=none]").attr('selected', 'selected');
-                    } else {
-                        $('#torrent_username_option').show();
-                        $('#torrent_password_option').show();
-                        $('#torrent_auth_type_option').show();
-                    }
-                }
-            };
-
             $.fn.torrentMethodHandler = function() {
                 $('#options_torrent_clients').hide();
                 $('#options_torrent_blackhole').hide();
@@ -1574,104 +1544,88 @@ var SICKRAGE = {
                     rpcurl = ' RPC URL';
 
                 if (selectedProvider.toLowerCase() !== 'blackhole') {
-                    var label_warning_deluge = '#label_warning_deluge',
-                        label_anime_warning_deluge = '#label_anime_warning_deluge',
-                        host_desc_rtorrent = '#host_desc_rtorrent',
-                        host_desc_torrent = '#host_desc_torrent',
-                        torrent_verify_cert_option = '#torrent_verify_cert_option',
-                        torrent_path_option = '#torrent_path_option',
-                        torrent_seed_time_option = '#torrent_seed_time_option',
-                        torrent_high_bandwidth_option = '#torrent_high_bandwidth_option',
-                        torrent_label_option = '#torrent_label_option',
-                        torrent_label_anime_option = '#torrent_label_anime_option',
-                        path_synology = '#path_synology',
-                        torrent_paused_option = '#torrent_paused_option';
-
-                    $(label_warning_deluge).hide();
-                    $(label_anime_warning_deluge).hide();
-                    $(label_anime_warning_deluge).hide();
-                    $(host_desc_rtorrent).hide();
-                    $(host_desc_torrent).show();
-                    $(torrent_verify_cert_option).hide();
-                    $(torrent_verify_deluge).hide();
-                    $(torrent_verify_rtorrent).hide();
-                    $(torrent_auth_type_option).hide();
-                    $(torrent_path_option).show();
-                    $(torrent_path_option).find('.fileBrowser').show();
-                    $(torrent_seed_time_option).hide();
-                    $(torrent_high_bandwidth_option).hide();
-                    $(torrent_label_option).show();
-                    $(torrent_label_anime_option).show();
-                    $(path_synology).hide();
-                    $(torrent_paused_option).show();
-                    $(torrent_rpcurl_option).hide();
-                    $(this).rtorrentScgi();
+                    $('#label_warning_deluge').hide();
+                    $('#label_anime_warning_deluge').hide();
+                    $('#host_desc_torrent').show();
+                    $('#torrent_verify_cert_option').hide();
+                    $('#torrent_verify_deluge').hide();
+                    $('#torrent_verify_rtorrent').hide();
+                    $('#torrent_auth_type_option').hide();
+                    $('#torrent_path_option').show();
+                    $('#torrent_path_option').find('.fileBrowser').show();
+                    $('#torrent_seed_time_option').hide();
+                    $('#torrent_high_bandwidth_option').hide();
+                    $('#torrent_label_option').show();
+                    $('#torrent_label_anime_option').show();
+                    $('#path_synology').hide();
+                    $('#torrent_paused_option').show();
+                    $('#torrent_rpcurl_option').hide();
 
                     if (selectedProvider.toLowerCase() === 'utorrent') {
                         client = 'uTorrent';
-                        $(torrent_path_option).hide();
+                        $('#torrent_path_option').hide();
                         $('#torrent_seed_time_label').text('Minimum seeding time is');
-                        $(torrent_seed_time_option).show();
+                        $('#torrent_seed_time_option').show();
                         $('#host_desc_torrent').text('URL to your uTorrent client (e.g. http://localhost:8000)');
                     } else if (selectedProvider.toLowerCase() === 'transmission'){
                         client = 'Transmission';
                         $('#torrent_seed_time_label').text('Stop seeding when inactive for');
-                        $(torrent_seed_time_option).show();
-                        $(torrent_high_bandwidth_option).show();
-                        $(torrent_label_option).hide();
-                        $(torrent_label_anime_option).hide();
-                        $(torrent_rpcurl_option).show();
+                        $('#torrent_seed_time_option').show();
+                        $('#torrent_high_bandwidth_option').show();
+                        $('#torrent_label_option').hide();
+                        $('#torrent_label_anime_option').hide();
+                        $('#torrent_rpcurl_option').show();
                         $('#host_desc_torrent').text('URL to your Transmission client (e.g. http://localhost:9091)');
                     } else if (selectedProvider.toLowerCase() === 'deluge'){
                         client = 'Deluge';
-                        $(torrent_verify_cert_option).show();
-                        $(torrent_verify_deluge).show();
-                        $(torrent_verify_rtorrent).hide();
-                        $(label_warning_deluge).show();
-                        $(label_anime_warning_deluge).show();
+                        $('#torrent_verify_cert_option').show();
+                        $('#torrent_verify_deluge').show();
+                        $('#torrent_verify_rtorrent').hide();
+                        $('#label_warning_deluge').show();
+                        $('#label_anime_warning_deluge').show();
                         $('#torrent_username_option').hide();
                         $('#torrent_username').prop('value', '');
                         $('#host_desc_torrent').text('URL to your Deluge client (e.g. http://localhost:8112)');
-                    } else if ('deluged' == selectedProvider){
+                    } else if (selectedProvider.toLowerCase() === 'deluged'){
                         client = 'Deluge';
-                        $(torrent_verify_cert_option).hide();
-                        $(torrent_verify_deluge).hide();
-                        $(torrent_verify_rtorrent).hide();
-                        $(label_warning_deluge).show();
-                        $(label_anime_warning_deluge).show();
+                        $('#torrent_verify_cert_option').hide();
+                        $('#torrent_verify_deluge').hide();
+                        $('#torrent_verify_rtorrent').hide();
+                        $('#label_warning_deluge').show();
+                        $('#label_anime_warning_deluge').show();
                         $('#torrent_username_option').show();
                         $('#host_desc_torrent').text('IP or Hostname of your Deluge Daemon (e.g. scgi://localhost:58846)');
-                    } else if ('download_station' == selectedProvider){
+                    } else if (selectedProvider.toLowerCase() === 'download_station'){
                         client = 'Synology DS';
-                        $(torrent_label_option).hide();
-                        $(torrent_label_anime_option).hide();
+                        $('#torrent_label_option').hide();
+                        $('#torrent_label_anime_option').hide();
                         $('#torrent_paused_option').hide();
-                        $(torrent_path_option).find('.fileBrowser').hide();
+                        $('#torrent_path_option').find('.fileBrowser').hide();
                         $('#host_desc_torrent').text('URL to your Synology DS client (e.g. http://localhost:5000)');
-                        $(path_synology).show();
-                    } else if ('rtorrent' == selectedProvider){
+                        $('#path_synology').show();
+                    } else if (selectedProvider.toLowerCase() === 'rtorrent'){
                         client = 'rTorrent';
-                        $(torrent_paused_option).hide();
+                        $('#torrent_paused_option').hide();
                         $('#host_desc_torrent').text('URL to your rTorrent client (e.g. scgi://localhost:5000 <br> or https://localhost/rutorrent/plugins/httprpc/action.php)');
-                        $(torrent_verify_cert_option).show();
-                        $(torrent_verify_deluge).hide();
-                        $(torrent_verify_rtorrent).show();
-                        $(torrent_auth_type_option).show();
-                    } else if ('qbittorrent' == selectedProvider){
+                        $('#torrent_verify_cert_option').show();
+                        $('#torrent_verify_deluge').hide();
+                        $('#torrent_verify_rtorrent').show();
+                        $('#torrent_auth_type_option').show();
+                    } else if (selectedProvider.toLowerCase() === 'qbittorrent'){
                         client = 'qbittorrent';
-                        $(torrent_path_option).hide();
-                        $(torrent_label_option).hide();
-                        $(torrent_label_anime_option).hide();
+                        $('#torrent_path_option').hide();
+                        $('#torrent_label_option').hide();
+                        $('#torrent_label_anime_option').hide();
                         $('#host_desc_torrent').text('URL to your qbittorrent client (e.g. http://localhost:8080)');
-                    } else if ('mlnet' == selectedProvider){
+                    } else if (selectedProvider.toLowerCase() === 'mlnet'){
                         client = 'mlnet';
-                        $(torrent_path_option).hide();
-                        $(torrent_label_option).hide();
-                        $(torrent_verify_cert_option).hide();
-                        $(torrent_verify_deluge).hide();
-                        $(torrent_verify_rtorrent).hide();
-                        $(torrent_label_anime_option).hide();
-                        $(torrent_paused_option).hide();
+                        $('#torrent_path_option').hide();
+                        $('#torrent_label_option').hide();
+                        $('#torrent_verify_cert_option').hide();
+                        $('#torrent_verify_deluge').hide();
+                        $('#torrent_verify_rtorrent').hide();
+                        $('#torrent_label_anime_option').hide();
+                        $('#torrent_paused_option').hide();
                         $('#host_desc_torrent').text('URL to your MLDonkey (e.g. http://localhost:4080)');
                     }
                     $('#host_title').text(client + host);
@@ -1684,31 +1638,53 @@ var SICKRAGE = {
                 $(optionPanel).show();
             };
 
-            $('#nzb_method').change($(this).nzbMethodHandler);
+            $('#torrent_host').on('input', function(){
+                if($('#torrent_method :selected').val().toLowerCase() === 'rtorrent') {
+                    var hostname = $('#torrent_host').val();
+                    var isMatch = hostname.substr(0, 7) === "scgi://";
+
+                    if(isMatch) {
+                        $('#torrent_username_option').hide();
+                        $('#torrent_username').prop('value', '');
+                        $('#torrent_password_option').hide();
+                        $('#torrent_password').prop('value', '');
+                        $('#torrent_auth_type_option').hide();
+                        $("#torrent_auth_type option[value=none]").attr('selected', 'selected');
+                    } else {
+                        $('#torrent_username_option').show();
+                        $('#torrent_password_option').show();
+                        $('#torrent_auth_type_option').show();
+                    }
+                }
+            });
+
+            $('#nzb_method').on('change', $(this).nzbMethodHandler);
 
             $(this).nzbMethodHandler();
 
-            $('#testSABnzbd').click(function(){
+            $('#testSABnzbd').on('click', function(){
+                var sab = {};
                 $('#testSABnzbd_result').html(loading);
-                var sab_host = $('#sab_host').val();
-                var sab_username = $('#sab_username').val();
-                var sab_password = $('#sab_password').val();
-                var sab_apiKey = $('#sab_apikey').val();
-
-                $.get(srRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey}, function(data){
+                sab.host = $('#sab_host').val();
+                sab.username = $('#sab_username').val();
+                sab.password = $('#sab_password').val();
+                sab.apiKey = $('#sab_apikey').val();
+
+                $.get(srRoot + '/home/testSABnzbd', {
+                    'host': sab.host,
+                    'username': sab.username,
+                    'password': sab.password,
+                    'apikey': sab.apiKey
+                }, function(data){
                     $('#testSABnzbd_result').html(data);
                 });
             });
 
-            $('#torrent_method').change($(this).torrentMethodHandler);
+            $('#torrent_method').on('change', $.torrentMethodHandler);
 
-            $(this).torrentMethodHandler();
+            $.torrentMethodHandler();
 
-            $('#use_torrents').click(function(){
-                toggleTorrentTitle();
-            });
-
-            $('#test_torrent').click(function(){
+            $('#test_torrent').on('click', function(){
                 var torrent = {};
                 $('#test_torrent_result').html(loading);
                 torrent.method = $('#torrent_method :selected').val();
@@ -1725,8 +1701,6 @@ var SICKRAGE = {
                     $('#test_torrent_result').html(data);
                 });
             });
-
-            $('#torrent_host').change($(this).rtorrentScgi);
         },
         subtitles: function() {
             $.fn.showHideServices = function() {
@@ -1767,7 +1741,7 @@ var SICKRAGE = {
                 $("#service_order").val(finalArr.join(' '));
             };
 
-            $('#editAService').change(function(){
+            $('#editAService').on('change', function(){
                 $(this).showHideServices();
             });
 
@@ -1792,9 +1766,481 @@ var SICKRAGE = {
             console.log('This function need to be filled with ConfigProviders.js but can\'t be as we\'ve got scope issues currently.');
         }
     },
+    home: {
+        init: function(){
+
+        },
+        index: function(){
+            // Resets the tables sorting, needed as we only use a single call for both tables in tablesorter
+            $('.resetsorting').on('click', function(){
+                $('table').trigger('filterReset');
+            });
+
+            // This needs to be refined to work a little faster.
+            $('.progressbar').each(function(){
+                var percentage = $(this).data('progress-percentage');
+                var classToAdd = percentage === 100 ? 100 : percentage > 80 ? 80 : percentage > 60 ? 60 : percentage > 40 ? 40 : 20;
+                $(this).progressbar({ value:  percentage });
+                if($(this).data('progress-text')) {
+                    $(this).append('<div class="progressbarText" title="' + $(this).data('progress-tip') + '">' + $(this).data('progress-text') + '</div>');
+                }
+                $(this).find('.ui-progressbar-value').addClass('progress-' + classToAdd);
+            });
+
+            $("img#network").on('error', function(){
+                $(this).parent().text($(this).attr('alt'));
+                $(this).remove();
+            });
+
+            $("#showListTableShows:has(tbody tr), #showListTableAnime:has(tbody tr)").tablesorter({
+                sortList: [[7,1],[2,0]],
+                textExtraction: {
+                    0: function(node) { return $(node).find('time').attr('datetime'); },
+                    1: function(node) { return $(node).find('time').attr('datetime'); },
+                    3: function(node) { return $(node).find("span").prop("title").toLowerCase(); },
+                    4: function(node) { return $(node).find("span").text().toLowerCase(); },
+                    5: function(node) { return $(node).find("span:first").text(); },
+                    6: function(node) { return $(node).find("img").attr("alt"); }
+                },
+                widgets: ['saveSort', 'zebra', 'stickyHeaders', 'filter', 'columnSelector'],
+                headers: (function(){
+                    if(metaToBool('sickbeard.FILTER_ROW')){
+                        return {
+                            0: { sorter: 'realISODate' },
+                            1: { sorter: 'realISODate' },
+                            2: { sorter: 'loadingNames' },
+                            4: { sorter: 'quality' },
+                            5: { sorter: 'eps' },
+                            6: { filter : 'parsed' }
+                        };
+                    } else {
+                        return {
+                            0: { sorter: 'realISODate' },
+                            1: { sorter: 'realISODate' },
+                            2: { sorter: 'loadingNames' },
+                            4: { sorter: 'quality' },
+                            5: { sorter: 'eps' }
+                        };
+                    }
+                }()),
+                widgetOptions: (function(){
+                    if(metaToBool('sickbeard.FILTER_ROW')){
+                        return {
+                            filter_columnFilters: true, // jshint ignore:line
+                            filter_hideFilters : true, // jshint ignore:line
+                            filter_saveFilters : true, // jshint ignore:line
+                            filter_functions : { // jshint ignore:line
+                                5:function(e, n, f) {
+                                    var test = false;
+                                    var pct = Math.floor((n % 1) * 1000);
+                                    if (f === '') {
+                                        test = true;
+                                    } else {
+                                        var result = f.match(/(<|<=|>=|>)\s(\d+)/i);
+                                        if (result) {
+                                            if (result[1] === "<") {
+                                                if (pct < parseInt(result[2])) {
+                                                    test = true;
+                                                }
+                                            } else if (result[1] === "<=") {
+                                                if (pct <= parseInt(result[2])) {
+                                                    test = true;
+                                                }
+                                            } else if (result[1] === ">=") {
+                                                if (pct >= parseInt(result[2])) {
+                                                    test = true;
+                                                }
+                                            } else if (result[1] === ">") {
+                                                if (pct > parseInt(result[2])) {
+                                                    test = true;
+                                                }
+                                            }
+                                        }
+
+                                        result = f.match(/(\d+)\s(-|to)\s(\d+)/i);
+                                        if (result) {
+                                            if ((result[2] === "-") || (result[2] === "to")) {
+                                                if ((pct >= parseInt(result[1])) && (pct <= parseInt(result[3]))) {
+                                                    test = true;
+                                                }
+                                            }
+                                        }
+
+                                        result = f.match(/(=)?\s?(\d+)\s?(=)?/i);
+                                        if (result) {
+                                            if ((result[1] === "=") || (result[3] === "=")) {
+                                                if (parseInt(result[2]) === pct) {
+                                                    test = true;
+                                                }
+                                            }
+                                        }
+
+                                        if (!isNaN(parseFloat(f)) && isFinite(f)) {
+                                            if (parseInt(f) === pct) {
+                                                test = true;
+                                            }
+                                        }
+                                    }
+                                    return test;
+                                }
+                            },
+                            'columnSelector_mediaquery': false
+                        };
+                    } else {
+                        return {
+                            'filter_columnFilters': false
+                        };
+                    }
+                }()),
+                sortStable: true,
+                sortAppend: [[2,0]]
+            });
+
+            if ($("#showListTableShows").find("tbody").find("tr").size() > 0){
+                $.tablesorter.filter.bindSearch( "#showListTableShows", $('.search') );
+            }
+
+            if(metaToBool('sickbeard.ANIME_SPLIT_HOME')){
+                if($("#showListTableAnime").find("tbody").find("tr").size() > 0){
+                    $.tablesorter.filter.bindSearch( "#showListTableAnime", $('.search') );
+                }
+            }
+
+            $.each([$('#container'), $('#container-anime')], function (){
+                this.isotope({
+                    itemSelector: '.show',
+                    sortBy : getMeta('sickbeard.POSTER_SORTBY'),
+                    sortAscending: getMeta('sickbeard.POSTER_SORTDIR'),
+                    layoutMode: 'masonry',
+                    masonry: {
+                        columnWidth: 13,
+                        isFitWidth: true
+                    },
+                    getSortData: {
+                        name: function(itemElem){
+                            var name = $(itemElem).attr('data-name');
+                            return (metaToBool('sickbeard.SORT_ARTICLE') ? (name || '') : (name || '').replace(/^(The|A|An)\s/i,''));
+                        },
+                        network: '[data-network]',
+                        date: function(itemElem){
+                            var date = $(itemElem).attr('data-date');
+                            return date.length && parseInt(date, 10) || Number.POSITIVE_INFINITY;
+                        },
+                        progress: function(itemElem){
+                            var progress = $(itemElem).attr('data-progress');
+                            return progress.length && parseInt(progress, 10) || Number.NEGATIVE_INFINITY;
+                        }
+                    }
+                });
+            });
+
+            $('#postersort').on('change', function(){
+                $('#container, #container-anime').isotope({sortBy: $(this).val()});
+                $.get($(this).find('option[value=' + $(this).val() +']').attr('data-sort'));
+            });
+
+            $('#postersortdirection').on('change', function(){
+                $('#container, #container-anime').isotope({sortAscending: ($(this).val() === 'true')});
+                $.get($(this).find('option[value=' + $(this).val() +']').attr('data-sort'));
+            });
+
+            $('#popover').popover({
+                placement: 'bottom',
+                html: true, // required if content has HTML
+                content: '<div id="popover-target"></div>'
+            }).on('shown.bs.popover', function () { // bootstrap popover event triggered when the popover opens
+                // call this function to copy the column selection code into the popover
+                $.tablesorter.columnSelector.attachTo( $('#showListTableShows'), '#popover-target');
+                if(metaToBool('sickbeard.ANIME_SPLIT_HOME')){
+                    $.tablesorter.columnSelector.attachTo( $('#showListTableAnime'), '#popover-target');
+                }
+
+            });
+        },
+        displayShow: function() {
+            $('#srRoot').ajaxEpSearch({'colorRow': true});
+
+            $('#srRoot').ajaxEpSubtitlesSearch();
+
+            $('#seasonJump').on('change', function(){
+                var id = $('#seasonJump option:selected').val();
+                if (id && id !== 'jump') {
+                    var season = $('#seasonJump option:selected').data('season');
+                    $('html,body').animate({scrollTop: $('[name ="' + id.substring(1) + '"]').offset().top - 50}, 'slow');
+                    $('#collapseSeason-' + season).collapse('show');
+                    location.hash = id;
+                }
+                $(this).val('jump');
+            });
+
+            $("#prevShow").on('click', function(){
+                $('#pickShow option:selected').prev('option').prop('selected', 'selected');
+                $("#pickShow").change();
+            });
+
+            $("#nextShow").on('click', function(){
+                $('#pickShow option:selected').next('option').prop('selected', 'selected');
+                $("#pickShow").change();
+            });
+
+            $('#changeStatus').on('click', function(){
+                var srRoot = $('#srRoot').val();
+                var epArr = [];
+
+                $('.epCheck').each(function () {
+                    if (this.checked === true) {
+                        epArr.push($(this).attr('id'));
+                    }
+                });
+
+                if (epArr.length === 0) { return false; }
+
+                window.location.href = srRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val();
+            });
+
+            $('.seasonCheck').on('click', function(){
+                var seasCheck = this;
+                var seasNo = $(seasCheck).attr('id');
+
+                $('#collapseSeason-' + seasNo).collapse('show');
+                $('.epCheck:visible').each(function () {
+                    var epParts = $(this).attr('id').split('x');
+                    if (epParts[0] === seasNo) {
+                        this.checked = seasCheck.checked;
+                    }
+                });
+            });
+
+            var lastCheck = null;
+            $('.epCheck').on('click', function (event) {
+
+                if (!lastCheck || !event.shiftKey) {
+                    lastCheck = this;
+                    return;
+                }
+
+                var check = this;
+                var found = 0;
+
+                $('.epCheck').each(function() {
+                    switch (found) {
+                        case 2:
+                            return false;
+                        case 1:
+                            this.checked = lastCheck.checked;
+                    }
+
+                    if (this === check || this === lastCheck) {
+                        found++;
+                    }
+                });
+            });
+
+            // selects all visible episode checkboxes.
+            $('.seriesCheck').on('click', function () {
+                $('.epCheck:visible').each(function () {
+                    this.checked = true;
+                });
+                $('.seasonCheck:visible').each(function () {
+                    this.checked = true;
+                });
+            });
+
+            // clears all visible episode checkboxes and the season selectors
+            $('.clearAll').on('click', function () {
+                $('.epCheck:visible').each(function () {
+                    this.checked = false;
+                });
+                $('.seasonCheck:visible').each(function () {
+                    this.checked = false;
+                });
+            });
+
+            // handle the show selection dropbox
+            $('#pickShow').on('change', function () {
+                var srRoot = $('#srRoot').val();
+                var val = $(this).val();
+                if (val === 0) {
+                    return;
+                }
+                window.location.href = srRoot + '/home/displayShow?show=' + val;
+            });
+
+            // show/hide different types of rows when the checkboxes are changed
+            $("#checkboxControls input").change(function () {
+                var whichClass = $(this).attr('id');
+                $(this).showHideRows(whichClass);
+            });
+
+            // initially show/hide all the rows according to the checkboxes
+            $("#checkboxControls input").each(function() {
+                var status = $(this).prop('checked');
+                $("tr." + $(this).attr('id')).each(function() {
+                    if(status) {
+                        $(this).show();
+                    } else {
+                        $(this).hide();
+                    }
+                });
+            });
+
+            $.fn.showHideRows = function(whichClass) {
+                var status = $('#checkboxControls > input, #' + whichClass).prop('checked');
+                $("tr." + whichClass).each(function() {
+                    if (status) {
+                        $(this).show();
+                    } else {
+                        $(this).hide();
+                    }
+                });
+
+                // hide season headers with no episodes under them
+                $('tr.seasonheader').each(function () {
+                    var numRows = 0;
+                    var seasonNo = $(this).attr('id');
+                    $('tr.' + seasonNo + ' :visible').each(function () {
+                        numRows++;
+                    });
+                    if (numRows === 0) {
+                        $(this).hide();
+                        $('#' + seasonNo + '-cols').hide();
+                    } else {
+                        $(this).show();
+                        $('#' + seasonNo + '-cols').show();
+                    }
+                });
+            };
+
+            function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {
+                var srRoot = $('#srRoot').val();
+                var showId = $('#showID').val();
+                var indexer = $('#indexer').val();
+
+                if (sceneSeason === '') { sceneSeason = null; }
+                if (sceneEpisode === '') { sceneEpisode = null; }
+
+                $.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 srRoot = $('#srRoot').val();
+                var showId = $('#showID').val();
+                var indexer = $('#indexer').val();
+
+                if (sceneAbsolute === '') { sceneAbsolute = null; }
+
+                $.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').on('change', function() {
+                //	Strip non-numeric characters
+                $(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
+                var forSeason = $(this).attr('data-for-season');
+                var forEpisode = $(this).attr('data-for-episode');
+                var m = $(this).val().match(/^(\d+)x(\d+)$/i);
+                var sceneSeason = null, sceneEpisode = null;
+                if (m) {
+                    sceneSeason = m[1];
+                    sceneEpisode = m[2];
+                }
+                setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);
+            });
+
+            $('.sceneAbsolute').on('change', function() {
+                //	Strip non-numeric characters
+                $(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
+                var forAbsolute = $(this).attr('data-for-absolute');
+
+                var m = $(this).val().match(/^(\d{1,3})$/i);
+                var sceneAbsolute = null;
+                if (m) {
+                    sceneAbsolute = m[1];
+                }
+                setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute);
+            });
+
+            $('.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, // jshint ignore:line
+                    columnSelector_layout : '<br><label><input type="checkbox">{name}</label>', // jshint ignore:line
+                    columnSelector_mediaquery: false, // jshint ignore:line
+                    columnSelector_cssChecked : 'checked' // jshint ignore:line
+                }
+            });
+
+            $('#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');
+            });
+        },
+        postProcess: function() {
+            $('#episodeDir').fileBrowser({ title: 'Select Unprocessed Episode Folder', key: 'postprocessPath' });
+        }
+    },
     manage: {
         init: function() {
-            $.makeRow = function(indexerId, season, episode, name, checked) {
+            $.makeEpisodeRow = function(indexerId, season, episode, name, checked) {
                 var row = '';
                 row += ' <tr class="' + $('#row_class').val() + ' show-' + indexerId + '">';
                 row += '  <td class="tableleft" align="center"><input type="checkbox" class="' + indexerId + '-epcheck" name="' + indexerId + '-' + season + 'x' + episode + '"' + (checked ? ' checked' : '') + '></td>';
@@ -1804,6 +2250,27 @@ var SICKRAGE = {
 
                 return row;
             };
+
+            $.makeSubtitleRow = function(indexerId, season, episode, name, subtitles, checked) {
+                var row = '';
+                row += '<tr class="good show-' + indexerId + '">';
+                row += '<td align="center"><input type="checkbox" class="' + indexerId + '-epcheck" name="' + indexerId + '-' + season + 'x' + episode + '"' + (checked ? ' checked' : '') + '></td>';
+                row += '<td style="width: 1%;">' + season + 'x' + episode + '</td>';
+                row += '<td>' + name + '</td>';
+                if(subtitles.length > 0){
+                    row += '<td style="float: right;">';
+                    subtitles = subtitles.split(',');
+                    for (var i in subtitles) {
+                        if (subtitles.hasOwnProperty(i)) {
+                            row += '<img src="/images/subtitles/flags/' + subtitles[i] + '.png" width="16" height="11" alt="' + subtitles[i] + '" />&nbsp;';
+                        }
+                    }
+                    row += '</td>';
+                }
+                row += '</tr>';
+
+                return row;
+            };
         },
         index: function() {
             $("#massUpdateTable:has(tbody tr)").tablesorter({
@@ -1830,19 +2297,19 @@ var SICKRAGE = {
                     7: { sorter: 'archive_firstmatch'},
                     8: { sorter: 'paused'},
                     9: { sorter: 'subtitle'},
-                   10: { sorter: 'default_ep_status'},
-                   11: { sorter: 'status'},
-                   12: { sorter: false},
-                   13: { sorter: false},
-                   14: { sorter: false},
-                   15: { sorter: false},
-                   16: { sorter: false},
-                   17: { sorter: false}
+                    10: { sorter: 'default_ep_status'},
+                    11: { sorter: 'status'},
+                    12: { sorter: false},
+                    13: { sorter: false},
+                    14: { sorter: false},
+                    15: { sorter: false},
+                    16: { sorter: false},
+                    17: { sorter: false}
                 }
             });
         },
         backlogOverview: function() {
-            $('#pickShow').change(function(){
+            $('#pickShow').on('change', function(){
                 var id = $(this).val();
                 if (id) {
                     $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow');
@@ -1855,20 +2322,67 @@ var SICKRAGE = {
                 sortList: [[0,0]],
                 headers: { 3: { sorter: false } }
             });
-            $('#limit').change(function(){
+            $('#limit').on('change', function(){
                 window.location.href = srRoot + '/manage/failedDownloads/?limit=' + $(this).val();
             });
+
+            $('#submitMassRemove').on('click', function(){
+                var removeArr = [];
+
+                $('.removeCheck').each(function() {
+                    if (this.checked === true) {
+                        removeArr.push($(this).attr('id').split('-')[1]);
+                    }
+                });
+
+                if (removeArr.length === 0) { return false; }
+
+                window.location.href = srRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|');
+            });
+
+            $('.bulkCheck').on('click', function(){
+                var bulkCheck = this;
+                var whichBulkCheck = $(bulkCheck).attr('id');
+
+                $('.'+whichBulkCheck+':visible').each(function(){
+                    this.checked = bulkCheck.checked;
+                });
+            });
+
+            if($('.removeCheck').length){
+                $('.removeCheck').each(function(name) {
+                    var lastCheck = null;
+                    $(name).click(function(event) {
+                        if(!lastCheck || !event.shiftKey) {
+                            lastCheck = this;
+                            return;
+                        }
+
+                        var check = this;
+                        var found = 0;
+
+                        $(name+':visible').each(function() {
+                            switch (found) {
+                                case 2: return false;
+                                case 1: this.checked = lastCheck.checked;
+                            }
+
+                            if (this === check || this === lastCheck) { found++; }
+                        });
+                    });
+                });
+            }
         },
         massEdit: function() {
             $('#location').fileBrowser({ title: 'Select Show Location' });
         },
         episodeStatuses: function() {
-            $('.allCheck').click(function(){
+            $('.allCheck').on('click', function(){
                 var indexerId = $(this).attr('id').split('-')[1];
                 $('.' + indexerId + '-epcheck').prop('checked', $(this).prop('checked'));
             });
 
-            $('.get_more_eps').click(function(){
+            $('.get_more_eps').on('click', function(){
                 var curIndexerId = $(this).attr('id');
                 var checked = $('#allCheck-' + curIndexerId).prop('checked');
                 var lastRow = $('tr#' + curIndexerId);
@@ -1877,13 +2391,12 @@ var SICKRAGE = {
 
                 if(!clicked) {
                     $.getJSON(srRoot+'/manage/showEpisodeStatuses',{
-                        indexer_id: curIndexerId, // jshint ignore:line
+                        'indexer_id': curIndexerId,
                         whichStatus: $('#oldStatus').val()
                     }, function (data) {
                         $.each(data, function(season,eps){
                             $.each(eps, function(episode, name) {
-                                //alert(season+'x'+episode+': '+name);
-                                lastRow.after($.makeRow(curIndexerId, season, episode, name, checked));
+                                lastRow.after($.makeEpisodeRow(curIndexerId, season, episode, name, checked));
                             });
                         });
                     });
@@ -1901,32 +2414,32 @@ var SICKRAGE = {
             });
 
             // selects all visible episode checkboxes.
-            $('.selectAllShows').click(function(){
+            $('.selectAllShows').on('click', function(){
                 $('.allCheck').each(function(){
-                        this.checked = true;
+                    this.checked = true;
                 });
                 $('input[class*="-epcheck"]').each(function(){
-                        this.checked = true;
+                    this.checked = true;
                 });
             });
 
             // clears all visible episode checkboxes and the season selectors
-            $('.unselectAllShows').click(function(){
+            $('.unselectAllShows').on('click', function(){
                 $('.allCheck').each(function(){
-                        this.checked = false;
+                    this.checked = false;
                 });
                 $('input[class*="-epcheck"]').each(function(){
-                        this.checked = false;
+                    this.checked = false;
                 });
             });
         },
         subtitleMissed: function() {
-            $('.allCheck').click(function(){
+            $('.allCheck').on('click', function(){
                 var indexerId = $(this).attr('id').split('-')[1];
                 $('.'+indexerId+'-epcheck').prop('checked', $(this).prop('checked'));
             });
 
-            $('.get_more_eps').click(function(){
+            $('.get_more_eps').on('click', function(){
                 var indexerId = $(this).attr('id');
                 var checked = $('#allCheck-'+indexerId).prop('checked');
                 var lastRow = $('tr#'+indexerId);
@@ -1935,12 +2448,12 @@ var SICKRAGE = {
 
                 if (!clicked) {
                     $.getJSON(srRoot + '/manage/showSubtitleMissed', {
-                        indexer_id: indexerId, // jshint ignore:line
+                        'indexer_id': indexerId,
                         whichSubs: $('#selectSubLang').val()
                     }, function(data) {
                         $.each(data, function(season, eps) {
                             $.each(eps, function(episode, data) {
-                                lastRow.after($.makeRow(indexerId, season, episode, data.name, data.subtitles, checked));
+                                lastRow.after($.makeSubtitleRow(indexerId, season, episode, data.name, data.subtitles, checked));
                             });
                         });
                     });
@@ -1958,25 +2471,70 @@ var SICKRAGE = {
             });
 
             // selects all visible episode checkboxes.
-            $('.selectAllShows').click(function(){
+            $('.selectAllShows').on('click', function(){
                 $('.allCheck').each(function(){
-                        this.checked = true;
+                    this.checked = true;
                 });
                 $('input[class*="-epcheck"]').each(function(){
-                        this.checked = true;
+                    this.checked = true;
                 });
             });
 
             // clears all visible episode checkboxes and the season selectors
-            $('.unselectAllShows').click(function(){
+            $('.unselectAllShows').on('click', function(){
                 $('.allCheck').each(function(){
-                        this.checked = false;
+                    this.checked = false;
                 });
                 $('input[class*="-epcheck"]').each(function(){
-                        this.checked = false;
+                    this.checked = false;
                 });
             });
         }
+    },
+    history: {
+        init: function() {
+
+        },
+        index: function() {
+            $("#historyTable:has(tbody tr)").tablesorter({
+                widgets: ['zebra', 'filter'],
+                sortList: [[0,1]],
+                textExtraction: (function(){
+                    if(isMeta('sickbeard.HISTORY_LAYOUT', ['detailed'])){
+                        return {
+                            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('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(isMeta('sickbeard.HISTORY_LAYOUT', ['detailed'])){
+                        return {
+                            0: { sorter: 'realISODate' },
+                            4: { sorter: 'quality' }
+                        };
+                    } else {
+                        return {
+                            0: { sorter: 'realISODate' },
+                            4: { sorter: false },
+                            5: { sorter: 'quality' }
+                        };
+                    }
+                }())
+            });
+
+            $('#history_limit').on('change', function() {
+                var url = srRoot + '/history/?limit=' + $(this).val();
+                window.location.href = url;
+            });
+        }
     }
 };
 
diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js
index 07c6080f5cac0873cd01ac7aea2ca82773f1a384..760b08a88b139929b632e36e4cbb084ab59dc2be 100644
Binary files a/gui/slick/js/core.min.js and b/gui/slick/js/core.min.js differ
diff --git a/gui/slick/js/failedDownloads.js b/gui/slick/js/failedDownloads.js
deleted file mode 100644
index f599e41295952278058651f016dc04ea31bad2eb..0000000000000000000000000000000000000000
--- a/gui/slick/js/failedDownloads.js
+++ /dev/null
@@ -1,50 +0,0 @@
-$(document).ready(function(){
-    $('#submitMassRemove').on('click', function(){
-        var removeArr = [];
-
-        $('.removeCheck').each(function() {
-            if (this.checked === true) {
-                removeArr.push($(this).attr('id').split('-')[1]);
-            }
-        });
-
-        if (removeArr.length === 0) { return false; }
-
-        window.location.href = srRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|');
-    });
-
-    $('.bulkCheck').on('click', function(){
-        var bulkCheck = this;
-        var whichBulkCheck = $(bulkCheck).attr('id');
-
-        $('.'+whichBulkCheck+':visible').each(function(){
-            this.checked = bulkCheck.checked;
-        });
-    });
-
-    if($('.removeCheck').length){
-        $('.removeCheck').each(function(name) {
-            var lastCheck = null;
-            $(name).click(function(event) {
-                if(!lastCheck || !event.shiftKey) {
-                    lastCheck = this;
-                    return;
-                }
-
-                var check = this;
-                var found = 0;
-
-                $(name+':visible').each(function() {
-                    switch (found) {
-                        case 2: return false;
-                        case 1:
-                        this.checked = lastCheck.checked;
-                    }
-
-                    if (this === check || this === lastCheck) { found++; }
-                });
-            });
-        });
-    }
-
-});
diff --git a/gui/slick/js/lib/bootstrap-anchor.min.js b/gui/slick/js/lib/bootstrap-anchor.min.js
deleted file mode 100644
index b541e5689846fe03a588eb05f688cf1c2b76c96f..0000000000000000000000000000000000000000
Binary files a/gui/slick/js/lib/bootstrap-anchor.min.js and /dev/null differ
diff --git a/gui/slick/js/lib/isotope.pkgd.min.js b/gui/slick/js/lib/isotope.pkgd.min.js
deleted file mode 100644
index 20ea20621c7013f02f3fac6c4dd573ff16795fd2..0000000000000000000000000000000000000000
Binary files a/gui/slick/js/lib/isotope.pkgd.min.js and /dev/null differ
diff --git a/gui/slick/js/lib/jquery.form-3.35.js b/gui/slick/js/lib/jquery.form-3.35.js
deleted file mode 100644
index e3126cafdcb4d451e2590e698f58c813f68239d7..0000000000000000000000000000000000000000
--- a/gui/slick/js/lib/jquery.form-3.35.js
+++ /dev/null
@@ -1,1190 +0,0 @@
-/*!
- * jQuery Form Plugin
- * version: 3.35.0-2013.05.23
- * @requires jQuery v1.5 or later
- * Copyright (c) 2013 M. Alsup
- * Examples and documentation at: http://malsup.com/jquery/form/
- * Project repository: https://github.com/malsup/form
- * Dual licensed under the MIT and GPL licenses.
- * https://github.com/malsup/form#copyright-and-license
- */
-/*global ActiveXObject */
-;(function($) {
-"use strict";
-
-/*
-    Usage Note:
-    -----------
-    Do not use both ajaxSubmit and ajaxForm on the same form.  These
-    functions are mutually exclusive.  Use ajaxSubmit if you want
-    to bind your own submit handler to the form.  For example,
-
-    $(document).ready(function() {
-        $('#myForm').on('submit', function(e) {
-            e.preventDefault(); // <-- important
-            $(this).ajaxSubmit({
-                target: '#output'
-            });
-        });
-    });
-
-    Use ajaxForm when you want the plugin to manage all the event binding
-    for you.  For example,
-
-    $(document).ready(function() {
-        $('#myForm').ajaxForm({
-            target: '#output'
-        });
-    });
-
-    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
-    form does not have to exist when you invoke ajaxForm:
-
-    $('#myForm').ajaxForm({
-        delegation: true,
-        target: '#output'
-    });
-
-    When using ajaxForm, the ajaxSubmit function will be invoked for you
-    at the appropriate time.
-*/
-
-/**
- * Feature detection
- */
-var feature = {};
-feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
-feature.formdata = window.FormData !== undefined;
-
-var hasProp = !!$.fn.prop;
-
-// attr2 uses prop when it can but checks the return type for
-// an expected string.  this accounts for the case where a form 
-// contains inputs with names like "action" or "method"; in those
-// cases "prop" returns the element
-$.fn.attr2 = function() {
-    if ( ! hasProp )
-        return this.attr.apply(this, arguments);
-    var val = this.prop.apply(this, arguments);
-    if ( ( val && val.jquery ) || typeof val === 'string' )
-        return val;
-    return this.attr.apply(this, arguments);
-};
-
-/**
- * ajaxSubmit() provides a mechanism for immediately submitting
- * an HTML form using AJAX.
- */
-$.fn.ajaxSubmit = function(options) {
-    /*jshint scripturl:true */
-
-    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
-    if (!this.length) {
-        log('ajaxSubmit: skipping submit process - no element selected');
-        return this;
-    }
-
-    var method, action, url, $form = this;
-
-    if (typeof options == 'function') {
-        options = { success: options };
-    }
-
-    method = options.type || this.attr2('method');
-    action = options.url  || this.attr2('action');
-
-    url = (typeof action === 'string') ? $.trim(action) : '';
-    url = url || window.location.href || '';
-    if (url) {
-        // clean url (don't include hash vaue)
-        url = (url.match(/^([^#]+)/)||[])[1];
-    }
-
-    options = $.extend(true, {
-        url:  url,
-        success: $.ajaxSettings.success,
-        type: method || 'GET',
-        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
-    }, options);
-
-    // hook for manipulating the form data before it is extracted;
-    // convenient for use with rich editors like tinyMCE or FCKEditor
-    var veto = {};
-    this.trigger('form-pre-serialize', [this, options, veto]);
-    if (veto.veto) {
-        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
-        return this;
-    }
-
-    // provide opportunity to alter form data before it is serialized
-    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
-        log('ajaxSubmit: submit aborted via beforeSerialize callback');
-        return this;
-    }
-
-    var traditional = options.traditional;
-    if ( traditional === undefined ) {
-        traditional = $.ajaxSettings.traditional;
-    }
-
-    var elements = [];
-    var qx, a = this.formToArray(options.semantic, elements);
-    if (options.data) {
-        options.extraData = options.data;
-        qx = $.param(options.data, traditional);
-    }
-
-    // give pre-submit callback an opportunity to abort the submit
-    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
-        log('ajaxSubmit: submit aborted via beforeSubmit callback');
-        return this;
-    }
-
-    // fire vetoable 'validate' event
-    this.trigger('form-submit-validate', [a, this, options, veto]);
-    if (veto.veto) {
-        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
-        return this;
-    }
-
-    var q = $.param(a, traditional);
-    if (qx) {
-        q = ( q ? (q + '&' + qx) : qx );
-    }
-    if (options.type.toUpperCase() == 'GET') {
-        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-        options.data = null;  // data is null for 'get'
-    }
-    else {
-        options.data = q; // data is the query string for 'post'
-    }
-
-    var callbacks = [];
-    if (options.resetForm) {
-        callbacks.push(function() { $form.resetForm(); });
-    }
-    if (options.clearForm) {
-        callbacks.push(function() { $form.clearForm(options.includeHidden); });
-    }
-
-    // perform a load on the target only if dataType is not provided
-    if (!options.dataType && options.target) {
-        var oldSuccess = options.success || function(){};
-        callbacks.push(function(data) {
-            var fn = options.replaceTarget ? 'replaceWith' : 'html';
-            $(options.target)[fn](data).each(oldSuccess, arguments);
-        });
-    }
-    else if (options.success) {
-        callbacks.push(options.success);
-    }
-
-    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
-        var context = options.context || this ;    // jQuery 1.4+ supports scope context
-        for (var i=0, max=callbacks.length; i < max; i++) {
-            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
-        }
-    };
-
-    if (options.error) {
-        var oldError = options.error;
-        options.error = function(xhr, status, error) {
-            var context = options.context || this;
-            oldError.apply(context, [xhr, status, error, $form]);
-        };
-    }
-
-     if (options.complete) {
-        var oldComplete = options.complete;
-        options.complete = function(xhr, status) {
-            var context = options.context || this;
-            oldComplete.apply(context, [xhr, status, $form]);
-        };
-    }
-
-    // are there files to upload?
-
-    // [value] (issue #113), also see comment:
-    // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219
-    var fileInputs = $('input[type=file]:enabled[value!=""]', this);
-
-    var hasFileInputs = fileInputs.length > 0;
-    var mp = 'multipart/form-data';
-    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
-
-    var fileAPI = feature.fileapi && feature.formdata;
-    log("fileAPI :" + fileAPI);
-    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
-
-    var jqxhr;
-
-    // options.iframe allows user to force iframe mode
-    // 06-NOV-09: now defaulting to iframe mode if file input is detected
-    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
-        // hack to fix Safari hang (thanks to Tim Molendijk for this)
-        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
-        if (options.closeKeepAlive) {
-            $.get(options.closeKeepAlive, function() {
-                jqxhr = fileUploadIframe(a);
-            });
-        }
-        else {
-            jqxhr = fileUploadIframe(a);
-        }
-    }
-    else if ((hasFileInputs || multipart) && fileAPI) {
-        jqxhr = fileUploadXhr(a);
-    }
-    else {
-        jqxhr = $.ajax(options);
-    }
-
-    $form.removeData('jqxhr').data('jqxhr', jqxhr);
-
-    // clear element array
-    for (var k=0; k < elements.length; k++)
-        elements[k] = null;
-
-    // fire 'notify' event
-    this.trigger('form-submit-notify', [this, options]);
-    return this;
-
-    // utility fn for deep serialization
-    function deepSerialize(extraData){
-        var serialized = $.param(extraData, options.traditional).split('&');
-        var len = serialized.length;
-        var result = [];
-        var i, part;
-        for (i=0; i < len; i++) {
-            // #252; undo param space replacement
-            serialized[i] = serialized[i].replace(/\+/g,' ');
-            part = serialized[i].split('=');
-            // #278; use array instead of object storage, favoring array serializations
-            result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);
-        }
-        return result;
-    }
-
-     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
-    function fileUploadXhr(a) {
-        var formdata = new FormData();
-
-        for (var i=0; i < a.length; i++) {
-            formdata.append(a[i].name, a[i].value);
-        }
-
-        if (options.extraData) {
-            var serializedData = deepSerialize(options.extraData);
-            for (i=0; i < serializedData.length; i++)
-                if (serializedData[i])
-                    formdata.append(serializedData[i][0], serializedData[i][1]);
-        }
-
-        options.data = null;
-
-        var s = $.extend(true, {}, $.ajaxSettings, options, {
-            contentType: false,
-            processData: false,
-            cache: false,
-            type: method || 'POST'
-        });
-
-        if (options.uploadProgress) {
-            // workaround because jqXHR does not expose upload property
-            s.xhr = function() {
-                var xhr = jQuery.ajaxSettings.xhr();
-                if (xhr.upload) {
-                    xhr.upload.addEventListener('progress', function(event) {
-                        var percent = 0;
-                        var position = event.loaded || event.position; /*event.position is deprecated*/
-                        var total = event.total;
-                        if (event.lengthComputable) {
-                            percent = Math.ceil(position / total * 100);
-                        }
-                        options.uploadProgress(event, position, total, percent);
-                    }, false);
-                }
-                return xhr;
-            };
-        }
-
-        s.data = null;
-            var beforeSend = s.beforeSend;
-            s.beforeSend = function(xhr, o) {
-                o.data = formdata;
-                if(beforeSend)
-                    beforeSend.call(this, xhr, o);
-        };
-        return $.ajax(s);
-    }
-
-    // private function for handling file uploads (hat tip to YAHOO!)
-    function fileUploadIframe(a) {
-        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
-        var deferred = $.Deferred();
-
-        if (a) {
-            // ensure that every serialized input is still enabled
-            for (i=0; i < elements.length; i++) {
-                el = $(elements[i]);
-                if ( hasProp )
-                    el.prop('disabled', false);
-                else
-                    el.removeAttr('disabled');
-            }
-        }
-
-        s = $.extend(true, {}, $.ajaxSettings, options);
-        s.context = s.context || s;
-        id = 'jqFormIO' + (new Date().getTime());
-        if (s.iframeTarget) {
-            $io = $(s.iframeTarget);
-            n = $io.attr2('name');
-            if (!n)
-                 $io.attr2('name', id);
-            else
-                id = n;
-        }
-        else {
-            $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
-            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-        }
-        io = $io[0];
-
-
-        xhr = { // mock object
-            aborted: 0,
-            responseText: null,
-            responseXML: null,
-            status: 0,
-            statusText: 'n/a',
-            getAllResponseHeaders: function() {},
-            getResponseHeader: function() {},
-            setRequestHeader: function() {},
-            abort: function(status) {
-                var e = (status === 'timeout' ? 'timeout' : 'aborted');
-                log('aborting upload... ' + e);
-                this.aborted = 1;
-
-                try { // #214, #257
-                    if (io.contentWindow.document.execCommand) {
-                        io.contentWindow.document.execCommand('Stop');
-                    }
-                }
-                catch(ignore) {}
-
-                $io.attr('src', s.iframeSrc); // abort op in progress
-                xhr.error = e;
-                if (s.error)
-                    s.error.call(s.context, xhr, e, status);
-                if (g)
-                    $.event.trigger("ajaxError", [xhr, s, e]);
-                if (s.complete)
-                    s.complete.call(s.context, xhr, e);
-            }
-        };
-
-        g = s.global;
-        // trigger ajax global events so that activity/block indicators work like normal
-        if (g && 0 === $.active++) {
-            $.event.trigger("ajaxStart");
-        }
-        if (g) {
-            $.event.trigger("ajaxSend", [xhr, s]);
-        }
-
-        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
-            if (s.global) {
-                $.active--;
-            }
-            deferred.reject();
-            return deferred;
-        }
-        if (xhr.aborted) {
-            deferred.reject();
-            return deferred;
-        }
-
-        // add submitting element to data if we know it
-        sub = form.clk;
-        if (sub) {
-            n = sub.name;
-            if (n && !sub.disabled) {
-                s.extraData = s.extraData || {};
-                s.extraData[n] = sub.value;
-                if (sub.type == "image") {
-                    s.extraData[n+'.x'] = form.clk_x;
-                    s.extraData[n+'.y'] = form.clk_y;
-                }
-            }
-        }
-
-        var CLIENT_TIMEOUT_ABORT = 1;
-        var SERVER_ABORT = 2;
-                
-        function getDoc(frame) {
-            /* it looks like contentWindow or contentDocument do not
-             * carry the protocol property in ie8, when running under ssl
-             * frame.document is the only valid response document, since
-             * the protocol is know but not on the other two objects. strange?
-             * "Same origin policy" http://en.wikipedia.org/wiki/Same_origin_policy
-             */
-            
-            var doc = null;
-            
-            // IE8 cascading access check
-            try {
-                if (frame.contentWindow) {
-                    doc = frame.contentWindow.document;
-                }
-            } catch(err) {
-                // IE8 access denied under ssl & missing protocol
-                log('cannot get iframe.contentWindow document: ' + err);
-            }
-
-            if (doc) { // successful getting content
-                return doc;
-            }
-
-            try { // simply checking may throw in ie8 under ssl or mismatched protocol
-                doc = frame.contentDocument ? frame.contentDocument : frame.document;
-            } catch(err) {
-                // last attempt
-                log('cannot get iframe.contentDocument: ' + err);
-                doc = frame.document;
-            }
-            return doc;
-        }
-
-        // Rails CSRF hack (thanks to Yvan Barthelemy)
-        var csrf_token = $('meta[name=csrf-token]').attr('content');
-        var csrf_param = $('meta[name=csrf-param]').attr('content');
-        if (csrf_param && csrf_token) {
-            s.extraData = s.extraData || {};
-            s.extraData[csrf_param] = csrf_token;
-        }
-
-        // take a breath so that pending repaints get some cpu time before the upload starts
-        function doSubmit() {
-            // make sure form attrs are set
-            var t = $form.attr2('target'), a = $form.attr2('action');
-
-            // update form attrs in IE friendly way
-            form.setAttribute('target',id);
-            if (!method) {
-                form.setAttribute('method', 'POST');
-            }
-            if (a != s.url) {
-                form.setAttribute('action', s.url);
-            }
-
-            // ie borks in some cases when setting encoding
-            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
-                $form.attr({
-                    encoding: 'multipart/form-data',
-                    enctype:  'multipart/form-data'
-                });
-            }
-
-            // support timout
-            if (s.timeout) {
-                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
-            }
-
-            // look for server aborts
-            function checkState() {
-                try {
-                    var state = getDoc(io).readyState;
-                    log('state = ' + state);
-                    if (state && state.toLowerCase() == 'uninitialized')
-                        setTimeout(checkState,50);
-                }
-                catch(e) {
-                    log('Server abort: ' , e, ' (', e.name, ')');
-                    cb(SERVER_ABORT);
-                    if (timeoutHandle)
-                        clearTimeout(timeoutHandle);
-                    timeoutHandle = undefined;
-                }
-            }
-
-            // add "extra" data to form if provided in options
-            var extraInputs = [];
-            try {
-                if (s.extraData) {
-                    for (var n in s.extraData) {
-                        if (s.extraData.hasOwnProperty(n)) {
-                           // if using the $.param format that allows for multiple values with the same name
-                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
-                               extraInputs.push(
-                               $('<input type="hidden" name="'+s.extraData[n].name+'">').val(s.extraData[n].value)
-                                   .appendTo(form)[0]);
-                           } else {
-                               extraInputs.push(
-                               $('<input type="hidden" name="'+n+'">').val(s.extraData[n])
-                                   .appendTo(form)[0]);
-                           }
-                        }
-                    }
-                }
-
-                if (!s.iframeTarget) {
-                    // add iframe to doc and submit the form
-                    $io.appendTo('body');
-                    if (io.attachEvent)
-                        io.attachEvent('onload', cb);
-                    else
-                        io.addEventListener('load', cb, false);
-                }
-                setTimeout(checkState,15);
-
-                try {
-                    form.submit();
-                } catch(err) {
-                    // just in case form has element with name/id of 'submit'
-                    var submitFn = document.createElement('form').submit;
-                    submitFn.apply(form);
-                }
-            }
-            finally {
-                // reset attrs and remove "extra" input elements
-                form.setAttribute('action',a);
-                if(t) {
-                    form.setAttribute('target', t);
-                } else {
-                    $form.removeAttr('target');
-                }
-                $(extraInputs).remove();
-            }
-        }
-
-        if (s.forceSync) {
-            doSubmit();
-        }
-        else {
-            setTimeout(doSubmit, 10); // this lets dom updates render
-        }
-
-        var data, doc, domCheckCount = 50, callbackProcessed;
-
-        function cb(e) {
-            if (xhr.aborted || callbackProcessed) {
-                return;
-            }
-            
-            doc = getDoc(io);
-            if(!doc) {
-                log('cannot access response document');
-                e = SERVER_ABORT;
-            }
-            if (e === CLIENT_TIMEOUT_ABORT && xhr) {
-                xhr.abort('timeout');
-                deferred.reject(xhr, 'timeout');
-                return;
-            }
-            else if (e == SERVER_ABORT && xhr) {
-                xhr.abort('server abort');
-                deferred.reject(xhr, 'error', 'server abort');
-                return;
-            }
-
-            if (!doc || doc.location.href == s.iframeSrc) {
-                // response not received yet
-                if (!timedOut)
-                    return;
-            }
-            if (io.detachEvent)
-                io.detachEvent('onload', cb);
-            else
-                io.removeEventListener('load', cb, false);
-
-            var status = 'success', errMsg;
-            try {
-                if (timedOut) {
-                    throw 'timeout';
-                }
-
-                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
-                log('isXml='+isXml);
-                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
-                    if (--domCheckCount) {
-                        // in some browsers (Opera) the iframe DOM is not always traversable when
-                        // the onload callback fires, so we loop a bit to accommodate
-                        log('requeing onLoad callback, DOM not available');
-                        setTimeout(cb, 250);
-                        return;
-                    }
-                    // let this fall through because server response could be an empty document
-                    //log('Could not access iframe DOM after mutiple tries.');
-                    //throw 'DOMException: not available';
-                }
-
-                //log('response detected');
-                var docRoot = doc.body ? doc.body : doc.documentElement;
-                xhr.responseText = docRoot ? docRoot.innerHTML : null;
-                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-                if (isXml)
-                    s.dataType = 'xml';
-                xhr.getResponseHeader = function(header){
-                    var headers = {'content-type': s.dataType};
-                    return headers[header];
-                };
-                // support for XHR 'status' & 'statusText' emulation :
-                if (docRoot) {
-                    xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
-                    xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
-                }
-
-                var dt = (s.dataType || '').toLowerCase();
-                var scr = /(json|script|text)/.test(dt);
-                if (scr || s.textarea) {
-                    // see if user embedded response in textarea
-                    var ta = doc.getElementsByTagName('textarea')[0];
-                    if (ta) {
-                        xhr.responseText = ta.value;
-                        // support for XHR 'status' & 'statusText' emulation :
-                        xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
-                        xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
-                    }
-                    else if (scr) {
-                        // account for browsers injecting pre around json response
-                        var pre = doc.getElementsByTagName('pre')[0];
-                        var b = doc.getElementsByTagName('body')[0];
-                        if (pre) {
-                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
-                        }
-                        else if (b) {
-                            xhr.responseText = b.textContent ? b.textContent : b.innerText;
-                        }
-                    }
-                }
-                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
-                    xhr.responseXML = toXml(xhr.responseText);
-                }
-
-                try {
-                    data = httpData(xhr, dt, s);
-                }
-                catch (err) {
-                    status = 'parsererror';
-                    xhr.error = errMsg = (err || status);
-                }
-            }
-            catch (err) {
-                log('error caught: ',err);
-                status = 'error';
-                xhr.error = errMsg = (err || status);
-            }
-
-            if (xhr.aborted) {
-                log('upload aborted');
-                status = null;
-            }
-
-            if (xhr.status) { // we've set xhr.status
-                status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
-            }
-
-            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
-            if (status === 'success') {
-                if (s.success)
-                    s.success.call(s.context, data, 'success', xhr);
-                deferred.resolve(xhr.responseText, 'success', xhr);
-                if (g)
-                    $.event.trigger("ajaxSuccess", [xhr, s]);
-            }
-            else if (status) {
-                if (errMsg === undefined)
-                    errMsg = xhr.statusText;
-                if (s.error)
-                    s.error.call(s.context, xhr, status, errMsg);
-                deferred.reject(xhr, 'error', errMsg);
-                if (g)
-                    $.event.trigger("ajaxError", [xhr, s, errMsg]);
-            }
-
-            if (g)
-                $.event.trigger("ajaxComplete", [xhr, s]);
-
-            if (g && ! --$.active) {
-                $.event.trigger("ajaxStop");
-            }
-
-            if (s.complete)
-                s.complete.call(s.context, xhr, status);
-
-            callbackProcessed = true;
-            if (s.timeout)
-                clearTimeout(timeoutHandle);
-
-            // clean up
-            setTimeout(function() {
-                if (!s.iframeTarget)
-                    $io.remove();
-                xhr.responseXML = null;
-            }, 100);
-        }
-
-        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
-            if (window.ActiveXObject) {
-                doc = new ActiveXObject('Microsoft.XMLDOM');
-                doc.async = 'false';
-                doc.loadXML(s);
-            }
-            else {
-                doc = (new DOMParser()).parseFromString(s, 'text/xml');
-            }
-            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
-        };
-        var parseJSON = $.parseJSON || function(s) {
-            /*jslint evil:true */
-            return window['eval']('(' + s + ')');
-        };
-
-        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
-
-            var ct = xhr.getResponseHeader('content-type') || '',
-                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
-                data = xml ? xhr.responseXML : xhr.responseText;
-
-            if (xml && data.documentElement.nodeName === 'parsererror') {
-                if ($.error)
-                    $.error('parsererror');
-            }
-            if (s && s.dataFilter) {
-                data = s.dataFilter(data, type);
-            }
-            if (typeof data === 'string') {
-                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
-                    data = parseJSON(data);
-                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
-                    $.globalEval(data);
-                }
-            }
-            return data;
-        };
-
-        return deferred;
-    }
-};
-
-/**
- * ajaxForm() provides a mechanism for fully automating form submission.
- *
- * The advantages of using this method instead of ajaxSubmit() are:
- *
- * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *    is used to submit the form).
- * 2. This method will include the submit element's name/value data (for the element that was
- *    used to submit the form).
- * 3. This method binds the submit() method to the form for you.
- *
- * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
- * passes the options argument along after properly binding events for submit elements and
- * the form itself.
- */
-$.fn.ajaxForm = function(options) {
-    options = options || {};
-    options.delegation = options.delegation && $.isFunction($.fn.on);
-
-    // in jQuery 1.3+ we can fix mistakes with the ready state
-    if (!options.delegation && this.length === 0) {
-        var o = { s: this.selector, c: this.context };
-        if (!$.isReady && o.s) {
-            log('DOM not ready, queuing ajaxForm');
-            $(function() {
-                $(o.s,o.c).ajaxForm(options);
-            });
-            return this;
-        }
-        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-        return this;
-    }
-
-    if ( options.delegation ) {
-        $(document)
-            .off('submit.form-plugin', this.selector, doAjaxSubmit)
-            .off('click.form-plugin', this.selector, captureSubmittingElement)
-            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
-            .on('click.form-plugin', this.selector, options, captureSubmittingElement);
-        return this;
-    }
-
-    return this.ajaxFormUnbind()
-        .bind('submit.form-plugin', options, doAjaxSubmit)
-        .bind('click.form-plugin', options, captureSubmittingElement);
-};
-
-// private event handlers
-function doAjaxSubmit(e) {
-    /*jshint validthis:true */
-    var options = e.data;
-    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
-        e.preventDefault();
-        $(this).ajaxSubmit(options);
-    }
-}
-
-function captureSubmittingElement(e) {
-    /*jshint validthis:true */
-    var target = e.target;
-    var $el = $(target);
-    if (!($el.is("[type=submit],[type=image]"))) {
-        // is this a child element of the submit el?  (ex: a span within a button)
-        var t = $el.closest('[type=submit]');
-        if (t.length === 0) {
-            return;
-        }
-        target = t[0];
-    }
-    var form = this;
-    form.clk = target;
-    if (target.type == 'image') {
-        if (e.offsetX !== undefined) {
-            form.clk_x = e.offsetX;
-            form.clk_y = e.offsetY;
-        } else if (typeof $.fn.offset == 'function') {
-            var offset = $el.offset();
-            form.clk_x = e.pageX - offset.left;
-            form.clk_y = e.pageY - offset.top;
-        } else {
-            form.clk_x = e.pageX - target.offsetLeft;
-            form.clk_y = e.pageY - target.offsetTop;
-        }
-    }
-    // clear form vars
-    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
-}
-
-
-// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
-$.fn.ajaxFormUnbind = function() {
-    return this.unbind('submit.form-plugin click.form-plugin');
-};
-
-/**
- * formToArray() gathers form element data into an array of objects that can
- * be passed to any of the following ajax functions: $.get, $.post, or load.
- * Each object in the array has both a 'name' and 'value' property.  An example of
- * an array for a simple login form might be:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * It is this array that is passed to pre-submit callback functions provided to the
- * ajaxSubmit() and ajaxForm() methods.
- */
-$.fn.formToArray = function(semantic, elements) {
-    var a = [];
-    if (this.length === 0) {
-        return a;
-    }
-
-    var form = this[0];
-    var els = semantic ? form.getElementsByTagName('*') : form.elements;
-    if (!els) {
-        return a;
-    }
-
-    var i,j,n,v,el,max,jmax;
-    for(i=0, max=els.length; i < max; i++) {
-        el = els[i];
-        n = el.name;
-        if (!n || el.disabled) {
-            continue;
-        }
-
-        if (semantic && form.clk && el.type == "image") {
-            // handle image inputs on the fly when semantic == true
-            if(form.clk == el) {
-                a.push({name: n, value: $(el).val(), type: el.type });
-                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-            }
-            continue;
-        }
-
-        v = $.fieldValue(el, true);
-        if (v && v.constructor == Array) {
-            if (elements)
-                elements.push(el);
-            for(j=0, jmax=v.length; j < jmax; j++) {
-                a.push({name: n, value: v[j]});
-            }
-        }
-        else if (feature.fileapi && el.type == 'file') {
-            if (elements)
-                elements.push(el);
-            var files = el.files;
-            if (files.length) {
-                for (j=0; j < files.length; j++) {
-                    a.push({name: n, value: files[j], type: el.type});
-                }
-            }
-            else {
-                // #180
-                a.push({ name: n, value: '', type: el.type });
-            }
-        }
-        else if (v !== null && typeof v != 'undefined') {
-            if (elements)
-                elements.push(el);
-            a.push({name: n, value: v, type: el.type, required: el.required});
-        }
-    }
-
-    if (!semantic && form.clk) {
-        // input type=='image' are not found in elements array! handle it here
-        var $input = $(form.clk), input = $input[0];
-        n = input.name;
-        if (n && !input.disabled && input.type == 'image') {
-            a.push({name: n, value: $input.val()});
-            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-        }
-    }
-    return a;
-};
-
-/**
- * Serializes form data into a 'submittable' string. This method will return a string
- * in the format: name1=value1&amp;name2=value2
- */
-$.fn.formSerialize = function(semantic) {
-    //hand off to jQuery.param for proper encoding
-    return $.param(this.formToArray(semantic));
-};
-
-/**
- * Serializes all field elements in the jQuery object into a query string.
- * This method will return a string in the format: name1=value1&amp;name2=value2
- */
-$.fn.fieldSerialize = function(successful) {
-    var a = [];
-    this.each(function() {
-        var n = this.name;
-        if (!n) {
-            return;
-        }
-        var v = $.fieldValue(this, successful);
-        if (v && v.constructor == Array) {
-            for (var i=0,max=v.length; i < max; i++) {
-                a.push({name: n, value: v[i]});
-            }
-        }
-        else if (v !== null && typeof v != 'undefined') {
-            a.push({name: this.name, value: v});
-        }
-    });
-    //hand off to jQuery.param for proper encoding
-    return $.param(a);
-};
-
-/**
- * Returns the value(s) of the element in the matched set.  For example, consider the following form:
- *
- *  <form><fieldset>
- *      <input name="A" type="text" />
- *      <input name="A" type="text" />
- *      <input name="B" type="checkbox" value="B1" />
- *      <input name="B" type="checkbox" value="B2"/>
- *      <input name="C" type="radio" value="C1" />
- *      <input name="C" type="radio" value="C2" />
- *  </fieldset></form>
- *
- *  var v = $('input[type=text]').fieldValue();
- *  // if no values are entered into the text inputs
- *  v == ['','']
- *  // if values entered into the text inputs are 'foo' and 'bar'
- *  v == ['foo','bar']
- *
- *  var v = $('input[type=checkbox]').fieldValue();
- *  // if neither checkbox is checked
- *  v === undefined
- *  // if both checkboxes are checked
- *  v == ['B1', 'B2']
- *
- *  var v = $('input[type=radio]').fieldValue();
- *  // if neither radio is checked
- *  v === undefined
- *  // if first radio is checked
- *  v == ['C1']
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.  If this value is false the value(s)
- * for each element is returned.
- *
- * Note: This method *always* returns an array.  If no valid value can be determined the
- *    array will be empty, otherwise it will contain one or more values.
- */
-$.fn.fieldValue = function(successful) {
-    for (var val=[], i=0, max=this.length; i < max; i++) {
-        var el = this[i];
-        var v = $.fieldValue(el, successful);
-        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
-            continue;
-        }
-        if (v.constructor == Array)
-            $.merge(val, v);
-        else
-            val.push(v);
-    }
-    return val;
-};
-
-/**
- * Returns the value of the field element.
- */
-$.fieldValue = function(el, successful) {
-    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-    if (successful === undefined) {
-        successful = true;
-    }
-
-    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
-        (t == 'checkbox' || t == 'radio') && !el.checked ||
-        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-        tag == 'select' && el.selectedIndex == -1)) {
-            return null;
-    }
-
-    if (tag == 'select') {
-        var index = el.selectedIndex;
-        if (index < 0) {
-            return null;
-        }
-        var a = [], ops = el.options;
-        var one = (t == 'select-one');
-        var max = (one ? index+1 : ops.length);
-        for(var i=(one ? index : 0); i < max; i++) {
-            var op = ops[i];
-            if (op.selected) {
-                var v = op.value;
-                if (!v) { // extra pain for IE...
-                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
-                }
-                if (one) {
-                    return v;
-                }
-                a.push(v);
-            }
-        }
-        return a;
-    }
-    return $(el).val();
-};
-
-/**
- * Clears the form data.  Takes the following actions on the form's input fields:
- *  - input text fields will have their 'value' property set to the empty string
- *  - select elements will have their 'selectedIndex' property set to -1
- *  - checkbox and radio inputs will have their 'checked' property set to false
- *  - inputs of type submit, button, reset, and hidden will *not* be effected
- *  - button elements will *not* be effected
- */
-$.fn.clearForm = function(includeHidden) {
-    return this.each(function() {
-        $('input,select,textarea', this).clearFields(includeHidden);
-    });
-};
-
-/**
- * Clears the selected form elements.
- */
-$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
-    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
-    return this.each(function() {
-        var t = this.type, tag = this.tagName.toLowerCase();
-        if (re.test(t) || tag == 'textarea') {
-            this.value = '';
-        }
-        else if (t == 'checkbox' || t == 'radio') {
-            this.checked = false;
-        }
-        else if (tag == 'select') {
-            this.selectedIndex = -1;
-        }
-		else if (t == "file") {
-			if (/MSIE/.test(navigator.userAgent)) {
-				$(this).replaceWith($(this).clone(true));
-			} else {
-				$(this).val('');
-			}
-		}
-        else if (includeHidden) {
-            // includeHidden can be the value true, or it can be a selector string
-            // indicating a special test; for example:
-            //  $('#myForm').clearForm('.special:hidden')
-            // the above would clean hidden inputs that have the class of 'special'
-            if ( (includeHidden === true && /hidden/.test(t)) ||
-                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
-                this.value = '';
-        }
-    });
-};
-
-/**
- * Resets the form data.  Causes all form elements to be reset to their original value.
- */
-$.fn.resetForm = function() {
-    return this.each(function() {
-        // guard against an input with the name of 'reset'
-        // note that IE reports the reset function as an 'object'
-        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
-            this.reset();
-        }
-    });
-};
-
-/**
- * Enables or disables any matching elements.
- */
-$.fn.enable = function(b) {
-    if (b === undefined) {
-        b = true;
-    }
-    return this.each(function() {
-        this.disabled = !b;
-    });
-};
-
-/**
- * Checks/unchecks any matching checkboxes or radio buttons and
- * selects/deselects and matching option elements.
- */
-$.fn.selected = function(select) {
-    if (select === undefined) {
-        select = true;
-    }
-    return this.each(function() {
-        var t = this.type;
-        if (t == 'checkbox' || t == 'radio') {
-            this.checked = select;
-        }
-        else if (this.tagName.toLowerCase() == 'option') {
-            var $sel = $(this).parent('select');
-            if (select && $sel[0] && $sel[0].type == 'select-one') {
-                // deselect all other options
-                $sel.find('option').selected(false);
-            }
-            this.selected = select;
-        }
-    });
-};
-
-// expose debug var
-$.fn.ajaxSubmit.debug = false;
-
-// helper fn for console logging
-function log() {
-    if (!$.fn.ajaxSubmit.debug)
-        return;
-    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
-    if (window.console && window.console.log) {
-        window.console.log(msg);
-    }
-    else if (window.opera && window.opera.postError) {
-        window.opera.postError(msg);
-    }
-}
-
-})(jQuery);
diff --git a/gui/slick/js/lib/jquery.form.min.js b/gui/slick/js/lib/jquery.form.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7321a3b06c5f8c516e0f3a433a1229b952d6ca5e
Binary files /dev/null and b/gui/slick/js/lib/jquery.form.min.js differ
diff --git a/gui/slick/js/manageEpisodeStatuses.js b/gui/slick/js/manageEpisodeStatuses.js
deleted file mode 100644
index 74b148338d32cf28fd0317b39e5b3fc9955e6953..0000000000000000000000000000000000000000
--- a/gui/slick/js/manageEpisodeStatuses.js
+++ /dev/null
@@ -1,4 +0,0 @@
-$(document).ready(function() {
-
-
-});
diff --git a/gui/slick/js/manageSubtitleMissed.js b/gui/slick/js/manageSubtitleMissed.js
deleted file mode 100644
index 2f6d65c2b74364ddb304ebfe3ac94c45c58c2b9c..0000000000000000000000000000000000000000
--- a/gui/slick/js/manageSubtitleMissed.js
+++ /dev/null
@@ -1,72 +0,0 @@
-$(document).ready(function() {
-
-    function makeRow(indexerId, season, episode, name, subtitles, checked) {
-        checked = checked ? ' checked' : '';
-
-        var row = '';
-        row += ' <tr class="good show-' + indexerId + '">';
-        row += '  <td align="center"><input type="checkbox" class="'+indexerId+'-epcheck" name="'+indexerId+'-'+season+'x'+episode+'"'+checked+'></td>';
-        row += '  <td style="width: 1%;">'+season+'x'+episode+'</td>';
-        row += '  <td>'+name+'</td>';
-        row += ' </tr>';
-
-        return row;
-    }
-
-    $('.allCheck').click(function(){
-        var indexerId = $(this).attr('id').split('-')[1];
-        $('.'+indexerId+'-epcheck').prop('checked', $(this).prop('checked'));
-    });
-
-    $('.get_more_eps').click(function(){
-        var indexerId = $(this).attr('id');
-        var checked = $('#allCheck-'+indexerId).prop('checked');
-        var lastRow = $('tr#'+indexerId);
-        var clicked = $(this).attr('data-clicked');
-        var action = $(this).attr('value');
-
-        if (!clicked) {
-            $.getJSON(srRoot + '/manage/showSubtitleMissed', {
-                indexer_id: indexerId, // jshint ignore:line
-                whichSubs: $('#selectSubLang').val()
-            }, function(data) {
-                $.each(data, function(season, eps) {
-                    $.each(eps, function(episode, data) {
-                        //alert(season+'x'+episode+': '+name);
-                        lastRow.after(makeRow(indexerId, season, episode, data.name, data.subtitles, checked));
-                    });
-                });
-            });
-            $(this).attr('data-clicked', 1);
-            $(this).prop('value', 'Collapse');
-        } else {
-            if (action === 'Collapse') {
-                $('table tr').filter('.show-' + indexerId).hide();
-                $(this).prop('value', 'Expand');
-            } else if (action === 'Expand') {
-                $('table tr').filter('.show-' + indexerId).show();
-                $(this).prop('value', 'Collapse');
-            }
-        }
-    });
-
-    // selects all visible episode checkboxes.
-    $('.selectAllShows').click(function(){
-        $('.allCheck').each(function(){
-                this.checked = true;
-        });
-        $('input[class*="-epcheck"]').each(function(){
-                this.checked = true;
-        });
-    });
-
-    // clears all visible episode checkboxes and the season selectors
-    $('.unselectAllShows').click(function(){
-        $('.allCheck').each(function(){
-                this.checked = false;
-        });
-        $('input[class*="-epcheck"]').each(function(){
-                this.checked = false;
-        });
-    });
-});
diff --git a/gui/slick/js/massUpdate.js b/gui/slick/js/massUpdate.js
index b539e1ef6d66f65cc6d77b6359badf075e799269..032c9256f367d4121c8bf4a389b5333ed7040b9b 100644
--- a/gui/slick/js/massUpdate.js
+++ b/gui/slick/js/massUpdate.js
@@ -74,7 +74,7 @@ $(document).ready(function(){
         });
     });
 
-  ['.editCheck', '.updateCheck', '.refreshCheck', '.renameCheck', '.deleteCheck', '.removeCheck'].forEach(function(name) {
+    ['.editCheck', '.updateCheck', '.refreshCheck', '.renameCheck', '.deleteCheck', '.removeCheck'].forEach(function(name) {
         var lastCheck = null;
 
         $(name).on('click', function(event) {
@@ -89,8 +89,7 @@ $(document).ready(function(){
             $(name).each(function() {
                 switch (found) {
                     case 2: return false;
-                    case 1:
-                    if(!this.disabled) { this.checked = lastCheck.checked; }
+                    case 1: if(!this.disabled) { this.checked = lastCheck.checked; }
                 }
                 if(this === check || this === lastCheck) { found++; }
             });
diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js
deleted file mode 100644
index dc83839e81d842a9384c5050a03c2750f57d8cbe..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/displayShow.js
+++ /dev/null
@@ -1,278 +0,0 @@
-$(document).ready(function(){
-
-    $('#srRoot').ajaxEpSearch({'colorRow': true});
-
-    $('#srRoot').ajaxEpSubtitlesSearch();
-
-    $('#seasonJump').on('change', function(){
-        var id = $('#seasonJump option:selected').val();
-        if (id && id !== 'jump') {
-            var season = $('#seasonJump option:selected').data('season');
-            $('html,body').animate({scrollTop: $('[name ="' + id.substring(1) + '"]').offset().top - 50}, 'slow');
-            $('#collapseSeason-' + season).collapse('show');
-            location.hash = id;
-        }
-        $(this).val('jump');
-    });
-
-    $("#prevShow").on('click', function(){
-        $('#pickShow option:selected').prev('option').prop('selected', 'selected');
-        $("#pickShow").change();
-    });
-
-    $("#nextShow").on('click', function(){
-        $('#pickShow option:selected').next('option').prop('selected', 'selected');
-        $("#pickShow").change();
-    });
-
-    $('#changeStatus').on('click', function(){
-        var srRoot = $('#srRoot').val();
-        var epArr = [];
-
-        $('.epCheck').each(function () {
-            if (this.checked === true) {
-                epArr.push($(this).attr('id'));
-            }
-        });
-
-        if (epArr.length === 0) { return false; }
-
-        window.location.href = srRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val();
-    });
-
-    $('.seasonCheck').on('click', function(){
-        var seasCheck = this;
-        var seasNo = $(seasCheck).attr('id');
-
-        $('#collapseSeason-' + seasNo).collapse('show');
-        $('.epCheck:visible').each(function () {
-            var epParts = $(this).attr('id').split('x');
-            if (epParts[0] === seasNo) {
-                this.checked = seasCheck.checked;
-            }
-        });
-    });
-
-    var lastCheck = null;
-    $('.epCheck').on('click', function (event) {
-
-        if (!lastCheck || !event.shiftKey) {
-            lastCheck = this;
-            return;
-        }
-
-        var check = this;
-        var found = 0;
-
-        $('.epCheck').each(function() {
-            switch (found) {
-                case 2:
-                    return false;
-                case 1:
-                    this.checked = lastCheck.checked;
-            }
-
-            if (this === check || this === lastCheck) {
-                found++;
-            }
-        });
-    });
-
-    // selects all visible episode checkboxes.
-    $('.seriesCheck').on('click', function () {
-        $('.epCheck:visible').each(function () {
-            this.checked = true;
-        });
-        $('.seasonCheck:visible').each(function () {
-            this.checked = true;
-        });
-    });
-
-    // clears all visible episode checkboxes and the season selectors
-    $('.clearAll').on('click', function () {
-        $('.epCheck:visible').each(function () {
-            this.checked = false;
-        });
-        $('.seasonCheck:visible').each(function () {
-            this.checked = false;
-        });
-    });
-
-    // handle the show selection dropbox
-    $('#pickShow').on('change', function () {
-        var srRoot = $('#srRoot').val();
-        var val = $(this).val();
-        if (val === 0) {
-            return;
-        }
-        window.location.href = srRoot + '/home/displayShow?show=' + val;
-    });
-
-    // show/hide different types of rows when the checkboxes are changed
-    $("#checkboxControls input").change(function () {
-        var whichClass = $(this).attr('id');
-        $(this).showHideRows(whichClass);
-    });
-
-    // initially show/hide all the rows according to the checkboxes
-    $("#checkboxControls input").each(function() {
-        var status = $(this).prop('checked');
-        $("tr." + $(this).attr('id')).each(function() {
-            if(status) {
-                $(this).show();
-            } else {
-                $(this).hide();
-            }
-        });
-    });
-
-    $.fn.showHideRows = function(whichClass) {
-        var status = $('#checkboxControls > input, #' + whichClass).prop('checked');
-        $("tr." + whichClass).each(function() {
-            if (status) {
-                $(this).show();
-            } else {
-                $(this).hide();
-            }
-        });
-
-        // hide season headers with no episodes under them
-        $('tr.seasonheader').each(function () {
-            var numRows = 0;
-            var seasonNo = $(this).attr('id');
-            $('tr.' + seasonNo + ' :visible').each(function () {
-                numRows++;
-            });
-            if (numRows === 0) {
-                $(this).hide();
-                $('#' + seasonNo + '-cols').hide();
-            } else {
-                $(this).show();
-                $('#' + seasonNo + '-cols').show();
-            }
-        });
-    };
-
-    function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {
-        var srRoot = $('#srRoot').val();
-        var showId = $('#showID').val();
-        var indexer = $('#indexer').val();
-
-        if (sceneSeason === '') { sceneSeason = null; }
-        if (sceneEpisode === '') { sceneEpisode = null; }
-
-        $.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 srRoot = $('#srRoot').val();
-        var showId = $('#showID').val();
-        var indexer = $('#indexer').val();
-
-        if (sceneAbsolute === '') { sceneAbsolute = null; }
-
-        $.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').on('change', function() {
-        //	Strip non-numeric characters
-        $(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
-        var forSeason = $(this).attr('data-for-season');
-        var forEpisode = $(this).attr('data-for-episode');
-        var m = $(this).val().match(/^(\d+)x(\d+)$/i);
-        var sceneSeason = null, sceneEpisode = null;
-        if (m) {
-            sceneSeason = m[1];
-            sceneEpisode = m[2];
-        }
-        setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);
-    });
-
-    $('.sceneAbsolute').on('change', function() {
-        //	Strip non-numeric characters
-        $(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
-        var forAbsolute = $(this).attr('data-for-absolute');
-
-        var m = $(this).val().match(/^(\d{1,3})$/i);
-        var sceneAbsolute = null;
-        if (m) {
-            sceneAbsolute = m[1];
-        }
-        setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute);
-    });
-
-    $('.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, // jshint ignore:line
-            columnSelector_layout : '<br><label><input type="checkbox">{name}</label>', // jshint ignore:line
-            columnSelector_mediaquery: false, // jshint ignore:line
-            columnSelector_cssChecked : 'checked' // jshint ignore:line
-        }
-    });
-
-    $('#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/history.js b/gui/slick/js/new/history.js
deleted file mode 100644
index d4a666bcfa6d8018166fe4efcefdcb28bc50c28a..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/history.js
+++ /dev/null
@@ -1,40 +0,0 @@
-$(document).ready(function(){
-    $("#historyTable:has(tbody tr)").tablesorter({
-        widgets: ['zebra', 'filter'],
-        sortList: [[0,1]],
-        textExtraction: (function(){
-            if(isMeta('sickbeard.HISTORY_LAYOUT', ['detailed'])){
-                return {
-                    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('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(isMeta('sickbeard.HISTORY_LAYOUT', ['detailed'])){
-                return {
-                    0: { sorter: 'realISODate' },
-                    4: { sorter: 'quality' }
-                };
-            } else {
-                return {
-                    0: { sorter: 'realISODate' },
-                    4: { sorter: false },
-                    5: { sorter: 'quality' }
-                };
-            }
-        }())
-    });
-
-    $('#history_limit').on('change', function() {
-        var url = srRoot + '/history/?limit=' + $(this).val();
-        window.location.href = url;
-    });
-});
diff --git a/gui/slick/js/new/home.js b/gui/slick/js/new/home.js
deleted file mode 100644
index 1df0a5edb2e506fc43b6603010f9049499b6a367..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/home.js
+++ /dev/null
@@ -1,195 +0,0 @@
-$(document).ready(function(){
-    // Resets the tables sorting, needed as we only use a single call for both tables in tablesorter
-    $('.resetsorting').on('click', function(){
-        $('table').trigger('filterReset');
-    });
-
-    // This needs to be refined to work a little faster.
-    $('.progressbar').each(function(progressbar){
-        var showId = $(this).data('show-id');
-        var percentage = $(this).data('progress-percentage');
-        var classToAdd = percentage === 100 ? 100 : percentage > 80 ? 80 : percentage > 60 ? 60 : percentage > 40 ? 40 : 20;
-        $(this).progressbar({ value:  percentage });
-        if($(this).data('progress-text')) {
-            $(this).append('<div class="progressbarText" title="' + $(this).data('progress-tip') + '">' + $(this).data('progress-text') + '</div>');
-        }
-        $(this).find('.ui-progressbar-value').addClass('progress-' + classToAdd);
-    });
-
-    $("img#network").on('error', function(){
-        $(this).parent().text($(this).attr('alt'));
-        $(this).remove();
-    });
-
-    $("#showListTableShows:has(tbody tr), #showListTableAnime:has(tbody tr)").tablesorter({
-        sortList: [[7,1],[2,0]],
-        textExtraction: {
-            0: function(node) { return $(node).find('time').attr('datetime'); },
-            1: function(node) { return $(node).find('time').attr('datetime'); },
-            3: function(node) { return $(node).find("span").prop("title").toLowerCase(); },
-            4: function(node) { return $(node).find("span").text().toLowerCase(); },
-            5: function(node) { return $(node).find("span:first").text(); },
-            6: function(node) { return $(node).find("img").attr("alt"); }
-        },
-        widgets: ['saveSort', 'zebra', 'stickyHeaders', 'filter', 'columnSelector'],
-        headers: (function(){
-            if(metaToBool('sickbeard.FILTER_ROW')){
-                return {
-                    0: { sorter: 'realISODate' },
-                    1: { sorter: 'realISODate' },
-                    2: { sorter: 'loadingNames' },
-                    4: { sorter: 'quality' },
-                    5: { sorter: 'eps' },
-                    6: { filter : 'parsed' }
-                };
-            } else {
-                return {
-                    0: { sorter: 'realISODate' },
-                    1: { sorter: 'realISODate' },
-                    2: { sorter: 'loadingNames' },
-                    4: { sorter: 'quality' },
-                    5: { sorter: 'eps' }
-                };
-            }
-        }()),
-        widgetOptions: (function(){
-            if(metaToBool('sickbeard.FILTER_ROW')){
-                return {
-                    filter_columnFilters: true, // jshint ignore:line
-                    filter_hideFilters : true, // jshint ignore:line
-                    filter_saveFilters : true, // jshint ignore:line
-                    filter_functions : { // jshint ignore:line
-                       5:function(e, n, f, i, r, c) {
-                            var test = false;
-                            var pct = Math.floor((n % 1) * 1000);
-                            if (f === '') {
-                               test = true;
-                            } else {
-                                var result = f.match(/(<|<=|>=|>)\s(\d+)/i);
-                                if (result) {
-                                    if (result[1] === "<") {
-                                        if (pct < parseInt(result[2])) {
-                                            test = true;
-                                        }
-                                    } else if (result[1] === "<=") {
-                                        if (pct <= parseInt(result[2])) {
-                                            test = true;
-                                        }
-                                    } else if (result[1] === ">=") {
-                                        if (pct >= parseInt(result[2])) {
-                                            test = true;
-                                        }
-                                    } else if (result[1] === ">") {
-                                        if (pct > parseInt(result[2])) {
-                                            test = true;
-                                        }
-                                    }
-                                }
-
-                                result = f.match(/(\d+)\s(-|to)\s(\d+)/i);
-                                if (result) {
-                                    if ((result[2] === "-") || (result[2] === "to")) {
-                                        if ((pct >= parseInt(result[1])) && (pct <= parseInt(result[3]))) {
-                                            test = true;
-                                        }
-                                    }
-                                }
-
-                                result = f.match(/(=)?\s?(\d+)\s?(=)?/i);
-                                if (result) {
-                                    if ((result[1] === "=") || (result[3] === "=")) {
-                                        if (parseInt(result[2]) === pct) {
-                                            test = true;
-                                        }
-                                    }
-                                }
-
-                                if (!isNaN(parseFloat(f)) && isFinite(f)) {
-                                    if (parseInt(f) === pct) {
-                                        test = true;
-                                    }
-                                }
-                            }
-                            return test;
-                        }
-                    },
-                    columnSelector_mediaquery: false
-                };
-            } else {
-                return {
-                    filter_columnFilters: false
-                };
-            }
-        }()),
-        sortStable: true,
-        sortAppend: [[2,0]]
-    });
-
-    if ($("#showListTableShows").find("tbody").find("tr").size() > 0){
-        $.tablesorter.filter.bindSearch( "#showListTableShows", $('.search') );
-    }
-
-    if(metaToBool('sickbeard.ANIME_SPLIT_HOME')){
-        if($("#showListTableAnime").find("tbody").find("tr").size() > 0){
-            $.tablesorter.filter.bindSearch( "#showListTableAnime", $('.search') );
-        }
-    }
-
-    var $container = [$('#container'), $('#container-anime')];
-
-    $.each($container, function (j){
-        this.isotope({
-            itemSelector: '.show',
-            sortBy : getMeta('sickbeard.POSTER_SORTBY'),
-            sortAscending: getMeta('sickbeard.POSTER_SORTDIR'),
-            layoutMode: 'masonry',
-            masonry: {
-                columnWidth: 13,
-                isFitWidth: true
-            },
-            getSortData: {
-                name: function(itemElem){
-                    var name = $(itemElem).attr('data-name');
-                    return (metaToBool('sickbeard.SORT_ARTICLE') ? (name || '') : (name || '').replace(/^(The|A|An)\s/i,''));
-                },
-                network: '[data-network]',
-                date: function(itemElem){
-                    var date = $(itemElem).attr('data-date');
-                    return date.length && parseInt(date, 10) || Number.POSITIVE_INFINITY;
-                },
-                progress: function(itemElem){
-                    var progress = $(itemElem).attr('data-progress');
-                    return progress.length && parseInt(progress, 10) || Number.NEGATIVE_INFINITY;
-                }
-            }
-        });
-    });
-
-    $('#postersort').on('change', function(){
-        var sortValue = this.value;
-        $('#container').isotope({sortBy: sortValue});
-        $('#container-anime').isotope({sortBy: sortValue});
-        $.get(this.options[this.selectedIndex].getAttribute('data-sort'));
-    });
-
-    $('#postersortdirection').on('change', function(){
-        var sortDirection = this.value;
-        sortDirection = sortDirection == 'true';
-        $('#container').isotope({sortAscending: sortDirection});
-        $('#container-anime').isotope({sortAscending: sortDirection});
-        $.get(this.options[this.selectedIndex].getAttribute('data-sort'));
-    });
-
-    $('#popover').popover({
-        placement: 'bottom',
-        html: true, // required if content has HTML
-        content: '<div id="popover-target"></div>'
-    }).on('shown.bs.popover', function () { // bootstrap popover event triggered when the popover opens
-        // call this function to copy the column selection code into the popover
-        $.tablesorter.columnSelector.attachTo( $('#showListTableShows'), '#popover-target');
-        if(metaToBool('sickbeard.ANIME_SPLIT_HOME')){
-            $.tablesorter.columnSelector.attachTo( $('#showListTableAnime'), '#popover-target');
-        }
-
-    });
-});
diff --git a/gui/slick/js/new/home_postprocess.js b/gui/slick/js/new/home_postprocess.js
deleted file mode 100644
index 1449181d942143c4692485c5e009fc37d57a2b28..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/home_postprocess.js
+++ /dev/null
@@ -1 +0,0 @@
-$('#episodeDir').fileBrowser({ title: 'Select Unprocessed Episode Folder', key: 'postprocessPath' });
diff --git a/gui/slick/js/new/manage.js b/gui/slick/js/new/manage.js
deleted file mode 100644
index b8ac98a50fce09876c400f10b515d03bd9cbfc20..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/manage.js
+++ /dev/null
@@ -1,2 +0,0 @@
-$(document).ready(function(){
-    });
diff --git a/gui/slick/js/new/manage_backlogOverview.js b/gui/slick/js/new/manage_backlogOverview.js
deleted file mode 100644
index 38637c688885a101f0267ee66b3cfe8b4442465d..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/manage_backlogOverview.js
+++ /dev/null
@@ -1,3 +0,0 @@
-$(document).ready(function(){
-    
-});
diff --git a/gui/slick/js/new/manage_failedDownloads.js b/gui/slick/js/new/manage_failedDownloads.js
deleted file mode 100644
index 38637c688885a101f0267ee66b3cfe8b4442465d..0000000000000000000000000000000000000000
--- a/gui/slick/js/new/manage_failedDownloads.js
+++ /dev/null
@@ -1,3 +0,0 @@
-$(document).ready(function(){
-    
-});
diff --git a/gui/slick/js/new/manage_massEdit.js b/gui/slick/js/new/manage_massEdit.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/gui/slick/js/qualityChooser.js b/gui/slick/js/qualityChooser.js
index 7242113d7aa3fdd11db73b9799d63321c9c03571..fe2880be8956acdeea6fc6cd00c6882bfea26bd9 100644
--- a/gui/slick/js/qualityChooser.js
+++ b/gui/slick/js/qualityChooser.js
@@ -7,8 +7,8 @@ $(document).ready(function() {
             $('#customQuality').hide();
         }
 
-        $('#anyQualities option').each(function(i) {
-            var result = preset & $(this).val(); // I have no clue what the & does here
+        $('#anyQualities option').each(function() {
+            var result = preset & $(this).val(); // @TODO Find out what this does
             if (result > 0) {
                 $(this).attr('selected', 'selected');
             } else {
@@ -16,8 +16,8 @@ $(document).ready(function() {
             }
         });
 
-        $('#bestQualities option').each(function(i) {
-            var result = preset & ($(this).val() << 16); // I have no clue what the & does here
+        $('#bestQualities option').each(function() {
+            var result = preset & ($(this).val() << 16); // @TODO Find out what this does
             if (result > 0) {
                 $(this).attr('selected', 'selected');
             } else {
diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js
index f51c67b86a5d42a140cb015e800b9ba8c32d1df3..645e5019f2ede8b75b25b3bcc2c9e27e183e70d0 100644
--- a/gui/slick/js/restart.js
+++ b/gui/slick/js/restart.js
@@ -49,13 +49,13 @@ $(document).ready(function() {
         });
     }
 
-    function ajaxError(x, e) {
+    function ajaxError(x) {
         if (console_debug) { // jshint ignore:line
             if (x.status === 0) {
                 console.log(console_prefix + 'isAlive: Sickrage is not responding.');
-            } else if (x.status == 404) {
+            } else if (x.status === 404) {
                 console.log(console_prefix + 'isAlive: Requested URL not found.');
-            } else if (x.status == 500) {
+            } else if (x.status === 500) {
                 console.log(console_prefix + 'isAlive: Internel Server Error.');
             }  else {
                 console.log(console_prefix + 'isAlive: Unknow Error.\n' + x.responseText);
diff --git a/gui/slick/js/vender.min.js b/gui/slick/js/vender.min.js
index 183aaff7e388bfb2a7c84d7927c2a2dd9d0f255f..b7dc4f9eb8b4ddfc8589f789c0bf2878517c747c 100644
Binary files a/gui/slick/js/vender.min.js and b/gui/slick/js/vender.min.js differ
diff --git a/gui/slick/views/IRC.mako b/gui/slick/views/IRC.mako
index 5d4cd6230b659f8a6211f6f6423e973dfb678b54..13a40727a610030670d99801395e3ecf1dda2f18 100644
--- a/gui/slick/views/IRC.mako
+++ b/gui/slick/views/IRC.mako
@@ -4,5 +4,5 @@
 from sickbeard import GIT_USERNAME
 username = ("SickRageUI|?", GIT_USERNAME)[bool(GIT_USERNAME)]
 %>
-<iframe id="extFrame" src="https://kiwiirc.com/client/irc.freenode.net/?nick=${username}&theme=basic#sickrage" width="100%" height="500" frameBorder="0" style="border: 1px black solid;"></iframe>
+<iframe id="extFrame" src="https://kiwiirc.com/client/irc.freenode.net/?nick=${username}&theme=basic#sickrage-issues" width="100%" height="500" frameBorder="0" style="border: 1px black solid;"></iframe>
 </%block>
diff --git a/gui/slick/views/apiBuilder.mako b/gui/slick/views/apiBuilder.mako
index 9e9f88e8769d8881cf252c8e5ee51069a3eef30d..fe48e74a997a0b8dc61679a6495136f39a2452a6 100644
--- a/gui/slick/views/apiBuilder.mako
+++ b/gui/slick/views/apiBuilder.mako
@@ -185,9 +185,9 @@
 var commands = ${sorted(commands)};
 var episodes = ${episodes};
 </script>
-<script type="text/javascript" src="${srRoot}/js/_bower.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/vender.min.js?${sbPID}"></script>
 <script type="text/javascript" src="${srRoot}/js/new/meta.js?${sbPID}"></script>
-<script type="text/javascript" src="${srRoot}/js/new/core.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/core.min.js?${sbPID}"></script>
 <script type="text/javascript" src="${srRoot}/js/apibuilder.js?${sbPID}"></script>
 </body>
 </html>
diff --git a/gui/slick/views/config.mako b/gui/slick/views/config.mako
index cc0aee2b52f75a3a0658511ebf773fc67bdc6e4d..fcd02b46c0e72ca07844a0051a54348828a57c29 100644
--- a/gui/slick/views/config.mako
+++ b/gui/slick/views/config.mako
@@ -67,7 +67,7 @@
     <tr><td class="infoTableHeader"><i class="icon16-WiKi"></i> WiKi</td><td class="infoTableCell"><a href="${anon_url('https://github.com/SickRage/sickrage-issues/wiki')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">https://github.com/SickRage/sickrage-issues/wiki</a></td></tr>
     <tr><td class="infoTableHeader"><i class="icon16-web"></i> Forums</td><td class="infoTableCell"><a href="${anon_url('http://sickrage.tv/forums/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">http://sickrage.tv/forums/</a></td></tr>
     <tr><td class="infoTableHeader"><i class="icon16-github"></i> Source</td><td class="infoTableCell"><a href="${anon_url('https://github.com/SickRage/SickRage/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">https://github.com/SickRage/SickRage/</a></td></tr>
-    <tr><td class="infoTableHeader"><i class="icon16-mirc"></i> IRChat</td><td class="infoTableCell"><a href="irc://irc.freenode.net/#sickrage" rel="noreferrer"><i>#sickrage</i> on <i>irc.freenode.net</i></a></td></tr>
+    <tr><td class="infoTableHeader"><i class="icon16-mirc"></i> IRChat</td><td class="infoTableCell"><a href="irc://irc.freenode.net/#sickrage-issues" rel="noreferrer"><i>#sickrage-issues</i> on <i>irc.freenode.net</i></a></td></tr>
 </table>
 </div>
 </%block>
diff --git a/gui/slick/views/config_backuprestore.mako b/gui/slick/views/config_backuprestore.mako
index 1e2365b9d2265e8de0692d42d4963827887ed93c..a93bcc664cadbbb9f38bfb3dd0bd9e8b4f101a8a 100644
--- a/gui/slick/views/config_backuprestore.mako
+++ b/gui/slick/views/config_backuprestore.mako
@@ -10,10 +10,6 @@
     from sickbeard import metadata
     from sickbeard.metadata.generic import GenericMetadata
 %>
-<%block name="scripts">
-<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:
     <h1 class="header">${header}</h1>
diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako
index e669c11d0322f803dc874eca2a795b1f70222261..9fd8161b2d9c0dd06a7757580ae4be07992ceae9 100644
--- a/gui/slick/views/config_postProcessing.mako
+++ b/gui/slick/views/config_postProcessing.mako
@@ -1036,14 +1036,11 @@
 
                         </div><!-- /naming_anime_different -->
 
-                        <div></div>
                         <input type="submit" class="btn config_submitter" value="Save Changes" /><br>
-
                     </fieldset>
                 </div><!-- /component-group2 //-->
 
                 <div id="core-component-group3" class="component-group">
-
                     <div class="component-group-desc">
                         <h3>Metadata</h3>
                         <p>The data associated to the data. These are files associated to a TV show in the form of images and text that, when supported, will enhance the viewing experience.</p>
diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako
index a8259e69cfbe3e37b47aef928718fa30770e9817..ca7ccfbb831e6373d72dcaac255ed00a728be03f 100644
--- a/gui/slick/views/config_providers.mako
+++ b/gui/slick/views/config_providers.mako
@@ -6,7 +6,7 @@
     from sickbeard.helpers import anon_url
 %>
 <%block name="scripts">
-<script type="text/javascript" src="/js/ConfigProviders.js"></script>
+<script type="text/javascript" src="${srRoot}/js/configProviders.js"></script>
 <script type="text/javascript">
 $(document).ready(function(){
     % if sickbeard.USE_NZBS:
diff --git a/gui/slick/views/config_search.mako b/gui/slick/views/config_search.mako
index 3560645ce19e606e6dbd6259173fd474ccd0e395..8bc218adac83a4d0d6d9fbe3039bb56fdd85ca5e 100644
--- a/gui/slick/views/config_search.mako
+++ b/gui/slick/views/config_search.mako
@@ -3,11 +3,6 @@
     import sickbeard
     from sickbeard import clients
 %>
-<%block name="scripts">
-<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:
     <h1 class="header">${header}</h1>
@@ -17,9 +12,7 @@
 
 <div id="config">
     <div id="config-content">
-
         <form id="configForm" action="saveSearch" method="post">
-
             <div id="config-components">
                 <ul>
                     <li><a href="#core-component-group1">Episode Search</a></li>
@@ -27,9 +20,7 @@
                     <li><a href="#core-component-group3">Torrent Search</a></li>
                 </ul>
 
-
                 <div id="core-component-group1" class="component-group">
-
                     <div class="component-group-desc">
                         <h3>Episode Search</h3>
                         <p>How to manage searching with <a href="${srRoot}/config/providers">providers</a>.</p>
@@ -428,16 +419,13 @@
                 </div><!-- /component-group2 //-->
 
                 <div id="core-component-group3" class="component-group">
-
                     <div class="component-group-desc">
                         <h3>Torrent Search</h3>
                         <p>How to handle Torrent search results.</p>
                     </div>
 
                     <fieldset class="component-group-list">
-
                         <div class="field-pair">
-
                             <label for="use_torrents">
                                 <span class="component-title">Search torrents</span>
                                 <span class="component-desc">
@@ -447,175 +435,175 @@
                             </label>
                         </div>
 
-                    <div id="content_use_torrents">
-                        <div class="field-pair">
-                            <label for="torrent_method">
-                                <span class="component-title">Send .torrent files to:</span>
-                                <span class="component-desc">
-                                <select name="torrent_method" id="torrent_method" class="form-control input-sm">
-<% torrent_method_text = {'blackhole': "Black hole", 'utorrent': "uTorrent", 'transmission': "Transmission", 'deluge': "Deluge (via WebUI)", 'deluged': "Deluge (via Daemon)", 'download_station': "Synology DS", 'rtorrent': "rTorrent", 'qbittorrent': "qbittorrent", 'mlnet': "MLDonkey"} %>
-% for curAction in ('blackhole', 'utorrent', 'transmission', 'deluge', 'deluged', 'download_station', 'rtorrent', 'qbittorrent', 'mlnet'):
-                                <option value="${curAction}" ${('', 'selected="selected"')[sickbeard.TORRENT_METHOD == curAction]}>${torrent_method_text[curAction]}</option>
-% endfor
-                                </select>
-                            </label>
-
-                        <div id="options_torrent_blackhole">
+                        <div id="content_use_torrents">
                             <div class="field-pair">
-                                <label>
-                                    <span class="component-title">Black hole folder location</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_dir" id="torrent_dir" value="${sickbeard.TORRENT_DIR}" class="form-control input-sm input350" />
-                                        <div class="clear-left"><p><b>.torrent</b> files are stored at this location for external software to find and use</p></div>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div></div>
-                            <input type="submit" class="btn config_submitter" value="Save Changes" /><br>
-                            </div>
-                        </div>
-
-                        <div id="options_torrent_clients">
-                            <div class="field-pair">
-                                <label>
-                                    <span class="component-title" id="host_title">Torrent host:port</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_host" id="torrent_host" value="${sickbeard.TORRENT_HOST}" class="form-control input-sm input350" />
-                                        <div class="clear-left">
-                                            <p id="host_desc_torrent">URL to your torrent client (e.g. http://localhost:8000/)</p>
-                                        </div>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_rpcurl_option">
-                                <label>
-                                    <span class="component-title" id="rpcurl_title">Torrent RPC URL</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_rpcurl" id="torrent_rpcurl" value="${sickbeard.TORRENT_RPCURL}" class="form-control input-sm input350"/>
-                                        <div class="clear-left">
-                                            <p id="rpcurl_desc_">The path without leading and trailing slashes (e.g. transmission)</p>
-                                        </div>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_auth_type_option">
-                                <label>
-                                    <span class="component-title">Http Authentication</span>
-                                    <span class="component-desc">
-                                        <select name="torrent_auth_type" id="torrent_auth_type" class="form-control input-sm">
-                                        <% http_authtype = {'none': "None", 'basic': "Basic", 'digest': "Digest"} %>
-                                        % for authvalue, authname in http_authtype.iteritems():
-                                            <option id="torrent_auth_type_value" value="${authvalue}" ${('', 'selected="selected"')[sickbeard.TORRENT_AUTH_TYPE == authvalue]}>${authname}</option>
-                                        % endfor
-                                        </select>
-                                        <p></p>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_verify_cert_option">
-                                <label for="torrent_verify_cert">
-                                    <span class="component-title">Verify certificate</span>
-                                    <span class="component-desc">
-                                        <input type="checkbox" name="torrent_verify_cert" class="enabler" id="torrent_verify_cert" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_VERIFY_CERT)]}/>
-                                        <p id="torrent_verify_deluge">disable if you get "Deluge: Authentication Error" in your log</p>
-                                        <p id="torrent_verify_rtorrent">Verify SSL certificates for HTTPS requests</p>
-                                    </span>
+                                <label for="torrent_method">
+                                    <span class="component-title">Send .torrent files to:</span>
+                                    <span class="component-desc">
+                                    <select name="torrent_method" id="torrent_method" class="form-control input-sm">
+    <% torrent_method_text = {'blackhole': "Black hole", 'utorrent': "uTorrent", 'transmission': "Transmission", 'deluge': "Deluge (via WebUI)", 'deluged': "Deluge (via Daemon)", 'download_station': "Synology DS", 'rtorrent': "rTorrent", 'qbittorrent': "qbittorrent", 'mlnet': "MLDonkey"} %>
+    % for curAction in ('blackhole', 'utorrent', 'transmission', 'deluge', 'deluged', 'download_station', 'rtorrent', 'qbittorrent', 'mlnet'):
+                                    <option value="${curAction}" ${('', 'selected="selected"')[sickbeard.TORRENT_METHOD == curAction]}>${torrent_method_text[curAction]}</option>
+    % endfor
+                                    </select>
                                 </label>
-                            </div>
 
-                            <div class="field-pair" id="torrent_username_option">
-                                <label>
-                                    <span class="component-title" id="username_title">Client username</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_username" id="torrent_username" value="${sickbeard.TORRENT_USERNAME}" class="form-control input-sm input200" />
-                                        <p>(blank for none)</p>
-                                    </span>
-                                </label>
-                            </div>
+                                <div id="options_torrent_blackhole">
+                                    <div class="field-pair">
+                                        <label>
+                                            <span class="component-title">Black hole folder location</span>
+                                            <span class="component-desc">
+                                                <input type="text" name="torrent_dir" id="torrent_dir" value="${sickbeard.TORRENT_DIR}" class="form-control input-sm input350" />
+                                                <div class="clear-left"><p><b>.torrent</b> files are stored at this location for external software to find and use</p></div>
+                                            </span>
+                                        </label>
+                                    </div>
 
-                            <div class="field-pair" id="torrent_password_option">
-                                <label>
-                                    <span class="component-title" id="password_title">Client password</span>
-                                    <span class="component-desc">
-                                        <input type="password" name="torrent_password" id="torrent_password" value="${sickbeard.TORRENT_PASSWORD}" class="form-control input-sm input200" />
-                                        <p>(blank for none)</p>
-                                    </span>
-                                </label>
+                                    <div></div>
+                                    <input type="submit" class="btn config_submitter" value="Save Changes" /><br>
+                                </div>
                             </div>
 
-                            <div class="field-pair" id="torrent_label_option">
-                                <label>
-                                    <span class="component-title">Add label to torrent</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_label" id="torrent_label" value="${sickbeard.TORRENT_LABEL}" class="form-control input-sm input200" />
-                                        <span id="label_warning_deluge" style="display:none"><p>(blank spaces are not allowed)</p>
-                                            <div class="clear-left"><p>note: label plugin must be enabled in Deluge clients</p></div>
+                            <div id="options_torrent_clients">
+                                <div class="field-pair">
+                                    <label>
+                                        <span class="component-title" id="host_title">Torrent host:port</span>
+                                        <span class="component-desc">
+                                            <input type="text" name="torrent_host" id="torrent_host" value="${sickbeard.TORRENT_HOST}" class="form-control input-sm input350" />
+                                            <div class="clear-left">
+                                                <p id="host_desc_torrent">URL to your torrent client (e.g. http://localhost:8000/)</p>
+                                            </div>
                                         </span>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_label_anime_option">
-                                <label>
-                                    <span class="component-title">Add label to torrent for anime</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_label_anime" id="torrent_label_anime" value="${sickbeard.TORRENT_LABEL_ANIME}" class="form-control input-sm input200" />
-                                        <span id="label_anime_warning_deluge" style="display:none"><p>(blank spaces are not allowed)</p>
-                                            <div class="clear-left"><p>note: label plugin must be enabled in Deluge clients</p></div>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_rpcurl_option">
+                                    <label>
+                                        <span class="component-title" id="rpcurl_title">Torrent RPC URL</span>
+                                        <span class="component-desc">
+                                            <input type="text" name="torrent_rpcurl" id="torrent_rpcurl" value="${sickbeard.TORRENT_RPCURL}" class="form-control input-sm input350"/>
+                                            <div class="clear-left">
+                                                <p id="rpcurl_desc_">The path without leading and trailing slashes (e.g. transmission)</p>
+                                            </div>
                                         </span>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_path_option">
-                                <label>
-                                    <span class="component-title" id="directory_title">Downloaded files location</span>
-                                    <span class="component-desc">
-                                        <input type="text" name="torrent_path" id="torrent_path" value="${sickbeard.TORRENT_PATH}" class="form-control input-sm input350" />
-                                        <div class="clear-left"><p>where <span id="torrent_client">the torrent client</span> will save downloaded files (blank for client default)
-                                            <span id="path_synology"> <b>note:</b> the destination has to be a shared folder for Synology DS</span></p>
-                                        </div>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_seed_time_option">
-                                <label>
-                                    <span class="component-title" id="torrent_seed_time_label">Minimum seeding time is</span>
-                                    <span class="component-desc"><input type="number" step="1" name="torrent_seed_time" id="torrent_seed_time" value="${sickbeard.TORRENT_SEED_TIME}" class="form-control input-sm input100" />
-                                    <p>hours. (default:'0' passes blank to client and '-1' passes nothing)</p></span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_paused_option">
-                                <label>
-                                    <span class="component-title">Start torrent paused</span>
-                                    <span class="component-desc">
-                                        <input type="checkbox" name="torrent_paused" class="enabler" id="torrent_paused" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_PAUSED)]}/>
-                                        <p>add .torrent to client but do <b style="font-weight:900">not</b> start downloading</p>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="field-pair" id="torrent_high_bandwidth_option">
-                                <label>
-                                    <span class="component-title">Allow high bandwidth</span>
-                                    <span class="component-desc">
-                                        <input type="checkbox" name="torrent_high_bandwidth" class="enabler" id="torrent_high_bandwidth" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_HIGH_BANDWIDTH)]}/>
-                                        <p>use high bandwidth allocation if priority is high</p>
-                                    </span>
-                                </label>
-                            </div>
-
-                            <div class="testNotification" id="test_torrent_result">Click below to test</div>
-                            <input class="btn" type="button" value="Test Connection" id="test_torrent" class="btn test-button"/>
-                            <input type="submit" class="btn config_submitter" value="Save Changes" /><br>
-                            </div>
-                    </div><!-- /content_use_torrents //-->
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_auth_type_option">
+                                    <label>
+                                        <span class="component-title">Http Authentication</span>
+                                        <span class="component-desc">
+                                            <select name="torrent_auth_type" id="torrent_auth_type" class="form-control input-sm">
+                                            <% http_authtype = {'none': "None", 'basic': "Basic", 'digest': "Digest"} %>
+                                            % for authvalue, authname in http_authtype.iteritems():
+                                                <option id="torrent_auth_type_value" value="${authvalue}" ${('', 'selected="selected"')[sickbeard.TORRENT_AUTH_TYPE == authvalue]}>${authname}</option>
+                                            % endfor
+                                            </select>
+                                            <p></p>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_verify_cert_option">
+                                    <label for="torrent_verify_cert">
+                                        <span class="component-title">Verify certificate</span>
+                                        <span class="component-desc">
+                                            <input type="checkbox" name="torrent_verify_cert" class="enabler" id="torrent_verify_cert" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_VERIFY_CERT)]}/>
+                                            <p id="torrent_verify_deluge">disable if you get "Deluge: Authentication Error" in your log</p>
+                                            <p id="torrent_verify_rtorrent">Verify SSL certificates for HTTPS requests</p>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_username_option">
+                                    <label>
+                                        <span class="component-title" id="username_title">Client username</span>
+                                        <span class="component-desc">
+                                            <input type="text" name="torrent_username" id="torrent_username" value="${sickbeard.TORRENT_USERNAME}" class="form-control input-sm input200" />
+                                            <p>(blank for none)</p>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_password_option">
+                                    <label>
+                                        <span class="component-title" id="password_title">Client password</span>
+                                        <span class="component-desc">
+                                            <input type="password" name="torrent_password" id="torrent_password" value="${sickbeard.TORRENT_PASSWORD}" class="form-control input-sm input200" />
+                                            <p>(blank for none)</p>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_label_option">
+                                    <label>
+                                        <span class="component-title">Add label to torrent</span>
+                                        <span class="component-desc">
+                                            <input type="text" name="torrent_label" id="torrent_label" value="${sickbeard.TORRENT_LABEL}" class="form-control input-sm input200" />
+                                            <span id="label_warning_deluge" style="display:none"><p>(blank spaces are not allowed)</p>
+                                                <div class="clear-left"><p>note: label plugin must be enabled in Deluge clients</p></div>
+                                            </span>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_label_anime_option">
+                                    <label>
+                                        <span class="component-title">Add label to torrent for anime</span>
+                                        <span class="component-desc">
+                                            <input type="text" name="torrent_label_anime" id="torrent_label_anime" value="${sickbeard.TORRENT_LABEL_ANIME}" class="form-control input-sm input200" />
+                                            <span id="label_anime_warning_deluge" style="display:none"><p>(blank spaces are not allowed)</p>
+                                                <div class="clear-left"><p>note: label plugin must be enabled in Deluge clients</p></div>
+                                            </span>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_path_option">
+                                    <label>
+                                        <span class="component-title" id="directory_title">Downloaded files location</span>
+                                        <span class="component-desc">
+                                            <input type="text" name="torrent_path" id="torrent_path" value="${sickbeard.TORRENT_PATH}" class="form-control input-sm input350" />
+                                            <div class="clear-left"><p>where <span id="torrent_client">the torrent client</span> will save downloaded files (blank for client default)
+                                                <span id="path_synology"> <b>note:</b> the destination has to be a shared folder for Synology DS</span></p>
+                                            </div>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_seed_time_option">
+                                    <label>
+                                        <span class="component-title" id="torrent_seed_time_label">Minimum seeding time is</span>
+                                        <span class="component-desc"><input type="number" step="1" name="torrent_seed_time" id="torrent_seed_time" value="${sickbeard.TORRENT_SEED_TIME}" class="form-control input-sm input100" />
+                                        <p>hours. (default:'0' passes blank to client and '-1' passes nothing)</p></span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_paused_option">
+                                    <label>
+                                        <span class="component-title">Start torrent paused</span>
+                                        <span class="component-desc">
+                                            <input type="checkbox" name="torrent_paused" class="enabler" id="torrent_paused" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_PAUSED)]}/>
+                                            <p>add .torrent to client but do <b style="font-weight:900">not</b> start downloading</p>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="field-pair" id="torrent_high_bandwidth_option">
+                                    <label>
+                                        <span class="component-title">Allow high bandwidth</span>
+                                        <span class="component-desc">
+                                            <input type="checkbox" name="torrent_high_bandwidth" class="enabler" id="torrent_high_bandwidth" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_HIGH_BANDWIDTH)]}/>
+                                            <p>use high bandwidth allocation if priority is high</p>
+                                        </span>
+                                    </label>
+                                </div>
+
+                                <div class="testNotification" id="test_torrent_result">Click below to test</div>
+                                <input class="btn" type="button" value="Test Connection" id="test_torrent" class="btn test-button"/>
+                                <input type="submit" class="btn config_submitter" value="Save Changes" /><br>
+                                </div>
+                        </div><!-- /content_use_torrents //-->
                     </fieldset>
                 </div><!-- /component-group3 //-->
 
@@ -624,10 +612,7 @@
                 <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" />
 
             </div><!-- /config-components //-->
-
         </form>
     </div>
 </div>
-
-<div></div>
 </%block>
diff --git a/gui/slick/views/config_subtitles.mako b/gui/slick/views/config_subtitles.mako
index 08281ee0c1cbf0d2471bd41733d28d34c82d34ea..63fd4faf61aa43b7d2d8c9c60455e5fef26a6806 100644
--- a/gui/slick/views/config_subtitles.mako
+++ b/gui/slick/views/config_subtitles.mako
@@ -5,8 +5,6 @@
     from sickbeard.helpers import anon_url
 %>
 <%block name="scripts">
-<script type="text/javascript" src="${srRoot}/js/configSubtitles.js?${sbPID}"></script>
-<script type="text/javascript" src="${srRoot}/js/config.js"></script>
 <script>
 $(document).ready(function() {
     $("#subtitles_languages").tokenInput([${','.join("{\"id\": \"" + lang.opensubtitles + "\", name: \"" + lang.name + "\"}" for lang in subtitles.subtitleLanguageFilter())}], {
diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako
index 44f17cb44c6297167110ced14810cb98fc0fe35d..b8da99c0f5e6a59ac9ade423dcac79608dac2e51 100644
--- a/gui/slick/views/displayShow.mako
+++ b/gui/slick/views/displayShow.mako
@@ -13,7 +13,6 @@
 %>
 <%block name="scripts">
 <script type="text/javascript" src="${srRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script>
-<script type="text/javascript" src="${srRoot}/js/new/displayShow.js"></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>
diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako
index b386eaa955d0b5fab52ce625270da3c30ec2a2c4..9b02a63f37a2bb581488952e6639657a60231760 100644
--- a/gui/slick/views/home.mako
+++ b/gui/slick/views/home.mako
@@ -9,9 +9,6 @@
 <%block name="metas">
 <meta data-var="max_download_count" data-content="${max_download_count}">
 </%block>
-<%block name="scripts">
-<script type="text/javascript" src="${srRoot}/js/new/home.js?${sbPID}"></script>
-</%block>
 <%block name="content">
 <%namespace file="/inc_defs.mako" import="renderQualityPill"/>
 % if not header is UNDEFINED:
diff --git a/gui/slick/views/home_postprocess.mako b/gui/slick/views/home_postprocess.mako
index 67011997769ef229e0af7e37a36d1c411102dadb..795c3d3cddafa387d8b9a14801068b37554ec5cb 100644
--- a/gui/slick/views/home_postprocess.mako
+++ b/gui/slick/views/home_postprocess.mako
@@ -16,13 +16,13 @@
 <div id="postProcess">
     <form name="processForm" method="post" action="processEpisode" style="line-height: 40px;">
     <table>
-        <input type="hidden" id="type" name="proc_type" value="manual">
+        <input type="hidden" id="type" name="type" value="manual">
         <tr>
             <td style="padding-right:10px;">
                 <b>Enter the folder containing the episode:</b>
             </td>
             <td>
-                <input type="text" name="proc_dir" id="episodeDir" class="form-control form-control-inline input-sm input350" />
+                <input type="text" name="dir" id="episodeDir" class="form-control form-control-inline input-sm input350" />
             </td>
         </tr>
         <tr>
diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako
index 9ff550e1e2b3bcac917472861a0d18e81a33a5fe..ea3cd4ab10e06a9dde3084fbbb941b820dd61bdd 100644
--- a/gui/slick/views/layouts/main.mako
+++ b/gui/slick/views/layouts/main.mako
@@ -312,9 +312,9 @@
         </footer>
         <script type="text/javascript" src="${srRoot}/js/vender.min.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.form.min.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/isotope.pkgd.min.js?${sbPID}"></script><!-- Can't be added to bower -->
         <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script><!-- Can't be added to bower -->
         <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/new/meta.js?${sbPID}"></script>
diff --git a/gui/slick/views/manage_failedDownloads.mako b/gui/slick/views/manage_failedDownloads.mako
index 4c56c324b870d8f7b7ab06b56a10ed04d371aeb0..bac45ec04062b86ec34972a6f6ae6754fe47775e 100644
--- a/gui/slick/views/manage_failedDownloads.mako
+++ b/gui/slick/views/manage_failedDownloads.mako
@@ -9,10 +9,6 @@
     from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED
     from sickbeard.common import Quality, qualityPresets, qualityPresetStrings, statusStrings, Overview
 %>
-<%block name="scripts">
-<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:
     <h1 class="header">${header}</h1>
diff --git a/gui/slick/views/manage_subtitleMissed.mako b/gui/slick/views/manage_subtitleMissed.mako
index 5337fd8e6fbbaceb2573498f4d4c64b403d437f0..d488199aa6787ab8213e2a97c0c81c04ddfa9278 100644
--- a/gui/slick/views/manage_subtitleMissed.mako
+++ b/gui/slick/views/manage_subtitleMissed.mako
@@ -5,9 +5,6 @@
     import sickbeard
     from sickbeard import common
 %>
-<%block name="scripts">
-<script type="text/javascript" src="${srRoot}/js/manageSubtitleMissed.js?${sbPID}"></script>
-</%block>
 <%block name="content">
 <div id="content960">
 % if not header is UNDEFINED:
diff --git a/readme.md b/readme.md
index 561276003a677399a679095883eba68be91334d8..0e781a77db6701ab1349334b458810258bcbc7d9 100644
--- a/readme.md
+++ b/readme.md
@@ -58,4 +58,4 @@ A full list can be found here: [Link](https://github.com/SickRage/sickrage-issue
 ![image](https://raw.githubusercontent.com/SickRage/SickRage/master/gui/slick/images/providers/dognzb.png)[DOGnzb](dognzb.cr)
 
 #### News and Changelog
-[news.md and CHANGES.md have moved to a separate repo, click here](http://github.com/SickRage/sickrage-news)
+[news.md and CHANGES.md have moved to a separate repo, click here](https://github.com/SickRage/sickrage.github.io)
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index 54d8d0b8c638a068783126b245b6a80244f009a2..a58eb83eb77aba944e44fb38f465cd236e5789a7 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -701,6 +701,9 @@ def initialize(consoleLogging=True):
         GIT_REMOTE_URL = check_setting_str(CFG, 'General', 'git_remote_url',
                                            'https://github.com/%s/%s.git' % (GIT_ORG, GIT_REPO))
 
+        if 'sickragetv' in GIT_REMOTE_URL.lower():
+            GIT_REMOTE_URL = 'https://github.com/SickRage/SickRage.git'
+
         # current commit hash
         CUR_COMMIT_HASH = check_setting_str(CFG, 'General', 'cur_commit_hash', '')
 
diff --git a/sickbeard/notifiers/__init__.py b/sickbeard/notifiers/__init__.py
index a113129ccf2a28c03ecddba1c8cdc289c3ed499c..d7112c67cdd924e4d706c6891ceb4e0269a5d1b2 100644
--- a/sickbeard/notifiers/__init__.py
+++ b/sickbeard/notifiers/__init__.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Nic Wolfe <nic@wolfeden.ca>
 # URL: http://code.google.com/p/sickbeard/
 #
@@ -41,8 +43,6 @@ import tweet
 import trakt
 import emailnotify
 
-from sickbeard.common import *
-
 # home theater / nas
 kodi_notifier = kodi.KODINotifier()
 plex_notifier = plex.PLEXNotifier()
diff --git a/sickbeard/notifiers/emailnotify.py b/sickbeard/notifiers/emailnotify.py
index c63b036708ea94a152ffb45721030be2e3362630..03dbdbc1e332aa5fa714b6a7eea58af7c4bbd870 100644
--- a/sickbeard/notifiers/emailnotify.py
+++ b/sickbeard/notifiers/emailnotify.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Authors:
 # Derek Battams <derek@battams.ca>
 # Pedro Jose Pereira Vieito (@pvieito) <pvieito@gmail.com>
@@ -34,7 +36,7 @@ from sickbeard import db
 from sickrage.helper.encoding import ss
 
 
-class EmailNotifier:
+class EmailNotifier(object):
     def __init__(self):
         self.last_err = None
 
@@ -162,7 +164,6 @@ class EmailNotifier:
                 else:
                     logger.log(u"Download notification ERROR: %s" % self.last_err, logger.ERROR)
 
-
     def notify_git_update(self, new_version="??"):
         pass
 
@@ -171,7 +172,7 @@ class EmailNotifier:
 
         # Grab the global recipients
         for addr in sickbeard.EMAIL_LIST.split(','):
-            if (len(addr.strip()) > 0):
+            if len(addr.strip()) > 0:
                 addrs.append(addr)
 
         # Grab the recipients for the show
@@ -180,7 +181,7 @@ class EmailNotifier:
             for subs in myDB.select("SELECT notify_list FROM tv_shows WHERE show_name = ?", (s,)):
                 if subs['notify_list']:
                     for addr in subs['notify_list'].split(','):
-                        if (len(addr.strip()) > 0):
+                        if len(addr.strip()) > 0:
                             addrs.append(addr)
 
         addrs = set(addrs)
@@ -200,10 +201,10 @@ class EmailNotifier:
         if smtpDebug:
             srv.set_debuglevel(1)
         try:
-            if (use_tls == '1' or use_tls == True) or (len(user) > 0 and len(pwd) > 0):
+            if (use_tls == '1' or use_tls is True) or (len(user) > 0 and len(pwd) > 0):
                 srv.ehlo()
                 logger.log(u'Sent initial EHLO command!', logger.DEBUG)
-            if use_tls == '1' or use_tls == True:
+            if use_tls == '1' or use_tls is True:
                 srv.starttls()
                 logger.log(u'Sent STARTTLS command!', logger.DEBUG)
             if len(user) > 0 and len(pwd) > 0:
diff --git a/sickbeard/notifiers/emby.py b/sickbeard/notifiers/emby.py
index 69ce06cc7ea2f7903fcc4120db1fc8fa60298065..f233ed75d538b1d824f058bc9df6e5b141f8826a 100644
--- a/sickbeard/notifiers/emby.py
+++ b/sickbeard/notifiers/emby.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Nic Wolfe <nic@wolfeden.ca>
 # URL: http://code.google.com/p/sickbeard/
 #
@@ -30,7 +32,7 @@ except ImportError:
     import simplejson as json
 
 
-class EMBYNotifier:
+class EMBYNotifier(object):
 
     def _notify_emby(self, message, host=None, emby_apikey=None):
         """Handles notifying Emby host via HTTP API
@@ -46,7 +48,7 @@ class EMBYNotifier:
         if not emby_apikey:
             emby_apikey = sickbeard.EMBY_APIKEY
 
-        url = 'http://%s/emby/Notifications/Admin' % (host)
+        url = 'http://%s/emby/Notifications/Admin' % host
         values = {'Name': 'SickRage', 'Description': message, 'ImageUrl': 'https://raw.githubusercontent.com/SickRage/SickRage/master/gui/slick/images/sickrage-shark-mascot.png'}
         data = json.dumps(values)
         try:
diff --git a/sickbeard/notifiers/freemobile.py b/sickbeard/notifiers/freemobile.py
index ab203bcba5c0c6020abd662ede3d5acf04658217..dc040d819291291f3f54d8ba86ec3b74484ad209 100644
--- a/sickbeard/notifiers/freemobile.py
+++ b/sickbeard/notifiers/freemobile.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Marvin Pinto <me@marvinp.ca>
 # Author: Dennis Lutter <lad1337@gmail.com>
 # Author: Aaron Bieber <deftly@gmail.com>
@@ -23,11 +25,12 @@ import sickbeard
 from sickbeard import logger
 from sickbeard.common import notifyStrings, NOTIFY_SNATCH, NOTIFY_DOWNLOAD, NOTIFY_SUBTITLE_DOWNLOAD, NOTIFY_GIT_UPDATE, NOTIFY_GIT_UPDATE_TEXT
 
-class FreeMobileNotifier:
-    def test_notify(self, id=None, apiKey=None):
-        return self._notifyFreeMobile('Test', "This is a test notification from SickRage", id, apiKey, force=True)
 
-    def _sendFreeMobileSMS(self, title, msg, id=None, apiKey=None):
+class FreeMobileNotifier(object):
+    def test_notify(self, cust_id=None, apiKey=None):
+        return self._notifyFreeMobile('Test', "This is a test notification from SickRage", cust_id, apiKey, force=True)
+
+    def _sendFreeMobileSMS(self, title, msg, cust_id=None, apiKey=None):
         """
         Sends a SMS notification
 
@@ -38,9 +41,9 @@ class FreeMobileNotifier:
         returns: True if the message succeeded, False otherwise
         """
 
-        if id == None:
-            id = sickbeard.FREEMOBILE_ID
-        if apiKey == None:
+        if cust_id is None:
+            cust_id = sickbeard.FREEMOBILE_ID
+        if apiKey is None:
             apiKey = sickbeard.FREEMOBILE_APIKEY
 
         logger.log(u"Free Mobile in use with API KEY: " + apiKey, logger.DEBUG)
@@ -48,14 +51,14 @@ class FreeMobileNotifier:
         # build up the URL and parameters
         msg = msg.strip()
         msg_quoted = urllib2.quote(title.encode('utf-8') + ": " + msg.encode('utf-8'))
-        URL = "https://smsapi.free-mobile.fr/sendmsg?user=" + id + "&pass=" + apiKey + "&msg=" + msg_quoted
+        URL = "https://smsapi.free-mobile.fr/sendmsg?user=" + cust_id + "&pass=" + apiKey + "&msg=" + msg_quoted
 
         req = urllib2.Request(URL)
         # send the request to Free Mobile
         try:
             urllib2.urlopen(req)
         except IOError, e:
-            if hasattr(e,'code'):
+            if hasattr(e, 'code'):
                 if e.code == 400:
                     message = "Missing parameter(s)."
                     logger.log(message, logger.ERROR)
@@ -81,14 +84,10 @@ class FreeMobileNotifier:
         logger.log(message, logger.INFO)
         return True, message
 
-
-
-
     def notify_snatch(self, ep_name, title=notifyStrings[NOTIFY_SNATCH]):
         if sickbeard.FREEMOBILE_NOTIFY_ONSNATCH:
             self._notifyFreeMobile(title, ep_name)
 
-
     def notify_download(self, ep_name, title=notifyStrings[NOTIFY_DOWNLOAD]):
         if sickbeard.FREEMOBILE_NOTIFY_ONDOWNLOAD:
             self._notifyFreeMobile(title, ep_name)
@@ -97,19 +96,19 @@ class FreeMobileNotifier:
         if sickbeard.FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD:
             self._notifyFreeMobile(title, ep_name + ": " + lang)
 
-    def notify_git_update(self, new_version = "??"):
+    def notify_git_update(self, new_version="??"):
         if sickbeard.USE_FREEMOBILE:
-            update_text=notifyStrings[NOTIFY_GIT_UPDATE_TEXT]
-            title=notifyStrings[NOTIFY_GIT_UPDATE]
+            update_text = notifyStrings[NOTIFY_GIT_UPDATE_TEXT]
+            title = notifyStrings[NOTIFY_GIT_UPDATE]
             self._notifyFreeMobile(title, update_text + new_version)
 
-    def _notifyFreeMobile(self, title, message, id=None, apiKey=None, force=False):
+    def _notifyFreeMobile(self, title, message, cust_id=None, apiKey=None, force=False):
         """
         Sends a SMS notification
 
         title: The title of the notification to send
         message: The message string to send
-        id: Your Free Mobile customer ID
+        cust_id: Your Free Mobile customer ID
         apikey: Your Free Mobile API key
         force: Enforce sending, for instance for testing
         """
@@ -120,7 +119,7 @@ class FreeMobileNotifier:
 
         logger.log(u"Sending a SMS for " + message, logger.DEBUG)
 
-        return self._sendFreeMobileSMS(title, message, id, apiKey)
+        return self._sendFreeMobileSMS(title, message, cust_id, apiKey)
 
 
 notifier = FreeMobileNotifier
diff --git a/sickbeard/notifiers/growl.py b/sickbeard/notifiers/growl.py
index 10e32204b20681b379081780f3dd1c4139c7ab65..a1a234c4442c59e3622d34d3b686b253136be8af 100644
--- a/sickbeard/notifiers/growl.py
+++ b/sickbeard/notifiers/growl.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Nic Wolfe <nic@wolfeden.ca>
 # URL: http://code.google.com/p/sickbeard/
 #
@@ -24,7 +26,7 @@ from sickrage.helper.exceptions import ex
 from libgrowl import gntp
 
 
-class GrowlNotifier:
+class GrowlNotifier(object):
     sr_logo_url = 'https://raw.githubusercontent.com/SickRage/SickRage/master/gui/slick/images/sickrage-shark-mascot.png'
 
     def test_notify(self, host, password):
@@ -44,10 +46,10 @@ class GrowlNotifier:
         if sickbeard.GROWL_NOTIFY_ONSUBTITLEDOWNLOAD:
             self._sendGrowl(common.notifyStrings[common.NOTIFY_SUBTITLE_DOWNLOAD], ep_name + ": " + lang)
 
-    def notify_git_update(self, new_version = "??"):
+    def notify_git_update(self, new_version="??"):
         if sickbeard.USE_GROWL:
-            update_text=common.notifyStrings[common.NOTIFY_GIT_UPDATE_TEXT]
-            title=common.notifyStrings[common.NOTIFY_GIT_UPDATE]
+            update_text = common.notifyStrings[common.NOTIFY_GIT_UPDATE_TEXT]
+            title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._sendGrowl(title, update_text + new_version)
 
     def _send_growl(self, options, message=None):
@@ -75,11 +77,11 @@ class GrowlNotifier:
             notice.add_header('Notification-Text', message)
 
         response = self._send(options['host'], options['port'], notice.encode(), options['debug'])
-        if isinstance(response, gntp.GNTPOK): return True
-        return False
+        return True if isinstance(response, gntp.GNTPOK) else False
 
     def _send(self, host, port, data, debug=False):
-        if debug: print '<Sending>\n', data, '\n</Sending>'
+        if debug:
+            print '<Sending>\n', data, '\n</Sending>'
 
         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         s.connect((host, port))
@@ -87,7 +89,8 @@ class GrowlNotifier:
         response = gntp.parse_gntp(s.recv(1024))
         s.close()
 
-        if debug: print '<Recieved>\n', response, '\n</Recieved>'
+        if debug:
+            print '<Received>\n', response, '\n</Received>'
 
         return response
 
@@ -96,10 +99,10 @@ class GrowlNotifier:
         if not sickbeard.USE_GROWL and not force:
             return False
 
-        if name == None:
+        if name is None:
             name = title
 
-        if host == None:
+        if host is None:
             hostParts = sickbeard.GROWL_HOST.split(':')
         else:
             hostParts = host.split(':')
@@ -111,18 +114,16 @@ class GrowlNotifier:
 
         growlHosts = [(hostParts[0], port)]
 
-        opts = {}
-
-        opts['name'] = name
-
-        opts['title'] = title
-        opts['app'] = 'SickRage'
-
-        opts['sticky'] = None
-        opts['priority'] = None
-        opts['debug'] = False
+        opts = {
+            'name': name,
+            'title': title,
+            'app': 'SickRage',
+            'sticky': None,
+            'priority': None,
+            'debug': False
+        }
 
-        if password == None:
+        if password is None:
             opts['password'] = sickbeard.GROWL_PASSWORD
         else:
             opts['password'] = password
@@ -148,7 +149,7 @@ class GrowlNotifier:
     def _sendRegistration(self, host=None, password=None, name='SickRage Notification'):
         opts = {}
 
-        if host == None:
+        if host is None:
             hostParts = sickbeard.GROWL_HOST.split(':')
         else:
             hostParts = host.split(':')
@@ -161,7 +162,7 @@ class GrowlNotifier:
         opts['host'] = hostParts[0]
         opts['port'] = port
 
-        if password == None:
+        if password is None:
             opts['password'] = sickbeard.GROWL_PASSWORD
         else:
             opts['password'] = password
diff --git a/sickbeard/notifiers/libnotify.py b/sickbeard/notifiers/libnotify.py
index 402b99a1e53dfaf16264e069df4ab8efa65d8105..162dfe2189890cce139041396d2034fcacb1858e 100644
--- a/sickbeard/notifiers/libnotify.py
+++ b/sickbeard/notifiers/libnotify.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Nic Wolfe <nic@wolfeden.ca>
 # URL: http://code.google.com/p/sickbeard/
 #
@@ -24,10 +26,10 @@ from sickbeard import logger, common
 
 
 def diagnose():
-    '''
+    """
     Check the environment for reasons libnotify isn't working.  Return a
     user-readable message indicating possible issues.
-    '''
+    """
     try:
         from gi.repository import Notify  # @UnusedImport
     except ImportError:
@@ -57,7 +59,7 @@ def diagnose():
     return u"<p>Error: Unable to send notification."
 
 
-class LibnotifyNotifier:
+class LibnotifyNotifier(object):
     def __init__(self):
         self.Notify = None
         self.gobject = None
@@ -94,10 +96,10 @@ class LibnotifyNotifier:
         if sickbeard.LIBNOTIFY_NOTIFY_ONSUBTITLEDOWNLOAD:
             self._notify(common.notifyStrings[common.NOTIFY_SUBTITLE_DOWNLOAD], ep_name + ": " + lang)
             
-    def notify_git_update(self, new_version = "??"):
+    def notify_git_update(self, new_version="??"):
         if sickbeard.USE_LIBNOTIFY:
-            update_text=common.notifyStrings[common.NOTIFY_GIT_UPDATE_TEXT]
-            title=common.notifyStrings[common.NOTIFY_GIT_UPDATE]
+            update_text = common.notifyStrings[common.NOTIFY_GIT_UPDATE_TEXT]
+            title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._notify(title, update_text + new_version)
 
     def test_notify(self):
diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py
index 313998de30ffa91d9b7222bca774facdd0b781b0..8b8be514480d0b8fb88c74c0f13c0eedc46e414d 100644
--- a/sickbeard/notifiers/nmj.py
+++ b/sickbeard/notifiers/nmj.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Nico Berlee http://nico.berlee.nl/
 # URL: http://code.google.com/p/sickbeard/
 #
@@ -16,7 +18,8 @@
 # You should have received a copy of the GNU General Public License
 # along with SickRage.  If not, see <http://www.gnu.org/licenses/>.
 
-import urllib, urllib2
+import urllib
+import urllib2
 import sickbeard
 import telnetlib
 import re
@@ -30,7 +33,7 @@ except ImportError:
     import xml.etree.ElementTree as etree
 
 
-class NMJNotifier:
+class NMJNotifier(object):
     def notify_settings(self, host):
         """
         Retrieves the settings from a NMJ/Popcorn hour
@@ -41,23 +44,20 @@ class NMJNotifier:
         """
 
         # establish a terminal session to the PC
-        terminal = False
         try:
             terminal = telnetlib.Telnet(host)
         except Exception:
-            logger.log(u"Warning: unable to get a telnet session to %s" % (host), logger.WARNING)
+            logger.log(u"Warning: unable to get a telnet session to %s" % host, logger.WARNING)
             return False
 
         # tell the terminal to output the necessary info to the screen so we can search it later
-        logger.log(u"Connected to %s via telnet" % (host), logger.DEBUG)
+        logger.log(u"Connected to %s via telnet" % host, logger.DEBUG)
         terminal.read_until("sh-3.00# ")
         terminal.write("cat /tmp/source\n")
         terminal.write("cat /tmp/netshare\n")
         terminal.write("exit\n")
         tnoutput = terminal.read_all()
 
-        database = ""
-        device = ""
         match = re.search(r"(.+\.db)\r\n?(.+)(?=sh-3.00# cat /tmp/netshare)", tnoutput)
 
         # if we found the database in the terminal output then save that database to the config
@@ -67,7 +67,7 @@ class NMJNotifier:
             logger.log(u"Found NMJ database %s on device %s" % (database, device), logger.DEBUG)
             sickbeard.NMJ_DATABASE = database
         else:
-            logger.log(u"Could not get current NMJ database on %s, NMJ is probably not running!" % (host), logger.WARNING)
+            logger.log(u"Could not get current NMJ database on %s, NMJ is probably not running!" % host, logger.WARNING)
             return False
 
         # if the device is a remote host then try to parse the mounting URL and save it to the config
@@ -76,7 +76,7 @@ class NMJNotifier:
 
             if match:
                 mount = match.group().replace("127.0.0.1", host)
-                logger.log(u"Found mounting url on the Popcorn Hour in configuration: %s" % (mount), logger.DEBUG)
+                logger.log(u"Found mounting url on the Popcorn Hour in configuration: %s" % mount, logger.DEBUG)
                 sickbeard.NMJ_MOUNT = mount
             else:
                 logger.log(u"Detected a network share on the Popcorn Hour, but could not get the mounting url",
@@ -109,7 +109,7 @@ class NMJNotifier:
         Sends a NMJ update command to the specified machine
 
         host: The hostname/IP to send the request to (no port)
-        database: The database to send the requst to
+        database: The database to send the request to
         mount: The mount URL to use (optional)
 
         Returns: True if the request succeeded, False otherwise
@@ -119,7 +119,7 @@ class NMJNotifier:
         if mount:
             try:
                 req = urllib2.Request(mount)
-                logger.log(u"Try to mount network drive via url: %s" % (mount), logger.DEBUG)
+                logger.log(u"Try to mount network drive via url: %s" % mount, logger.DEBUG)
                 handle = urllib2.urlopen(req)
             except IOError, e:
                 if hasattr(e, 'reason'):
@@ -145,7 +145,7 @@ class NMJNotifier:
         # send the request to the server
         try:
             req = urllib2.Request(updateUrl)
-            logger.log(u"Sending NMJ scan update command via url: %s" % (updateUrl), logger.DEBUG)
+            logger.log(u"Sending NMJ scan update command via url: %s" % updateUrl, logger.DEBUG)
             handle = urllib2.urlopen(req)
             response = handle.read()
         except IOError, e:
@@ -163,12 +163,12 @@ class NMJNotifier:
             et = etree.fromstring(response)
             result = et.findtext("returnValue")
         except SyntaxError, e:
-            logger.log(u"Unable to parse XML returned from the Popcorn Hour: %s" % (e), logger.ERROR)
+            logger.log(u"Unable to parse XML returned from the Popcorn Hour: %s" % e, logger.ERROR)
             return False
 
         # if the result was a number then consider that an error
         if int(result) > 0:
-            logger.log(u"Popcorn Hour returned an errorcode: %s" % (result), logger.ERROR)
+            logger.log(u"Popcorn Hour returned an error code: %s" % result, logger.ERROR)
             return False
         else:
             logger.log(u"NMJ started background scan", logger.INFO)
diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py
index 24464b039e68ce6780f2e2eeeee7ab54c49d4fe7..a99b8c92fc9fb7d8700eac05d0037d64d95b4871 100644
--- a/sickbeard/notifiers/nmjv2.py
+++ b/sickbeard/notifiers/nmjv2.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Jasper Lanting
 # Based on nmj.py by Nico Berlee: http://nico.berlee.nl/
 # URL: http://code.google.com/p/sickbeard/
@@ -30,7 +32,7 @@ except ImportError:
     import xml.etree.ElementTree as etree
 
 
-class NMJv2Notifier:
+class NMJv2Notifier(object):
     def notify_snatch(self, ep_name):
         return False
         # Not implemented: Start the scanner when snatched does not make any sense
@@ -53,7 +55,7 @@ class NMJv2Notifier:
         Retrieves the NMJv2 database location from Popcorn hour
         
         host: The hostname/IP of the Popcorn Hour server
-        dbloc: 'local' for PCH internal harddrive. 'network' for PCH network shares
+        dbloc: 'local' for PCH internal hard drive. 'network' for PCH network shares
         instance: Allows for selection of different DB in case of multiple databases
         
         Returns: True if the settings were retrieved successfully, False otherwise
@@ -66,7 +68,7 @@ class NMJv2Notifier:
             xml = parseString(response1)
             time.sleep(300.0 / 1000.0)
             for node in xml.getElementsByTagName('path'):
-                xmlTag = node.toxml();
+                xmlTag = node.toxml()
                 xmlData = xmlTag.replace('<path>', '').replace('</path>', '').replace('[=]', '')
                 url_db = "http://" + host + ":8008/metadata_database?arg0=check_database&arg1=" + xmlData
                 reqdb = urllib2.Request(url_db)
@@ -98,7 +100,7 @@ class NMJv2Notifier:
         Sends a NMJ update command to the specified machine
         
         host: The hostname/IP to send the request to (no port)
-        database: The database to send the requst to
+        database: The database to send the request to
         mount: The mount URL to use (optional)
         
         Returns: True if the request succeeded, False otherwise
@@ -107,9 +109,9 @@ class NMJv2Notifier:
         # if a host is provided then attempt to open a handle to that URL
         try:
             url_scandir = "http://" + host + ":8008/metadata_database?arg0=update_scandir&arg1=" + sickbeard.NMJv2_DATABASE + "&arg2=&arg3=update_all"
-            logger.log(u"NMJ scan update command sent to host: %s" % (host), logger.DEBUG)
+            logger.log(u"NMJ scan update command sent to host: %s" % host, logger.DEBUG)
             url_updatedb = "http://" + host + ":8008/metadata_database?arg0=scanner_start&arg1=" + sickbeard.NMJv2_DATABASE + "&arg2=background&arg3="
-            logger.log(u"Try to mount network drive via url: %s" % (host), logger.DEBUG)
+            logger.log(u"Try to mount network drive via url: %s" % host, logger.DEBUG)
             prereq = urllib2.Request(url_scandir)
             req = urllib2.Request(url_updatedb)
             handle1 = urllib2.urlopen(prereq)
@@ -124,13 +126,13 @@ class NMJv2Notifier:
             et = etree.fromstring(response1)
             result1 = et.findtext("returnValue")
         except SyntaxError, e:
-            logger.log(u"Unable to parse XML returned from the Popcorn Hour: update_scandir, %s" % (e), logger.ERROR)
+            logger.log(u"Unable to parse XML returned from the Popcorn Hour: update_scandir, %s" % e, logger.ERROR)
             return False
         try:
             et = etree.fromstring(response2)
             result2 = et.findtext("returnValue")
         except SyntaxError, e:
-            logger.log(u"Unable to parse XML returned from the Popcorn Hour: scanner_start, %s" % (e), logger.ERROR)
+            logger.log(u"Unable to parse XML returned from the Popcorn Hour: scanner_start, %s" % e, logger.ERROR)
             return False
 
         # if the result was a number then consider that an error
diff --git a/sickbeard/notifiers/plex.py b/sickbeard/notifiers/plex.py
index 35f8aeaa14a73cd67da3fe48555805bbf0344634..941b8223c309f1905310e365b14003e7bec31d51 100644
--- a/sickbeard/notifiers/plex.py
+++ b/sickbeard/notifiers/plex.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
 # Author: Nic Wolfe <nic@wolfeden.ca>
 # URL: http://code.google.com/p/sickbeard/
 #
@@ -33,7 +35,7 @@ except ImportError:
     import xml.etree.ElementTree as etree
 
 
-class PLEXNotifier:
+class PLEXNotifier(object):
 
     def _send_to_plex(self, command, host, username=None, password=None):
         """Handles communication to Plex hosts via HTTP API
diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py
index e605f3c31dee51da7f5b37a3d0ef4909bb56243a..f4f102b0bbaa3ef526f2282a815b6a35c0345445 100644
--- a/sickbeard/notifiers/pushover.py
+++ b/sickbeard/notifiers/pushover.py
@@ -19,7 +19,8 @@
 # along with SickRage.  If not, see <http://www.gnu.org/licenses/>.
 
 import httplib
-import urllib, urllib2
+import urllib
+import urllib2
 import time
 
 import sickbeard
diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py
index e66f7c4ec6e248f3451263001b886d4a31f40492..1cd7afa6aa66f8b64fb2128e4c4bed4f6cd76f7d 100644
--- a/sickbeard/postProcessor.py
+++ b/sickbeard/postProcessor.py
@@ -39,6 +39,7 @@ from sickbeard.name_parser.parser import NameParser, InvalidNameException, Inval
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import EpisodeNotFoundException, EpisodePostProcessingFailedException, ex
 from sickrage.helper.exceptions import ShowDirectoryNotFoundException
+from babelfish import language_converters
 
 import adba
 from sickbeard.helpers import verify_freespace
@@ -190,10 +191,17 @@ class PostProcessor(object):
             checklist = glob.glob(ek(os.path.join, ek(os.path.dirname, globbable_file_path), '*')) # get a list of all the files in the folder
             for filefound in checklist: # loop through all the files in the folder, and check if they are the same name even when the cases don't match
                 file_name = filefound.rpartition('.')[0]
+                file_extension = filefound.rpartition('.')[2]
                 if not base_name_only:
-                    file_name = file_name + '.'
-                if file_name.lower() == base_name.lower().replace('[[]', '[').replace('[]]', ']'): # if there's no difference in the filename add it to the filelist
+                    new_file_name = file_name + '.'
+                if new_file_name.lower() == base_name.lower().replace('[[]', '[').replace('[]]', ']'): # if there's no difference in the filename add it to the filelist
                     filelist.append(filefound)
+                elif file_extension in common.subtitleExtensions:
+                    language_extensions = tuple('.' + c for c in language_converters['opensubtitles'].codes)
+                    if file_name.lower().endswith(language_extensions) and (len(filefound.rsplit('.', 2)[1]) is 2 or 3):
+                        filelist.append(filefound)
+                    elif file_name.lower().endswith('pt-br') and len(filefound.rsplit('.', 2)[1]) is 5:
+                        filelist.append(filefound)
 
         for associated_file_path in filelist:
             # only add associated to list
@@ -299,7 +307,10 @@ class PostProcessor(object):
             # check if file have subtitles language
             if os.path.splitext(cur_extension)[1][1:] in common.subtitleExtensions:
                 cur_lang = os.path.splitext(cur_extension)[0]
-                if cur_lang in sickbeard.subtitles.wantedLanguages():
+                if cur_lang:
+                    cur_lang = cur_lang.lower()
+                    if cur_lang == 'pt-br':
+                        cur_lang = 'pt-BR'
                     cur_extension = cur_lang + os.path.splitext(cur_extension)[1]
 
             # replace .nfo with .nfo-orig to avoid conflicts
@@ -313,7 +324,7 @@ class PostProcessor(object):
             else:
                 new_file_name = helpers.replaceExtension(cur_file_name, cur_extension)
 
-            if sickbeard.SUBTITLES_DIR and cur_extension in common.subtitleExtensions:
+            if sickbeard.SUBTITLES_DIR and cur_extension[-3:] in common.subtitleExtensions:
                 subs_new_path = ek(os.path.join, new_path, sickbeard.SUBTITLES_DIR)
                 dir_exists = helpers.makeDir(subs_new_path)
                 if not dir_exists:
@@ -921,8 +932,6 @@ class PostProcessor(object):
                 if self.is_proper:
                     self._log(
                         u"File exists and new file is smaller, new file is a proper/repack, marking it safe to replace")
-                    return True
-
                 else:
                     self._log(u"File exists and new file is smaller, marking it unsafe to replace")
                     return False
@@ -984,6 +993,10 @@ class PostProcessor(object):
                 if self.release_name:
                     self._log("Found release name " + self.release_name, logger.DEBUG)
                     cur_ep.release_name = self.release_name
+                elif self.file_name:
+                    # If we can't get the release name we expect, save the original release name instead
+                    self._log("Using original release name " + self.file_name, logger.DEBUG)
+                    cur_ep.release_name = self.file_name
                 else:
                     cur_ep.release_name = ""
 
diff --git a/sickbeard/providers/btdigg.py b/sickbeard/providers/btdigg.py
index 70ee530ed0ef56819f98e85d805f3d43fcdf3140..798b3614ffb512cb8abae73ea379e13a75cf6192 100644
--- a/sickbeard/providers/btdigg.py
+++ b/sickbeard/providers/btdigg.py
@@ -97,12 +97,13 @@ class BTDiggCache(tvcache.TVCache):
 
         tvcache.TVCache.__init__(self, provider_obj)
 
-        # set this 0 to suppress log line, since we aren't updating it anyways
-        self.minTime = 0
+        # Cache results for a hour ,since BTDigg takes some time to crawl
+        self.minTime = 60
 
     def _getRSSData(self):
-        # no rss for btdigg, can't search with empty string
-        # newest results are always > 1 day since added anyways
-        return {'entries': {}}
+
+        # Use x264 for RSS search since most results will use that codec and since the site doesnt have latest results search
+        search_params = {'RSS': ['x264']}
+        return {'entries': self.provider._doSearch(search_params)}
 
 provider = BTDIGGProvider()
diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py
index ff2cadc275245beef54ac686cb79d33e5ed78196..61a9dc5bd0890b6a175d2e9d721d496d2b4b4d8d 100644
--- a/sickbeard/providers/generic.py
+++ b/sickbeard/providers/generic.py
@@ -412,6 +412,7 @@ class GenericProvider(object):
                     actual_season = parse_result.season_number
                     actual_episodes = parse_result.episode_numbers
             else:
+                sameDaySpecial = False
                 if not parse_result.is_air_by_date:
                     logger.log(
                         u"This is supposed to be a date search but the result " + title + " didn't parse as one, skipping it",
@@ -424,13 +425,22 @@ class GenericProvider(object):
                         "SELECT season, episode FROM tv_episodes WHERE showid = ? AND airdate = ?",
                         [showObj.indexerid, airdate])
 
-                    if len(sql_results) != 1:
+                    if len(sql_results) == 2:
+                        if int(sql_results[0]['season']) == 0 and int(sql_results[1]['season']) != 0:
+                            actual_season = int(sql_results[1]["season"])
+                            actual_episodes = [int(sql_results[1]["episode"])]
+                            sameDaySpecial = True
+                        elif int(sql_results[1]['season']) == 0 and int(sql_results[0]['season']) != 0:
+                            actual_season = int(sql_results[0]["season"])
+                            actual_episodes = [int(sql_results[0]["episode"])]
+                            sameDaySpecial = True
+                    elif len(sql_results) != 1:
                         logger.log(
                             u"Tried to look up the date for the episode " + title + " but the database didn't give proper results, skipping it",
                             logger.WARNING)
                         addCacheEntry = True
 
-                if not addCacheEntry:
+                if not addCacheEntry and not sameDaySpecial:
                     actual_season = int(sql_results[0]["season"])
                     actual_episodes = [int(sql_results[0]["episode"])]
 
diff --git a/sickbeard/providers/libertalia.py b/sickbeard/providers/libertalia.py
index 4a4b9b6b4c097cd83d0bcb1951bfd37cc55d1f6e..dc2a9a5141570b2c3774eead9bd91bdf2a026c47 100644
--- a/sickbeard/providers/libertalia.py
+++ b/sickbeard/providers/libertalia.py
@@ -99,7 +99,7 @@ class LibertaliaProvider(generic.TorrentProvider):
                 with BS4Parser(data, features=["html5lib", "permissive"]) as html:
                     resultsTable = html.find("table", {"class" : "torrent_table"})
                     if resultsTable:
-                        rows = resultsTable.findAll("tr", {"class" : re.compile("torrent_row(.*)?")})
+                        rows = resultsTable.findAll("tr", {"class" : re.compile("torrent_row.*")})
                         for row in rows:
 
                             # bypass first row because title only
diff --git a/sickbeard/providers/newpct.py b/sickbeard/providers/newpct.py
index ad1dd5412b1d4da7079fc73b8e25ad349aef0284..0985f73ce75456c0c0533597e4d23e555574c0c5 100644
--- a/sickbeard/providers/newpct.py
+++ b/sickbeard/providers/newpct.py
@@ -1,3 +1,4 @@
+# coding=utf-8
 # Author: CristianBB
 # Greetings to Mr. Pine-apple
 #
@@ -13,18 +14,19 @@
 # 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.
+# 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 traceback
+import re
 from six.moves import urllib
 
+from sickbeard import helpers
 from sickbeard import logger
 from sickbeard import tvcache
 from sickbeard.providers import generic
-from sickbeard.common import USER_AGENT
 from sickbeard.bs4_parser import BS4Parser
 
 
@@ -37,13 +39,16 @@ class newpctProvider(generic.TorrentProvider):
         self.onlyspasearch = None
         self.cache = newpctCache(self)
 
+        # Unsupported
+        # self.minseed = None
+        # self.minleech = None
+
         self.urls = {
             'base_url': 'http://www.newpct.com',
             'search': 'http://www.newpct.com/buscar-descargas/'
         }
 
         self.url = self.urls['base_url']
-        self.headers.update({'User-Agent': USER_AGENT})
 
         """
         Search query:
@@ -71,14 +76,14 @@ class newpctProvider(generic.TorrentProvider):
             'q': ''
         }
 
+
     def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None):
 
         results = []
         items = {'Season': [], 'Episode': [], 'RSS': []}
 
-        lang_info = '' if not epObj or not epObj.show else epObj.show.lang
-
         # Only search if user conditions are true
+        lang_info = '' if not epObj or not epObj.show else epObj.show.lang
         if self.onlyspasearch and lang_info != 'es':
             logger.log(u"Show info is not spanish, skipping provider search", logger.DEBUG)
             return results
@@ -87,6 +92,9 @@ class newpctProvider(generic.TorrentProvider):
             logger.log(u"Search Mode: %s" % mode, logger.DEBUG)
 
             for search_string in search_strings[mode]:
+                if mode is not 'RSS':
+                    logger.log(u"Search string: %s " % search_string, logger.DEBUG)
+
                 self.search_params.update({'q': search_string.strip()})
 
                 logger.log(u"Search URL: %s" % self.urls['search'] + '?' + urllib.parse.urlencode(self.search_params), logger.DEBUG)
@@ -98,42 +106,90 @@ class newpctProvider(generic.TorrentProvider):
                     with BS4Parser(data, features=["html5lib", "permissive"]) as html:
                         torrent_tbody = html.find('tbody')
 
-                        if len(torrent_tbody) < 1:
+                        if not len(torrent_tbody):
                             logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG)
                             continue
 
                         torrent_table = torrent_tbody.findAll('tr')
-                        num_results = len(torrent_table) - 1
+                        if not len(torrent_table):
+                            logger.log(u"Torrent table does not have any rows", logger.DEBUG)
+                            continue
 
-                        iteration = 0
-                        for row in torrent_table:
+                        for row in torrent_table[:-1]:
                             try:
-                                if iteration < num_results:
-                                    torrent_size = row.findAll('td')[2]
-                                    torrent_row = row.findAll('a')[1]
-
-                                    download_url = torrent_row.get('href')
-                                    title_raw = torrent_row.get('title')
-                                    size = self._convertSize(torrent_size.text)
+                                torrent_size = row.findAll('td')[2]
+                                torrent_row = row.findAll('a')[0]
 
-                                    title = self._processTitle(title_raw)
+                                download_url = torrent_row.get('href', '')
+                                size = self._convertSize(torrent_size.text)
+                                title = self._processTitle(torrent_row.get('title', ''))
 
-                                    item = title, download_url, size
-                                    logger.log(u"Found result: %s " % title, logger.DEBUG)
-
-                                    items[mode].append(item)
-                                    iteration += 1
+                                # FIXME: Provider does not provide seeders/leechers
+                                seeders = 1
+                                leechers = 0
 
                             except (AttributeError, TypeError):
                                 continue
 
+                            if not all([title, download_url]):
+                                continue
+
+                            # Filter unseeded torrent (Unsupported)
+                            # if seeders < self.minseed or leechers < self.minleech:
+                            #     if mode is not 'RSS':
+                            #         logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
+                            #     continue
+
+                            item = title, download_url, size, seeders, leechers
+                            if mode is not 'RSS':
+                                logger.log(u"Found result: %s " % title, logger.DEBUG)
+
+                            items[mode].append(item)
+
                 except Exception:
                     logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.WARNING)
 
+            # For each search mode sort all the items by seeders if available (Unsupported)
+            # items[mode].sort(key=lambda tup: tup[3], reverse=True)
+
             results += items[mode]
 
         return results
 
+    def downloadResult(self, result):
+        """
+        Save the result to disk.
+        """
+
+        # check for auth
+        if not self._doLogin():
+            return False
+
+        urls, filename = self._makeURL(result)
+
+        for url in urls:
+            # Search results don't return torrent files directly, it returns show sheets so we must parse showSheet to access torrent.
+            data = self.getURL(url)
+            url_torrent = re.search(r'http://tumejorserie.com/descargar/.+\.torrent', data, re.DOTALL).group()
+
+            if url_torrent.startswith('http'):
+                self.headers.update({'Referer': '/'.join(url_torrent.split('/')[:3]) + '/'})
+
+            logger.log(u"Downloading a result from " + self.name + " at " + url)
+
+            if helpers.download_file(url_torrent, filename, session=self.session, headers=self.headers):
+                if self._verify_download(filename):
+                    logger.log(u"Saved result to " + filename, logger.INFO)
+                    return True
+                else:
+                    logger.log(u"Could not download %s" % url, logger.WARNING)
+                    helpers.remove_file_failed(filename)
+
+        if len(urls):
+            logger.log(u"Failed to download any results", logger.WARNING)
+
+        return False
+
     @staticmethod
     def _convertSize(size):
         size, modifier = size.split(' ')
@@ -148,9 +204,12 @@ class newpctProvider(generic.TorrentProvider):
             size = size * 1024**4
         return int(size)
 
-    def _processTitle(self, title):
 
-        title = title.replace('Descargar ', '')
+    @staticmethod
+    def _processTitle(title):
+
+        # Remove "Mas informacion sobre " literal from title
+        title = title[22:]
 
         # Quality
         title = title.replace('[HDTV]', '[720p HDTV x264]')
@@ -169,8 +228,7 @@ class newpctProvider(generic.TorrentProvider):
         title = title.replace('[BluRay MicroHD]', '[1080p BlueRay x264]')
         title = title.replace('[MicroHD 1080p]', '[1080p BlueRay x264]')
 
-        return title
-
+        return title.strip()
 
 
 class newpctCache(tvcache.TVCache):
@@ -178,8 +236,11 @@ class newpctCache(tvcache.TVCache):
 
         tvcache.TVCache.__init__(self, provider_obj)
 
-        self.minTime = 30
+        # set this 0 to suppress log line, since we aren't updating it anyways
+        self.minTime = 0
 
+    def _getRSSData(self):
+        return {'entries': []}
 
 
 provider = newpctProvider()
diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py
index cfd171f831b29a9a238dc3332f0441eed892688a..38921fb59daeefb9109ed48785645f571476ecdb 100644
--- a/sickbeard/providers/rarbg.py
+++ b/sickbeard/providers/rarbg.py
@@ -50,10 +50,10 @@ class RarbgProvider(generic.TorrentProvider):
         self.tokenExpireDate = None
 
         self.urls = {'url': u'https://rarbg.com',
-                     'token': u'http://torrentapi.org/pubapi_v2.php?get_token=get_token&format=json&app_id=sickrage',
-                     'listing': u'http://torrentapi.org/pubapi_v2.php?mode=list&app_id=sickrage',
-                     'search': u'http://torrentapi.org/pubapi_v2.php?mode=search&app_id=sickrage&search_string={search_string}',
-                     'search_tvdb': u'http://torrentapi.org/pubapi_v2.php?mode=search&app_id=sickrage&search_tvdb={tvdb}&search_string={search_string}',
+                     'token': u'http://torrentapi.org/pubapi_v2.php?get_token=get_token&format=json&app_id=sickrage2',
+                     'listing': u'http://torrentapi.org/pubapi_v2.php?mode=list&app_id=sickrage2',
+                     'search': u'http://torrentapi.org/pubapi_v2.php?mode=search&app_id=sickrage2&search_string={search_string}',
+                     'search_tvdb': u'http://torrentapi.org/pubapi_v2.php?mode=search&app_id=sickrage2&search_tvdb={tvdb}&search_string={search_string}',
                      'api_spec': u'https://rarbg.com/pubapi/apidocs.txt'}
 
         self.url = self.urls['listing']
@@ -143,8 +143,7 @@ class RarbgProvider(generic.TorrentProvider):
                 if self.minseed:
                     searchURL += self.urlOptions['seeders'].format(min_seeders=int(self.minseed))
 
-                if self.sorting:
-                    searchURL += self.urlOptions['sorting'].format(sorting=self.sorting)
+                searchURL += self.urlOptions['sorting'].format(sorting=(self.sorting if self.sorting else 'seeders', 'last')[mode is 'RSS'])
 
                 if self.ranked:
                     searchURL += self.urlOptions['ranked'].format(ranked=int(self.ranked))
diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py
index 20c3ef711aa431a314c179f661f1d5c87dfaf926..bc93864ec303f17aafd2a6421f2c3c83da408822 100644
--- a/sickbeard/providers/torrentz.py
+++ b/sickbeard/providers/torrentz.py
@@ -96,7 +96,7 @@ class TORRENTZProvider(generic.TorrentProvider):
                 entries = entries if isinstance(entries, list) else [entries]
 
                 for item in entries:
-                    if 'tv' not in item.get('category', ''):
+                    if item.get('category', None) and 'tv' not in item.get('category', ''):
                         continue
 
                     title = item.get('title', '').rsplit(' ', 1)[0].replace(' ', '.')
diff --git a/sickbeard/tv.py b/sickbeard/tv.py
index 1a54e45b8d049222076449d181ab68e3a4fbecc0..6999fb4ef6527ecc6927084fe00b245d45650141 100644
--- a/sickbeard/tv.py
+++ b/sickbeard/tv.py
@@ -2020,7 +2020,7 @@ class TVEpisode(object):
         elif self.show.air_by_date:
             return self._format_pattern('%SN - %AD - %EN')
 
-        return self._format_pattern('%SN - %Sx%0E - %EN')
+        return self._format_pattern('%SN - S%0SE%0E - %EN')
 
     def _ep_name(self):
         """
@@ -2544,10 +2544,10 @@ class TVEpisode(object):
                                + " to show air date " + time.strftime("%b %d,%Y (%H:%M)", airdatetime))
                 else:
                     logger.log(str(self.show.indexerid) + u": Unable to modify date of " + os.path.basename(self.location)
-                               + " to show air date " + time.strftime("%b %d,%Y (%H:%M)", airdatetime), logger.ERROR)
-            except Exception:
+                               + " to show air date " + time.strftime("%b %d,%Y (%H:%M)", airdatetime), logger.WARNING)
+            except Exception as e:
                 logger.log(str(self.show.indexerid) + u": Failed to modify date of '" + os.path.basename(self.location)
-                           + "' to show air date " + time.strftime("%b %d,%Y (%H:%M)", airdatetime), logger.ERROR)
+                           + "' to show air date " + time.strftime("%b %d,%Y (%H:%M)", airdatetime) + ". Error: %s" % ex(e), logger.WARNING)
 
     def __getstate__(self):
         d = dict(self.__dict__)
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index b53917465e50a892f89540eadf258ad1c232334d..1d566da15b826afc308bc63724b71a2e06322df8 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -1834,8 +1834,10 @@ class Home(WebRoot):
         t = PageTemplate(rh=self, filename="testRename.mako")
         submenu = [{'title': 'Edit', 'path': 'home/editShow?show=%d' % showObj.indexerid, 'icon': 'ui-icon ui-icon-pencil'}]
 
-        return t.render(submenu=submenu, ep_obj_list=ep_obj_rename_list, show=showObj, title='Preview Rename', header='Preview Rename',
-                    controller="home", action="previewRename")
+        return t.render(submenu=submenu, ep_obj_list=ep_obj_rename_list,
+                        show=showObj, title='Preview Rename',
+                        header='Preview Rename',
+                        controller="home", action="previewRename")
 
     def doRename(self, show=None, eps=None):
         if show is None or eps is None:
@@ -2177,10 +2179,12 @@ class HomePostProcess(Home):
 
     def index(self):
         t = PageTemplate(rh=self, filename="home_postprocess.mako")
-        return t.render(title='Post Processing', header='Post Processing', topmenu='home', controller="postprocess", action="index")
+        return t.render(title='Post Processing', header='Post Processing', topmenu='home', controller="home", action="postProcess")
 
-    def processEpisode(self, proc_dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None,
-                       is_priority=None, delete_on="0", failed="0", proc_type="auto", *args, **kwargs):
+    # TODO: PR to NZBtoMedia so that we can rename dir to proc_dir, and type to proc_type. Using names of builtins as var names is bad
+    # pylint: disable=W0622
+    def processEpisode(self, dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None,
+                       is_priority=None, delete_on="0", failed="0", type="auto", *args, **kwargs):
 
         def argToBool(argument):
             if isinstance(argument, basestring):
@@ -2195,14 +2199,14 @@ class HomePostProcess(Home):
 
             return argument
 
-        if not proc_dir:
+        if not dir:
             return self.redirect("/home/postprocess/")
         else:
             nzbName = ss(nzbName) if nzbName else nzbName
 
             result = processTV.processDir(
-                ss(proc_dir), nzbName, process_method=process_method, force=argToBool(force),
-                is_priority=argToBool(is_priority), delete_on=argToBool(delete_on), failed=argToBool(failed), proc_type=proc_type
+                ss(dir), nzbName, process_method=process_method, force=argToBool(force),
+                is_priority=argToBool(is_priority), delete_on=argToBool(delete_on), failed=argToBool(failed), proc_type=type
             )
 
             if quiet is not None and int(quiet) == 1:
@@ -2332,7 +2336,7 @@ class HomeAddShows(Home):
 
                         # default to TVDB if indexer was not detected
                         if show_name and not (indexer or indexer_id):
-                            (sn, idxr, i) = helpers.searchIndexerForShowID(show_name, indexer, indexer_id)
+                            (_, idxr, i) = helpers.searchIndexerForShowID(show_name, indexer, indexer_id)
 
                             # set indexer and indexer_id from found info
                             if not indexer and idxr:
@@ -2400,7 +2404,7 @@ class HomeAddShows(Home):
         posts them to addNewShow
         """
         t = PageTemplate(rh=self, filename="home_recommendedShows.mako")
-        return t.render(title="Recommended Shows", header="Recommended Shows", enable_anime_options=False, controller="home", action="addShows|recommendedShows")
+        return t.render(title="Recommended Shows", header="Recommended Shows", enable_anime_options=False)
 
     def getRecommendedShows(self):
         t = PageTemplate(rh=self, filename="trendingShows.mako")
@@ -2910,8 +2914,9 @@ class Manage(Home, WebRoot):
         t = PageTemplate(rh=self, filename="manage_subtitleMissed.mako")
 
         if not whichSubs:
-            return t.render(whichSubs=whichSubs, title='Episode Overview', header='Episode Overview', topmenu='manage',
-                    controller="manage", action="subtitleMissed")
+            return t.render(whichSubs=whichSubs, title='Episode Overview',
+                            header='Episode Overview', topmenu='manage',
+                            controller="manage", action="subtitleMissed")
 
         myDB = db.DBConnection()
         status_results = myDB.select(
@@ -3431,7 +3436,8 @@ class Manage(Home, WebRoot):
 
         t = PageTemplate(rh=self, filename="manage_failedDownloads.mako")
 
-        return t.render(limit=limit, failedResults=sqlResults, title='Failed Downloads', header='Failed Downloads', topmenu='manage')
+        return t.render(limit=limit, failedResults=sqlResults, title='Failed Downloads', header='Failed Downloads', topmenu='manage',
+                controller="manage", action="failedDownloads")
 
 
 @route('/manage/manageSearches(/?.*)')
@@ -3446,7 +3452,8 @@ class ManageSearches(Manage):
         return t.render(backlogPaused=sickbeard.searchQueueScheduler.action.is_backlog_paused(),
                         backlogRunning=sickbeard.searchQueueScheduler.action.is_backlog_in_progress(), dailySearchStatus=sickbeard.dailySearchScheduler.action.amActive,
                         findPropersStatus=sickbeard.properFinderScheduler.action.amActive, queueLength=sickbeard.searchQueueScheduler.action.queue_length(),
-                        title='Manage Searches', header='Manage Searches', topmenu='manage')
+                        title='Manage Searches', header='Manage Searches', topmenu='manage',
+                        controller="manage", action="manageSearches")
 
     def forceBacklog(self):
         # force it to run the next time it looks
@@ -3548,7 +3555,8 @@ class History(WebRoot):
             {'title': 'Trim History', 'path': 'history/trimHistory', 'icon': 'ui-icon ui-icon-trash', 'class': 'trimhistory', 'confirm': True},
         ]
 
-        return t.render(historyResults=data, compactResults=compact, limit=limit, submenu=submenu, title='History', header='History', topmenu="history")
+        return t.render(historyResults=data, compactResults=compact, limit=limit, submenu=submenu, title='History', header='History', topmenu="history",
+                controller="history", action="index")
 
     def clearHistory(self):
         self.history.clear()
@@ -3599,8 +3607,9 @@ class ConfigGeneral(Config):
     def index(self):
         t = PageTemplate(rh=self, filename="config_general.mako")
 
-        return t.render(title='Config - General', header='General Configuration', topmenu='config', submenu=self.ConfigMenu(),
-                controller="config", action="index")
+        return t.render(title='Config - General', header='General Configuration',
+                        topmenu='config', submenu=self.ConfigMenu(),
+                        controller="config", action="index")
 
     @staticmethod
     def generateApiKey():
@@ -3764,8 +3773,9 @@ class ConfigBackupRestore(Config):
     def index(self):
         t = PageTemplate(rh=self, filename="config_backuprestore.mako")
 
-        return t.render(submenu=self.ConfigMenu(), title='Config - Backup/Restore', header='Backup/Restore', topmenu='config',
-                controller="config", action="backupRestore")
+        return t.render(submenu=self.ConfigMenu(), title='Config - Backup/Restore',
+                        header='Backup/Restore', topmenu='config',
+                        controller="config", action="backupRestore")
 
     @staticmethod
     def backup(backupDir=None):
@@ -3826,8 +3836,9 @@ class ConfigSearch(Config):
     def index(self):
         t = PageTemplate(rh=self, filename="config_search.mako")
 
-        return t.render(submenu=self.ConfigMenu(), title='Config - Episode Search', header='Search Settings', topmenu='config',
-                controller="config", action="search")
+        return t.render(submenu=self.ConfigMenu(), title='Config - Episode Search',
+                        header='Search Settings', topmenu='config',
+                        controller="config", action="search")
 
     def saveSearch(self, use_nzbs=None, use_torrents=None, nzb_dir=None, sab_username=None, sab_password=None,
                    sab_apikey=None, sab_category=None, sab_category_anime=None, sab_category_backlog=None, sab_category_anime_backlog=None, sab_host=None, nzbget_username=None,
@@ -4125,8 +4136,9 @@ class ConfigProviders(Config):
     def index(self):
         t = PageTemplate(rh=self, filename="config_providers.mako")
 
-        return t.render(submenu=self.ConfigMenu(), title='Config - Providers', header='Search Providers', topmenu='config',
-                controller="config", action="providers")
+        return t.render(submenu=self.ConfigMenu(), title='Config - Providers',
+                        header='Search Providers', topmenu='config',
+                        controller="config", action="providers")
 
     @staticmethod
     def canAddNewznabProvider(name):
@@ -4682,7 +4694,7 @@ class ConfigNotifications(Config):
         sickbeard.PLEX_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(plex_notify_onsubtitledownload)
         sickbeard.PLEX_UPDATE_LIBRARY = config.checkbox_to_value(plex_update_library)
         sickbeard.PLEX_HOST = config.clean_hosts(plex_host)
-        sickbeard.PLEX_SERVER_HOST = config.clean_host(plex_server_host)
+        sickbeard.PLEX_SERVER_HOST = config.clean_hosts(plex_server_host)
         sickbeard.PLEX_SERVER_TOKEN = config.clean_host(plex_server_token)
         sickbeard.PLEX_USERNAME = plex_username
         sickbeard.PLEX_PASSWORD = plex_password
@@ -4843,8 +4855,9 @@ class ConfigSubtitles(Config):
     def index(self):
         t = PageTemplate(rh=self, filename="config_subtitles.mako")
 
-        return t.render(submenu=self.ConfigMenu(), title='Config - Subtitles', header='Subtitles', topmenu='config',
-                controller="config", action="subtitles")
+        return t.render(submenu=self.ConfigMenu(), title='Config - Subtitles',
+                        header='Subtitles', topmenu='config',
+                        controller="config", action="subtitles")
 
     def saveSubtitles(self, use_subtitles=None, subtitles_plugins=None, subtitles_languages=None, subtitles_dir=None,
                       service_order=None, subtitles_history=None, subtitles_finder_frequency=None,
@@ -4905,8 +4918,9 @@ class ConfigAnime(Config):
 
         t = PageTemplate(rh=self, filename="config_anime.mako")
 
-        return t.render(submenu=self.ConfigMenu(), title='Config - Anime', header='Anime', topmenu='config',
-                controller="config", action="anime")
+        return t.render(submenu=self.ConfigMenu(), title='Config - Anime',
+                        header='Anime', topmenu='config',
+                        controller="config", action="anime")
 
     def saveAnime(self, use_anidb=None, anidb_username=None, anidb_password=None, anidb_use_mylist=None,
                   split_home=None):
@@ -4953,8 +4967,9 @@ class ErrorLogs(WebRoot):
             level = logger.ERROR
 
         t = PageTemplate(rh=self, filename="errorlogs.mako")
-        return t.render(header="Logs &amp; Errors", title="Logs &amp; Errors", topmenu="system", submenu=self.ErrorLogsMenu(level), logLevel=level,
-                controller="errorlogs", action="index")
+        return t.render(header="Logs &amp; Errors", title="Logs &amp; Errors",
+                        topmenu="system", submenu=self.ErrorLogsMenu(level),
+                        logLevel=level, controller="errorlogs", action="index")
 
     @staticmethod
     def haveErrors():