Index: other-projects/the-macronizer/trunk/src/java/monogram/plugin/PluginManager.java
===================================================================
--- other-projects/the-macronizer/trunk/src/java/monogram/plugin/PluginManager.java	(revision 35722)
+++ other-projects/the-macronizer/trunk/src/java/monogram/plugin/PluginManager.java	(revision 35725)
@@ -25,4 +25,6 @@
         } else if (fileType.equalsIgnoreCase(".odt")) {
             return runPluginODT(fileView);
+        } else if (fileType.equalsIgnoreCase(".pptx")) {
+            return runPluginPPTX(fileView);
         } else {
             throw new UnsupportedOperationException("Not supported yet.");
@@ -44,3 +46,10 @@
         return plugin.run(fileView);
     }
+
+    private File runPluginPPTX(PluginConfiguration fileView)
+        throws Exception
+    {
+        Plugin plugin = new PluginPPTX(tmpdir);
+        return plugin.run(fileView);
+    }
 }
Index: other-projects/the-macronizer/trunk/src/java/monogram/plugin/PluginPPTX.java
===================================================================
--- other-projects/the-macronizer/trunk/src/java/monogram/plugin/PluginPPTX.java	(revision 35725)
+++ other-projects/the-macronizer/trunk/src/java/monogram/plugin/PluginPPTX.java	(revision 35725)
@@ -0,0 +1,90 @@
+package monogram.plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+
+import org.fuin.utils4j.Utils4J;
+
+import monogram.restorer.XMLRestorer;
+import util.FileUtil;
+
+public class PluginPPTX implements Plugin
+{
+    private final File tmpdir;
+    private final XMLRestorer restorer;
+
+    public PluginPPTX(File tmpdir) {
+        this.tmpdir = tmpdir;
+        restorer = new XMLRestorer();
+    }
+
+    public File run(PluginConfiguration configuration)
+        throws Exception
+    {
+        // Create a temporary directory and unzip the file to it
+        File unzipDir = createTmpDirectoryInTmp();
+        Utils4J.unzip(configuration.getFile(), unzipDir);
+        
+        // Restore each slide
+        String slideDirPath = unzipDir.getCanonicalPath() + File.separator + "ppt" + File.separator + "slides";
+        File slideDirectory = new File(slideDirPath);
+        for (File slideIn : slideDirectory.listFiles())
+        {
+            if (slideIn.isDirectory())
+            {
+                continue;
+            }
+
+            File slideOut = new File(slideDirPath + File.separator + "mi-tmp-slide.xml");
+
+            restorer.restore
+            (
+                slideIn,
+                "utf-8",
+                slideOut,
+                configuration.getPreserveExistingMacrons(),
+                configuration.getMarkupChangedWords()
+            );
+
+            //Delete the old slideX.xml and rename the restored document.
+            String slideName = slideIn.getName();
+            slideIn.delete();
+            slideOut.renameTo(new File(slideDirPath + File.separator + slideName));
+        }
+
+        //Create a file to store the zipped file.
+        File zipFile = File.createTempFile(FileUtil.TMP_FILE_PREFIX, configuration.getFileType(), tmpdir);
+
+        //Zip the file.
+        Utils4J.zipDir(unzipDir, null, zipFile);
+
+        //Delete zip directory.
+        if (unzipDir.getName().startsWith(FileUtil.TMP_FILE_PREFIX))
+        {
+            FileUtil.deleteFile(unzipDir);
+        }
+        
+        return zipFile;
+    }
+
+    private File createTmpDirectoryInTmp()
+        throws IOException
+    {
+        final int maxAttempts = 10;
+        int attempt = 0;
+
+        do
+        {
+            String random = UUID.randomUUID().toString();
+            File dir = new File(this.tmpdir + File.separator + FileUtil.TMP_FILE_PREFIX + random);
+
+            if (!dir.exists() && dir.mkdir())
+            {
+                return dir;
+            }
+        } while (++attempt < maxAttempts);
+
+        throw new IOException("Cound not create temp directory.");
+    }
+}
