diff --git a/README b/README
new file mode 100644
index 0000000000000000000000000000000000000000..4eb72cf106cc9c9a0f6a15450a691dc24ed8f6e1
--- /dev/null
+++ b/README
@@ -0,0 +1,82 @@
+# EdosL0Util
+Tools for mangling EDOS L0 PDS files.
+
+### Features:
+
+    * API for streaming packets
+    * CLI tools for:
+        - merging multiple PDS files
+        - splitting pds into X minute files
+        - truncating files to specified time range
+        - inspecting PDS info
+    * Dumping JPSS H5 RDRs to L0 PDS files
+
+
+### Packet streaming
+To obtain a simple stream of packets, with support for secondary header
+parsing use the ``PacketStream`` class as an iterator.
+
+    >>> from edosl0util.stream import PacketStream
+    >>> stream = PacketStream(open('P1570826VIIRSSCIENCEAS15286023813501.PDS'))
+    >>> stream.next()
+        <Packet apid=826 seqid=13072 stamp=2015-10-13 00:22:04.042798>
+    >>> packets = list(stream)
+    >>> first, last, info = stream.info()
+    >>> print info
+        defaultdict(<function edosl0util.stream.<lambda>>,
+                {800: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 801: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 802: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 803: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 804: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 805: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 806: {'count': 59005, 'last_seqid': 2684, 'num_missing': 0},
+                 807: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 808: {'count': 59007, 'last_seqid': 2686, 'num_missing': 0},
+                 809: {'count': 59007, 'last_seqid': 2686, 'num_missing': 0},
+                 810: {'count': 32351, 'last_seqid': 16043, 'num_missing': 0},
+                 811: {'count': 59007, 'last_seqid': 2686, 'num_missing': 0},
+                 812: {'count': 59007, 'last_seqid': 2686, 'num_missing': 0},
+                 813: {'count': 114543, 'last_seqid': 5214, 'num_missing': 0},
+                 814: {'count': 59007, 'last_seqid': 2686, 'num_missing': 0},
+                 815: {'count': 58994, 'last_seqid': 2673, 'num_missing': 0},
+                 816: {'count': 58990, 'last_seqid': 2669, 'num_missing': 0},
+                 817: {'count': 114510, 'last_seqid': 5181, 'num_missing': 0},
+                 818: {'count': 62766, 'last_seqid': 11834, 'num_missing': 0},
+                 819: {'count': 62766, 'last_seqid': 11834, 'num_missing': 0},
+                 820: {'count': 62766, 'last_seqid': 11834, 'num_missing': 0},
+                 821: {'count': 59007, 'last_seqid': 2686, 'num_missing': 0},
+                 825: {'count': 83280, 'last_seqid': 3768, 'num_missing': 0},
+                 826: {'count': 3471, 'last_seqid': 158, 'num_missing': 0}})
+
+To handle ``PacketTooShort`` and ``NonSequentialSeqId`` errors you have to 
+iterate manually:
+
+    >>> from edosl0util.stream import PacketStream
+    >>> stream = PacketStream(open('P1570826VIIRSSCIENCEAS15286023813501.PDS'))
+    >>> while True:
+       ...:     try:
+       ...:         packet = stream.next()
+       ...:         print(packet)
+       ...:     except PacketTooShort as err:
+       ...:         print("Corrupt packet stream: {:s}".format(packet))
+       ...:         break
+       ...:     except NonConsecutiveSeqId as err:
+       ...:         print("Missing packet: {:s}".format(err))
+       ...:     except StopIteration:
+       ...:         break
+
+
+### Command Line Tools
+There are command line tools for merging, splitting, truncating and inspecting
+L0 PDS files.
+
+    * edosl0merge
+    * edosl0split
+    * edosl0trunc
+    * edosl0info
+    * rdr2l0
+
+
+If you have quesions or comments related to this software contac
+brucef@ssec.wisc.edu.