diff --git a/_modules/seedng.py b/_modules/seedng.py
new file mode 100644
index 0000000..7d77a03
--- /dev/null
+++ b/_modules/seedng.py
@@ -0,0 +1,298 @@
+# -*- coding: utf-8 -*-
+'''
+Virtual machine image management tools
+'''
+
+from __future__ import absolute_import
+
+# Import python libs
+import os
+import shutil
+import logging
+import tempfile
+
+# Import salt libs
+import salt.crypt
+import salt.utils
+import salt.utils.cloud
+import salt.config
+import salt.syspaths
+import uuid
+
+
+# Set up logging
+log = logging.getLogger(__name__)
+
+# Don't shadow built-in's.
+__func_alias__ = {
+    'apply_': 'apply'
+}
+
+
+def _file_or_content(file_):
+    if os.path.exists(file_):
+        with salt.utils.fopen(file_) as fic:
+            return fic.read()
+    return file_
+
+
+def prep_bootstrap(mpt):
+    '''
+    Update and get the random script to a random place
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' seed.prep_bootstrap /tmp
+
+    '''
+    # Verify that the boostrap script is downloaded
+    bs_ = __salt__['config.gather_bootstrap_script']()
+    fpd_ = os.path.join(mpt, 'tmp', "{0}".format(
+        uuid.uuid4()))
+    if not os.path.exists(fpd_):
+        os.makedirs(fpd_)
+    os.chmod(fpd_, 0o700)
+    fp_ = os.path.join(fpd_, os.path.basename(bs_))
+    # Copy script into tmp
+    shutil.copy(bs_, fp_)
+    tmppath = fpd_.replace(mpt, '')
+    return fp_, tmppath
+
+
+def _mount(path, ftype, root=None):
+    mpt = None
+    if ftype == 'block':
+        mpt = tempfile.mkdtemp()
+        if not __salt__['mount.mount'](mpt, path):
+            os.rmdir(mpt)
+            return None
+    elif ftype == 'dir':
+        return path
+    elif ftype == 'file':
+        if 'guestfs.mount' in __salt__:
+            util = 'guestfs'
+        elif 'qemu_nbd.init' in __salt__:
+            util = 'qemu_nbd'
+        else:
+            return None
+        mpt = __salt__['mount.mount'](path, device=root, util=util)
+        if not mpt:
+            return None
+    return mpt
+
+
+def _umount(mpt, ftype):
+    if ftype == 'block':
+        __salt__['mount.umount'](mpt)
+        os.rmdir(mpt)
+    elif ftype == 'file':
+        __salt__['mount.umount'](mpt, util='qemu_nbd')
+
+
+def apply_(path, id_=None, config=None, approve_key=True, install=True,
+           prep_install=False, pub_key=None, priv_key=None, mount_point=None):
+    '''
+    Seed a location (disk image, directory, or block device) with the
+    minion config, approve the minion's key, and/or install salt-minion.
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt 'minion' seed.apply path id [config=config_data] \\
+                [gen_key=(true|false)] [approve_key=(true|false)] \\
+                [install=(true|false)]
+
+    path
+        Full path to the directory, device, or disk image  on the target
+        minion's file system.
+
+    id
+        Minion id with which to seed the path.
+
+    config
+        Minion configuration options. By default, the 'master' option is set to
+        the target host's 'master'.
+
+    approve_key
+        Request a pre-approval of the generated minion key. Requires
+        that the salt-master be configured to either auto-accept all keys or
+        expect a signing request from the target host. Default: true.
+
+    install
+        Install salt-minion, if absent. Default: true.
+
+    prep_install
+        Prepare the bootstrap script, but don't run it. Default: false
+    '''
+    stats = __salt__['file.stats'](path, follow_symlinks=True)
+    if not stats:
+        return '{0} does not exist'.format(path)
+    ftype = stats['type']
+    path = stats['target']
+    log.debug('Mounting {0} at {1}'.format(ftype, path))
+    try:
+        os.makedirs(path)
+    except OSError:
+        # The directory already exists
+        pass
+
+    mpt = _mount(path, ftype, mount_point)
+
+    if not mpt:
+        return '{0} could not be mounted'.format(path)
+
+    tmp = os.path.join(mpt, 'tmp')
+    log.debug('Attempting to create directory {0}'.format(tmp))
+    try:
+        os.makedirs(tmp)
+    except OSError:
+        if not os.path.isdir(tmp):
+            raise
+    cfg_files = mkconfig(config, tmp=tmp, id_=id_, approve_key=approve_key,
+                         pub_key=pub_key, priv_key=priv_key)
+
+    if _check_install(mpt):
+        # salt-minion is already installed, just move the config and keys
+        # into place
+        log.info('salt-minion pre-installed on image, '
+                 'configuring as {0}'.format(id_))
+        minion_config = salt.config.minion_config(cfg_files['config'])
+        pki_dir = minion_config['pki_dir']
+        if not os.path.isdir(os.path.join(mpt, pki_dir.lstrip('/'))):
+            __salt__['file.makedirs'](
+                os.path.join(mpt, pki_dir.lstrip('/'), '')
+            )
+        os.rename(cfg_files['privkey'], os.path.join(
+            mpt, pki_dir.lstrip('/'), 'minion.pem'))
+        os.rename(cfg_files['pubkey'], os.path.join(
+            mpt, pki_dir.lstrip('/'), 'minion.pub'))
+        os.rename(cfg_files['config'], os.path.join(mpt, 'etc/salt/minion'))
+        res = True
+    elif install:
+        log.info('Attempting to install salt-minion to {0}'.format(mpt))
+        res = _install(mpt)
+    elif prep_install:
+        log.error('The prep_install option is no longer supported. Please use '
+                  'the bootstrap script installed with Salt, located at {0}.'
+                  .format(salt.syspaths.BOOTSTRAP))
+        res = False
+    else:
+        log.warning('No useful action performed on {0}'.format(mpt))
+        res = False
+
+    _umount(mpt, ftype)
+    return res
+
+
+def mkconfig(config=None,
+             tmp=None,
+             id_=None,
+             approve_key=True,
+             pub_key=None,
+             priv_key=None):
+    '''
+    Generate keys and config and put them in a tmp directory.
+
+    pub_key
+        absolute path or file content of an optional preseeded salt key
+
+    priv_key
+        absolute path or file content of an optional preseeded salt key
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt 'minion' seed.mkconfig [config=config_data] [tmp=tmp_dir] \\
+                [id_=minion_id] [approve_key=(true|false)]
+    '''
+    if tmp is None:
+        tmp = tempfile.mkdtemp()
+    if config is None:
+        config = {}
+    if 'master' not in config and __opts__['master'] != 'salt':
+        config['master'] = __opts__['master']
+    if id_:
+        config['id'] = id_
+
+    # Write the new minion's config to a tmp file
+    tmp_config = os.path.join(tmp, 'minion')
+    with salt.utils.fopen(tmp_config, 'w+') as fp_:
+        fp_.write(salt.utils.cloud.salt_config_to_yaml(config))
+
+    # Generate keys for the minion
+    pubkeyfn = os.path.join(tmp, 'minion.pub')
+    privkeyfn = os.path.join(tmp, 'minion.pem')
+    preseeded = pub_key and priv_key
+    if preseeded:
+        log.debug('Writing minion.pub to {0}'.format(pubkeyfn))
+        log.debug('Writing minion.pem to {0}'.format(privkeyfn))
+        with salt.utils.fopen(pubkeyfn, 'w') as fic:
+            fic.write(_file_or_content(pub_key))
+        with salt.utils.fopen(privkeyfn, 'w') as fic:
+            fic.write(_file_or_content(priv_key))
+        os.chmod(pubkeyfn, 0o600)
+        os.chmod(privkeyfn, 0o600)
+    else:
+        salt.crypt.gen_keys(tmp, 'minion', 2048)
+    if approve_key and not preseeded:
+        with salt.utils.fopen(pubkeyfn) as fp_:
+            pubkey = fp_.read()
+            __salt__['pillar.ext']({'virtkey': [id_, pubkey]})
+
+    return {'config': tmp_config, 'pubkey': pubkeyfn, 'privkey': privkeyfn}
+
+
+def _install(mpt):
+    '''
+    Determine whether salt-minion is installed and, if not,
+    install it.
+    Return True if install is successful or already installed.
+    '''
+    _check_resolv(mpt)
+    boot_, tmppath = (prep_bootstrap(mpt)
+             or salt.syspaths.BOOTSTRAP)
+    # Exec the chroot command
+    cmd = 'if type salt-minion; then exit 0; '
+    cmd += 'else sh {0} -c /tmp; fi'.format(os.path.join(tmppath, 'bootstrap-salt.sh'))
+    return not __salt__['cmd.run_chroot'](mpt, cmd, python_shell=True)['retcode']
+
+
+def _check_resolv(mpt):
+    '''
+    Check that the resolv.conf is present and populated
+    '''
+    resolv = os.path.join(mpt, 'etc/resolv.conf')
+    replace = False
+    if os.path.islink(resolv):
+        resolv = os.path.realpath(resolv)
+        if not os.path.isdir(os.path.dirname(resolv)):
+            os.makedirs(os.path.dirname(resolv))
+    if not os.path.isfile(resolv):
+        replace = True
+    if not replace:
+        with salt.utils.fopen(resolv, 'rb') as fp_:
+            conts = fp_.read()
+            if 'nameserver' not in conts:
+                replace = True
+    if replace:
+        shutil.copy('/etc/resolv.conf', resolv)
+
+
+def _check_install(root):
+    sh_ = '/bin/sh'
+    if os.path.isfile(os.path.join(root, 'bin/bash')):
+        sh_ = '/bin/bash'
+
+    cmd = ('if ! type salt-minion; then exit 1; fi')
+    cmd = 'chroot \'{0}\' {1} -c \'{2}\''.format(
+        root,
+        sh_,
+        cmd)
+
+    return not __salt__['cmd.retcode'](cmd,
+                                       output_loglevel='quiet',
+                                       python_shell=True)
diff --git a/_modules/virtng.py b/_modules/virtng.py
index 02cf5f5..2bf3766 100644
--- a/_modules/virtng.py
+++ b/_modules/virtng.py
@@ -622,7 +622,7 @@
 
     if kwargs.get('seed') and seedable:
         install = kwargs.get('install', True)
-        seed_cmd = kwargs.get('seed_cmd', 'seed.apply')
+        seed_cmd = kwargs.get('seed_cmd', 'seedng.apply')
 
         __salt__[seed_cmd](img_dest,
                            id_=name,
