diff --git a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8bda149a7de7824e90aa8718221ae3815e8d2f15
--- /dev/null
+++ b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp
@@ -0,0 +1,18 @@
+#include "abstractcustomtool.h"
+
+#include "formeditorview.h"
+
+namespace QmlDesigner {
+
+AbstractCustomTool::AbstractCustomTool(FormEditorView* view)
+    : AbstractFormEditorTool(view)
+{
+}
+
+void AbstractCustomTool::selectedItemsChanged(const QList<FormEditorItem *> &itemList)
+{
+    view()->changeToSelectionTool();
+}
+
+
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h
new file mode 100644
index 0000000000000000000000000000000000000000..f375b2e4d9e50582a05418e57f37cf802e95cc1f
--- /dev/null
+++ b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h
@@ -0,0 +1,20 @@
+#ifndef QMLDESIGNER_ABSTRACTSINGLESELECTIONTOOL_H
+#define QMLDESIGNER_ABSTRACTSINGLESELECTIONTOOL_H
+
+#include "abstractformeditortool.h"
+
+namespace QmlDesigner {
+
+class QMLDESIGNERCORE_EXPORT AbstractCustomTool : public QmlDesigner::AbstractFormEditorTool
+{
+public:
+    AbstractCustomTool(FormEditorView* view);
+
+    void selectedItemsChanged(const QList<FormEditorItem *> &itemList);
+
+    virtual bool wantHandleItem(const ModelNode &modelNode) const = 0;
+};
+
+} // namespace QmlDesigner
+
+#endif // QMLDESIGNER_ABSTRACTSINGLESELECTIONTOOL_H
diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
index 0ed61fcf9c1321203ddb9a919141da0a3413ba5a..94ec91745c73bdfd99f9eb2b9a0055943e022c48 100644
--- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
@@ -204,8 +204,11 @@ void AbstractFormEditorTool::mouseReleaseEvent(const QList<QGraphicsItem*> & /*i
     }
 }
 
-void AbstractFormEditorTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &, QGraphicsSceneMouseEvent *)
+void AbstractFormEditorTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *)
 {
+    FormEditorItem *formEditorItem = topFormEditorItem(itemList);
+    if (formEditorItem)
+        view()->changeToCustomTool(formEditorItem->qmlItemNode().modelNode());
 }
 
 void AbstractFormEditorTool::showContextMenu(QGraphicsSceneMouseEvent *event)
diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h
index c66e65f83cbf0118f86c1bd8604786fb74e9fe4d..05c1b460d4c687b6a9980bee19d572c80a560eb5 100644
--- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h
+++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h
@@ -32,6 +32,8 @@
 
 #include "formeditoritem.h"
 
+#include <qmldesignercorelib_global.h>
+
 QT_BEGIN_NAMESPACE
 class QGraphicsItem;
 QT_END_NAMESPACE
@@ -40,7 +42,7 @@ namespace QmlDesigner {
 
 class FormEditorView;
 
-class AbstractFormEditorTool
+class QMLDESIGNERCORE_EXPORT AbstractFormEditorTool
 {
 
 public:
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.pri b/src/plugins/qmldesigner/components/formeditor/formeditor.pri
index f2ca8013c963ea4a99fc3274f50882d53a13c5ed..8977752eb4d5a40732af72d6dd6fa8ed27264de7 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditor.pri
+++ b/src/plugins/qmldesigner/components/formeditor/formeditor.pri
@@ -33,7 +33,8 @@ SOURCES += formeditoritem.cpp \
     formeditorgraphicsview.cpp \
     numberseriesaction.cpp \
     lineeditaction.cpp \
-    formeditorcrumblebar.cpp
+    formeditorcrumblebar.cpp \
+    abstractcustomtool.cpp
 HEADERS += formeditorscene.h \
     formeditorwidget.h \
     formeditoritem.h \
@@ -65,5 +66,6 @@ HEADERS += formeditorscene.h \
     formeditorgraphicsview.h \
     numberseriesaction.h \
     lineeditaction.h \
-    formeditorcrumblebar.h
+    formeditorcrumblebar.h \
+    abstractcustomtool.h
 RESOURCES += formeditor.qrc
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 14800d0aab0af46a3699ad85ebb8a06eb32b690a..afdfc20cc01c068e743067f1fde9875e552b1435 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -37,6 +37,7 @@
 #include "formeditoritem.h"
 #include "formeditorscene.h"
 #include "toolbox.h"
+#include "abstractcustomtool.h"
 
 #include <designmodecontext.h>
 #include <rewritertransaction.h>
@@ -96,7 +97,7 @@ FormEditorView::~FormEditorView()
     delete m_dragTool;
     m_dragTool = 0;
 
-    qDeleteAll(m_toolList);
+    qDeleteAll(m_customToolList);
 
     // delete scene after tools to prevent double deletion
     // of items
@@ -413,9 +414,31 @@ void FormEditorView::changeToTransformTools()
     changeToSelectionTool();
 }
 
-void FormEditorView::registerTool(AbstractFormEditorTool *tool)
+void FormEditorView::changeToCustomTool(const ModelNode &modelNode)
 {
-    m_toolList.append(tool);
+    int handlingRank = 0;
+    AbstractCustomTool *selectedCustomTool;
+
+    foreach (AbstractCustomTool *customTool, m_customToolList) {
+        if (customTool->wantHandleItem(modelNode) > handlingRank) {
+            handlingRank = customTool->wantHandleItem(modelNode);
+            selectedCustomTool = customTool;
+        }
+
+    }
+
+    if (handlingRank > 0) {
+        m_scene->updateAllFormEditorItems();
+        m_currentTool->clear();
+        m_currentTool = selectedCustomTool;
+        m_currentTool->clear();
+        m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes()));
+    }
+}
+
+void FormEditorView::registerTool(AbstractCustomTool *tool)
+{
+    m_customToolList.append(tool);
 }
 
 void FormEditorView::nodeSlidedToIndex(const NodeListProperty &listProperty, int /*newIndex*/, int /*oldIndex*/)
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index 045e1d629306d0442222caf6125ef1392c63cbee..b29084f9617839043fb35563133f6643f890f31c 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -49,6 +49,7 @@ class FormEditorScene;
 class NodeInstanceView;
 
 class AbstractFormEditorTool;
+class AbstractCustomTool;
 class MoveTool;
 class SelectionTool;
 class ResizeTool;
@@ -98,9 +99,9 @@ public:
     void changeToSelectionTool(QGraphicsSceneMouseEvent *event);
     void changeToResizeTool();
     void changeToTransformTools();
+    void changeToCustomTool(const ModelNode &modelNode);
 
-
-    void registerTool(AbstractFormEditorTool *tool);
+    void registerTool(AbstractCustomTool *tool);
 
     void nodeSlidedToIndex(const NodeListProperty &listProperty, int newIndex, int oldIndex);
     void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) QTC_OVERRIDE;
