diff --git a/root.pem b/root.pem
new file mode 100644
index 0000000..78c0c34
--- /dev/null
+++ b/root.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEA0QYIGhhELBjo+/33DaNPH7vuXvmq0ksY01rpbRiAGfnwnDQb
+y/O8dNtC54x/EFN+Q14NVyxE0WcIDw27XO7ss5nf4E2EC6p3QWDtFShJpwG0PBDm
+aYwvX6xBTZ5cFN/y+M89Hm/nW7q0qciIfkc8lMN3Z1RLqo04NcpiYX634RXbd3PU
+vntyIYlpJPv4ZW5kPsgO14XVXErkUw0v/7f98xM5gz+jrtIPp2qd+f64zvoqvq+4
+4PqCN1T0PuEr0NMIWBj2XkzIiIExrV+wghfyimknI/Orhz6TGh3+6PgaJGZZ+Byr
+3M5oG2ZkNez6DRGdr1w6p9FnxkfvsUssYuHRyQIDAQABAoIBAEahFCHFK1v/OtLT
+eSSZl0Xw2dYr5QXULFpWsOOVUMv2QdB2ZyIehQKziEL3nYPlwpd+82EOa16awwVb
+LYF0lnUFvLltV/4dJtjnqJTqnSCamc1mJIVrwiJA8XwJ07GWDuL2G//p7jJ3v05T
+nZOV/KmD9xfqSvshZun+LgolqHqcrAa1f4cmuP9C9oqenZryljyfj7piaIZGI0JR
+PrJJ5kImYJqRcMgKTyHP4L8nwQ4moMJr6zbfbWxxb5TC7KVZSQ9UKZZ+ZLuy/pkU
+Qe4G8XSE0r+R9u4JCg87I1vgHhn8WJSxVX027OVUq5HfOzg2skQBTcExph5V9B2b
+onNxd8UCgYEA/32PW+ZwRcdKXMj+QVkxXUd6xkXy7mTXPEaQuOLWZQgrSqAFH1l4
+5/6d099KAJrjM6kR8pKXtz72IIyMHTPm332ghymjKvaEl2XP9sF+f6FmYURar4y6
+8Zh3eivP86+Q/YzOGKwtRSziBMzrAfoIXgtwH8pwIPYLP3zBV4449ZsCgYEA0XC/
+gu2ub5M6EXBnjq9K2d4LlTyAPsIbAcMSwkhOUH4YJFS22qXLYQUA9zM+DUyLCrl/
+PKN2G0HQVgMb4DIbeHv8kXB5oGm5zfbWorWqOomXB3AsI7X8YDMtf/PsZV2amBei
+qVskmPJQV21qFyeOcHlT+dHuRb0O0un3dK8RHmsCgYEApDCH4dJ80osZoflVVJ/C
+VqTqJOOtFEFgBQ+AUCEPEQyn7aRaxmPUjJsXyKJVx3/ChV+g9hf5Qj1HJXHNVbMW
+KwhsEpDSmHimizlV5clBxzntNpMcCHdTaJHILo5bbMqmThugE0ELMsp+UgFzAeky
+WWXWX8fUOYqFff5prh/rQQMCgYBQQ8FhT+113Rp37HgDerJY5HvT6afMZV8sQbJC
+uqsotepSohShnsBeoihIlF7HgfoXVhepCYwNzh8ll3NrbEiS2BFnO4+hJmOKx3pi
+SPTAElLLCvYfiXL6+yII01ZZUpIYj5ZLCR7xbovTtZ7e2M4B1L2WFBoYp+eydO/c
+y+rnmQKBgCh0gfyBT/OKPkfKv+Bbt8HcoxgEj+TyH+vYdeTbP9ZSJ6y5utMbPg7z
+iLLbJ+9IcSwPCwJSmI+I0Om4xEp4ZblCrzAG7hWvG2NNzxQjmoOOrAANyTvJR/ap
+N+UkQA4WrMSKEYyBlRS/hR9Unz31vMc2k9Re0ukWhWh/QksQGDfJ
+-----END RSA PRIVATE KEY-----
diff --git a/scripts/flash.sh b/scripts/flash.sh
new file mode 100755
index 0000000..7353dd7
--- /dev/null
+++ b/scripts/flash.sh
@@ -0,0 +1,18 @@
+#! /bin/bash
+
+source $(dirname $0)/../target.sh
+
+lscript=/tmp/flash$$.jlink
+
+cat >$lscript <<EOF
+h
+r
+loadfile outdir/$BOARD/zephyr.bin $BASE_BOOT
+loadfile hello.signed.bin $BASE_SLOT0
+loadfile shell.signed.bin $BASE_SLOT1
+q
+EOF
+
+JLinkExe -device $SOC -si SWD -speed auto \
+	-CommanderScript $lscript
+rm $lscript
diff --git a/scripts/gdb-boot.sh b/scripts/gdb-boot.sh
new file mode 100755
index 0000000..dd8a34d
--- /dev/null
+++ b/scripts/gdb-boot.sh
@@ -0,0 +1,27 @@
+#! /bin/bash
+
+source $(dirname $0)/../target.sh
+
+gscript=/tmp/init$$.gdb
+
+cat > $gscript <<EOF
+target remote localhost:2331
+symbol-file outdir/$BOARD/zephyr.elf
+# symbol-file ../zephyr/samples/shell/outdir/$BOARD/zephyr.elf
+# dir apps/boot/src
+# dir libs/bootutil/src
+# dir hw/mcu/stm/stm32f4xx/src
+b main
+# b __reset
+# b bootutil_img_validate
+# b cmp_rsasig
+# b bootutil_verify_sig
+# b mbedtls_rsa_public
+# b boot_calloc
+mon reset 2
+layout src
+focus cmd
+EOF
+
+$gdbexe -x $gscript
+rm $gscript
diff --git a/scripts/jgdb.sh b/scripts/jgdb.sh
new file mode 100755
index 0000000..a79c87c
--- /dev/null
+++ b/scripts/jgdb.sh
@@ -0,0 +1,6 @@
+#! /bin/bash
+
+source $(dirname $0)/../target.sh
+
+# Start the jlink gdb server
+JLinkGDBServer -if swd -device $SOC -speed auto
diff --git a/scripts/jl.sh b/scripts/jl.sh
new file mode 100755
index 0000000..260206d
--- /dev/null
+++ b/scripts/jl.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+source $(dirname $0)/../target.sh
+
+JLinkExe -speed auto -si SWD -device $SOC
diff --git a/scripts/newtimg.py b/scripts/newtimg.py
new file mode 100644
index 0000000..1e968d7
--- /dev/null
+++ b/scripts/newtimg.py
@@ -0,0 +1,67 @@
+# BOOT_IMG_MAGIC =                0x12344321
+BOOT_IMG_MAGIC = [ 0xf395c277, 0x7fefd260, 0x0f505235, 0x8079b62c ]
+IMAGE_MAGIC =			0x96f3b83c
+IMAGE_MAGIC_NONE =		0xffffffff
+
+#
+# Image header flags.
+#
+IMAGE_F_PIC =			0x00000001
+IMAGE_F_SHA256 =		0x00000002  # Image contains hash TLV
+IMAGE_F_PKCS15_RSA2048_SHA256 = 0x00000004  # PKCS15 w/RSA and SHA
+IMAGE_F_ECDSA224_SHA256 =	0x00000008  # ECD
+IMAGE_HEADER_SIZE =		32
+
+# Digest sizes
+SHA256_DIGEST_SIZE =		32
+
+# Signature sizes
+RSA_SIZE =                      256
+ECDSA_SIZE =                    68
+
+# 
+# Image trailer TLV types.
+# 
+IMAGE_TLV_SHA256 =		1   # SHA256 of image hdr and body
+IMAGE_TLV_RSA2048 =		2   # RSA2048 of hash output
+IMAGE_TLV_ECDSA224 =		3   # ECDSA of hash output
+
+
+OFFSET_VECTOR_TABLE = 0x20
+OFFSET_IH_MAGIC = 0
+OFFSET_IH_TLV_SIZE = 4
+OFFSET_IH_KEY_ID = 6
+OFFSET_IH_PAD1 = 7
+OFFSET_IH_HDR_SIZE = 8
+OFFSET_IH_PAD2 = 10
+OFFSET_IH_IMG_SIZE = 12
+OFFSET_IH_FLAGS = 16
+OFFSET_IH_VER_MAJOR = 20
+OFFSET_IH_VER_MINOR = 21
+OFFSET_IH_REVISION = 22
+OFFSET_IH_BUILD_NUM = 24
+OFFSET_IH_PAD3 = 28
+#struct image_version { uint8_t iv_major; uint8_t iv_minor; uint16_t iv_revision;
+#    uint32_t iv_build_num;
+#};
+#
+#/** Image header.  All fields are in little endian byte order. */
+#struct image_header {
+#    uint32_t ih_magic;
+#    uint16_t ih_tlv_size; /* Trailing TLVs */
+#    uint8_t  ih_key_id;
+#    uint8_t  _pad1;
+#    uint16_t ih_hdr_size;
+#    uint16_t _pad2;
+#    uint32_t ih_img_size; /* Does not include header. */
+#    uint32_t ih_flags;
+#    struct image_version ih_ver;
+#    uint32_t _pad3;
+#};
+#
+#/** Image trailer TLV format. All fields in little endian. */
+#struct image_tlv {
+#    uint8_t  it_type;
+#    uint8_t  _pad;
+#    uint16_t it_len;
+#};
diff --git a/scripts/newtimg.pyc b/scripts/newtimg.pyc
new file mode 100644
index 0000000..9bdc5c1
--- /dev/null
+++ b/scripts/newtimg.pyc
Binary files differ
diff --git a/scripts/zep2newt.py b/scripts/zep2newt.py
new file mode 100755
index 0000000..1b46465
--- /dev/null
+++ b/scripts/zep2newt.py
@@ -0,0 +1,220 @@
+#!/usr/bin/python2
+
+from __future__ import print_function
+
+import mmap
+import os
+import struct
+import sys
+from argparse import ArgumentParser
+import newtimg
+from ctypes import *
+from Crypto.Signature import PKCS1_v1_5
+from Crypto.Hash import SHA256
+from Crypto.PublicKey import RSA
+
+DEBUG = False
+
+def get_args():
+    parser = ArgumentParser(description='Script to create images on a format \
+                            that Mynewts bootloader expects')
+
+    parser.add_argument('--bin', required=True, dest='binary_file', \
+                        help='Name of *.bin file (input)')
+
+    parser.add_argument('--key', required=False, dest='key_file', \
+                        help='Name of private key file (*.pem format)')
+
+    parser.add_argument('--out', required=False, dest='image_file', \
+                        default='zephyr.img.bin', \
+                        help='Name of *.img file (output)')
+
+    parser.add_argument('--sig', required=False, dest='sig_type', \
+                        default='SHA256', \
+                        help='Type of signature <SHA256|RSA|EC>')
+
+    parser.add_argument('--off', required=False, dest='flash_offs_addr', \
+                        default='0x08020000', \
+                        help='Offset for the binary in flash (at what address \
+                        should it be flashed?)')
+
+    parser.add_argument('--word-size', required=False, dest='word_size',
+            default=1,
+            help='Writable size of flash device (1, 2, 4, or 8)')
+
+    parser.add_argument('--vtoff', required=False, dest='vtable_offs', \
+                        default=str(hex(newtimg.OFFSET_VECTOR_TABLE)), \
+                        help='Offset to vector table in HEX (default: 0x80)')
+
+    parser.add_argument('--pad', required=False, \
+                        help='Pad file with 0xff up to this size (in hex)')
+
+    parser.add_argument('--bit', required=False, action="store_true", \
+                        default=False, \
+                        help='Whether to add the Boot Image Trailer to the \
+                        padded image or not (default: False)')
+
+    parser.add_argument('--verbose', required=False, action="store_true", \
+                        default=False, \
+                        help='Enable verbose mode')
+
+    parser.add_argument('--version', action='version', version='%(prog)s 1.0')
+
+    parser.add_argument('-f', required=False, action="store_true", \
+                        default=False, \
+                        help='Flash using JLinkExe')
+
+    return parser.parse_args()
+
+def trailer_size(word_size):
+    """
+    Compute the size of the image trailer.
+
+    The image trailer size depends on the writable unit size of the
+    flash in question.  Given a word size of 1, 2, 4 or 8, return the
+    size, in bytes, of the image trailer.  The magic number should be
+    placed at this particular offset from the end of the segment
+    """
+    sizes = { 1: 402, 2: 788, 4: 1560, 8: 3104 }
+    return sizes[word_size]
+
+class Signature(object):
+    """
+    Sign an image appropriately.
+    """
+
+    def compute(self, payload, key_file):
+        # Base computes sha256.
+        ctx = SHA256.new()
+        ctx.update(payload)
+        self.hash = ctx.digest()
+        self.ctx = ctx
+
+    def get_trailer(self):
+        return struct.pack('bxh32s', newtimg.IMAGE_TLV_SHA256,
+                len(self.hash),
+                self.hash)
+
+    def trailer_len(self):
+        return 32 + 4
+
+    def get_flags(self):
+        return newtimg.IMAGE_F_SHA256
+
+class RSASignature(Signature):
+
+    def compute(self, payload, key_file):
+        super(RSASignature, self).compute(payload, key_file)
+        with open(key_file, 'rb') as f:
+            rsa_key = RSA.importKey(f.read())
+        rsa = PKCS1_v1_5.new(rsa_key)
+        self.signature = rsa.sign(self.ctx)
+
+    def trailer_len(self):
+        return super(RSASignature, self).trailer_len() + newtimg.RSA_SIZE
+
+    def get_trailer(self):
+        buf = bytearray(super(RSASignature, self).get_trailer())
+        buf.extend(struct.pack('bxh', newtimg.IMAGE_TLV_RSA2048,
+                newtimg.RSA_SIZE))
+        buf.extend(self.signature)
+        return buf
+
+    def get_flags(self):
+        return newtimg.IMAGE_F_PKCS15_RSA2048_SHA256 | newtimg.IMAGE_F_SHA256
+
+sigs = {
+        'SHA256': Signature,
+        'RSA': RSASignature,
+        }
+
+class Convert():
+    def __init__(self, args):
+        self.args = args
+        if args.verbose:
+            for a in vars(args):
+                print("Arg -> {}: {}".format(a, getattr(args, a)))
+            self.debug = True
+        else:
+            self.debug = False
+
+        self.vtable_offs = int(args.vtable_offs, 16)
+        self.word_size = int(args.word_size)
+
+        self.load_image(args.binary_file)
+        self.validate_header()
+
+        sig = sigs[args.sig_type]()
+        header = self.make_header(sig)
+        assert len(header) == 32
+        self.image[:len(header)] = header
+
+        sig.compute(self.image, args.key_file)
+        self.trailer = sig.get_trailer()
+
+        self.image.extend(self.trailer)
+
+        if args.bit:
+            self.add_trailer(args.pad)
+
+        self.save_image(args.image_file)
+
+    def load_image(self, name):
+        with open(name, 'rb') as f:
+            image = f.read()
+        self.image = bytearray(image)
+
+    def save_image(self, name):
+        with open(name, 'wb') as f:
+            f.write(self.image)
+
+    def validate_header(self):
+        """Ensure that the image has space for a header
+
+        If the image is build with CONFIG_BOOT_HEADER off, the vector
+        table will be at the beginning, rather than the zero padding.
+        Verify that the padding is present.
+        """
+        if self.image[:self.vtable_offs] != bytearray(self.vtable_offs):
+            raise Exception("Image does not have space for header")
+
+    def make_header(self, sig):
+        image_size = len(self.image) - self.vtable_offs
+        tlv_size = sig.trailer_len()
+        key_id = 0
+        hd = struct.pack('IHBxHxxIIBBHI4x',
+                newtimg.IMAGE_MAGIC,
+                tlv_size,
+                key_id,
+                self.vtable_offs,
+                image_size,
+                sig.get_flags(),
+                1, 0, 0, 0)
+        return hd
+
+    def add_trailer(self, pad):
+        """
+        Add the image trailer, to indicate to the bootloader that this
+        image should be flashed
+        """
+        if not pad:
+            raise Exception("Must specify image length with --pad to use --bit")
+        pad = int(pad, 16)
+
+        if len(self.image) > pad:
+            raise Exception("Image is too large for padding")
+
+        self.image.extend(b'\xFF' * (pad - len(self.image)))
+
+        magic = struct.pack('4I', *newtimg.BOOT_IMG_MAGIC)
+        pos = pad - trailer_size(self.word_size)
+        self.image[pos:pos + len(magic)] = magic
+
+def main(argv):
+    args = get_args()
+    erase = False
+
+    conv = Convert(args)
+
+if __name__ == "__main__":
+    main(sys.argv)
diff --git a/sign.sh b/sign.sh
new file mode 100755
index 0000000..269032d
--- /dev/null
+++ b/sign.sh
@@ -0,0 +1,20 @@
+#! /bin/sh
+
+source $(dirname $0)/target.sh
+
+./scripts/zep2newt.py \
+    --bin ../zephyr/samples/shell/outdir/$BOARD/zephyr.bin \
+    --key root.pem \
+    --sig RSA \
+    --out shell.signed.bin \
+    --vtoff 0x200 \
+    --word-size 8 \
+    --bit --pad 0x20000
+
+./scripts/zep2newt.py \
+    --bin ../zephyr/samples/hello_world/outdir/$BOARD/zephyr.bin \
+    --key root.pem \
+    --sig RSA \
+    --vtoff 0x200 \
+    --word-size 8 \
+    --out hello.signed.bin
