diff --git a/sim/src/lib.rs b/sim/src/lib.rs
index effd76e..58f5c59 100644
--- a/sim/src/lib.rs
+++ b/sim/src/lib.rs
@@ -11,14 +11,8 @@
 mod tlv;
 pub mod testlog;
 
-use simflash::{SimFlash, SimFlashMap};
-use mcuboot_sys::{c, AreaDesc, FlashId};
-
-use crate::image::{
-    Images,
-    install_image,
-    mark_upgrade,
-    SlotInfo,
+pub use crate::image::{
+    ImagesBuilder,
     show_sizes,
 };
 
@@ -151,113 +145,6 @@
     }
 }
 
-/// A Run describes a single run of the simulator.  It captures the
-/// configuration of a particular device configuration, including the flash
-/// devices and the information about the slots.  This can be thought of as
-/// a builder for `Images`.
-#[derive(Clone)]
-pub struct Run {
-    flashmap: SimFlashMap,
-    areadesc: AreaDesc,
-    slots: [SlotInfo; 2],
-}
-
-impl Run {
-    pub fn new(device: DeviceName, align: u8, erased_val: u8) -> Run {
-        let (flashmap, areadesc) = make_device(device, align, erased_val);
-
-        let (primary_slot_base, primary_slot_len, primary_slot_dev_id) =
-             areadesc.find(FlashId::Image0);
-        let (secondary_slot_base, secondary_slot_len, secondary_slot_dev_id) =
-             areadesc.find(FlashId::Image1);
-
-        // NOTE: not accounting "swap_size" because it is not used by sim...
-        let offset_from_end = c::boot_magic_sz() + c::boot_max_align() * 2;
-
-        // Construct a primary image.
-        let primary_slot = SlotInfo {
-            base_off: primary_slot_base as usize,
-            trailer_off: primary_slot_base + primary_slot_len - offset_from_end,
-            len: primary_slot_len as usize,
-            dev_id: primary_slot_dev_id,
-        };
-
-        // And an upgrade image.
-        let secondary_slot = SlotInfo {
-            base_off: secondary_slot_base as usize,
-            trailer_off: secondary_slot_base + secondary_slot_len - offset_from_end,
-            len: secondary_slot_len as usize,
-            dev_id: secondary_slot_dev_id,
-        };
-
-        Run {
-            flashmap: flashmap,
-            areadesc: areadesc,
-            slots: [primary_slot, secondary_slot],
-        }
-    }
-
-    pub fn each_device<F>(f: F)
-        where F: Fn(Run)
-    {
-        for &dev in ALL_DEVICES {
-            for &align in &[1, 2, 4, 8] {
-                for &erased_val in &[0, 0xff] {
-                    let run = Run::new(dev, align, erased_val);
-                    f(run);
-                }
-            }
-        }
-    }
-
-    /// Construct an `Images` that doesn't expect an upgrade to happen.
-    pub fn make_no_upgrade_image(self) -> Images {
-        let mut flashmap = self.flashmap;
-        let primaries = install_image(&mut flashmap, &self.slots, 0, 32784, false);
-        let upgrades = install_image(&mut flashmap, &self.slots, 1, 41928, false);
-        Images {
-            flashmap: flashmap,
-            areadesc: self.areadesc,
-            slots: self.slots,
-            primaries: primaries,
-            upgrades: upgrades,
-            total_count: None,
-        }
-    }
-
-    /// Construct an `Images` for normal testing.
-    pub fn make_image(self) -> Images {
-        let mut images = self.make_no_upgrade_image();
-        mark_upgrade(&mut images.flashmap, &images.slots[1]);
-
-        // upgrades without fails, counts number of flash operations
-        let total_count = match images.run_basic_upgrade() {
-            Ok(v)  => v,
-            Err(_) => {
-                panic!("Unable to perform basic upgrade");
-            },
-        };
-
-        images.total_count = Some(total_count);
-        images
-    }
-
-    pub fn make_bad_secondary_slot_image(self) -> Images {
-        let mut bad_flashmap = self.flashmap.clone();
-        let primaries = install_image(&mut bad_flashmap, &self.slots, 0, 32784, false);
-        let upgrades = install_image(&mut bad_flashmap, &self.slots, 1, 41928, true);
-        Images {
-            flashmap: bad_flashmap,
-            areadesc: self.areadesc,
-            slots: self.slots,
-            primaries: primaries,
-            upgrades: upgrades,
-            total_count: None,
-        }
-    }
-
-}
-
 pub struct RunStatus {
     failures: usize,
     passes: usize,
@@ -274,7 +161,7 @@
     pub fn run_single(&mut self, device: DeviceName, align: u8, erased_val: u8) {
         warn!("Running on device {} with alignment {}", device, align);
 
-        let run = Run::new(device, align, erased_val);
+        let run = ImagesBuilder::new(device, align, erased_val);
 
         let mut failed = false;
 
@@ -312,91 +199,3 @@
     }
 }
 
