diff --git a/mscore/mscore/actions.cpp b/mscore/mscore/actions.cpp
index 042ffc7..ef90a6a 100644
--- a/mscore/mscore/actions.cpp
+++ b/mscore/mscore/actions.cpp
@@ -106,6 +106,17 @@ Shortcut MuseScore::sc[] = {
       Shortcut(
          STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
          A_SCORE,
+         "file-part-export",
+         QT_TRANSLATE_NOOP("action","Export Parts"),
+         0,
+         Qt::WindowShortcut,
+         QT_TRANSLATE_NOOP("action","Export Parts..."),
+         QT_TRANSLATE_NOOP("action","Save a copy of the score's parts in various formats"),
+          fileSave_ICON
+         ),
+      Shortcut(
+         STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
+         A_SCORE,
          "file-reload",
          QT_TRANSLATE_NOOP("action","File reload"),
          0,                         // no shortcut, its an destructive non undoable operation
diff --git a/mscore/mscore/file.cpp b/mscore/mscore/file.cpp
index e496c1e..61b81b8 100644
--- a/mscore/mscore/file.cpp
+++ b/mscore/mscore/file.cpp
@@ -658,18 +658,34 @@ QStringList MuseScore::getOpenScoreNames(QString& dir, const QString& filter)
 //---------------------------------------------------------
 //   getSaveScoreName
 //---------------------------------------------------------
+QString MuseScore::getSaveScoreName(const QString& title,
+   QString& name, const QString& filter, QString* selectedFilter) 
+      {
+      return getSaveScoreName(title, name, filter, selectedFilter, false);
+}
 
 QString MuseScore::getSaveScoreName(const QString& title,
-   QString& name, const QString& filter, QString* selectedFilter)
+   QString& name, const QString& filter, QString* selectedFilter, bool selectFolder)
       {
       if (preferences.nativeDialogs) {
-            QString fn = QFileDialog::getSaveFileName(this,
-               title,
-               name,
-               filter,
-               selectedFilter
-               );
-            return fn;
+	    if (!selectFolder) {
+		    QString fn = QFileDialog::getSaveFileName(this,
+				    title,
+				    name,
+				    filter,
+				    selectedFilter
+				    );
+		    return fn;
+                    } else {
+		    QString fn = QFileDialog::getSaveFileName(this,
+				    title,
+				    name,
+				    filter,
+				    selectedFilter,
+				    QFileDialog::ShowDirsOnly
+				    );
+		    return fn;
+	    	   }
             }
 
       QFileInfo myScores(preferences.myScoresPath);
@@ -684,6 +700,9 @@ QString MuseScore::getSaveScoreName(const QString& title,
             saveScoreDialog->setOption(QFileDialog::DontUseNativeDialog, true);
             saveScoreDialog->setAcceptMode(QFileDialog::AcceptSave);
             }
+      if (selectFolder) {
+            saveScoreDialog->setFileMode(QFileDialog::Directory);
+      }
       // setup side bar urls
       QList<QUrl> urls;
       QString home = QDir::homePath();
@@ -697,8 +716,11 @@ QString MuseScore::getSaveScoreName(const QString& title,
       // saveScoreDialog->setDirectory(name);
       saveScoreDialog->selectFile(name);
       QStringList result;
-      connect(saveScoreDialog, SIGNAL(filterSelected(const QString&)),
-         SLOT(saveScoreDialogFilterSelected(const QString&)));
+
+      if (!selectFolder) {
+            connect(saveScoreDialog, SIGNAL(filterSelected(const QString&)),
+               SLOT(saveScoreDialogFilterSelected(const QString&)));
+      }
       if (saveScoreDialog->exec()) {
             result = saveScoreDialog->selectedFiles();
             *selectedFilter = saveScoreDialog->selectedNameFilter();
@@ -1391,6 +1413,91 @@ bool MuseScore::exportFile()
       }
 
 //---------------------------------------------------------
+//   exportParts
+//    return true on success
+//---------------------------------------------------------
+
+bool MuseScore::exportParts()
+      {
+      QStringList fl;
+      fl.append(tr("Uncompressed MuseScore Format (*.mscx)"));
+      fl.append(tr("MusicXML Format (*.xml)"));
+      fl.append(tr("Compressed MusicXML Format (*.mxl)"));
+      fl.append(tr("Standard MIDI File (*.mid)"));
+      fl.append(tr("PDF File (*.pdf)"));
+      fl.append(tr("PostScript File (*.ps)"));
+      fl.append(tr("PNG Bitmap Graphic (*.png)"));
+      fl.append(tr("Scalable Vector Graphic (*.svg)"));
+      fl.append(tr("Lilypond Format (*.ly)"));
+#ifdef HAS_AUDIOFILE
+      fl.append(tr("Wave Audio (*.wav)"));
+      fl.append(tr("Flac Audio (*.flac)"));
+      fl.append(tr("Ogg Vorbis Audio (*.ogg)"));
+#endif
+      fl.append(tr("MP3 Audio (*.mp3)"));
+      QString saveDialogTitle = tr("MuseScore: Export Parts");
+
+      QSettings settings;
+      if (lastSaveCopyDirectory.isEmpty())
+	    lastSaveCopyDirectory = settings.value("lastSaveCopyDirectory", preferences.myScoresPath).toString();
+      if (lastSaveDirectory.isEmpty())
+	    lastSaveDirectory = settings.value("lastSaveDirectory", preferences.myScoresPath).toString();
+      QString saveDirectory = lastSaveCopyDirectory;
+
+      if (saveDirectory.isEmpty()) {
+	    saveDirectory = preferences.myScoresPath;
+	    }
+
+      QString selectedFilter;
+      QString name = QString("");
+      QString filter = fl.join(";;");
+      QString fn = getSaveScoreName(saveDialogTitle, name, filter, &selectedFilter, true);
+      if (fn.isEmpty())
+	    return false;
+
+      lastSaveCopyDirectory = fn;
+
+      Score* thisScore = cs;
+      if (thisScore->parentScore() != NULL) {
+            thisScore = thisScore->parentScore();
+      }
+
+      foreach(Excerpt* e, *thisScore->excerpts())  {
+	    Score* pScore = e->score();
+            QString partfn = fn + QDir::separator() + thisScore->name() + "-" + pScore->name();
+	    QFileInfo fi(partfn);
+	    QString ext;
+	    if (selectedFilter.isEmpty())
+		    ext = fi.suffix();
+	    else {
+		    int idx = fl.indexOf(selectedFilter);
+		    if (idx != -1) {
+			    static const char* extensions[] = {
+				    "mscx", "xml", "mxl", "mid", "pdf", "ps", "png", "svg", "ly",
+#ifdef HAS_AUDIOFILE
+				    "wav", "flac", "ogg",
+#endif
+				    "mp3"
+			    };
+			    ext = extensions[idx];
+		    }
+	    }
+	    if (ext.isEmpty()) {
+		    QMessageBox::critical(this, tr("MuseScore: Export Parts"), tr("cannot determine file type"));
+		    return false;
+	    }
+
+	    if (fi.suffix() != ext)
+		    partfn += "." + ext;
+
+            if (!saveAs(pScore, true, partfn, ext)) return false;
+            }
+ 
+      QMessageBox::information(this, tr("MuseScore: Export Parts"), tr("Parts were successfully exported"));
+      return true;
+      }
+
+//---------------------------------------------------------
 //   saveAs
 //---------------------------------------------------------
 
@@ -1441,11 +1548,11 @@ bool MuseScore::saveAs(Score* cs, bool saveCopy, const QString& path, const QStr
             }
       else if (ext == "pdf") {
             // save as pdf file *.pdf
-            rv = savePsPdf(fn, QPrinter::PdfFormat);
+            rv = savePsPdf(cs, fn, QPrinter::PdfFormat);
             }
       else if (ext == "ps") {
             // save as postscript file *.ps
-            rv = savePsPdf(fn, QPrinter::PostScriptFormat);
+            rv = savePsPdf(cs, fn, QPrinter::PostScriptFormat);
             }
       else if (ext == "png") {
             // save as png file *.png
@@ -1479,6 +1586,11 @@ bool MuseScore::saveAs(Score* cs, bool saveCopy, const QString& path, const QStr
 
 bool MuseScore::savePsPdf(const QString& saveName, QPrinter::OutputFormat format)
       {
+      return savePsPdf(cs, saveName, format);
+}
+
+bool MuseScore::savePsPdf(Score* cs, const QString& saveName, QPrinter::OutputFormat format)
+      {
       const PageFormat* pf = cs->pageFormat();
       QPrinter printerDev(QPrinter::HighResolution);
 
diff --git a/mscore/mscore/musescore.cpp b/mscore/mscore/musescore.cpp
index 6e51197..134bf0a 100644
--- a/mscore/mscore/musescore.cpp
+++ b/mscore/mscore/musescore.cpp
@@ -675,6 +675,7 @@ MuseScore::MuseScore()
       _fileMenu->addAction(getAction("file-save-a-copy"));
       _fileMenu->addAction(getAction("file-save-selection"));
       _fileMenu->addAction(getAction("file-export"));
+      _fileMenu->addAction(getAction("file-part-export"));
       _fileMenu->addSeparator();
       _fileMenu->addAction(getAction("file-reload"));
       _fileMenu->addSeparator();
@@ -4006,6 +4007,8 @@ void MuseScore::cmd(QAction* a, const QString& cmd)
             saveFile();
       else if (cmd == "file-export")
             exportFile();
+      else if (cmd == "file-part-export")
+            exportParts();
       else if (cmd == "file-reload") {
             if (!cs->created() && !checkDirty(cs)) {
                   if (cv->editMode()) {
diff --git a/mscore/mscore/musescore.h b/mscore/mscore/musescore.h
index a6728e7..68bee3c 100644
--- a/mscore/mscore/musescore.h
+++ b/mscore/mscore/musescore.h
@@ -527,6 +527,8 @@ class MuseScore : public QMainWindow {
       QStringList getOpenScoreNames(QString& dir, const QString& filter);
       QString getSaveScoreName(const QString& title,
          QString& name, const QString& filter, QString* selectedFilter);
+      QString getSaveScoreName(const QString& title,
+         QString& name, const QString& filter, QString* selectedFilter, bool selectFolder);
       QString getStyleFilename(bool open, const QString& title = QString());
       QString getFotoFilename();
       QString getChordStyleFilename(bool open);
@@ -556,8 +558,10 @@ class MuseScore : public QMainWindow {
       void endCmd();
       void printFile();
       bool exportFile();
+      bool exportParts();
       bool saveAs(Score*, bool saveCopy, const QString& path, const QString& ext);
       bool savePsPdf(const QString& saveName, QPrinter::OutputFormat format);
+      bool savePsPdf(Score* cs, const QString& saveName, QPrinter::OutputFormat format);
       bool readScore(Score*, QString name);
       bool saveAs(Score*, bool saveCopy = false);
       bool saveSelection(Score*);
diff --git a/mscore/mscore/revision.h b/mscore/mscore/revision.h
index dc05aa9..e69de29 100644
--- a/mscore/mscore/revision.h
+++ b/mscore/mscore/revision.h
@@ -1 +0,0 @@
-4708M
\ No newline at end of file
