diff --git a/tar_stream.py b/tar_stream.py
new file mode 100755
index 0000000000000000000000000000000000000000..2fd600cd4546b9c4007a561359da020cd47214f0
--- /dev/null
+++ b/tar_stream.py
@@ -0,0 +1,47 @@
+#!/usr/bin/python3
+
+import tarfile
+import os
+import threading
+
+class TarWriter:
+
+    def __init__(self, fileobj):
+        self.tarfile = tarfile.open(fileobj=fileobj,
+                                    mode='w|',
+                                    format=tarfile.PAX_FORMAT)
+
+    def add(self, path):
+        self.tarfile.add(path, recursive=False)
+        # Keep memory consumption down
+        self.tarfile.members = []
+        self.tarfile.inodes = {}
+        pass
+
+    def close(self):
+        self.tarfile.close()
+        self.tarfile = None
+        
+class TarReader:
+
+    def __init__(self, fileobj):
+        self.fileobj = fileobj
+        self.tarfile = None
+        pass
+
+    def __iter__(self):
+        if self.tarfile == None:
+            self.tarfile = tarfile.open(fileobj=self.fileobj,
+                                        mode='r|')
+            pass
+        for e in self.tarfile:
+            yield e
+            # Keep memory consumption down
+            self.tarfile.members = []
+            pass
+        pass
+        
+    def close(self):
+        self.tarfile.close()
+        self.tarfile = None
+        
diff --git a/test/test_tar_stream.py b/test/test_tar_stream.py
new file mode 100755
index 0000000000000000000000000000000000000000..0e7b51f1693f07fff256f6c6ac15c44273380ee0
--- /dev/null
+++ b/test/test_tar_stream.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python3
+
+from tar_stream import TarReader, TarWriter
+import time
+import os
+import threading
+
+
+def walk_files(root):
+    for p,d,f in os.walk(root):
+        for n in sorted(f):
+            yield os.path.join(p,n)
+            pass
+        for n in sorted(d):
+            yield os.path.join(p,n)
+            pass
+        pass
+    pass
+    
+def write_tar(t, files):
+    for p in files:
+        t.add(p)
+        pass
+    pass
+
+
+def reader(tar_reader):
+    print("READER", tar_reader)
+    for e in tar_reader:
+        print('R', e.size, e.name)
+        if e.isfile():
+            a = tar_reader.tarfile.extractfile(e).read()
+            b = open(e.name, 'rb').read()
+            if a != b:
+                raise Exception('DIFFERS...', a, b)
+            pass
+        elif e.issym():
+            print(e.linkname)
+            print(e.linkpath)
+            pass
+            
+        pass
+    pass
+
+if __name__ == '__main__':
+    (r,w) = os.pipe()
+    tw = TarWriter(os.fdopen(w, 'wb'))
+    tr = TarReader(os.fdopen(r, 'rb'))
+    t = threading.Thread(target=reader, args=(tr,))
+    t.daemon=True
+    t.start()
+
+    write_tar(tw, walk_files('.'))
+    tw.close()
+    t.join()
+    tr.close()