diff --git a/sim/src/caps.rs b/sim/src/caps.rs
index 499add0..09f6dee 100644
--- a/sim/src/caps.rs
+++ b/sim/src/caps.rs
@@ -4,14 +4,14 @@
 #[derive(Copy, Clone, Eq, PartialEq)]
 #[allow(unused)]
 pub enum Caps {
-    RSA2048          = (1 << 0),
-    EcdsaP224        = (1 << 1),
-    EcdsaP256        = (1 << 2),
-    SwapUpgrade      = (1 << 3),
-    OverwriteUpgrade = (1 << 4),
-    EncRsa           = (1 << 5),
-    EncKw            = (1 << 6),
-    ValidateSlot0    = (1 << 7),
+    RSA2048              = (1 << 0),
+    EcdsaP224            = (1 << 1),
+    EcdsaP256            = (1 << 2),
+    SwapUpgrade          = (1 << 3),
+    OverwriteUpgrade     = (1 << 4),
+    EncRsa               = (1 << 5),
+    EncKw                = (1 << 6),
+    ValidatePrimarySlot  = (1 << 7),
 }
 
 impl Caps {
diff --git a/sim/src/image.rs b/sim/src/image.rs
index b940b6e..e41d1cd 100644
--- a/sim/src/image.rs
+++ b/sim/src/image.rs
@@ -76,19 +76,20 @@
 
             if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                                BOOT_FLAG_SET, BOOT_FLAG_SET) {
-                warn!("Mismatched trailer for Slot 0");
+                warn!("Mismatched trailer for the primary slot");
                 fails += 1;
             }
 
             if !verify_trailer(&flashmap, &self.slots, 1, BOOT_MAGIC_UNSET,
                                BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-                warn!("Mismatched trailer for Slot 1");
+                warn!("Mismatched trailer for the secondary slot");
                 fails += 1;
             }
 
             if Caps::SwapUpgrade.present() {
                 if !verify_image(&flashmap, &self.slots, 1, &self.primaries) {
-                    warn!("Slot 1 FAIL at step {} of {}", i, total_flash_ops);
+                    warn!("Secondary slot FAIL at step {} of {}",
+                          i, total_flash_ops);
                     fails += 1;
                 }
             }
@@ -113,26 +114,28 @@
                                                         total_flash_ops, total_fails);
         info!("Random interruptions at reset points={:?}", total_counts);
 
-        let slot0_ok = verify_image(&flashmap, &self.slots, 0, &self.upgrades);
-        let slot1_ok = if Caps::SwapUpgrade.present() {
+        let primary_slot_ok = verify_image(&flashmap, &self.slots,
+                                           0, &self.upgrades);
+        let secondary_slot_ok = if Caps::SwapUpgrade.present() {
             verify_image(&flashmap, &self.slots, 1, &self.primaries)
         } else {
             true
         };
-        if !slot0_ok || !slot1_ok {
-            error!("Image mismatch after random interrupts: slot0={} slot1={}",
-                   if slot0_ok { "ok" } else { "fail" },
-                   if slot1_ok { "ok" } else { "fail" });
+        if !primary_slot_ok || !secondary_slot_ok {
+            error!("Image mismatch after random interrupts: primary slot={} \
+                    secondary slot={}",
+                   if primary_slot_ok { "ok" } else { "fail" },
+                   if secondary_slot_ok { "ok" } else { "fail" });
             fails += 1;
         }
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_SET, BOOT_FLAG_SET) {
-            error!("Mismatched trailer for Slot 0");
+            error!("Mismatched trailer for the primary slot");
             fails += 1;
         }
         if !verify_trailer(&flashmap, &self.slots, 1, BOOT_MAGIC_UNSET,
                            BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-            error!("Mismatched trailer for Slot 1");
+            error!("Mismatched trailer for the secondary slot");
             fails += 1;
         }
 
@@ -184,26 +187,27 @@
         //       was ever done?
 
         if !verify_image(&flashmap, &self.slots, 0, &self.upgrades) {
-            warn!("Slot 0 image verification FAIL");
+            warn!("Primary slot image verification FAIL");
             fails += 1;
         }
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_UNSET, BOOT_FLAG_SET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
         if !verify_trailer(&flashmap, &self.slots, 1, BOOT_MAGIC_UNSET,
                            BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-            warn!("Mismatched trailer for Slot 1");
+            warn!("Mismatched trailer for the secondary slot");
             fails += 1;
         }
 
-        // Marks image in slot0 as permanent, no revert should happen...
+        // Marks image in the primary slot as permanent,
+        // no revert should happen...
         mark_permanent_upgrade(&mut flashmap, &self.slots[0]);
 
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_SET, BOOT_FLAG_SET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
 
@@ -215,7 +219,7 @@
 
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_SET, BOOT_FLAG_SET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
         if !verify_image(&flashmap, &self.slots, 0, &self.upgrades) {
@@ -230,8 +234,9 @@
         fails > 0
     }
 
-    // Tests a new image written to slot0 that already has magic and image_ok set
-    // while there is no image on slot1, so no revert should ever happen...
+    // Tests a new image written to the primary slot that already has magic and
+    // image_ok set while there is no image on the secondary slot, so no revert
+    // should ever happen...
     pub fn run_norevert_newimage(&self) -> bool {
         let mut flashmap = self.flashmap.clone();
         let mut fails = 0;
@@ -240,10 +245,11 @@
 
         mark_upgrade(&mut flashmap, &self.slots[0]);
 
-        // This simulates writing an image created by imgtool to Slot 0
+        // This simulates writing an image created by imgtool to
+        // the primary slot
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
 
@@ -261,12 +267,12 @@
         }
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
         if !verify_trailer(&flashmap, &self.slots, 1, BOOT_MAGIC_UNSET,
                            BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-            warn!("Mismatched trailer for Slot 1");
+            warn!("Mismatched trailer for the secondary slot");
             fails += 1;
         }
 
@@ -277,8 +283,9 @@
         fails > 0
     }
 
