diff --git a/var/spack/repos/builtin/packages/texlive/package.py b/var/spack/repos/builtin/packages/texlive/package.py
index 720c5a26c2a51fb2a921ae9831c0a549de6c94dc..42969052c8d8b2f321fbaa7a7e598c6f0631f15c 100644
--- a/var/spack/repos/builtin/packages/texlive/package.py
+++ b/var/spack/repos/builtin/packages/texlive/package.py
@@ -6,29 +6,67 @@
 from spack import *
 import os
 import platform
+import glob
 
 
-class Texlive(Package):
-    """TeX Live is a free software distribution for the TeX typesetting
-       system.  Heads up, it's is not a reproducible installation."""
+class Texlive(AutotoolsPackage):
+    """TeX Live is an easy (we hope) way to get up and running with the TeX
+    document production system. It provides a comprehensive TeX system with
+    binaries for most flavors of Unix, including GNU/Linux, macOS, and also
+    Windows. It includes all the major TeX-related programs, macro packages,
+    and fonts that are free software, including support for many languages
+    around the world."""
 
     homepage = "http://www.tug.org/texlive"
+    url = 'http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2019/texlive-20190410-source.tar.xz'
+    base_url = 'http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/{year}/texlive-{version}-{dist}.tar.xz'
+    list_url = 'http://ftp.math.utah.edu/pub/tex/historic/systems/texlive'
+    list_depth = 1
 
-    # Install from specific site because the texlive mirrors do not
-    # all update in synchrony.
-    #
-    # BEWARE: TexLive updates their installs frequently (probably why
-    # they call it *Live*...).  There is no good way to provide a
-    # repeatable install of the package.
-    #
-    # We're now pulling the installation bits from tug.org's repo of
-    # historic bits.  This means that the checksum for the installer
-    # itself is stable.  Don't let that fool you though, it's still
-    # installing TeX **LIVE** from e.g. ctan.math.... below, which is
-    # not reproducible.
+    # Below is the url for a binary distribution. This was originally how this
+    # was distributed in Spack, but should be considered deprecated. Note that
+    # the "live" version will pull down the packages so it requires an Internet
+    # connection at install time and the package versions could change over
+    # time. It is better to use a version built from tarballs, as defined with
+    # the "releases" below.
     version('live', sha256='44aa41b5783e345b7021387f19ac9637ff1ce5406a59754230c666642dfe7750',
             url='ftp://tug.org/historic/systems/texlive/2019/install-tl-unx.tar.gz')
 
+    # Add information for new versions below.
+    releases = [
+        {
+            'version': '20190410',
+            'year': '2019',
+            'sha256_source': 'd2a29fef04e34dc3d2d2296c18995fc357aa7625e7a6bbf40fb92d83d3d0d7b5',
+            'sha256_texmf': 'c2ec974abc98b91995969e7871a0b56dbc80dd8508113ffcff6923e912c4c402',
+        },
+    ]
+
+    for release in releases:
+        version(
+            release['version'],
+            sha256=release['sha256_source'],
+            url=base_url.format(
+                year=release['year'],
+                version=release['version'],
+                dist='source'
+            )
+        )
+
+        resource(
+            name='texmf',
+            url=base_url.format(
+                year=release['year'],
+                version=release['version'],
+                dist='texmf'
+            ),
+            sha256=release['sha256_texmf'],
+            when='@{0}'.format(
+                release['version']
+            )
+        )
+
+    # The following variant is only for the "live" binary installation.
     # There does not seem to be a complete list of schemes.
     # Examples include:
     #   full scheme (everything)
@@ -42,15 +80,111 @@ class Texlive(Package):
         'scheme',
         default='small',
         values=('minimal', 'basic', 'small', 'medium', 'full'),
-        description='Package subset to install'
+        description='Package subset to install, only meaningful for "live" '
+        'version'
     )
 
