diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index ccf1d72d14728bc9be927765180188b3f27653cf..61330544b7c66c5beed6ca74e4b1d109353e7e25 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -58,6 +58,7 @@ from sickbeard.databases import mainDB, cache_db, failed_db
 
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import ex
+from sickrage.show.Show import Show
 from sickrage.system.Shutdown import Shutdown
 
 from configobj import ConfigObj
@@ -2207,7 +2208,7 @@ def getEpList(epIDs, showid=None):
     epList = []
 
     for curEp in sqlResults:
-        curShowObj = helpers.findCertainShow(showList, int(curEp["showid"]))
+        curShowObj = Show.find(showList, int(curEp["showid"]))
         curEpObj = curShowObj.getEpisode(int(curEp["season"]), int(curEp["episode"]))
         epList.append(curEpObj)
 
diff --git a/sickbeard/dailysearcher.py b/sickbeard/dailysearcher.py
index 89abc9ca1695d15409959450414420f082026496..fd6f8443b22b50fe3663b4aff0d2fbcb89e8d5b8 100644
--- a/sickbeard/dailysearcher.py
+++ b/sickbeard/dailysearcher.py
@@ -17,7 +17,6 @@
 # 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 threading
 
@@ -25,8 +24,8 @@ import sickbeard
 from sickbeard import logger
 from sickbeard import db
 from sickbeard import common
-from sickbeard import helpers
 from sickbeard import network_timezones
+from sickrage.show.Show import Show
 from sickrage.helper.exceptions import MultipleShowObjectsException
 
 
@@ -68,7 +67,7 @@ class DailySearcher():
         for sqlEp in sqlResults:
             try:
                 if not show or int(sqlEp["showid"]) != show.indexerid:
-                    show = helpers.findCertainShow(sickbeard.showList, int(sqlEp["showid"]))
+                    show = Show.find(sickbeard.showList, int(sqlEp["showid"]))
 
                 # for when there is orphaned series in the database but not loaded into our showlist
                 if not show or show.paused:
diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index 9b3810da3d848b7d67aa52159436c29b03d0c471..e35c57295f5028a9bced3c5056d08bb414e96859 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -55,7 +55,8 @@ from sickbeard.notifiers.synoindex import notifier as synoindex_notifier
 from sickbeard import clients
 from sickrage.helper.common import media_extensions, pretty_file_size, subtitle_extensions
 from sickrage.helper.encoding import ek
-from sickrage.helper.exceptions import ex, MultipleShowObjectsException
+from sickrage.helper.exceptions import ex
+from sickrage.show.Show import Show
 from cachecontrol import CacheControl, caches
 from itertools import izip, cycle
 
@@ -68,6 +69,7 @@ shutil.copyfile = shutil_custom.copyfile_custom
 # Access to a protected member of a client class
 urllib._urlopener = classes.SickBeardURLopener()
 
+
 def fixGlob(path):
     path = re.sub(r'\[', '[[]', path)
     return re.sub(r'(?<!\[)\]', '[]]', path)
@@ -91,6 +93,7 @@ def indentXML(elem, level=0):
         if level and (not elem.tail or not elem.tail.strip()):
             elem.tail = i
 
+
 def remove_non_release_groups(name):
     """
     Remove non release groups from name
@@ -227,32 +230,6 @@ def remove_file_failed(failed_file):
         pass
 
 
-def findCertainShow(showList, indexerid):
-    """
-    Find a show by indexer ID in the show list
-
-    :param showList: List of shows to search in (needle)
-    :param indexerid: Show to look for
-    :return: result list
-    """
-
-    results = []
-
-    if not isinstance(indexerid, list):
-        indexerid = [indexerid]
-
-    if showList and indexerid:
-        results = [show for show in showList if show.indexerid in indexerid]
-
-    if not results:
-        return None
-
-    if len(results) == 1:
-        return results[0]
-    elif len(results) > 1:
-        raise MultipleShowObjectsException()
-
-
 def makeDir(path):
     """
     Make a directory on the filesystem
@@ -357,7 +334,7 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None):
 
             if not (seriesname and series_id):
                 continue
