diff --git a/etc/spack/modules.yaml b/etc/spack/modules.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..aa2a2c3fe2990d976c1c3ca6c682a149b4b6a4bf
--- /dev/null
+++ b/etc/spack/modules.yaml
@@ -0,0 +1,8 @@
+# -------------------------------------------------------------------------
+# This is the default spack module files generation configuration.
+#
+# Changes to this file will affect all users of this spack install,
+# although users can override these settings in their ~/.spack/modules.yaml.
+# -------------------------------------------------------------------------
+modules:
+  enable: ['tcl', 'dotkit']
diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py
index c4665c284cf4ec04f8f18bd45bd8877ffd8ac431..46ca03bec40db73110ee138d26a51cf44fa074bb 100644
--- a/lib/spack/llnl/util/filesystem.py
+++ b/lib/spack/llnl/util/filesystem.py
@@ -27,9 +27,10 @@
            'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file',
            'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
            'set_executable', 'copy_mode', 'unset_executable_mode',
-           'remove_dead_links', 'remove_linked_tree']
+           'remove_dead_links', 'remove_linked_tree', 'fix_darwin_install_name']
 
 import os
+import glob
 import sys
 import re
 import shutil
@@ -38,6 +39,7 @@
 import getpass
 from contextlib import contextmanager, closing
 from tempfile import NamedTemporaryFile
+import subprocess
 
 import llnl.util.tty as tty
 from spack.util.compression import ALLOWED_ARCHIVE_TYPES
@@ -392,3 +394,29 @@ def remove_linked_tree(path):
             os.unlink(path)
         else:
             shutil.rmtree(path, True)
+
+def fix_darwin_install_name(path):
+    """
+    Fix install name of dynamic libraries on Darwin to have full path.
+    There are two parts of this task:
+    (i) use install_name('-id',...) to change install name of a single lib;
+    (ii) use install_name('-change',...) to change the cross linking between libs.
+    The function assumes that all libraries are in one folder and currently won't
+    follow subfolders.
+
+    Args:
+        path: directory in which .dylib files are alocated
+
+    """
+    libs = glob.glob(join_path(path,"*.dylib"))
+    for lib in libs:
+        # fix install name first:
+        subprocess.Popen(["install_name_tool", "-id",lib,lib], stdout=subprocess.PIPE).communicate()[0]
+        long_deps = subprocess.Popen(["otool", "-L",lib], stdout=subprocess.PIPE).communicate()[0].split('\n')
+        deps = [dep.partition(' ')[0][1::] for dep in long_deps[2:-1]]
+        # fix all dependencies:
+        for dep in deps:
+            for loc in libs:
+                if dep == os.path.basename(loc):
+                    subprocess.Popen(["install_name_tool", "-change",dep,loc,lib], stdout=subprocess.PIPE).communicate()[0]
+                    break
diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py
index 13d301f84e6630f2f0956b3ac5b50b408cad9a5c..3b4e2c8352a24e9f5fd4db32c8b134c2eab53906 100644
--- a/lib/spack/llnl/util/lang.py
+++ b/lib/spack/llnl/util/lang.py
@@ -117,7 +117,8 @@ def caller_locals():
        scope.  Yes, this is some black magic, and yes it's useful
        for implementing things like depends_on and provides.
     """
-    stack = inspect.stack()
+    # Passing zero here skips line context for speed.
+    stack = inspect.stack(0)
     try:
         return stack[2][0].f_locals
     finally:
@@ -128,7 +129,8 @@ def get_calling_module_name():
     """Make sure that the caller is a class definition, and return the
        enclosing module's name.
     """
-    stack = inspect.stack()
+    # Passing zero here skips line context for speed.
+    stack = inspect.stack(0)
     try:
         # Make sure locals contain __module__
         caller_locals = stack[2][0].f_locals
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index fc5b7d6207f5f7fb0df643219b0ad0f931d2bd2d..119a255a349896820f17627d7ac9cffad692286a 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -225,7 +225,7 @@ def set_module_variables_for_package(pkg, module):
     m.spack_cc  = join_path(link_dir, pkg.compiler.link_paths['cc'])
     m.spack_cxx = join_path(link_dir, pkg.compiler.link_paths['cxx'])
     m.spack_f77 = join_path(link_dir, pkg.compiler.link_paths['f77'])
-    m.spack_f90 = join_path(link_dir, pkg.compiler.link_paths['fc'])
+    m.spack_fc  = join_path(link_dir, pkg.compiler.link_paths['fc'])
 
     # Emulate some shell commands for convenience
     m.pwd          = os.getcwd
@@ -270,32 +270,56 @@ def parent_class_modules(cls):
     return result
 
 
+def setup_module_variables_for_dag(pkg):
+    """Set module-scope variables for all packages in the DAG."""
+    for spec in pkg.spec.traverse(order='post'):
+        # If a user makes their own package repo, e.g.
+        # spack.repos.mystuff.libelf.Libelf, and they inherit from
+        # an existing class like spack.repos.original.libelf.Libelf,
+        # then set the module variables for both classes so the
+        # parent class can still use them if it gets called.
+        spkg = spec.package
+        modules = parent_class_modules(spkg.__class__)
+        for mod in modules:
+            set_module_variables_for_package(spkg, mod)
+        set_module_variables_for_package(spkg, spkg.module)
+
+
 def setup_package(pkg):
     """Execute all environment setup routines."""
     spack_env = EnvironmentModifications()
     run_env   = EnvironmentModifications()
 
+    # Before proceeding, ensure that specs and packages are consistent
+    #
+    # This is a confusing behavior due to how packages are
+    # constructed.  `setup_dependent_package` may set attributes on
+    # specs in the DAG for use by other packages' install
+    # method. However, spec.package will look up a package via
+    # spack.repo, which defensively copies specs into packages.  This
+    # code ensures that all packages in the DAG have pieces of the
+    # same spec object at build time.
+    #
+    # This is safe for the build process, b/c the build process is a
+    # throwaway environment, but it is kind of dirty.
+    #
+    # TODO: Think about how to avoid this fix and do something cleaner.
+    for s in pkg.spec.traverse(): s.package.spec = s
+
     set_compiler_environment_variables(pkg, spack_env)
     set_build_environment_variables(pkg, spack_env)
-
-    # If a user makes their own package repo, e.g.
-    # spack.repos.mystuff.libelf.Libelf, and they inherit from
-    # an existing class like spack.repos.original.libelf.Libelf,
-    # then set the module variables for both classes so the
-    # parent class can still use them if it gets called.
-    modules = parent_class_modules(pkg.__class__)
-    for mod in modules:
-        set_module_variables_for_package(pkg, mod)
+    setup_module_variables_for_dag(pkg)
 
     # Allow dependencies to modify the module
-    for dependency_spec in pkg.spec.traverse(root=False):
+    spec = pkg.spec
+    for dependency_spec in spec.traverse(root=False):
         dpkg = dependency_spec.package
-        dpkg.setup_dependent_python_module(pkg.module, pkg.spec)
+        dpkg.setup_dependent_package(pkg.module, spec)
 
     # Allow dependencies to set up environment as well
-    for dependency_spec in pkg.spec.traverse(root=False):
+    for dependency_spec in spec.traverse(root=False):
         dpkg = dependency_spec.package
-        dpkg.setup_dependent_environment(spack_env, run_env, pkg.spec)
+        dpkg.setup_dependent_environment(spack_env, run_env, spec)
 
     # Allow the package to apply some settings.
     pkg.setup_environment(spack_env, run_env)
diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py
index e7abe7f4a5921d6219d8aa9b9d6ca7e2d987127c..c93db55c63c68b785701ace7a72630ae0ec0093e 100644
--- a/lib/spack/spack/cmd/info.py
+++ b/lib/spack/spack/cmd/info.py
@@ -52,7 +52,7 @@ def print_text_info(pkg):
     print "Safe versions:  "
 
     if not pkg.versions:
-        print("None")
+        print("    None")
     else:
         pad = padder(pkg.versions, 4)
         for v in reversed(sorted(pkg.versions)):
@@ -62,7 +62,7 @@ def print_text_info(pkg):
     print
     print "Variants:"
     if not pkg.variants:
-        print "None"
+        print "    None"
     else:
         pad = padder(pkg.variants, 4)
 
diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py
index 2e576743ec6985be293cc03177876e49bb6ed1cb..ed9bf79868269571a9f74c6a06b36d717d1dbd6a 100644
--- a/lib/spack/spack/concretize.py
+++ b/lib/spack/spack/concretize.py
@@ -159,6 +159,10 @@ def concretize_version(self, spec):
              if any(v.satisfies(sv) for sv in spec.versions)],
             cmp=cmp_versions)
 
+        def prefer_key(v):
+            return pkg.versions.get(Version(v)).get('preferred', False)
+        valid_versions.sort(key=prefer_key, reverse=True)
+
         if valid_versions:
             spec.versions = ver([valid_versions[0]])
         else:
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index 6afd69b3ac7f8db3fde0f52c68b0e0834b624626..14e5aaf4fb624e9532e56b2f2a2f60669b8b3152 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -237,7 +237,29 @@
                                 'type' : 'object',
                                 'default' : {},
                             }
-                        },},},},},}
+                        },},},},},},
+    'modules': {
+        '$schema': 'http://json-schema.org/schema#',
+        'title': 'Spack module file configuration file schema',
+        'type': 'object',
+        'additionalProperties': False,
+        'patternProperties': {
+            r'modules:?': {
+                'type': 'object',
+                'default': {},
+                'additionalProperties': False,
+                'properties': {
+                    'enable': {
+                        'type': 'array',
+                        'default': [],
+                        'items': {
+                            'type': 'string'
+                        }
+                    }
+                }
+            },
+        },
+    },
 }
 
 """OrderedDict of config scopes keyed by name.
@@ -405,11 +427,11 @@ def _read_config_file(filename, schema):
             validate_section(data, schema)
         return data
 
-    except MarkedYAMLError, e:
+    except MarkedYAMLError as e:
         raise ConfigFileError(
             "Error parsing yaml%s: %s" % (str(e.context_mark), e.problem))
 
-    except IOError, e:
+    except IOError as e:
         raise ConfigFileError(
             "Error reading configuration file %s: %s" % (filename, str(e)))
 
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index 05c93cd3e655d9c3bb6dfba8c3e722dede9af1ca..f6a11c92e3118b372ab4491cb911cf91de4b9626 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -48,6 +48,7 @@
 
 import llnl.util.tty as tty
 import spack
+import spack.config
 from llnl.util.filesystem import join_path, mkdirp
 from spack.environment import *
 
@@ -56,6 +57,8 @@
 # Registry of all types of modules.  Entries created by EnvModule's metaclass
 module_types = {}
 
+CONFIGURATION = spack.config.get_config('modules')
+
 
 def print_help():
     """For use by commands to tell user how to activate shell support."""
@@ -115,7 +118,7 @@ class EnvModule(object):
     class __metaclass__(type):
         def __init__(cls, name, bases, dict):
             type.__init__(cls, name, bases, dict)
-            if cls.name != 'env_module':
+            if cls.name != 'env_module' and cls.name in CONFIGURATION['enable']:
                 module_types[cls.name] = cls
 
     def __init__(self, spec=None):
@@ -158,13 +161,13 @@ def write(self):
 
         # Let the extendee modify their extensions before asking for
         # package-specific modifications
-        for extendee in self.pkg.extendees:
-            extendee_spec = self.spec[extendee]
-            extendee_spec.package.modify_module(
-                self.pkg.module, extendee_spec, self.spec)
+        spack_env = EnvironmentModifications()
+        for item in self.pkg.extendees:
+            package = self.spec[item].package
+            package.setup_dependent_package(self.pkg.module, self.spec)
+            package.setup_dependent_environment(spack_env, env, self.spec)
 
         # Package-specific environment modifications
-        spack_env = EnvironmentModifications()
         self.spec.package.setup_environment(spack_env, env)
 
         # TODO : implement site-specific modifications and filters
@@ -275,6 +278,6 @@ def write_header(self, module_file):
         # Long description
         if self.long_description:
             module_file.write('proc ModulesHelp { } {\n')
