diff --git a/SickBeard.py b/SickBeard.py
index 4a012f45f48fdf178664f588bf7f3c7d1830aa70..ca0115142f2d5d4c029cf2b758d8e7304ff3f8d4 100755
--- a/SickBeard.py
+++ b/SickBeard.py
@@ -349,6 +349,16 @@ class SickRage(object):
         if self.consoleLogging:
             print "Starting up SickRage " + sickbeard.BRANCH + " from " + sickbeard.CONFIG_FILE
 
+        # Clean up after update
+        if sickbeard.GIT_NEWVER:
+            toclean = os.path.join(sickbeard.CACHE_DIR, 'mako')
+            for root, dirs, files in os.walk(toclean, topdown=False):
+                for name in files:
+                    os.remove(os.path.join(root, name))
+                for name in dirs:
+                    os.rmdir(os.path.join(root, name))
+            sickbeard.GIT_NEWVER = False
+
         # Fire up all our threads
         sickbeard.start()
 
diff --git a/gui/slick/images/network/colors.png b/gui/slick/images/network/colors.png
new file mode 100644
index 0000000000000000000000000000000000000000..d694d92c97ed7e9e98a555bfd00ad3a0d38eb7f2
Binary files /dev/null and b/gui/slick/images/network/colors.png differ
diff --git a/gui/slick/images/providers/getstrike.png b/gui/slick/images/providers/getstrike.png
new file mode 100644
index 0000000000000000000000000000000000000000..a857f5ff2ff01a19cacb5317669646091a10348b
Binary files /dev/null and b/gui/slick/images/providers/getstrike.png differ
diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako
index 08008cc050cb55ca8c42427efdd4d23ca8243a48..2c2b0db61b11982e6836b72ccde2d98ce78a666f 100644
--- a/gui/slick/views/config_anime.mako
+++ b/gui/slick/views/config_anime.mako
@@ -35,7 +35,7 @@
                             <input type="checkbox" class="enabler" name="use_anidb" id="use_anidb" ${('', 'checked="checked"')[bool(sickbeard.USE_ANIDB)]} />
                             <label for="use_notifo">
                                 <span class="component-title">Enable</span>
-                                <span class="component-desc">Should Sick Beard use data from AniDB?</span>
+                                <span class="component-desc">Should SickRage use data from AniDB?</span>
                             </label>
                         </div>
 
diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako
index 1d17f1306f17cb9e4893ee4766af9aaec4d609d8..36fdcbbe0b7f5d97b4b065a542034fdee2543492 100644
--- a/gui/slick/views/home.mako
+++ b/gui/slick/views/home.mako
@@ -386,10 +386,6 @@ $(document).ready(function(){
           $.tablesorter.columnSelector.attachTo( $('#showListTableAnime'), '#popover-target');
           % endif
         });
-
-        // Hides size column for now until we can fix it
-        $('[data-show-size]').hide();
-        $('[data-column="6"]').hide();
 });
 </script>
 </%block>
