diff --git a/Makefile.am b/Makefile.am
index e53edf5..5d7c318 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -617,6 +617,7 @@ filters/rclscribus \
 filters/rclshowinfo \
 filters/rclsiduxman \
 filters/rclsoff.py \
+filters/rclsoff-flat.py \
 filters/rclsvg.py \
 filters/rcltar \
 filters/rcltex \
diff --git a/filters/rclsoff-flat.py b/filters/rclsoff-flat.py
new file mode 100755
index 0000000..7649dd8
--- /dev/null
+++ b/filters/rclsoff-flat.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python
+# Copyright (C) 2014 J.F.Dockes
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the
+#   Free Software Foundation, Inc.,
+#   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+######################################
+
+from __future__ import print_function
+
+import sys
+import rclexecm
+import rclxslt
+from zipfile import ZipFile
+
+stylesheet_meta = '''<?xml version="1.0"?>
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
+  xmlns:xlink="http://www.w3.org/1999/xlink" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
+  xmlns:ooo="http://openoffice.org/2004/office"
+  exclude-result-prefixes="office xlink meta ooo dc"
+  >
+
+<xsl:output method="html" encoding="UTF-8"/>
+
+
+<xsl:template match="/office:document">
+  <xsl:apply-templates select="/office:document/office:meta" />
+</xsl:template>
+
+<xsl:template match="office:document/office:meta">
+  <xsl:apply-templates select="dc:title"/>
+  <xsl:apply-templates select="dc:description"/>
+  <xsl:apply-templates select="dc:subject"/>
+  <xsl:apply-templates select="meta:keyword"/>
+  <xsl:apply-templates select="dc:creator"/>
+</xsl:template>
+
+<xsl:template match="dc:title">
+<title> <xsl:value-of select="."/> </title><xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="dc:description">
+  <meta>
+  <xsl:attribute name="name">abstract</xsl:attribute>
+  <xsl:attribute name="content">
+     <xsl:value-of select="."/>
+  </xsl:attribute>
+  </meta><xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="dc:subject">
+  <meta>
+  <xsl:attribute name="name">keywords</xsl:attribute>
+  <xsl:attribute name="content">
+     <xsl:value-of select="."/>
+  </xsl:attribute>
+  </meta><xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="dc:creator">
+  <meta>
+  <xsl:attribute name="name">author</xsl:attribute>
+  <xsl:attribute name="content">
+     <xsl:value-of select="."/>
+  </xsl:attribute>
+  </meta><xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="meta:keyword">
+  <meta>
+  <xsl:attribute name="name">keywords</xsl:attribute>
+  <xsl:attribute name="content">
+     <xsl:value-of select="."/>
+  </xsl:attribute>
+  </meta><xsl:text>
+</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
+'''
+
+stylesheet_content  = '''<?xml version="1.0"?>
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+  xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
+  exclude-result-prefixes="text office"
+>
+
+<xsl:template match="office:settings"><xsl:text></xsl:text></xsl:template>
+<xsl:template match="office:meta"><xsl:text></xsl:text></xsl:template>
+<xsl:template match="office:scripts"><xsl:text></xsl:text></xsl:template>
+<xsl:template match="office:font-face-decls"><xsl:text></xsl:text></xsl:template>
+<xsl:template match="office:styles"><xsl:text></xsl:text></xsl:template>
+<xsl:template match="office:automatic-styles"><xsl:text></xsl:text></xsl:template>
+<xsl:template match="office:master-styles"><xsl:text></xsl:text></xsl:template>
+
+
+<xsl:template match="text:p">
+  <p><xsl:apply-templates/></p><xsl:text>
+  </xsl:text>
+</xsl:template>
+
+<xsl:template match="text:h">
+<p><xsl:apply-templates/></p><xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="text:s">
+<xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="text:line-break">
+<br />
+</xsl:template>
+
+<xsl:template match="text:tab">
+<xsl:text>    </xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
+'''
+
+class OOExtractor:
+    def __init__(self, em):
+        self.em = em
+        self.currentindex = 0
+
+    def extractone(self, params):
+        if "filename:" not in params:
+            self.em.rclog("extractone: no mime or file name")
+            return (False, "", "", rclexecm.RclExecM.eofnow)
+        fn = params["filename:"]
+
+        try:
+            f = open(fn)
+            data = f.read()
+            f.close()
+        except Exception as err:
+            self.em.rclog("open failed: %s" % err)
+            return (False, "", "", rclexecm.RclExecM.eofnow)
+
+        docdata = b'<html>\n<head>\n<meta http-equiv="Content-Type"' \
+                  b'content="text/html; charset=UTF-8">\n'
+
+        try:
+            res = rclxslt.apply_sheet_data(stylesheet_meta, data)
+            docdata += res
+        except:
+            # To be checked. I'm under the impression that I get this when
+            # nothing matches?
+            #self.em.rclog("no/bad metadata in %s" % fn)
+            pass
+
+        docdata += b'</head><body>'
+
+        try:
+            res = rclxslt.apply_sheet_data(stylesheet_content, data)
+            docdata += res
+            docdata += b'</body></html>'
+        except Exception as err:
+            self.em.rclog("bad data in %s: %s" % (fn, err))
+            return (False, "", "", rclexecm.RclExecM.eofnow)
+
+        return (True, docdata, "", rclexecm.RclExecM.eofnext)
+    
+    ###### File type handler api, used by rclexecm ---------->
+    def openfile(self, params):
+        self.currentindex = 0
+        return True
+
+    def getipath(self, params):
+        return self.extractone(params)
+        
+    def getnext(self, params):
+        if self.currentindex >= 1:
+            return (False, "", "", rclexecm.RclExecM.eofnow)
+        else:
+            ret= self.extractone(params)
+            self.currentindex += 1
+            return ret
+
+if __name__ == '__main__':
+    proto = rclexecm.RclExecM()
+    extract = OOExtractor(proto)
+    rclexecm.main(proto, extract)
diff --git a/filters/rclsoff.py b/filters/rclsoff.py
index 67e0801..7d89190 100755
--- a/filters/rclsoff.py
+++ b/filters/rclsoff.py
@@ -143,8 +143,8 @@ class OOExtractor:
             self.em.rclog("unzip failed: %s" % err)
             return (False, "", "", rclexecm.RclExecM.eofnow)
 