-            doc = re.sub(r'"', '\"', self.long_description)
-            module_file.write("puts stderr \"%s\"\n" % doc)
+            for line in textwrap.wrap(self.long_description, 72):
+                module_file.write("puts stderr \"%s\"\n" % line)
             module_file.write('}\n\n')
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index 9d8ac87bd704862aa7b89d80d93d84b17aab5f17..9af32218374cddf18e0f065a953fc239122b7252 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -1075,7 +1075,7 @@ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
         self.setup_environment(spack_env, run_env)
 
 
-    def setup_dependent_python_module(self, module, dependent_spec):
+    def setup_dependent_package(self, module, dependent_spec):
         """Set up Python module-scope variables for dependent packages.
 
         Called before the install() method of dependents.
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index 08cce0967479163fb324b870c26dd4c54618a7ee..9cd8c969aed4e534c4b9dc930a44ea006c414d6e 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -24,6 +24,7 @@
 ##############################################################################
 import spack
 from spack.spec import Spec, CompilerSpec
+from spack.version import ver
 from spack.concretize import find_spec
 from spack.test.mock_packages_test import *
 
@@ -77,6 +78,14 @@ def test_concretize_variant(self):
         self.check_concretize('mpich')
 
 
+    def test_concretize_preferred_version(self):
+        spec = self.check_concretize('python')
+        self.assertEqual(spec.versions, ver('2.7.11'))
+
+        spec = self.check_concretize('python@3.5.1')
+        self.assertEqual(spec.versions, ver('3.5.1'))
+
+
     def test_concretize_with_virtual(self):
         self.check_concretize('mpileaks ^mpi')
         self.check_concretize('mpileaks ^mpi@:1.1')
diff --git a/var/spack/repos/builtin.mock/packages/python/package.py b/var/spack/repos/builtin.mock/packages/python/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5fed52f5347801768ab2523e1faf169f00a4593
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/python/package.py
@@ -0,0 +1,43 @@
+##############################################################################
+# Copyright (c) 2013-2015, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License (as published by
+# the Free Software Foundation) version 2.1 dated February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+class Python(Package):
+    """Dummy Python package to demonstrate preferred versions."""
+    homepage = "http://www.python.org"
+    url      = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz"
+
+    extendable = True
+
+    version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe')
+    version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36')
+    version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b', preferred=True)
+    version('2.7.10', 'd7547558fd673bd9d38e2108c6b42521')
+    version('2.7.9', '5eebcaa0030dc4061156d3429657fb83')
+    version('2.7.8', 'd4bca0159acb0b44a781292b5231936f')
+
+    def install(self, spec, prefix):
+        pass
+
diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py
index 0b49d142024030ff23639e3d8c44cd46de61da2e..dd86b17a53ab8b98e257f8827df2290f5dad1f10 100644
--- a/var/spack/repos/builtin/packages/arpack-ng/package.py
+++ b/var/spack/repos/builtin/packages/arpack-ng/package.py
@@ -35,6 +35,10 @@ class ArpackNg(Package):
     variant('shared', default=True, description='Enables the build of shared libraries')
     variant('mpi', default=False, description='Activates MPI support')
 
+    # The function pdlamch10 does not set the return variable. This is fixed upstream
+    # see https://github.com/opencollab/arpack-ng/issues/34
+    patch('pdlamch10.patch', when='@3.3:')
+
     depends_on('blas')
     depends_on('lapack')
     depends_on('mpi', when='+mpi')
@@ -46,7 +50,10 @@ def install(self, spec, prefix):
         options = ['--prefix=%s' % prefix]
 
         if '+mpi' in spec:
-            options.append('--enable-mpi')
+            options.extend([
+                '--enable-mpi',
+                'F77=mpif77' #FIXME: avoid hardcoding MPI wrapper names
+            ])
 
         if '~shared' in spec:
             options.append('--enable-shared=no')
diff --git a/var/spack/repos/builtin/packages/arpack-ng/pdlamch10.patch b/var/spack/repos/builtin/packages/arpack-ng/pdlamch10.patch
new file mode 100644
index 0000000000000000000000000000000000000000..922828909f8f1880aaf6cdebfe5aa0857c2f6681
--- /dev/null
+++ b/var/spack/repos/builtin/packages/arpack-ng/pdlamch10.patch
@@ -0,0 +1,15 @@
+diff --git a/PARPACK/SRC/MPI/pdlamch10.f b/PARPACK/SRC/MPI/pdlamch10.f
+index 6571da9..2882c2e 100644
+--- a/PARPACK/SRC/MPI/pdlamch10.f
++++ b/PARPACK/SRC/MPI/pdlamch10.f
+@@ -86,8 +86,8 @@
+           TEMP = TEMP1
+       END IF
+ *
+-      PDLAMCH = TEMP
++      PDLAMCH10 = TEMP
+ *
+-*     End of PDLAMCH
++*     End of PDLAMCH10
+ *
+       END
diff --git a/var/spack/repos/builtin/packages/atlas/package.py b/var/spack/repos/builtin/packages/atlas/package.py
index fc683363a70dc6217fd98b64271dce26e5d0a223..b5504122b7440f6621f870f71a4a3303972813b6 100644
--- a/var/spack/repos/builtin/packages/atlas/package.py
+++ b/var/spack/repos/builtin/packages/atlas/package.py
@@ -1,31 +1,36 @@
 from spack import *
 from spack.util.executable import Executable
-import os
+import os.path
 
 class Atlas(Package):
     """
-    Automatically Tuned Linear Algebra Software, generic shared
-    ATLAS is an approach for the automatic generation and optimization of
-    numerical software. Currently ATLAS supplies optimized versions for the
-    complete set of linear algebra kernels known as the Basic Linear Algebra
-    Subroutines (BLAS), and a subset of the linear algebra routines in the
-    LAPACK library.
+    Automatically Tuned Linear Algebra Software, generic shared ATLAS is an approach for the automatic generation and
+    optimization of numerical software. Currently ATLAS supplies optimized versions for the complete set of linear
+    algebra kernels known as the Basic Linear Algebra Subroutines (BLAS), and a subset of the linear algebra routines
+    in the LAPACK library.
     """
     homepage = "http://math-atlas.sourceforge.net/"
 
+    version('3.10.2', 'a4e21f343dec8f22e7415e339f09f6da',
+            url='http://downloads.sourceforge.net/project/math-atlas/Stable/3.10.2/atlas3.10.2.tar.bz2', preferred=True)
+    resource(name='lapack',
+             url='http://www.netlib.org/lapack/lapack-3.5.0.tgz',
+             md5='b1d3e3e425b2e44a06760ff173104bdf',
+             destination='spack-resource-lapack',
+             when='@3:')
+
     version('3.11.34', '0b6c5389c095c4c8785fd0f724ec6825',
             url='http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.34/atlas3.11.34.tar.bz2/download')
-    version('3.10.2', 'a4e21f343dec8f22e7415e339f09f6da',
-            url='http://downloads.sourceforge.net/project/math-atlas/Stable/3.10.2/atlas3.10.2.tar.bz2')
 
-    # TODO: make this provide BLAS once it works better.  Create a way
-    # TODO: to mark "beta" packages and require explicit invocation.
+    variant('shared', default=True, description='Builds shared library')
 
-    # provides('blas')
+    provides('blas')
+    provides('lapack')
 
+    parallel = False
 
     def patch(self):
-        # Disable thraed check.  LLNL's environment does not allow
+        # Disable thread check.  LLNL's environment does not allow
         # disabling of CPU throttling in a way that ATLAS actually
         # understands.
         filter_file(r'^\s+if \(thrchk\) exit\(1\);', 'if (0) exit(1);',
@@ -33,26 +38,21 @@ def patch(self):
         # TODO: investigate a better way to add the check back in
         # TODO: using, say, MSRs.  Or move this to a variant.
 
-    @when('@:3.10')
     def install(self, spec, prefix):
-        with working_dir('ATLAS-Build', create=True):
-            configure = Executable('../configure')
-            configure('--prefix=%s' % prefix, '-C', 'ic', 'cc', '-C', 'if', 'f77', "--dylibs")
-            make()
-            make('check')
-            make('ptcheck')
-            make('time')
-            make("install")
 
+        options = []
+        if '+shared' in spec:
+            options.append('--shared')
 
-    def install(self, spec, prefix):
-        with working_dir('ATLAS-Build', create=True):
-            configure = Executable('../configure')
-            configure('--incdir=%s' % prefix.include,
-                      '--libdir=%s' % prefix.lib,
-                      '--cc=cc',
-                      "--shared")
+        # Lapack resource
+        lapack_stage = self.stage[1]
+        lapack_tarfile = os.path.basename(lapack_stage.fetcher.url)
+        lapack_tarfile_path = join_path(lapack_stage.path, lapack_tarfile)
+        options.append('--with-netlib-lapack-tarfile=%s' % lapack_tarfile_path)
 
+        with working_dir('spack-build', create=True):
+            configure = Executable('../configure')
+            configure('--prefix=%s' % prefix, *options)
             make()
             make('check')
             make('ptcheck')
diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py
index fb1f5daee7f371e33d0f69a7a758e93c5bd63f0d..82ce6fbb7440a59ba67a080a953dffd8a46217e9 100644
--- a/var/spack/repos/builtin/packages/boost/package.py
+++ b/var/spack/repos/builtin/packages/boost/package.py
@@ -1,5 +1,6 @@
 from spack import *
 import spack
+import sys
 
 class Boost(Package):
     """Boost provides free peer-reviewed portable C++ source
@@ -45,34 +46,34 @@ class Boost(Package):
     version('1.34.1', '2d938467e8a448a2c9763e0a9f8ca7e5')
     version('1.34.0', 'ed5b9291ffad776f8757a916e1726ad0')
 