-    depends_on('perl', type='build')
+    depends_on('perl', type='build', when='@live')
+    depends_on('pkgconfig', when='@2019:', type='build')
+
+    depends_on('cairo+X', when='@2019:')
+    depends_on('freetype', when='@2019:')
+    depends_on('ghostscript', when='@2019:')
+    depends_on('gmp', when='@2019:')
+    depends_on('harfbuzz+graphite2', when='@2019:')
+    depends_on('icu4c', when='@2019:')
+    depends_on('libgd', when='@2019:')
+    depends_on('libpaper', when='@2019:')
+    depends_on('libpng', when='@2019:')
+    depends_on('libxaw', when='@2019:')
+    depends_on('libxt', when='@2019:')
+    depends_on('mpfr', when='@2019:')
+    depends_on('perl', when='@2019:')
+    depends_on('pixman', when='@2019:')
+    depends_on('poppler', when='@2019:')
+    depends_on('teckit', when='@2019:')
+    depends_on('zlib', when='@2019:')
+    depends_on('zziplib', when='@2019:')
+
+    build_directory = 'spack-build'
+
+    def tex_arch(self):
+        tex_arch = '{0}-{1}'.format(platform.machine(),
+                                    platform.system().lower())
+        return tex_arch
+
+    @when('@2019:')
+    def configure_args(self):
+        args = [
+            '--bindir={0}'.format(join_path(self.prefix.bin, self.tex_arch())),
+            '--disable-dvisvgm',
+            '--disable-native-texlive-build',
+            '--disable-static',
+            '--enable-shared',
+            '--with-banner-add= - Spack',
+            '--dataroot={0}'.format(self.prefix),
+            '--with-system-cairo',
+            '--with-system-freetype2',
+            '--with-system-gd',
+            '--with-system-gmp',
+            '--with-system-graphite2',
+            '--with-system-harfbuzz',
+            '--with-system-icu',
+            '--with-system-libpaper',
+            '--with-system-libpng',
+            '--with-system-mpfr',
+            '--with-system-pixman',
+            '--with-system-poppler',
+            '--with-system-teckit',
+            '--with-system-zlib',
+            '--with-system-zziplib',
+        ]
+
+        return args
+
+    @run_after('install')
+    def setup_texlive(self):
+        if not self.spec.satisfies('@live'):
+            mkdirp(self.prefix.tlpkg.TeXLive)
+            for files in glob.glob('texk/tests/TeXLive/*'):
+                install(files, self.prefix.tlpkg.TeXLive)
+
+            with working_dir('spack-build'):
+                make('texlinks')
+
+            copy_tree('texlive-{0}-texmf'.format(self.version.string),
+                      self.prefix)
+
+            # Create and run setup utilities
+            fmtutil_sys = Executable(join_path(self.prefix.bin,
+                                               self.tex_arch(), 'fmtutil-sys'))
+            mktexlsr = Executable(join_path(self.prefix.bin, self.tex_arch(),
+                                            'mktexlsr'))
+            mtxrun = Executable(join_path(self.prefix.bin, self.tex_arch(),
+                                          'mtxrun'))
+            mktexlsr()
+            fmtutil_sys('--all')
+            mtxrun('--generate')
+
+        else:
+            pass
 
     def setup_run_environment(self, env):
-        suffix = "%s-%s" % (platform.machine(), platform.system().lower())
-        env.prepend_path('PATH', join_path(self.prefix.bin, suffix))
+        env.prepend_path('PATH', join_path(self.prefix.bin, self.tex_arch()))
+
+    @when('@live')
+    def autoreconf(self, spec, prefix):
+        touch('configure')
+
+    @when('@live')
+    def configure(self, spec, prefix):
+        pass
+
+    @when('@live')
+    def build(self, spec, prefix):
+        pass
 
+    @when('@live')
     def install(self, spec, prefix):
         # Using texlive's mirror system leads to mysterious problems,
         # in lieu of being able to specify a repository as a variant, hardwire