diff --git a/src/api/UBLibraryAPI.cpp b/src/api/UBLibraryAPI.cpp
index 8d75a568..073ed404 100644
--- a/src/api/UBLibraryAPI.cpp
+++ b/src/api/UBLibraryAPI.cpp
@@ -40,7 +40,7 @@ UBLibraryAPI::~UBLibraryAPI()
 void UBLibraryAPI::addObject(QString pUrl, int width, int height, int x, int y, bool background)
 {
     if (UBApplication::boardController)
-        UBApplication::boardController->downloadURL(QUrl(pUrl), QPointF(x, y), QSize(width, height), background);
+        UBApplication::boardController->downloadURL(QUrl(pUrl), QString(), QPointF(x, y), QSize(width, height), background);
 
 }
 
diff --git a/src/api/UBWidgetUniboardAPI.cpp b/src/api/UBWidgetUniboardAPI.cpp
index b86e7aa1..32c62f32 100644
--- a/src/api/UBWidgetUniboardAPI.cpp
+++ b/src/api/UBWidgetUniboardAPI.cpp
@@ -201,7 +201,7 @@ void UBWidgetUniboardAPI::addObject(QString pUrl, int width, int height, int x,
     if (UBApplication::boardController->activeScene() != mScene)
         return;
 
-    UBApplication::boardController->downloadURL(QUrl(pUrl), QPointF(x, y), QSize(width, height), background);
+    UBApplication::boardController->downloadURL(QUrl(pUrl), QString(), QPointF(x, y), QSize(width, height), background);
 
 }
 
@@ -506,7 +506,7 @@ void UBWidgetUniboardAPI::ProcessDropEvent(QGraphicsSceneDragDropEvent *event)
             sDownloadFileDesc desc;
             desc.dest = sDownloadFileDesc::graphicsWidget;
             desc.modal = true;
-            desc.url = url;
+            desc.srcUrl = url;
             desc.currentSize = 0;
             desc.name = QFileInfo(url).fileName();
             desc.totalSize = 0; // The total size will be retrieved during the download
diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp
index 949a5b97..b269b8fa 100644
--- a/src/board/UBBoardController.cpp
+++ b/src/board/UBBoardController.cpp
@@ -132,7 +132,7 @@ void UBBoardController::init()
             , this, SLOT(lastWindowClosed()));
 
     connect(UBDownloadManager::downloadManager(), SIGNAL(downloadModalFinished()), this, SLOT(onDownloadModalFinished()));
-    connect(UBDownloadManager::downloadManager(), SIGNAL(addDownloadedFileToBoard(bool,QUrl,QString,QByteArray,QPointF,QSize,bool)), this, SLOT(downloadFinished(bool,QUrl,QString,QByteArray,QPointF,QSize,bool)));
+    connect(UBDownloadManager::downloadManager(), SIGNAL(addDownloadedFileToBoard(bool,QUrl,QUrl,QString,QByteArray,QPointF,QSize,bool)), this, SLOT(downloadFinished(bool,QUrl,QUrl,QString,QByteArray,QPointF,QSize,bool)));
 
     UBDocumentProxy* doc = UBPersistenceManager::persistenceManager()->createDocument();
 
@@ -563,7 +563,12 @@ UBGraphicsItem *UBBoardController::duplicateItem(UBItem *item)
     }
 
     UBMimeType::Enum itemMimeType;
-    QString contentTypeHeader = UBFileSystemUtils::mimeTypeFromFileName(item->sourceUrl().toLocalFile());
+
+    QString srcFile = item->sourceUrl().toLocalFile();
+    if (srcFile.isEmpty())
+        srcFile = item->sourceUrl().toString();
+
+    QString contentTypeHeader = UBFileSystemUtils::mimeTypeFromFileName(srcFile);
     if(NULL != qgraphicsitem_cast<UBGraphicsGroupContainerItem*>(commonItem))
         itemMimeType = UBMimeType::Group;
     else 
@@ -588,8 +593,9 @@ UBGraphicsItem *UBBoardController::duplicateItem(UBItem *item)
             if (mitem)
             {
                 sourceUrl = mitem->mediaFileUrl();
+                downloadURL(sourceUrl, srcFile, itemPos, QSize(itemSize.width(), itemSize.height()), false, false);    
             }
-        }break;
+        }return NULL; // async operation
 
     case UBMimeType::VectorImage:
         {
@@ -662,7 +668,7 @@ UBGraphicsItem *UBBoardController::duplicateItem(UBItem *item)
     if (retItem)
         return retItem;
 
-    UBItem *createdItem = downloadFinished(true, sourceUrl, contentTypeHeader, pData, itemPos, QSize(itemSize.width(), itemSize.height()), false);
+    UBItem *createdItem = downloadFinished(true, sourceUrl, sourceUrl, contentTypeHeader, pData, itemPos, QSize(itemSize.width(), itemSize.height()), false);
     if (createdItem)
     {
         createdItem->setSourceUrl(item->sourceUrl());
@@ -676,6 +682,7 @@ UBGraphicsItem *UBBoardController::duplicateItem(UBItem *item)
 
         retItem = dynamic_cast<UBGraphicsItem *>(createdItem);
     }
+
     return retItem;
 }
 
