diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py
index 7f92bc1950641a0b7eafd3a1e7b2075d1a6bec8b..87ab2bbaaca5be6ba7de2c728cce7086d45a3860 100644
--- a/var/spack/repos/builtin/packages/arpack-ng/package.py
+++ b/var/spack/repos/builtin/packages/arpack-ng/package.py
@@ -88,8 +88,8 @@ def install(self, spec, prefix):
         options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s/lib' % prefix)
 
         # Make sure we use Spack's blas/lapack:
-        lapack_libs = spec['lapack'].lapack_libs.joined()
-        blas_libs = spec['blas'].blas_libs.joined()
+        lapack_libs = spec['lapack'].lapack_libs.joined(';')
+        blas_libs = spec['blas'].blas_libs.joined(';')
 
         options.extend([
             '-DLAPACK_FOUND=true',
diff --git a/var/spack/repos/builtin/packages/atlas/package.py b/var/spack/repos/builtin/packages/atlas/package.py
index e1914aac98519d2007a807577ba4c080bac6409f..b31e365336810c311b1a20fde5671a87a13a7f85 100644
--- a/var/spack/repos/builtin/packages/atlas/package.py
+++ b/var/spack/repos/builtin/packages/atlas/package.py
@@ -142,7 +142,7 @@ def install_test(self):
                                  'test_cblas_dgemm.output')
 
         include_flags = ["-I%s" % self.spec.prefix.include]
-        link_flags = self.lapack_libs.ld_flags
+        link_flags = self.lapack_libs.ld_flags.split()
 
         output = compile_c_and_execute(source_file, include_flags, link_flags)
         compare_output_file(output, blessed_file)
diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py
index 9c9c0353254e91709a7159c35c5fea1c8b665fd9..9a9bc5bdbd2b349959abb4502d65d6d640ea3945 100644
--- a/var/spack/repos/builtin/packages/cantera/package.py
+++ b/var/spack/repos/builtin/packages/cantera/package.py
@@ -85,8 +85,9 @@ def install(self, spec, prefix):
 
         # BLAS/LAPACK support
         if '+lapack' in spec:
+            lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs
             options.extend([
-                'blas_lapack_libs=lapack,blas',
+                'blas_lapack_libs={0}'.format(','.join(lapack_blas.names)),
                 'blas_lapack_dir={0}'.format(spec['lapack'].prefix.lib)
             ])
 
diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
index 74bdba455f8d6ff4b766b59e265e4d4d4a68e078..5547bae71c40e5d0f5ba631da40738f8b8668f2e 100644
--- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
+++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
@@ -64,7 +64,10 @@ def blas_libs(self):
         shared = True if '+shared' in self.spec else False
         suffix = dso_suffix if '+shared' in self.spec else 'a'
         mkl_integer = ['libmkl_intel_ilp64'] if '+ilp64' in self.spec else ['libmkl_intel_lp64']  # NOQA: ignore=E501
-        mkl_threading = ['libmkl_intel_thread'] if '+openmp' in self.spec else ['libmkl_sequential']  # NOQA: ignore=E501
+        mkl_threading = ['libmkl_sequential']
+        if '+openmp' in self.spec:
+            mkl_threading = ['libmkl_intel_thread', 'libiomp5'] if '%intel' in self.spec else ['libmkl_gnu_thread']  # NOQA: ignore=E501
+        # TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++']
         mkl_libs = find_libraries(
             mkl_integer + ['libmkl_core'] + mkl_threading,
             root=join_path(self.prefix.lib, 'intel64'),
diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py
index d5981e9975975a48477cfb5a70eeabb82dc41381..bd1e5f36efa4052d71b71e65630e32084486f478 100644
--- a/var/spack/repos/builtin/packages/ipopt/package.py
+++ b/var/spack/repos/builtin/packages/ipopt/package.py
@@ -53,9 +53,8 @@ def install(self, spec, prefix):
         mumps_flags = "-ldmumps -lmumps_common -lpord -lmpiseq"
         mumps_libcmd = "-L%s " % mumps_dir.lib + mumps_flags
 
-        # By convention, spack links blas & lapack libs to libblas & liblapack
-        blas_lib = "-L%s" % blas_dir.lib + " -lblas"
-        lapack_lib = "-L%s" % lapack_dir.lib + " -llapack"
+        blas_lib = spec['blas'].blas_libs.ld_flags
+        lapack_lib = spec['lapack'].lapack_libs.ld_flags
 
         configure_args = [
             "--prefix=%s" % prefix,
diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py
index fd91f705ebb9351c30fda89e303f28f9cec7ab77..cbf9059f6526e208da403b053b9bc6770ab20537 100644
--- a/var/spack/repos/builtin/packages/mfem/package.py
+++ b/var/spack/repos/builtin/packages/mfem/package.py
@@ -89,8 +89,7 @@ def install(self, spec, prefix):
         options = ['PREFIX=%s' % prefix]
 
         if '+lapack' in spec:
-            lapack_lib = '-L{0} -llapack -L{1} -lblas'.format(
-                spec['lapack'].prefix.lib, spec['blas'].prefix.lib)
+            lapack_lib = (spec['lapack'].lapack_libs + spec['blas'].blas_libs).ld_flags  # NOQA: ignore=E501
             options.extend([
                 'MFEM_USE_LAPACK=YES',
                 'LAPACK_OPT=-I%s' % spec['lapack'].prefix.include,
diff --git a/var/spack/repos/builtin/packages/mkl/package.py b/var/spack/repos/builtin/packages/mkl/package.py
index a7353d57c42ae19be49b069d36c6013e9eec7412..b67487639397e81b99de097a9818900619778e6d 100644
--- a/var/spack/repos/builtin/packages/mkl/package.py
+++ b/var/spack/repos/builtin/packages/mkl/package.py
@@ -39,8 +39,9 @@ def blas_libs(self):
         suffix = dso_suffix if '+shared' in self.spec else 'a'
         mkl_integer = ['libmkl_intel_ilp64'] if '+ilp64' in self.spec else ['libmkl_intel_lp64']  # NOQA: ignore=E501
         mkl_threading = ['libmkl_sequential']
-        if '+openmp' in spec:
-            mkl_threading = ['libmkl_intel_thread'] if '%intel' in self.spec else ['libmkl_gnu_thread']  # NOQA: ignore=E501
+        if '+openmp' in self.spec:
+            mkl_threading = ['libmkl_intel_thread', 'libiomp5'] if '%intel' in self.spec else ['libmkl_gnu_thread']  # NOQA: ignore=E501
+        # TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++']
         mkl_libs = find_libraries(
             mkl_integer + ['libmkl_core'] + mkl_threading,
             root=join_path(self.prefix.lib, 'intel64'),
diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py
index b73fe850d76e83a3ba25d69c71cf2a2371785c19..874473ba9ceed4c72978b0b69e365c13cd42dd04 100644
--- a/var/spack/repos/builtin/packages/netlib-lapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py
@@ -91,12 +91,9 @@ def install_one(self, spec, prefix, shared):
             cmake_args.extend(['-DCBLAS=ON'])  # always build CBLAS
 
         if '+external-blas' in spec:
-            # TODO : 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')
+                '-DBLAS_LIBRARIES:PATH=%s' % spec['blas'].blas_libs.joined(';')
             ])
 
         cmake_args.extend(std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
index fe9f1a302351374c61beef5911ea8169ed26dc40..578d2d89881a4c0368c5b7bcad37371ad7b63238 100644
--- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
@@ -79,8 +79,8 @@ def install(self, spec, prefix):
         options.extend([
             '-DLAPACK_FOUND=true',
             '-DLAPACK_INCLUDE_DIRS=%s' % spec['lapack'].prefix.include,
-            '-DLAPACK_LIBRARIES=%s' % (lapack.joined()),
-            '-DBLAS_LIBRARIES=%s' % (blas.joined())
+            '-DLAPACK_LIBRARIES=%s' % (lapack.joined(';')),
+            '-DBLAS_LIBRARIES=%s' % (blas.joined(';'))
         ])
 
         if '+fpic' in spec:
diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py
index 89c35fb991d80d44b5845603d5b7b541857d18e9..1f6dd0e013a911a1c6ce052bb87d8a067724325f 100644
--- a/var/spack/repos/builtin/packages/openblas/package.py
+++ b/var/spack/repos/builtin/packages/openblas/package.py
@@ -111,24 +111,6 @@ def install(self, spec, prefix):
         # no quotes around prefix (spack doesn't use a shell)
         make('install', "PREFIX=%s" % prefix, *make_defs)
 
-        # TODO : the links below are mainly there because client
-        # TODO : packages are wrongly written. Check if they can be removed
-
-        # Blas virtual package should provide blas.a and libblas.a
-        with working_dir(prefix.lib):
-            symlink('libopenblas.a', 'blas.a')
-            symlink('libopenblas.a', 'libblas.a')
-            if '+shared' in spec:
-                symlink('libopenblas.%s' % dso_suffix,
-                        'libblas.%s' % dso_suffix)
-
-        # Lapack virtual package should provide liblapack.a
-        with working_dir(prefix.lib):
-            symlink('libopenblas.a', 'liblapack.a')
-            if '+shared' in spec:
-                symlink('libopenblas.%s' % dso_suffix,
-                        'liblapack.%s' % dso_suffix)
-
         # Openblas may pass its own test but still fail to compile Lapack
         # symbols. To make sure we get working Blas and Lapack, do a small
         # test.
@@ -141,10 +123,8 @@ def check_install(self, spec):
                                  'test_cblas_dgemm.output')
 
         include_flags = ["-I%s" % join_path(spec.prefix, "include")]
-        link_flags = ["-L%s" % join_path(spec.prefix, "lib"),
-                      "-llapack",
-                      "-lblas",
-                      "-lpthread"]
+        link_flags = self.lapack_libs.ld_flags.split()
+        link_flags.extend(["-lpthread"])
         if '+openmp' in spec:
             link_flags.extend([self.compiler.openmp_flag])
 
diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py
index 1f1b9adffd59efabb6e2785f8e9494a1f56eb098..1ad1eb67528d693534c932ddf73c9ef3ef395d51 100644
--- a/var/spack/repos/builtin/packages/petsc/package.py
+++ b/var/spack/repos/builtin/packages/petsc/package.py
@@ -129,9 +129,15 @@ def install(self, spec, prefix):
             '--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
+            '--with-debugging=%s' % ('1' if '+debug' in spec else '0')
         ])
+        # Make sure we use exactly the same Blas/Lapack libraries
+        # across the DAG. To that end list them explicitly
+        lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs
+        options.extend([
+            '--with-blas-lapack-lib=%s' % lapack_blas.joined()
+        ])
+
         # Activates library support if needed
         for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis',
                         'mumps', 'scalapack'):
diff --git a/var/spack/repos/builtin/packages/superlu-mt/package.py b/var/spack/repos/builtin/packages/superlu-mt/package.py
index e849273e0852b04da59783efbb45eff4435e50cf..ea94c2d4c53b8b183edeca434cf8aa6adeb551b0 100644
--- a/var/spack/repos/builtin/packages/superlu-mt/package.py
+++ b/var/spack/repos/builtin/packages/superlu-mt/package.py
@@ -86,7 +86,7 @@ def configure(self, spec):
         if '+blas' in spec:
             config.extend([
                 'BLASDEF    = -DUSE_VENDOR_BLAS',
-                'BLASLIB    = -L{0} -lblas'.format(spec['blas'].prefix.lib)
+                'BLASLIB    = {0}'.format(spec['blas'].blas_libs.ld_flags)
             ])
         else:
             config.append('BLASLIB    = ../lib/libblas$(PLAT).a')