-            ShowObj = findCertainShow(sickbeard.showList, int(series_id))
+            ShowObj = Show.find(sickbeard.showList, int(series_id))
             # Check if we can find the show in our list (if not, it's not the right show)
             if (indexer_id is None) and (ShowObj is not None) and (ShowObj.indexerid == int(series_id)):
                 return seriesname, i, int(series_id)
@@ -775,7 +752,7 @@ def get_all_episodes_from_absolute_number(show, absolute_numbers, indexer_id=Non
 
     if len(absolute_numbers):
         if not show and indexer_id:
-            show = findCertainShow(sickbeard.showList, indexer_id)
+            show = Show.find(sickbeard.showList, indexer_id)
 
         for absolute_number in absolute_numbers if show else []:
             ep = show.getEpisode(None, None, absolute_number=absolute_number)
@@ -1130,18 +1107,18 @@ def get_show(name, tryIndexers=False):
         cache = sickbeard.name_cache.retrieveNameFromCache(name)
         if cache:
             fromCache = True
-            showObj = findCertainShow(sickbeard.showList, int(cache))
+            showObj = Show.find(sickbeard.showList, int(cache))
 
         # try indexers
         if not showObj and tryIndexers:
-            showObj = findCertainShow(sickbeard.showList,
+            showObj = Show.find(sickbeard.showList,
                                       searchIndexerForShowID(full_sanitizeSceneName(name), ui=classes.ShowListUI)[2])
 
         # try scene exceptions
         if not showObj:
             ShowID = sickbeard.scene_exceptions.get_scene_exception_by_name(name)[0]
             if ShowID:
-                showObj = findCertainShow(sickbeard.showList, int(ShowID))
+                showObj = Show.find(sickbeard.showList, int(ShowID))
 
         # add show to cache
         if showObj and not fromCache:
diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py
index 10a881957bcca33fbd81232adc979f93008b325d..0e33b65de3d96861666ffd15c0249c4070749584 100644
--- a/sickbeard/postProcessor.py
+++ b/sickbeard/postProcessor.py
@@ -39,6 +39,7 @@ from sickrage.helper.common import remove_extension, replace_extension, subtitle
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import EpisodeNotFoundException, EpisodePostProcessingFailedException, ex
 from sickrage.helper.exceptions import ShowDirectoryNotFoundException
+from sickrage.show.Show import Show
 from babelfish import language_converters
 
 import adba
@@ -499,7 +500,7 @@ class PostProcessor(object):
             if quality == common.Quality.UNKNOWN:
                 quality = None
 
-            show = helpers.findCertainShow(sickbeard.showList, indexer_id)
+            show = Show.find(sickbeard.showList, indexer_id)
 
             self.in_history = True
             self.version = version
diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py
index 76b628c51eefba9b109c1ea2afcd7ca755462c4a..99b80f6e7148bc331683fab26b61923c95bd8e0e 100644
--- a/sickbeard/providers/generic.py
+++ b/sickbeard/providers/generic.py
@@ -37,6 +37,7 @@ from sickbeard.common import user_agents
 from sickrage.helper.common import sanitize_filename
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import ex
+from sickrage.show.Show import Show
 from sickbeard import show_name_helpers
 
 
@@ -655,7 +656,7 @@ class TorrentProvider(GenericProvider):
         )
 
         for sqlshow in sqlResults or []:
-            show = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
+            show = Show.find(sickbeard.showList, int(sqlshow["showid"]))
             if show:
                 curEp = show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
                 for term in self.proper_strings:
diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py
index 203c39174cbbfe10f6eafd0b314723181ebec34b..14cc97e69aed09aab5bd5615662fb4c328db183f 100644
--- a/sickbeard/providers/newznab.py
+++ b/sickbeard/providers/newznab.py
@@ -37,6 +37,7 @@ from sickbeard import db
 from sickbeard.common import Quality
 from sickbeard.providers import generic
 from sickrage.helper.encoding import ek
+from sickrage.show.Show import Show
 from sickbeard.common import USER_AGENT
 
 
@@ -333,7 +334,7 @@ class NewznabProvider(generic.NZBProvider):
             return results
 
         for sqlshow in sqlResults:
-            self.show = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
+            self.show = Show.find(sickbeard.showList, int(sqlshow["showid"]))
             if self.show:
                 curEp = self.show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
                 searchStrings = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')
diff --git a/sickbeard/scene_numbering.py b/sickbeard/scene_numbering.py
index d4bb071d542420c676dcd2580a7dfd04b1b50f4a..23ba5f06c53477973a852cad0cc4817f54039453 100644
--- a/sickbeard/scene_numbering.py
+++ b/sickbeard/scene_numbering.py
@@ -29,8 +29,8 @@ import traceback
 import sickbeard
 from sickbeard import logger
 from sickbeard import db
-from sickbeard import helpers
 from sickrage.helper.exceptions import ex
+from sickrage.show.Show import Show
 
 
 def get_scene_numbering(indexer_id, indexer, season, episode, fallback_to_xem=True):
@@ -49,7 +49,7 @@ def get_scene_numbering(indexer_id, indexer, season, episode, fallback_to_xem=Tr
     if indexer_id is None or season is None or episode is None:
         return (season, episode)
 
-    showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(indexer_id))
+    showObj = Show.find(sickbeard.showList, int(indexer_id))
     if showObj and not showObj.is_scene:
         return (season, episode)
 
@@ -101,7 +101,7 @@ def get_scene_absolute_numbering(indexer_id, indexer, absolute_number, fallback_
     indexer_id = int(indexer_id)
     indexer = int(indexer)
 
-    showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, indexer_id)
+    showObj = Show.find(sickbeard.showList, indexer_id)
     if showObj and not showObj.is_scene:
         return absolute_number
 
@@ -219,7 +219,7 @@ def set_scene_numbering(indexer_id, indexer, season=None, episode=None, absolute
             [sceneAbsolute, indexer, indexer_id, absolute_number])
 
     # Reload data from DB so that cache and db are in sync
-    show = helpers.findCertainShow(sickbeard.showList, indexer_id)
+    show = Show.find(sickbeard.showList, indexer_id)
     show.flushEpisodes()
 
 
diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py
index bc69e645981e9ce5cedeb8e7cb8142ef5267bb57..b862646d75683cfb7934f954b633cfc0ae987d54 100644
--- a/sickbeard/subtitles.py
+++ b/sickbeard/subtitles.py
@@ -35,6 +35,7 @@ from sickbeard import processTV
 from sickrage.helper.common import media_extensions, dateTimeFormat
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import ex
+from sickrage.show.Show import Show
 
 DISTRIBUTION = pkg_resources.Distribution(location=os.path.dirname(os.path.dirname(__file__)),
                                           project_name='fake_entry_points', version='1.0.0')
@@ -440,7 +441,7 @@ class SubtitlesFinder(object):
                 logger.log(u'Downloading subtitles for episode %dx%d of show %s'
                            % (ep_to_sub['season'], ep_to_sub['episode'], ep_to_sub['show_name']), logger.DEBUG)
 
-                show_object = sickbeard.helpers.findCertainShow(sickbeard.showList, int(ep_to_sub['showid']))
+                show_object = Show.find(sickbeard.showList, int(ep_to_sub['showid']))
                 if not show_object:
                     logger.log(u'Show not found', logger.DEBUG)
                     self.amActive = False
diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py
index 530673a228e351b55e971255f569d212ba008b64..651dcb08f51f65b4de70f924360f8a308663205e 100644
--- a/sickbeard/traktChecker.py
+++ b/sickbeard/traktChecker.py
@@ -36,6 +36,7 @@ from sickbeard.common import Quality
 from sickrage.helper.common import sanitize_filename
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import ex
+from sickrage.show.Show import Show
 
 
 def setEpisodeToWanted(show, s, e):
@@ -388,7 +389,7 @@ class TraktChecker(object):
                 self.addDefaultShow(indexer, indexer_id, show['title'], WANTED)
 
             if int(sickbeard.TRAKT_METHOD_ADD) == 1:
-                newShow = helpers.findCertainShow(sickbeard.showList, indexer_id)
+                newShow = Show.find(sickbeard.showList, indexer_id)
 
                 if newShow is not None:
                     setEpisodeToWanted(newShow, 1, 1)
@@ -415,7 +416,7 @@ class TraktChecker(object):
             indexer_id = int(show_el)
             show = self.EpisodeWatchlist[trakt_id][show_el]
 
-            newShow = helpers.findCertainShow(sickbeard.showList, indexer_id)
+            newShow = Show.find(sickbeard.showList, indexer_id)
 
             try:
                 if newShow is None:
@@ -444,7 +445,7 @@ class TraktChecker(object):
         """
         Adds a new show with the default settings
         """
-        if not helpers.findCertainShow(sickbeard.showList, int(indexer_id)):
+        if not Show.find(sickbeard.showList, int(indexer_id)):
             logger.log(u"Adding show " + str(indexer_id))
             root_dirs = sickbeard.ROOT_DIRS.split('|')
 
diff --git a/sickbeard/tv.py b/sickbeard/tv.py
index b689479d2e1ebf5121ec72d969d9e4f8605f55a0..a6fef33e2f81c3d978fb6543368ec3209da002b0 100644
--- a/sickbeard/tv.py
+++ b/sickbeard/tv.py
@@ -53,6 +53,7 @@ from sickrage.helper.exceptions import EpisodeDeletedException, EpisodeNotFoundE
 from sickrage.helper.exceptions import MultipleEpisodesInDatabaseException, MultipleShowsInDatabaseException
 from sickrage.helper.exceptions import MultipleShowObjectsException, NoNFOException, ShowDirectoryNotFoundException
 from sickrage.helper.exceptions import ShowNotFoundException
+from sickrage.show.Show import Show
 
 from sickbeard.common import Quality, Overview, statusStrings
 from sickbeard.common import DOWNLOADED, SNATCHED, SNATCHED_PROPER, ARCHIVED, IGNORED, UNAIRED, WANTED, SKIPPED, UNKNOWN
@@ -112,7 +113,7 @@ class TVShow(object):
         self.nextaired = ""
         self.release_groups = None
 
-        otherShow = helpers.findCertainShow(sickbeard.showList, self.indexerid)
+        otherShow = Show.find(sickbeard.showList, self.indexerid)
         if otherShow is not None:
             raise MultipleShowObjectsException("Can't create a show if it already exists")
 
diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py
index 5a9229bffa4c9fd47f5f07c2a828592891489ac3..6ace5591a924705406e53fc3e043c9489fef182b 100644
--- a/sickbeard/tvcache.py
+++ b/sickbeard/tvcache.py
@@ -16,7 +16,6 @@
 # You should have received a copy of the GNU General Public License
 # along with SickRage.  If not, see <http://www.gnu.org/licenses/>.
 
-
 import time
 import datetime
 import itertools
@@ -25,12 +24,12 @@ import urllib2
 import sickbeard
 from sickbeard import db
 from sickbeard import logger
-from sickbeard import helpers
 from sickbeard.common import Quality
 from sickbeard.rssfeeds import getFeed
 from sickbeard import show_name_helpers
 from sickrage.helper.encoding import ss
 from sickrage.helper.exceptions import AuthException, ex
+from sickrage.show.Show import Show
 from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException
 
 
@@ -246,7 +245,7 @@ class TVCache(object):
             # create showObj from indexer_id if available
             showObj = None
             if indexer_id:
-                showObj = helpers.findCertainShow(sickbeard.showList, indexer_id)
+                showObj = Show.find(sickbeard.showList, indexer_id)
 
             try:
                 myParser = NameParser(showObj=showObj)
@@ -333,7 +332,7 @@ class TVCache(object):
                 continue
 
             # get the show object, or if it's not one of our shows then ignore it
-            showObj = helpers.findCertainShow(sickbeard.showList, int(curResult["indexerid"]))
+            showObj = Show.find(sickbeard.showList, int(curResult["indexerid"]))
             if not showObj:
                 continue
 
diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py
index b3b8088d5a019f1e5a3bcfd13dde758d9000e876..199fec6f6c4a38969c7d08da985f187d0facf98f 100644
--- a/sickbeard/webapi.py
+++ b/sickbeard/webapi.py
@@ -719,7 +719,7 @@ class CMD_Episode(ApiCall):
 
     def run(self):
         """ Get detailed information about an episode """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -784,7 +784,7 @@ class CMD_EpisodeSearch(ApiCall):
 
     def run(self):
         """ Search for an episode """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -840,7 +840,7 @@ class CMD_EpisodeSetStatus(ApiCall):
 
     def run(self):
         """ Set the status of an episode or a season (when no episode is provided) """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -953,7 +953,7 @@ class CMD_SubtitleSearch(ApiCall):
 
     def run(self):
         """ Search for an episode subtitles """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -1016,7 +1016,7 @@ class CMD_Exceptions(ApiCall):
                 scene_exceptions[indexerid].append(row["show_name"])
 
         else:
-            show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+            show_obj = Show.find(sickbeard.showList, int(self.indexerid))
             if not show_obj:
                 return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -1853,7 +1853,7 @@ class CMD_Show(ApiCall):
 
     def run(self):
         """ Get detailed information about a show """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -1961,7 +1961,7 @@ class CMD_ShowAddExisting(ApiCall):
 
     def run(self):
         """ Add an existing show in SickRage """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if show_obj:
             return _responds(RESULT_FAILURE, msg="An existing indexerid already exists in the database")
 
@@ -2076,7 +2076,7 @@ class CMD_ShowAddNew(ApiCall):
 
     def run(self):
         """ Add a new show to SickRage """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if show_obj:
             return _responds(RESULT_FAILURE, msg="An existing indexerid already exists in database")
 
@@ -2211,7 +2211,7 @@ class CMD_ShowCache(ApiCall):
 
     def run(self):
         """ Check SickRage's cache to see if the images (poster, banner, fanart) for a show are valid """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -2283,7 +2283,7 @@ class CMD_ShowGetQuality(ApiCall):
 
     def run(self):
         """ Get the quality setting of a show """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -2478,7 +2478,7 @@ class CMD_ShowSeasonList(ApiCall):
 
     def run(self):
         """ Get the list of seasons of a show """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -2518,7 +2518,7 @@ class CMD_ShowSeasons(ApiCall):
 
     def run(self):
         """ Get the list of episodes for one or all seasons of a show """
-        sho_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        sho_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not sho_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -2604,7 +2604,7 @@ class CMD_ShowSetQuality(ApiCall):
 
     def run(self):
         """ Set the quality setting of a show. If no quality is provided, the default user setting is used. """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -2659,7 +2659,7 @@ class CMD_ShowStats(ApiCall):
 
     def run(self):
         """ Get episode statistics for a given show """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
@@ -2764,7 +2764,7 @@ class CMD_ShowUpdate(ApiCall):
 
     def run(self):
         """ Update a show in SickRage """
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid))
+        show_obj = Show.find(sickbeard.showList, int(self.indexerid))
         if not show_obj:
             return _responds(RESULT_FAILURE, msg="Show not found")
 
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index f9035a09c28825fff9d5f866e4300bb3ac66bed7..c67bffbe2117ab131e57379587c84f6e35c6f3a8 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -651,7 +651,7 @@ class Home(WebRoot):
         if show is None:
             return "Invalid show parameters"
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if showObj is None:
             return "Invalid show paramaters"
