diff --git a/lib/stevedore/dispatch.py b/lib/stevedore/dispatch.py
index 226d3ae251925a91b799e47e8aa96a63f2f767f7..424d39b69ed2d6109733182eb0ada736e295b97e 100644
--- a/lib/stevedore/dispatch.py
+++ b/lib/stevedore/dispatch.py
@@ -1,6 +1,7 @@
 import logging
 
 from .enabled import EnabledExtensionManager
+from .exception import NoMatches
 
 LOG = logging.getLogger(__name__)
 
@@ -66,7 +67,7 @@ class DispatchExtensionManager(EnabledExtensionManager):
         """
         if not self.extensions:
             # FIXME: Use a more specific exception class here.
-            raise RuntimeError('No %s extensions found' % self.namespace)
+            raise NoMatches('No %s extensions found' % self.namespace)
         response = []
         for e in self.extensions:
             if filter_func(e, *args, **kwds):
diff --git a/lib/stevedore/driver.py b/lib/stevedore/driver.py
index fedc359bd5dbb7fc84b8e5cd43ad190c13ea4038..a2825aaaf14607aafa6ee78f08e01bf0406f3cbb 100644
--- a/lib/stevedore/driver.py
+++ b/lib/stevedore/driver.py
@@ -1,3 +1,4 @@
+from .exception import NoMatches, MultipleMatches
 from .named import NamedExtensionManager
 
 
@@ -93,14 +94,14 @@ class DriverManager(NamedExtensionManager):
 
         if not self.extensions:
             name = self._names[0]
-            raise RuntimeError('No %r driver found, looking for %r' %
-                               (self.namespace, name))
+            raise NoMatches('No %r driver found, looking for %r' %
+                            (self.namespace, name))
         if len(self.extensions) > 1:
             discovered_drivers = ','.join(e.entry_point_target
                                           for e in self.extensions)
 
-            raise RuntimeError('Multiple %r drivers found: %s' %
-                               (self.namespace, discovered_drivers))
+            raise MultipleMatches('Multiple %r drivers found: %s' %
+                                  (self.namespace, discovered_drivers))
 
     def __call__(self, func, *args, **kwds):
         """Invokes func() for the single loaded extension.
diff --git a/lib/stevedore/example/base.py b/lib/stevedore/example/base.py
index 1c8ca4ca361a7bb19504feaf68089ff7228029fc..ec95424ee177830f025bea92d3410bae651ea6eb 100644
--- a/lib/stevedore/example/base.py
+++ b/lib/stevedore/example/base.py
@@ -5,7 +5,7 @@ import six
 
 @six.add_metaclass(abc.ABCMeta)
 class FormatterBase(object):
