diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py
index 671dde4fa0ccc24dc4b3f983ade8b28181b28e3a..b3b8773e00da4abcd5cbbb33f01ad4583b0f82fa 100644
--- a/lib/spack/spack/cmd/common/arguments.py
+++ b/lib/spack/spack/cmd/common/arguments.py
@@ -8,7 +8,7 @@
 
 import spack.cmd
 import spack.config
-import spack.environment
+import spack.environment as ev
 import spack.modules
 import spack.spec
 import spack.store
@@ -54,7 +54,7 @@ def _specs(self, **kwargs):
 
         # If an environment is provided, we'll restrict the search to
         # only its installed packages.
-        env = spack.environment.active
+        env = ev._active_environment
         if env:
             kwargs['hashes'] = set(env.all_hashes())
 
diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py
index b40790af7145ea148c15c3a97c3cd18dcbbde2c8..c8b9c169b5ff7c0225a9c02b3888334386ee69c6 100644
--- a/lib/spack/spack/cmd/env.py
+++ b/lib/spack/spack/cmd/env.py
@@ -258,7 +258,7 @@ def env_list(args):
 
     color_names = []
     for name in names:
-        if ev.active and name == ev.active.name:
+        if ev.active(name):
             name = colorize('@*g{%s}' % name)
         color_names.append(name)
 
diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py
index cb02aa4f410fb0fcd6130f091cfb399f4665cd01..10f56fc4a0c72e394db173aed57dd9d02cf4ebc7 100644
--- a/lib/spack/spack/cmd/uninstall.py
+++ b/lib/spack/spack/cmd/uninstall.py
@@ -61,18 +61,20 @@ def setup_parser(subparser):
         help="specs of packages to uninstall")
 
 
-def find_matching_specs(specs, allow_multiple_matches=False, force=False):
+def find_matching_specs(env, specs, allow_multiple_matches=False, force=False):
     """Returns a list of specs matching the not necessarily
        concretized specs given from cli
 
     Args:
-        specs: list of specs to be matched against installed packages
-        allow_multiple_matches : if True multiple matches are admitted
+        env (Environment): active environment, or ``None`` if there is not one
+        specs (list): list of specs to be matched against installed packages
+        allow_multiple_matches (bool): if True multiple matches are admitted
 
     Return:
         list of specs
     """
-    hashes = ev.active.all_hashes() if ev.active else None
+    # constrain uninstall resolution to current environment if one is active
+    hashes = env.all_hashes() if env else None
 
     # List of specs that match expressions given via command line
     specs_from_cli = []
@@ -90,8 +92,8 @@ def find_matching_specs(specs, allow_multiple_matches=False, force=False):
 
         # No installed package matches the query
         if len(matching) == 0 and spec is not any:
-            if ev.active:
-                pkg_type = "packages in environment '%s'" % ev.active.name
+            if env:
+                pkg_type = "packages in environment '%s'" % env.name
             else:
                 pkg_type = 'installed packages'
             tty.die('{0} does not match any {1}.'.format(spec, pkg_type))
@@ -147,13 +149,14 @@ def dependent_environments(specs):
     return dependents
 
 
-def do_uninstall(specs, force):
+def do_uninstall(env, specs, force):
     """
     Uninstalls all the specs in a list.
 
     Args:
-        specs: list of specs to be uninstalled
-        force: force uninstallation (boolean)
+        env (Environment): active environment, or ``None`` if there is not one
+        specs (list): list of specs to be uninstalled
+        force (bool): force uninstallation (boolean)
     """
     packages = []
     for item in specs:
@@ -165,11 +168,13 @@ def do_uninstall(specs, force):
             # want to uninstall.
             spack.package.Package.uninstall_by_spec(item, force=True)
 
-        if ev.active:
+        if env:
             try:
-                ev.active.remove(item, force=True)
+                # try removing the spec from the current active
+                # environment. this will fail if the spec is not a root
+                env.remove(item, force=True)
             except ev.SpackEnvironmentError:
-                pass  # ignore errors from specs that are not roots
+                pass  # ignore non-root specs
 
     # Sort packages to be uninstalled by the number of installed dependents
     # This ensures we do things in the right order
@@ -183,14 +188,14 @@ def num_installed_deps(pkg):
         item.do_uninstall(force=force)
 
     # write any changes made to the active environment
-    if ev.active:
-        ev.active.write()
+    if env:
+        env.write()
 
 
-def get_uninstall_list(args, specs):
+def get_uninstall_list(args, specs, env):
     # Gets the list of installed specs that match the ones give via cli
     # takes care of '-a' is given in the cli