@@ -1186,7 +1186,7 @@ class Home(WebRoot):
         # todo: add more comprehensive show validation
         try:
             show = int(show)  # fails if show id ends in a period SickRage/sickrage-issues#65
-            showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, show)
+            showObj = Show.find(sickbeard.showList, show)
         except (ValueError, TypeError):
             return self._genericMessage("Error", "Invalid show ID: %s" % str(show))
 
@@ -1359,7 +1359,7 @@ class Home(WebRoot):
             else:
                 return self._genericMessage("Error", errString)
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if not showObj:
             errString = "Unable to find the specified show: " + str(show)
@@ -1598,7 +1598,7 @@ class Home(WebRoot):
         if show is None:
             return self._genericMessage("Error", "Invalid show ID")
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if showObj is None:
             return self._genericMessage("Error", "Unable to find the specified show")
@@ -1619,7 +1619,7 @@ class Home(WebRoot):
         if show is None:
             return self._genericMessage("Error", "Invalid show ID")
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if showObj is None:
             return self._genericMessage("Error", "Unable to find the specified show")
@@ -1636,7 +1636,7 @@ class Home(WebRoot):
         showObj = None
 
         if show:
-            showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+            showObj = Show.find(sickbeard.showList, int(show))
             if showObj:
                 showName = urllib.quote_plus(showObj.name.encode('utf-8'))
 