@@ -961,7 +968,7 @@ void UBBoardController::groupButtonClicked()
     }
 }
 
-void UBBoardController::downloadURL(const QUrl& url, const QPointF& pPos, const QSize& pSize, bool isBackground, bool internalData)
+void UBBoardController::downloadURL(const QUrl& url, QString contentSourceUrl, const QPointF& pPos, const QSize& pSize, bool isBackground, bool internalData)
 {
     qDebug() << "something has been dropped on the board! Url is: " << url.toString();
     QString sUrl = url.toString();
@@ -972,7 +979,7 @@ void UBBoardController::downloadURL(const QUrl& url, const QPointF& pPos, const
 
     if(sUrl.startsWith("uniboardTool://"))
     {
-        downloadFinished(true, url, "application/vnd.mnemis-uniboard-tool", QByteArray(), pPos, pSize, isBackground);
+        downloadFinished(true, url, QUrl(), "application/vnd.mnemis-uniboard-tool", QByteArray(), pPos, pSize, isBackground);
     }
     else if (sUrl.startsWith("file://") || sUrl.startsWith("/"))
     {
@@ -985,22 +992,37 @@ void UBBoardController::downloadURL(const QUrl& url, const QPointF& pPos, const
                 || contentType.startsWith("application/widget")
                 || contentType.startsWith("application/vnd.apple-widget");
 
-        QFile file(fileName);
-
         if (shouldLoadFileData)
+        {
+            QFile file(fileName);
             file.open(QIODevice::ReadOnly);
-
-        downloadFinished(true, formedUrl, contentType, file.readAll(), pPos, pSize, isBackground, internalData);
-
-        if (shouldLoadFileData)
+            downloadFinished(true, formedUrl, QUrl(), contentType, file.readAll(), pPos, pSize, isBackground, internalData);
             file.close();
+        }
+        else
+        {
+            // media items should be copyed in separate thread
+
+            sDownloadFileDesc desc;
+            desc.modal = false;
+            desc.srcUrl = sUrl;
+            desc.originalSrcUrl = contentSourceUrl;
+            desc.currentSize = 0;
+            desc.name = QFileInfo(url.toString()).fileName();
+            desc.totalSize = 0; // The total size will be retrieved during the download
+            desc.pos = pPos;
+            desc.size = pSize;
+            desc.isBackground = isBackground;
+
+            UBDownloadManager::downloadManager()->addFileToDownload(desc);
+        }
     }
     else
     {
         // When we fall there, it means that we are dropping something from the web to the board
         sDownloadFileDesc desc;
         desc.modal = true;
-        desc.url = url.toString();
+        desc.srcUrl = url.toString();
         desc.currentSize = 0;
         desc.name = QFileInfo(url.toString()).fileName();
         desc.totalSize = 0; // The total size will be retrieved during the download
@@ -1023,7 +1045,7 @@ void UBBoardController::downloadURL(const QUrl& url, const QPointF& pPos, const
 }
 
 
-UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader,
+UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pContentTypeHeader,
                                             QByteArray pData, QPointF pPos, QSize pSize,
                                             bool isBackground, bool internalData)
 {
@@ -1158,11 +1180,9 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
         qDebug() << "accepting mime type" << mimeType << "as video";
 
         UBGraphicsMediaItem *mediaVideoItem = 0;
-
+        QUuid uuid = QUuid::createUuid();
         if (pData.length() > 0)
         {
-            QUuid uuid = QUuid::createUuid();
-
             QString destFile;
             bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), 
                 sourceUrl.toString(),
@@ -1179,16 +1199,19 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
             QUrl url = QUrl::fromLocalFile(destFile);
 
             mediaVideoItem = mActiveScene->addMedia(url, false, pPos);
-
-            mediaVideoItem->setSourceUrl(sourceUrl);
-            mediaVideoItem->setUuid(uuid);
         }
         else
         {
-            mediaVideoItem = addVideo(sourceUrl, false, pPos);
+            qDebug() << sourceUrl.toString();
+            mediaVideoItem = addVideo(sourceUrl, false, pPos, true);
         }
 
         if(mediaVideoItem){
+            if (contentUrl.isEmpty())
+                mediaVideoItem->setSourceUrl(sourceUrl);
+            else 
+                mediaVideoItem->setSourceUrl(contentUrl);
+            mediaVideoItem->setUuid(uuid);
             connect(this, SIGNAL(activeSceneChanged()), mediaVideoItem, SLOT(activeSceneChanged()));
         }
 
@@ -1202,10 +1225,9 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
 
         UBGraphicsMediaItem *audioMediaItem = 0;
 
+        QUuid uuid = QUuid::createUuid();
         if (pData.length() > 0)
         {
-            QUuid uuid = QUuid::createUuid();
-
             QString destFile;
             bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), 
                 sourceUrl.toString(),
@@ -1222,16 +1244,18 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
             QUrl url = QUrl::fromLocalFile(destFile);
 
             audioMediaItem = mActiveScene->addMedia(url, false, pPos);
-
-            audioMediaItem->setSourceUrl(sourceUrl);
-            audioMediaItem->setUuid(uuid);
         }
         else
         {
-            audioMediaItem = addAudio(sourceUrl, false, pPos);
+            audioMediaItem = addAudio(sourceUrl, false, pPos, true);
         }
 
         if(audioMediaItem){
+            if (contentUrl.isEmpty())
+                audioMediaItem->setSourceUrl(sourceUrl);
+            else 
+                audioMediaItem->setSourceUrl(contentUrl);
+            audioMediaItem->setUuid(uuid);
             connect(this, SIGNAL(activeSceneChanged()), audioMediaItem, SLOT(activeSceneChanged()));
         }
 
@@ -2027,23 +2051,28 @@ void UBBoardController::grabScene(const QRectF& pSceneRect)
     }
 }
 
