diff --git a/src/main/webapp/electron.js b/src/main/webapp/electron.js
index c95bc1b23c19dd1982e7d99c51bcfa2d08439176..3e5db6cc39f5e2be734e749691d1d85d68608102 100644
--- a/src/main/webapp/electron.js
+++ b/src/main/webapp/electron.js
@@ -185,7 +185,7 @@ app.on('ready', e =>
         argv.unshift(null)
     }
 
-	var validFormatRegExp = /^(pdf|svg|png|jpeg|jpg)$/;
+	var validFormatRegExp = /^(pdf|svg|png|jpeg|jpg|vsdx)$/;
 	
 	function argsRange(val) 
 	{
@@ -365,9 +365,11 @@ app.on('ready', e =>
 						
 						try
 						{
-							expArgs.xml = fs.readFileSync(curFile, (path.extname(curFile) === '.png') ? null : 'utf-8');
+							var ext = path.extname(curFile);
 							
-							if (path.extname(curFile) === '.png')
+							expArgs.xml = fs.readFileSync(curFile, ext === '.png'? null : 'utf-8');
+							
+							if (ext === '.png')
 							{
 								expArgs.xml = new Buffer(expArgs.xml).toString('base64');
 							}
@@ -407,7 +409,7 @@ app.on('ready', e =>
 											
 											try
 											{
-												fs.writeFileSync(outFileName, data, { flag: 'wx' });
+												fs.writeFileSync(outFileName, data, format == 'vsdx'? 'base64' : null, { flag: 'wx' });
 												console.log(curFile + ' -> ' + outFileName);
 											}
 											catch(e)
@@ -924,9 +926,63 @@ function writePngWithText(origBuff, key, text, compressed, base64encoded)
 	}
 }
 
+//TODO Create a lightweight html file similar to export3.html for exporting to vsdx
+function exportVsdx(event, args, directFinalize)
+{
+	let win = createWindow({
+		show : false
+	});
+    
+    win.webContents.on('did-finish-load', function()
+    {
+        win.webContents.send('export-vsdx', args);
+        
+        ipcMain.once('export-vsdx-finished', (evt, data) =>
+		{
+			var hasError = false;
+			
+			if (data == null)
+			{
+				hasError = true;
+			}
+			
+			//Set finalize here since it is call in the reply below
+			function finalize()
+			{
+				win.destroy();
+			};
+			
+			if (directFinalize === true)
+			{
+				event.finalize = finalize;
+			}
+			else
+			{
+				//Destroy the window after response being received by caller
+				ipcMain.once('export-finalize', finalize);
+			}
+			
+			if (hasError)
+			{
+				event.reply('export-error');
+			}
+			else
+			{
+				event.reply('export-success', data);
+			}
+		});
+    });
+};
+
 //TODO Use canvas to export images if math is not used to speedup export (no capturePage). Requires change to export3.html also
 function exportDiagram(event, args, directFinalize)
 {
+	if (args.format == 'vsdx')
+	{
+		exportVsdx(event, args, directFinalize);
+		return;
+	}
+	
 	var browser = null;
 	
 	try
diff --git a/src/main/webapp/js/diagramly/ElectronApp.js b/src/main/webapp/js/diagramly/ElectronApp.js
index 903e287897d5b4ee93d43e5987b0ca94271b82c6..c1b26434587b2be7c87d365c63308f28e6bfec05 100644
--- a/src/main/webapp/js/diagramly/ElectronApp.js
+++ b/src/main/webapp/js/diagramly/ElectronApp.js
@@ -410,6 +410,34 @@ mxStencilRegistry.allowEval = false;
 		{
 			this.loadArgs(argsObj)
 		})
+
+		var editorUi = this;
+		
+		ipcRenderer.on('export-vsdx', (event, argsObj) =>
+		{
+			var file = new LocalFile(editorUi, argsObj.xml, '');
+			
+			editorUi.fileLoaded(file);
+
+			try
+			{
+				editorUi.saveData = function(filename, format, data, mimeType, base64Encoded)
+				{
+					ipcRenderer.send('export-vsdx-finished', data);
+				};
+				
+				var expSuccess = new VsdxExport(editorUi).exportCurrentDiagrams();
+
+				if (!expSuccess)
+				{
+					ipcRenderer.send('export-vsdx-finished', null);
+				}
+			}
+			catch (e)
+			{
+				ipcRenderer.send('export-vsdx-finished', null);
+			}
+		})	
 	}
 	
 	App.prototype.loadArgs = function(argsObj)