-    default_install_libs = set(['atomic', 
-        'chrono', 
-        'date_time', 
-        'filesystem', 
+    default_install_libs = set(['atomic',
+        'chrono',
+        'date_time',
+        'filesystem',
         'graph',
         'iostreams',
         'locale',
         'log',
-        'math', 
+        'math',
         'program_options',
-        'random', 
-        'regex', 
-        'serialization', 
-        'signals', 
-        'system', 
-        'test', 
-        'thread', 
+        'random',
+        'regex',
+        'serialization',
+        'signals',
+        'system',
+        'test',
+        'thread',
         'wave'])
 
-    # mpi/python are not installed by default because they pull in many 
-    # dependencies and/or because there is a great deal of customization 
+    # mpi/python are not installed by default because they pull in many
+    # dependencies and/or because there is a great deal of customization
     # possible (and it would be difficult to choose sensible defaults)
     default_noinstall_libs = set(['mpi', 'python'])
 
     all_libs = default_install_libs | default_noinstall_libs
 
     for lib in all_libs:
-        variant(lib, default=(lib not in default_noinstall_libs), 
+        variant(lib, default=(lib not in default_noinstall_libs),
             description="Compile with {0} library".format(lib))
 
     variant('debug', default=False, description='Switch to the debug version of Boost')
@@ -124,9 +125,9 @@ def determine_bootstrap_options(self, spec, withLibs, options):
 
         with open('user-config.jam', 'w') as f:
             compiler_wrapper = join_path(spack.build_env_path, 'c++')
-            f.write("using {0} : : {1} ;\n".format(boostToolsetId, 
+            f.write("using {0} : : {1} ;\n".format(boostToolsetId,
                 compiler_wrapper))
-            
+
             if '+mpi' in spec:
                 f.write('using mpi : %s ;\n' %
                     join_path(spec['mpi'].prefix.bin, 'mpicxx'))
@@ -155,7 +156,7 @@ def determine_b2_options(self, spec, options):
         linkTypes = ['static']
         if '+shared' in spec:
             linkTypes.append('shared')
-        
+
         threadingOpts = []
         if '+multithreaded' in spec:
             threadingOpts.append('multi')
@@ -163,12 +164,12 @@ def determine_b2_options(self, spec, options):
             threadingOpts.append('single')
         if not threadingOpts:
             raise RuntimeError("At least one of {singlethreaded, multithreaded} must be enabled")
-        
+
         options.extend([
             'toolset=%s' % self.determine_toolset(spec),
             'link=%s' % ','.join(linkTypes),
             '--layout=tagged'])
-        
+
         return threadingOpts
 
     def install(self, spec, prefix):
@@ -177,14 +178,14 @@ def install(self, spec, prefix):
             if "+{0}".format(lib) in spec:
                 withLibs.append(lib)
         if not withLibs:
-            # if no libraries are specified for compilation, then you dont have 
+            # if no libraries are specified for compilation, then you dont have
             # to configure/build anything, just copy over to the prefix directory.
             src = join_path(self.stage.source_path, 'boost')
             mkdirp(join_path(prefix, 'include'))
             dst = join_path(prefix, 'include', 'boost')
             install_tree(src, dst)
             return
-    
+
         # to make Boost find the user-config.jam
         env['BOOST_BUILD_PATH'] = './'
 
@@ -207,4 +208,7 @@ def install(self, spec, prefix):
         # Boost.MPI if the threading options are not separated.
         for threadingOpt in threadingOpts:
             b2('install', 'threading=%s' % threadingOpt, *b2_options)
-        
+
+        # The shared libraries are not installed correctly on Darwin; correct this
+        if (sys.platform == 'darwin') and ('+shared' in spec):
+            fix_darwin_install_name(prefix.lib)
diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py
index cc93c7067c3a05d63086f2f52aaf8e55555941d0..1f93d39769ba0a9f28d59b1b7dc80c271d235505 100644
--- a/var/spack/repos/builtin/packages/cmake/package.py
+++ b/var/spack/repos/builtin/packages/cmake/package.py
@@ -38,10 +38,12 @@ class Cmake(Package):
     version('2.8.10.2', '097278785da7182ec0aea8769d06860c')
 
     variant('ncurses', default=True, description='Enables the build of the ncurses gui')
+    variant('openssl', default=True, description="Enables CMake's OpenSSL features")
     variant('qt', default=False, description='Enables the build of cmake-gui')
     variant('doc', default=False, description='Enables the generation of html and man page documentation')
 
     depends_on('ncurses', when='+ncurses')
+    depends_on('openssl', when='+openssl')
     depends_on('qt', when='+qt')
     depends_on('python@2.7.11:', when='+doc')
     depends_on('py-sphinx', when='+doc')
@@ -77,8 +79,9 @@ def install(self, spec, prefix):
             options.append('--sphinx-html')
             options.append('--sphinx-man')
 
-        options.append('--')
-        options.append('-DCMAKE_USE_OPENSSL=ON')
+        if '+openssl' in spec:
+            options.append('--')
+            options.append('-DCMAKE_USE_OPENSSL=ON')
 
         configure(*options)
         make()
diff --git a/var/spack/repos/builtin/packages/cryptopp/package.py b/var/spack/repos/builtin/packages/cryptopp/package.py
index 1693c4b160f83d587cfd95b781d146e5d9704869..bc83cb2b651aaa953160bb7c1ce7b833a4a3a84d 100644
--- a/var/spack/repos/builtin/packages/cryptopp/package.py
+++ b/var/spack/repos/builtin/packages/cryptopp/package.py
@@ -8,8 +8,8 @@ class Cryptopp(Package):
        public-key encryption (RSA, DSA), and a few obsolete/historical encryption
        algorithms (MD5, Panama)."""
 
-    homepage = "http://www.cryptopp.com/"
-    url      = "http://www.cryptopp.com/cryptopp563.zip"
+    homepage = "http://www.cryptopp.com"
+    base_url = "http://www.cryptopp.com"
 
     version('5.6.3', '3c5b70e2ec98b7a24988734446242d07')
     version('5.6.2', '7ed022585698df48e65ce9218f6c6a67')
@@ -25,7 +25,5 @@ def install(self, spec, prefix):
         install('libcryptopp.a', prefix.lib)
 
     def url_for_version(self, version):
-        version_tuple = tuple(v for v in iter(version))
-        version_string = reduce(lambda vs, nv: vs + str(nv), version_tuple, "")
-
-        return "%scryptopp%s.zip" % (Cryptopp.homepage, version_string)
+        version_string = str(version).replace('.', '')
+        return '%s/cryptopp%s.zip' % (Cryptopp.base_url, version_string)
diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py
index e40046b452974f97c0b4548df53e26a52f3d7df4..8d6e672f86cfaba8554aca334307ead0fec119be 100644
--- a/var/spack/repos/builtin/packages/eigen/package.py
+++ b/var/spack/repos/builtin/packages/eigen/package.py
@@ -48,7 +48,7 @@ class Eigen(Package):
     depends_on('metis', when='+metis')
     depends_on('scotch', when='+scotch')
     depends_on('fftw', when='+fftw')
-    depends_on('SuiteSparse', when='+suitesparse')
+    depends_on('suite-sparse', when='+suitesparse')
     depends_on('mpfr@2.3.0:')  # Eigen 3.2.7 requires at least 2.3.0
     depends_on('gmp')
 
diff --git a/var/spack/repos/builtin/packages/espresso/package.py b/var/spack/repos/builtin/packages/espresso/package.py
index a2bf58f585b5ddf9f6ff2053488fef4f11a9f676..59f362ab46cb8fa910a4d9d9ca576143af803c96 100644
--- a/var/spack/repos/builtin/packages/espresso/package.py
+++ b/var/spack/repos/builtin/packages/espresso/package.py
@@ -32,6 +32,10 @@ def check_variants(self, spec):
         if '+elpa' in spec and ('~mpi' in spec or '~scalapack' in spec):
             raise RuntimeError(error.format(variant='elpa'))
 
+    def setup_environment(self, spack_env, run_env):
+        # Espresso copies every executable in prefix without creating sub-folders
+        run_env.prepend_path('PATH', self.prefix)
+
     def install(self, spec, prefix):
         self.check_variants(spec)
 
diff --git a/var/spack/repos/builtin/packages/gettext/package.py b/var/spack/repos/builtin/packages/gettext/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..05712d7392cdb94b56e80b685ec5e14e12398b10
--- /dev/null
+++ b/var/spack/repos/builtin/packages/gettext/package.py
@@ -0,0 +1,30 @@
+from spack import *
+
+class Gettext(Package):
+    """GNU internationalization (i18n) and localization (l10n) library."""
+    homepage = "https://www.gnu.org/software/gettext/"
+    url      = "http://ftpmirror.gnu.org/gettext/gettext-0.19.7.tar.xz"
+
+    version('0.19.7', 'f81e50556da41b44c1d59ac93474dca5')
+
+    def install(self, spec, prefix):
+        options = ['--disable-dependency-tracking',
+                   '--disable-silent-rules',
+                   '--disable-debug',
+                   '--prefix=%s' % prefix,
+                   '--with-included-gettext',
+                   '--with-included-glib',
+                   '--with-included-libcroco',
+                   '--with-included-libunistring',
+                   '--with-emacs',
+                   '--with-lispdir=%s/emacs/site-lisp/gettext' % prefix.share,
+                   '--disable-java',
+                   '--disable-csharp',
+                   '--without-git', # Don't use VCS systems to create these archives
+                   '--without-cvs',
+                   '--without-xz']
+
+        configure(*options)
+
+        make()
+        make("install")
diff --git a/var/spack/repos/builtin/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py
index 242ee100d7a071ed7825973310754ce5d2185c21..0e9955329330c0d5fa1325c37514cf8847871988 100644
--- a/var/spack/repos/builtin/packages/hypre/package.py
+++ b/var/spack/repos/builtin/packages/hypre/package.py
@@ -1,5 +1,5 @@
 from spack import *
-import os
+import os, sys
 
 class Hypre(Package):
     """Hypre is a library of high performance preconditioners that
@@ -12,7 +12,10 @@ class Hypre(Package):
     version('2.10.1', 'dc048c4cabb3cd549af72591474ad674')
     version('2.10.0b', '768be38793a35bb5d055905b271f5b8e')
 
-    variant('shared', default=True, description="Build shared library version (disables static library)")
+    # hypre does not know how to build shared libraries on Darwin
+    variant('shared', default=sys.platform!='darwin', description="Build shared library version (disables static library)")
+    # SuperluDist have conflicting headers with those in Hypre
+    variant('internal-superlu', default=True, description="Use internal Superlu routines")
 
     depends_on("mpi")
     depends_on("blas")
@@ -37,6 +40,9 @@ def install(self, spec, prefix):
         if '+shared' in self.spec:
             configure_args.append("--enable-shared")
 
+        if '~internal-superlu' in self.spec:
+            configure_args.append("--without-superlu")
+
         # Hypre's source is staged under ./src so we'll have to manually
         # cd into it.
         with working_dir("src"):
diff --git a/var/spack/repos/builtin/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py
index 9f16708af5b913ed209b8a23e582dd1db068f4ad..29bc21b65c49ec3543a4bf1e68d93d764ed97ec4 100644
--- a/var/spack/repos/builtin/packages/libelf/package.py
+++ b/var/spack/repos/builtin/packages/libelf/package.py
@@ -38,8 +38,6 @@ class Libelf(Package):
 
     provides('elf')
 
-    sanity_check_is_file = 'include/libelf.h'
-
     def install(self, spec, prefix):
         configure("--prefix=" + prefix,
                   "--enable-shared",
diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py
index 280e400f696f396528840c57ed2a559bfcc576bf..1d25d59e5044f28e81afec50d9fe1d2e66d0e514 100644
--- a/var/spack/repos/builtin/packages/llvm/package.py
+++ b/var/spack/repos/builtin/packages/llvm/package.py
@@ -52,7 +52,7 @@ class Llvm(Package):
     depends_on('cmake @2.8.12.2:')
 
     # Universal dependency
-    depends_on('python@2.7:')
+    depends_on('python@2.7:2.8')  # Seems not to support python 3.X.Y
 
     # lldb dependencies
     depends_on('ncurses', when='+lldb')
@@ -132,6 +132,21 @@ class Llvm(Package):
                         'llvm-libunwind' : 'http://llvm.org/svn/llvm-project/libunwind/trunk',
                         }
                   },
+                  {
+                    'version' : '3.8.0',
+                    'md5':'07a7a74f3c6bd65de4702bf941b511a0',
+                    'resources' : {
+                        'compiler-rt' : 'd6fcbe14352ffb708e4d1ac2e48bb025',
+                        'openmp' : '8fd7cc35d48051613cf1e750e9f22e40',
+                        'polly' : '1b3b20f52d34a4024e21a4ea7112caa7',
+                        'libcxx' : 'd6e0bdbbee39f7907ad74fd56d03b88a',
+                        'libcxxabi' : 'bbe6b4d72c7c5978550d370af529bcf7',
+                        'clang' : 'cc99e7019bb74e6459e80863606250c5',
+                        'clang-tools-extra' : 'c2344f50e0eea0b402f0092a80ddc036',
+                        'lldb' : 'a5da35ed9cc8c8817ee854e3dbfba00e',
+                        'llvm-libunwind' : '162ade468607f153cca12be90b5194fa',
+                        }
+                  },
                   {
                     'version' : '3.7.1',
                     'md5':'bf8b3a2c79e61212c5409041dfdbd319',
diff --git a/var/spack/repos/builtin/packages/metis/install_gklib_defs_rename.patch b/var/spack/repos/builtin/packages/metis/install_gklib_defs_rename.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b182b167b90ab65b2b397327786409e355b8c0c0
--- /dev/null
+++ b/var/spack/repos/builtin/packages/metis/install_gklib_defs_rename.patch
@@ -0,0 +1,22 @@
+# HG changeset patch
+# User Sean Farley <sean@mcs.anl.gov>
+# Date 1332269671 18000
+#      Tue Mar 20 13:54:31 2012 -0500
+# Node ID b95c0c2e1d8bf8e3273f7d45e856f0c0127d998e
+# Parent  88049269953c67c3fdcc4309bf901508a875f0dc
+cmake: add gklib headers to install into include
+
+diff -r 88049269953c -r b95c0c2e1d8b libmetis/CMakeLists.txt
+Index: libmetis/CMakeLists.txt
+===================================================================
+--- a/libmetis/CMakeLists.txt Tue Mar 20 13:54:29 2012 -0500
++++ b/libmetis/CMakeLists.txt Tue Mar 20 13:54:31 2012 -0500
+@@ -12,6 +12,8 @@ endif()
+ if(METIS_INSTALL)
+   install(TARGETS metis
+     LIBRARY DESTINATION lib
+     RUNTIME DESTINATION lib
+     ARCHIVE DESTINATION lib)
++  install(FILES gklib_defs.h DESTINATION include)
++  install(FILES gklib_rename.h DESTINATION include)
+ endif()
diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py
index bbfc4de7d1d129b66290f1f8a833aa422cff1e1e..9301135f9f327b8e3f2a78023a8c33fa6e19150a 100644
--- a/var/spack/repos/builtin/packages/metis/package.py
+++ b/var/spack/repos/builtin/packages/metis/package.py
@@ -24,7 +24,7 @@
 ##############################################################################
 
 from spack import *
-
+import glob,sys
 
 class Metis(Package):
     """
@@ -49,6 +49,8 @@ class Metis(Package):
 
     depends_on('gdb', when='+gdb')
 
+    patch('install_gklib_defs_rename.patch')
+
     def install(self, spec, prefix):
 
         options = []
@@ -80,4 +82,15 @@ def install(self, spec, prefix):
         with working_dir(build_directory, create=True):
             cmake(source_directory, *options)
             make()
-            make("install")
\ No newline at end of file
+            make("install")
+
+            # install GKlib headers, which will be needed for ParMETIS
+            GKlib_dist = join_path(prefix.include,'GKlib')
+            mkdirp(GKlib_dist)
+            fs = glob.glob(join_path(source_directory,'GKlib',"*.h"))
+            for f in fs:
+                install(f, GKlib_dist)
+
+            # The shared library is not installed correctly on Darwin; correct this
+            if (sys.platform == 'darwin') and ('+shared' in spec):
+                fix_darwin_install_name(prefix.lib)
diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py
index c4d9940bb72db6b6a110007b5cbe070d7bc4f84f..b20dc8dd60cce764851683105ddc34a614055b48 100644
--- a/var/spack/repos/builtin/packages/mpich/package.py
+++ b/var/spack/repos/builtin/packages/mpich/package.py
@@ -54,7 +54,7 @@ def setup_dependent_environment(self, env, dependent_spec):
         env.set('MPICH_F90', spack_f90)
         env.set('MPICH_FC', spack_fc)
 
-    def setup_dependent_python_module(self, module, spec, dep_spec):
+    def setup_dependent_package(self, module, dep_spec):
         """For dependencies, make mpicc's use spack wrapper."""
         # FIXME : is this necessary ? Shouldn't this be part of a contract with MPI providers?
         module.mpicc = join_path(self.prefix.bin, 'mpicc')
diff --git a/var/spack/repos/builtin/packages/mumps/package.py b/var/spack/repos/builtin/packages/mumps/package.py
index 44a37903cc8dc9d05134d2e3c212d5eced651c5a..5a254dfd00e45c82af2b6a15486ba13f8988eb6a 100644
--- a/var/spack/repos/builtin/packages/mumps/package.py
+++ b/var/spack/repos/builtin/packages/mumps/package.py
@@ -20,10 +20,10 @@ class Mumps(Package):
     variant('complex', default=True, description='Activate the compilation of cmumps and/or zmumps')
     variant('idx64', default=False, description='Use int64_t/integer*8 as default index type')
 
-    
+
     depends_on('scotch + esmumps', when='~ptscotch+scotch')
     depends_on('scotch + esmumps + mpi', when='+ptscotch')
-    depends_on('metis', when='~parmetis+metis')
+    depends_on('metis', when='+metis')
     depends_on('parmetis', when="+parmetis")
     depends_on('blas')
     depends_on('lapack')
@@ -38,11 +38,11 @@ class Mumps(Package):
     def write_makefile_inc(self):
         if ('+parmetis' in self.spec or '+ptscotch' in self.spec) and '+mpi' not in self.spec:
             raise RuntimeError('You cannot use the variants parmetis or ptscotch without mpi')
-        
+
         makefile_conf = ["LIBBLAS = -L%s -lblas" % self.spec['blas'].prefix.lib]
 
         orderings = ['-Dpord']
-        
+
         if '+ptscotch' in self.spec or '+scotch' in self.spec:
             join_lib = ' -l%s' % ('pt' if '+ptscotch' in self.spec else '')
             makefile_conf.extend(
@@ -54,15 +54,19 @@ def write_makefile_inc(self):
             if '+ptscotch' in self.spec:
                 orderings.append('-Dptscotch')
 
-        if '+parmetis' in self.spec or '+metis' in self.spec:
+        if '+parmetis' in self.spec and '+metis' in self.spec:
             libname = 'parmetis' if '+parmetis' in self.spec else 'metis'
             makefile_conf.extend(
-                ["IMETIS = -I%s" % self.spec[libname].prefix.include,
-                 "LMETIS = -L%s -l%s" % (self.spec[libname].prefix.lib, libname)])
+                ["IMETIS = -I%s" % self.spec['parmetis'].prefix.include,
+                 "LMETIS = -L%s -l%s -L%s -l%s" % (self.spec['parmetis'].prefix.lib, 'parmetis',self.spec['metis'].prefix.lib, 'metis')])
+
+            orderings.append('-Dparmetis')
+        elif '+metis' in self.spec:
+            makefile_conf.extend(
+                ["IMETIS = -I%s" % self.spec['metis'].prefix.include,
+                 "LMETIS = -L%s -l%s" % (self.spec['metis'].prefix.lib, 'metis')])
 
             orderings.append('-Dmetis')
-            if '+parmetis' in self.spec:
-                orderings.append('-Dparmetis')
 
         makefile_conf.append("ORDERINGSF = %s" % (' '.join(orderings)))
 
@@ -101,12 +105,12 @@ def write_makefile_inc(self):
         # compiler possible values are -DAdd_, -DAdd__ and/or -DUPPER
         makefile_conf.append("CDEFS   = -DAdd_")
 
-        
+
         makefile_inc_template = join_path(os.path.dirname(self.module.__file__),
                                           'Makefile.inc')
         with open(makefile_inc_template, "r") as fh:
             makefile_conf.extend(fh.read().split('\n'))
-        
+
         with working_dir('.'):
             with open("Makefile.inc", "w") as fh:
                 makefile_inc = '\n'.join(makefile_conf)
@@ -130,8 +134,9 @@ def install(self, spec, prefix):
                 make_libs.append('zexamples')
 
         self.write_makefile_inc()
-                
-        make(*make_libs)
+
+        # Build fails in parallel, at least on OS-X
+        make(*make_libs, parallel=False)
 
         install_tree('lib', prefix.lib)
         install_tree('include', prefix.include)
diff --git a/var/spack/repos/builtin/packages/muparser/package.py b/var/spack/repos/builtin/packages/muparser/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..a1a9ff90e5370f949588a2e7fea2908987c35677
--- /dev/null
+++ b/var/spack/repos/builtin/packages/muparser/package.py
@@ -0,0 +1,18 @@
+from spack import *
+
+class Muparser(Package):
+    """C++ math expression parser library."""
+    homepage = "http://muparser.beltoforion.de/"
+    url      = "https://github.com/beltoforion/muparser/archive/v2.2.5.tar.gz"
+
+    version('2.2.5', '02dae671aa5ad955fdcbcd3fee313fb7')
+
+    def install(self, spec, prefix):
+        options = ['--disable-debug',
+                   '--disable-dependency-tracking',
+                   '--prefix=%s' % prefix]
+
+        configure(*options)
+
+        make()
+        make("install")
diff --git a/var/spack/repos/builtin/packages/netcdf-cxx/package.py b/var/spack/repos/builtin/packages/netcdf-cxx/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..5334dfb853af7c2928bfbf26eda57590e2c9a10d
--- /dev/null
+++ b/var/spack/repos/builtin/packages/netcdf-cxx/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+class NetcdfCxx(Package):
+    """C++ compatibility bindings for NetCDF"""
+    homepage = "http://www.unidata.ucar.edu/software/netcdf"
+    url      = "http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-cxx-4.2.tar.gz"
+
+    version('4.2', 'd32b20c00f144ae6565d9e98d9f6204c')
+
+    depends_on('netcdf')
+
+    def install(self, spec, prefix):
+        configure('--prefix=%s' % prefix)
+        make()
+        make("install")
diff --git a/var/spack/repos/builtin/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py
index 227362399a9c3184ad44b73c4655d6b7e96eaf14..b60a2c4e9a37cd6f8182f4a763d669c2eaa14c52 100644
--- a/var/spack/repos/builtin/packages/netcdf/package.py
+++ b/var/spack/repos/builtin/packages/netcdf/package.py
@@ -43,6 +43,13 @@ def install(self, spec, prefix):
             "--enable-dap"
         ]
 
+        # Make sure Netcdf links against Spack's curl
+        # Otherwise it may pick up system's curl, which could lead to link errors:
+        # /usr/lib/x86_64-linux-gnu/libcurl.so: undefined reference to `SSL_CTX_use_certificate_chain_file@OPENSSL_1.0.0'
+        LIBS.append("-lcurl")
+        CPPFLAGS.append("-I%s" % spec['curl'].prefix.include)
+        LDFLAGS.append ("-L%s" % spec['curl'].prefix.lib)
+
         if '+mpi' in spec:
             config_args.append('--enable-parallel4')
 
diff --git a/var/spack/repos/builtin/packages/netlib-blas/package.py b/var/spack/repos/builtin/packages/netlib-blas/package.py
deleted file mode 100644
index 85e97323d354674e225f70a1f6da16b739bf5b45..0000000000000000000000000000000000000000
--- a/var/spack/repos/builtin/packages/netlib-blas/package.py
+++ /dev/null
@@ -1,46 +0,0 @@
-from spack import *
-import os
-
-
-class NetlibBlas(Package):
-    """Netlib reference BLAS"""
-    homepage = "http://www.netlib.org/lapack/"
-    url      = "http://www.netlib.org/lapack/lapack-3.5.0.tgz"
-
-    version('3.5.0', 'b1d3e3e425b2e44a06760ff173104bdf')
-
-    variant('fpic', default=False, description="Build with -fpic compiler option")
-
-    # virtual dependency
-    provides('blas')
-
-    # Doesn't always build correctly in parallel
-    parallel = False
-
-    def patch(self):
-        os.symlink('make.inc.example', 'make.inc')
-
-        mf = FileFilter('make.inc')
-        mf.filter('^FORTRAN.*', 'FORTRAN = f90')
-        mf.filter('^LOADER.*',  'LOADER = f90')
-        mf.filter('^CC =.*',  'CC = cc')
-
-        if '+fpic' in self.spec:
-            mf.filter('^OPTS.*=.*',  'OPTS = -O2 -frecursive -fpic')
-            mf.filter('^CFLAGS =.*',  'CFLAGS = -O3 -fpic')
-
-
-    def install(self, spec, prefix):
-        make('blaslib')
-
-        # Tests that blas builds correctly
-        make('blas_testing')
-
-        # No install provided
-        mkdirp(prefix.lib)
-        install('librefblas.a', prefix.lib)
-
-        # Blas virtual package should provide blas.a and libblas.a
-        with working_dir(prefix.lib):
-            symlink('librefblas.a', 'blas.a')
-            symlink('librefblas.a', 'libblas.a')
diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py
index 741f4af42157b42b48ad7bb20145f6ea2a9d71a6..c4b7ce3b048f2f54ea077a67dfa9c3db5a9cbcbb 100644
--- a/var/spack/repos/builtin/packages/netlib-lapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py
@@ -1,16 +1,15 @@
 from spack import *
 
+
 class NetlibLapack(Package):
     """
-    LAPACK version 3.X is a comprehensive FORTRAN library that does
-    linear algebra operations including matrix inversions, least
-    squared solutions to linear sets of equations, eigenvector
-    analysis, singular value decomposition, etc. It is a very
-    comprehensive and reputable package that has found extensive
-    use in the scientific community.
+    LAPACK version 3.X is a comprehensive FORTRAN library that does linear algebra operations including matrix
+    inversions, least squared solutions to linear sets of equations, eigenvector analysis, singular value
+    decomposition, etc. It is a very comprehensive and reputable package that has found extensive use in the
+    scientific community.
     """
     homepage = "http://www.netlib.org/lapack/"
-    url      = "http://www.netlib.org/lapack/lapack-3.5.0.tgz"
+    url = "http://www.netlib.org/lapack/lapack-3.5.0.tgz"
 
     version('3.6.0', 'f2f6c67134e851fe189bb3ca1fbb5101')
     version('3.5.0', 'b1d3e3e425b2e44a06760ff173104bdf')
@@ -19,42 +18,34 @@ class NetlibLapack(Package):
     version('3.4.0', '02d5706ec03ba885fc246e5fa10d8c70')
     version('3.3.1', 'd0d533ec9a5b74933c2a1e84eedc58b4')
 
-    variant('shared', default=False, description="Build shared library version")
+    variant('debug', default=False, description='Activates the Debug build type')
+    variant('shared', default=True, description="Build shared library version")
+    variant('external-blas', default=False, description='Build lapack with an external blas')
+
+    variant('lapacke', default=True, description='Activates the build of the LAPACKE C interface')
 
     # virtual dependency
+    provides('blas', when='~external-blas')
     provides('lapack')
 
-    # blas is a virtual dependency.
-    depends_on('blas')
-
     depends_on('cmake')
-
-    # Doesn't always build correctly in parallel
-    parallel = False
-
-    @when('^netlib-blas')
-    def get_blas_libs(self):
-        blas = self.spec['netlib-blas']
-        return [join_path(blas.prefix.lib, 'blas.a')]
-
-
-    @when('^atlas')
-    def get_blas_libs(self):
-        blas = self.spec['atlas']
-        return [join_path(blas.prefix.lib, l)
-                for l in ('libf77blas.a', 'libatlas.a')]
-
+    depends_on('blas', when='+external-blas')
 
     def install(self, spec, prefix):
-        blas_libs = ";".join(self.get_blas_libs())
-        cmake_args = [".", '-DBLAS_LIBRARIES=' + blas_libs]
-
-        if '+shared' in spec:
-            cmake_args.append('-DBUILD_SHARED_LIBS=ON')
-
-        cmake_args += std_cmake_args
-
-        cmake(*cmake_args)
-        make()
-        make("install")
-
+        cmake_args = ['-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if '+shared' in spec else 'OFF'),
+                      '-DCMAKE_BUILD_TYPE:STRING=%s' % ('Debug' if '+debug' in spec else 'Release'),
+                      '-DLAPACKE:BOOL=%s' % ('ON' if '+lapacke' in spec else 'OFF')]
+        if '+external-blas' in spec:
+            # TODO : the mechanism to specify the library should be more general,
+            # TODO : but this allows to have an hook to an external blas
+            cmake_args.extend([
+                '-DUSE_OPTIMIZED_BLAS:BOOL=ON',
+                '-DBLAS_LIBRARIES:PATH=%s' % join_path(spec['blas'].prefix.lib, 'libblas.a')
+            ])
+
+        cmake_args.extend(std_cmake_args)
+
+        with working_dir('spack-build', create=True):
+            cmake('..', *cmake_args)
+            make()
+            make("install")
diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
index 62abfcc48e36cd9617c866d213cf7a4ea7148467..d59f8e41fec200b3aeb0fe8841e5bd05d3c1b42f 100644
--- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
@@ -1,4 +1,5 @@
 from spack import *
+import sys
 
 class NetlibScalapack(Package):
     """ScaLAPACK is a library of high-performance linear algebra routines for parallel distributed memory machines"""
@@ -11,16 +12,16 @@ class NetlibScalapack(Package):
     version('2.0.0', '9e76ae7b291be27faaad47cfc256cbfe')
     # versions before 2.0.0 are not using cmake and requires blacs as
     # a separated package
-    
+
     variant('shared', default=True, description='Build the shared library version')
     variant('fpic', default=False, description="Build with -fpic compiler option")
-    
+
     provides('scalapack')
-    
+
     depends_on('mpi')
     depends_on('lapack')
-    
-    def install(self, spec, prefix):       
+
+    def install(self, spec, prefix):
         options = [
             "-DBUILD_SHARED_LIBS:BOOL=%s" % ('ON' if '+shared' in spec else 'OFF'),
             "-DBUILD_STATIC_LIBS:BOOL=%s" % ('OFF' if '+shared' in spec else 'ON'),
@@ -40,10 +41,16 @@ def install(self, spec, prefix):
             make()
             make("install")
 
-    def setup_dependent_python_module(self, module, spec, dependent_spec):
+        # The shared libraries are not installed correctly on Darwin; correct this
+        if (sys.platform == 'darwin') and ('+shared' in spec):
+            fix_darwin_install_name(prefix.lib)
+
+
+    def setup_dependent_package(self, module, dependent_spec):
+        spec = self.spec
         lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
-        lib_suffix = lib_dsuffix if '+shared' in spec['scalapack'] else '.a'
+        lib_suffix = lib_dsuffix if '+shared' in spec else '.a'
 
-        spec['scalapack'].fc_link = '-L%s -lscalapack' % spec['scalapack'].prefix.lib
-        spec['scalapack'].cc_link = spec['scalapack'].fc_link
-        spec['scalapack'].libraries = [join_path(spec['scalapack'].prefix.lib, 'libscalapack%s' % lib_suffix)]
+        spec.fc_link = '-L%s -lscalapack' % spec.prefix.lib
+        spec.cc_link = spec.fc_link
+        spec.libraries = [join_path(spec.prefix.lib, 'libscalapack%s' % lib_suffix)]
diff --git a/var/spack/repos/builtin/packages/oce/package.py b/var/spack/repos/builtin/packages/oce/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d5081ac9d4a37957d13225bed30bfe1b06ec336
--- /dev/null
+++ b/var/spack/repos/builtin/packages/oce/package.py
@@ -0,0 +1,51 @@
+from spack import *
+import platform, sys
+
+class Oce(Package):
+    """
+    Open CASCADE Community Edition:
+    patches/improvements/experiments contributed by users over the official Open CASCADE library.
+    """
+    homepage = "https://github.com/tpaviot/oce"
+    url      = "https://github.com/tpaviot/oce/archive/OCE-0.17.tar.gz"
+
+    version('0.17.1', '36c67b87093c675698b483454258af91')
+    version('0.17'  , 'f1a89395c4b0d199bea3db62b85f818d')
+    version('0.16.1', '4d591b240c9293e879f50d86a0cb2bb3')
+    version('0.16'  , '7a4b4df5a104d75a537e25e7dd387eca')
+    version('0.15'  , '7ec541a1c350ca8a684f74980e48801c')
+
+    depends_on('cmake@2.8:')
+
+    def install(self, spec, prefix):
+        options = []
+        options.extend(std_cmake_args)
+        options.extend([
+            '-DOCE_INSTALL_PREFIX=%s' % prefix,
+            '-DOCE_BUILD_SHARED_LIB:BOOL=ON',
+            '-DOCE_BUILD_TYPE:STRING=Release',
+            '-DOCE_DATAEXCHANGE:BOOL=ON',
+            '-DOCE_DISABLE_X11:BOOL=ON',
+            '-DOCE_DRAW:BOOL=OFF',
+            '-DOCE_MODEL:BOOL=ON',
+            '-DOCE_MULTITHREAD_LIBRARY:STRING=NONE', # FIXME: add tbb
+            '-DOCE_OCAF:BOOL=ON',
+            '-DOCE_USE_TCL_TEST_FRAMEWORK:BOOL=OFF',
+            '-DOCE_VISUALISATION:BOOL=OFF',
+            '-DOCE_WITH_FREEIMAGE:BOOL=OFF',
+            '-DOCE_WITH_GL2PS:BOOL=OFF',
+            '-DOCE_WITH_OPENCL:BOOL=OFF'
+        ])
+
+        if platform.system() == 'Darwin':
+            options.extend([
+                '-DOCE_OSX_USE_COCOA:BOOL=ON',
+            ])
+
+        cmake('.', *options)
+
+        make("install/strip")
+
+        # The shared libraries are not installed correctly on Darwin; correct this
+        if (sys.platform == 'darwin'):
+            fix_darwin_install_name(prefix.lib)
diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py
index 38b355159dd4b81aacb0c39767b248208f56b004..6e99c236520f74e54c08c37f0d72d581f835ab16 100644
--- a/var/spack/repos/builtin/packages/octave/package.py
+++ b/var/spack/repos/builtin/packages/octave/package.py
@@ -62,7 +62,7 @@ class Octave(Package):
     depends_on('qrupdate',    when='+qrupdate')
     #depends_on('qscintilla',  when='+qscintilla) # TODO: add package
     depends_on('qt',          when='+qt')
-    depends_on('SuiteSparse', when='+suitesparse')
+    depends_on('suite-sparse',when='+suitesparse')
     depends_on('zlib',        when='+zlib')
 
 
diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py
index 781a1e2ec8fed967c1f0654b4b9cb23843bd7192..1d10f217c45caaeed3823730a83a97553b916f0b 100644
--- a/var/spack/repos/builtin/packages/openblas/package.py
+++ b/var/spack/repos/builtin/packages/openblas/package.py
@@ -6,6 +6,7 @@ class Openblas(Package):
     homepage = "http://www.openblas.net"
     url      = "http://github.com/xianyi/OpenBLAS/archive/v0.2.15.tar.gz"
 
+    version('0.2.17', '664a12807f2a2a7cda4781e3ab2ae0e1')
     version('0.2.16', 'fef46ab92463bdbb1479dcec594ef6dc')
     version('0.2.15', 'b1190f3d3471685f17cfd1ec1d252ac9')
 
@@ -14,7 +15,14 @@ class Openblas(Package):
     provides('lapack')
 
     def install(self, spec, prefix):
-        make('libs', 'netlib', 'shared', 'CC=cc', 'FC=f77')
+        extra=[]
+        if spec.satisfies('@0.2.16'):
+            extra.extend([
+                'BUILD_LAPACK_DEPRECATED=1' # fix missing _dggsvd_ and _sggsvd_
+            ])
+
+        make('libs', 'netlib', 'shared', 'CC=cc', 'FC=f77',*extra)
+        make("tests")
         make('install', "PREFIX='%s'" % prefix)
 
         lib_dsuffix = 'dylib' if sys.platform == 'darwin' else 'so'
diff --git a/var/spack/repos/builtin/packages/p4est/package.py b/var/spack/repos/builtin/packages/p4est/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e2969fe642c285c3280e90a3e8d54df82a83e79
--- /dev/null
+++ b/var/spack/repos/builtin/packages/p4est/package.py
@@ -0,0 +1,34 @@
+from spack import *
+
+class P4est(Package):
+    """Dynamic management of a collection (a forest) of adaptive octrees in parallel"""
+    homepage = "http://www.p4est.org"
+    url      = "http://p4est.github.io/release/p4est-1.1.tar.gz"
+
+    version('1.1', '37ba7f4410958cfb38a2140339dbf64f')
+
+    # disable by default to make it work on frontend of clusters
+    variant('tests', default=False, description='Run small tests')
+
+    depends_on('mpi')
+
+    def install(self, spec, prefix):
+        options = ['--enable-mpi',
+                   '--enable-shared',
+                   '--disable-vtk-binary',
+                   '--without-blas',
+                   'CPPFLAGS=-DSC_LOG_PRIORITY=SC_LP_ESSENTIAL',
+                   'CFLAGS=-O2',
+                   'CC=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpicc'), # TODO: use ENV variables or MPI class wrappers
+                   'CXX=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpic++'),
+                   'FC=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif90'),
+                   'F77=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif77'),
+                  ]
+
+        configure('--prefix=%s' % prefix, *options)
+
+        make()
+        if '+tests' in self.spec:
+            make("check")
+
+        make("install")
diff --git a/var/spack/repos/builtin/packages/parmetis/enable_external_metis.patch b/var/spack/repos/builtin/packages/parmetis/enable_external_metis.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e4f2729483638d2a1929cd905338dc51493282f2
--- /dev/null
+++ b/var/spack/repos/builtin/packages/parmetis/enable_external_metis.patch
@@ -0,0 +1,71 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index ca945dd..aff8b5f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -23,7 +23,7 @@ else()
+   set(ParMETIS_LIBRARY_TYPE STATIC)
+ endif()
+ 
+-include(${GKLIB_PATH}/GKlibSystem.cmake)
++include_directories(${GKLIB_PATH})
+ 
+ # List of paths that the compiler will search for header files.
+ # i.e., the -I equivalent
+@@ -33,7 +33,7 @@ include_directories(${GKLIB_PATH})
+ include_directories(${METIS_PATH}/include)
+ 
+ # List of directories that cmake will look for CMakeLists.txt
+-add_subdirectory(${METIS_PATH}/libmetis ${CMAKE_BINARY_DIR}/libmetis)
++find_library(METIS_LIBRARY metis PATHS ${METIS_PATH}/lib)
+ add_subdirectory(include)
+ add_subdirectory(libparmetis)
+ add_subdirectory(programs)
+diff --git a/libparmetis/CMakeLists.txt b/libparmetis/CMakeLists.txt
+index 9cfc8a7..e0c4de7 100644
+--- a/libparmetis/CMakeLists.txt
++++ b/libparmetis/CMakeLists.txt
+@@ -5,7 +5,10 @@ file(GLOB parmetis_sources *.c)
+ # Create libparmetis
+ add_library(parmetis ${ParMETIS_LIBRARY_TYPE} ${parmetis_sources})
+ # Link with metis and MPI libraries.
+-target_link_libraries(parmetis metis ${MPI_LIBRARIES})
++target_link_libraries(parmetis ${METIS_LIBRARY} ${MPI_LIBRARIES})
++if(UNIX)
++  target_link_libraries(parmetis m)
++endif()
+ set_target_properties(parmetis PROPERTIES LINK_FLAGS "${MPI_LINK_FLAGS}")
+ 
+ install(TARGETS parmetis
+diff --git a/libparmetis/parmetislib.h b/libparmetis/parmetislib.h
+index c1daeeb..07511f6 100644
+--- a/libparmetis/parmetislib.h
++++ b/libparmetis/parmetislib.h
+@@ -20,13 +20,12 @@
+ 
+ #include <parmetis.h>
+ 
+-#include "../metis/libmetis/gklib_defs.h"
++#include <gklib_defs.h>
+ 
+-#include <mpi.h> 
++#include <mpi.h>
+ 
+ #include <rename.h>
+ #include <defs.h>
+ #include <struct.h>
+ #include <macros.h>
+ #include <proto.h>
+-
+diff --git a/programs/parmetisbin.h b/programs/parmetisbin.h
+index e26cd2d..d156480 100644
+--- a/programs/parmetisbin.h
++++ b/programs/parmetisbin.h
+@@ -19,7 +19,7 @@
+ #include <GKlib.h>
+ #include <parmetis.h>
+ 
+-#include "../metis/libmetis/gklib_defs.h"
++#include <gklib_defs.h>
+ #include "../libparmetis/rename.h"
+ #include "../libparmetis/defs.h"
+ #include "../libparmetis/struct.h"
diff --git a/var/spack/repos/builtin/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py
index c897dec7e44b4768e4e9abe9e94f5b41b4a4a1a1..ff4370aa4b4b609f3ec2185fbb294e4b19e27295 100644
--- a/var/spack/repos/builtin/packages/parmetis/package.py
+++ b/var/spack/repos/builtin/packages/parmetis/package.py
@@ -24,10 +24,7 @@
 ##############################################################################
 
 from spack import *
-
-# FIXME : lot of code is duplicated from packages/metis/package.py . Inheriting from there may reduce
-# FIXME : the installation rules to just a few lines
-
+import sys
 
 class Parmetis(Package):
     """
@@ -43,13 +40,17 @@ class Parmetis(Package):
     variant('debug', default=False, description='Builds the library in debug mode')
     variant('gdb', default=False, description='Enables gdb support')
 
-    variant('idx64', default=False, description='Use int64_t as default index type')
-    variant('double', default=False, description='Use double precision floating point types')
-
     depends_on('cmake @2.8:')  # build dependency
     depends_on('mpi')
 
-    # FIXME : this should conflict with metis as it builds its own version internally
+    patch('enable_external_metis.patch')
+    depends_on('metis')
+
+    # bug fixes from PETSc developers
+    # https://bitbucket.org/petsc/pkg-parmetis/commits/1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b/raw/
+    patch('pkg-parmetis-1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b.patch')
+    # https://bitbucket.org/petsc/pkg-parmetis/commits/82409d68aa1d6cbc70740d0f35024aae17f7d5cb/raw/
+    patch('pkg-parmetis-82409d68aa1d6cbc70740d0f35024aae17f7d5cb.patch')
 
     depends_on('gdb', when='+gdb')
 
@@ -63,8 +64,8 @@ def install(self, spec, prefix):
 
         # FIXME : Once a contract is defined, MPI compilers should be retrieved indirectly via spec['mpi'] in case
         # FIXME : they use a non-standard name
-        options.extend(['-DGKLIB_PATH:PATH={metis_source}/GKlib'.format(metis_source=metis_source),
-                        '-DMETIS_PATH:PATH={metis_source}'.format(metis_source=metis_source),
+        options.extend(['-DGKLIB_PATH:PATH={metis_source}/GKlib'.format(metis_source=spec['metis'].prefix.include),
+                        '-DMETIS_PATH:PATH={metis_source}'.format(metis_source=spec['metis'].prefix),
                         '-DCMAKE_C_COMPILER:STRING=mpicc',
                         '-DCMAKE_CXX_COMPILER:STRING=mpicxx'])
 
@@ -78,18 +79,11 @@ def install(self, spec, prefix):
         if '+gdb' in spec:
             options.append('-DGDB:BOOL=ON')
 
-        metis_header = join_path(metis_source, 'include', 'metis.h')
-
-        if '+idx64' in spec:
-            filter_file('IDXTYPEWIDTH 32', 'IDXTYPEWIDTH 64', metis_header)
-
-        if '+double' in spec:
-            filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header)
-
         with working_dir(build_directory, create=True):
             cmake(source_directory, *options)
             make()
             make("install")
-            # Parmetis build system doesn't allow for an external metis to be used, but doesn't copy the required
-            # metis header either
-            install(metis_header, self.prefix.include)
+
+            # The shared library is not installed correctly on Darwin; correct this
+            if (sys.platform == 'darwin') and ('+shared' in spec):
+                fix_darwin_install_name(prefix.lib)
diff --git a/var/spack/repos/builtin/packages/parmetis/pkg-parmetis-1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b.patch b/var/spack/repos/builtin/packages/parmetis/pkg-parmetis-1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e6b8056c210ee81a4e1b53de95158fa00648ff34
--- /dev/null
+++ b/var/spack/repos/builtin/packages/parmetis/pkg-parmetis-1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b.patch
@@ -0,0 +1,77 @@
+From 1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b Mon Sep 17 00:00:00 2001
+From: Jed Brown <jed@59A2.org>
+Date: Fri, 12 Oct 2012 15:45:10 -0500
+Subject: [PATCH] ParMetis bug fixes reported by John Fettig [petsc-maint
+ #133631]
+
+'''
+I have also reported to to Karypis but have received zero
+response and he hasn't released any updates to the original release
+either.  At least he approved my forum posting so that other people
+can see the bug and the fix.
+http://glaros.dtc.umn.edu/gkhome/node/837
+'''
+
+Hg-commit: 1c2b9fe39201d404b493885093b5992028b9b8d4
+---
+ libparmetis/xyzpart.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/libparmetis/xyzpart.c b/libparmetis/xyzpart.c
+index 3a2c289..63abfcb 100644
+--- a/libparmetis/xyzpart.c
++++ b/libparmetis/xyzpart.c
+@@ -104,7 +104,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+ 
+     for (i=0; i<nbins; i++)
+       emarkers[i] = gmin + (gmax-gmin)*i/nbins;
+-    emarkers[nbins] = gmax*(1.0+2.0*REAL_EPSILON);
++    emarkers[nbins] = gmax*(1.0+copysign(1.0,gmax)*2.0*REAL_EPSILON);
+ 
+     /* get into a iterative backet boundary refinement */
+     for (l=0; l<5; l++) {
+@@ -152,7 +152,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+         }
+       }
+       nemarkers[0]     = gmin;
+-      nemarkers[nbins] = gmax*(1.0+2.0*REAL_EPSILON);
++      nemarkers[nbins] = gmax*(1.0+copysign(1.0,gmax)*2.0*REAL_EPSILON);
+       rcopy(nbins+1, nemarkers, emarkers);
+     }
+ 
+@@ -218,7 +218,7 @@ void RBBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+ 
+     emarkers[0] = gmin;
+     emarkers[1] = gsum/gnvtxs;
+-    emarkers[2] = gmax*(1.0+2.0*REAL_EPSILON);
++    emarkers[2] = gmax*(1.0+(gmax < 0 ? -1. : 1.)*2.0*REAL_EPSILON);
+     cnbins = 2;
+ 
+     /* get into a iterative backet boundary refinement */
+@@ -227,7 +227,7 @@ void RBBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+       iset(cnbins, 0, lcounts);
+       rset(cnbins, 0, lsums);
+       for (j=0, i=0; i<nvtxs;) {
+-        if (cand[i].key < emarkers[j+1]) {
++        if (cand[i].key <= emarkers[j+1]) {
+           lcounts[j]++;
+           lsums[j] += cand[i].key;
+           i++;
+@@ -272,12 +272,12 @@ void RBBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+       
+       rsorti(cnbins, nemarkers);
+       rcopy(cnbins, nemarkers, emarkers);
+-      emarkers[cnbins] = gmax*(1.0+2.0*REAL_EPSILON);
++      emarkers[cnbins] = gmax*(1.0+(gmax < 0 ? -1. : 1.)*2.0*REAL_EPSILON);
+     }
+ 
+     /* assign the coordinate to the appropriate bin */
+     for (j=0, i=0; i<nvtxs;) {
+-      if (cand[i].key < emarkers[j+1]) {
++      if (cand[i].key <= emarkers[j+1]) {
+         bxyz[cand[i].val*ndims+k] = j;
+         i++;
+       }
+-- 
+2.1.1.1.g1fb337f
+
diff --git a/var/spack/repos/builtin/packages/parmetis/pkg-parmetis-82409d68aa1d6cbc70740d0f35024aae17f7d5cb.patch b/var/spack/repos/builtin/packages/parmetis/pkg-parmetis-82409d68aa1d6cbc70740d0f35024aae17f7d5cb.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9651d553478d23109b95ee31edd57183183094d8
--- /dev/null
+++ b/var/spack/repos/builtin/packages/parmetis/pkg-parmetis-82409d68aa1d6cbc70740d0f35024aae17f7d5cb.patch
@@ -0,0 +1,35 @@
+From 82409d68aa1d6cbc70740d0f35024aae17f7d5cb Mon Sep 17 00:00:00 2001
+From: Sean Farley <sean@mcs.anl.gov>
+Date: Tue, 20 Mar 2012 11:59:44 -0500
+Subject: [PATCH] parmetis: fix bug reported by jfettig; '<' to '<=' in xyzpart
+
+Hg-commit: 2dd2eae596acaabbc80e0ef875182616f868dbc2
+---
+ libparmetis/xyzpart.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libparmetis/xyzpart.c b/libparmetis/xyzpart.c
+index 307aed9..3a2c289 100644
+--- a/libparmetis/xyzpart.c
++++ b/libparmetis/xyzpart.c
+@@ -111,7 +111,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+       /* determine bucket counts */
+       iset(nbins, 0, lcounts);
+       for (j=0, i=0; i<nvtxs;) {
+-        if (cand[i].key < emarkers[j+1]) {
++        if (cand[i].key <= emarkers[j+1]) {
+           lcounts[j]++;
+           i++;
+         }
+@@ -158,7 +158,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
+ 
+     /* assign the coordinate to the appropriate bin */
+     for (j=0, i=0; i<nvtxs;) {
+-      if (cand[i].key < emarkers[j+1]) {
++      if (cand[i].key <= emarkers[j+1]) {
+         bxyz[cand[i].val*ndims+k] = j;
+         i++;
+       }
+-- 
+2.1.1.1.g1fb337f
+
diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py
index efe172fc083fe34a7c29aaa77d643a3c4a253305..e9b7c8a732c9230e03d85e0979ad753df917c81e 100644
--- a/var/spack/repos/builtin/packages/petsc/package.py
+++ b/var/spack/repos/builtin/packages/petsc/package.py
@@ -17,14 +17,18 @@ class Petsc(Package):
     version('3.5.1', 'a557e029711ebf425544e117ffa44d8f')
     version('3.4.4', '7edbc68aa6d8d6a3295dd5f6c2f6979d')
 
-    variant('shared', default=True, description='Enables the build of shared libraries')
-    variant('mpi', default=True, description='Activates MPI support')
-    variant('double', default=True, description='Switches between single and double precision')
+    variant('shared',  default=True,  description='Enables the build of shared libraries')
+    variant('mpi',     default=True,  description='Activates MPI support')
+    variant('double',  default=True,  description='Switches between single and double precision')
+    variant('complex', default=False, description='Build with complex numbers')
+    variant('debug',   default=False, description='Compile in debug mode')
 
-    variant('metis', default=True, description='Activates support for metis and parmetis')
-    variant('hdf5', default=True, description='Activates support for HDF5 (only parallel)')
-    variant('boost', default=True, description='Activates support for Boost')
-    variant('hypre', default=True, description='Activates support for Hypre')
+    variant('metis',   default=True,  description='Activates support for metis and parmetis')
+    variant('hdf5',    default=True,  description='Activates support for HDF5 (only parallel)')
+    variant('boost',   default=True,  description='Activates support for Boost')
+    variant('hypre',   default=True,  description='Activates support for Hypre (only parallel)')
+    variant('mumps',   default=True,  description='Activates support for MUMPS (only parallel)')
+    variant('superlu-dist', default=True, description='Activates support for SuperluDist (only parallel)')
 
     # Virtual dependencies
     depends_on('blas')
@@ -40,7 +44,13 @@ class Petsc(Package):
 
     depends_on('hdf5+mpi', when='+hdf5+mpi')
     depends_on('parmetis', when='+metis+mpi')
-    depends_on('hypre',    when='+hypre+mpi')
+    # Hypre does not support complex numbers.
+    # Also PETSc prefer to build it without internal superlu, likely due to conflict in headers
+    # see https://bitbucket.org/petsc/petsc/src/90564b43f6b05485163c147b464b5d6d28cde3ef/config/BuildSystem/config/packages/hypre.py
+    depends_on('hypre~internal-superlu', when='+hypre+mpi~complex')
+    depends_on('superlu-dist', when='+superlu-dist+mpi')
+    depends_on('mumps+mpi', when='+mumps+mpi')
+    depends_on('scalapack', when='+mumps+mpi')
 
     def mpi_dependent_options(self):
         if '~mpi' in self.spec:
@@ -55,28 +65,39 @@ def mpi_dependent_options(self):
             # If mpi is disabled (~mpi), it's an error to have any of these enabled.
             # This generates a list of any such errors.
             errors = [error_message_fmt.format(library=x)
-                      for x in ('hdf5', 'hypre', 'parmetis')
+                      for x in ('hdf5', 'hypre', 'parmetis','mumps','superlu-dist')
                       if ('+'+x) in self.spec]
             if errors:
                 errors = ['incompatible variants given'] + errors
                 raise RuntimeError('\n'.join(errors))
         else:
-            compiler_opts = [
-                '--with-mpi=1',
-                '--with-mpi-dir=%s' % self.spec['mpi'].prefix,
-            ]
+            if self.compiler.name == "clang":
+                compiler_opts = [
+                    '--with-mpi=1',
+                    '--with-cc=%s  -Qunused-arguments' % join_path(self.spec['mpi'].prefix.bin, 'mpicc'), # Avoid confusing PETSc config by clang: warning: argument unused during compilation
+                    '--with-cxx=%s -Qunused-arguments' % join_path(self.spec['mpi'].prefix.bin, 'mpic++'),
+                    '--with-fc=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif90'),
+                    '--with-f77=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif77'),
+                ]
+            else:
+                compiler_opts = [
+                    '--with-mpi=1',
+                    '--with-mpi-dir=%s' % self.spec['mpi'].prefix,
+                ]
         return compiler_opts
 
     def install(self, spec, prefix):
-        options = []
+        options = ['--with-ssl=0']
         options.extend(self.mpi_dependent_options())
         options.extend([
             '--with-precision=%s' % ('double' if '+double' in spec else 'single'),
+            '--with-scalar-type=%s' % ('complex' if '+complex' in spec else 'real'),
             '--with-shared-libraries=%s' % ('1' if '+shared' in spec else '0'),
+            '--with-debugging=%s' % ('1' if '+debug' in spec else '0'),
             '--with-blas-lapack-dir=%s' % spec['lapack'].prefix
         ])
         # Activates library support if needed
-        for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis'):
+        for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis','mumps','scalapack'):
             options.append(
                 '--with-{library}={value}'.format(library=library, value=('1' if library in spec else '0'))
             )
@@ -84,9 +105,24 @@ def install(self, spec, prefix):
                 options.append(
                     '--with-{library}-dir={path}'.format(library=library, path=spec[library].prefix)
                 )
+        # PETSc does not pick up SuperluDist from the dir as they look for superlu_dist_4.1.a
+        if 'superlu-dist' in spec:
+            options.extend([
+                '--with-superlu_dist-include=%s' % spec['superlu-dist'].prefix.include,
+                '--with-superlu_dist-lib=%s' % join_path(spec['superlu-dist'].prefix.lib, 'libsuperlu_dist.a'),
+                '--with-superlu_dist=1'
+            ])
+        else:
+            options.append(
+                '--with-superlu_dist=0'
+            )
 
         configure('--prefix=%s' % prefix, *options)
 
         # PETSc has its own way of doing parallel make.
         make('MAKE_NP=%s' % make_jobs, parallel=False)
         make("install")
+
+    def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
+        # set up PETSC_DIR for everyone using PETSc package
+        spack_env.set('PETSC_DIR', self.prefix)
diff --git a/var/spack/repos/builtin/packages/py-netcdf/package.py b/var/spack/repos/builtin/packages/py-netcdf/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..7faa15ad253c886dfd1f7904a7effe4659eba47d
--- /dev/null
+++ b/var/spack/repos/builtin/packages/py-netcdf/package.py
@@ -0,0 +1,16 @@
+from spack import *
+
+class PyNetcdf(Package):
+    """Python interface to the netCDF Library."""
+    homepage = "http://unidata.github.io/netcdf4-python"
+    url      = "https://github.com/Unidata/netcdf4-python/tarball/v1.2.3.1rel"
+
+    version('1.2.3.1', '4fc4320d4f2a77b894ebf8da1c9895af')
+
+    extends('python')
+    depends_on('py-numpy')
+    depends_on('py-cython')
+    depends_on('netcdf')
+
+    def install(self, spec, prefix):
+        python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py
index 03548111863f49e3a0e38556abf0f03a6aeeecae..a08e612df6c65b7c18d06b6f61d3d5821f6d9f71 100644
--- a/var/spack/repos/builtin/packages/py-numpy/package.py
+++ b/var/spack/repos/builtin/packages/py-numpy/package.py
@@ -1,24 +1,43 @@
 from spack import *
 
 class PyNumpy(Package):
-    """array processing for numbers, strings, records, and objects."""
-    homepage = "https://pypi.python.org/pypi/numpy"
+    """NumPy is the fundamental package for scientific computing with Python.
+    It contains among other things: a powerful N-dimensional array object,
+    sophisticated (broadcasting) functions, tools for integrating C/C++ and
+    Fortran code, and useful linear algebra, Fourier transform, and random
+    number capabilities"""
+    homepage = "http://www.numpy.org/"
     url      = "https://pypi.python.org/packages/source/n/numpy/numpy-1.9.1.tar.gz"
 
-    version('1.9.1', '78842b73560ec378142665e712ae4ad9')
-    version('1.9.2', 'a1ed53432dbcd256398898d35bc8e645')
+    version('1.10.4', 'aed294de0aa1ac7bd3f9745f4f1968ad')
+    version('1.9.2',  'a1ed53432dbcd256398898d35bc8e645')
+    version('1.9.1',  '78842b73560ec378142665e712ae4ad9')
 
-    variant('blas', default=True)
+
+    variant('blas',   default=True)
+    variant('lapack', default=True)
 
     extends('python')
     depends_on('py-nose')
-    depends_on('netlib-blas+fpic', when='+blas')
-    depends_on('netlib-lapack+shared', when='+blas')
+    depends_on('blas',   when='+blas')
+    depends_on('lapack', when='+lapack')
 
     def install(self, spec, prefix):
+        libraries    = []
+        library_dirs = []
+
         if '+blas' in spec:
+            libraries.append('blas')
+            library_dirs.append(spec['blas'].prefix.lib)
+        if '+lapack' in spec:
+            libraries.append('lapack')
+            library_dirs.append(spec['lapack'].prefix.lib)
+
+        if '+blas' in spec or '+lapack' in spec:
             with open('site.cfg', 'w') as f:
                 f.write('[DEFAULT]\n')
-                f.write('libraries=lapack,blas\n')
-                f.write('library_dirs=%s/lib:%s/lib\n' % (spec['blas'].prefix, spec['lapack'].prefix))
+                f.write('libraries=%s\n'    % ','.join(libraries))
+                f.write('library_dirs=%s\n' % ':'.join(library_dirs))
+
         python('setup.py', 'install', '--prefix=%s' % prefix)
+
diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py
index 3a1124cc15a95c8cdebf3b1e44c299ce2baee5f5..c2161c90c430086e50e64b4639eddde33b74338f 100644
--- a/var/spack/repos/builtin/packages/py-scipy/package.py
+++ b/var/spack/repos/builtin/packages/py-scipy/package.py
@@ -2,11 +2,12 @@
 
 class PyScipy(Package):
     """Scientific Library for Python."""
-    homepage = "https://pypi.python.org/pypi/scipy"
+    homepage = "http://www.scipy.org/"
     url      = "https://pypi.python.org/packages/source/s/scipy/scipy-0.15.0.tar.gz"
 
-    version('0.15.0', '639112f077f0aeb6d80718dc5019dc7a')
+    version('0.17.0', '5ff2971e1ce90e762c59d2cd84837224')
     version('0.15.1', 'be56cd8e60591d6332aac792a5880110')
+    version('0.15.0', '639112f077f0aeb6d80718dc5019dc7a')
 
     extends('python')
     depends_on('py-nose')
diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py
index 4f55bc803ea7caae120af983f3cf12b92340d4e8..f5237c3b578b9c8900d45d8515428a1e5fe5b344 100644
--- a/var/spack/repos/builtin/packages/python/package.py
+++ b/var/spack/repos/builtin/packages/python/package.py
@@ -105,10 +105,13 @@ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
 
         pythonpath = ':'.join(python_paths)
         spack_env.set('PYTHONPATH', pythonpath)
-        run_env.set('PYTHONPATH', pythonpath)
 
+        # For run time environment set only the path for extension_spec and prepend it to PYTHONPATH
+        if extension_spec.package.extends(self.spec):
+            run_env.prepend_path('PYTHONPATH', os.path.join(extension_spec.prefix, self.site_packages_dir))
 
-    def modify_module(self, module, spec, ext_spec):
+
+    def setup_dependent_package(self, module, ext_spec):
         """
         Called before python modules' install() methods.
 
@@ -118,17 +121,18 @@ def modify_module(self, module, spec, ext_spec):
         """
         # Python extension builds can have a global python executable function
         if self.version >= Version("3.0.0") and self.version < Version("4.0.0"):
-            module.python = Executable(join_path(spec.prefix.bin, 'python3'))
+            module.python = Executable(join_path(self.spec.prefix.bin, 'python3'))
         else:
-            module.python = Executable(join_path(spec.prefix.bin, 'python'))
+            module.python = Executable(join_path(self.spec.prefix.bin, 'python'))
 
         # Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs.
         module.python_lib_dir     = os.path.join(ext_spec.prefix, self.python_lib_dir)
         module.python_include_dir = os.path.join(ext_spec.prefix, self.python_include_dir)
         module.site_packages_dir  = os.path.join(ext_spec.prefix, self.site_packages_dir)
 
-        # Make the site packages directory if it does not exist already.
-        mkdirp(module.site_packages_dir)
+        # Make the site packages directory for extensions, if it does not exist already.
+        if ext_spec.package.is_extension:
+            mkdirp(module.site_packages_dir)
 
     # ========================================================================
     # Handle specifics of activating and deactivating python modules.
diff --git a/var/spack/repos/builtin/packages/ruby/package.py b/var/spack/repos/builtin/packages/ruby/package.py
index 7ff1898ce9131cbacaa09b29267fac2ed550e76a..e13677e4d22d00ae1097caa4f5fbe7be186d00b8 100644
--- a/var/spack/repos/builtin/packages/ruby/package.py
+++ b/var/spack/repos/builtin/packages/ruby/package.py
@@ -30,7 +30,7 @@ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
         # The actual installation path for this gem
         spack_env.set('GEM_HOME', extension_spec.prefix)
 
-    def modify_module(self, module, spec, ext_spec):
+    def setup_dependent_package(self, module, ext_spec):
         """Called before ruby modules' install() methods.  Sets GEM_HOME
         and GEM_PATH to values appropriate for the package being built.
 
@@ -39,5 +39,5 @@ def modify_module(self, module, spec, ext_spec):
             gem('install', '<gem-name>.gem')
         """
         # Ruby extension builds have global ruby and gem functions
-        module.ruby = Executable(join_path(spec.prefix.bin, 'ruby'))
-        module.gem = Executable(join_path(spec.prefix.bin, 'gem'))
+        module.ruby = Executable(join_path(self.spec.prefix.bin, 'ruby'))
+        module.gem = Executable(join_path(self.spec.prefix.bin, 'gem'))
diff --git a/var/spack/repos/builtin/packages/silo/package.py b/var/spack/repos/builtin/packages/silo/package.py
index d1aed78e0e89f3badd987df51a1d5517b0148984..b7894e4d2bd43097538ed6156d2ce4a77b9d9551 100644
--- a/var/spack/repos/builtin/packages/silo/package.py
+++ b/var/spack/repos/builtin/packages/silo/package.py
@@ -5,24 +5,35 @@ class Silo(Package):
        data to binary, disk files."""
 
     homepage = "http://wci.llnl.gov/simulation/computer-codes/silo"
-    url      = "https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo/silo-4.8/silo-4.8.tar.gz"
+    base_url = "https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo"
 
+    version('4.10.2', '9ceac777a2f2469ac8cef40f4fab49c8')
+    version('4.9', 'a83eda4f06761a86726e918fc55e782a')
     version('4.8', 'b1cbc0e7ec435eb656dc4b53a23663c9')
 
     variant('fortran', default=True, description='Enable Fortran support')
+    variant('silex', default=False, description='Builds Silex, a GUI for viewing Silo files')
 
-    depends_on("hdf5")
+    depends_on('hdf5')
+    depends_on('qt', when='+silex')
 
     def install(self, spec, prefix):
         config_args = [
             '--enable-fortran' if '+fortran' in spec else '--disable-fortran',
+            '--enable-silex' if '+silex' in spec else '--disable-silex',
         ]
 
+        if '+silex' in spec:
+            config_args.append('--with-Qt-dir=%s' % spec['qt'].prefix)
+
         configure(
-            "--prefix=%s" % prefix,
-            "--with-hdf5=%s,%s" % (spec['hdf5'].prefix.include, spec['hdf5'].prefix.lib),
-            "--with-zlib=%s,%s" % (spec['zlib'].prefix.include, spec['zlib'].prefix.lib),
+            '--prefix=%s' % prefix,
+            '--with-hdf5=%s,%s' % (spec['hdf5'].prefix.include, spec['hdf5'].prefix.lib),
+            '--with-zlib=%s,%s' % (spec['zlib'].prefix.include, spec['zlib'].prefix.lib),
             *config_args)
 
         make()
-        make("install")
+        make('install')
+
+    def url_for_version(self, version):
+        return '%s/silo-%s/silo-%s.tar.gz' % (Silo.base_url, version, version)
diff --git a/var/spack/repos/builtin/packages/slepc/package.py b/var/spack/repos/builtin/packages/slepc/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b5f24394f6ecf537d3291c61d974191705c29eb
--- /dev/null
+++ b/var/spack/repos/builtin/packages/slepc/package.py
@@ -0,0 +1,49 @@
+import os
+from spack import *
+
+
+class Slepc(Package):
+    """
+    Scalable Library for Eigenvalue Computations.
+    """
+
+    homepage = "http://www.grycap.upv.es/slepc"
+    url = "http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz"
+
+    version('3.6.2', '2ab4311bed26ccf7771818665991b2ea3a9b15f97e29fd13911ab1293e8e65df')
+
+    variant('arpack', default=False, description='Enables Arpack wrappers')
+
+    depends_on('petsc')
+    depends_on('arpack-ng~mpi',when='+arpack^petsc~mpi')
+    depends_on('arpack-ng+mpi',when='+arpack^petsc+mpi')
+
+    def install(self, spec, prefix):
+        # set SLEPC_DIR for installation
+        os.environ['SLEPC_DIR'] = self.stage.source_path
+
+        options = []
+
+        if '+arpack' in spec:
+            options.extend([
+                '--with-arpack-dir=%s' % spec['arpack-ng'].prefix.lib,
+            ])
+            if 'arpack-ng~mpi' in spec:
+                options.extend([
+                    '--with-arpack-flags=-larpack'
+                ])
+            else:
+                options.extend([
+                    '--with-arpack-flags=-lparpack,-larpack'
+                ])
+
+        configure('--prefix=%s' % prefix, *options)
+
+        make('MAKE_NP=%s' % make_jobs, parallel=False)
+        #FIXME:
+        # make('test')
+        make('install')
+
+    def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
+        # set up SLEPC_DIR for everyone using SLEPc package
+        spack_env.set('SLEPC_DIR', self.prefix)
diff --git a/var/spack/repos/builtin/packages/SuiteSparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py
similarity index 97%
rename from var/spack/repos/builtin/packages/SuiteSparse/package.py
rename to var/spack/repos/builtin/packages/suite-sparse/package.py
index 6e130d118fe66484fad6cca59a167dd3d9bd43ef..b57f9967c30cf2ee51ecdeb7f691df7ae663abce 100644
--- a/var/spack/repos/builtin/packages/SuiteSparse/package.py
+++ b/var/spack/repos/builtin/packages/suite-sparse/package.py
@@ -1,7 +1,7 @@
 from spack import *
 
 
-class Suitesparse(Package):
+class SuiteSparse(Package):
     """
     SuiteSparse is a suite of sparse matrix algorithms
     """
@@ -24,4 +24,3 @@ def install(self, spec, prefix):
         # FIXME : this actually uses the current workaround
         # FIXME : (blas / lapack always provide libblas and liblapack as aliases)
         make('install', 'INSTALL=%s' % prefix, 'BLAS=-lblas', 'LAPACK=-llapack')
-
diff --git a/var/spack/repos/builtin/packages/superlu-dist/package.py b/var/spack/repos/builtin/packages/superlu-dist/package.py
index c4c76909b359b9e64d4218fbf470ca2cd8671857..ddcb7f92252183f582341df465d85335e438e962 100644
--- a/var/spack/repos/builtin/packages/superlu-dist/package.py
+++ b/var/spack/repos/builtin/packages/superlu-dist/package.py
@@ -1,4 +1,5 @@
 from spack import *
+import glob
 
 class SuperluDist(Package):
     """A general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equations on high performance machines."""
@@ -52,12 +53,13 @@ def install(self, spec, prefix):
         # system "make"
 
         # need to install by hand
-        headers_location = join_path(self.prefix.include,'superlu_dist')
+        headers_location = self.prefix.include
         mkdirp(headers_location)
-        # FIXME: fetch all headers in the folder automatically
-        for header in ['Cnames.h','cublas_utils.h','dcomplex.h','html_mainpage.h','machines.h','old_colamd.h','psymbfact.h','superlu_ddefs.h','superlu_defs.h','superlu_enum_consts.h','superlu_zdefs.h','supermatrix.h','util_dist.h']:
-            superludist_header = join_path(self.stage.source_path, 'SRC/',header)
-            install(superludist_header, headers_location)
+        mkdirp(prefix.lib)
+
+        headers = glob.glob(join_path(self.stage.source_path, 'SRC','*.h'))
+        for h in headers:
+            install(h,headers_location)
 
         superludist_lib = join_path(self.stage.source_path, 'lib/libsuperlu_dist.a')
         install(superludist_lib,self.prefix.lib)
diff --git a/var/spack/repos/builtin/packages/tbb/package.py b/var/spack/repos/builtin/packages/tbb/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..56ffe4c27c649b09336d5be8867b7ceaa5c4ef79
--- /dev/null
+++ b/var/spack/repos/builtin/packages/tbb/package.py
@@ -0,0 +1,79 @@
+from spack import *
+import os
+import glob
+
+class Tbb(Package):
+    """Widely used C++ template library for task parallelism.
+    Intel Threading Building Blocks (Intel TBB) lets you easily write parallel
+    C++ programs that take full advantage of multicore performance, that are
+    portable and composable, and that have future-proof scalability.
+    """
+    homepage = "http://www.threadingbuildingblocks.org/"
+
+    # Only version-specific URL's work for TBB
+    version('4.4.3', '80707e277f69d9b20eeebdd7a5f5331137868ce1', url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160128oss_src_0.tgz')
+
+    def coerce_to_spack(self,tbb_build_subdir):
+        for compiler in ["icc","gcc","clang"]:
+              fs = glob.glob(join_path(tbb_build_subdir,"*.%s.inc" % compiler ))
+              for f in fs:
+                  lines = open(f).readlines()
+                  of = open(f,"w")
+                  for l in lines:
+                      if l.strip().startswith("CPLUS ="):
+                        of.write("# coerced to spack\n")
+                        of.write("CPLUS = $(CXX)\n")
+                      elif l.strip().startswith("CPLUS ="):
+                        of.write("# coerced to spack\n")
+                        of.write("CONLY = $(CC)\n")
+                      else:
+                        of.write(l);
+
+    def install(self, spec, prefix):
+        #
+        # we need to follow TBB's compiler selection logic to get the proper build + link flags
+        # but we still need to use spack's compiler wrappers
+        # to accomplish this, we do two things:
+        #
+        # * Look at the spack spec to determine which compiler we should pass to tbb's Makefile
+        #
+        # * patch tbb's build system to use the compiler wrappers (CC, CXX) for
+        #    icc, gcc, clang
+        #    (see coerce_to_spack())
+        #
+        self.coerce_to_spack("build")
+
+        if spec.satisfies('%clang'):
+            tbb_compiler = "clang"
+        elif spec.satisfies('%intel'):
+            tbb_compiler = "icc"
+        else:
+            tbb_compiler = "gcc"
+
+
+        mkdirp(prefix)
+        mkdirp(prefix.lib)
+
+        #
+        # tbb does not have a configure script or make install target
+        # we simply call make, and try to put the pieces together
+        #
+        make("compiler=%s"  %(tbb_compiler))
+
+        # install headers to {prefix}/include
+        install_tree('include',prefix.include)
+
+        # install libs to {prefix}/lib
+        tbb_lib_names = ["libtbb",
+                         "libtbbmalloc",
+                         "libtbbmalloc_proxy"]
+
+        for lib_name in tbb_lib_names:
+            # install release libs
+            fs = glob.glob(join_path("build","*release",lib_name + ".*"))
+            for f in fs:
+                install(f, prefix.lib)
+            # install debug libs if they exist
+            fs = glob.glob(join_path("build","*debug",lib_name + "_debug.*"))
+            for f in fs:
+                install(f, prefix.lib)