-    """Base class for example plugin used in the tutoral.
+    """Base class for example plugin used in the tutorial.
     """
 
     def __init__(self, max_width=60):
diff --git a/lib/stevedore/example/setup.py b/lib/stevedore/example/setup.py
index afc7789c6e4005a83ad8640a1fc5d4feff85eca4..4289971f9a416ebf0e1a0b941f3e6fde885bc3e5 100644
--- a/lib/stevedore/example/setup.py
+++ b/lib/stevedore/example/setup.py
@@ -7,16 +7,14 @@ setup(
     description='Demonstration package for stevedore',
 
     author='Doug Hellmann',
-    author_email='doug.hellmann@dreamhost.com',
+    author_email='doug@doughellmann.com',
 
-    url='https://github.com/dreamhost/stevedore',
-    download_url='https://github.com/dreamhost/stevedore/tarball/master',
+    url='http://git.openstack.org/cgit/openstack/stevedore',
 
     classifiers=['Development Status :: 3 - Alpha',
                  'License :: OSI Approved :: Apache Software License',
                  'Programming Language :: Python',
                  'Programming Language :: Python :: 2',
-                 'Programming Language :: Python :: 2.6',
                  'Programming Language :: Python :: 2.7',
                  'Programming Language :: Python :: 3',
                  'Programming Language :: Python :: 3.4',
@@ -37,7 +35,6 @@ setup(
     entry_points={
         'stevedore.example.formatter': [
             'simple = stevedore.example.simple:Simple',
-            'field = stevedore.example.fields:FieldList',
             'plain = stevedore.example.simple:Simple',
         ],
     },
diff --git a/lib/stevedore/example2/__init__.py b/lib/stevedore/example2/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lib/stevedore/example/fields.py b/lib/stevedore/example2/fields.py
similarity index 100%
rename from lib/stevedore/example/fields.py
rename to lib/stevedore/example2/fields.py
diff --git a/lib/stevedore/example2/setup.py b/lib/stevedore/example2/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..17fe1300404e4c6ba16809a3deaecc8bb36e49d8
--- /dev/null
+++ b/lib/stevedore/example2/setup.py
@@ -0,0 +1,42 @@
+from setuptools import setup, find_packages
+
+setup(
+    name='stevedore-examples2',
+    version='1.0',
+
+    description='Demonstration package for stevedore',
+
+    author='Doug Hellmann',
+    author_email='doug@doughellmann.com',
+
+    url='http://git.openstack.org/cgit/openstack/stevedore',
+
+    classifiers=['Development Status :: 3 - Alpha',
+                 'License :: OSI Approved :: Apache Software License',
+                 'Programming Language :: Python',
+                 'Programming Language :: Python :: 2',
+                 'Programming Language :: Python :: 2.7',
+                 'Programming Language :: Python :: 3',
+                 'Programming Language :: Python :: 3.4',
+                 'Intended Audience :: Developers',
+                 'Environment :: Console',
+                 ],
+
+    platforms=['Any'],
+
+    scripts=[],
+
+    provides=['stevedore.examples2',
+              ],
+
+    packages=find_packages(),
+    include_package_data=True,
+
+    entry_points={
+        'stevedore.example.formatter': [
+            'field = stevedore.example2.fields:FieldList',
+        ],
+    },
+
+    zip_safe=False,
+)
diff --git a/lib/stevedore/exception.py b/lib/stevedore/exception.py
new file mode 100644
index 0000000000000000000000000000000000000000..10c5cc26bfe864e9e11136af851e38a7cc20cbd1
--- /dev/null
+++ b/lib/stevedore/exception.py
@@ -0,0 +1,10 @@
+class NoUniqueMatch(RuntimeError):
+    """There was more that one on no extensions matching the query."""
+
+
+class NoMatches(NoUniqueMatch):
+    """There were no extensions with the diver name found."""
+
+
+class MultipleMatches(NoUniqueMatch):
+    """There were multiple matches for the given name."""
diff --git a/lib/stevedore/extension.py b/lib/stevedore/extension.py
index 5da97c5d93efe7522fbaa5a28cbfbe9896bf3cfc..d2409885c633ab701c033172ac73160937d23c04 100644
--- a/lib/stevedore/extension.py
+++ b/lib/stevedore/extension.py
@@ -5,6 +5,7 @@ import pkg_resources
 
 import logging
 
+from .exception import NoMatches
 
 LOG = logging.getLogger(__name__)
 
@@ -218,7 +219,7 @@ class ExtensionManager(object):
         """
         if not self.extensions:
             # FIXME: Use a more specific exception class here.
-            raise RuntimeError('No %s extensions found' % self.namespace)
+            raise NoMatches('No %s extensions found' % self.namespace)
         response = []
         for e in self.extensions:
             self._invoke_one_plugin(response.append, func, e, args, kwds)
diff --git a/lib/stevedore/sphinxext.py b/lib/stevedore/sphinxext.py
index 524f9c93c8d17cec963e829f8f92c7c302e0bf7d..3c9b6ce7f9fcd46004473370ec0f12d503cbdb7f 100644
--- a/lib/stevedore/sphinxext.py
+++ b/lib/stevedore/sphinxext.py
@@ -36,12 +36,15 @@ def _simple_list(mgr):
               ext.entry_point.module_name)
 
 
-def _detailed_list(mgr, over='', under='-'):
+def _detailed_list(mgr, over='', under='-', titlecase=False):
     for name in sorted(mgr.names()):
         ext = mgr[name]
         if over:
             yield (over * len(ext.name), ext.entry_point.module_name)
