diff --git a/.build/.bowerrc b/.build/.bowerrc
new file mode 100644
index 0000000000000000000000000000000000000000..69fad358018d530235f8e43c483d3ce960616a32
--- /dev/null
+++ b/.build/.bowerrc
@@ -0,0 +1,3 @@
+{
+  "directory": "bower_components"
+}
diff --git a/.build/Gruntfile.js b/.build/Gruntfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ae24b022b7995c50f798f23108b722e70a733c2
--- /dev/null
+++ b/.build/Gruntfile.js
@@ -0,0 +1,35 @@
+module.exports = function(grunt) {
+    grunt.initConfig({
+        bower_concat: {
+            all: {
+                dest: '../gui/slick/js/_bower.js',
+                // cssDest: 'gui/slick/css/_bower.css',
+                exclude: [
+                    // 'jquery',
+                    // 'modernizr'
+                ],
+                dependencies: {
+                    // 'underscore': 'jquery',
+                    // 'backbone': 'underscore',
+                    // 'jquery-mousewheel': 'jquery'
+                },
+                bowerOptions: {
+                    relative: false
+                },
+            }
+        },
+        uglify: {
+            my_target: {
+                files: {
+                    '../gui/slick/js/_bower.min.js': ['../gui/slick/js/_bower.js']
+                }
+            }
+        }
+    });
+
+    grunt.loadNpmTasks('grunt-bower-concat');
+    grunt.loadNpmTasks('grunt-contrib-uglify');
+
+    grunt.registerTask('default', ['bower_concat', 'uglify']);
+
+};
diff --git a/.build/bower.json b/.build/bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..940c5f26fcfb19964f218d1765f772b598dd4261
--- /dev/null
+++ b/.build/bower.json
@@ -0,0 +1,23 @@
+{
+  "name": "SickRage",
+  "version": "4.0.72",
+  "private": true,
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+    "jquery": "~2.1.4",
+    "bootstrap": "~3.3.5",
+    "bootstrap-hover-dropdown": "~2.1.3",
+    "jquery-ui": "~1.11.4",
+    "tablesorter": "jquery.tablesorter#~2.23.5",
+    "jquery-form": "~3.46.0",
+    "jquery-timeago": "~1.4.3",
+    "jquery-tokeninput": "~1.7.0",
+    "bootstrap3-typeahead": "~3.1.1"
+  }
+}
diff --git a/.build/package.json b/.build/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..cada201ee611225dd7d68b3ac51f0db63181c017
--- /dev/null
+++ b/.build/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "sickrage",
+  "version": "4.0.72",
+  "private": true,
+  "dependencies": {
+    "grunt": "^0.4.5",
+    "grunt-bower-concat": "^0.5.0",
+    "grunt-contrib-uglify": "^0.9.2"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/OmgImAlexis/SickRage.git"
+  },
+  "bugs": {
+    "url": "https://github.com/OmgImAlexis/SickRage/issues"
+  },
+  "homepage": "https://github.com/OmgImAlexis/SickRage#readme"
+}
diff --git a/.gitignore b/.gitignore
index 2db538360d4a7e695c057c5448e2767d07556679..e17cfc889383a407336fd939bdb57adfb7c3d6bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,8 @@
 #  SR User Related   #
 ######################
-cache*/
-Logs/
+/cache/
+/Logs/
+/data/
 restore/
 backup*/
 cache.db*
@@ -14,11 +15,12 @@ server.key
 
 #  SR Test Related   #
 ######################
-/tests/Logs/*
-/tests/cache/*
+/tests/Logs/
+/tests/cache/
 /tests/sickbeard.db*
 /tests/cache.db*
 /tests/failed.db
+/tests/data/
 
 #  Compiled source   #
 ######################
@@ -57,3 +59,9 @@ Thumbs.db
 # Unrar Executable   #
 ######################
 lib/unrar2/UnRAR.exe
+
+# Bower #
+######################
+bower_components
+node_modules
+gui/**/_bower.js
diff --git a/gui/slick/js/_bower.min.js b/gui/slick/js/_bower.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..91e9e09910f4f92bd16a2013b4b8ff0d744f4093
Binary files /dev/null and b/gui/slick/js/_bower.min.js differ
diff --git a/gui/slick/js/script.js b/gui/slick/js/script.js
index b56e6bc73e00c80c76fed377fb225cb46b5ea5b2..62b1e0a4a9168c40cf0f16ce92e48cf85b181073 100644
--- a/gui/slick/js/script.js
+++ b/gui/slick/js/script.js
@@ -3,79 +3,15 @@ var srRoot = getMeta('srRoot'),
     anonURL = getMeta('anonURL'),
     top_image_html = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />';
 
