diff --git a/gui/slick/images/network/american heroes channel.png b/gui/slick/images/network/american heroes channel.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c95a0685f5f3c1564f4ece6a512d35c73824372
Binary files /dev/null and b/gui/slick/images/network/american heroes channel.png differ
diff --git a/gui/slick/images/network/bravo (us).png b/gui/slick/images/network/bravo (us).png
new file mode 100644
index 0000000000000000000000000000000000000000..41329084916114564fcac8d16c82d27c295108e9
Binary files /dev/null and b/gui/slick/images/network/bravo (us).png differ
diff --git a/gui/slick/images/network/channel 5.png b/gui/slick/images/network/channel 5.png
new file mode 100644
index 0000000000000000000000000000000000000000..9108b16ff6ceff7adeffe0de48bc193b0e54250d
Binary files /dev/null and b/gui/slick/images/network/channel 5.png differ
diff --git a/gui/slick/images/network/chiba tv.png b/gui/slick/images/network/chiba tv.png
new file mode 100644
index 0000000000000000000000000000000000000000..f98e3c03a185b51530f653393e980e16fd21e328
Binary files /dev/null and b/gui/slick/images/network/chiba tv.png differ
diff --git a/gui/slick/images/network/military channel.png b/gui/slick/images/network/military channel.png
new file mode 100644
index 0000000000000000000000000000000000000000..4541fcd7b7846a31c0356177774d698a0523b718
Binary files /dev/null and b/gui/slick/images/network/military channel.png differ
diff --git a/gui/slick/images/network/spike.png b/gui/slick/images/network/spike.png
new file mode 100644
index 0000000000000000000000000000000000000000..def751e4ae7a35d507aecb2496decc68b9d22798
Binary files /dev/null and b/gui/slick/images/network/spike.png differ
diff --git a/gui/slick/images/network/sun-tv.png b/gui/slick/images/network/sun-tv.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3ce8af77ed58480f8f4a030ee11659d98ececa7
Binary files /dev/null and b/gui/slick/images/network/sun-tv.png differ
diff --git a/gui/slick/images/network/syndication.png b/gui/slick/images/network/syndication.png
new file mode 100644
index 0000000000000000000000000000000000000000..ece0dd551f17741aed21fa74fc9ffa2b945605bd
Binary files /dev/null and b/gui/slick/images/network/syndication.png differ
diff --git a/gui/slick/images/network/teletama.png b/gui/slick/images/network/teletama.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e1b3075d5782e36bf72d8f9ec4bade50ca2472c
Binary files /dev/null and b/gui/slick/images/network/teletama.png differ
diff --git a/gui/slick/images/network/uktv yesterday.png b/gui/slick/images/network/uktv yesterday.png
new file mode 100644
index 0000000000000000000000000000000000000000..29e7638ef674b6c4075783394dd860a656da21d4
Binary files /dev/null and b/gui/slick/images/network/uktv yesterday.png differ
diff --git a/gui/slick/images/network/we tv.png b/gui/slick/images/network/we tv.png
new file mode 100644
index 0000000000000000000000000000000000000000..d29c3489372da614d0a338cdd99ec88de9d0fb07
Binary files /dev/null and b/gui/slick/images/network/we tv.png differ
diff --git a/gui/slick/interfaces/default/apiBuilder.tmpl b/gui/slick/interfaces/default/apiBuilder.tmpl
index 3e4e5fd0410d3b87d16f1e386a87fee520776985..e7b0454f48fe45a3d6cd205ec1e44fd8cf24d906 100644
--- a/gui/slick/interfaces/default/apiBuilder.tmpl
+++ b/gui/slick/interfaces/default/apiBuilder.tmpl
@@ -32,25 +32,29 @@ addListGroup("api", "Command");
 
 addOption("Command", "SickRage", "?cmd=sb", 1); //make default
 addList("Command", "SickRage.AddRootDir", "?cmd=sb.addrootdir", "sb.addrootdir", "", "", "action");
-addOption("Command", "SickRage.CheckVersion", "?cmd=sb.checkversion", "", "", "action");
 addOption("Command", "SickRage.CheckScheduler", "?cmd=sb.checkscheduler", "", "", "action");
