diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py
index 549d0a9a0fcec08436c7cb13d918e232d6941335..20ae8c92727d6f0fe950d95ebbaa5398e41a24c5 100644
--- a/lib/spack/spack/__init__.py
+++ b/lib/spack/spack/__init__.py
@@ -54,11 +54,11 @@
 #
 # Set up the default packages database.
 #
-import spack.packages
+import spack.repository
 _repo_paths = spack.config.get_repos_config()
 if not _repo_paths:
     tty.die("Spack configuration contains no package repositories.")
-db = spack.packages.PackageFinder(*_repo_paths)
+db = spack.repository.RepoPath(*_repo_paths)
 sys.meta_path.append(db)
 
 #
diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py
index e290f60b7b925c830bbe816d1bdeb369730d240e..87f21b833d1669b1b8f3dc4dd427bbb4471ff655 100644
--- a/lib/spack/spack/cmd/repo.py
+++ b/lib/spack/spack/cmd/repo.py
@@ -32,7 +32,7 @@
 import spack.spec
 import spack.config
 from spack.util.environment import get_path
-from spack.packages import repo_config_filename
+from spack.repository import repo_config_filename
 
 import os
 import exceptions
diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py
index e80f2d2636d0d3dbcba3f7f34a7bc565547f53a3..eba76ef71db1a0464033dc5a26923bd0f57f8868 100644
--- a/lib/spack/spack/cmd/uninstall.py
+++ b/lib/spack/spack/cmd/uninstall.py
@@ -30,7 +30,7 @@
 
 import spack
 import spack.cmd
-import spack.packages
+import spack.repository
 from spack.cmd.find import display_specs
 from spack.package import PackageStillNeededError
 
@@ -80,7 +80,7 @@ def uninstall(parser, args):
                     # should work if package is known to spack
                     pkgs.append(s.package)
 
-                except spack.packages.UnknownPackageError, e:
+                except spack.repository.UnknownPackageError, e:
                     # The package.py file has gone away -- but still want to uninstall.
                     spack.Package(s).do_uninstall(force=True)
 
diff --git a/lib/spack/spack/repo_loader.py b/lib/spack/spack/repo_loader.py
deleted file mode 100644
index 441011cf986043b2fbae109cc81bb864aeff4dc5..0000000000000000000000000000000000000000
--- a/lib/spack/spack/repo_loader.py
+++ /dev/null
@@ -1,110 +0,0 @@
-import re
-import sys
-import types
-import traceback
-
-from llnl.util.lang import *
-import spack
-
-# Name of module under which packages are imported
-imported_packages_module = 'spack.repos'
-
-# Name of the package file inside a package directory
-package_file_name = 'package.py'
-
-class LazyLoader:
-    """The LazyLoader handles cases when repo modules or classes
-       are imported.  It watches for 'spack.repos.*' loads, then
-       redirects the load to the appropriate module."""
-    def find_module(self, fullname, pathname):
-        if not fullname.startswith(imported_packages_module):
-            return None
-
-        partial_name = fullname[len(imported_packages_module)+1:]
-
-        print "partial: ", partial_name
-        print
-
-        last_dot = partial_name.rfind('.')
-        repo = partial_name[:last_dot]
-        module = partial_name[last_dot+1:]
-
-        repo_loader = spack.db.repo_loaders.get(repo)
-        if repo_loader:
-            try:
-                self.mod = repo_loader.get_module(module)
-                return self
-            except (ImportError, spack.packages.UnknownPackageError):
-                return None
-
-    def load_module(self, fullname):
-        return self.mod
-
-#sys.meta_path.append(LazyLoader())
-
-_reponames = {}
-class RepoNamespace(types.ModuleType):
-    """The RepoNamespace holds the repository namespaces under
-       spack.repos.  For example, when accessing spack.repos.original
-       this class will use __getattr__ to translate the 'original'
-       into one of spack's known repositories"""
-    def __init__(self):
-        sys.modules[imported_packages_module] = self
-
-    def __getattr__(self, name):
-        if name in _reponames:
-            return _reponames[name]
-        raise AttributeError
-
-    @property
-    def __file__(self):
-        return None
-
-    @property
-    def __path__(self):
-        return []
-
-
-class RepoLoader(types.ModuleType):
-    """Each RepoLoader is associated with a repository, and the RepoLoader is
-       responsible for loading packages out of that repository.  For example,
-       a RepoLoader may be responsible for spack.repos.original, and when someone
-       references spack.repos.original.libelf that RepoLoader will load the
-       libelf package."""
-    def __init__(self, reponame, repopath):
-        self.path = repopath
-        self.reponame = reponame
-        self.module_name = imported_packages_module + '.' + reponame
-        if not reponame in _reponames:
-            _reponames[reponame] = self
-
-        sys.modules[self.module_name] = self
-
-
-    @property
-    def __path__(self):
-        return [ self.path ]
-
-
-    def __getattr__(self, name):
-        if name[0] == '_':
-            raise AttributeError
-        return self.get_module(name)
-
-
-    @memoized
-    def get_module(self, pkg_name):
-        import os
-        import imp
-        import llnl.util.tty as tty
-
-
-        try:
-            module_name = imported_packages_module + '.' + self.reponame + '.' + pkg_name
-            module = imp.load_source(module_name, file_path)
-
-        except ImportError, e:
-            tty.die("Error while importing %s from %s:\n%s" % (
-                pkg_name, file_path, e.message))
-
-        return module
diff --git a/lib/spack/spack/packages.py b/lib/spack/spack/repository.py
similarity index 97%
rename from lib/spack/spack/packages.py
rename to lib/spack/spack/repository.py
index 8114b7f1aa4f7949b43a32679e4065ef76b4cc7b..c1545b365473569615ef891c6d6ad3f6fce58eaf 100644
--- a/lib/spack/spack/packages.py
+++ b/lib/spack/spack/repository.py
@@ -67,8 +67,8 @@ def _make_namespace_module(ns):
     return module
 
 
