diff --git a/lib/portfolio/exporter.php b/lib/portfolio/exporter.php
index ed1af2f45bc..cb73207751b 100644
--- a/lib/portfolio/exporter.php
+++ b/lib/portfolio/exporter.php
@@ -106,6 +106,13 @@ class portfolio_exporter {
     */
     private $alreadystolen;
 
+    /**
+    * files that the exporter has written to this temp area
+    * keep track of this in case of duplicates within one export
+    * see MDL-16390
+    */
+    private $newfilehashes;
+
     /**
     * construct a new exporter for use
     *
@@ -126,6 +133,7 @@ class portfolio_exporter {
         $this->navigation = $navigation;
         $this->caller->set('exporter', $this);
         $this->alreadystolen = array();
+        $this->newfilehashes = array();
     }
 
     /*
@@ -621,10 +629,15 @@ class portfolio_exporter {
     * @return new stored_file object
     */
     public function copy_existing_file($oldfile) {
+        if (array_key_exists($oldfile->get_contenthash(), $this->newfilehashes)) {
+            return $this->newfilehashes[$oldfile->get_contenthash()];
+        }
         $fs = get_file_storage();
         $file_record = $this->new_file_record_base($oldfile->get_filename());
         try {
-            return $fs->create_file_from_storedfile($file_record, $oldfile->get_id());
+            $newfile = $fs->create_file_from_storedfile($file_record, $oldfile->get_id());
+            $this->newfilehashes[$newfile->get_contenthash()] = $newfile;
+            return $newfile;
         } catch (file_exception $e) {
             return false;
         }