diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 0383c9a..c5588e0 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -173,7 +173,13 @@
     return inner
 
 
-# Finders/loaders #############################################################
+def _suffix_list(suffix_type):
+    """Return a list of file suffixes based on the imp file type."""
+    return [suffix[0] for suffix in imp.get_suffixes()
+            if suffix[2] == suffix_type]
+
+
+# Loaders #####################################################################
 
 class BuiltinImporter:
 
@@ -241,100 +247,6 @@
             raise
 
 
-def _chained_path_hook(*path_hooks):
-    """Create a closure which sequentially checks path hooks to see which ones
-    (if any) can work with a path."""
-    def path_hook(entry):
-        """Check to see if 'entry' matches any of the enclosed path hooks."""
-        finders = []
-        for hook in path_hooks:
-            try:
-                finder = hook(entry)
-            except ImportError:
-                continue
-            else:
-                finders.append(finder)
-        if not finders:
-            raise ImportError("no finder found")
-        else:
-            return _ChainedFinder(*finders)
-
-    return path_hook
-
-
-class _ChainedFinder:
-
-    """Finder that sequentially calls other finders."""
-
-    def __init__(self, *finders):
-        self._finders = finders
-
-    def find_module(self, fullname, path=None):
-        for finder in self._finders:
-            result = finder.find_module(fullname, path)
-            if result:
-                return result
-        else:
-            return None
-
-
-
-class _ExtensionFileLoader:
-
-    """Loader for extension modules.
-
-    The constructor is designed to work with FileFinder.
-
-    """
-
-    def __init__(self, name, path, is_pkg):
-        """Initialize the loader.
-
-        If is_pkg is True then an exception is raised as extension modules
-        cannot be the __init__ module for an extension module.
-
-        """
-        self._name = name
-        self._path = path
-        if is_pkg:
-            raise ValueError("extension modules cannot be packages")
-
-    @_check_name
-    @set_package
-    @set_loader
-    def load_module(self, fullname):
-        """Load an extension module."""
-        is_reload = fullname in sys.modules
-        try:
-            return imp.load_dynamic(fullname, self._path)
-        except:
-            if not is_reload and fullname in sys.modules:
-                del sys.modules[fullname]
-            raise
-
-    @_check_name
-    def is_package(self, fullname):
-        """Return False as an extension module can never be a package."""
-        return False
-
-    @_check_name
-    def get_code(self, fullname):
-        """Return None as an extension module cannot create a code object."""
-        return None
-
-    @_check_name
-    def get_source(self, fullname):
-        """Return None as extension modules have no source code."""
-        return None
-
-
-def _suffix_list(suffix_type):
-    """Return a list of file suffixes based on the imp file type."""
-    return [suffix[0] for suffix in imp.get_suffixes()
-            if suffix[2] == suffix_type]
-
-
-
 class PyLoader:
 
     """Loader base class for Python source.
@@ -584,104 +496,56 @@
                 raise
 
 
-class FileFinder:
+class _ExtensionFileLoader:
 
-    """Base class for file finders.
+    """Loader for extension modules.
 
-    Subclasses are expected to define the following attributes:
-
-        * _suffixes
-            Sequence of file suffixes whose order will be followed.
-
-        * _possible_package
-            True if importer should check for packages.
-
-        * _loader
-            A callable that takes the module name, a file path, and whether
-            the path points to a package and returns a loader for the module
-            found at that path.
+    The constructor is designed to work with FileFinder.
 
     """
 
-    def __init__(self, path_entry):
-        """Initialize an importer for the passed-in sys.path entry (which is
-        assumed to have already been verified as an existing directory).
+    def __init__(self, name, path, is_pkg):
+        """Initialize the loader.
 
