diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index 72656b8ae0c4f0bc9d4ae85b7619021dd655db71..db8b20ae42ee8731ef70aba69c6ed84f0a87afe1 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -471,6 +471,7 @@ class Dotkit(EnvModule):
     path = join_path(spack.share_path, 'dotkit')
     environment_modifications_formats = {
         PrependPath: 'dk_alter {name} {value}\n',
+        RemovePath: 'dk_unalter {name} {value}\n',
         SetEnv: 'dk_setenv {name} {value}\n'
     }
 
diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
index 493ca16417c929e503dfa938b02f46aa9b51dab1..fb98b2473c56a0a9a772cd472539bf4c453fd014 100644
--- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
+++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
@@ -42,15 +42,27 @@ class IntelParallelStudio(IntelInstaller):
     variant('daal',
             default=True, description="Install the Intel DAAL libraries")
     variant('ipp', default=True, description="Install the Intel IPP libraries")
-    variant('tools', default=True, description="""Install the Intel Advisor,\
-VTune Amplifier, and Inspector tools""")
+    variant('tools', default=True, description="Install the Intel Advisor, "
+            "VTune Amplifier, and Inspector tools")
 
     provides('mpi', when='@cluster:+mpi')
     provides('mkl', when='+mkl')
     provides('daal', when='+daal')
     provides('ipp', when='+ipp')
 
+    def check_variants(self, spec):
+        error_message = '\t{variant} can not be turned off if "+all" is set'
+
+        if self.spec.satisfies('+all'):
+            errors = [error_message.format(variant=x)
+                      for x in ('mpi', 'mkl', 'daal', 'ipp', 'tools')
+                      if ('~' + x) in self.spec]
+            if errors:
+                errors = ['incompatible variants given'] + errors
+                raise InstallError('\n'.join(errors))
+
     def install(self, spec, prefix):
+        self.check_variants(spec)
 
         base_components = "ALL"  # when in doubt, install everything
         mpi_components = ""
@@ -58,9 +70,7 @@ def install(self, spec, prefix):
         daal_components = ""
         ipp_components = ""
 
-        if spec.satisfies('+all'):
-            base_components = "ALL"
-        else:
+        if not spec.satisfies('+all'):
             all_components = get_all_components()
             regex = '(comp|openmp|intel-tbb|icc|ifort|psxe|icsxe-pset)'
             base_components = \
@@ -77,10 +87,10 @@ def install(self, spec, prefix):
             regex = '(gdb|vtune|inspector|advisor)'
             tool_components = \
                 filter_pick(all_components, re.compile(regex).search)
+            components = base_components
 
-        components = base_components
         if not spec.satisfies('+all'):
-            if spec.satisfies('+mpi') and 'cluster' in str(spec.version):
+            if spec.satisfies('+mpi'):
                 components += mpi_components
             if spec.satisfies('+mkl'):
                 components += mkl_components
@@ -92,7 +102,10 @@ def install(self, spec, prefix):
                spec.satisfies('@professional')):
                 components += tool_components
 