-        yield (ext.name, ext.entry_point.module_name)
+        if titlecase:
+            yield (ext.name.title(), ext.entry_point.module_name)
+        else:
+            yield (ext.name, ext.entry_point.module_name)
         if under:
             yield (under * len(ext.name), ext.entry_point.module_name)
         yield ('\n', ext.entry_point.module_name)
@@ -61,6 +64,7 @@ class ListPluginsDirective(rst.Directive):
     option_spec = {
         'class': directives.class_option,
         'detailed': directives.flag,
+        'titlecase': directives.flag,
         'overline-style': directives.single_char_or_unicode,
         'underline-style': directives.single_char_or_unicode,
     }
@@ -86,9 +90,12 @@ class ListPluginsDirective(rst.Directive):
 
         result = ViewList()
 
+        titlecase = 'titlecase' in self.options
+
         if 'detailed' in self.options:
             data = _detailed_list(
-                mgr, over=overline_style, under=underline_style)
+                mgr, over=overline_style, under=underline_style,
+                titlecase=titlecase)
         else:
             data = _simple_list(mgr)
         for text, source in data:
diff --git a/lib/stevedore/tests/test_driver.py b/lib/stevedore/tests/test_driver.py
index ff9c3eac05744ca7acd72e72c3e4b055cdf30190..0a919cf76b1980263d067560eae9f54f6b7f2263 100644
--- a/lib/stevedore/tests/test_driver.py
+++ b/lib/stevedore/tests/test_driver.py
@@ -4,6 +4,7 @@
 import pkg_resources
 
 from stevedore import driver
+from stevedore import exception
 from stevedore import extension
 from stevedore.tests import test_extension
 from stevedore.tests import utils
@@ -37,7 +38,7 @@ class TestCallback(utils.TestCase):
     def test_no_drivers(self):
         try:
             driver.DriverManager('stevedore.test.extension.none', 't1')
-        except RuntimeError as err:
+        except exception.NoMatches as err:
             self.assertIn("No 'stevedore.test.extension.none' driver found",
                           str(err))
 
@@ -70,7 +71,7 @@ class TestCallback(utils.TestCase):
             dm = driver.DriverManager.make_test_instance(extensions[0])
             # Call the initialization code that verifies the extension
             dm._init_plugins(extensions)
-        except RuntimeError as err:
+        except exception.MultipleMatches as err:
             self.assertIn("Multiple", str(err))
         else:
             self.fail('Should have had an error')
diff --git a/lib/stevedore/tests/test_example_fields.py b/lib/stevedore/tests/test_example_fields.py
index a3eb39775ea02c0ffb273ecd6cfa6ebfee08593a..86aebf912f0f469d657531b40be4fc71c63cf626 100644
--- a/lib/stevedore/tests/test_example_fields.py
+++ b/lib/stevedore/tests/test_example_fields.py
@@ -1,7 +1,7 @@
-"""Tests for stevedore.exmaple.fields
+"""Tests for stevedore.example2.fields
 """
 
-from stevedore.example import fields
+from stevedore.example2 import fields
 from stevedore.tests import utils
 
 
diff --git a/lib/stevedore/tests/test_example_simple.py b/lib/stevedore/tests/test_example_simple.py
index b8ef43119f539f6a9a023c16b378d4a060016c56..2558fb7badb3d75dc1439d0536593dd61683cadf 100644
--- a/lib/stevedore/tests/test_example_simple.py
+++ b/lib/stevedore/tests/test_example_simple.py
@@ -1,4 +1,4 @@
-"""Tests for stevedore.exmaple.simple
+"""Tests for stevedore.example.simple
 """
 
 from stevedore.example import simple
diff --git a/lib/stevedore/tests/test_extension.py b/lib/stevedore/tests/test_extension.py
index b05b377682756efbd8115349d35e6d52a7ad952a..1fe02422e1e70f5b007ab09803767ff748d2e58c 100644
--- a/lib/stevedore/tests/test_extension.py
+++ b/lib/stevedore/tests/test_extension.py
@@ -3,6 +3,7 @@
 
 import mock
 
+from stevedore import exception
 from stevedore import extension
 from stevedore.tests import utils
 