-    uninstall_list = find_matching_specs(specs, args.all, args.force)
+    uninstall_list = find_matching_specs(env, specs, args.all, args.force)
 
     # Takes care of '-R'
     spec_dependents = installed_dependents(uninstall_list)
@@ -231,7 +236,7 @@ def get_uninstall_list(args, specs):
             msgs.append(
                 'use `spack env remove` to remove environments, or '
                 '`spack remove` to remove specs from environments.')
-        if ev.active:
+        if env:
             msgs.append('consider using `spack remove` to remove the spec '
                         'from this environment')
         print()
@@ -246,7 +251,8 @@ def get_uninstall_list(args, specs):
 
 
 def uninstall_specs(args, specs):
-    uninstall_list = get_uninstall_list(args, specs)
+    env = ev.get_env(args, 'uninstall', required=False)
+    uninstall_list = get_uninstall_list(args, specs, env)
 
     if not uninstall_list:
         tty.warn('There are no package to uninstall.')
@@ -260,7 +266,7 @@ def uninstall_specs(args, specs):
             tty.die('Will not uninstall any packages.')
 
     # Uninstall everything on the list
-    do_uninstall(uninstall_list, args.force)
+    do_uninstall(env, uninstall_list, args.force)
 
 
 def uninstall(parser, args):
diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py
index cfb3cd2c2894b6cd338a6047524cce4166273366..208eb485ae3df9022b43ab80b5d80b21e8466da9 100644
--- a/lib/spack/spack/environment.py
+++ b/lib/spack/spack/environment.py
@@ -28,7 +28,7 @@
 
 
 #: currently activated environment
-active = None
+_active_environment = None
 
 
 #: path where environments are stored in the spack tree
@@ -98,14 +98,14 @@ def activate(env, use_env_repo=False):
     TODO: Add support for views here.  Activation should set up the shell
     TODO: environment to use the activated spack environment.
     """
-    global active
+    global _active_environment
 
-    active = env
-    prepare_config_scope(active)
+    _active_environment = env
+    prepare_config_scope(_active_environment)
     if use_env_repo:
-        spack.repo.path.put_first(active.repo)
+        spack.repo.path.put_first(_active_environment.repo)
 
-    tty.debug("Using environmennt '%s'" % active.name)
+    tty.debug("Using environmennt '%s'" % _active_environment.name)
 
 
 def deactivate():
@@ -116,19 +116,19 @@ def deactivate():
         environment was active.
 
     """
-    global active
+    global _active_environment
 
-    if not active:
+    if not _active_environment:
         return
 
-    deactivate_config_scope(active)
+    deactivate_config_scope(_active_environment)
 
     # use _repo so we only remove if a repo was actually constructed
-    if active._repo:
-        spack.repo.path.remove(active._repo)
+    if _active_environment._repo:
+        spack.repo.path.remove(_active_environment._repo)
 
-    tty.debug("Deactivated environmennt '%s'" % active.name)
-    active = None
+    tty.debug("Deactivated environmennt '%s'" % _active_environment.name)
+    _active_environment = None
 
 
 def find_environment(args):
@@ -219,8 +219,8 @@ def get_env(args, cmd_name, required=True):
             raise SpackEnvironmentError('no environment in %s' % env)
 
     # try the active environment. This is set by find_environment() (above)
-    if active:
-        return active
+    if _active_environment:
+        return _active_environment
     elif not required:
         return None
     else:
@@ -245,6 +245,11 @@ def exists(name):
     return os.path.isdir(root(name))
 
 
+def active(name):
+    """True if the named environment is active."""
+    return _active_environment and name == _active_environment.name
+
+
 def is_env_dir(path):
     """Whether a directory contains a spack environment."""
     return os.path.isdir(path) and os.path.exists(
@@ -407,7 +412,7 @@ def name(self):
     @property
     def active(self):
         """True if this environment is currently active."""
-        return active and self.path == active.path
+        return _active_environment and self.path == _active_environment.path
 
     @property
     def manifest_path(self):
@@ -854,7 +859,7 @@ def write(self):
             _write_yaml(self.yaml, f)
 
     def __enter__(self):
-        self._previous_active = active
+        self._previous_active = _active_environment
         activate(self)
         return
 
diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py
index 9fe53b8f665ce1f196eecec89b33ffb541ada4c8..4405335cf404ef63e71dd0f01ec5854380110ae6 100644
--- a/lib/spack/spack/test/conftest.py
+++ b/lib/spack/spack/test/conftest.py
@@ -44,7 +44,7 @@
 @pytest.fixture(scope='session', autouse=True)
 def clean_user_environment():
     env_var = ev.spack_env_var in os.environ
-    active = ev.active
+    active = ev._active_environment
 
     if env_var:
         spack_env_value = os.environ.pop(ev.spack_env_var)