-UBGraphicsMediaItem* UBBoardController::addVideo(const QUrl& pSourceUrl, bool startPlay, const QPointF& pos)
+UBGraphicsMediaItem* UBBoardController::addVideo(const QUrl& pSourceUrl, bool startPlay, const QPointF& pos, bool bUseSource)
 {
     QUuid uuid = QUuid::createUuid();
     QUrl concreteUrl = pSourceUrl;
 
-    QString destFile;
-    bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), 
-                pSourceUrl.toLocalFile(),
-                UBPersistenceManager::videoDirectory,
-                uuid,
-                destFile);
-    if (!b)
+    // media file is not in document folder yet
+    if (!bUseSource)
     {
-        showMessage(tr("Add file operation failed: file copying error"));
-        return NULL;
-    }
-    concreteUrl = QUrl::fromLocalFile(destFile);
+        QString destFile;
+        bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), 
+                    pSourceUrl.toLocalFile(),
+                    UBPersistenceManager::videoDirectory,
+                    uuid,
+                    destFile);
+        if (!b)
+        {
+            showMessage(tr("Add file operation failed: file copying error"));
+            return NULL;
+        }
+        concreteUrl = QUrl::fromLocalFile(destFile);
+    }// else we just use source Url.
+
 
     UBGraphicsMediaItem* vi = mActiveScene->addMedia(concreteUrl, startPlay, pos);
     selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
@@ -2057,23 +2086,27 @@ UBGraphicsMediaItem* UBBoardController::addVideo(const QUrl& pSourceUrl, bool st
 
 }
 
-UBGraphicsMediaItem* UBBoardController::addAudio(const QUrl& pSourceUrl, bool startPlay, const QPointF& pos)
+UBGraphicsMediaItem* UBBoardController::addAudio(const QUrl& pSourceUrl, bool startPlay, const QPointF& pos, bool bUseSource)
 {
     QUuid uuid = QUuid::createUuid();
     QUrl concreteUrl = pSourceUrl;
 
-    QString destFile;
-    bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), 
-                pSourceUrl.toLocalFile(), 
-                UBPersistenceManager::audioDirectory,
-                uuid,
-                destFile);
-    if (!b)
+    // media file is not in document folder yet
+    if (!bUseSource)
     {
-        showMessage(tr("Add file operation failed: file copying error"));
-        return NULL;
-    }
-    concreteUrl = QUrl::fromLocalFile(destFile);
+        QString destFile;
+        bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), 
+            pSourceUrl.toLocalFile(),
+            UBPersistenceManager::audioDirectory,
+            uuid,
+            destFile);
+        if (!b)
+        {
+            showMessage(tr("Add file operation failed: file copying error"));
+            return NULL;
+        }
+        concreteUrl = QUrl::fromLocalFile(destFile);
+    }// else we just use source Url.
 
     UBGraphicsMediaItem* ai = mActiveScene->addMedia(concreteUrl, startPlay, pos);
     selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
@@ -2247,7 +2280,7 @@ void UBBoardController::processMimeData(const QMimeData* pMimeData, const QPoint
 
         if("" != url)
         {
-            downloadURL(url, pPos);
+            downloadURL(url, QString(), pPos);
             return;
         }
     }
