diff --git a/var/spack/repos/builtin/packages/icu4c/package.py b/var/spack/repos/builtin/packages/icu4c/package.py
index 39523b1563529809b50150039e32f7396a6274b6..e6a3df465dfb04877189029f878ada8e85b71360 100644
--- a/var/spack/repos/builtin/packages/icu4c/package.py
+++ b/var/spack/repos/builtin/packages/icu4c/package.py
@@ -46,4 +46,11 @@ def url_for_version(self, version):
         return url.format(version.dotted, version.underscored)
 
     def configure_args(self):
-        return ['--enable-rpath']
+        args = []
+
+        # The --enable-rpath option is only needed on MacOS, and it
+        # breaks the build for xerces-c on Linux.
+        if 'platform=darwin' in self.spec:
+            args.append('--enable-rpath')
+
+        return args
diff --git a/var/spack/repos/builtin/packages/xerces-c/package.py b/var/spack/repos/builtin/packages/xerces-c/package.py
index 8733289069713829952a609208b2fcd961ccd917..7b321f61bd0058c321a0558c451dbe9ddd9ce32d 100644
--- a/var/spack/repos/builtin/packages/xerces-c/package.py
+++ b/var/spack/repos/builtin/packages/xerces-c/package.py
@@ -23,6 +23,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ##############################################################################
 from spack import *
+import sys
 
 
 class XercesC(AutotoolsPackage):
@@ -35,13 +36,56 @@ class XercesC(AutotoolsPackage):
     homepage = "https://xerces.apache.org/xerces-c"
     url      = "https://archive.apache.org/dist/xerces/c/3/sources/xerces-c-3.2.1.tar.bz2"
 
+    version('3.2.2', '4c395216ecbef3c88a756ff4090e6f7e')
     version('3.2.1', '8f98a81a3589bbc2dad9837452f7d319')
     version('3.1.4', 'd04ae9d8b2dee2157c6db95fa908abfd')
 
-    depends_on('libiconv')
+    # It's best to be explicit about the transcoder or else xerces may
+    # choose another value.
+    if sys.platform == 'darwin':
+        default_transcoder = 'macos'
+    elif sys.platform.startswith('win') or sys.platform == 'cygwin':
+        default_transcoder = 'windows'
+    else:
+        default_transcoder = 'gnuiconv'
 
-    def setup_environment(self, spack_env, run_env):
-        spack_env.append_flags('LDFLAGS', self.spec['libiconv'].libs.ld_flags)
+    variant('transcoder', default=default_transcoder,
+            values=('gnuiconv', 'iconv', 'icu', 'macos', 'windows'),
+            multi=False,
+            description='Use the specified transcoder')
+
+    depends_on('libiconv', type='link', when='transcoder=gnuiconv')
+    depends_on('icu4c',    type='link', when='transcoder=icu')
+
+    # Pass flags to configure.  This is necessary for CXXFLAGS or else
+    # the xerces default will override the spack wrapper.
+    def flag_handler(self, name, flags):
+        spec = self.spec
+
+        # There is no --with-pkg for gnuiconv.
+        if name == 'ldflags' and 'transcoder=gnuiconv' in spec:
+            flags.append(spec['libiconv'].libs.ld_flags)
+
+        return (None, None, flags)
 
     def configure_args(self):
-        return ['--disable-network']
+        spec = self.spec
+        args = ['--disable-network']
+
+        if 'transcoder=gnuiconv' in spec:
+            args.append('--enable-transcoder-gnuiconv')
+
+        if 'transcoder=iconv' in spec:
+            args.append('--enable-transcoder-iconv')
+
+        if 'transcoder=icu' in spec:
+            args.append('--enable-transcoder-icu')
+            args.append('--with-icu=%s' % spec['icu4c'].prefix)
+
+        if 'transcoder=macos' in spec:
+            args.append('--enable-transcoder-macosunicodeconverter')
+
+        if 'transcoder=windows' in spec:
+            args.append('--enable-transcoder-windows')
+
+        return args