diff --git a/sim/src/api.rs b/sim/src/api.rs
deleted file mode 100644
index 0347b65..0000000
--- a/sim/src/api.rs
+++ /dev/null
@@ -1,85 +0,0 @@
-//! HAL api for MyNewt applications
-
-use simflash::{Result, Flash};
-use libc;
-use log::LogLevel;
-use mem;
-use std::slice;
-
-// The current active flash device.  The 'static is a lie, and we manage the lifetime ourselves.
-static mut FLASH: Option<*mut Flash> = None;
-
-// Set the flash device to be used by the simulation.  The pointer is unsafely stashed away.
-pub unsafe fn set_flash(dev: &mut Flash) {
-    let dev: &'static mut Flash = mem::transmute(dev);
-    FLASH = Some(dev as *mut Flash);
-}
-
-pub unsafe fn clear_flash() {
-    FLASH = None;
-}
-
-// Retrieve the flash, returning an error from the enclosing function.  We can't panic here because
-// we've called through C and unwinding is prohibited (it seems to just exit the program).
-macro_rules! get_flash {
-    () => {
-        match FLASH {
-            Some(x) => &mut *x,
-            None => return -19,
-        }
-    }
-}
-
-// This isn't meant to call directly, but by a wrapper.
-
-#[no_mangle]
-pub extern fn sim_flash_erase(offset: u32, size: u32) -> libc::c_int {
-    let dev = unsafe { get_flash!() };
-    map_err(dev.erase(offset as usize, size as usize))
-}
-
-#[no_mangle]
-pub extern fn sim_flash_read(offset: u32, dest: *mut u8, size: u32) -> libc::c_int {
-    let dev = unsafe { get_flash!() };
-    let mut buf: &mut[u8] = unsafe { slice::from_raw_parts_mut(dest, size as usize) };
-    map_err(dev.read(offset as usize, &mut buf))
-}
-
-#[no_mangle]
-pub extern fn sim_flash_write(offset: u32, src: *const u8, size: u32) -> libc::c_int {
-    let dev = unsafe { get_flash!() };
-    let buf: &[u8] = unsafe { slice::from_raw_parts(src, size as usize) };
-    map_err(dev.write(offset as usize, &buf))
-}
-
-fn map_err(err: Result<()>) -> libc::c_int {
-    match err {
-        Ok(()) => 0,
-        Err(e) => {
-            warn!("{}", e);
-            -1
-        },
-    }
-}
-
-/// Called by C code to determine if we should log at this level.  Levels are defined in
-/// bootutil/bootutil_log.h.  This makes the logging from the C code controlled by bootsim::api, so
-/// for example, it can be enabled with something like:
-///     RUST_LOG=bootsim::api=info cargo run --release runall
-/// or
-///     RUST_LOG=bootsim=info cargo run --release runall
-#[no_mangle]
-pub extern fn sim_log_enabled(level: libc::c_int) -> libc::c_int {
-    let res = match level {
-        1 => log_enabled!(LogLevel::Error),
-        2 => log_enabled!(LogLevel::Warn),
-        3 => log_enabled!(LogLevel::Info),
-        4 => log_enabled!(LogLevel::Trace),
-        _ => false,
-    };
-    if res {
-        1
-    } else {
-        0
-    }
-}
diff --git a/sim/src/area.rs b/sim/src/area.rs
deleted file mode 100644
index 5a1ef6c..0000000
--- a/sim/src/area.rs
+++ /dev/null
@@ -1,192 +0,0 @@
-//! Describe flash areas.
-
-use simflash::{Flash, SimFlash, Sector};
-use std::ptr;
-
-/// Structure to build up the boot area table.
-#[derive(Debug)]
-pub struct AreaDesc {
-    areas: Vec<Vec<FlashArea>>,
-    whole: Vec<FlashArea>,
-    sectors: Vec<Sector>,
-}
-
-impl AreaDesc {
-    pub fn new(flash: &SimFlash) -> AreaDesc {
-        AreaDesc {
-            areas: vec![],
-            whole: vec![],
-            sectors: flash.sector_iter().collect(),
-        }
-    }
-
-    /// Add a slot to the image.  The slot must align with erasable units in the flash device.
-    /// Panics if the description is not valid.  There are also bootloader assumptions that the
-    /// slots are SLOT0, SLOT1, and SCRATCH in that order.
-    pub fn add_image(&mut self, base: usize, len: usize, id: FlashId) {
-        let nid = id as usize;
-        let orig_base = base;
-        let orig_len = len;
-        let mut base = base;
-        let mut len = len;
-
-        while nid > self.areas.len() {
-            self.areas.push(vec![]);
-            self.whole.push(Default::default());
-        }
-
-        if nid != self.areas.len() {
-            panic!("Flash areas not added in order");
-        }
-
-        let mut area = vec![];
-
-        for sector in &self.sectors {
-            if len == 0 {
-                break;
-            };
-            if base > sector.base + sector.size - 1 {
-                continue;
-            }
-            if sector.base != base {
-                panic!("Image does not start on a sector boundary");
-            }
-
-            area.push(FlashArea {
-                flash_id: id,
-                device_id: 42,
-                pad16: 0,
-                off: sector.base as u32,
-                size: sector.size as u32,
-            });
-
-            base += sector.size;
-            len -= sector.size;
-        }
-
-        if len != 0 {
-            panic!("Image goes past end of device");
-        }
-
-        self.areas.push(area);
-        self.whole.push(FlashArea {
-            flash_id: id,
-            device_id: 42,
-            pad16: 0,
-            off: orig_base as u32,
-            size: orig_len as u32,
-        });
-    }
-
-    // Add a simple slot to the image.  This ignores the device layout, and just adds the area as a
-    // single unit.  It assumes that the image lines up with image boundaries.  This tests
-    // configurations where the partition table uses larger sectors than the underlying flash
-    // device.
-    pub fn add_simple_image(&mut self, base: usize, len: usize, id: FlashId) {
-        let area = vec![FlashArea {
-            flash_id: id,
-            device_id: 42,
-            pad16: 0,
-            off: base as u32,
-            size: len as u32,
-        }];
-
-        self.areas.push(area);
-        self.whole.push(FlashArea {
-            flash_id: id,
-            device_id: 42,
-            pad16: 0,
-            off: base as u32,
-            size: len as u32,
-        });
-    }
-
-    // Look for the image with the given ID, and return its base and size.  Panics if the area is
-    // not present.
-    pub fn find(&self, id: FlashId) -> (usize, usize) {
-        for area in &self.whole {
-            if area.flash_id == id {
-                return (area.off as usize, area.size as usize);
-            }
-        }
-        panic!("Requesting area that is not present in flash");
-    }
-
-    pub fn get_c(&self) -> CAreaDesc {
-        let mut areas: CAreaDesc = Default::default();
-
-        assert_eq!(self.areas.len(), self.whole.len());
-
-        for (i, area) in self.areas.iter().enumerate() {
-            if area.len() > 0 {
-                areas.slots[i].areas = &area[0];
-                areas.slots[i].whole = self.whole[i].clone();
-                areas.slots[i].num_areas = area.len() as u32;
-                areas.slots[i].id = area[0].flash_id;
-            }
-        }
-
-        areas.num_slots = self.areas.len() as u32;
-
-        areas
-    }
-}
-
-/// The area descriptor, C format.
-#[repr(C)]
-#[derive(Debug, Default)]
-pub struct CAreaDesc {
-    slots: [CArea; 16],
-    num_slots: u32,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct CArea {
-    whole: FlashArea,
-    areas: *const FlashArea,
-    num_areas: u32,
-    id: FlashId,
-}
-
-impl Default for CArea {
-    fn default() -> CArea {
-        CArea {
-            areas: ptr::null(),
-            whole: Default::default(),
-            id: FlashId::BootLoader,
-            num_areas: 0,
-        }
-    }
-}
-
-/// Flash area map.
-#[repr(u8)]
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-#[allow(dead_code)]
-pub enum FlashId {
-    BootLoader = 0,
-    Image0 = 1,
-    Image1 = 2,
-    ImageScratch = 3,
-    Nffs = 4,
-    Core = 5,
-    RebootLog = 6
-}
-
-impl Default for FlashId {
-    fn default() -> FlashId {
-        FlashId::BootLoader
-    }
-}
-
-#[repr(C)]
-#[derive(Debug, Clone, Default)]
-pub struct FlashArea {
-    flash_id: FlashId,
-    device_id: u8,
-    pad16: u16,
-    off: u32,
-    size: u32,
-}
-
diff --git a/sim/src/c.rs b/sim/src/c.rs
deleted file mode 100644
index a3a6b4f..0000000
--- a/sim/src/c.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-/// Interface wrappers to C API entering to the bootloader
-
-use area::AreaDesc;
-use simflash::Flash;
-use libc;
-use api;
-
-/// Invoke the bootloader on this flash device.
-pub fn boot_go(flash: &mut Flash, areadesc: &AreaDesc) -> i32 {
-    unsafe { api::set_flash(flash) };
-    let result = unsafe { raw::invoke_boot_go(&areadesc.get_c() as *const _) as i32 };
-    unsafe { api::clear_flash(); };
-    result
-}
-
-/// Setter/getter for the flash counter.  This isn't thread safe.
-pub fn get_flash_counter() -> i32 {
-    unsafe { raw::flash_counter as i32 }
-}
-
-/// Set the flash counter.  Zero indicates the flash should not be interrupted.  The counter will
-/// then go negative for each flash operation.
-pub fn set_flash_counter(counter: i32) {
-    unsafe { raw::flash_counter = counter as libc::c_int };
-}
-
-pub fn boot_trailer_sz() -> u32 {
-    unsafe { raw::boot_slots_trailer_sz(raw::sim_flash_align) }
-}
-
-pub fn get_sim_flash_align() -> u8 {
-    unsafe { raw::sim_flash_align }
-}
-
-pub fn set_sim_flash_align(align: u8) {
-    unsafe { raw::sim_flash_align = align };
-}
-
-pub fn boot_magic_sz() -> usize {
-    unsafe { raw::BOOT_MAGIC_SZ as usize }
-}
-
-pub fn boot_max_align() -> usize {
-    unsafe { raw::BOOT_MAX_ALIGN as usize }
-}
-
-mod raw {
-    use area::CAreaDesc;
-    use libc;
-
-    extern "C" {
-        // This generates a warning about `CAreaDesc` not being foreign safe.  There doesn't appear to
-        // be any way to get rid of this warning.  See https://github.com/rust-lang/rust/issues/34798
-        // for information and tracking.
-        pub fn invoke_boot_go(areadesc: *const CAreaDesc) -> libc::c_int;
-        pub static mut flash_counter: libc::c_int;
-
-        pub static mut sim_flash_align: u8;
-        pub fn boot_slots_trailer_sz(min_write_sz: u8) -> u32;
-
-        pub static BOOT_MAGIC_SZ: u32;
-        pub static BOOT_MAX_ALIGN: u32;
-    }
-}
diff --git a/sim/src/main.rs b/sim/src/main.rs
index acd15a9..61eb2c0 100644
--- a/sim/src/main.rs
+++ b/sim/src/main.rs
@@ -9,6 +9,7 @@
 extern crate rustc_serialize;
 extern crate simflash;
 extern crate untrusted;
+extern crate mcuboot_sys;
 
 use docopt::Docopt;
 use rand::{Rng, SeedableRng, XorShiftRng};
@@ -19,14 +20,12 @@
 use std::process;
 use std::slice;
 
-mod area;
-mod c;
-pub mod api;
 mod caps;
 mod tlv;
 
 use simflash::{Flash, SimFlash};
-use area::{AreaDesc, FlashId};
+use mcuboot_sys::area::{AreaDesc, FlashId};
+use mcuboot_sys::c;
 use caps::Caps;
 use tlv::TlvGen;
 
