diff --git a/lib/spack/env/cc b/lib/spack/env/cc
index c4e51834a5f2d360929d74a7f2b27d44471c1838..c0e97f3416f9b45127effc9068c8e0fd9c5ffcae 100755
--- a/lib/spack/env/cc
+++ b/lib/spack/env/cc
@@ -98,25 +98,25 @@ case "$command" in
     cpp)
         mode=cpp
         ;;
-    cc|c89|c99|gcc|clang|icc|pgcc|xlc)
+    cc|c89|c99|gcc|clang|icc|pgcc|xlc|xlc_r)
         command="$SPACK_CC"
         language="C"
         comp="CC"
         lang_flags=C
         ;;
-    c++|CC|g++|clang++|icpc|pgc++|xlc++)
+    c++|CC|g++|clang++|icpc|pgc++|xlc++|xlc++_r)
         command="$SPACK_CXX"
         language="C++"
         comp="CXX"
         lang_flags=CXX
         ;;
-    ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|nagfor)
+    ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|xlf90_r|nagfor)
         command="$SPACK_FC"
         language="Fortran 90"
         comp="FC"
         lang_flags=F
         ;;
-    f77|gfortran|ifort|pgfortran|xlf|nagfor|ftn)
+    f77|gfortran|ifort|pgfortran|xlf|xlf_r|nagfor|ftn)
         command="$SPACK_F77"
         language="Fortran 77"
         comp="F77"
diff --git a/lib/spack/env/xl_r/xlc++_r b/lib/spack/env/xl_r/xlc++_r
new file mode 120000
index 0000000000000000000000000000000000000000..82c2b8e90a381ef733daa21645dc316ee5efe94d
--- /dev/null
+++ b/lib/spack/env/xl_r/xlc++_r
@@ -0,0 +1 @@
+../cc
\ No newline at end of file
diff --git a/lib/spack/env/xl_r/xlc_r b/lib/spack/env/xl_r/xlc_r
new file mode 120000
index 0000000000000000000000000000000000000000..82c2b8e90a381ef733daa21645dc316ee5efe94d
--- /dev/null
+++ b/lib/spack/env/xl_r/xlc_r
@@ -0,0 +1 @@
+../cc
\ No newline at end of file
diff --git a/lib/spack/env/xl_r/xlf90_r b/lib/spack/env/xl_r/xlf90_r
new file mode 120000
index 0000000000000000000000000000000000000000..82c2b8e90a381ef733daa21645dc316ee5efe94d
--- /dev/null
+++ b/lib/spack/env/xl_r/xlf90_r
@@ -0,0 +1 @@
+../cc
\ No newline at end of file
diff --git a/lib/spack/env/xl_r/xlf_r b/lib/spack/env/xl_r/xlf_r
new file mode 120000
index 0000000000000000000000000000000000000000..82c2b8e90a381ef733daa21645dc316ee5efe94d
--- /dev/null
+++ b/lib/spack/env/xl_r/xlf_r
@@ -0,0 +1 @@
+../cc
\ No newline at end of file
diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py
index 6e65f5026974f31ae03d17452291f7a14d1c4700..731acaf9c29d496d3e99156308a5a55516d8b1ff 100644
--- a/lib/spack/spack/compilers/__init__.py
+++ b/lib/spack/spack/compilers/__init__.py
@@ -40,6 +40,7 @@
 
 _imported_compilers_module = 'spack.compilers'
 _path_instance_vars = ['cc', 'cxx', 'f77', 'fc']
+_flags_instance_vars = ['cflags', 'cppflags', 'cxxflags', 'fflags']
 _other_instance_vars = ['modules', 'operating_system', 'environment',
                         'extra_rpaths']
 _cache_config_file = []
@@ -60,6 +61,9 @@ def _to_dict(compiler):
     d['paths'] = dict((attr, getattr(compiler, attr, None))
                       for attr in _path_instance_vars)
     d['flags'] = dict((fname, fvals) for fname, fvals in compiler.flags)
+    d['flags'].update(dict((attr, getattr(compiler, attr, None))
+                      for attr in _flags_instance_vars
+                           if hasattr(compiler, attr)))
     d['operating_system'] = str(compiler.operating_system)
     d['target'] = str(compiler.target)
     d['modules'] = compiler.modules if compiler.modules else []
diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py
index f4b7c4237dbfaa310d4d3de34324aa14ee53eb85..77a5ed7acd7f604f7fcdf07e8e611ed02f74e06a 100644
--- a/lib/spack/spack/compilers/xl.py
+++ b/lib/spack/spack/compilers/xl.py
@@ -29,17 +29,16 @@
 
 class Xl(Compiler):
     # Subclasses use possible names of C compiler
-    cc_names = ['xlc', 'xlc_r']
+    cc_names = ['xlc']
 
     # Subclasses use possible names of C++ compiler
-    cxx_names = ['xlC', 'xlC_r', 'xlc++', 'xlc++_r']
+    cxx_names = ['xlC', 'xlc++']
 
     # Subclasses use possible names of Fortran 77 compiler
-    f77_names = ['xlf', 'xlf_r']
+    f77_names = ['xlf']
 
     # Subclasses use possible names of Fortran 90 compiler