+addOption("Command", "SickRage.CheckVersion", "?cmd=sb.checkversion", "", "", "action");
 addList("Command", "SickRage.DeleteRootDir", "?cmd=sb.deleterootdir", "sb.deleterootdir", "", "", "action");
-addOption("Command", "SickRage.ForceSearch", "?cmd=sb.forcesearch", "", "", "action");
 addOption("Command", "SickRage.GetDefaults", "?cmd=sb.getdefaults", "", "", "action");
 addOption("Command", "SickRage.GetMessages", "?cmd=sb.getmessages", "", "", "action");
 addOption("Command", "SickRage.GetRootDirs", "?cmd=sb.getrootdirs", "", "", "action");
 addList("Command", "SickRage.PauseBacklog", "?cmd=sb.pausebacklog", "sb.pausebacklog", "", "", "action");
 addOption("Command", "SickRage.Ping", "?cmd=sb.ping", "", "", "action");
 addOption("Command", "SickRage.Restart", "?cmd=sb.restart", "", "", "action");
-addList("Command", "SickRage.searchindexers", "?cmd=sb.searchindexers", "sb.searchindexers", "", "", "action");
+addList("Command", "SickRage.SearchIndexers", "?cmd=sb.searchindexers", "sb.searchindexers", "", "", "action");
+addList("Command", "SickRage.SearchTVDb", "?cmd=sb.searchtvdb", "sb.searchindexers", "", "", "action");
+addList("Command", "SickRage.SearchTVRage", "?cmd=sb.searchtvrage", "sb.searchindexers", "", "", "action");
 addList("Command", "SickRage.SetDefaults", "?cmd=sb.setdefaults", "sb.setdefaults", "", "", "action");
 addOption("Command", "SickRage.Shutdown", "?cmd=sb.shutdown", "", "", "action");
 addOption("Command", "SickRage.Update", "?cmd=sb.update", "", "", "action");
+addOption("Command", "Backlog", "?cmd=backlog", "", "", "action");
 addList("Command", "Coming Episodes", "?cmd=future", "future");
 addList("Command", "Episode", "?cmd=episode", "episode");
 addList("Command", "Episode.Search", "?cmd=episode.search", "episode.search", "", "", "action");
 addList("Command", "Episode.SetStatus", "?cmd=episode.setstatus", "episode.setstatus", "", "", "action");
+addList("Command", "Episode.SubtitleSearch", "?cmd=episode.subtitlesearch", "episode.search", "", "", "action");
 addList("Command", "Scene Exceptions", "?cmd=exceptions", "exceptions");
+addOption("Command", "Failed", "?cmd=failed", "", "", "action");
 addList("Command", "History", "?cmd=history", "history");
 addOption("Command", "History.Clear", "?cmd=history.clear", "", "", "action");
 addOption("Command", "History.Trim", "?cmd=history.trim", "", "", "action");
diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py
index e66804939e7e22f321b092a3f0f3b373c7ed352f..afe0cfd7e1bb89b17720e33c597230f3e6fe85bb 100644
--- a/sickbeard/databases/mainDB.py
+++ b/sickbeard/databases/mainDB.py
@@ -64,8 +64,6 @@ class MainSanityCheck(db.DBSanityCheck):
                         cur_dupe_id["show_id"]))
                 self.connection.action("DELETE FROM tv_shows WHERE show_id = ?", [cur_dupe_id["show_id"]])
 
-        else:
-            logger.log(u"No duplicate show, check passed", logger.DEBUG)
 
     def fix_duplicate_episodes(self):
 
@@ -88,9 +86,6 @@ class MainSanityCheck(db.DBSanityCheck):
                 logger.log(u"Deleting duplicate episode with episode_id: " + str(cur_dupe_id["episode_id"]))
                 self.connection.action("DELETE FROM tv_episodes WHERE episode_id = ?", [cur_dupe_id["episode_id"]])
 