-class PackageFinder(object):
-    """A PackageFinder is a wrapper around a list of Repos.
+class RepoPath(object):
+    """A RepoPath is a list of repos that function as one.
 
        It functions exactly like a Repo, but it operates on the
        combined results of the Repos in its list instead of on a
@@ -83,7 +83,10 @@ def __init__(self, *repo_dirs):
         self._provider_index = None
 
         for root in repo_dirs:
-            repo = Repo(root)
+            # Try to make it a repo if it's not one.
+            if not isinstance(root, Repo):
+                repo = Repo(root)
+            # Add the repo to the path.
             self.put_last(repo)
 
 
@@ -94,7 +97,11 @@ def swap(self, other):
         TODO: Maybe there is a cleaner way.
 
         """
-        attrs = ['repos', 'by_namespace', 'by_path', '_all_package_names', '_provider_index']
+        attrs = ['repos',
+                 'by_namespace',
+                 'by_path',
+                 '_all_package_names',
+                 '_provider_index']
         for attr in attrs:
             tmp = getattr(self, attr)
             setattr(self, attr, getattr(other, attr))
@@ -185,7 +192,7 @@ def find_module(self, fullname, path=None):
                 return repo
 
         # No repo provides the namespace, but it is a valid prefix of
-        # something in the PackageFinder.
+        # something in the RepoPath.
         if self.by_namespace.is_prefix(fullname):
             return self
 
@@ -603,7 +610,7 @@ def __init__(self, name, repo=None):
 
 
 class DuplicateRepoError(spack.error.SpackError):
-    """Raised when duplicate repos are added to a PackageFinder."""
+    """Raised when duplicate repos are added to a RepoPath."""
     def __init__(self, msg, repo1, repo2):
         super(UnknownPackageError, self).__init__(
             "%s: %s, %s" % (msg, repo1, repo2))
diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py
index 55b3f0b18f931fdb5088741074f8a558c970b95b..580620e0e869ed7bed699633fbd97b6015794808 100644
--- a/lib/spack/spack/test/directory_layout.py
+++ b/lib/spack/spack/test/directory_layout.py
@@ -34,7 +34,7 @@
 
 import spack
 from spack.spec import Spec
-from spack.packages import PackageFinder
+from spack.repository import RepoPath
 from spack.directory_layout import YamlDirectoryLayout
 
 # number of packages to test (to reduce test time)
@@ -123,7 +123,7 @@ def test_handle_unknown_package(self):
            information about installed packages' specs to uninstall
            or query them again if the package goes away.
         """
-        mock_db = PackageFinder(spack.mock_packages_path)
+        mock_db = RepoPath(spack.mock_packages_path)
 
         not_in_mock = set.difference(
             set(spack.db.all_package_names()),
diff --git a/lib/spack/spack/test/mock_packages_test.py b/lib/spack/spack/test/mock_packages_test.py
index 071c21b7e082152a66be0aeaf6335384899729b2..8c6273def007ef1d07a134b4d799cf4b822c825c 100644
--- a/lib/spack/spack/test/mock_packages_test.py
+++ b/lib/spack/spack/test/mock_packages_test.py
@@ -27,7 +27,7 @@
 
 import spack
 import spack.config
-from spack.packages import PackageFinder
+from spack.repository import RepoPath
 from spack.spec import Spec
 
 
@@ -36,7 +36,7 @@ def initmock(self):
         # Use the mock packages database for these tests.  This allows
         # us to set up contrived packages that don't interfere with
         # real ones.
-        self.db = PackageFinder(spack.mock_packages_path)
+        self.db = RepoPath(spack.mock_packages_path)
         spack.db.swap(self.db)
 
         spack.config.clear_config_caches()
diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py
index a39856824409c1d495c8d73051de33cfc99e3d8b..0a132fd7018cb1979895a25759827f853f237013 100644
--- a/lib/spack/spack/test/package_sanity.py
+++ b/lib/spack/spack/test/package_sanity.py
@@ -28,7 +28,7 @@
 import unittest
 
 import spack
-from spack.packages import PackageFinder
+from spack.repository import RepoPath
 
 
 class PackageSanityTest(unittest.TestCase):
@@ -46,7 +46,7 @@ def test_get_all_packages(self):
 
     def ztest_get_all_mock_packages(self):
         """Get the mock packages once each too."""
-        db = PackageFinder(spack.mock_packages_path)
+        db = RepoPath(spack.mock_packages_path)
         spack.db.swap(db)
         self.check_db()
         spack.db.swap(db)
diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py
index 2d19d9ddc7e4b8c746fa673124c1e9ece64fed77..8a786e364e4f40e7fcd773397319d37543705f66 100644
--- a/lib/spack/spack/test/packages.py
+++ b/lib/spack/spack/test/packages.py
@@ -27,7 +27,7 @@
 from llnl.util.filesystem import join_path
 
 import spack
-from spack.packages import Repo
+from spack.repository import Repo
 from spack.util.naming import mod_to_class
 from spack.test.mock_packages_test import *