-        Can be used as an entry on sys.path_hook.
+        If is_pkg is True then an exception is raised as extension modules
+        cannot be the __init__ module for an extension module.
 
         """
-        absolute_path = _path_absolute(path_entry)
-        if not _path_isdir(absolute_path):
-            raise ImportError("only directories are supported")
-        self._path_entry = absolute_path
+        self._name = name
+        self._path = path
+        if is_pkg:
+            raise ValueError("extension modules cannot be packages")
 
-    def find_module(self, fullname, path=None):
-        tail_module = fullname.rpartition('.')[2]
-        package_directory = None
-        if self._possible_package:
-            for ext in self._suffixes:
-                package_directory = _path_join(self._path_entry, tail_module)
-                init_filename = '__init__' + ext
-                package_init = _path_join(package_directory, init_filename)
-                if (_path_isfile(package_init) and
-                        _case_ok(self._path_entry, tail_module) and
-                        _case_ok(package_directory, init_filename)):
-                    return self._loader(fullname, package_init, True)
-        for ext in self._suffixes:
-            file_name = tail_module + ext
-            file_path = _path_join(self._path_entry, file_name)
-            if (_path_isfile(file_path) and
-                    _case_ok(self._path_entry, file_name)):
-                return self._loader(fullname, file_path, False)
-        else:
-            # Raise a warning if it matches a directory w/o an __init__ file.
-            if (package_directory is not None and
-                    _path_isdir(package_directory) and
-                    _case_ok(self._path_entry, tail_module)):
-                _warnings.warn("Not importing directory %s: missing __init__"
-                                % package_directory, ImportWarning)
-            return None
+    @_check_name
+    @set_package
+    @set_loader
+    def load_module(self, fullname):
+        """Load an extension module."""
+        is_reload = fullname in sys.modules
+        try:
+            return imp.load_dynamic(fullname, self._path)
+        except:
+            if not is_reload and fullname in sys.modules:
+                del sys.modules[fullname]
+            raise
+
+    @_check_name
+    def is_package(self, fullname):
+        """Return False as an extension module can never be a package."""
+        return False
+
+    @_check_name
+    def get_code(self, fullname):
+        """Return None as an extension module cannot create a code object."""
+        return None
+
+    @_check_name
+    def get_source(self, fullname):
+        """Return None as extension modules have no source code."""
+        return None
 
 
-class ExtensionFileFinder(FileFinder):
-
-    """Importer for extension files."""
-
-    _possible_package = False
-    _loader = _ExtensionFileLoader
-
-    def __init__(self, path_entry):
-        # Assigning to _suffixes here instead of at the class level because
-        # imp is not imported at the time of class creation.
-        self._suffixes = _suffix_list(imp.C_EXTENSION)
-        super().__init__(path_entry)
-
-
-class PyFileFinder(FileFinder):
-
-    """Importer for source/bytecode files."""
-
-    _possible_package = True
-    _loader = PyFileLoader
-
-    def __init__(self, path_entry):
-        # Lack of imp during class creation means _suffixes is set here.
-        # Make sure that Python source files are listed first!  Needed for an
-        # optimization by the loader.
-        self._suffixes = _suffix_list(imp.PY_SOURCE)
-        super().__init__(path_entry)
-
-
-class PyPycFileFinder(PyFileFinder):
-
-    """Finder for source and bytecode files."""
-
-    _loader = PyPycFileLoader
-
-    def __init__(self, path_entry):
-        super().__init__(path_entry)
-        self._suffixes += _suffix_list(imp.PY_COMPILED)
-
+# Finders #####################################################################
 
 class PathFinder:
 
@@ -746,19 +610,144 @@
             return None
 
 
+class _ChainedFinder:
+
+    """Finder that sequentially calls other finders."""
+
+    def __init__(self, *finders):
+        self._finders = finders
+
+    def find_module(self, fullname, path=None):
+        for finder in self._finders:
+            result = finder.find_module(fullname, path)
+            if result:
+                return result
+        else:
+            return None
+
+
+class FileFinder:
+
+    """Base class for file finders.
+
+    Subclasses are expected to define the following attributes:
+
+        * _suffixes
+            Sequence of file suffixes whose order will be followed.
+
+        * _possible_package
+            True if importer should check for packages.
+
+        * _loader
+            A callable that takes the module name, a file path, and whether
+            the path points to a package and returns a loader for the module
+            found at that path.
+
+    """
+
+    def __init__(self, path_entry):
+        """Initialize an importer for the passed-in sys.path entry (which is
+        assumed to have already been verified as an existing directory).
+
+        Can be used as an entry on sys.path_hook.
+
+        """
+        absolute_path = _path_absolute(path_entry)
+        if not _path_isdir(absolute_path):
+            raise ImportError("only directories are supported")
+        self._path_entry = absolute_path
+
+    def find_module(self, fullname, path=None):
+        tail_module = fullname.rpartition('.')[2]
+        package_directory = None
+        if self._possible_package:
+            for ext in self._suffixes:
+                package_directory = _path_join(self._path_entry, tail_module)
+                init_filename = '__init__' + ext
+                package_init = _path_join(package_directory, init_filename)
+                if (_path_isfile(package_init) and
+                        _case_ok(self._path_entry, tail_module) and
+                        _case_ok(package_directory, init_filename)):
+                    return self._loader(fullname, package_init, True)
+        for ext in self._suffixes:
+            file_name = tail_module + ext
+            file_path = _path_join(self._path_entry, file_name)
+            if (_path_isfile(file_path) and
+                    _case_ok(self._path_entry, file_name)):
+                return self._loader(fullname, file_path, False)
+        else:
+            # Raise a warning if it matches a directory w/o an __init__ file.
+            if (package_directory is not None and
+                    _path_isdir(package_directory) and
+                    _case_ok(self._path_entry, tail_module)):
+                _warnings.warn("Not importing directory %s: missing __init__"
+                                % package_directory, ImportWarning)
+            return None
+
+
+class PyFileFinder(FileFinder):
+
+    """Importer for source/bytecode files."""
+
+    _possible_package = True
+    _loader = PyFileLoader
+
+    def __init__(self, path_entry):
+        # Lack of imp during class creation means _suffixes is set here.
+        # Make sure that Python source files are listed first!  Needed for an
+        # optimization by the loader.
+        self._suffixes = _suffix_list(imp.PY_SOURCE)
+        super().__init__(path_entry)
+
+
+class PyPycFileFinder(PyFileFinder):
+
+    """Finder for source and bytecode files."""
+
+    _loader = PyPycFileLoader
+
+    def __init__(self, path_entry):
+        super().__init__(path_entry)
+        self._suffixes += _suffix_list(imp.PY_COMPILED)
+
+
+
+
+class ExtensionFileFinder(FileFinder):
+
+    """Importer for extension files."""
+
+    _possible_package = False
+    _loader = _ExtensionFileLoader
+
+    def __init__(self, path_entry):
+        # Assigning to _suffixes here instead of at the class level because
+        # imp is not imported at the time of class creation.
+        self._suffixes = _suffix_list(imp.C_EXTENSION)
+        super().__init__(path_entry)
+
+
 # Import itself ###############################################################
 
-class _ImportLockContext:
+def _chained_path_hook(*path_hooks):
+    """Create a closure which sequentially checks path hooks to see which ones
+    (if any) can work with a path."""
+    def path_hook(entry):
+        """Check to see if 'entry' matches any of the enclosed path hooks."""
+        finders = []
+        for hook in path_hooks:
+            try:
+                finder = hook(entry)
+            except ImportError:
+                continue
+            else:
+                finders.append(finder)
+        if not finders:
+            raise ImportError("no finder found")
+        else:
+            return _ChainedFinder(*finders)
 
-    """Context manager for the import lock."""
-
-    def __enter__(self):
-        """Acquire the import lock."""
-        imp.acquire_lock()
-
-    def __exit__(self, exc_type, exc_value, exc_traceback):
-        """Release the import lock regardless of any raised exceptions."""
-        imp.release_lock()
+    return path_hook
 
 
 _DEFAULT_PATH_HOOK = _chained_path_hook(ExtensionFileFinder, PyPycFileFinder)
@@ -784,6 +773,18 @@
         return super()._path_importer_cache(path, _DEFAULT_PATH_HOOK)
 
 
+class _ImportLockContext:
+
+    """Context manager for the import lock."""
+
+    def __enter__(self):
+        """Acquire the import lock."""
+        imp.acquire_lock()
+
+    def __exit__(self, exc_type, exc_value, exc_traceback):
+        """Release the import lock regardless of any raised exceptions."""
+        imp.release_lock()
+
 
 _IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder]
 
