diff --git a/scripts/imgtool.py b/scripts/imgtool.py
index f3bd016..ccac193 100755
--- a/scripts/imgtool.py
+++ b/scripts/imgtool.py
@@ -114,6 +114,8 @@
 
 @click.argument('outfile')
 @click.argument('infile')
+@click.option('--overwrite-only', default=False, is_flag=True,
+              help='Use overwrite-only instead of swap upgrades')
 @click.option('-M', '--max-sectors', type=int,
               help='When padding allow for this amount of sectors (defaults to 128)')
 @click.option('--pad', default=False, is_flag=True,
@@ -129,12 +131,13 @@
 @click.option('-k', '--key', metavar='filename')
 @click.command(help='Create a signed or unsigned image')
 def sign(key, align, version, header_size, included_header, slot_size, pad,
-         max_sectors, infile, outfile):
+         max_sectors, overwrite_only, infile, outfile):
     img = image.Image.load(infile, version=decode_version(version),
                            header_size=header_size,
                            included_header=included_header, pad=pad,
                            align=int(align), slot_size=slot_size,
-                           max_sectors=max_sectors)
+                           max_sectors=max_sectors,
+                           overwrite_only=overwrite_only)
     key = load_key(key) if key else None
     img.sign(key)
 
diff --git a/scripts/imgtool/image.py b/scripts/imgtool/image.py
index bb7a1f6..ea318f7 100644
--- a/scripts/imgtool/image.py
+++ b/scripts/imgtool/image.py
@@ -85,24 +85,27 @@
         return obj
 
     def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE, pad=0,
-                 align=1, slot_size=0, max_sectors=DEFAULT_MAX_SECTORS):
+                 align=1, slot_size=0, max_sectors=DEFAULT_MAX_SECTORS,
+                 overwrite_only=False):
         self.version = version or versmod.decode_version("0")
         self.header_size = header_size or IMAGE_HEADER_SIZE
         self.pad = pad
         self.align = align
         self.slot_size = slot_size
         self.max_sectors = max_sectors
+        self.overwrite_only = overwrite_only
 
     def __repr__(self):
         return "<Image version={}, header_size={}, base_addr={}, \
-                align={}, slot_size={}, max_sectors={}, format={}, \
-                payloadlen=0x{:x}>".format(
+                align={}, slot_size={}, max_sectors={}, overwrite_only={}, \
+                format={}, payloadlen=0x{:x}>".format(
                     self.version,
                     self.header_size,
                     self.base_addr if self.base_addr is not None else "N/A",
                     self.align,
                     self.slot_size,
                     self.max_sectors,
+                    self.overwrite_only,
                     self.__class__.__name__,
                     len(self.payload))
 
@@ -114,7 +117,8 @@
             if any(v != 0 for v in self.payload[0:self.header_size]):
                 raise Exception("Padding requested, but image does not start with zeros")
         if self.slot_size > 0:
-            tsize = self._trailer_size(self.align, self.max_sectors)
+            tsize = self._trailer_size(self.align, self.max_sectors,
+                                       self.overwrite_only)
             padding = self.slot_size - (len(self.payload) + tsize)
             if padding < 0:
                 msg = "Image size (0x{:x}) + trailer (0x{:x}) exceeds requested size 0x{:x}".format(
@@ -181,16 +185,20 @@
         self.payload = bytearray(self.payload)
         self.payload[:len(header)] = header
 
-    def _trailer_size(self, write_size, max_sectors):
+    def _trailer_size(self, write_size, max_sectors, overwrite_only):
         # NOTE: should already be checked by the argument parser
-        if write_size not in set([1, 2, 4, 8]):
-            raise Exception("Invalid alignment: {}".format(write_size))
-        m = DEFAULT_MAX_SECTORS if max_sectors is None else max_sectors
-        return m * 3 * write_size + 8 * 2 + 16
+        if overwrite_only:
+            return 8 * 2 + 16
+        else:
+            if write_size not in set([1, 2, 4, 8]):
+                raise Exception("Invalid alignment: {}".format(write_size))
+            m = DEFAULT_MAX_SECTORS if max_sectors is None else max_sectors
+            return m * 3 * write_size + 8 * 2 + 16
 
     def pad_to(self, size):
         """Pad the image to the given size, with the given flash alignment."""
-        tsize = self._trailer_size(self.align, self.max_sectors)
+        tsize = self._trailer_size(self.align, self.max_sectors,
+                                   self.overwrite_only)
         padding = size - (len(self.payload) + tsize)
         pbytes  = b'\xff' * padding
         pbytes += b'\xff' * (tsize - len(boot_magic))