-    // Tests a new image written to slot0 that already has magic and image_ok set
-    // while there is no image on slot1, so no revert should ever happen...
+    // Tests a new image written to the primary slot that already has magic and
+    // image_ok set while there is no image on the secondary slot, so no revert
+    // should ever happen...
     pub fn run_signfail_upgrade(&self) -> bool {
         let mut flashmap = self.flashmap.clone();
         let mut fails = 0;
@@ -291,7 +298,7 @@
 
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_SET, BOOT_FLAG_UNSET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
 
@@ -309,7 +316,7 @@
         }
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_SET, BOOT_FLAG_UNSET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
 
@@ -339,7 +346,7 @@
     /// allowing for fails in the status area. This should run to the end
     /// and warn that write fails were detected...
     pub fn run_with_status_fails_complete(&self) -> bool {
-        if !Caps::ValidateSlot0.present() {
+        if !Caps::ValidatePrimarySlot.present() {
             return false;
         }
 
@@ -366,7 +373,7 @@
 
         if !verify_trailer(&flashmap, &self.slots, 0, BOOT_MAGIC_GOOD,
                            BOOT_FLAG_SET, BOOT_FLAG_SET) {
-            warn!("Mismatched trailer for Slot 0");
+            warn!("Mismatched trailer for the primary slot");
             fails += 1;
         }
 
@@ -375,7 +382,8 @@
             fails += 1;
         }
 
-        info!("validate slot0 enabled; re-run of boot_go should just work");
+        info!("validate primary slot enabled; \
+               re-run of boot_go should just work");
         let (result, _) = c::boot_go(&mut flashmap, &self.areadesc, None, false);
         if result != 0 {
             warn!("Failed!");
@@ -395,7 +403,7 @@
     pub fn run_with_status_fails_with_reset(&self) -> bool {
         if Caps::OverwriteUpgrade.present() {
             false
-        } else if Caps::ValidateSlot0.present() {
+        } else if Caps::ValidatePrimarySlot.present() {
 
             let mut flashmap = self.flashmap.clone();
             let mut fails = 0;
@@ -425,7 +433,8 @@
             // or throw a single assert for small sector devices that fail
             // multiple times...
             if asserts > 1 {
-                warn!("Expected single assert validating slot0, more detected {}", asserts);
+                warn!("Expected single assert validating the primary slot, \
+                       more detected {}", asserts);
                 fails += 1;
             }
 
@@ -473,7 +482,7 @@
     }
 
     fn reset_bad_status(&self, flashmap: &mut SimFlashMap, slot: usize) {
-        if !Caps::ValidateSlot0.present() {
+        if !Caps::ValidatePrimarySlot.present() {
             return;
         }
 
@@ -553,21 +562,23 @@
     }
 
     if !verify_image(&flashmap, &images.slots, 0, &images.upgrades) {
-        warn!("Image in slot 0 before revert is invalid at stop={}", stop);
+        warn!("Image in the primary slot before revert is invalid at stop={}",
+              stop);
         fails += 1;
     }
     if !verify_image(&flashmap, &images.slots, 1, &images.primaries) {
-        warn!("Image in slot 1 before revert is invalid at stop={}", stop);
+        warn!("Image in the secondary slot before revert is invalid at stop={}",
+              stop);
         fails += 1;
     }
     if !verify_trailer(&flashmap, &images.slots, 0, BOOT_MAGIC_GOOD,
                        BOOT_FLAG_UNSET, BOOT_FLAG_SET) {
-        warn!("Mismatched trailer for Slot 0 before revert");
+        warn!("Mismatched trailer for the primary slot before revert");
         fails += 1;
     }
     if !verify_trailer(&flashmap, &images.slots, 1, BOOT_MAGIC_UNSET,
                        BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-        warn!("Mismatched trailer for Slot 1 before revert");
+        warn!("Mismatched trailer for the secondary slot before revert");
         fails += 1;
     }
 
@@ -579,21 +590,23 @@
     }
 
     if !verify_image(&flashmap, &images.slots, 0, &images.primaries) {
-        warn!("Image in slot 0 after revert is invalid at stop={}", stop);
+        warn!("Image in the primary slot after revert is invalid at stop={}",
+              stop);
         fails += 1;
     }
     if !verify_image(&flashmap, &images.slots, 1, &images.upgrades) {
-        warn!("Image in slot 1 after revert is invalid at stop={}", stop);
+        warn!("Image in the secondary slot after revert is invalid at stop={}",
+              stop);
         fails += 1;
     }
     if !verify_trailer(&flashmap, &images.slots, 0, BOOT_MAGIC_GOOD,
                        BOOT_FLAG_SET, BOOT_FLAG_SET) {
-        warn!("Mismatched trailer for Slot 1 after revert");
+        warn!("Mismatched trailer for the secondary slot after revert");
         fails += 1;
     }
     if !verify_trailer(&flashmap, &images.slots, 1, BOOT_MAGIC_UNSET,
                        BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
-        warn!("Mismatched trailer for Slot 1 after revert");
+        warn!("Mismatched trailer for the secondary slot after revert");
         fails += 1;
     }
 
@@ -723,10 +736,10 @@
 
     let result: [Option<Vec<u8>>; 2];
 
-    // Since images are always non-encrypted in slot0, we first write an
-    // encrypted image, re-read to use for verification, erase + flash
-    // un-encrypted. In slot1 the image is written un-encrypted, and if
-    // encryption is requested, it follows an erase + flash encrypted.
+    // Since images are always non-encrypted in the primary slot, we first write
+    // an encrypted image, re-read to use for verification, erase + flash
+    // un-encrypted. In the secondary slot the image is written un-encrypted,
+    // and if encryption is requested, it follows an erase + flash encrypted.
 
     let flash = flashmap.get_mut(&dev_id).unwrap();
 
diff --git a/sim/src/lib.rs b/sim/src/lib.rs
index 8131a70..ce3abfc 100644
--- a/sim/src/lib.rs
+++ b/sim/src/lib.rs
@@ -162,32 +162,34 @@
     pub fn new(device: DeviceName, align: u8, erased_val: u8) -> Run {
         let (flashmap, areadesc) = make_device(device, align, erased_val);
 
-        let (slot0_base, slot0_len, slot0_dev_id) = areadesc.find(FlashId::Image0);
-        let (slot1_base, slot1_len, slot1_dev_id) = areadesc.find(FlashId::Image1);
+        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 slot0 = SlotInfo {
-            base_off: slot0_base as usize,
-            trailer_off: slot0_base + slot0_len - offset_from_end,
-            len: slot0_len as usize,
-            dev_id: slot0_dev_id,
+        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 slot1 = SlotInfo {
-            base_off: slot1_base as usize,
-            trailer_off: slot1_base + slot1_len - offset_from_end,
-            len: slot1_len as usize,
-            dev_id: slot1_dev_id,
+        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: [slot0, slot1],
+            slots: [primary_slot, secondary_slot],
         }
     }
 
@@ -236,7 +238,7 @@
         images
     }
 
-    pub fn make_bad_slot1_image(&self) -> 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);
@@ -272,11 +274,11 @@
 
         let mut failed = false;
 
-        // Creates a badly signed image in slot1 to check that it is not
-        // upgraded to
-        let bad_slot1_image = run.make_bad_slot1_image();
+        // Creates a badly signed image in the secondary slot to check that
+        // it is not upgraded to
+        let bad_secondary_slot_image = run.make_bad_secondary_slot_image();
 
-        failed |= bad_slot1_image.run_signfail_upgrade();
+        failed |= bad_secondary_slot_image.run_signfail_upgrade();
 
         let images = run.make_no_upgrade_image();
         failed |= images.run_norevert_newimage();