@@ -1667,7 +1667,7 @@ class Home(WebRoot):
         showObj = None
 
         if show:
-            showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+            showObj = Show.find(sickbeard.showList, int(show))
 
         if notifiers.emby_notifier.update_library(showObj):
             ui.notifications.message(
@@ -1699,7 +1699,7 @@ class Home(WebRoot):
             else:
                 return self._genericMessage("Error", errMsg)
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if not showObj:
             errMsg = "Error", "Show not in show list"
@@ -1829,7 +1829,7 @@ class Home(WebRoot):
         if show is None:
             return self._genericMessage("Error", "You must specify a show")
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if showObj is None:
             return self._genericMessage("Error", "Show not in show list")
@@ -1875,7 +1875,7 @@ class Home(WebRoot):
             errMsg = "You must specify a show and at least one episode"
             return self._genericMessage("Error", errMsg)
 
-        show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        show_obj = Show.find(sickbeard.showList, int(show))
 
         if show_obj is None:
             errMsg = "Error", "Show not in show list"
@@ -1942,7 +1942,7 @@ class Home(WebRoot):
     def getManualSearchStatus(self, show=None):
         def getEpisodes(searchThread, searchstatus):
             results = []
-            showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(searchThread.show.indexerid))
+            showObj = Show.find(sickbeard.showList, int(searchThread.show.indexerid))
 
             if not showObj:
                 logger.log(u'No Show Object found for show with indexerID: ' + str(searchThread.show.indexerid), logger.ERROR)