-    fc_names = ['xlf90', 'xlf90_r', 'xlf95', 'xlf95_r',
-                'xlf2003', 'xlf2003_r', 'xlf2008', 'xlf2008_r']
+    fc_names = ['xlf90', 'xlf95', 'xlf2003', 'xlf2008']
 
     # Named wrapper links within spack.build_env_path
     link_paths = {'cc': 'xl/xlc',
@@ -62,6 +61,20 @@ def cxx11_flag(self):
     def pic_flag(self):
         return "-qpic"
 
+    @property
+    def fflags(self):
+        # The -qzerosize flag is effective only for the Fortran 77
+        # compilers and allows the use of zero size objects.
+        # For Fortran 90 and beyond, it is set by default and has not impact.
+        # Its use has no negative side effects.
+        # The -qstrict flag allows the Fortran 90+ compilers to parse the
+        # source files using fixed form rule. As a result, if -qfixed is in
+        # effect, free form files (that are not also fixed form files) will
+        # fail to compile regardless of the compiler invocation command.
+        # Use the -qfree flag in the packages' configuration file to undo the
+        #  -qfixed flag, as the last one wins.
+        return "-qzerosize -qfixed"
+
     @classmethod
     def default_version(cls, comp):
         """The '-qversion' is the standard option fo XL compilers.
diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca76f219ce237ada78ed5eae923555cb722b3478
--- /dev/null
+++ b/lib/spack/spack/compilers/xl_r.py
@@ -0,0 +1,128 @@
+##############################################################################
+# Copyright (c) 2016, International Business Machines Corporation
+#
+# This file is part of Spack.
+# Created by Serban Maerean, serban@us.ibm.com based on a similar file,
+# spack/lib/spack/spack/compilers/xl.py, produced 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 Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, 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 Lesser 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.compiler import *
+import llnl.util.tty as tty
+from spack.version import ver
+
+
+class XlR(Compiler):
+    # Subclasses use possible names of C compiler
+    cc_names = ['xlc_r']
+
+    # Subclasses use possible names of C++ compiler
+    cxx_names = ['xlC_r', 'xlc++_r']
+
+    # Subclasses use possible names of Fortran 77 compiler
+    f77_names = ['xlf_r']
+
+    # Subclasses use possible names of Fortran 90 compiler
+    fc_names = ['xlf90_r', 'xlf95_r', 'xlf2003_r', 'xlf2008_r']
+
+    # Named wrapper links within spack.build_env_path
+    link_paths = {'cc': 'xl_r/xlc_r',
+                  'cxx': 'xl_r/xlc++_r',
+                  'f77': 'xl_r/xlf_r',
+                  'fc': 'xl_r/xlf90_r'}
+
+    @property
+    def openmp_flag(self):
+        return "-qsmp=omp"
+
+    @property
+    def cxx11_flag(self):
+        if self.version < ver('13.1'):
+            tty.die("Only xlC 13.1 and above have some c++11 support.")
+        else:
+            return "-qlanglvl=extended0x"
+
+    @property
+    def pic_flag(self):
+        return("-qpic")
+
+    @property
+    def fflags(self):
+        # The -qzerosize flag is effective only for the Fortran 77
+        # compilers and allows the use of zero size objects.
+        # For Fortran 90 and beyond, it is set by default and has not impact.
+        # Its use has no negative side effects.
+        # The -qstrict flag allows the Fortran 90+ compilers to parse the
+        # source files using fixed form rule. As a result, if -qfixed is in
+        # effect, free form files (that are not also fixed form files) will
+        # fail to compile regardless of the compiler invocation command.
+        # Use the -qfree flag in the packages' configuration file to undo the
+        #  -qfixed flag, as the last one wins.
+        return "-qzerosize -qfixed"
+
+    @classmethod
+    def default_version(self, comp):
+        """The '-qversion' is the standard option fo XL compilers.
+           Output looks like this::
+
+              IBM XL C/C++ for Linux, V11.1 (5724-X14)
+              Version: 11.01.0000.0000
+
+           or::
+
+              IBM XL Fortran for Linux, V13.1 (5724-X16)
+              Version: 13.01.0000.0000
+
+           or::
+
+              IBM XL C/C++ for AIX, V11.1 (5724-X13)
+              Version: 11.01.0000.0009
+
+           or::
+
+              IBM XL C/C++ Advanced Edition for Blue Gene/P, V9.0
+              Version: 09.00.0000.0017
+        """
+
+        return get_compiler_version(
+            comp, '-qversion', r'([0-9]?[0-9]\.[0-9])')
+
+    @classmethod
+    def fc_version(cls, fc):
+        """The fortran and C/C++ versions of the XL compiler are always
+           two units apart.  By this we mean that the fortran release that
+           goes with XL C/C++ 11.1 is 13.1.  Having such a difference in
+           version number is confusing spack quite a lot.  Most notably
+           if you keep the versions as is the default xl compiler will
+           only have fortran and no C/C++.  So we associate the Fortran
+           compiler with the version associated to the C/C++ compiler.
+           One last stumble. Version numbers over 10 have at least a .1
+           those under 10 a .0. There is no xlf 9.x or under currently
+           available. BG/P and BG/L can such a compiler mix and possibly
+           older version of AIX and linux on power.
+        """
+        fver = get_compiler_version(fc, '-qversion', r'([0-9]?[0-9]\.[0-9])')
+        cver = float(fver) - 2
+        if cver < 10:
+            cver = cver - 0.1
+        return str(cver)
+
+    @classmethod
+    def f77_version(cls, f77):
+        return cls.fc_version(f77)