@@ -140,7 +141,7 @@ private: //functions
 private: //variables
     QWeakPointer<FormEditorWidget> m_formEditorWidget;
     QWeakPointer<FormEditorScene> m_scene;
-    QList<AbstractFormEditorTool*> m_toolList;
+    QList<AbstractCustomTool*> m_customToolList;
     MoveTool *m_moveTool;
     SelectionTool *m_selectionTool;
     ResizeTool *m_resizeTool;
diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h
index 0afe9fc378ef2a63f82d946fc88e9464a30eed18..47c6edbb7c5e64165781bb9a36982777fb56ff1a 100644
--- a/src/plugins/qmldesigner/designercore/include/viewmanager.h
+++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h
@@ -72,7 +72,7 @@ public:
 
     void resetPropertyEditorView();
 
-    void registerFormEditorTool(AbstractFormEditorTool *tool); // takes ownership
+    void registerFormEditorTool(AbstractCustomTool *tool); // takes ownership
     void registerView(AbstractView *view);
 
     QList<WidgetInfo> widgetInfos();
diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
index cdeca6a1ffb2d71e7907d96624c892854f964db5..fd70c264bf940da73bfcd0f42d18ad0944f0b7e4 100644
--- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
@@ -89,7 +89,7 @@ void ViewManager::resetPropertyEditorView()
     m_propertyEditorView.resetView();
 }
 
-void ViewManager::registerFormEditorTool(AbstractFormEditorTool *tool)
+void ViewManager::registerFormEditorTool(AbstractCustomTool *tool)
 {
     m_formEditorView.registerTool(tool);
 }