diff --git a/gui/drawwindow.py b/gui/drawwindow.py
index f26ca20..2dfb0ba 100644
--- a/gui/drawwindow.py
+++ b/gui/drawwindow.py
@@ -885,6 +885,12 @@ class Window(gtk.Window):
         dialog.add_filter(f)
 
         f = gtk.FileFilter()
+        filter2info[f] = ('.png', {'alpha': True, 'multifile': True})
+        f.set_name("Multiple PNG transparent (*.XXX.png)")
+        f.add_pattern("*.png")
+        dialog.add_filter(f)
+
+        f = gtk.FileFilter()
         filter2info[f] = ('.jpg', {'quality': 90})
         f.set_name("JPEG 90% quality (*.jpg; *.jpeg)")
         f.add_pattern("*.jpg")
diff --git a/lib/document.py b/lib/document.py
index 47a9347..05af47a 100644
--- a/lib/document.py
+++ b/lib/document.py
@@ -25,7 +25,7 @@ A document:
 - must be altered via undo/redo commands (except painting)
 """
 
-import os, zipfile, tempfile, time
+import os, zipfile, tempfile, time, re
 join = os.path.join
 import xml.etree.ElementTree as ET
 from gtk import gdk
@@ -261,15 +261,34 @@ class Document():
     def render_as_pixbuf(self, *args):
         return pixbufsurface.render_as_pixbuf(self, *args)
 
-    def save_png(self, filename, compression=2, alpha=False):
-        if alpha:
-            tmp_layer = layer.Layer()
-            for l in self.layers:
-                l.merge_into(tmp_layer)
-            pixbuf = tmp_layer.surface.render_as_pixbuf()
+    def save_png(self, filename, compression=2, alpha=False, multifile=False):
+        if multifile:
+            self.save_multifile_png(filename, compression, alpha)
         else:
-            pixbuf = self.render_as_pixbuf()
-        pixbuf.save(filename, 'png', {'compression':str(compression)})
+            if alpha:
+                tmp_layer = layer.Layer()
+                for l in self.layers:
+                    l.merge_into(tmp_layer)
+                pixbuf = tmp_layer.surface.render_as_pixbuf()
+            else:
+                pixbuf = self.render_as_pixbuf()
+            pixbuf.save(filename, 'png', {'compression':str(compression)})
+
+    def save_multifile_png(self, filename, compression=2, alpha=False):
+        x0, y0, w0, h0 = self.get_bbox()
+        match_number = re.search(r'.*\.[0-9]*\.(png|PNG)', filename)
+        if match_number:
+           (prefix, numberstr, ext) = re.sub(r'(.*\.)([0-9]*)\.(png|PNG)', r'\1*\2*\3', filename).split('*')
+           number = int(numberstr)
+           padstring = "%%0%dd" %len(numberstr)
+        else:
+           (prefix, ext) = re.sub(r'(.*\.)(png|PNG)', r'\1*\2', filename).split('*')
+           number = 1
+           padstring = "%%0%dd" %3
+        for i, l in enumerate(self.layers):
+            pixbuf = pixbufsurface.render_as_pixbuf(l.surface, x0, y0, w0, h0, alpha=True)
+            filename = prefix + padstring %(i+number) + '.' + ext
+            pixbuf.save(filename, 'png', {'compression':str(compression)})
 
     def load_png(self, filename):
         self.load_from_pixbuf(gdk.pixbuf_new_from_file(filename))
