diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp
index b5d80f98eb21459e9d79392b2149ab3749653630..e34ea25c70740c46359a1193f44ffadb6647cecb 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler.cpp
+++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp
@@ -385,11 +385,38 @@ bool QTiffHandler::read(QImage *image)
                 }
 
                 image->setColorTable(qtColorTable);
-                for (uint32 y=0; y<height; ++y) {
-                    if (TIFFReadScanline(tiff, image->scanLine(y), y, 0) < 0) {
+
+                if (TIFFIsTiled(tiff)) {
+                    quint32 tileWidth, tileLength;
+                    TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tileWidth);
+                    TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tileLength);
+                    uchar *buf = (uchar *)_TIFFmalloc(TIFFTileSize(tiff));
+                    if (!tileWidth || !tileLength || !buf) {
+                        _TIFFfree(buf);
                         d->close();
                         return false;
                     }
+                    for (quint32 y = 0; y < height; y += tileLength) {
+                        for (quint32 x = 0; x < width; x += tileWidth) {
+                            if (TIFFReadTile(tiff, buf, x, y, 0, 0) < 0) {
+                                _TIFFfree(buf);
+                                d->close();
+                                return false;
+                            }
+                            quint32 linesToCopy = qMin(tileLength, height - y);
+                            quint32 widthToCopy = qMin(tileWidth, width - x);
+                            for (quint32 i = 0; i < linesToCopy; i++)
+                                ::memcpy(image->scanLine(y + i) + x, buf + (i * tileWidth), widthToCopy);
+                        }
+                    }
+                    _TIFFfree(buf);
+                } else {
+                    for (uint32 y=0; y<height; ++y) {
+                        if (TIFFReadScanline(tiff, image->scanLine(y), y, 0) < 0) {
+                            d->close();
+                            return false;
+                        }
+                    }
                 }
 
                 // free redTable, greenTable and greenTable done by libtiff
diff --git a/tests/auto/tiff/tst_qtiff.cpp b/tests/auto/tiff/tst_qtiff.cpp
index 65cc56c7b30387cd075b379a457ff8fedff880f7..bec2ca28199052e10172042b172c4775af6ef4b5 100644
--- a/tests/auto/tiff/tst_qtiff.cpp
+++ b/tests/auto/tiff/tst_qtiff.cpp
@@ -81,6 +81,9 @@ private slots:
     void multipage_data();
     void multipage();
 
+    void tiled_data();
+    void tiled();
+
 private:
     QString prefix;
 };
@@ -153,6 +156,8 @@ void tst_qtiff::readImage_data()
     QTest::newRow("rgb_orientation_7") << QString("rgb_orientation_7.tiff") << QSize(64, 64);
     QTest::newRow("rgb_orientation_8") << QString("rgb_orientation_8.tiff") << QSize(64, 64);
     QTest::newRow("teapot") << QString("teapot.tiff") << QSize(256, 256);
+    QTest::newRow("indexed_nontiled") << QString("indexed_nontiled.tif") << QSize(512, 384);
+    QTest::newRow("indexed_tiled") << QString("indexed_tiled.tif") << QSize(512, 384);
 }
 
 void tst_qtiff::readImage()
@@ -557,5 +562,22 @@ void tst_qtiff::multipage()
     QCOMPARE(reader.jumpToNextImage(), false);
 }
 
+void tst_qtiff::tiled_data()
+{
+    QTest::addColumn<QString>("expectedFile");
+    QTest::addColumn<QString>("tiledFile");
+    QTest::newRow("Indexed") << "indexed_nontiled.tif" << "indexed_tiled.tif";
+}
+
+void tst_qtiff::tiled()
+{
+    QFETCH(QString, expectedFile);
+    QFETCH(QString, tiledFile);
+
+    QImage expectedImage(prefix + expectedFile);
+    QImage tiledImage(prefix + tiledFile);
+    QCOMPARE(expectedImage, tiledImage);
+}
+
 QTEST_MAIN(tst_qtiff)
 #include "tst_qtiff.moc"
diff --git a/tests/shared/images/tiff.qrc b/tests/shared/images/tiff.qrc
index c98a72c18b25305315e7adedd630f2692b619732..258acf0ba3286707139bcba61ca89e5a08b22916 100644
--- a/tests/shared/images/tiff.qrc
+++ b/tests/shared/images/tiff.qrc
@@ -41,5 +41,7 @@
         <file>tiff/rgb_orientation_8.tiff</file>
         <file>tiff/teapot.tiff</file>
         <file>tiff/colorful.bmp</file>
+        <file>tiff/indexed_tiled.tif</file>
+        <file>tiff/indexed_nontiled.tif</file>
     </qresource>
 </RCC>
diff --git a/tests/shared/images/tiff/indexed_nontiled.tif b/tests/shared/images/tiff/indexed_nontiled.tif
new file mode 100644
index 0000000000000000000000000000000000000000..d0b7cef9718969298f11c95f9dc9a20c66201d1e
Binary files /dev/null and b/tests/shared/images/tiff/indexed_nontiled.tif differ
diff --git a/tests/shared/images/tiff/indexed_tiled.tif b/tests/shared/images/tiff/indexed_tiled.tif
new file mode 100644
index 0000000000000000000000000000000000000000..4ed11dd7456c1497bf4450d153d370ff5d891a48
Binary files /dev/null and b/tests/shared/images/tiff/indexed_tiled.tif differ