-/// Build the Flash and area descriptor for a given device.
-pub fn make_device(device: DeviceName, align: u8, erased_val: u8) -> (SimFlashMap, AreaDesc) {
-    match device {
-        DeviceName::Stm32f4 => {
-            // STM style flash.  Large sectors, with a large scratch area.
-            let flash = SimFlash::new(vec![16 * 1024, 16 * 1024, 16 * 1024, 16 * 1024,
-                                      64 * 1024,
-                                      128 * 1024, 128 * 1024, 128 * 1024],
-                                      align as usize, erased_val);
-            let dev_id = 0;
-            let mut areadesc = AreaDesc::new();
-            areadesc.add_flash_sectors(dev_id, &flash);
-            areadesc.add_image(0x020000, 0x020000, FlashId::Image0, dev_id);
-            areadesc.add_image(0x040000, 0x020000, FlashId::Image1, dev_id);
-            areadesc.add_image(0x060000, 0x020000, FlashId::ImageScratch, dev_id);
-
-            let mut flashmap = SimFlashMap::new();
-            flashmap.insert(dev_id, flash);
-            (flashmap, areadesc)
-        }
-        DeviceName::K64f => {
-            // NXP style flash.  Small sectors, one small sector for scratch.
-            let flash = SimFlash::new(vec![4096; 128], align as usize, erased_val);
-
-            let dev_id = 0;
-            let mut areadesc = AreaDesc::new();
-            areadesc.add_flash_sectors(dev_id, &flash);
-            areadesc.add_image(0x020000, 0x020000, FlashId::Image0, dev_id);
-            areadesc.add_image(0x040000, 0x020000, FlashId::Image1, dev_id);
-            areadesc.add_image(0x060000, 0x001000, FlashId::ImageScratch, dev_id);
-
-            let mut flashmap = SimFlashMap::new();
-            flashmap.insert(dev_id, flash);
-            (flashmap, areadesc)
-        }
-        DeviceName::K64fBig => {
-            // Simulating an STM style flash on top of an NXP style flash.  Underlying flash device
-            // uses small sectors, but we tell the bootloader they are large.
-            let flash = SimFlash::new(vec![4096; 128], align as usize, erased_val);
-
-            let dev_id = 0;
-            let mut areadesc = AreaDesc::new();
-            areadesc.add_flash_sectors(dev_id, &flash);
-            areadesc.add_simple_image(0x020000, 0x020000, FlashId::Image0, dev_id);
-            areadesc.add_simple_image(0x040000, 0x020000, FlashId::Image1, dev_id);
-            areadesc.add_simple_image(0x060000, 0x020000, FlashId::ImageScratch, dev_id);
-
-            let mut flashmap = SimFlashMap::new();
-            flashmap.insert(dev_id, flash);
-            (flashmap, areadesc)
-        }
-        DeviceName::Nrf52840 => {
-            // Simulating the flash on the nrf52840 with partitions set up so that the scratch size
-            // does not divide into the image size.
-            let flash = SimFlash::new(vec![4096; 128], align as usize, erased_val);
-
-            let dev_id = 0;
-            let mut areadesc = AreaDesc::new();
-            areadesc.add_flash_sectors(dev_id, &flash);
-            areadesc.add_image(0x008000, 0x034000, FlashId::Image0, dev_id);
-            areadesc.add_image(0x03c000, 0x034000, FlashId::Image1, dev_id);
-            areadesc.add_image(0x070000, 0x00d000, FlashId::ImageScratch, dev_id);
-
-            let mut flashmap = SimFlashMap::new();
-            flashmap.insert(dev_id, flash);
-            (flashmap, areadesc)
-        }
-        DeviceName::Nrf52840SpiFlash => {
-            // Simulate nrf52840 with external SPI flash. The external SPI flash
-            // has a larger sector size so for now store scratch on that flash.
-            let flash0 = SimFlash::new(vec![4096; 128], align as usize, erased_val);
-            let flash1 = SimFlash::new(vec![8192; 64], align as usize, erased_val);
-
-            let mut areadesc = AreaDesc::new();
-            areadesc.add_flash_sectors(0, &flash0);
-            areadesc.add_flash_sectors(1, &flash1);
-
-            areadesc.add_image(0x008000, 0x068000, FlashId::Image0, 0);
-            areadesc.add_image(0x000000, 0x068000, FlashId::Image1, 1);
-            areadesc.add_image(0x068000, 0x018000, FlashId::ImageScratch, 1);
-
-            let mut flashmap = SimFlashMap::new();
-            flashmap.insert(0, flash0);
-            flashmap.insert(1, flash1);
-            (flashmap, areadesc)
-        }
-    }
-}