@@ -159,7 +160,7 @@ class TestCallback(utils.TestCase):
                                         )
         try:
             em.map(mapped, 1, 2, a='A', b='B')
-        except RuntimeError as err:
+        except exception.NoMatches as err:
             self.assertEqual(expected_str, str(err))
 
     def test_map_method(self):
diff --git a/lib/subliminal/__init__.py b/lib/subliminal/__init__.py
index 4c0631efd474acb08cb4e46c56fc6a4968914597..25355a08ac99bae06b90931da603cea302c036ea 100644
--- a/lib/subliminal/__init__.py
+++ b/lib/subliminal/__init__.py
@@ -7,8 +7,8 @@ __copyright__ = 'Copyright 2015, Antoine Bertin'
 
 import logging
 
-from .api import (ProviderPool, check_video, provider_manager, download_best_subtitles, download_subtitles,
-                  list_subtitles, save_subtitles)
+from .api import (ProviderManager, ProviderPool, check_video, provider_manager, download_best_subtitles,
+                  download_subtitles, list_subtitles, save_subtitles)
 from .cache import region
 from .exceptions import Error, ProviderError
 from .providers import Provider
diff --git a/lib/subliminal/api.py b/lib/subliminal/api.py
index 3af8809a7d89644a099971b1839dc4bc131f94dd..81cd1e0e5a85b75746269588a25a1d12926e2c43 100644
--- a/lib/subliminal/api.py
+++ b/lib/subliminal/api.py
@@ -4,43 +4,102 @@ import io
 import logging
 import operator
 import os.path
+from pkg_resources import EntryPoint
 import socket
 
 from babelfish import Language
-from pkg_resources import EntryPoint
 import requests
-from stevedore import EnabledExtensionManager, ExtensionManager
+from stevedore import ExtensionManager
 
 from .subtitle import compute_score, get_subtitle_path
 
 logger = logging.getLogger(__name__)
 
 
-class InternalExtensionManager(ExtensionManager):
-    """Add support for internal entry points to the :class:`~stevedore.extension.Extensionmanager`
-    Internal entry points are useful for libraries that ship their own plugins but still keep the entry point open.
-    All other parameters are passed onwards to the :class:`~stevedore.extension.Extensionmanager` constructor.
-    :param internal_entry_points: the internal providers
-    :type internal_entry_points: list of :class:`~pkg_resources.EntryPoint`
+class ProviderManager(ExtensionManager):
+    """Manager for providers based on :class:`~stevedore.extension.ExtensionManager`.
+
+    It allows loading of internal providers without setup and registering/unregistering additional providers.
+
+    Loading is done in this order:
+
+    * Entry point providers
+    * Internal providers
+    * Registered providers
+
     """
-    def __init__(self, namespace, internal_entry_points, **kwargs):
-        self.internal_entry_points = list(internal_entry_points)
-        super(InternalExtensionManager, self).__init__(namespace, **kwargs)
+    internal_providers = [
+      'addic7ed = subliminal.providers.addic7ed:Addic7edProvider',
+      'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider',
+      'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider',
+      'subscenter = subliminal.providers.subscenter:SubsCenterProvider',
+      'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider',
+      'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider'
+    ]
+
+    def __init__(self):
+        #: Registered providers with entry point syntax
+        self.registered_providers = []
+
+        super(ProviderManager, self).__init__('subliminal.providers')
 
     def _find_entry_points(self, namespace):
-        return self.internal_entry_points + super(InternalExtensionManager, self)._find_entry_points(namespace)
+        # default entry points
+        eps = super(ProviderManager, self)._find_entry_points(namespace)
+
+        # internal entry points
+        for iep in self.internal_providers:
+            ep = EntryPoint.parse(iep)
+            if ep.name not in [e.name for e in eps]:
+                eps.append(ep)
+
+        # registered entry points
+        for rep in self.registered_providers:
+            ep = EntryPoint.parse(rep)
+            if ep.name not in [e.name for e in eps]:
+                eps.append(ep)
+
+        return eps
 
+    def register(self, entry_point):
+        """Register a provider
 
