diff --git a/TODO b/TODO
index 3b8bd84..c401013 100644
--- a/TODO
+++ b/TODO
@@ -10,7 +10,6 @@
 - snapshot support
 - support for managing container member set
 - API for managing fstab and crypttab
-- modularize newDevice by operation
 - improve interaction with the environment
   - detect mounts, active swaps, &c
   - disallow partitioning changes to disks with in-use partitions?
diff --git a/blivet/__init__.py b/blivet/__init__.py
index 9dc7f23..4ed15d8 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -60,10 +60,10 @@ from devicelibs.crypto import generateBackupPassphrase
 from devicelibs.mpath import MultipathConfigWriter
 from devicelibs.edd import get_edd_dict
 from udev import udev_trigger
-import iscsi
-import fcoe
-import zfcp
-import dasd
+from iscsi import iscsi as _iscsi
+from fcoe import fcoe as _fcoe
+from zfcp import ZFCP as _zfcp
+from dasd import DASD as _dasd
 import util
 import arch
 from flags import flags
@@ -259,11 +259,6 @@ class Blivet(object):
         self.__luksDevs = {}
         self.size_sets = []
 
-        self.iscsi = iscsi.iscsi()
-        self.fcoe = fcoe.fcoe()
-        self.zfcp = zfcp.ZFCP()
-        self.dasd = dasd.DASD()
-
         self._nextID = 0
         self.defaultFSType = get_default_filesystem_type()
         self._dumpFile = "/tmp/storage.state"
@@ -271,9 +266,7 @@ class Blivet(object):
         # these will both be empty until our reset method gets called
         self.devicetree = DeviceTree(conf=self.config,
                                      passphrase=self.encryptionPassphrase,
-                                     luksDict=self.__luksDevs,
-                                     iscsi=self.iscsi,
-                                     dasd=self.dasd)
+                                     luksDict=self.__luksDevs)
         self.fsset = FSSet(self.devicetree)
         self.roots = []
         self.services = set()
@@ -365,21 +358,13 @@ class Blivet(object):
             self.config.update(self.ksdata)
 
         if flags.installer_mode and not flags.image_install:
-            self.iscsi.startup()
-            self.fcoe.startup()
-            self.zfcp.startup()
-            self.dasd.startup(None,
-                              self.config.exclusiveDisks,
-                              self.config.initializeDisks)
-        if self.dasd:
-            # Reset the internal dasd list (823534)
-            self.dasd.clear_device_list()
+            _iscsi.startup()
+            _fcoe.startup()
+            _zfcp.startup()
 
         self.devicetree.reset(conf=self.config,
                               passphrase=self.encryptionPassphrase,
-                              luksDict=self.__luksDevs,
-                              iscsi=self.iscsi,
-                              dasd=self.dasd)
+                              luksDict=self.__luksDevs)
         self.devicetree.populate(cleanupOnly=cleanupOnly)
         self.fsset = FSSet(self.devicetree)
         self.eddDict = get_edd_dict(self.partitioned)
@@ -1602,10 +1587,10 @@ class Blivet(object):
 
         self.fsset.write()
         self.makeMtab()
