diff --git a/src/corelib/kernel/qmimedata.cpp b/src/corelib/kernel/qmimedata.cpp
index 0753faf46955eb7602f14c6651bca3b760060bcb..3e9cdac966e0545d1f23103cab843946c590a49a 100644
--- a/src/corelib/kernel/qmimedata.cpp
+++ b/src/corelib/kernel/qmimedata.cpp
@@ -566,7 +566,22 @@ QByteArray QMimeData::data(const QString &mimeType) const
 void QMimeData::setData(const QString &mimeType, const QByteArray &data)
 {
     Q_D(QMimeData);
-    d->setData(mimeType, QVariant(data));
+
+    if (mimeType == QLatin1String("text/uri-list")) {
+        QByteArray ba = data;
+        if (ba.endsWith('\0'))
+            ba.chop(1);
+        QList<QByteArray> urls = ba.split('\n');
+        QList<QVariant> list;
+        for (int i = 0; i < urls.size(); ++i) {
+            QByteArray ba = urls.at(i).trimmed();
+            if (!ba.isEmpty())
+                list.append(QUrl::fromEncoded(ba));
+        }
+        d->setData(mimeType, list);
+    } else {
+        d->setData(mimeType, QVariant(data));
+    }
 }
 
 /*!
diff --git a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
index 3886051fdca8246790debf70f2ef22660e1e78c9..01bf16c295078cd06e87126ec57018940b611b87 100644
--- a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
+++ b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
@@ -297,9 +297,16 @@ void tst_QMimeData::setText() const
     QVERIFY(mimeData.hasText() == false);
 }
 
+// Publish retrieveData for verifying content validity
+class TstMetaData : public QMimeData
+{
+public:
+    using QMimeData::retrieveData;
+};
+
 void tst_QMimeData::setUrls() const
 {
-    QMimeData mimeData;
+    TstMetaData mimeData;
     QList<QUrl> shortUrlList;
     QList<QUrl> longUrlList;
 
@@ -321,6 +328,14 @@ void tst_QMimeData::setUrls() const
     QCOMPARE(mimeData.urls(), longUrlList);
     QCOMPARE(mimeData.text(), QString("http://qt-project.org\nhttp://www.google.com\n"));
 
+    // test and verify that setData doesn't corrupt url content
+    foreach (const QString &format, mimeData.formats()) {
+         QVariant before = mimeData.retrieveData(format, QVariant::ByteArray);
+         mimeData.setData(format, mimeData.data(format));
+         QVariant after = mimeData.retrieveData(format, QVariant::ByteArray);
+         QCOMPARE(after, before);
+     }
+
     // clear, verify
     mimeData.clear();
     QCOMPARE(mimeData.hasUrls(), false);