diff --git a/gui/slick/views/viewlogs.mako b/gui/slick/views/viewlogs.mako
index 26e0a720ced0cf145203b36fd95afae5bdc9e086..c9b955c6d18e88681873c355c31eebf7d19c85c1 100644
--- a/gui/slick/views/viewlogs.mako
+++ b/gui/slick/views/viewlogs.mako
@@ -19,6 +19,7 @@ function(){
         $('#logSearch').prop('disabled', true);
         url = '${sbRoot}/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val()
         $.get(url, function(data){
+            history.pushState('data', '', url);
             $('pre').html($(data).find('pre').html());
             $('#minLevel').removeProp('disabled');
             $('#logFilter').removeProp('disabled');
@@ -40,14 +41,20 @@ function(){
         document.body.style.cursor='default';
     });
 
-    $('#logSearch').keyup(function() {
+    $('#logSearch').on('keyup', function() {
         if ( $('#logSearch').val().length == 0 ) {
-            $('#logFilter option[value=\\<NONE\\>]').prop('selected', true);
+            $('#logFilter option[value=<NONE>]').prop('selected', true);
             $('#minLevel option[value=20]').prop('selected', true);
             $('#minLevel').prop('disabled', false);
             $('#logFilter').prop('disabled', false);
             url = '${sbRoot}/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val()
-            window.location.href = url
+            $.get(url, function(data){
+                history.pushState('data', '', url);
+                $('pre').html($(data).find('pre').html());
+                $('#minLevel').removeProp('disabled');
+                $('#logFilter').removeProp('disabled');
+                $('#logSearch').removeProp('disabled');
+            });
         } else {
             $('#minLevel').prop('disabled', true);
             $('#logFilter').prop('disabled', true);
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index 523e52e78e92c9bd4a6ae01e9c2919ac97103266..319de37564c3c3ccf9545d35468a2d8f25962b38 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -39,7 +39,7 @@ from sickbeard import providers
 from sickbeard.providers.generic import GenericProvider
 from sickbeard.providers import btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \
     omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, bluetigers, cpasbien, fnt, xthor, torrentbytes, \
-    frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, scenetime, btdigg
+    frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, scenetime, btdigg, strike
 from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \
     naming_ep_type
 from sickbeard import searchBacklog, showUpdater, versionChecker, properFinder, autoPostProcesser, \
@@ -135,6 +135,7 @@ GIT_USERNAME = None
 GIT_PASSWORD = None
 GIT_PATH = None
 GIT_AUTOISSUES = False
+GIT_NEWVER = False
 DEVELOPER = False
 
 INIT_LOCK = Lock()
@@ -558,7 +559,7 @@ def get_backlog_cycle_time():
 def initialize(consoleLogging=True):
     with INIT_LOCK:
 
-        global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, ENCRYPTION_SECRET, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, WEB_COOKIE_SECRET, WEB_USE_GZIP, API_KEY, API_ROOT, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \
+        global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, GIT_NEWVER, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, ENCRYPTION_SECRET, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, WEB_COOKIE_SECRET, WEB_USE_GZIP, API_KEY, API_ROOT, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \
             HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, SAB_FORCED, TORRENT_METHOD, \
             SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, SAB_CATEGORY_ANIME, SAB_HOST, \
             NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_CATEGORY_ANIME, NZBGET_PRIORITY, NZBGET_HOST, NZBGET_USE_HTTPS, backlogSearchScheduler, \
@@ -639,6 +640,7 @@ def initialize(consoleLogging=True):
         # git login info
         GIT_USERNAME = check_setting_str(CFG, 'General', 'git_username', '')
         GIT_PASSWORD = check_setting_str(CFG, 'General', 'git_password', '', censor_log=True)
+        GIT_NEWVER = bool(check_setting_int(CFG, 'General', 'git_newver', 0))
         DEVELOPER = bool(check_setting_int(CFG, 'General', 'developer', 0))
 
         # debugging
@@ -1619,6 +1621,7 @@ def save_config():
     new_config['General']['git_remote_url'] = GIT_REMOTE_URL
     new_config['General']['cur_commit_hash'] = CUR_COMMIT_HASH
     new_config['General']['cur_commit_branch'] = CUR_COMMIT_BRANCH
+    new_config['General']['git_newver'] = int(GIT_NEWVER)
     new_config['General']['config_version'] = CONFIG_VERSION
     new_config['General']['encryption_version'] = int(ENCRYPTION_VERSION)
     new_config['General']['encryption_secret'] = ENCRYPTION_SECRET
diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py
index 6121ba7ee2bd6a4d0e6382236a1193e226a97635..d30caaede43f352f0220782a6ac7201e6974fe55 100644
--- a/sickbeard/providers/__init__.py
+++ b/sickbeard/providers/__init__.py
@@ -52,6 +52,7 @@ __all__ = ['womble',
            'xthor',
            'scenetime',
            'btdigg',
+		   'strike',
 ]
 
 import sickbeard
diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b55d426ffb767e7fbe8d2722c2f7259fa988262
--- /dev/null
+++ b/sickbeard/providers/strike.py
@@ -0,0 +1,167 @@
+# Author: matigonkas
+# URL: https://github.com/SiCKRAGETV/sickrage
+#
+# This file is part of SickRage.
+#
+# SickRage is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# SickRage is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with SickRage.  If not, see <http://www.gnu.org/licenses/>.
+
+import datetime
+import generic
+
+from sickbeard import logger
+from sickbeard import tvcache
+from sickbeard import show_name_helpers
+from sickbeard import db
+from sickbeard.common import WANTED
+from sickbeard.config import naming_ep_type
+from sickbeard.helpers import sanitizeSceneName
+
+class STRIKEProvider(generic.TorrentProvider):
+
+    def __init__(self):
+        generic.TorrentProvider.__init__(self, "Strike")
+
+        self.supportsBacklog = True
+        self.url = 'https://getstrike.net/'
+
+        self.cache = StrikeCache(self)
+        self.minseed, self.minleech = 2 * [None]
+		
+    def isEnabled(self):
+        return self.enabled
+
+
+    def imageName(self):
+        return 'getstrike.png'
+
+
+    def _get_airbydate_season_range(self, season):
+        if season == None:
+            return ()
+        year, month = map(int, season.split('-'))
+        min_date = datetime.date(year, month, 1)
+        if month == 12:
+            max_date = datetime.date(year, month, 31)
+        else:
+            max_date = datetime.date(year, month+1, 1) -  datetime.timedelta(days=1)
+        return (min_date, max_date)
+
+
+    def _get_season_search_strings(self, show, season=None):
+        search_string = []
+
+        if not (show and season):
+            return []
+
+        myDB = db.DBConnection()
+
+        if show.air_by_date:
+            (min_date, max_date) = self._get_airbydate_season_range(season)
+            sqlResults = myDB.select("SELECT DISTINCT airdate FROM tv_episodes WHERE showid = ? AND airdate >= ? AND airdate <= ? AND status = ?", [show.tvdbid,  min_date.toordinal(), max_date.toordinal(), WANTED])
+        else:
+            sqlResults = myDB.select("SELECT DISTINCT season FROM tv_episodes WHERE showid = ? AND season = ? AND status = ?", [show.tvdbid, season, WANTED])
+
+        for sqlEp in sqlResults:
+            for show_name in set(show_name_helpers.allPossibleShowNames(show)):
+                if show.air_by_date:
+                    ep_string = sanitizeSceneName(show_name) +' '+ str(datetime.date.fromordinal(sqlEp["airdate"])).replace('-', '.')
+                    search_string.append(ep_string)
+                else:
+                    ep_string = sanitizeSceneName(show_name) + ' S%02d' % sqlEp["season"]
+                    search_string.append(ep_string)
+
+        return search_string
+
+
+    def _get_episode_search_strings(self, ep_obj, add_string=''):
+
+        if not ep_obj:
+            return []
+
+        search_string = []
+
+        for show_name in set(show_name_helpers.allPossibleShowNames(ep_obj.show)):
+            ep_string = sanitizeSceneName(show_name)
+            if ep_obj.show.air_by_date:
+                ep_string += ' ' + str(ep_obj.airdate).replace('-', '.')
+            else:
+                ep_string += ' ' + naming_ep_type[2] % {'seasonnumber': ep_obj.season, 'episodenumber': ep_obj.episode}
+
+            if len(add_string):
+                ep_string += ' %s' % add_string
+
+            search_string.append(ep_string)
+
+        return search_string
+
+
+    def _get_title_and_url(self, item):
+        title, url, size = item
+        if title:
+            title = self._clean_title_from_provider(title)
+
+        if url:
+            url = str(url).replace('&amp;', '&')
+
+        return (title, url)
+
+
+    def _get_size(self, item):
+        title, url, size = item
+        logger.log(u'Size: %s' % size, logger.DEBUG)
+
+        return size
+
+
+    def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None):
+
+        logger.log("Performing Search: {0}".format(search_params))
+
+        searchUrl = self.url + "api/v2/torrents/search/?category=TV&phrase=" + search_params
+
+        jdata = self.getURL(searchUrl, json=True)
+        if not jdata:
+            logger.log("No data returned to be parsed!!!")
+            return []
+
+        logger.log("URL to be parsed: " + searchUrl, logger.DEBUG)
+
+        results = []
+
+        for item in jdata['torrents']:
+            seeders = ('seeds' in item and item['seeds']) or 0
+            leechers = ('leeches' in item and item['leeches']) or 0
+            if seeders < self.minseed or leechers < self.minleech:
+                continue
+            name = ('torrent_title' in item and item['torrent_title']) or ''
+            magnet = ('magnet_uri' in item and item['magnet_uri']) or ''
+            if name and magnet:
+                results.append((name, magnet, seeders))
+
+        return results
+
+
+class StrikeCache(tvcache.TVCache):
+    def __init__(self, provider):
+
+        tvcache.TVCache.__init__(self, provider)
+
+        # set this 0 to suppress log line, since we aren't updating it anyways
+        self.minTime = 0
+
+    def _getRSSData(self):
+        # no rss for getstrike.net afaik, also can't search with empty string
+        return {'entries': {}}
+
+provider = STRIKEProvider()
diff --git a/sickbeard/versionChecker.py b/sickbeard/versionChecker.py
index 93e21f3f41be9c6f14aa32ea54608cb54e1dc619..dc81800ec12f43945b2adfc0917cc64f1ad91884 100644
--- a/sickbeard/versionChecker.py
+++ b/sickbeard/versionChecker.py
@@ -59,7 +59,7 @@ class CheckVersion():
                 self.updater = SourceUpdateManager()
 
     def run(self, force=False):
-        
+
         self.amActive = True
 
         if self.updater:
@@ -78,7 +78,7 @@ class CheckVersion():
                         else:
                             logger.log(u"Update failed!")
                             ui.notifications.message('Update failed!')
-                            
+
         self.amActive = False
 
     def run_backup_if_safe(self):
@@ -470,7 +470,7 @@ class GitUpdateManager(UpdateManager):
         output, err, exit_status = self._run_git(self._git_path, 'fetch %s' % sickbeard.GIT_REMOTE)
 
         if not exit_status == 0:
-            logger.log(u"Unable to contact github, can't check for update", logger.ERROR)
+            logger.log(u"Unable to contact github, can't check for update", logger.WARNING)
             return
 
         # get latest commit_hash from remote
@@ -575,13 +575,21 @@ class GitUpdateManager(UpdateManager):
             output, err, exit_status = self._run_git(self._git_path, 'checkout -f ' + self.branch)  # @UnusedVariable
 
         if exit_status == 0:
-            self._find_installed_version()
+            output, err, exit_status = self._run_git(self._git_path, 'submodule update --init --recursive --force ' + self.branch)
 
-            # Notify update successful
-            if sickbeard.NOTIFY_ON_UPDATE:
-                notifiers.notify_git_update(sickbeard.CUR_COMMIT_HASH if sickbeard.CUR_COMMIT_HASH else "")
+            if exit_status == 0:
+                self._find_installed_version()
+                sickbeard.GIT_NEWVER = True
+
+                # Notify update successful
+                if sickbeard.NOTIFY_ON_UPDATE:
+                    notifiers.notify_git_update(sickbeard.CUR_COMMIT_HASH if sickbeard.CUR_COMMIT_HASH else "")
+
+                return True
+
+            else:
+                return False
 
-            return True
         else:
             return False