diff --git a/benchmark/pom.xml b/benchmark/pom.xml
new file mode 100644
index 0000000..46086a7
--- /dev/null
+++ b/benchmark/pom.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License. -->
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+    <artifactId>odftoolkit</artifactId>
+    <groupId>org.apache.odftoolkit</groupId>
+    <version>0.7.0-incubating-SNAPSHOT</version>
+  </parent>
+
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>benchmark</artifactId>
+    <version>1.0</version>
+    <packaging>jar</packaging>
+
+    <name>JMH benchmark sample: Java</name>
+
+    <!--
+       This is the demo/sample template build script for building Java benchmarks with JMH.
+       Edit as needed.
+    -->
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>${jmh.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-generator-annprocess</artifactId>
+            <version>${jmh.version}</version>
+            <scope>provided</scope>
+        </dependency>
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>odfdom-java</artifactId>
+			<version>0.9.0-incubating-SNAPSHOT</version>
+		</dependency>        
+    </dependencies>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <!--
+            JMH version to use with this project.
+          -->
+        <jmh.version>1.19</jmh.version>
+
+        <!--
+            Java source/target to use for compilation.
+          -->
+        <javac.target>1.8</javac.target>
+
+        <!--
+            Name of the benchmark Uber-JAR to generate.
+          -->
+        <uberjar.name>benchmarks</uberjar.name>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <compilerVersion>${javac.target}</compilerVersion>
+                    <source>${javac.target}</source>
+                    <target>${javac.target}</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.2</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <finalName>${uberjar.name}</finalName>
+                            <transformers>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>org.openjdk.jmh.Main</mainClass>
+                                </transformer>
+                            </transformers>
+                            <filters>
+                                <filter>
+                                    <!--
+                                        Shading signed JARs will fail without this.
+                                        http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
+                                    -->
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>META-INF/*.SF</exclude>
+                                        <exclude>META-INF/*.DSA</exclude>
+                                        <exclude>META-INF/*.RSA</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-clean-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>2.8.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-install-plugin</artifactId>
+                    <version>2.5.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>2.4</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>2.9.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.6</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.3</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>2.2.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.17</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
diff --git a/benchmark/src/main/java/org/apache/odftoolkit/ODFDOMBenchmark.java b/benchmark/src/main/java/org/apache/odftoolkit/ODFDOMBenchmark.java
new file mode 100644
index 0000000..cd5183c
--- /dev/null
+++ b/benchmark/src/main/java/org/apache/odftoolkit/ODFDOMBenchmark.java
@@ -0,0 +1,402 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+ */
+package org.apache.odftoolkit;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.CodeSource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Warmup;
+import org.w3c.dom.NodeList;
+
+/**
+ * See JIRA issue https://issues.apache.org/jira/browse/ODFTOOLKIT-479
+ * for details!
+ */
+public class ODFDOMBenchmark {
+
+    private static final Logger LOG = Logger.getLogger(ODFDOMBenchmark.class.getName());
+    private static final String TEST_FILE_DIR_NAME = "performance";
+    public ODFDOMBenchmark() {
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @Fork(3)
+    @Measurement(iterations = 3)
+    @Warmup(iterations = 1)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public OdfFileDom testPerformance(ExecutionPlan plan) {
+        OdfFileDom dom = null;
+        try {
+            long start, end;
+            OdfDocument doc = null;
+
+            if (plan.testFileStreams == null) {
+                return dom;
+            }
+            LOG.info("Starting the test!");
+            for (int i = 0; i < plan.count; i++) {
+                int j = -1;
+                for (String filename : plan.testFileStreams.keySet()) {
+                	LOG.info("Starting reading " + filename);
+                    j++;
+                    start = System.currentTimeMillis();
+                    doc = OdfDocument.loadDocument(plan.testFileStreams.get(filename));
+                    end = System.currentTimeMillis();
+                    plan.totalLoadTimeForEach[j] += end - start;
+                    plan.totalTime[0] += end - start;
+                    if (i == 0) {
+                        System.gc();
+                        plan.memoryfootprint[3 * j] = Runtime.getRuntime().totalMemory()
+                                - Runtime.getRuntime().freeMemory();
+                    }
+                    LOG.info("Starting parsing!");
+                    start = System.currentTimeMillis();
+                    dom = doc.getContentDom();
+                    end = System.currentTimeMillis();
+                    LOG.info("Stop parsing!");
+                    plan.totalParseTimeForEach[j] += end - start;
+                    plan.totalTime[1] += end - start;
+                    if (i == 0) {
+                        System.gc();
+                        plan.memoryfootprint[3 * j + 1] = Runtime.getRuntime().totalMemory()
+                                - Runtime.getRuntime().freeMemory();
+                    }
+
+                    start = System.currentTimeMillis();
+                    doc.save(plan.rootPath + File.separator + filename);
+                    end = System.currentTimeMillis();
+                    plan.totalSaveTimeForEach[j] += end - start;
+                    plan.totalTime[2] += end - start;
+
+                    doc = null;
+                    dom = null;
+                    if (i == 0) {
+                        System.gc();
+                        plan.memoryfootprint[3 * j + 2] = Runtime.getRuntime().totalMemory()
+                                - Runtime.getRuntime().freeMemory();
+                    }
+                }
+            }
+
+            for (int i = 0; i < 3; i++) {
+                plan.totalTime[i] = plan.totalTime[i] / plan.count;
+            }
+
+            for (int i = 0; i < plan.testFileStreams.size(); i++) {
+                plan.totalLoadTimeForEach[i] = plan.totalLoadTimeForEach[i] / plan.count;
+                plan.totalParseTimeForEach[i] = plan.totalParseTimeForEach[i] / plan.count;
+                plan.totalSaveTimeForEach[i] = plan.totalSaveTimeForEach[i] / plan.count;
+            }
+
+        } catch (Exception e) {
+            Logger.getLogger(ODFDOMBenchmark.class.getName()).log(java.util.logging.Level.SEVERE, null, e);
+
+        }
+        return dom;
+    }
+
+    @State(Scope.Benchmark)
+    public static class ExecutionPlan {
+
+        public double[] totalTime = new double[3];
+        public double[] totalLoadTimeForEach = null;
+        public double[] totalSaveTimeForEach = null;
+        public double[] totalParseTimeForEach = null;
+        public double[] memoryfootprint = null;
+        public String time_spreadsheet = null;
+        public String memory_spreadsheet = null;
+        public String reportFileFolder = null;
+        public int count;
+        public String rootPath;
+        public URL jarLocation;
+        public Map<String, InputStream> testFileStreams;
+        public String outputPath;
+
+        @Setup(Level.Iteration)
+        public void setUp() {
+
+            CodeSource src = ODFDOMBenchmark.class.getProtectionDomain().getCodeSource();
+            if (src != null) {
+                jarLocation = src.getLocation();
+            }else{
+                LOG.severe("Could not locate JAR file!");
+            }
+
+            // jar file URL
+            rootPath = jarLocation.toExternalForm();
+            // directory containing the JAR
+            rootPath = rootPath.substring(6, rootPath.lastIndexOf("/"));
+
+            outputPath = rootPath + File.separatorChar + TEST_FILE_DIR_NAME;
+            new File(outputPath).mkdir();
+            String executeTimesTest = System.getProperty("executetimes");
+            if (executeTimesTest != null) {
+                count = Integer.parseInt(executeTimesTest);
+            } else {
+                count = 1;
+            }
+            reportFileFolder = getOutputPath() + File.separatorChar;
+            memory_spreadsheet = reportFileFolder + "memorylog.ods";
+            time_spreadsheet = reportFileFolder + "timelog.ods";
+
+            testFileStreams = new HashMap<String, InputStream>();
+            readFileList(jarLocation);
+            if (testFileStreams == null) {
+                LOG.severe("No test files found!");
+                return;
+            }
+
+            totalTime[0] = 0;
+            totalTime[1] = 0;
+            totalTime[2] = 0;
+
+            totalLoadTimeForEach = new double[testFileStreams.size()];
+            totalSaveTimeForEach = new double[testFileStreams.size()];
+            totalParseTimeForEach = new double[testFileStreams.size()];
+            memoryfootprint = new double[testFileStreams.size() * 3];
+
+            for (int i = 0; i < testFileStreams.size(); i++) {
+                totalLoadTimeForEach[i] = 0;
+                totalSaveTimeForEach[i] = 0;
+                totalParseTimeForEach[i] = 0;
+                memoryfootprint[3 * i] = 0;
+                memoryfootprint[3 * i + 1] = 0;
+                memoryfootprint[3 * i + 2] = 0;
+            }
+        }
+
+        @TearDown(Level.Iteration)
+        public void writeToLog() throws Exception {
+            FileInputStream timefile, memoryfile;
+            OdfDocument timedoc, memorydoc;
+
+            if (testFileStreams == null) {
+                return;
+            }
+
+            try {
+                timefile = new FileInputStream(time_spreadsheet);
+                timedoc = OdfDocument.loadDocument(timefile);
+            } catch (FileNotFoundException e) {
+                //Create an empty spreadsheet
+                timedoc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+                OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) timedoc.getContentDom().getElementsByTagNameNS(
+                        OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+                spreadsheet.removeChild(spreadsheet.getFirstChild());
+            }
+
+            try {
+                memoryfile = new FileInputStream(memory_spreadsheet);
+                memorydoc = OdfDocument.loadDocument(memoryfile);
+            } catch (FileNotFoundException e) {
+                //Create an empty spreadsheet
+                memorydoc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+                OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) memorydoc.getContentDom().getElementsByTagNameNS(
+                        OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+                spreadsheet.removeChild(spreadsheet.getFirstChild());
+            }
+
+            String[] summaryName = new String[]{"Load All Documents", "Parse All Documents", "Save All Documents"};
+            updateTableCells(timedoc, "Summary", totalTime, summaryName);
+            updateTableCells(timedoc, "Load ODF", totalLoadTimeForEach, testFileStreams.keySet().toArray(new String[0]));
+            updateTableCells(timedoc, "Parse ODF", totalParseTimeForEach, testFileStreams.keySet().toArray(new String[0]));
+            updateTableCells(timedoc, "Save ODF", totalSaveTimeForEach, testFileStreams.keySet().toArray(new String[0]));
+
+            String[] memorylabel = new String[testFileStreams.size() * 3];
+            int i = -1;
+            for (String testFileName : testFileStreams.keySet()) {
+                i++;
+
+                memorylabel[3 * i] = "load " + testFileName;
+                memorylabel[3 * i + 1] = "parse " + testFileName;
+                memorylabel[3 * i + 2] = "save " + testFileName;
+            }
+            updateTableCells(memorydoc, "Memory footprint", memoryfootprint, memorylabel);
+
+            timedoc.save(time_spreadsheet);
+            LOG.log(java.util.logging.Level.INFO, "[PerformaceTest] Test results are written to {0}", time_spreadsheet);
+            memorydoc.save(memory_spreadsheet);
+            LOG.log(java.util.logging.Level.INFO, "[PerformaceTest] Test results are written to {0}", memory_spreadsheet);
+        }
+
+        private String getOutputPath() {
+            String path = null;
+            File outputpath = new File(rootPath, "performance-reports");
+            if (!outputpath.exists()) {
+                outputpath.mkdir();
+            }
+            path = outputpath.getPath();
+            return path;
+        }
+
+        private void readFileList(URL jar) {
+            try {
+                LOG.log(java.util.logging.Level.INFO, "[PerformaceTest] Reading test documents from JAR {0}", jar);
+                ZipInputStream zip = null;
+                ZipFile zf;
+                File jarFile = new File(jar.toExternalForm().substring(6).replace('/', File.separatorChar));
+                zf = new ZipFile(jarFile);
+                try {
+                    zip = new ZipInputStream(jar.openStream());
+                    while (true) {
+                        ZipEntry e = zip.getNextEntry();
+                        if (e == null) {
+                            break;
+                        }
+                        String name = e.getName();
+                        if (name.startsWith(TEST_FILE_DIR_NAME) && !e.isDirectory() && (name.endsWith("ods") || name.endsWith("odp") || name.endsWith("odt"))) {
+                            LOG.log(java.util.logging.Level.INFO, "[PerformaceTest] Reading test document {0}", name);
+                            testFileStreams.put(name, zf.getInputStream(zf.getEntry(name)));
+                        }
+                    }
+                } catch (IOException ex) {
+                    Logger.getLogger(ODFDOMBenchmark.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+                } finally {
+                    try {
+                        zip.close();
+                    } catch (IOException ex) {
+                        Logger.getLogger(ODFDOMBenchmark.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+                    }
+                }
+            } catch (IOException ex) {
+                Logger.getLogger(ODFDOMBenchmark.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+            }
+        }
+
+        private void updateTableCells(OdfDocument odfdoc, String tablename,
+                double[] values, String[] labels) {
+            int i = 0, j = 0;
+            TableTableRowElement td;
+            TableTableCellElement cell;
+            OdfFileDom dom;
+            NodeList tableList;
+            TableTableElement myTable;
+            NodeList lst;
+            OdfTextParagraph p;
+            OfficeSpreadsheetElement spreadsheet = null;
+
+            try {
+                dom = odfdoc.getContentDom();
+                tableList = dom.getElementsByTagNameNS(
+                        OdfDocumentNamespace.TABLE.getUri(), "table");
+                spreadsheet = (OfficeSpreadsheetElement) dom.getElementsByTagNameNS(
+                        OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+
+                i = 0;
+                if (tableList.getLength() > 0) {
+                    for (; i < tableList.getLength(); i++) {
+                        String currentname = ((TableTableElement) tableList.item(i)).getTableNameAttribute();
+                        if (currentname == null) {
+                            currentname = "";
+                        }
+                        if (currentname.equalsIgnoreCase(tablename)) {
+                            break;
+                        }
+                    }
+                }
+                if (i < tableList.getLength()) //table with the specific table name is found
+                {
+                    myTable = (TableTableElement) tableList.item(i);
+                } else { //table with the specific table name is not found. Create table
+                    myTable = dom.newOdfElement(TableTableElement.class);
+                    myTable.setTableNameAttribute(tablename);
+                    spreadsheet.appendChild(myTable);
+                }
+
+                lst = myTable.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-row");
+                if (lst.getLength() == 0) { //the first table row is not existed. Create table row
+                    td = dom.newOdfElement(TableTableRowElement.class);
+                    cell = dom.newOdfElement(TableTableCellElement.class);
+                    p = dom.newOdfElement(OdfTextParagraph.class);
+                    if (tablename.startsWith("Memory")) {
+                        p.setTextContent("memory(b)");
+                    } else {
+                        p.setTextContent("time(ms)");
+                    }
+                    td.appendChild(cell);
+                    cell.appendChild(p);
+                    myTable.appendChild(td);
+                } else {
+                    td = (TableTableRowElement) lst.item(0); //the first table row is existed.
+                }
+                cell = dom.newOdfElement(TableTableCellElement.class);
+                td.appendChild(cell);
+                p = dom.newOdfElement(OdfTextParagraph.class);
+                cell.appendChild(p);
+
+                for (i = 1; i < values.length + 1; i++) {
+                    if (i < lst.getLength()) { //table row is existed
+                        td = (TableTableRowElement) lst.item(i);
+                    } else { //table row is not existed.
+                        td = dom.newOdfElement(TableTableRowElement.class);
+                        myTable.appendChild(td);
+                        //append first cell with labels
+                        cell = dom.newOdfElement(TableTableCellElement.class);
+                        td.appendChild(cell);
+                        p = dom.newOdfElement(OdfTextParagraph.class);
+                        p.setTextContent(labels[i]);
+                        cell.appendChild(p);
+                    }
+                    cell = dom.newOdfElement(TableTableCellElement.class);
+                    cell.setOfficeValueTypeAttribute("float");
+                    cell.setOfficeValueAttribute(new Double(values[j]));
+                    p = dom.newOdfElement(OdfTextParagraph.class);
+                    p.setTextContent(values[j] + "");
+                    cell.appendChild(p);
+                    td.appendChild(cell);
+                    j++;
+                }
+            } catch (Exception e) {
+                LOG.log(java.util.logging.Level.SEVERE, null, e);
+            }
+        }
+    }
+}
diff --git a/benchmark/src/main/resources/performance/Presentation1_INVALID.odp b/benchmark/src/main/resources/performance/Presentation1_INVALID.odp
new file mode 100644
index 0000000..5df2ea5
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Presentation1_INVALID.odp
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Presentation2.odp b/benchmark/src/main/resources/performance/Presentation2.odp
new file mode 100644
index 0000000..2c2a7df
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Presentation2.odp
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Presentation3.odp b/benchmark/src/main/resources/performance/Presentation3.odp
new file mode 100644
index 0000000..f3e3adc
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Presentation3.odp
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Presentation4.odp b/benchmark/src/main/resources/performance/Presentation4.odp
new file mode 100644
index 0000000..f32c7af
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Presentation4.odp
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Presentation5.odp b/benchmark/src/main/resources/performance/Presentation5.odp
new file mode 100644
index 0000000..e5b7588
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Presentation5.odp
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Presentation7.odp b/benchmark/src/main/resources/performance/Presentation7.odp
new file mode 100644
index 0000000..9002ac8
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Presentation7.odp
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Text1.odt b/benchmark/src/main/resources/performance/Text1.odt
new file mode 100644
index 0000000..4761107
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Text1.odt
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Text3.odt b/benchmark/src/main/resources/performance/Text3.odt
new file mode 100644
index 0000000..d72df2d
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Text3.odt
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Text4.odt b/benchmark/src/main/resources/performance/Text4.odt
new file mode 100644
index 0000000..15f208e
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Text4.odt
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Text6.odt b/benchmark/src/main/resources/performance/Text6.odt
new file mode 100644
index 0000000..61bd0d6
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Text6.odt
Binary files differ
diff --git a/benchmark/src/main/resources/performance/Text7.odt b/benchmark/src/main/resources/performance/Text7.odt
new file mode 100644
index 0000000..c691f63
--- /dev/null
+++ b/benchmark/src/main/resources/performance/Text7.odt
Binary files differ
diff --git a/benchmark/src/main/resources/performance/spreadsheet1.ods b/benchmark/src/main/resources/performance/spreadsheet1.ods
new file mode 100644
index 0000000..363bb89
--- /dev/null
+++ b/benchmark/src/main/resources/performance/spreadsheet1.ods
Binary files differ
diff --git a/benchmark/src/main/resources/performance/spreadsheet2.ods b/benchmark/src/main/resources/performance/spreadsheet2.ods
new file mode 100644
index 0000000..4876065
--- /dev/null
+++ b/benchmark/src/main/resources/performance/spreadsheet2.ods
Binary files differ
diff --git a/benchmark/src/main/resources/performance/spreadsheet3.ods b/benchmark/src/main/resources/performance/spreadsheet3.ods
new file mode 100644
index 0000000..60e984a
--- /dev/null
+++ b/benchmark/src/main/resources/performance/spreadsheet3.ods
Binary files differ
diff --git a/benchmark/src/main/resources/performance/spreadsheet4.ods b/benchmark/src/main/resources/performance/spreadsheet4.ods
new file mode 100644
index 0000000..a34f9ca
--- /dev/null
+++ b/benchmark/src/main/resources/performance/spreadsheet4.ods
Binary files differ
diff --git a/benchmark/src/main/resources/performance/spreadsheet5.ods b/benchmark/src/main/resources/performance/spreadsheet5.ods
new file mode 100644
index 0000000..fd4d56f
--- /dev/null
+++ b/benchmark/src/main/resources/performance/spreadsheet5.ods
Binary files differ
diff --git a/pom.xml b/pom.xml
index a20ea5a..c533260 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@ -110,7 +109,8 @@
         <module>odfdom</module>
         <module>validator</module>
         <module>simple</module>
-    </modules>
+        <module>benchmark</module>
+  </modules>
 
     <name>Apache ODF Toolkit</name>
     <description>
@@ -389,27 +389,27 @@
                                 <phase>prepare-package</phase>
                                 <configuration>
                                     <tasks>
-                                        <mkdir dir="${basedir}/target/${project.version}-bin" />
+                                        <mkdir dir="${basedir}/target/${project.version}-bin"/>
                                         <copy todir="${basedir}/target/${project.version}-bin" flatten="true">
                                               <fileset dir="${basedir}">
-                                                <include name="*.txt" />
-                                                <include name="KEYS" />
-                                                <include name="odfdom/target/*.jar" />
-                                                <include name="simple/target/*.jar" />
-                                                <include name="validator/target/*.?ar" />
-                                                <include name="xslt-runner/target/*.jar" />
-                                                <include name="xslt-runner-task/target/*.jar" />
-                                                <exclude name="**/target/**-javadoc.jar" />
-                                                <exclude name="**/target/**-sources.jar" />
-                                                <exclude name="**/target/**-jar-with-dependencies.jar" />
+                                                <include name="*.txt"/>
+                                                <include name="KEYS"/>
+                                                <include name="odfdom/target/*.jar"/>
+                                                <include name="simple/target/*.jar"/>
+                                                <include name="validator/target/*.?ar"/>
+                                                <include name="xslt-runner/target/*.jar"/>
+                                                <include name="xslt-runner-task/target/*.jar"/>
+                                                <exclude name="**/target/**-javadoc.jar"/>
+                                                <exclude name="**/target/**-sources.jar"/>
+                                                <exclude name="**/target/**-jar-with-dependencies.jar"/>
                                               </fileset>
                                         </copy>
-                                        <mkdir dir="${basedir}/target/${project.version}-docs" />
+                                        <mkdir dir="${basedir}/target/${project.version}-docs"/>
                                         <copy todir="${basedir}/target/${project.version}-docs" flatten="true">
                                             <fileset dir="${basedir}">
-                                                <include name="*.txt" />
-                                                <include name="KEYS" />
-                                                <include name="**/target/*-javadoc.jar" />
+                                                <include name="*.txt"/>
+                                                <include name="KEYS"/>
+                                                <include name="**/target/*-javadoc.jar"/>
                                             </fileset>
                                         </copy>
                                         </tasks>
@@ -425,32 +425,32 @@
                                     <tasks>
                                         <checksum algorithm="MD5" fileext=".md5">
                                               <fileset dir="${basedir}/target">
-                                                <include name="*.zip" />
-                                                <include name="*.tar.gz" />
-                                                <include name="*.tar.bz2" />
+                                                <include name="*.zip"/>
+                                                <include name="*.tar.gz"/>
+                                                <include name="*.tar.bz2"/>
                                               </fileset>
                                         </checksum>
                                         <checksum algorithm="SHA-512" fileext=".sha">
                                               <fileset dir="${basedir}/target">
-                                                <include name="*.zip" />
-                                                <include name="*.tar.gz" />
-                                                <include name="*.tar.bz2" />
+                                                <include name="*.zip"/>
+                                                <include name="*.tar.gz"/>
+                                                <include name="*.tar.bz2"/>
                                               </fileset>
                                         </checksum>
-                                        <checksum file="target/odftoolkit-${project.version}-src.zip" algorithm="SHA-512" property="checksum" />
+                                        <checksum file="target/odftoolkit-${project.version}-src.zip" algorithm="SHA-512" property="checksum"/>
                                         <copy todir="${basedir}/target/release/${project.version}/">
                                             <fileset dir="${basedir}/target">
-                                                <include name="*-source-release.*" />
+                                                <include name="*-source-release.*"/>
                                             </fileset>
                                         </copy>
                                         <copy todir="${basedir}/target/release/${project.version}/binaries">
                                             <fileset dir="${basedir}/target">
-                                                <include name="*-bin.*" />
+                                                <include name="*-bin.*"/>
                                             </fileset>
                                         </copy>
                                         <copy todir="${basedir}/target/release/${project.version}/docs">
                                             <fileset dir="${basedir}/target">
-                                                <include name="*-doc.*" />
+                                                <include name="*-doc.*"/>
                                             </fileset>
                                         </copy>
                                         <echo file="${basedir}/target/vote.txt">
@@ -475,12 +475,12 @@
                                             [ ] +1 Release this package as Apache ODF Toolkit ${project.version}
                                             [ ] -1 Do not release this package because...${line.separator}
                                         </echo>
-                                        <echo />
+                                        <echo/>
                                         <echo>
                                             The release candidate has been prepared in:    ${basedir}/target/${project.version}
 											A release vote template has been generated for you:    file://${basedir}/target/vote.txt
 										</echo>
-										<echo />
+										<echo/>
 									</tasks>
 								</configuration>
 							</execution>
@@ -515,4 +515,4 @@
 			</build>
 		</profile>
 	</profiles>
-</project>
+</project>
\ No newline at end of file
