diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
index b1f085f..52e7114 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
@@ -19,14 +19,18 @@
  * This is a streaming exporter class for Rtf, so it's based on
  * a string buffer.
  */
-
+/*
+ * TODO:
+ *   - Create a template
+ */
 public class RtfExporter extends MatchAggregator implements Exporter {
 
+    private static final String HLINE = "{\\pard\\brdrb\\brdrs\\brdrw2\\brsp20\\par}\n";
+    
     private boolean firstMatch;
 
     private ObjectMapper mapper = new ObjectMapper();
 
-
     // final static Charset charset = Charset.forName("Windows-1252");
     final static CharsetEncoder charsetEncoder =
         Charset
@@ -58,7 +62,7 @@
     public void writeHeader (Writer w) throws IOException {
         w.append("{")
             .append("\\rtf1\\ansi\\deff0\n")
-            .append("{\\colortbl;\\red0\\green0\\blue0;\\red127\\green127\\blue127;}\n")
+            .append("{\\colortbl;\\red0\\green0\\blue0;\\red127\\green127\\blue127;\\red255\\green255\\blue255;}\n")
             .append("{\\fonttbl{\\f0\\fcharset0 Times New Roman;}{\\f1\\fcharset1 Courier;}}\n");
 
         w.append("{\\footer\\pard\\qr\\fs18\\f0 ");
@@ -75,49 +79,16 @@
             w.append("\\rdblquote\\par}");
         };
 
-        addVersion(w);
+        w.append("\n{\\pard \\par}\n");
 
-        // Add Information table
-        if (this.getQueryString() != null) {
-            w.append("{\\pard Query: \\f1 ");
-            rtfText(w, this.getQueryString());
-            w.append("\\par}\n");
-        };
-
-        // Add Information table
-        if (this.getCorpusQueryString() != null) {
-            w.append("{\\pard Corpus: \\f1 ");
-            rtfText(w, this.getCorpusQueryString());
-            w.append("\\par}\n");
-        };
-
-        if (this.getTotalResults() != -1) {
-            w.append("{\\pard Count: \\f1 ");
-            if (this.hasTimeExceeded()) {
-                w.append("> ");
-            };
-            w.append(Integer.toString(this.getTotalResults()));
-            if (this.hasTimeExceeded()) {
-                w.append(" (Time exceeded)");
-            };
-            w.append("\\par}\n");
-        };
-
-        if (this.getTotalResults() == -1 ||
-            this.getTotalResults() > this.getMaxResults()) {
-            w.append("{\\pard Fetched: \\f1 ");
-            w.append(Integer.toString(this.getMaxResults()));
-            w.append("\\par}\n");
-        };
-
-        // Add line
-        w.append("{\\pard\\brdrb\\brdrs\\brdrw2\\brsp20\\par}\n");
+        this.addInfoTable(w);
     };
     
 
     @Override
     public void writeFooter (Writer w) throws IOException {
-        w.append("}");
+        // Add line
+        w.append(HLINE).append("}");
     };
     
 
@@ -175,12 +146,60 @@
         };
     };
 