-        else:
-            logger.log(u"No duplicate episode, check passed", logger.DEBUG)
-
     def fix_orphan_episodes(self):
 
         sqlResults = self.connection.select(
@@ -102,9 +97,6 @@ class MainSanityCheck(db.DBSanityCheck):
             logger.log(u"Deleting orphan episode with episode_id: " + str(cur_orphan["episode_id"]))
             self.connection.action("DELETE FROM tv_episodes WHERE episode_id = ?", [cur_orphan["episode_id"]])
 
-        else:
-            logger.log(u"No orphan episodes, check passed", logger.DEBUG)
-
     def fix_missing_table_indexes(self):
         if not self.connection.select("PRAGMA index_info('idx_indexer_id')"):
             logger.log(u"Missing idx_indexer_id for TV Shows table detected!, fixing...")
@@ -135,19 +127,14 @@ class MainSanityCheck(db.DBSanityCheck):
         curDate = datetime.date.today()
 
         sqlResults = self.connection.select(
-            "SELECT episode_id, showid FROM tv_episodes WHERE airdate > ? AND status in (?,?)",
+            "SELECT episode_id FROM tv_episodes WHERE (airdate > ? or airdate = 1) AND status in (?,?)",
             [curDate.toordinal(), common.SKIPPED, common.WANTED])
 
         for cur_unaired in sqlResults:
-            logger.log(u"UNAIRED episode detected! episode_id: " + str(cur_unaired["episode_id"]) + " showid: " + str(
-                cur_unaired["showid"]), logger.DEBUG)
-            logger.log(u"Fixing unaired episode status with episode_id: " + str(cur_unaired["episode_id"]))
+            logger.log(u"Fixing unaired episode status for episode_id: %s" % cur_unaired["episode_id"])
             self.connection.action("UPDATE tv_episodes SET status = ? WHERE episode_id = ?",
                                    [common.UNAIRED, cur_unaired["episode_id"]])
 
-        else:
-            logger.log(u"No UNAIRED episodes, check passed", logger.DEBUG)
-
     def fix_tvrage_show_statues(self):
         status_map = {
             'returning series': 'Continuing',
@@ -177,8 +164,6 @@ class MainSanityCheck(db.DBSanityCheck):
             logger.log(u"Fixing malformed episode status with episode_id: " + str(cur_ep["episode_id"]))
             self.connection.action("UPDATE tv_episodes SET status = ? WHERE episode_id = ?",
                                    [common.UNKNOWN, cur_ep["episode_id"]])
-        else:
-            logger.log(u"No MALFORMED episode statuses, check passed", logger.DEBUG)
 
     def fix_invalid_airdates(self):
 
@@ -192,9 +177,6 @@ class MainSanityCheck(db.DBSanityCheck):
             logger.log(u"Fixing bad episode airdate for episode_id: " + str(bad_airdate["episode_id"]))
             self.connection.action("UPDATE tv_episodes SET airdate = '1' WHERE episode_id = ?", [bad_airdate["episode_id"]])
 
-        else:
-            logger.log(u"No bad episode airdates, check passed", logger.DEBUG)
-
     def fix_subtitles_codes(self):
 
         sqlResults = self.connection.select(
diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index 276aea5f8b8f796ffbf4627b1eb170f55bb5c02e..053fef76092eac52921af23c1013d37d34959e3c 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -131,6 +131,7 @@ def remove_non_release_groups(name):
                        '\[Seedbox\]$':     'searchre',
                        '\[AndroidTwoU\]$': 'searchre',
                        '\.RiPSaLoT$':      'searchre',
+                       '\.GiuseppeTnT$':      'searchre',
                        '-NZBGEEK$':        'searchre',
                        '-RP$':             'searchre',
                        '-20-40$':          'searchre',
@@ -1116,7 +1117,7 @@ def makeZip(fileList, archive):
     'archive' is the file name for the archive with a full path
     """
     try:
-        a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)
+        a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
         for f in fileList:
             a.write(f)
         a.close()
diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py
index 5e1357f0fbb331edc26866bd4239438aecf8f7cb..6fcf33dcd4905f0d048fe8684a56f9e010c8faeb 100644
--- a/sickbeard/providers/__init__.py
+++ b/sickbeard/providers/__init__.py
@@ -214,12 +214,12 @@ def makeTorrentRssProvider(configString):
 
 def getDefaultNewznabProviders():
     #name|url|key|catIDs|enabled|search_mode|search_fallback|enable_daily|enable_backlog
-    return 'NZB.Cat|https://nzb.cat/||5030,5040,5010,5060|0|eponly|1|1|1!!!' + \
+    return 'NZB.Cat|https://nzb.cat/||5030,5040,5010|0|eponly|1|1|1!!!' + \
+           'NZBGeek|https://api.nzbgeek.info/||5030,5040|0|eponly|0|0|0!!!' + \
            'Sick Beard Index|http://lolo.sickbeard.com/|0|5030,5040|0|eponly|0|0|0!!!' + \
            'NZBs.org|https://nzbs.org/||5030,5040|0|eponly|0|0|0!!!' + \
            'Usenet-Crawler|https://www.usenet-crawler.com/||5030,5040|0|eponly|0|0|0'
 
-
 def getProviderModule(name):
     name = name.lower()
     prefix = "sickbeard.providers."
diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py
index bf82134f2dd772e1a61f970125b97264edcaf5eb..ad4a0b43ebff34d257445dbccac0d8aee531ff51 100644
--- a/sickbeard/providers/cpasbien.py
+++ b/sickbeard/providers/cpasbien.py
@@ -121,7 +121,11 @@ class CpasbienProvider(generic.TorrentProvider):
             for search_string in search_params[mode]:
         
                 searchURL = self.url + '/recherche/'+search_string.replace('.','-')+'.html'
-                data = self.getURL(searchURL)        
+                data = self.getURL(searchURL)
+
+                if not data:
+                    continue
+
                 try:
                     with BS4Parser(data, features=["html5lib", "permissive"]) as html:
                         
diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py
index c10d5e6205416f24cbb2cd16d344fcc77cb567c1..16bc0b008f836512f5820d729bb1a786e9efe2d3 100644
--- a/sickbeard/providers/generic.py
+++ b/sickbeard/providers/generic.py
@@ -75,7 +75,6 @@ class GenericProvider:
 
         self.btCacheURLS = [
                 'http://torcache.net/torrent/{torrent_hash}.torrent',
-                'http://zoink.ch/torrent/{torrent_name}.torrent',
                 'http://torrage.com/torrent/{torrent_hash}.torrent',
                 #'http://itorrents.org/torrent/{torrent_hash}.torrent',
             ]
diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py
index 58206969fb4e2b308454fbfcefc000c84cbf7c2a..a9f18435cb0e4eb8069c19b8d26da7f805c06ffc 100644
--- a/sickbeard/providers/newznab.py
+++ b/sickbeard/providers/newznab.py
@@ -260,6 +260,9 @@ class NewznabProvider(generic.NZBProvider):
                   "attrs": "rageid",
                   "offset": 0}
 
+        if search_params:
+            params.update(search_params)
+
         # category ids
         if self.show and self.show.is_sports:
             params['cat'] = self.catIDs + ',5060'
@@ -268,9 +271,6 @@ class NewznabProvider(generic.NZBProvider):
         else:
             params['cat'] = self.catIDs
 
-        if search_params:
-            params.update(search_params)
-
         if self.needs_auth and self.key:
             params['apikey'] = self.key
 
diff --git a/sickbeard/tv.py b/sickbeard/tv.py
index d00e8ddbd62823e3aebd20eecc7d0bd356026820..260a06b1ca5ef74cebc9ee755b321990da88ce4c 100644
--- a/sickbeard/tv.py
+++ b/sickbeard/tv.py
@@ -1780,44 +1780,19 @@ class TVEpisode(object):
             return
 
         if self.location:
-            logger.log(str(self.show.indexerid) + u": Setting status for " + str(season) + "x" + str(
-                episode) + " based on status " + str(self.status) + " and existence of " + self.location, logger.DEBUG)
+            logger.log(u"%s: Setting status for S%02dE%02d based on status %s and location %s" %
+                    (self.show.indexerid, season, episode, statusStrings[self.status], self.location), logger.DEBUG)
 
-        # if we don't have the file
         if not ek.ek(os.path.isfile, self.location):
-
-            # if it hasn't aired yet set the status to UNAIRED
-            if self.airdate >= datetime.date.today() and self.status in [SKIPPED, UNAIRED, UNKNOWN, WANTED]:
-                logger.log(u"Episode airs in the future, marking it UNAIRED", logger.DEBUG)
-                self.status = UNAIRED
-
-            # if there's no airdate then set it to skipped (and respect ignored)
-            elif self.airdate == datetime.date.fromordinal(1):
-                if self.status == IGNORED:
-                    logger.log(u"Episode has no air date, but it's already marked as ignored", logger.DEBUG)
-                else:
-                    logger.log(u"Episode has no air date, automatically marking it unaired", logger.DEBUG)
-                    self.status = UNAIRED
-
-            # if we don't have the file and the airdate is in the past
+            if  self.airdate >= datetime.date.today() or self.airdate == datetime.date.fromordinal(1):
+                logger.log(u"Episode airs in the future or has no airdate, marking it %s" % statusStrings[UNAIRED], logger.DEBUG)
+                self.status = UNAIRED if self.season > 0 else SKIPPED # Some specials have no airdate
+            elif self.status in [UNAIRED, UNKNOWN]:
+                # Only do UNAIRED/UNKNOWN, it could already be snatched/ignored/skipped, or downloaded/archived to disconnected media
+                logger.log(u"Episode has already aired, marking it %s" % statusStrings[self.show.default_ep_status], logger.DEBUG)
+                self.status = self.show.default_ep_status if self.season > 0 else SKIPPED # auto-skip specials
             else:
-                if self.status == UNAIRED:
-                    if self.season > 0:
-                        self.status = WANTED
-                    else:
-                        self.status = SKIPPED
-
-                # if we somehow are still UNKNOWN then just use the shows defined default status or SKIPPED
-                elif self.status == UNKNOWN:
-                    if self.season > 0: #If it's not a special
-                        self.status = self.show.default_ep_status
-                    else:
-                        self.status = SKIPPED
-
-                else:
-                    logger.log(
-                        u"Not touching status because we have no ep file, the airdate is in the past, and the status is " + str(
-                            self.status), logger.DEBUG)
+                logger.log(u"Not touching status [ %s ] It could be skipped/ignored/snatched/archived" % statusStrings[self.status], logger.DEBUG)
 
         # if we have a media file then it's downloaded
         elif sickbeard.helpers.isMediaFile(self.location):
diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py
index ef8371c7aa54d3d007cd73fc5e24b9cfae1174a2..f82ad918577ba59c8f163fa4d932994bd8c27d09 100644
--- a/sickbeard/webapi.py
+++ b/sickbeard/webapi.py
@@ -175,7 +175,7 @@ class ApiHandler(RequestHandler):
                     cmd, cmdIndex = cmd.split("_")  # this gives us the clear cmd and the index
 
                 logger.log(u"API :: " + cmd + ": curKwargs " + str(curKwargs), logger.DEBUG)
-                if not (multiCmds and cmd in ('show.getposter', 'show.getbanner')):  # skip these cmd while chaining
+                if not (multiCmds and cmd in ('show.getposter', 'show.getbanner', 'show.getnetworklogo')):  # skip these cmd while chaining
                     try:
                         if cmd in _functionMaper:
                             # map function
@@ -1807,8 +1807,8 @@ class CMD_SickBeardSearchTVDB(CMD_SickBeardSearchIndexers):
 
 
     def __init__(self, args, kwargs):
-        self.indexerid, args = self.check_params(args, kwargs, "tvdbid", None, False, "int", [])
         CMD_SickBeardSearchIndexers.__init__(self, args, kwargs)
+        self.indexerid, args = self.check_params(args, kwargs, "tvdbid", None, False, "int", [])
 
 
 class CMD_SickBeardSearchTVRAGE(CMD_SickBeardSearchIndexers):
@@ -1820,8 +1820,8 @@ class CMD_SickBeardSearchTVRAGE(CMD_SickBeardSearchIndexers):
     }
 
     def __init__(self, args, kwargs):
-        self.indexerid, args = self.check_params(args, kwargs, "tvrageid", None, False, "int", [])
         CMD_SickBeardSearchIndexers.__init__(self, args, kwargs)
+        self.indexerid, args = self.check_params(args, kwargs, "tvrageid", None, False, "int", [])
 
 
 class CMD_SickBeardSetDefaults(ApiCall):