-        self.intel_components = ';'.join(components)
+        if spec.satisfies('+all'):
+            self.intel_components = 'ALL'
+        else:
+            self.intel_components = ';'.join(components)
         IntelInstaller.install(self, spec, prefix)
 
         absbindir = os.path.dirname(os.path.realpath(os.path.join(
@@ -116,8 +129,11 @@ def install(self, spec, prefix):
 
         if (spec.satisfies('+all') or spec.satisfies('+mpi')) and \
                 spec.satisfies('@cluster'):
-                os.symlink(self.global_license_file, os.path.join(
-                           self.prefix, "itac_latest", "license.lic"))
+                for ifile in os.listdir(os.path.join(self.prefix, "itac")):
+                    if os.path.isdir(os.path.join(self.prefix, "itac", ifile)):
+                        os.symlink(self.global_license_file,
+                                   os.path.join(self.prefix, "itac", ifile,
+                                                "license.lic"))
                 if spec.satisfies('~newdtags'):
                     wrappers = ["mpif77", "mpif77", "mpif90", "mpif90",
                                 "mpigcc", "mpigcc", "mpigxx", "mpigxx",
@@ -142,3 +158,110 @@ def install(self, spec, prefix):
 
         os.symlink(os.path.join(self.prefix.man, "common", "man1"),
                    os.path.join(self.prefix.man, "man1"))
+
+    def setup_environment(self, spack_env, run_env):
+        # TODO: Determine variables needed for the professional edition.
+
+        major_ver = self.version[1]
+
+        # Remove paths that were guessed but are incorrect for this package.
+        run_env.remove_path('LIBRARY_PATH',
+                            join_path(self.prefix, 'lib'))
+        run_env.remove_path('LD_LIBRARY_PATH',
+                            join_path(self.prefix, 'lib'))
+        run_env.remove_path('CPATH',
+                            join_path(self.prefix, 'include'))
+
+        # Add the default set of variables
+        run_env.prepend_path('LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'intel64'))
+        run_env.prepend_path('LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'intel64'))
+        run_env.prepend_path('LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib',
+                                       'intel64', 'gcc4.4'))
+        run_env.prepend_path('LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib',
+                                       'intel64', 'gcc4.4'))
+        run_env.prepend_path('CPATH',
+                             join_path(self.prefix, 'tbb', 'include'))
+        run_env.prepend_path('MIC_LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'mic'))
+        run_env.prepend_path('MIC_LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'mic'))
+        run_env.prepend_path('MIC_LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib', 'mic'))
+        run_env.prepend_path('MIC_LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib', 'mic'))
+
+        if self.spec.satisfies('+all'):
+            run_env.prepend_path('LD_LIBRARY_PATH',
+                                 join_path(self.prefix,
+                                           'debugger_{0}'.format(major_ver),
+                                           'libipt', 'intel64', 'lib'))
+            run_env.set('GDBSERVER_MIC',
+                        join_path(self.prefix,
+                                  'debugger_{0}'.format(major_ver), 'gdb',
+                                  'targets', 'mic', 'bin', 'gdbserver'))
+            run_env.set('GDB_CROSS',
+                        join_path(self.prefix,
+                                  'debugger_{0}'.format(major_ver),
+                                  'gdb', 'intel64_mic', 'bin', 'gdb-mic'))
+            run_env.set('MPM_LAUNCHER',
+                        join_path(self.prefix,
+                                  'debugger_{0}'.format(major_ver), 'mpm',
+                                  'mic',
+                                  'bin', 'start_mpm.sh'))
+            run_env.set('INTEL_PYTHONHOME',
+                        join_path(self.prefix,
+                                  'debugger_{0}'.format(major_ver), 'python',
+                                  'intel64'))
+
+        if (self.spec.satisfies('+all') or self.spec.satisfies('+mpi')):
+            # Only I_MPI_ROOT is set here because setting the various PATH
+            # variables will potentially be in conflict with other MPI
+            # environment modules. The I_MPI_ROOT environment variable can be
+            # used as a base to set necessary PATH variables for using Intel
+            # MPI. It is also possible to set the variables in the modules.yaml
+            # file if Intel MPI is the dominant, or only, MPI on a system.
+            run_env.set('I_MPI_ROOT', join_path(self.prefix, 'impi'))
+
+        if self.spec.satisfies('+all') or self.spec.satisfies('+mkl'):
+            run_env.prepend_path('LD_LIBRARY_PATH',
+                                 join_path(self.prefix, 'mkl', 'lib',
+                                           'intel64'))
+            run_env.prepend_path('LIBRARY_PATH',
+                                 join_path(self.prefix, 'mkl', 'lib',
+                                           'intel64'))
+            run_env.prepend_path('CPATH',
+                                 join_path(self.prefix, 'mkl', 'include'))
+            run_env.prepend_path('MIC_LD_LIBRARY_PATH',
+                                 join_path(self.prefix, 'mkl', 'lib', 'mic'))
+            run_env.set('MKLROOT', join_path(self.prefix, 'mkl'))
+
+        if self.spec.satisfies('+all') or self.spec.satisfies('+daal'):
+            run_env.prepend_path('LD_LIBRARY_PATH',
+                                 join_path(self.prefix, 'daal', 'lib',
+                                           'intel64_lin'))
+            run_env.prepend_path('LIBRARY_PATH',
+                                 join_path(self.prefix, 'daal', 'lib',
+                                           'intel64_lin'))
+            run_env.prepend_path('CPATH',
+                                 join_path(self.prefix, 'daal', 'include'))
+            run_env.prepend_path('CLASSPATH',
+                                 join_path(self.prefix, 'daal', 'lib',
+                                           'daal.jar'))
+            run_env.set('DAALROOT', join_path(self.prefix, 'daal'))
+
+        if self.spec.satisfies('+all') or self.spec.satisfies('+ipp'):
+            run_env.prepend_path('LD_LIBRARY_PATH',
+                                 join_path(self.prefix, 'ipp', 'lib',
+                                           'intel64'))
+            run_env.prepend_path('LIBRARY_PATH',
+                                 join_path(self.prefix, 'ipp', 'lib',
+                                           'intel64'))
+            run_env.prepend_path('CPATH',
+                                 join_path(self.prefix, 'ipp', 'include'))
+            run_env.prepend_path('MIC_LD_LIBRARY_PATH',
+                                 join_path(self.prefix, 'ipp', 'lib', 'mic'))
+            run_env.set('IPPROOT', join_path(self.prefix, 'ipp'))
diff --git a/var/spack/repos/builtin/packages/intel/package.py b/var/spack/repos/builtin/packages/intel/package.py
index 56d9fabddf3704be1d8fda8c58edf4a5ce0424e6..d171411946fe40a00471bacd42b62a212bf568d8 100644
--- a/var/spack/repos/builtin/packages/intel/package.py
+++ b/var/spack/repos/builtin/packages/intel/package.py
@@ -49,13 +49,6 @@ def global_license_file(self):
 
     def install(self, spec, prefix):
 
-        # Remove the installation DB, otherwise it will try to install into
-        # location of other Intel builds
-        if os.path.exists(os.path.join(os.environ["HOME"], "intel",
-                          "intel_sdp_products.db")):
-            os.remove(os.path.join(os.environ["HOME"], "intel",
-                      "intel_sdp_products.db"))
-
         if not hasattr(self, "intel_prefix"):
             self.intel_prefix = self.prefix
 
@@ -66,12 +59,14 @@ def install(self, spec, prefix):
 PSET_MODE=install
 CONTINUE_WITH_INSTALLDIR_OVERWRITE=yes
 PSET_INSTALL_DIR=%s
+NONRPM_DB_DIR=%s
 ACTIVATION_LICENSE_FILE=%s
 ACTIVATION_TYPE=license_file
 PHONEHOME_SEND_USAGE_DATA=no
 CONTINUE_WITH_OPTIONAL_ERROR=yes
 COMPONENTS=%s
-""" % (self.intel_prefix, self.global_license_file, self.intel_components))
+""" % (self.intel_prefix, self.intel_prefix, self.global_license_file,
+                self.intel_components))
 
         install_script = Executable("./install.sh")
         install_script('--silent', silent_config_filename)
@@ -111,8 +106,8 @@ def install(self, spec, prefix):
             self.prefix.lib, "intel64", "libimf.a")))[0]
 
         # symlink or copy?