@@ -2267,7 +2300,7 @@ void UBBoardController::processMimeData(const QMimeData* pMimeData, const QPoint
         foreach(const QUrl url, urls){
             QPointF pos(pPos + QPointF(index * 15, index * 15));
 
-            downloadURL(url, pos, QSize(), false,  internalData);
+            downloadURL(url, QString(), pos, QSize(), false,  internalData);
             index++;
         }
 
@@ -2293,7 +2326,7 @@ void UBBoardController::processMimeData(const QMimeData* pMimeData, const QPoint
             // Sometimes, it is possible to have an URL as text. we check here if it is the case
             QString qsTmp = pMimeData->text().remove(QRegExp("[\\0]"));
             if(qsTmp.startsWith("http")){
-                downloadURL(QUrl(qsTmp), pPos);
+                downloadURL(QUrl(qsTmp), QString(), pPos);
             }
             else{
                 mActiveScene->addTextHtml(pMimeData->html(), pPos);
@@ -2307,7 +2340,7 @@ void UBBoardController::processMimeData(const QMimeData* pMimeData, const QPoint
                 QString qsUrl = UBPlatformUtils::urlFromClipboard();
                 if("" != qsUrl){
                     // We finally got the url of the dropped ressource! Let's import it!
-                    downloadURL(qsUrl, pPos);
+                    downloadURL(qsUrl, qsUrl, pPos);
                     return;
                 }
 #endif
diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h
index 9d810811..d7f44e37 100644
--- a/src/board/UBBoardController.h
+++ b/src/board/UBBoardController.h
@@ -193,8 +193,8 @@ class UBBoardController : public UBDocumentContainer
         void firstScene();
         void lastScene();
         void groupButtonClicked();
-        void downloadURL(const QUrl& url, const QPointF& pPos = QPointF(0.0, 0.0), const QSize& pSize = QSize(), bool isBackground = false, bool internalData = false);
-        UBItem *downloadFinished(bool pSuccess, QUrl sourceUrl, QString pHeader,
+        void downloadURL(const QUrl& url, QString contentSourceUrl = QString(), const QPointF& pPos = QPointF(0.0, 0.0), const QSize& pSize = QSize(), bool isBackground = false, bool internalData = false);
+        UBItem *downloadFinished(bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pHeader,
                                  QByteArray pData, QPointF pPos, QSize pSize,
                                  bool isBackground = false, bool internalData = false);
         void changeBackground(bool isDark, bool isCrossed);
@@ -210,8 +210,8 @@ class UBBoardController : public UBDocumentContainer
         void setRegularPageSize(bool checked);
         void stylusToolChanged(int tool);
         void grabScene(const QRectF& pSceneRect);
-        UBGraphicsMediaItem* addVideo(const QUrl& pUrl, bool startPlay, const QPointF& pos);
-        UBGraphicsMediaItem* addAudio(const QUrl& pUrl, bool startPlay, const QPointF& pos);
+        UBGraphicsMediaItem* addVideo(const QUrl& pUrl, bool startPlay, const QPointF& pos, bool bUseSource = false);
+        UBGraphicsMediaItem* addAudio(const QUrl& pUrl, bool startPlay, const QPointF& pos, bool bUseSource = false);
         UBGraphicsWidgetItem *addW3cWidget(const QUrl& pUrl, const QPointF& pos);
 
         void cut();
diff --git a/src/board/UBBoardPaletteManager.cpp b/src/board/UBBoardPaletteManager.cpp
index 2652bb15..612813cd 100644
--- a/src/board/UBBoardPaletteManager.cpp
+++ b/src/board/UBBoardPaletteManager.cpp
@@ -995,6 +995,7 @@ void UBBoardPaletteManager::startDownloads()
         mDownloadInProgress = true;
         mpDownloadWidget->setVisibleState(true);
         mRightPalette->addTab(mpDownloadWidget);
+        mpDownloadWidget;
     }
 }
 
diff --git a/src/board/UBFeaturesController.cpp b/src/board/UBFeaturesController.cpp
index a9bbeb08..049ee301 100644
--- a/src/board/UBFeaturesController.cpp
+++ b/src/board/UBFeaturesController.cpp
@@ -711,7 +711,7 @@ void UBFeaturesController::addItemToPage(const UBFeature &item)
 
 void UBFeaturesController::addItemAsBackground(const UBFeature &item)
 {
-    UBApplication::boardController->downloadURL( item.getFullPath(), QPointF(), QSize(), true );
+    UBApplication::boardController->downloadURL( item.getFullPath(), QString(), QPointF(), QSize(), true );
 }
 
 UBFeature UBFeaturesController::getDestinationFeatureForUrl( const QUrl &url )
diff --git a/src/core/UBDownloadManager.cpp b/src/core/UBDownloadManager.cpp
index 4127851f..e120038a 100644
--- a/src/core/UBDownloadManager.cpp
+++ b/src/core/UBDownloadManager.cpp
@@ -14,12 +14,79 @@
  */
 #include "UBDownloadManager.h"
 #include "core/UBApplication.h"
+#include "core/UBPersistenceManager.h"
 #include "gui/UBMainWindow.h"
 #include "board/UBBoardController.h"
 #include "board/UBBoardPaletteManager.h"
+#include "frameworks/UBFileSystemUtils.h"
 
 #include "core/memcheck.h"
 
+
+UBAsyncLocalFileDownloader::UBAsyncLocalFileDownloader(sDownloadFileDesc desc, QObject *parent)
+: QThread(parent)
+, mDesc(desc)
+, m_bAborting(false)
+{
+
+}
+
+UBAsyncLocalFileDownloader *UBAsyncLocalFileDownloader::download()
+{
+    if (!QFile::exists(QUrl(mDesc.srcUrl).toLocalFile())) {
+        qDebug() << "file" << mDesc.srcUrl << "does not present in fs";
+        return this;
+    }
+
+    start();
+
+    return this;
+}
+
+void UBAsyncLocalFileDownloader::run()
+{
+
+    QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(mDesc.srcUrl);
+
+    int position=mimeType.indexOf(";");
+    if(position != -1)
+        mimeType=mimeType.left(position);
+
+    UBMimeType::Enum itemMimeType = UBFileSystemUtils::mimeTypeFromString(mimeType);
+
+
+    QString destDirectory;
+    if (UBMimeType::Video == itemMimeType)
+        destDirectory = UBPersistenceManager::videoDirectory;
+    else 
+        if (UBMimeType::Audio == itemMimeType)
+            destDirectory = UBPersistenceManager::audioDirectory;
+
+    if (mDesc.originalSrcUrl.isEmpty())
+        mDesc.originalSrcUrl = mDesc.srcUrl;
+
+    QString uuid = QUuid::createUuid();
+    UBPersistenceManager::persistenceManager()->addFileToDocument(UBApplication::boardController->selectedDocument(), 
+        QUrl(mDesc.srcUrl).toLocalFile(),
+        destDirectory,
+        uuid,
+        mTo,
+        NULL);
+
+    if (m_bAborting)
+    {
+        if (QFile::exists(mTo))
+            QFile::remove(mTo);
+    }
+    else
+        emit signal_asyncCopyFinished(mDesc.id, !mTo.isEmpty(), QUrl::fromLocalFile(mTo), QUrl::fromLocalFile(mDesc.originalSrcUrl), "", NULL, mDesc.pos, mDesc.size, mDesc.isBackground);
+}
+
+void UBAsyncLocalFileDownloader::abort()
+{
+    m_bAborting = true;
+}
+
 /** The unique instance of the download manager */
 static UBDownloadManager* pInstance = NULL;
 
@@ -100,7 +167,7 @@ void UBDownloadManager::init()
 {
     mCrntDL.clear();
     mPendingDL.clear();
-    mReplies.clear();
+    mDownloads.clear();
     mLastID = 1;
     mDLAvailability.clear();
     for(int i=0; i<SIMULTANEOUS_DOWNLOAD; i++)
@@ -193,7 +260,8 @@ void UBDownloadManager::onDownloadProgress(int id, qint64 received, qint64 total
  * \brief Called when the download of the given file is finished
  * @param desc as the current downloaded file description
  */
-void UBDownloadManager::onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground)
+
+void UBDownloadManager::onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground)
 {
 //    Temporary data for dnd do not delete it please
     Q_UNUSED(pPos)
@@ -209,9 +277,9 @@ void UBDownloadManager::onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl
                 desc.contentTypeHeader = pContentTypeHeader;
                 emit downloadFinished(pSuccess, desc, pData);
 
-            } else if(desc.modal) {
+            } else if(desc.dest == sDownloadFileDesc::board) {
                 // The downloaded file is modal so we must put it on the board
-                emit addDownloadedFileToBoard(pSuccess, sourceUrl, pContentTypeHeader, pData, pPos, pSize, isBackground);
+                emit addDownloadedFileToBoard(pSuccess, sourceUrl, contentUrl, pContentTypeHeader, pData, pPos, pSize, isBackground);
             }
             else
             {
@@ -259,7 +327,7 @@ void UBDownloadManager::updateFileCurrentSize(int id, qint64 received, qint64 to
                 mCrntDL.remove(i);
 
                 // Here we don't forget to remove the reply related to the finished download
-                mReplies.remove(id);
+                mDownloads.remove(id);
 
                 // Free the download slot used by the finished file
                 for(int j=0; j<mDLAvailability.size();j++)
@@ -302,15 +370,28 @@ void UBDownloadManager::updateFileCurrentSize(int id, qint64 received, qint64 to
  */
 void UBDownloadManager::startFileDownload(sDownloadFileDesc desc)
 {
-    UBDownloadHttpFile* http = new UBDownloadHttpFile(desc.id, this);
-    connect(http, SIGNAL(downloadProgress(int, qint64,qint64)), this, SLOT(onDownloadProgress(int,qint64,qint64)));
-    connect(http, SIGNAL(downloadFinished(int, bool, QUrl, QString, QByteArray, QPointF, QSize, bool)), this, SLOT(onDownloadFinished(int, bool, QUrl, QString, QByteArray, QPointF, QSize, bool)));
-
-    //the desc.url is encoded. So we have to decode it before.
-    QUrl url;
-    url.setEncodedUrl(desc.url.toUtf8());
-    // We send here the request and store its reply in order to be able to cancel it if needed
-    mReplies[desc.id] = http->get(url, desc.pos, desc.size, desc.isBackground);
+    if (desc.srcUrl.startsWith("file://") || desc.srcUrl.startsWith("/"))
+    {
+        UBAsyncLocalFileDownloader * cpHelper = new UBAsyncLocalFileDownloader(desc, this);
+        connect(cpHelper, SIGNAL(signal_asyncCopyFinished(int, bool, QUrl, QUrl, QString, QByteArray, QPointF, QSize, bool)), this, SLOT(onDownloadFinished(int, bool, QUrl, QUrl,QString, QByteArray, QPointF, QSize, bool)));
+        QObject *res = dynamic_cast<QObject *>(cpHelper->download());
+        if (!res)
+            delete res;
+        else
+            mDownloads[desc.id] = res;
+    }
+    else
+    {    
+        UBDownloadHttpFile* http = new UBDownloadHttpFile(desc.id, this);
+        connect(http, SIGNAL(downloadProgress(int, qint64,qint64)), this, SLOT(onDownloadProgress(int,qint64,qint64)));
+        connect(http, SIGNAL(downloadFinished(int, bool, QUrl, QUrl, QString, QByteArray, QPointF, QSize, bool)), this, SLOT(onDownloadFinished(int, bool, QUrl, QUrl, QString, QByteArray, QPointF, QSize, bool)));
+    
+        //the desc.srcUrl is encoded. So we have to decode it before.
+        QUrl url;
+        url.setEncodedUrl(desc.srcUrl.toUtf8());
+        // We send here the request and store its reply in order to be able to cancel it if needed
+        mDownloads[desc.id] = dynamic_cast<QObject *>(http->get(url, desc.pos, desc.size, desc.isBackground));
+    } 
 }
 
 /**
@@ -356,10 +437,18 @@ void UBDownloadManager::checkIfModalRemains()
 void UBDownloadManager::cancelDownloads()
 {
     // Stop the current downloads
-    QMap<int, QNetworkReply*>::iterator it = mReplies.begin();
-    for(; it!=mReplies.end();it++)
+    QMap<int, QObject*>::iterator it = mDownloads.begin();
+    for(; it!=mDownloads.end();it++)
     {
-        dynamic_cast<QNetworkReply*>(it.value())->abort();
+        QNetworkReply *netReply = dynamic_cast<QNetworkReply*>(it.value());
+        if (netReply)
+            netReply->abort();
+        else
+        {        
+            UBAsyncLocalFileDownloader *localDownload = dynamic_cast<UBAsyncLocalFileDownloader *>(it.value());
+            if (localDownload)
+                localDownload->abort();
+        }
     }
 
     // Clear all the lists
@@ -372,7 +461,8 @@ void UBDownloadManager::cancelDownloads()
 
 void UBDownloadManager::onDownloadError(int id)
 {
-    QNetworkReply* pReply = mReplies.value(id);
+    QNetworkReply *pReply = dynamic_cast<QNetworkReply *>(mDownloads.value(id));
+    
     if(NULL != pReply)
     {
         // Check which error occured:
@@ -402,9 +492,25 @@ void UBDownloadManager::finishDownloads(bool cancel)
 
 void UBDownloadManager::cancelDownload(int id)
 {
+    if (!mDownloads.size())
+        return;
+   
     // Stop the download
-    mReplies[id]->abort();
-    mReplies.remove(id);
+
+    QNetworkReply *pNetworkDownload = dynamic_cast<QNetworkReply *>(mDownloads[id]);
+    if (pNetworkDownload)
+        pNetworkDownload->abort();
+    else
+    {
+        UBAsyncLocalFileDownloader *pLocalDownload = dynamic_cast<UBAsyncLocalFileDownloader *>(mDownloads[id]);
+        if (pLocalDownload)
+        {
+            if (pLocalDownload->isRunning())
+                pLocalDownload->abort();                          
+        }
+    }
+
+    mDownloads.remove(id);
 
     // Remove the canceled download from the download lists
     bool bFound = false;
@@ -494,7 +600,7 @@ void UBDownloadHttpFile::onDownloadFinished(bool pSuccess, QUrl sourceUrl, QStri
     if(pSuccess)
     {
         // Notify the end of the download
-        emit downloadFinished(mId, pSuccess, sourceUrl, pContentTypeHeader, pData, pPos, pSize, isBackground);
+        emit downloadFinished(mId, pSuccess, sourceUrl, sourceUrl, pContentTypeHeader, pData, pPos, pSize, isBackground);
     }
     else
     {
diff --git a/src/core/UBDownloadManager.h b/src/core/UBDownloadManager.h
index 2b5c52c0..cefa8f40 100644
--- a/src/core/UBDownloadManager.h
+++ b/src/core/UBDownloadManager.h
@@ -52,7 +52,8 @@ struct sDownloadFileDesc
     int id;
     int totalSize;
     int currentSize;
-    QString url;
+    QString srcUrl;
+    QString originalSrcUrl;
     QString contentTypeHeader;
     bool modal;
     QPointF pos;        // For board drop only
@@ -75,7 +76,7 @@ public:
 
 signals:
     void downloadProgress(int id, qint64 current,qint64 total);
-    void downloadFinished(int id, bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
+    void downloadFinished(int id, bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
     void downloadError(int id);
 
 private slots:
@@ -86,6 +87,28 @@ private:
     int mId;
 };
 
+class UBAsyncLocalFileDownloader : public QThread
+{
+    Q_OBJECT
+public:
+    UBAsyncLocalFileDownloader(sDownloadFileDesc desc, QObject *parent = 0);
+
+    UBAsyncLocalFileDownloader *download();    
+    void run();
+    void abort();
+
+signals:
+    void finished(QString srcUrl, QString resUrl);
+    void signal_asyncCopyFinished(int id, bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
+
+
+private:
+    sDownloadFileDesc mDesc;
+    bool m_bAborting;
+    QString mFrom;
+    QString mTo;
+};
+
 class UBDownloadManager : public QObject
 {
     Q_OBJECT
@@ -108,7 +131,7 @@ signals:
     void downloadFinished(bool pSuccess, int id, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData);
     void downloadFinished(bool pSuccess, sDownloadFileDesc desc, QByteArray pData);
     void downloadModalFinished();
-    void addDownloadedFileToBoard(bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
+    void addDownloadedFileToBoard(bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
     void addDownloadedFileToLibrary(bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData);
     void cancelAllDownloads();
     void allDownloadsFinished();
@@ -116,7 +139,7 @@ signals:
 private slots:
     void onUpdateDownloadLists();
     void onDownloadProgress(int id, qint64 received, qint64 total);
-    void onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
+    void onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl, QUrl contentUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
     void onDownloadError(int id);
 
 private:
@@ -138,7 +161,7 @@ private:
     /** The current download availability (-1 = free, otherwise the file ID is recorded)*/
     QVector<int> mDLAvailability;
     /** A map containing the replies of the GET operations */
-    QMap<int, QNetworkReply*> mReplies;
+    QMap<int, QObject*> mDownloads;
 };
 
 #endif // UBDOWNLOADMANAGER_H
diff --git a/src/domain/UBGraphicsMediaItem.cpp b/src/domain/UBGraphicsMediaItem.cpp
index 1faba0ce..9d3c8705 100644
--- a/src/domain/UBGraphicsMediaItem.cpp
+++ b/src/domain/UBGraphicsMediaItem.cpp
@@ -73,7 +73,11 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte
 
     mMediaObject = new Phonon::MediaObject(this);
 
-    if (pMediaFileUrl.toLocalFile().contains("videos")) 
+    QString mediaPath = pMediaFileUrl.toString();
+    if ("" == mediaPath)
+        mediaPath = pMediaFileUrl.toLocalFile();
+
+    if (mediaPath.toLower().contains("videos")) 
     {
         mMediaType = mediaType_Video;
 
@@ -91,7 +95,7 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte
         haveLinkedImage = true;
     }
     else    
-    if (pMediaFileUrl.toLocalFile().contains("audios"))
+    if (mediaPath.toLower().contains("audios"))
     {
         mMediaType = mediaType_Audio;
         mAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
@@ -191,7 +195,7 @@ void UBGraphicsMediaItem::setSourceUrl(const QUrl &pSourceUrl)
     UBAudioPresentationWidget* pAudioWidget = dynamic_cast<UBAudioPresentationWidget*>(mAudioWidget);
     if (pAudioWidget)
     {
-        pAudioWidget->setTitle(UBFileSystemUtils::lastPathComponent(pSourceUrl.toString()));
+        pAudioWidget->setTitle(UBFileSystemUtils::lastPathComponent(pSourceUrl.toLocalFile()));
     }
 
     UBItem::setSourceUrl(pSourceUrl);
diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp
index 6fdd79f6..1b48cbf0 100644
--- a/src/domain/UBGraphicsScene.cpp
+++ b/src/domain/UBGraphicsScene.cpp
@@ -1217,6 +1217,11 @@ void UBGraphicsScene::textUndoCommandAdded(UBGraphicsTextItem *textItem)
 }
 UBGraphicsMediaItem* UBGraphicsScene::addMedia(const QUrl& pMediaFileUrl, bool shouldPlayAsap, const QPointF& pPos)
 {
+    qDebug() << pMediaFileUrl.toLocalFile();
+    if (!QFile::exists(pMediaFileUrl.toLocalFile()))
+    if (!QFile::exists(pMediaFileUrl.toString()))
+        return NULL;
+
     UBGraphicsMediaItem* mediaItem = new UBGraphicsMediaItem(pMediaFileUrl);
     if(mediaItem){
         connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), mediaItem, SLOT(activeSceneChanged()));
diff --git a/src/frameworks/UBFileSystemUtils.cpp b/src/frameworks/UBFileSystemUtils.cpp
index 36a61945..2bde7364 100644
--- a/src/frameworks/UBFileSystemUtils.cpp
+++ b/src/frameworks/UBFileSystemUtils.cpp
@@ -19,7 +19,6 @@
 
 #include "core/UBApplication.h"
 
-#include "board/UBBoardController.h"
 #include "document/UBDocumentContainer.h"
 
 #include "globals/UBGlobals.h"
@@ -854,5 +853,4 @@ QString UBFileSystemUtils::readTextFile(QString path)
     }
 
     return "";
-}
-
+}
\ No newline at end of file
diff --git a/src/frameworks/UBFileSystemUtils.h b/src/frameworks/UBFileSystemUtils.h
index 13c82dbf..6a0597f6 100644
--- a/src/frameworks/UBFileSystemUtils.h
+++ b/src/frameworks/UBFileSystemUtils.h
@@ -17,14 +17,17 @@
 #define UBFILESYSTEMUTILS_H_
 
 #include <QtCore>
+#include <QThread>
 
 #include "core/UB.h"
 
 class QuaZipFile;
 class UBProcessingProgressListener;
 
-class UBFileSystemUtils
+class UBFileSystemUtils : public QObject
 {
+    Q_OBJECT
+
     public:
 
         UBFileSystemUtils();
diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp
index ee052027..ab965689 100644
--- a/src/gui/UBFeaturesWidget.cpp
+++ b/src/gui/UBFeaturesWidget.cpp
@@ -1048,8 +1048,8 @@ void UBFeatureProperties::onAddToLib()
         desc.modal = false;
         desc.name = QFileInfo( mpElement->getFullPath().toString()).fileName();
         qDebug() << desc.name;
-        desc.url = mpElement->getFullPath().toString();
-        qDebug() << desc.url;
+        desc.srcUrl = mpElement->getFullPath().toString();
+        qDebug() << desc.srcUrl;
         UBDownloadManager::downloadManager()->addFileToDownload(desc);
     }
 }
diff --git a/src/web/UBTrapFlashController.cpp b/src/web/UBTrapFlashController.cpp
index 25cb37e9..6458f203 100644
--- a/src/web/UBTrapFlashController.cpp
+++ b/src/web/UBTrapFlashController.cpp
@@ -200,7 +200,7 @@ void UBTrapFlashController::createWidget()
         // flash widget
         UBWebKitUtils::HtmlObject selectedObject = mAvailableFlashes.at(selectedIndex - 1);
         UBApplication::applicationController->showBoard();
-        UBApplication::boardController->downloadURL(QUrl(selectedObject.source), QPoint(0, 0), QSize(selectedObject.width, selectedObject.height));
+        UBApplication::boardController->downloadURL(QUrl(selectedObject.source), QString(), QPoint(0, 0), QSize(selectedObject.width, selectedObject.height));
     }
 
     QString freezedWidgetPath = UBPlatformUtils::applicationResourcesDirectory() + "/etc/freezedWidgetWrapper.html";
diff --git a/src/web/browser/WBWebTrapWebView.cpp b/src/web/browser/WBWebTrapWebView.cpp
index 971ed75c..2c97626c 100644
--- a/src/web/browser/WBWebTrapWebView.cpp
+++ b/src/web/browser/WBWebTrapWebView.cpp
@@ -281,7 +281,7 @@ void WBWebTrapWebView::trapElementAtPos(const QPoint& pos)
             emit objectCaptured(QUrl(page()->currentFrame()->url().toString() + "/" + source), type,
                     htr.boundingRect().width(), htr.boundingRect().height());
 
-            UBApplication::boardController->downloadURL(QUrl(source), QPointF(0.0, 0.0));
+            UBApplication::boardController->downloadURL(QUrl(source));
             UBApplication::applicationController->showBoard();
         }
     }