diff --git a/src/plugins/qmldesigner/components/itemlibrary/images/item-default-icon.png b/src/plugins/qmldesigner/components/itemlibrary/images/item-default-icon.png
index 82c6ef1a41e2c6a28ba85619640e97ad993ba09d..5000ba2600f3170f9ee490509d7e7afdcff06ede 100644
Binary files a/src/plugins/qmldesigner/components/itemlibrary/images/item-default-icon.png and b/src/plugins/qmldesigner/components/itemlibrary/images/item-default-icon.png differ
diff --git a/src/plugins/qmldesigner/components/itemlibrary/images/item-invalid-icon.png b/src/plugins/qmldesigner/components/itemlibrary/images/item-invalid-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e87fd3a0b51714e9f2fe5057022a81cd40d86401
Binary files /dev/null and b/src/plugins/qmldesigner/components/itemlibrary/images/item-invalid-icon.png differ
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc
index e4d27b04769854804c139603cbd73d3ef2e3b79d..1343c939885dd6538ef2b2af6e8093d69d4f2998 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc
@@ -8,6 +8,7 @@
         <file>qml/Selector.qml</file>
 
         <file>images/item-default-icon.png</file>
+        <file>images/item-invalid-icon.png</file>
     </qresource>
 </RCC>
 
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index 804e45a0c761788ce1fc98e8a44d44c414130c3a..bfd424755e97aabc20595e8a2276c1556763565b 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -189,6 +189,10 @@ NavigatorTreeModel::ItemRow NavigatorTreeModel::createItemRow(const ModelNode &n
     idItem->setDropEnabled(dropEnabled);
     idItem->setEditable(true);
     idItem->setData(hash, NavigatorRole);
+    if (node.metaInfo().isValid())
+        idItem->setToolTip(node.type());
+    else
+        idItem->setToolTip(tr("unkown item: ") + node.type());
 
 #    ifdef _LOCK_ITEMS_
     QStandardItem *lockItem = new QStandardItem;
@@ -233,6 +237,10 @@ void NavigatorTreeModel::updateItemRow(const ModelNode &node, ItemRow items)
 
     items.idItem->setText(node.id());
     items.visibilityItem->setCheckState(node.auxiliaryData("invisible").toBool() ? Qt::Unchecked : Qt::Checked);
+    if (node.metaInfo().isValid())
+        items.idItem->setToolTip(node.type());
+    else
+        items.idItem->setToolTip(tr("unkown item: ") + node.type());
 
     blockItemChangedSignal(blockSignal);
 }
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp
index c914a26a0a10f81d4e8a7a7c1c248110269577ee..49468353ac2265f48f093554ce1630a8f3daf6e8 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp
@@ -29,6 +29,8 @@
 
 #include "navigatortreeview.h"
 
+#include <qmath.h>
+
 #include "navigatorview.h"
 #include "navigatortreemodel.h"
 #include "navigatorwidget.h"
@@ -37,6 +39,58 @@
 #include <nodeproperty.h>
 #include "metainfo.h"
 #include <QLineEdit>
+#include <QPen>
+#include <QPixmapCache>
+
+
+static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen)
+{
+    const qreal radiusBase = qMax(qreal(1), maxRadius);
+
+    QString key = QLatin1String("WaveUnderline-Bauhaus");
+
+    QPixmap pixmap;
+    if (QPixmapCache::find(key, pixmap))
+        return pixmap;
+
+    const qreal halfPeriod = qMax(qreal(2), qreal(radiusBase * 1.61803399)); // the golden ratio
+    const int width = qCeil(100 / (2 * halfPeriod)) * (2 * halfPeriod);
+    const int radius = qFloor(radiusBase);
+
+    QPainterPath path;
+
+    qreal xs = 0;
+    qreal ys = radius;
+
+    while (xs < width) {
+        xs += halfPeriod;
+        ys = -ys;
+        path.quadTo(xs - halfPeriod / 2, ys, xs, 0);
+    }
+
+    pixmap = QPixmap(width, radius * 2);
+    pixmap.fill(Qt::transparent);
+    {
+        QPen wavePen = pen;
+        wavePen.setCapStyle(Qt::SquareCap);
+
+        // This is to protect against making the line too fat, as happens on Mac OS X
+        // due to it having a rather thick width for the regular underline.
+        const qreal maxPenWidth = .8 * radius;
+        if (wavePen.widthF() > maxPenWidth)
+            wavePen.setWidth(maxPenWidth);
+
+        QPainter imgPainter(&pixmap);
+        imgPainter.setPen(wavePen);
+        imgPainter.setRenderHint(QPainter::Antialiasing);
+        imgPainter.translate(0, radius);
+        imgPainter.drawPath(path);
+    }
+
+    QPixmapCache::insert(key, pixmap);
+
+    return pixmap;
+}
 
 namespace QmlDesigner {
 
@@ -169,7 +223,8 @@ void NameItemDelegate::paint(QPainter *painter,
     QPoint displayStringOffset;
 
     painter->save();
-
+    QFontMetrics fm(option.font);
+    int width;
     if (index.data(Qt::UserRole).isValid()) {
 
         int pixmapSide = 16;
@@ -196,6 +251,8 @@ void NameItemDelegate::paint(QPainter *painter,
         // if the library was also empty, use the default icon
         if (icon.isNull())
             icon = QIcon(QLatin1String(":/ItemLibrary/images/item-default-icon.png"));
+        if (!node.metaInfo().isValid())
+            icon = QIcon(QLatin1String(":/ItemLibrary/images/item-invalid-icon.png"));
 
         // If no icon is present, leave an empty space of 24 pixels anyway
         QPixmap pixmap = icon.pixmap(pixmapSide, pixmapSide);
@@ -207,16 +264,33 @@ void NameItemDelegate::paint(QPainter *painter,
 
         // Check text length does not exceed available space
         int extraSpace=12+pixmapSide;
-        QFontMetrics fm(option.font);
+
         displayString = fm.elidedText(displayString,Qt::ElideMiddle,option.rect.width()-extraSpace);
         displayStringOffset = QPoint(5+pixmapSide,-5);
+        width = fm.width(displayString);
     }
     else {
         displayString = index.data(Qt::DisplayRole).toString();
         displayStringOffset = QPoint(0, -2);
     }
 
-    painter->drawText(option.rect.bottomLeft()+displayStringOffset,displayString);
+    QPoint pos = option.rect.bottomLeft() + displayStringOffset;
+    painter->drawText(pos, displayString);
+
+    ModelNode node = m_TreeModel->nodeForIndex(index);
+
+    if (!node.isValid() ||!node.metaInfo().isValid()) {
+        painter->translate(0, pos.y() + 1);
+        QPen pen;
+        pen.setColor(Qt::red);
+
+        const qreal underlineOffset = fm.underlinePos();
+        const QPixmap wave = generateWavyPixmap(qMax(underlineOffset, pen.widthF()), pen);
+        const int descent = fm.descent();
+
+        painter->setBrushOrigin(painter->brushOrigin().x(), 0);
+        painter->fillRect(pos.x(), 0, qCeil(width), qMin(wave.height(), descent), wave);
+    }
 
     painter->restore();
 }