@@ -2057,7 +2057,7 @@ class Home(WebRoot):
         if sceneAbsolute in ['null', '']:
             sceneAbsolute = None
 
-        showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))
+        showObj = Show.find(sickbeard.showList, int(show))
 
         if showObj.is_anime:
             result = {
@@ -2397,7 +2397,7 @@ class HomeAddShows(Home):
 
                 cur_dir['existing_info'] = (indexer_id, show_name, indexer)
 
-                if indexer_id and helpers.findCertainShow(sickbeard.showList, indexer_id):
+                if indexer_id and Show.find(sickbeard.showList, indexer_id):
                     cur_dir['added_already'] = True
         return t.render(dirList=dir_list)
 
@@ -2479,7 +2479,7 @@ class HomeAddShows(Home):
             for show_detail in shows:
                 show = {'show': show_detail}
                 try:
-                    if not helpers.findCertainShow(sickbeard.showList, [int(show['show']['ids']['tvdb'])]):
+                    if not Show.find(sickbeard.showList, [int(show['show']['ids']['tvdb'])]):
                         if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows):
                             if not_liked_show:
                                 if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'):
@@ -2534,7 +2534,7 @@ class HomeAddShows(Home):
             library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or []
             for show in shows:
                 try:
-                    if not helpers.findCertainShow(sickbeard.showList, [int(show['show']['ids']['tvdb'])]):
+                    if not Show.find(sickbeard.showList, [int(show['show']['ids']['tvdb'])]):
                         if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows):
                             if not_liked_show:
                                 if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'):
