diff --git a/data/ui/mainwindow.xml b/data/ui/mainwindow.xml
index 1b1614d..9d05fbb 100644
--- a/data/ui/mainwindow.xml
+++ b/data/ui/mainwindow.xml
@@ -6,6 +6,7 @@
       <menuitem action="SaveProject" />
       <menuitem action="SaveProjectAs" />
       <menuitem action="RevertToSavedProject" />
+      <menuitem action="ExportProject" />
       <separator />
       <menuitem action="RenderProject" />
       <separator />
diff --git a/pitivi/mainwindow.py b/pitivi/mainwindow.py
index 1f49ce6..aa91a0f 100644
--- a/pitivi/mainwindow.py
+++ b/pitivi/mainwindow.py
@@ -259,6 +259,9 @@ class PitiviMainWindow(gtk.Window, Loggable):
             ("RevertToSavedProject", gtk.STOCK_REVERT_TO_SAVED, None,
             None, _("Reload the current project"), self._revertToSavedProjectCb),
 
+            ("ExportProject", gtk.STOCK_HARDDISK, _("Export Project"),
+            None, _("Export the current project"), self._exportProjectAsTarCb),
+
             ("ProjectSettings", gtk.STOCK_PROPERTIES, _("Project Settings"),
             None, _("Edit the project settings"), self._projectSettingsCb),
 
@@ -334,7 +337,7 @@ class PitiviMainWindow(gtk.Window, Loggable):
                 action.set_sensitive(True)
                 action.props.is_important = True
             elif action_name in [
-                "File", "Edit", "View", "Help",
+                "File", "ExportProject", "Edit", "View", "Help",
                 "About", "Quit", "ImportSourcesFolder",
                 "FullScreen", "FullScreenAlternate", "UserManual",
                 "ShowHideMainToolbar", "ShowHideTimelineToolbar",
@@ -564,6 +567,13 @@ class PitiviMainWindow(gtk.Window, Loggable):
     def _revertToSavedProjectCb(self, unused_action):
         return self.app.projectManager.revertToSavedProject()
 
+    def _exportProjectAsTarCb(self, unused_action):
+        uri = self._showExportDialog(self.app.current)
+        if uri is not None:
+            return self.app.projectManager.exportProject(self.app.current, uri)
+
+        return False
+
     def _projectSettingsCb(self, unused_action):
         self.showProjectSettingsDialog()
 
@@ -1065,6 +1075,50 @@ class PitiviMainWindow(gtk.Window, Loggable):
                     self.timeline_ui.pipeline_state = new
 
 ## other
+    def _showExportDialog(self, project):
+        self.log("Export requested")
+        chooser = gtk.FileChooserDialog(_("Export To..."),
+            self,
+            action=gtk.FILE_CHOOSER_ACTION_SAVE,
+            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+            gtk.STOCK_SAVE, gtk.RESPONSE_OK))
+
+        chooser.set_icon_name("pitivi")
+        chooser.set_select_multiple(False)
+        chooser.set_current_name(_("Untitled") + ".tar")
+        chooser.set_current_folder(self.settings.lastProjectFolder)
+        chooser.props.do_overwrite_confirmation = True
+
+        filt = gtk.FileFilter()
+        filt.set_name("Tar Archive")
+        filt.add_pattern("*.tar")
+        chooser.add_filter(filt)
+        default = gtk.FileFilter()
+        default.set_name(_("Detect Automatically"))
+        default.add_pattern("*")
+        chooser.add_filter(default)
+
+        response = chooser.run()
+        current_folder = chooser.get_current_folder()
+        if current_folder:
+            self.settings.lastProjectFolder = current_folder
+
+        if response == gtk.RESPONSE_OK:
+            self.log("User chose a URI to export project to")
+            # need to do this to work around bug in gst.uri_construct
+            # which escapes all /'s in path!
+            uri = "file://" + chooser.get_filename()
+            format = chooser.get_filter().get_name()
+            if format == _("Detect Automatically"):
+                format = None
+            self.log("uri:%s , format:%s", uri, format)
+            ret = uri
+        else:
+            self.log("User didn't choose a URI to export project to")
+            ret = None
+
+        chooser.destroy()
+        return ret
 
     def _showSaveAsDialog(self, project):
         self.log("Save URI requested")
diff --git a/pitivi/project.py b/pitivi/project.py
index 3bf3030..abd631d 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -29,6 +29,7 @@ import gst
 import gtk
 import gio
 import gobject
+import tarfile
 
 from time import time
 from datetime import datetime
@@ -261,6 +262,33 @@ class ProjectManager(Signallable, Loggable):
                     self.debug('Saved backup "%s"' % uri)
             return saved
 
+    def exportProject(self, project, uri):
+        """
+        Export a project to a *.tar archive which includes the project file
+        and all sources
+        """
+        # write project file to temporary file
+        if not project.name:
+            tmp_name = "project-file.export"
+        else:
+            tmp_name = "%s.export" % (project.name)
+
+        directory = os.path.dirname(uri)
+        tmp_uri = os.path.join(directory, tmp_name)
+        self.saveProject(project, tmp_uri, overwrite=True)
+
+        # create tar file
+        with tarfile.open(path_from_uri(uri), mode="w") as tar:
+            # add temporary project file
+            tar.add(path_from_uri(tmp_uri))
+            # add all source elements
+            for element in project.medialibrary.getSources():
+                tar.add(path_from_uri(element.get_uri()))
+
+        # remove temporary file
+        os.remove(path_from_uri(tmp_uri))
+        return True
+
     def closeRunningProject(self):
         """ close the current project """
         self.info("closing running project")
