diff --git a/Makefile b/Makefile
index bbfec48..4af2521 100644
--- a/Makefile
+++ b/Makefile
@@ -1,15 +1,49 @@
+# Copyright (c) 2018, Laurence Lundblade.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of The Linux Foundation nor the names of its
+# contributors, nor the name "Laurence Lundblade" may be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
 CFLAGS=-I inc -I test -Os -Wall -Werror -pedantic-errors -Wextra -Wshadow
 
-QCBOR_OBJ=src/UsefulBuf.o src/qcbor_encode.o src/qcbor_decode.o src/ieee754.o src/qcbor_decode_malloc.o
+QCBOR_OBJ=src/UsefulBuf.o src/qcbor_encode.o src/qcbor_decode.o src/ieee754.o 
+QCBOR_OBJ2=$(QCBOR_OBJ) src/qcbor_decode_malloc.o
 
 TEST_OBJ=test/UsefulBuf_Tests.o test/qcbor_encode_tests.o test/qcbor_decode_tests.o test/run_tests.o \
   test/float_tests.o test/half_to_double_from_rfc7049.o test/qcbor_decode_malloc_tests.o
 
-CMD_LINE_OBJ=$(QCBOR_OBJ) $(TEST_OBJ) cmd_line_main.o
+CMD_LINE_OBJ=$(QCBOR_OBJ2) $(TEST_OBJ) cmd_line_main.o
 
 qcbortest: $(CMD_LINE_OBJ)
 	cc -o $@ $^ $(CFLAGS)
 
+qcbormin: $(QCBOR_OBJ) min_use_main.c
+	cc -dead_strip -o $@ $^ $(CFLAGS)
+
 src/UsefulBuf.o:	inc/UsefulBuf.h
 src/qcbor_decode.o:	inc/UsefulBuf.h inc/qcbor.h src/ieee754.h
 src/qcbor_encode.o:	inc/UsefulBuf.h inc/qcbor.h src/ieee754.h
@@ -27,5 +61,7 @@
 
 cmd_line_main.o:	test/run_tests.h
 
+min_use_main.o:		inc/qcbor.h inc/UsefulBuf.h
+
 clean:
 	rm $(CMD_LINE_OBJ)
diff --git a/README.md b/README.md
index 0b4e71b..44195da 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
 
 **Secure Coding Style** – Uses a construct called UsefulBuf as a discipline for very safe coding the handling of binary data.
 
-**Small Code Size** – When optimized for size using the compiler -Os option, x86 code is less than 5KB (~2KB encode, 2KB decode, 1KB common). 
+**Small Code Size** – When optimized for size using the compiler -Os option, x86 code is less than 5KB (~1.7B encode, 2.8KB decode, 0.4KB common). 
 
 **Clear documented public interface** – The public interface is separated from the implementation. It can be put to use without reading the source. 
 
diff --git a/min_use_main.c b/min_use_main.c
new file mode 100644
index 0000000..bfcbd84
--- /dev/null
+++ b/min_use_main.c
@@ -0,0 +1,180 @@
+/*==============================================================================
+
+Copyright (c) 2018, Laurence Lundblade.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following
+disclaimer in the documentation and/or other materials provided
+with the distribution.
+* Neither the name of The Linux Foundation nor the names of its
+contributors, nor the name "Laurence Lundblade" may be used to
+endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+                       SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+                       BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+                                                OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+==============================================================================*/
+//  Created by Laurence Lundblade on 10/26/18.
+
+#include <stdio.h>
+#include "qcbor.h"
+
+
+
+/*
+ A small user of CBOR encoding and decoding
+ that is good as an example and for
+ checking code size with all the
+ inlining and dead stripping on.
+ 
+ */
+
+int main(int argc, const char * argv[])
+{
+    (void)argc; // Suppress unused warning
+    (void)argv; // Suppress unused warning
+    
+    uint8_t pBuf[300];
+    // Very simple CBOR, a map with one boolean that is true in it
+    QCBOREncodeContext EC;
+    
+    QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(pBuf));
+    
+    QCBOREncode_OpenMap(&EC);
+    QCBOREncode_AddBoolToMapN(&EC, 66, true);
+    QCBOREncode_CloseMap(&EC);
+    
+    UsefulBufC Encoded;
+    if(QCBOREncode_Finish2(&EC, &Encoded)) {
+        return -1;
+    }
+    
+    
+    // Decode it and see that is right
+    QCBORDecodeContext DC;
+    QCBORItem Item;
+    QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
+    
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_MAP) {
+        return -2;
+    }
+    
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_TRUE) {
+        return -3;
+    }
+    
+    if(QCBORDecode_Finish(&DC)) {
+        return -4;
+    }
+    
+    
+    // Make another encoded message with the CBOR from the previous put into this one
+    UsefulBuf_MAKE_STACK_UB(MemoryForEncoded2, 20);
+    QCBOREncode_Init(&EC, MemoryForEncoded2);
+    QCBOREncode_OpenArray(&EC);
+    QCBOREncode_AddUInt64(&EC, 451);
+    QCBOREncode_AddEncoded(&EC, Encoded);
+    QCBOREncode_OpenMap(&EC);
+    QCBOREncode_AddEncodedToMapN(&EC, -70000, Encoded);
+    QCBOREncode_CloseMap(&EC);
+    QCBOREncode_CloseArray(&EC);
+    
+    UsefulBufC Encoded2;
+    if(QCBOREncode_Finish2(&EC, &Encoded2)) {
+        return -5;
+    }
+    /*
+     [                // 0    1:3
+     451,          // 1    1:2
+     {             // 1    1:2   2:1
+     66: true    // 2    1:1
+     },
+     {             // 1    1:1   2:1
+     -70000: {   // 2    1:1   2:1   3:1
+     66: true  // 3    XXXXXX
+     }
+     }
+     ]
+     
+     
+     
+     83                # array(3)
+     19 01C3        # unsigned(451)
+     A1             # map(1)
+     18 42       # unsigned(66)
+     F5          # primitive(21)
+     A1             # map(1)
+     3A 0001116F # negative(69999)
+     A1          # map(1)
+     18 42    # unsigned(66)
+     F5       # primitive(21)
+     */
+    
+    // Decode it and see if it is OK
+    QCBORDecode_Init(&DC, Encoded2, QCBOR_DECODE_MODE_NORMAL);
+    
+    // 0    1:3
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.val.uCount != 3) {
+        return -6;
+    }
+    
+    // 1    1:2
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_INT64 || Item.val.uint64 != 451) {
+        return -7;
+    }
+    
+    // 1    1:2   2:1
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_MAP || Item.val.uCount != 1) {
+        return -8;
+    }
+    
+    // 2    1:1
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_TRUE) {
+        return -9;
+    }
+    
+    // 1    1:1   2:1
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_MAP || Item.val.uCount != 1) {
+        return -10;
+    }
+    
+    // 2    1:1   2:1   3:1
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_MAP || Item.val.uCount != 1 || Item.uLabelType != QCBOR_TYPE_INT64 || Item.label.int64 != -70000) {
+        return -11;
+    }
+    
+    // 3    XXXXXX
+    QCBORDecode_GetNext(&DC, &Item);
+    if(Item.uDataType != QCBOR_TYPE_TRUE || Item.uLabelType != QCBOR_TYPE_INT64 || Item.label.int64 != 66) {
+        return -12;
+    }
+    
+    if(QCBORDecode_Finish(&DC)) {
+        return -13;
+    }
+    
+    return 0;
+}
