diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py
index 0b76db3827a127582e3db9323844587d81e763b3..1f763ad3588746a136b91c85ec2c28c16e859f0e 100644
--- a/var/spack/repos/builtin/packages/dealii/package.py
+++ b/var/spack/repos/builtin/packages/dealii/package.py
@@ -23,8 +23,10 @@ class Dealii(Package):
 
     # required dependencies, light version
     depends_on ("blas")
-    depends_on ("boost",     when='~mpi')
-    depends_on ("boost+mpi", when='+mpi')
+    # Boost 1.58 is blacklisted, see https://github.com/dealii/dealii/issues/1591
+    # require at least 1.59
+    depends_on ("boost@1.59.0:",     when='~mpi')
+    depends_on ("boost@1.59.0:+mpi", when='+mpi')
     depends_on ("bzip2")
     depends_on ("cmake")
     depends_on ("lapack")
@@ -174,6 +176,19 @@ def install(self, spec, prefix):
             make('release')
             make('run',parallel=False)
 
+        # An example which uses Metis + PETSc
+        # FIXME: switch step-18 to MPI
+        with working_dir('examples/step-18'):
+            print('=====================================')
+            print('============= Step-18 ===============')
+            print('=====================================')
+            # list the number of cycles to speed up
+            filter_file(r'(end_time = 10;)',  ('end_time = 3;'), 'step-18.cc')
+            if '^petsc' in spec and '^metis' in spec:
+                cmake('.')
+                make('release')
+                make('run',parallel=False)
+
         # take step-40 which can use both PETSc and Trilinos
         # FIXME: switch step-40 to MPI run
         with working_dir('examples/step-40'):
diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py
index 9301135f9f327b8e3f2a78023a8c33fa6e19150a..d3bab554fec9bdda1216ef8d8beec70a6691f13e 100644
--- a/var/spack/repos/builtin/packages/metis/package.py
+++ b/var/spack/repos/builtin/packages/metis/package.py
@@ -79,10 +79,28 @@ def install(self, spec, prefix):
         if '+double' in spec:
             filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header)
 
+        # Make clang 7.3 happy.
+        # Prevents "ld: section __DATA/__thread_bss extends beyond end of file"
+        # See upstream LLVM issue https://llvm.org/bugs/show_bug.cgi?id=27059
+        # Adopted from https://github.com/Homebrew/homebrew-science/blob/master/metis.rb
+        if spec.satisfies('%clang@7.3.0'):
+            filter_file('#define MAX_JBUFS 128', '#define MAX_JBUFS 24', join_path(source_directory, 'GKlib', 'error.c'))
+
         with working_dir(build_directory, create=True):
             cmake(source_directory, *options)
             make()
             make("install")
+            # now run some tests:
+            for f in ["4elt", "copter2", "mdual"]:
+                graph = join_path(source_directory,'graphs','%s.graph' % f)
+                Executable(join_path(prefix.bin,'graphchk'))(graph)
+                Executable(join_path(prefix.bin,'gpmetis'))(graph,'2')
+                Executable(join_path(prefix.bin,'ndmetis'))(graph)
+
+            graph = join_path(source_directory,'graphs','test.mgraph')
+            Executable(join_path(prefix.bin,'gpmetis'))(graph,'2')
+            graph = join_path(source_directory,'graphs','metis.mesh')
+            Executable(join_path(prefix.bin,'mpmetis'))(graph,'2')
 
             # install GKlib headers, which will be needed for ParMETIS
             GKlib_dist = join_path(prefix.include,'GKlib')
diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py
index c2196dcec4d1d17b6ee3e5459ec8f48fb8cf67be..a4b3979a1573fd308829324d059be6fd5ea2ac89 100644
--- a/var/spack/repos/builtin/packages/suite-sparse/package.py
+++ b/var/spack/repos/builtin/packages/suite-sparse/package.py
@@ -10,10 +10,18 @@ class SuiteSparse(Package):
 
     version('4.5.1', 'f0ea9aad8d2d1ffec66a5b6bfeff5319')
 
+    # FIXME: (see below)
+    # variant('tbb', default=True, description='Build with Intel TBB')
+
     depends_on('blas')
     depends_on('lapack')
 
     depends_on('metis@5.1.0', when='@4.5.1')
+    # FIXME:
+    # in @4.5.1. TBB support in SPQR seems to be broken as TBB-related linkng flags
+    # does not seem to be used, which leads to linking errors on Linux.
+    # Try re-enabling in future versions.
+    # depends_on('tbb', when='+tbb')
 
     def install(self, spec, prefix):
         # The build system of SuiteSparse is quite old-fashioned
@@ -21,16 +29,35 @@ def install(self, spec, prefix):
         # with a lot of convoluted logic in it.
         # Any kind of customization will need to go through filtering of that file
 
-        # FIXME : this actually uses the current workaround
-        # FIXME : (blas / lapack always provide libblas and liblapack as aliases)
-        make('install', 'INSTALL=%s' % prefix,
+        make_args = ['INSTALL=%s' % prefix]
 
-             # inject Spack compiler wrappers
+        # inject Spack compiler wrappers
+        make_args.extend([
              'AUTOCC=no',
              'CC=cc',
              'CXX=c++',
              'F77=f77',
+        ])
+
+        # use Spack's metis in CHOLMOD/Partition module,
+        # otherwise internal Metis will be compiled
+        make_args.extend([
+             'MY_METIS_LIB=-L%s -lmetis' % spec['metis'].prefix.lib,
+             'MY_METIS_INC=%s' % spec['metis'].prefix.include,
+        ])
+
+        # Intel TBB in SuiteSparseQR
+        if '+tbb' in spec:
+            make_args.extend([
+                'SPQR_CONFIG=-DHAVE_TBB',
+                'TBB=-L%s -ltbb' % spec['tbb'].prefix.lib,
+            ])
+
+        # BLAS arguments require path to libraries
+        # FIXME : (blas / lapack always provide libblas and liblapack as aliases)
+        make_args.extend([
+            'BLAS=-lblas',
+            'LAPACK=-llapack'
+        ])
 
-             # BLAS arguments require path to libraries
-             'BLAS=-lblas',
-             'LAPACK=-llapack')
+        make('install', *make_args)