-        self.iscsi.write(self)
-        self.fcoe.write()
-        self.zfcp.write()
-        self.dasd.write()
+        _iscsi.write(self)
+        _fcoe.fcoe.write()
+        _zfcp.zfcp.write()
+        _dasd.write(filter(lambda d: isinstance(d, DASDDevice), self.devices))
 
     def turnOnSwap(self, upgrading=None):
         self.fsset.turnOnSwap(rootPath=ROOT_PATH,
diff --git a/blivet/dasd.py b/blivet/dasd.py
index 8370e9b..305a357 100644
--- a/blivet/dasd.py
+++ b/blivet/dasd.py
@@ -73,10 +73,13 @@ class DASD:
     def __call__(self):
         return self
 
-    def startup(self, intf, exclusiveDisks, zeroMbr):
+    def startup(self, device):
         """ Look for any unformatted DASDs in the system and offer the user
             the option for format them with dasdfmt or exit the installer.
         """
+        ## FIXME: Move this into dracut if possible -- it conflicts with the
+        ##        installer's policy of not writing anything to disk until the
+        ##        installation process begins in earnest at the user's request.
         if self.started:
             return
 
@@ -178,40 +181,20 @@ class DASD:
         if intf:
             pw.pop()
 
-    def addDASD(self, dasd):
-        """ Adds a DASDDevice to the internal list of DASDs. """
-        if dasd:
-            self._devices.append(dasd)
-
-    def clear_device_list(self):
-        """ Clear the device list to force re-populate on next access. """
-        self._devices = []
-
-    def write(self):
+    def write(self, dasds=None):
         """ Write /etc/dasd.conf to target system for all DASD devices
             configured during installation.
         """
-        if self._devices == []:
+        if not dasds:
+            # catch [] or None
             return
 
         f = open(os.path.realpath(ROOT_PATH + "/etc/dasd.conf"), "w")
-        for dasd in self._devices:
+        for dasd in dasds:
             fields = [dasd.busid] + dasd.getOpts()
             f.write("%s\n" % (" ".join(fields),))
         f.close()
 
-    def _updateProgressWindow(self, data, callback_data=None):
-        """ Reads progress output from dasdfmt and collects the number of
-            cylinders completed so the progress window can update.
-        """
-        if not callback_data:
-            return
-
-        if data == '\n':
-            # each newline we see in this output means one more cylinder done
-            self._completedCylinders += 1.0
-            callback_data.set(self._completedCylinders / self.totalCylinders)
-
 # Create DASD singleton
 DASD = DASD()
 
diff --git a/blivet/devices.py b/blivet/devices.py
index 791084a..63a9141 100644
--- a/blivet/devices.py
+++ b/blivet/devices.py
@@ -3821,12 +3821,8 @@ class DASDDevice(DiskDevice):
     def __init__(self, device, **kwargs):
         self.busid = kwargs.pop('busid')
         self.opts = kwargs.pop('opts')
-        self.dasd = kwargs.pop('dasd')
         DiskDevice.__init__(self, device, **kwargs)
 
-        if self.dasd:
-            self.dasd.addDASD(self)
-
     @property
     def description(self):
         return "DASD device %s" % self.busid
@@ -3835,21 +3831,6 @@ class DASDDevice(DiskDevice):
         return ["%s=%s" % (k, v) for k, v in self.opts.items() if v == '1']
 
     def dracutSetupArgs(self):
-        conf = "/etc/dasd.conf"
-        line = None
-        if os.path.isfile(conf):
-            f = open(conf)
-            # grab the first line that starts with our busID
-            line = [line for line in f.readlines()
-                    if line.startswith(self.busid)][:1]
-            f.close()
-
-        # See if we got a line.  If not, grab our getOpts
-        if not line:
-            line = self.busid
-            for devopt in self.getOpts():
-                line += " %s" % devopt
-
         # Create a translation mapping from dasd.conf format to module format
         translate = {'use_diag': 'diag',
                      'readonly': 'ro',
@@ -3861,13 +3842,12 @@ class DASDDevice(DiskDevice):
         # translating that feature into the actual kernel module
         # value
         opts = []
-        parts = line.split()
-        for chunk in parts[1:]:
+        for chunk in self.getOpts():
             try:
-                feat, val = chunk.split('=')
+                feat, val = chunk.split("=")
                 if int(val):
                     opts.append(translate[feat])
-            except:
+            except (ValueError, KeyError):
                 # If we don't know what the feature is (feat not in translate
                 # or if we get a val that doesn't cleanly convert to an int
                 # we can't do anything with it.
diff --git a/blivet/devicetree.py b/blivet/devicetree.py
index 88ba130..af1c9bd 100644
--- a/blivet/devicetree.py
+++ b/blivet/devicetree.py
@@ -39,6 +39,7 @@ import devicelibs.lvm
 import devicelibs.mpath
 import devicelibs.loop
 import devicelibs.edd
+from iscsi import iscsi as _iscsi
 from udev import *
 import util
 from platform import platform
@@ -75,12 +76,10 @@ class DeviceTree(object):
         except for resize actions.
     """
 
-    def __init__(self, conf=None, passphrase=None, luksDict=None,
-                 iscsi=None, dasd=None):
-        self.reset(conf, passphrase, luksDict, iscsi, dasd)
+    def __init__(self, conf=None, passphrase=None, luksDict=None):
+        self.reset(conf, passphrase, luksDict)
 
-    def reset(self, conf=None, passphrase=None, luksDict=None,
-              iscsi=None, dasd=None):
+    def reset(self, conf=None, passphrase=None, luksDict=None):
         # internal data members
         self._devices = []
         self._actions = []
@@ -96,8 +95,6 @@ class DeviceTree(object):
 
         self.exclusiveDisks = getattr(conf, "exclusiveDisks", [])
         self.ignoredDisks = getattr(conf, "ignoredDisks", [])
-        self.iscsi = iscsi
-        self.dasd = dasd
         self.mpathFriendlyNames = getattr(conf, "mpathFriendlyNames", True)
 
         self.diskImages = {}
@@ -803,11 +800,11 @@ class DeviceTree(object):
             port = udev_device_get_iscsi_port(info)
             nic = udev_device_get_iscsi_nic(info)
             kwargs["initiator"] = initiator
-            if initiator == self.iscsi.initiator:
-                node = self.iscsi.getNode(target, address, port, nic)
+            if initiator == _iscsi.initiator:
+                node = _iscsi.getNode(target, address, port, nic)
                 kwargs["node"] = node
-                kwargs["ibft"] = node in self.iscsi.ibftNodes
-                kwargs["nic"] = self.iscsi.ifaces.get(node.iface, node.iface)
+                kwargs["ibft"] = node in _iscsi.ibftNodes
+                kwargs["nic"] = _iscsi.ifaces.get(node.iface, node.iface)
                 log.info("%s is an iscsi disk" % name)
             else:
                 # qla4xxx partial offload
@@ -853,7 +850,6 @@ class DeviceTree(object):
             del kwargs["bus"]
         elif udev_device_is_dasd(info):
             diskType = DASDDevice
-            kwargs["dasd"] = self.dasd
             kwargs["busid"] = udev_device_get_dasd_bus_id(info)
             kwargs["opts"] = {}
 
diff --git a/blivet/fcoe.py b/blivet/fcoe.py
index 19831fa..c259e00 100644
--- a/blivet/fcoe.py
+++ b/blivet/fcoe.py
@@ -102,7 +102,7 @@ class fcoe(object):
 
     def addSan(self, nic, dcb=False, auto_vlan=True):
         if not has_fcoe():
-            raise IOError, _("FCoE not available")
+            raise RuntimeError(_("FCoE not available"))
 
         log.info("Activating FCoE SAN attached to %s, dcb: %s autovlan: %s" %
                  (nic, dcb, auto_vlan))
diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py
index 5ec1948..de94ff4 100644
--- a/blivet/formats/fs.py
+++ b/blivet/formats/fs.py
@@ -1266,7 +1266,7 @@ class NTFS(FS):
             if self.exists and os.path.exists(self.device) and \
                util.find_program_in_path(self.resizefsProg):
                 minSize = None
-                buf = util.run_program([self.resizefsProg, "-m", self.device])
+                buf = util.capture_output([self.resizefsProg, "-m", self.device])
                 for l in buf.split("\n"):
                     if not l.startswith("Minsize"):
                         continue