-provider_manager = InternalExtensionManager('subliminal.providers', [EntryPoint.parse(ep) for ep in (
-    'addic7ed = subliminal.providers.addic7ed:Addic7edProvider',
-    'legendastv = subliminal.providers.legendastv:LegendasTvProvider',
-    'napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider',
-    'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider',
-    'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider',
-    'subscenter = subliminal.providers.subscenter:SubsCenterProvider',
-    'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider',
-    'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider'
-)])
+        :param str entry_point: provider to register (entry point syntax)
+        :raise: ValueError if already registered
+
+        """
+        if entry_point in self.registered_providers:
+            raise ValueError('Entry point already registered')
+
+        ep = EntryPoint.parse(entry_point)
+        if ep.name in self.names():
+            raise ValueError('A provider with the same name already exist')
+
+        ext = self._load_one_plugin(ep, False, (), {}, False)
+        self.extensions.append(ext)
+        if self._extensions_by_name is not None:
+            self._extensions_by_name[ext.name] = ext
+        self.registered_providers.insert(0, entry_point)
+
+    def unregister(self, entry_point):
+        """Unregister a provider
+
+        :param str entry_point: provider to unregister (entry point syntax)
+
+        """
+        if entry_point not in self.registered_providers:
+            raise ValueError('Entry point not registered')
+
+        ep = EntryPoint.parse(entry_point)
+        self.registered_providers.remove(entry_point)
+        if self._extensions_by_name is not None:
+            del self._extensions_by_name[ep.name]
+        for i, ext in enumerate(self.extensions):
+            if ext.name == ep.name:
+                del self.extensions[i]
+                break
+
+provider_manager = ProviderManager()
 
 
 class ProviderPool(object):
@@ -52,8 +111,7 @@ class ProviderPool(object):
           the providers on exit.
         * Automatically discard providers on failure.
 
-    :param providers: name of providers to use, if not all.
-    :type providers: list
+    :param list providers: name of providers to use, if not all.
     :param dict provider_configs: provider configuration as keyword arguments per provider name to pass when
         instanciating the :class:`~subliminal.providers.Provider`.
 
@@ -71,9 +129,6 @@ class ProviderPool(object):
         #: Discarded providers
         self.discarded_providers = set()
 
-        #: Dedicated :data:`provider_manager` as :class:`~stevedore.enabled.EnabledExtensionManager`
-        self.manager = EnabledExtensionManager(provider_manager.namespace, lambda e: e.name in self.providers)
-
     def __enter__(self):
         return self
 
@@ -81,9 +136,11 @@ class ProviderPool(object):
         self.terminate()
 
     def __getitem__(self, name):
+        if name not in self.providers:
+            raise KeyError
         if name not in self.initialized_providers:
             logger.info('Initializing provider %s', name)
-            provider = self.manager[name].plugin(**self.provider_configs.get(name, {}))
+            provider = provider_manager[name].plugin(**self.provider_configs.get(name, {}))
             provider.initialize()
             self.initialized_providers[name] = provider
 
@@ -126,12 +183,12 @@ class ProviderPool(object):
                 continue
 
             # check video validity
-            if not self.manager[name].plugin.check(video):
+            if not provider_manager[name].plugin.check(video):
                 logger.info('Skipping provider %r: not a valid video', name)
                 continue
 
             # check supported languages
-            provider_languages = self.manager[name].plugin.languages & languages
+            provider_languages = provider_manager[name].plugin.languages & languages
             if not provider_languages:
                 logger.info('Skipping provider %r: no language to search for', name)
                 continue
diff --git a/lib/subliminal/providers/addic7ed.py b/lib/subliminal/providers/addic7ed.py
index 6061319cb0f55c7c8286ceca7bdc173841bb5177..f00273f9579c0a2cc2aa1239fbcef5f8ad5590de 100644
--- a/lib/subliminal/providers/addic7ed.py
+++ b/lib/subliminal/providers/addic7ed.py
@@ -14,6 +14,7 @@ from ..subtitle import (Subtitle, fix_line_ending, guess_matches, guess_properti
 from ..video import Episode
 
 logger = logging.getLogger(__name__)
+
 language_converters.register('addic7ed = subliminal.converters.addic7ed:Addic7edConverter')
 
 series_year_re = re.compile('^(?P<series>[ \w\'.:]+)(?: \((?P<year>\d{4})\))?$')
diff --git a/lib/subliminal/providers/legendastv.py b/lib/subliminal/providers/legendastv.py
index 888f5cad2c4fbbda4b7acd1e0bc9a69dffd62feb..258e73647f8fb42a888512d51a5649c211dc762b 100644
--- a/lib/subliminal/providers/legendastv.py
+++ b/lib/subliminal/providers/legendastv.py
@@ -20,6 +20,7 @@ from ..video import Episode, Movie, SUBTITLE_EXTENSIONS
 TIMEOUT = 10
 
 logger = logging.getLogger(__name__)
+
 language_converters.register('legendastv = subliminal.converters.legendastv:LegendasTvConverter')
 
 
diff --git a/lib/subliminal/providers/opensubtitles.py b/lib/subliminal/providers/opensubtitles.py
index 5a06a23b84cdc0f59a175f9e2789b1a1ee06aa28..3bd49e6cc0f1f1038eb7f45dd0aa76fd5132305d 100644
--- a/lib/subliminal/providers/opensubtitles.py
+++ b/lib/subliminal/providers/opensubtitles.py
@@ -121,13 +121,15 @@ class OpenSubtitlesProvider(Provider):
         logger.debug('No operation')
         checked(self.server.NoOperation(self.token))
 
-    def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None):
+    def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None, tag=None):
         # fill the search criteria
         criteria = []
         if hash and size:
             criteria.append({'moviehash': hash, 'moviebytesize': str(size)})
         if imdb_id:
             criteria.append({'imdbid': imdb_id})
+        if tag:
+            criteria.append({'tag': tag})
         if query and season and episode:
             criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode})
         elif query:
@@ -176,16 +178,16 @@ class OpenSubtitlesProvider(Provider):
         return subtitles
 
     def list_subtitles(self, video, languages):
-        query = season = episode = None
+        season = episode = None
         if isinstance(video, Episode):
             query = video.series
             season = video.season
             episode = video.episode
-        elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id:
-            query = video.name.split(os.sep)[-1]
+        else:
+            query = video.title
 
         return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id,
-                          query=query, season=season, episode=episode)
+                          query=query, season=season, episode=episode, tag=os.path.basename(video.name))
 
     def download_subtitle(self, subtitle):
         logger.info('Downloading subtitle %r', subtitle)
diff --git a/lib/subliminal/providers/thesubdb.py b/lib/subliminal/providers/thesubdb.py
index f7f1f2451bc5400e4b4b0335c8584ddee1eee4ac..da325aaf9f8ab573597c4836447bac6b54f865c7 100644
--- a/lib/subliminal/providers/thesubdb.py
+++ b/lib/subliminal/providers/thesubdb.py
@@ -10,8 +10,10 @@ from ..subtitle import Subtitle, fix_line_ending
 
 
 logger = logging.getLogger(__name__)
+
 language_converters.register('thesubdb = subliminal.converters.thesubdb:TheSubDBConverter')
 
+
 class TheSubDBSubtitle(Subtitle):
     provider_name = 'thesubdb'
 
diff --git a/lib/subliminal/providers/tvsubtitles.py b/lib/subliminal/providers/tvsubtitles.py
index 8c4433fc966bd5b0b54eba9b99dfab2291e6db9b..0b491c39e3f631afd5de98f3094bbb45acd8c5f4 100644
--- a/lib/subliminal/providers/tvsubtitles.py
+++ b/lib/subliminal/providers/tvsubtitles.py
@@ -15,6 +15,7 @@ from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_propertie
 from ..video import Episode
 
 logger = logging.getLogger(__name__)
+
 language_converters.register('tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter')
 
 link_re = re.compile('^(?P<series>.+?)(?: \(?\d{4}\)?| \((?:US|UK)\))? \((?P<first_year>\d{4})-\d{4}\)$')
diff --git a/lib/subliminal/video.py b/lib/subliminal/video.py
index b04d535cb60f25ddfb4023837cb9d99ff278a9f1..3384e7b3e3fb8197de318e799078d681e4420ee7 100644
--- a/lib/subliminal/video.py
+++ b/lib/subliminal/video.py
@@ -7,7 +7,7 @@ import os
 import struct
 
 from babelfish import Error as BabelfishError, Language
-from enzyme import Error as EnzymeError, MKV
+from enzyme import MKV
 from guessit import guess_episode_info, guess_file_info, guess_movie_info
 
 logger = logging.getLogger(__name__)
diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py
index 7b20b57330223bc0ed47829f0ca785c6e0539bc9..7073f95a5bf3b77e34a75b213cd8b55dc425f36f 100644
--- a/sickbeard/subtitles.py
+++ b/sickbeard/subtitles.py
@@ -25,10 +25,9 @@ import datetime
 import traceback
 import subliminal
 import subprocess
-import pkg_resources
 import sickbeard
-from subliminal.api import provider_manager
 from babelfish import Language, language_converters
+from subliminal import ProviderPool, provider_manager
 from sickbeard import logger
 from sickbeard import history
 from sickbeard import db
@@ -40,32 +39,8 @@ 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')
-
-ENTRY_POINTS = {
-    'subliminal.providers': [
-        'addic7ed = subliminal.providers.addic7ed:Addic7edProvider',
-        'legendastv = subliminal.providers.legendastv:LegendasTvProvider',
-        'napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider',
-        'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider',
-        'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider',
-        'subscenter = subliminal.providers.subscenter:SubsCenterProvider',
-        'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider',
-        'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider'
-    ],
-    'babelfish.language_converters': [
-        'addic7ed = subliminal.converters.addic7ed:Addic7edConverter',
-        'legendastv = subliminal.converters.legendastv:LegendasTvConverter',
-        'thesubdb = subliminal.converters.thesubdb:TheSubDBConverter',
-        'tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter'
-    ]
-}
-
-DISTRIBUTION._ep_map = pkg_resources.EntryPoint.parse_map(ENTRY_POINTS, DISTRIBUTION)  # pylint: disable=protected-access
-pkg_resources.working_set.add(DISTRIBUTION)
-
-provider_manager.ENTRY_POINT_CACHE.pop('subliminal.providers')
+provider_manager.register('legendastv = subliminal.providers.legendastv:LegendasTvProvider')
+provider_manager.register('napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider')
 
 subliminal.region.configure('dogpile.cache.memory')
 
@@ -87,14 +62,14 @@ def sorted_service_list():
 
     current_index = 0
     for current_service in sickbeard.SUBTITLES_SERVICES_LIST:
-        if current_service in subliminal.provider_manager.names():
+        if current_service in provider_manager.names():
             new_list.append({'name': current_service,
                              'url': PROVIDER_URLS[current_service] if current_service in PROVIDER_URLS else lmgtfy % current_service,
                              'image': current_service + '.png',
                              'enabled': sickbeard.SUBTITLES_SERVICES_ENABLED[current_index] == 1})
         current_index += 1
 
-    for current_service in subliminal.provider_manager.names():
+    for current_service in provider_manager.names():
         if current_service not in [service['name'] for service in new_list]:
             new_list.append({'name': current_service,
                              'url': PROVIDER_URLS[current_service] if current_service in PROVIDER_URLS else lmgtfy % current_service,
@@ -187,7 +162,7 @@ def download_subtitles(subtitles_info):  # pylint: disable=too-many-locals, too-
                         'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER,
                                           'password': sickbeard.OPENSUBTITLES_PASS}}
 
-    pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs)
+    pool = ProviderPool(providers=providers, provider_configs=provider_configs)
 
     try:
         subtitles_list = pool.list_subtitles(video, languages)
@@ -333,7 +308,7 @@ class SubtitlesFinder(object):
                             'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER,
                                               'password': sickbeard.OPENSUBTITLES_PASS}}
 
-        pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs)
+        pool = ProviderPool(providers=providers, provider_configs=provider_configs)
 
         # Search for all wanted languages
         languages = {from_code(language) for language in wanted_languages()}