-function initHeader() {
-    //settings
-    var header = $("#header");
-    var fadeSpeed = 100, fadeTo = 0.8, topDistance = 20;
-    var topbarME = function () {
-        $(header).fadeTo(fadeSpeed, 1);
-    }, topbarML = function () {
-        $(header).fadeTo(fadeSpeed, fadeTo);
-    };
-    var inside = false;
-    //do
-    $(window).scroll(function () {
-        position = $(window).scrollTop();
-        if (position > topDistance && !inside) {
-            //add events
-            topbarML();
-            $(header).bind('mouseenter', topbarME);
-            $(header).bind('mouseleave', topbarML);
-            inside = true;
-        }
-        else if (position < topDistance) {
-            topbarME();
-            $(header).unbind('mouseenter', topbarME);
-            $(header).unbind('mouseleave', topbarML);
-            inside = false;
-        }
-    });
-}
-
-
-function showMsg(msg, loader, timeout, ms) {
-    var feedback = $("#ajaxMsg");
-    update = $("#updatebar");
-    if (update.is(":visible")) {
-        var height = update.height() + 35;
-        feedback.css("bottom", height + "px");
-    } else {
-        feedback.removeAttr("style");
-    }
-    feedback.fadeIn();
-    var tmpMessage = $("<div class='msg'>" + msg + "</div>");
-    var message = loader ? $("<div class='msg'><img src='interfaces/default/images/loader_black.gif' alt='loading' class='loader' style='position: relative;top:10px;margin-top:-15px; margin-left:-10px;'/>" + msg + "</div>") : tmpMessage;
-    if (loader) feedback.css("padding", "14px 10px");
-    $(feedback).prepend(message);
-    if (timeout) {
-        setTimeout(function () {
-            message.fadeOut(function () {
-                $(this).remove();
-                feedback.fadeOut();
-            });
-        }, ms);
-    }
-}
-
-function resetFilters(text) {
-    if ($(".dataTables_filter").length > 0) $(".dataTables_filter input").attr("placeholder", "filter " + text + "");
-}
-
-function initTabs() {
+$(document).ready(function () {
     $("#config-components").tabs({
         activate: function (event, ui) {
+            var lastOpenedPanel = $(this).data("lastOpenedPanel"),
+                selected = $(this).tabs('option', 'selected');
 
-            var lastOpenedPanel = $(this).data("lastOpenedPanel");
-            var selected = $(this).tabs('option', 'selected');
+            if (!lastOpenedPanel) lastOpenedPanel = $(ui.oldPanel);
 
-            if (lastOpenedPanel) {
-            } else {
-                lastOpenedPanel = $(ui.oldPanel);
-            }
-
-            if (!$(this).data("topPositionTab")) {
-                $(this).data("topPositionTab", $(ui.newPanel).position().top);
-            }
+            if (!$(this).data("topPositionTab")) $(this).data("topPositionTab", $(ui.newPanel).position().top);
 
             //Dont use the builtin fx effects. This will fade in/out both tabs, we dont want that
             //Fadein the new tab yourself
@@ -98,15 +34,9 @@ function initTabs() {
 
             //Saving the last tab has been opened
             $(this).data("lastOpenedPanel", $(ui.newPanel));
-
         }
-
     });
-}
-$(document).ready(function () {
-    initHeader();
-    initTabs();
-    $(document).anchor();
+
     $('.dropdown-toggle').dropdownHover();
     if(metaToBool('sickbeard.FUZZY_DATING')){
         $.timeago.settings.allowFuture = true;
diff --git a/gui/slick/views/apiBuilder.mako b/gui/slick/views/apiBuilder.mako
index 9e5a6bdf7203805fce643c889fe4bd7ff211894e..8f91c4c768a3163f24a627acfc8d02e3603af422 100644
--- a/gui/slick/views/apiBuilder.mako
+++ b/gui/slick/views/apiBuilder.mako
@@ -166,9 +166,7 @@
 var commands = ${sorted(commands)};
 var episodes = ${episodes};
 </script>
-<script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script>
-<script type="text/javascript" src="${srRoot}/js/lib/bootstrap.min.js?${sbPID}"></script>
-<script type="text/javascript" src="${srRoot}/js/lib/bootstrap3-typeahead.min.js?${sbPID}"></script>
+<script type="text/javascript" src="${srRoot}/js/_bower.min.js?${sbPID}"></script>
 <script type="text/javascript" src="${srRoot}/js/apibuilder.js?${sbPID}"></script>
 </body>
 </html>
diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako
index e1b10e200a59a3c02d9b5488b3b57f7a8837dfaf..bc4681f545cc9eb6d9eb0689a5a15fcbdb83829e 100644
--- a/gui/slick/views/config_general.mako
+++ b/gui/slick/views/config_general.mako
@@ -611,7 +611,7 @@
                                 </span>
                             </label>
                         </div>
-                        
+
                         <div class="field-pair">
                             <label for="skip_removed_files">
                                 <span class="component-title">Skip Remove Detection</span>
@@ -619,11 +619,11 @@
                                 <input type="checkbox" name="skip_removed_files" id="skip_removed_files" ${('', 'checked="checked"')[bool(sickbeard.SKIP_REMOVED_FILES)]}/>
                                 <p>Skip detection of removed files. If disable it will set default deleted status</p>
                                  </span>
-                                <div class="clear-left">  
+                                <div class="clear-left">
                                 <span class="component-desc"><b>NOTE:</b> This may mean SickRage misses renames as well</span>
-                                </div>                                
+                                </div>
                         </div>
-                        
+
                         <div class="field-pair">
                             <label for="ep_default_deleted_status">
                                 <span class="component-title">Default deleted episode status:</span>
@@ -643,7 +643,7 @@
                                         <input type="hidden" name="ep_default_deleted_status" value="${sickbeard.EP_DEFAULT_DELETED_STATUS}" />
 % endif
                                     <span>Define the status to be set for media file that has been deleted.</span>
-                                    <div class="clear-left">                                    
+                                    <div class="clear-left">
                                     <p> <b>NOTE:</b> Archived option will keep previous downloaded quality</p>
                                     <p>Example: Downloaded (1080p WEB-DL) ==> Archived (1080p WEB-DL)</p>
                                     </div>
diff --git a/gui/slick/views/config_subtitles.mako b/gui/slick/views/config_subtitles.mako
index 98d9bb97ce0bc576a566fe22232b460f1232d55a..8711862e4d7852290051a9770d950fb378b64b78 100644
--- a/gui/slick/views/config_subtitles.mako
+++ b/gui/slick/views/config_subtitles.mako
@@ -7,7 +7,6 @@
 <%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 type="text/javascript" src="${srRoot}/js/lib/jquery.tokeninput.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/editShow.mako b/gui/slick/views/editShow.mako
index 411e84642ae9fefb25f3eeda8bcc5a272b0f0ea2..68fdc8f5e4d33ad465e8e2a280d738ce193bea51 100644
--- a/gui/slick/views/editShow.mako
+++ b/gui/slick/views/editShow.mako
@@ -65,6 +65,11 @@ This will <b>affect the episode show search</b> on nzb and torrent provider.<br
 <%include file="/inc_qualityChooser.mako"/>
 <br />
 
+<b>Archive on first match:</b>
+<input type="checkbox" name="archive_firstmatch" ${('', 'checked="checked"')[show.archive_firstmatch == 1]} /><br>
+(check this to have the episode archived after the first best match is found from your archive quality list)</br>
+<br />
+
 <b>Default Episode Status:</b><br />
 (this will set the status for future episodes)<br />
 <select name="defaultEpStatus" id="defaultEpStatusSelect" class="form-control form-control-inline input-sm">
@@ -115,13 +120,6 @@ This will <b>affect the episode show search</b> on nzb and torrent provider.<br
 (check this if you wish to use the DVD order instead of the Airing order. A "Force Full Update" is necessary, and if you have existing episodes you need to move them)
 <br/><br/>
 
-% if anyQualities + bestQualities:
-<b>Archive on first match:</b>
-<input type="checkbox" name="archive_firstmatch" ${('', 'checked="checked"')[show.archive_firstmatch == 1]} /><br>
-(check this to have the episode archived after the first best match is found from your archive quality list)</br>
-<br />
-% endif
-
 <b>Ignored Words:</b></br>
 <input type="text" name="rls_ignore_words" id="rls_ignore_words" value="${show.rls_ignore_words}" class="form-control form-control-inline input-sm input350" /><br />
 Results with one or more word from this list will be ignored<br />
diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako
index 190e8176ffa5f56f00042af04e224a294798875c..b1843c5a0371e910cd7217491ca84410f2a81f2f 100644
--- a/gui/slick/views/layouts/main.mako
+++ b/gui/slick/views/layouts/main.mako
@@ -339,26 +339,20 @@
                 </div>
             </div>
         </footer>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery-2.1.4.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/bootstrap.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/bootstrap-hover-dropdown.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/bootstrap-anchor.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery-ui-1.10.4.custom.min.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/_bower.min.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookie.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/pnotify.custom.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.form-3.35.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.confirm.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/jquery.timeago.js?${sbPID}"></script>
-        <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script>
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower -->
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower -->
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower -->
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script><!-- Can't be added to bower -->
+        <script type="text/javascript" src="${srRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script><!-- Can't be added to bower -->
+        <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/jquery.confirm.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/lib/pnotify.custom.min.js?${sbPID}"></script><!-- Needs to be removed -->
         <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/new/meta.js?${sbPID}"></script>
         <script type="text/javascript" src="${srRoot}/js/script.js?${sbPID}"></script>
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index f1ceb705ccdb9ec014926791c76ac449f57ef03d..33c2f5c54ad645ac973621d214f2d51ada12ce26 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -728,14 +728,19 @@ def initialize(consoleLogging=True):
 
                 restoreCache(os.path.join(restoreDir, 'cache'), CACHE_DIR)
         except Exception as e:
-            logger.log(u"Restore: restoring cache failed: {0}".format(str(e)), logger.ERROR)
+            logger.log(u"Restore: restoring cache failed: {0}".format(ex(e)), logger.ERROR)
         finally:
             if os.path.exists(os.path.join(DATA_DIR, 'restore')):
                 try:
                     shutil.rmtree(os.path.join(DATA_DIR, 'restore'))
-                    shutil.rmtree(os.path.join(CACHE_DIR, 'mako'))
                 except Exception as e:
-                    logger.log(u"Restore: Unable to remove the restore directory: {0}".format(str(e)), logger.ERROR)
+                    logger.log(u"Restore: Unable to remove the restore directory: {0}".format(ex(e)), logger.ERROR)
+
+                for cleanupDir in ['mako', 'sessions', 'indexers']:
+                    try:
+                        shutil.rmtree(os.path.join(CACHE_DIR, cleanupDir))
+                    except Exception as e:
+                        logger.log(u"Restore: Unable to remove the cache/{0} directory: {1}".format(cleanupDir, ex(e)), logger.WARNING)
 
 
         GUI_NAME = check_setting_str(CFG, 'GUI', 'gui_name', 'slick')
diff --git a/sickbeard/common.py b/sickbeard/common.py
index a535d872752bd851a12b0ff8cf8ddd183b60f7a3..ac2b008fdea82e79473662c3ed8b8ddd641f5a4d 100644
--- a/sickbeard/common.py
+++ b/sickbeard/common.py
@@ -265,7 +265,7 @@ class Quality:
 
             return ret
 
-        if checkName([r"([sp]d.?tv|hd.?tv|dsr|tv(rip|mux)).(xvid|x26[45]|h.?26[45])"], all) and not checkName([r"(720|1080)[pi]"], all) and\
+        if checkName([r"([sp]d.?tv|hd.?tv|dsr|tv(rip|mux)|satrip).(xvid|x26[45]|h.?26[45])"], all) and not checkName([r"(720|1080)[pi]"], all) and\
                 not checkName([r"hr.ws.pdtv.x26[45]"], any):
             ret = Quality.SDTV
         elif checkName([r"web.?dl|web(rip|mux)", r"xvid|x26[45]|h.?26[45]"], all) and not checkName([r"(720|1080)[pi]"], all):
diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index b60ddf5486bcfa39629119a3b91ca106eba219b8..56480802e0e4dd1f9260c0c203c8f8652941752f 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -142,6 +142,7 @@ def remove_non_release_groups(name):
                        r'\[eztv\]$':        'searchre',
                        r'\[ettv\]$':        'searchre',
                        r'\[vtv\]$':         'searchre',
+                       r'\[EtHD\]$':        'searchre',
                        r'\[GloDLS\]$':      'searchre',
                        r'\[silv4\]$':       'searchre',
                        r'\[Seedbox\]$':     'searchre',
diff --git a/sickbeard/logger.py b/sickbeard/logger.py
index 58bee81604a2031c3d2ef0f27bae741f3ce2f33b..7f40c20ab621cb3cd54923e45dee7514335784e4 100644
--- a/sickbeard/logger.py
+++ b/sickbeard/logger.py
@@ -27,6 +27,7 @@ import logging.handlers
 import threading
 import platform
 import locale
+import traceback
 
 import sickbeard
 from sickbeard import classes
@@ -164,10 +165,13 @@ class Logger(object):
             sys.exit(1)
 
     def submit_errors(self):
+
+        submitter_result = u''
+        issue_id = None
         # pylint: disable=R0912,R0914,R0915
         if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0):
-            self.log('Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!')
-            return
+            submitter_result = u'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!'
+            return submitter_result, issue_id
 
         try:
             from sickbeard.versionChecker import CheckVersion
@@ -175,15 +179,16 @@ class Logger(object):
             checkversion.check_for_new_version()
             commits_behind = checkversion.updater.get_num_commits_behind()
         except Exception:
-            self.log('Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!')
-            return
+            submitter_result = u'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!'
+            return submitter_result, issue_id
 
         if commits_behind is None or commits_behind > 0:
-            self.log('Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!')
-            return
+            submitter_result = u'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!'
+            return  submitter_result, issue_id
 
         if self.submitter_running:
-            return 'RUNNING'
+            submitter_result = u'Issue submitter is running, please wait for it to complete'
+            return submitter_result, issue_id
 
         self.submitter_running = True
 
@@ -261,32 +266,39 @@ class Logger(object):
                 reports = gh.get_organization(gh_org).get_repo(gh_repo).get_issues(state="all")
 
                 issue_found = False
-                issue_id = 0
                 for report in reports:
                     if title_Error == report.title:
-                        comment = report.create_comment(message)
-                        if comment:
-                            issue_id = report.number
-                            self.log('Commented on existing issue #%s successfully!' % issue_id)
-                            issue_found = True
+                        issue_id = report.number
+                        if not report.locked:
+                            if report.create_comment(message):
+                                submitter_result = u'Commented on existing issue #%s successfully!' % issue_id
+                            else:
+                                submitter_result = u'Failed to comment on found issue #%s!' % issue_id
+                        else:
+                            submitter_result = u'Issue #%s is locked, check github to find info about the error.' % issue_id
+
+                        issue_found = True
                         break
 
                 if not issue_found:
                     issue = gh.get_organization(gh_org).get_repo(gh_repo).create_issue(title_Error, message)
                     if issue:
                         issue_id = issue.number
-                        self.log('Your issue ticket #%s was submitted successfully!' % issue_id)
+                        submitter_result = u'Your issue ticket #%s was submitted successfully!' % issue_id
+                    else:
+                        submitter_result = u'Failed to create a new issue!'
 
-                # clear error from error list
-                classes.ErrorViewer.errors.remove(curError)
+                if issue_id:
+                    # clear error from error list
+                    classes.ErrorViewer.errors.remove(curError)
 
-                self.submitter_running = False
-                return issue_id
         except Exception as e:
-            self.log(ex(e), ERROR)
-
-        self.submitter_running = False
-
+            self.log(traceback.format_exc(), ERROR)
+            submitter_result = u'Exception generated in issue submitter, please check the log'
+            issue_id = None
+        finally:
+            self.submitter_running = False
+            return submitter_result, issue_id
 
 # pylint: disable=R0903
 class Wrapper(object):
diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py
index acf9677a0538207ef6719d34d30bac9d14d72bad..a4c7a8787c5c044c6777abc259dabafdc75855ad 100644
--- a/sickbeard/providers/t411.py
+++ b/sickbeard/providers/t411.py
@@ -172,7 +172,7 @@ class T411Provider(generic.TorrentProvider):
 
                         if not torrents:
                             logger.log(u"The Data returned from " + self.name + " do not contains any torrent",
-                                       logger.WARNING)
+                                       logger.DEBUG)
                             continue
 
                         for torrent in torrents:
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index b7bf5bf0622ec076856e256a29d6d2783ae02323..c5434f2dfb0acbb95a5f392bfbd15a43ddd268fa 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -4909,7 +4909,7 @@ class ErrorLogs(WebRoot):
         else:
             classes.ErrorViewer.clear()
 
-        return self.redirect("/errorlogs/")
+        return self.redirect("/errorlogs/viewlog/")
 
     def viewlog(self, minLevel=logger.INFO, logFilter="<NONE>",logSearch=None, maxLines=500):
 
@@ -5004,10 +5004,8 @@ class ErrorLogs(WebRoot):
             ui.notifications.error("Missing information", "Please set your GitHub username and password in the config.")
             logger.log(u'Please set your GitHub username and password in the config, unable to submit issue ticket to GitHub!')
         else:
-            issue_id = logger.submit_errors()
-            if issue_id == 'RUNNING':
-                ui.notifications.message('Issue submitter is running, please wait for it to complete')
-            elif issue_id:
-                ui.notifications.message('Your issue ticket #%s was submitted successfully!' % issue_id)
+            submitter_result, issue_id = logger.submit_errors()
+            logger.log(submitter_result, (logger.INFO, logger.WARNING)[issue_id is None])
+            ui.notifications.message(submitter_result)
 
         return self.redirect("/errorlogs/")