@@ -2590,7 +2590,7 @@ class HomeAddShows(Home):
                 controller="addShows", action="addExistingShow")
 
     def addTraktShow(self, indexer_id, showName):
-        if helpers.findCertainShow(sickbeard.showList, int(indexer_id)):
+        if Show.find(sickbeard.showList, int(indexer_id)):
             return
 
         if sickbeard.ROOT_DIRS:
@@ -3033,13 +3033,13 @@ class Manage(Home, WebRoot):
             for epResult in to_download[cur_indexer_id]:
                 season, episode = epResult.split('x')
 
-                show = sickbeard.helpers.findCertainShow(sickbeard.showList, int(cur_indexer_id))
+                show = Show.find(sickbeard.showList, int(cur_indexer_id))
                 show.getEpisode(int(season), int(episode)).download_subtitles()
 
         return self.redirect('/manage/subtitleMissed/')
 
     def backlogShow(self, indexer_id):
-        show_obj = helpers.findCertainShow(sickbeard.showList, int(indexer_id))
+        show_obj = Show.find(sickbeard.showList, int(indexer_id))
 
         if show_obj:
             sickbeard.backlogSearchScheduler.action.searchBacklog([show_obj])
@@ -3095,7 +3095,7 @@ class Manage(Home, WebRoot):
         showNames = []
         for curID in showIDs:
             curID = int(curID)
