diff --git a/pylorax/instroot.py b/pylorax/instroot.py
new file mode 100644
index 00000000..0089367d
--- /dev/null
+++ b/pylorax/instroot.py
@@ -0,0 +1,124 @@
+#
+# pylorax instroot module
+# Install image and tree support data generation tool -- Python module.
+#
+# Copyright (C) 2008 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Author(s): David Cantrell
+#
+
+import sys
+import pylorax
+
+sys.path.insert(0, '/usr/share/yum-cli')
+import yummain
+
+# Create inst root from which stage 1 and stage 2 images are built.
+def createInstRoot(yumconf=None, arch=None, treedir=None, updates=None):
+ """createInstRoot(yumconf=None, arch=None, treedir=None, [updates=None])
+
+ Create a instroot tree for the specified architecture. The list of
+ packages to install are specified in the /etc/lorax/packages and
+ /etc/lorax/ARCH/packages files.
+
+ yumconf is the path to the yum configuration create for this run of
+ lorax. arch is the platform name we are building for, treedir is
+ the location where the instroot tree should go
+ (will be treedir + '/install'). updates is an optional path to a
+ directory of update RPM packages for the instroot.
+
+ The yumconf, arch, and treedir parameters are all required.
+
+ On success, this function returns True. On failure, False is
+ returned or the program is aborted immediately.
+
+ """
+
+ if yumconf is None or arch is None or treedir is None:
+ return False
+
+ # on 64-bit systems, make sure we use lib64 as the lib directory
+ if arch.endswith('64') or arch == 's390x':
+ libdir = 'lib64'
+ else:
+ libdir = 'lib'
+
+ # the directory where the instroot will be created
+ destdir = treedir + '/install'
+ os.makedirs(destdir)
+
+ # build a list of packages to install
+ packages = set()
+
+ packages_files = []
+ packages_files.append(pylorax.conf['confdir'] + '/packages')
+ packages_files.append(pylorax.conf['confdir'] + '/' + arch + '/packages')
+
+ for pfile in packages_file:
+ if os.path.isfile(pfile):
+ f = open(pfile, 'r')
+ for line in f.readlines():
+ if line.startswith('#') or line == '':
+ continue
+
+ if line.startswith('-'):
+ try:
+ packages.remove(line[1:].strip())
+ except KeyError:
+ pass
+ else:
+ packages.add(line.strip())
+
+ f.close()
+
+ packages = list(packages).sort()
+
+ # install the packages to the instroot
+ if not installPackages(yumconf=yumconf, destdir=destdir, packages=packages):
+ sys.stderr.write("ERROR: Could not install packages.\n")
+ sys.exit(1)
+
+ # XXX: more coming!
+
+ return True
+
+# Call yummain to install the list of packages to destdir
+def installPackages(yumconf=yumconf, destdir=destdir, packages=packages):
+ """installPackages(yumconf=yumconf, destdir=destdir, packages=packages)
+
+ Call yummain to install the list of packages. All parameters are
+ required. yumconf is the yum configuration file created for this
+ run of lorax. destdir is the installroot that yum should install to.
+ packages is a list of package names that yum should install.
+
+ yum will resolve dependencies, so it is not necessary to list every
+ package you want in the instroot.
+
+ This function returns True on success, False on failre.
+
+ """
+
+ arglist = ['-c', yumconf, '-y']
+ arglist.append("--installroot=%s" % (destdir,))
+ arglist.append('install')
+
+ pkgs = ''
+ for package in packages:
+ pkgs += ' ' + package
+
+ arglist.append(pkgs.strip())
+
+ return yummain.user_main(arglist, exit_code=False)