+    private void addInfoTable (Writer w) throws IOException {
 
-    /*
-     * Get version for RTF document 
-     */
-    private void addVersion (Writer w) throws IOException {
-        Version version = new Version(
+        // Add Information table
+        if (this.getQueryString() != null) {
+            this.addInfoRow(w, "Query", this.getQueryString());
+        };
+
+        if (this.getCorpusQueryString() != null) {
+            this.addInfoRow(w, "Corpus", this.getCorpusQueryString());
+        };
+
+        if (this.getTotalResults() != -1) {
+            StringBuilder str = new StringBuilder(32);
+            if (this.hasTimeExceeded()) {
+                str.append("> ");
+            };
+            str.append(Integer.toString(this.getTotalResults()));
+            if (this.hasTimeExceeded()) {
+                str.append(" (Time exceeded)");
+            };
+
+            this.addInfoRow(w, "Count", str.toString());
+        };
+
+        if (this.getTotalResults() == -1 ||
+            this.getTotalResults() > this.getMaxResults()) {
+            this.addInfoRow(w, "Fetched", this.getMaxResults());
+        };
+
+        this.addInfoRow(w, "Export-Plugin", this.getVersion().toString());
+    };
+
+
+    // Add information row
+    private void addInfoRow (Writer w, String title, int value) throws IOException {
+        this.addInfoRow(w, title, Integer.toString(value));
+    };
+    
+
+    // Add information row
+    private void addInfoRow (Writer w, String title, String value) throws IOException {
+        w.append("{\\trowd\\trql\\lttrow")
+            .append("\\clpadl80\\clpadt80\\clpadb80\\clpadr80\\clcbpat2\\cellx2000")
+            .append("\\clpadl80\\clpadt80\\clpadb80\\clpadr80\\cellx9300")
+            .append("\\intbl\\cf3\\fs18\\b1\\f0 ");
+        rtfText(w, title);
+        w.append(":\\cell\\cf0\\fs18\\b0\\f1 ");
+        rtfText(w, value);
+        w.append("\\cell\\row}\n");
+    };
+    
+    // Get version for RTF document 
+    private Version getVersion () {
+        return new Version(
             ExWSConf.VERSION_MAJOR,
             ExWSConf.VERSION_MINOR,
             ExWSConf.VERSION_PATCHLEVEL,
@@ -188,11 +207,6 @@
             null,
             null
             );
-
-        w.append("{\\pard\\fs18\\f1 IDSExportPlugin-Version: ")
-            .append(version.toString())
-            .append("\\par}\n");
-        return;
     };
 
     // Based on jrtf by Christian Ullenboom
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java
index 14d7bb6..c3391a6 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java
@@ -335,7 +335,8 @@
                 Status.OK.getStatusCode(), responsertf.getStatus());
         String str = responsertf.readEntity(String.class);
 
-        assertTrue("Corpus info", str.contains("{\\pard Corpus: \\f1 corpusSigle = \"WPD17\"\\par}"));
+        assertTrue("Corpus info", str.contains("Corpus:"));
+        assertTrue("Corpus def", str.contains("corpusSigle = \"WPD17\""));
         assertFalse("Errors", str.contains("dynCall("));
     }
 
@@ -497,7 +498,7 @@
         assertTrue("Page 1 content", str.contains("Ironhoof"));
         assertTrue("Page 2 content", str.contains("Sinologie"));
         assertTrue("Unicode handling", str.contains("Hintergr\\u252\\'fcnde"));
-        assertTrue("TotalResults", str.contains("Count: \\f1 9\\"));
+        assertTrue("TotalResults", str.contains("Count:"));
         assertFalse("Fetched", str.contains("Fetched:"));
 
         frmap.putSingle("hitc", "7");
@@ -511,8 +512,10 @@
         assertTrue("Page 1 content", str.contains("Ironhoof"));
         assertTrue("Page 2 content", str.contains("Sinologie"));
         assertTrue("Unicode handling", str.contains("\\u252\\'fcbersetzt"));
-        assertTrue("TotalResults", str.contains("Count: \\f1 9\\"));
-        assertTrue("Fetched", str.contains("Fetched: \\f1 7\\"));
+        assertTrue("TotalResults1", str.contains("Count:"));
+        assertTrue("TotalResults2", str.contains("9\\cell"));
+        assertTrue("Fetched1", str.contains("Fetched:"));
+        assertTrue("Fetched2", str.contains("7\\cell"));
     }
 
     
@@ -564,10 +567,8 @@
         assertTrue("Page 1 content", str.contains("Importwunsch"));
         assertTrue("Page 2 content", str.contains("Sinologie"));
         assertTrue("Unicode handling", str.contains("Hintergr\\u252\\'fcnde"));
-        assertTrue("TotalResults", str.contains("Count: \\f1 > 22 ("));
-    }
-
-
+        assertTrue("TotalResults", str.contains("> 22 ("));
+    };
     
 
     @Test