-            showObj = helpers.findCertainShow(sickbeard.showList, curID)
+            showObj = Show.find(sickbeard.showList, curID)
             if showObj:
                 showList.append(showObj)
                 showNames.append(showObj.name)
@@ -3235,7 +3235,7 @@ class Manage(Home, WebRoot):
         errors = []
         for curShow in showIDs:
             curErrors = []
-            showObj = helpers.findCertainShow(sickbeard.showList, int(curShow))
+            showObj = Show.find(sickbeard.showList, int(curShow))
             if not showObj:
                 continue
 
@@ -3378,7 +3378,7 @@ class Manage(Home, WebRoot):
             if curShowID == '':
                 continue
 
-            showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(curShowID))
+            showObj = Show.find(sickbeard.showList, int(curShowID))
 
             if showObj is None:
                 continue
diff --git a/sickrage/media/GenericMedia.py b/sickrage/media/GenericMedia.py
index d323e2909e113b35aa824c2aa14c6932919ee865..0c8bf7f6fe096348052b70bb5284b4ee62692d0b 100644
--- a/sickrage/media/GenericMedia.py
+++ b/sickrage/media/GenericMedia.py
@@ -21,9 +21,9 @@ import sickbeard
 from abc import abstractmethod
 from mimetypes import guess_type
 from os.path import isfile, join, normpath
-from sickbeard.helpers import findCertainShow
 from sickrage.helper.encoding import ek
 from sickrage.helper.exceptions import MultipleShowObjectsException
+from sickrage.show.Show import Show
 
 
 class GenericMedia:
@@ -98,7 +98,7 @@ class GenericMedia:
         """
 
         try:
-            return findCertainShow(sickbeard.showList, self.indexer_id)
+            return Show.find(sickbeard.showList, self.indexer_id)
         except MultipleShowObjectsException:
             return None
 
diff --git a/sickrage/show/Show.py b/sickrage/show/Show.py
index 0634beb0175d985ffeb154750e812d9e5672d66c..83354f37cacc55335d11cd508af98dbb02fa8dcc 100644
--- a/sickrage/show/Show.py
+++ b/sickrage/show/Show.py
@@ -21,7 +21,6 @@ import sickbeard
 from datetime import date
 from sickbeard.common import Quality, SKIPPED, WANTED
 from sickbeard.db import DBConnection
-from sickbeard.helpers import findCertainShow
 from sickrage.helper.exceptions import CantRefreshShowException, CantRemoveShowException, ex
 from sickrage.helper.exceptions import MultipleShowObjectsException
 
@@ -53,6 +52,30 @@ class Show:
 
         return None, show
 
+    @staticmethod
+    def find(shows, indexer_id):
+        """
+        Find a show by its indexer id in the provided list of shows
+        :param shows: The list of shows to search in
+        :param indexer_id: The indexer id of the desired show
+        :return: The desired show if found, ``None`` if not found
+        :throw: ``MultipleShowObjectsException`` if multiple shows match the provided ``indexer_id``
+        """
+
+        if indexer_id is None or shows is None or len(shows) == 0:
+            return None
+
+        indexer_ids = [indexer_id] if not isinstance(indexer_id, list) else indexer_id
+        results = [show for show in shows if show.indexerid in indexer_ids]
+
+        if len(results) == 0:
+            return None
+
+        if len(results) == 1:
+            return results[0]
+
+        raise MultipleShowObjectsException()
+
     @staticmethod
     def overall_stats():
         db = DBConnection()
@@ -158,7 +181,7 @@ class Show:
             return 'Invalid show ID', None
 
         try:
-            show = findCertainShow(sickbeard.showList, int(indexer_id))
+            show = Show.find(sickbeard.showList, int(indexer_id))
         except MultipleShowObjectsException:
             return 'Unable to find the specified show', None
 
diff --git a/tests/helpers_tests.py b/tests/helpers_tests.py
index 2438691401221c19a3b9afb8d4321d81ff9eea8c..3eef330dd8504cfdfacfd7bf0c6a678b981177ee 100755
--- a/tests/helpers_tests.py
+++ b/tests/helpers_tests.py
@@ -29,7 +29,6 @@ Methods:
     isRarFile
     isBeingWritten
     remove_file_failed
-    findCertainShow
     makeDir
     searchDBForShow
     searchIndexerForShowID
@@ -459,13 +458,6 @@ class HelpersShowTests(unittest.TestCase):
     """
     Test show methods
     """
-    @unittest.skip('Not yet implemented')
-    def test_find_certain_show(self):
-        """
-        Test findCertainShow
-        """
-        pass
-
     @unittest.skip('Not yet implemented')
     def test_search_db_for_show(self):
         """
diff --git a/tests/sickrage_tests/show/show_tests.py b/tests/sickrage_tests/show/show_tests.py
index 9cbed26040002b8f32219740f3586432ad38f7c0..ab53550f74df3e19ee60403ec98af27044d6c335 100644
--- a/tests/sickrage_tests/show/show_tests.py
+++ b/tests/sickrage_tests/show/show_tests.py
@@ -33,8 +33,10 @@ sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../.
 sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..')))
 
 import sickbeard
+
 from sickbeard.common import Quality
 from sickbeard.tv import TVShow
+from sickrage.helper.exceptions import MultipleShowObjectsException
 from sickrage.show.Show import Show
 
 
@@ -42,6 +44,51 @@ class ShowTests(unittest.TestCase):
     """
     Test shows
     """
+
+    def test_find(self):
+        """
+        Test find
+        """
+        sickbeard.QUALITY_DEFAULT = Quality.FULLHDTV
+
+        show123 = TestTVShow(0, 123)
+        show456 = TestTVShow(0, 456)
+        show789 = TestTVShow(0, 789)
+        shows = [show123, show456, show789]
+        shows_duplicate = shows + shows
+
+        test_cases = {
+            (False, None): None,
+            (False, ''): None,
+            (False, '123'): None,
+            (False, 123): None,
+            (False, 12.3): None,
+            (True, None): None,
+            (True, ''): None,
+            (True, '123'): None,
+            (True, 123): show123,
+            (True, 12.3): None,
+            (True, 456): show456,
+            (True, 789): show789,
+        }
+
+        unicode_test_cases = {
+            (False, u''): None,
+            (False, u'123'): None,
+            (True, u''): None,
+            (True, u'123'): None,
+        }
+
+        for tests in test_cases, unicode_test_cases:
+            for ((use_shows, indexer_id), result) in tests.iteritems():
+                if use_shows:
+                    self.assertEqual(Show.find(shows, indexer_id), result)
+                else:
+                    self.assertEqual(Show.find(None, indexer_id), result)
+
+        with self.assertRaises(MultipleShowObjectsException):
+            Show.find(shows_duplicate, 456)
+
     def test_validate_indexer_id(self):
         """
         Test validate indexer id