-        docdata = b'<html><head><meta http-equiv="Content-Type"' \
-                  b'content="text/html; charset=UTF-8"></head><body>'
+        docdata = b'<html>\n<head>\n<meta http-equiv="Content-Type"' \
+                  b'content="text/html; charset=UTF-8">'
 
         try:
             metadata = zip.read("meta.xml")
@@ -157,6 +157,8 @@ class OOExtractor:
             #self.em.rclog("no/bad metadata in %s" % fn)
             pass
 
+        docdata += b'</head>\n<body>\n'
+
         try:
             content = zip.read("content.xml")
             if content:
diff --git a/sampleconf/mimeconf b/sampleconf/mimeconf
index 951e2d9..f7fe2cb 100644
--- a/sampleconf/mimeconf
+++ b/sampleconf/mimeconf
@@ -72,6 +72,9 @@ application/vnd.oasis.opendocument.text-template = execm rclsoff.py
 application/vnd.oasis.opendocument.presentation = execm rclsoff.py 
 application/vnd.oasis.opendocument.spreadsheet = execm rclsoff.py
 application/vnd.oasis.opendocument.graphics = execm rclsoff.py
+application/vnd.oasis.opendocument.presentation-flat-xml = execm rclsoff-flat.py
+application/vnd.oasis.opendocument.text-flat-xml = execm rclsoff-flat.py
+application/vnd.oasis.opendocument.spreadsheet-flat-xml = execm rclsoff-flat.py
 application/vnd.openxmlformats-officedocument.wordprocessingml.document = \
  execm rclopxml.py
 application/vnd.openxmlformats-officedocument.wordprocessingml.template = \
@@ -122,6 +125,7 @@ application/zip = execm rclzip;charset=default
 application/x-7z-compressed = execm rcl7z
 audio/mpeg = execm rclaudio
 audio/mp4 = execm rclaudio
+video/mp4 = execm rclaudio
 audio/aac = execm rclaudio
 audio/x-karaoke = execm rclkar
 image/gif = execm rclimg
diff --git a/sampleconf/mimemap b/sampleconf/mimemap
index 50fb4d2..5d6e66a 100644
--- a/sampleconf/mimemap
+++ b/sampleconf/mimemap
@@ -1,5 +1,9 @@
 # (C) 2004 J.F.Dockes
 # Associations of file name extensions to mime types
+#
+# All entries must be in lower case characters. File name extensions are
+# lower-cased for comparison during indexing, meaning that an upper or
+# mixed case entry will never be matched.
 
 .txt = text/plain
 .text = text/plain
@@ -108,6 +112,10 @@
 .sxg = application/vnd.sun.xml.writer.global
 .stw = application/vnd.sun.xml.writer.template
 
+.fodp = application/vnd.oasis.opendocument.presentation-flat-xml
+.fodt = application/vnd.oasis.opendocument.text-flat-xml
+.fods = application/vnd.oasis.opendocument.spreadsheet-flat-xml
+
 # ms openxml 
 .docm = application/vnd.ms-word.document.macroEnabled.12
 .docx = application/vnd.openxmlformats-officedocument.wordprocessingml.document