-        os.symlink(self.global_license_file, os.path.join(absbindir,
-                   "license.lic"))
+        os.symlink(self.global_license_file,
+                   os.path.join(absbindir, "license.lic"))
 
         if spec.satisfies('+rpath'):
             for compiler_command in ["icc", "icpc", "ifort"]:
@@ -123,3 +118,35 @@ def install(self, spec, prefix):
 
         os.symlink(os.path.join(self.prefix.man, "common", "man1"),
                    os.path.join(self.prefix.man, "man1"))
+
+    def setup_environment(self, spack_env, run_env):
+
+        # Remove paths that were guessed but are incorrect for this package.
+        run_env.remove_path('LIBRARY_PATH',
+                            join_path(self.prefix, 'lib'))
+        run_env.remove_path('LD_LIBRARY_PATH',
+                            join_path(self.prefix, 'lib'))
+        run_env.remove_path('CPATH',
+                            join_path(self.prefix, 'include'))
+
+        # Add the default set of variables
+        run_env.prepend_path('LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'intel64'))
+        run_env.prepend_path('LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'intel64'))
+        run_env.prepend_path('LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib',
+                                       'intel64', 'gcc4.4'))
+        run_env.prepend_path('LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib',
+                                       'intel64', 'gcc4.4'))
+        run_env.prepend_path('CPATH',
+                             join_path(self.prefix, 'tbb', 'include'))
+        run_env.prepend_path('MIC_LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'mic'))
+        run_env.prepend_path('MIC_LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'lib', 'mic'))
+        run_env.prepend_path('MIC_LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib', 'mic'))
+        run_env.prepend_path('MIC_LD_LIBRARY_PATH',
+                             join_path(self.prefix, 'tbb', 'lib', 'mic'))