diff --git a/share/qtcreator/qml/qmlpuppet/commands/commands.pri b/share/qtcreator/qml/qmlpuppet/commands/commands.pri
index c6c9282d1b802dac811b649a1ed8922bfbb8860c..5ae623cf3f2781707c8216eb8384dcefc8c2477c 100644
--- a/share/qtcreator/qml/qmlpuppet/commands/commands.pri
+++ b/share/qtcreator/qml/qmlpuppet/commands/commands.pri
@@ -1,6 +1,7 @@
 INCLUDEPATH += $$PWD/
 
 HEADERS += $$PWD/synchronizecommand.h
+HEADERS += $$PWD/tokencommand.h
 HEADERS += $$PWD/componentcompletedcommand.h
 HEADERS += $$PWD/completecomponentcommand.h
 HEADERS += $$PWD/statepreviewimagechangedcommand.h
@@ -24,6 +25,7 @@ HEADERS += $$PWD/changeauxiliarycommand.h
 
 
 SOURCES += $$PWD/synchronizecommand.cpp
+SOURCES += $$PWD/tokencommand.cpp
 SOURCES += $$PWD/componentcompletedcommand.cpp
 SOURCES += $$PWD/completecomponentcommand.cpp
 SOURCES += $$PWD/statepreviewimagechangedcommand.cpp
diff --git a/share/qtcreator/qml/qmlpuppet/commands/tokencommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bb8279a9711d3c9cf9f87d7b34173db69adf33ac
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.cpp
@@ -0,0 +1,114 @@
+/**************************************************************************
+
+**
+
+**  This  file  is  part  of  Qt  Creator
+
+**
+
+**  Copyright  (c)  2011  Nokia  Corporation  and/or  its  subsidiary(-ies).
+
+**
+
+**  Contact:  Nokia  Corporation  (qt-info@nokia.com)
+
+**
+
+**  No  Commercial  Usage
+
+**
+
+**  This  file  contains  pre-release  code  and  may  not  be  distributed.
+
+**  You  may  use  this  file  in  accordance  with  the  terms  and  conditions
+
+**  contained  in  the  Technology  Preview  License  Agreement  accompanying
+
+**  this  package.
+
+**
+
+**  GNU  Lesser  General  Public  License  Usage
+
+**
+
+**  Alternatively,  this  file  may  be  used  under  the  terms  of  the  GNU  Lesser
+
+**  General  Public  License  version  2.1  as  published  by  the  Free  Software
+
+**  Foundation  and  appearing  in  the  file  LICENSE.LGPL  included  in  the
+
+**  packaging  of  this  file.   Please  review  the  following  information  to
+
+**  ensure  the  GNU  Lesser  General  Public  License  version  2.1  requirements
+
+**  will  be  met:  http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+
+**
+
+**  In  addition,  as  a  special  exception,  Nokia  gives  you  certain  additional
+
+**  rights.   These  rights  are  described  in  the  Nokia  Qt  LGPL  Exception
+
+**  version  1.1,  included  in  the  file  LGPL_EXCEPTION.txt  in  this  package.
+
+**
+
+**  If  you  have  questions  regarding  the  use  of  this  file,  please  contact
+
+**  Nokia  at  qt-info@nokia.com.
+
+**
+
+**************************************************************************/
+
+#include "tokencommand.h"
+
+namespace QmlDesigner {
+
+TokenCommand::TokenCommand()
+    : m_tokenNumber(-1)
+{
+}
+
+TokenCommand::TokenCommand(const QString &tokenName, qint32 tokenNumber, const QVector<qint32> &instanceIdVector)
+    : m_tokenName(tokenName),
+      m_tokenNumber(tokenNumber),
+      m_instanceIdVector(instanceIdVector)
+{
+}
+
+QString TokenCommand::tokenName() const
+{
+    return m_tokenName;
+}
+
+qint32 TokenCommand::tokenNumber() const
+{
+    return m_tokenNumber;
+}
+
+QVector<qint32> TokenCommand::instances() const
+{
+    return m_instanceIdVector;
+}
+
+QDataStream &operator<<(QDataStream &out, const TokenCommand &command)
+{
+    out << command.tokenName();
+    out << command.tokenNumber();
+    out << command.instances();
+    return out;
+}
+
+QDataStream &operator>>(QDataStream &in, TokenCommand &command)
+{
+    in >> command.m_tokenName;
+    in >> command.m_tokenNumber;
+    in >> command.m_instanceIdVector;
+
+    return in;
+}
+
+
+} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/commands/tokencommand.h b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.h
new file mode 100644
index 0000000000000000000000000000000000000000..ef4325a8d71b373660795ca46533917baaf26785
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.h
@@ -0,0 +1,100 @@
+/**************************************************************************
+
+**
+
+**  This  file  is  part  of  Qt  Creator
+
+**
+
+**  Copyright  (c)  2011  Nokia  Corporation  and/or  its  subsidiary(-ies).
+
+**
+
+**  Contact:  Nokia  Corporation  (qt-info@nokia.com)
+
+**
+
+**  No  Commercial  Usage
+
+**
+
+**  This  file  contains  pre-release  code  and  may  not  be  distributed.
+
+**  You  may  use  this  file  in  accordance  with  the  terms  and  conditions
+
+**  contained  in  the  Technology  Preview  License  Agreement  accompanying
+
+**  this  package.
+
+**
+
+**  GNU  Lesser  General  Public  License  Usage
+
+**
+
+**  Alternatively,  this  file  may  be  used  under  the  terms  of  the  GNU  Lesser
+
+**  General  Public  License  version  2.1  as  published  by  the  Free  Software
+
+**  Foundation  and  appearing  in  the  file  LICENSE.LGPL  included  in  the
+
+**  packaging  of  this  file.   Please  review  the  following  information  to
+
+**  ensure  the  GNU  Lesser  General  Public  License  version  2.1  requirements
+
+**  will  be  met:  http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+
+**
+
+**  In  addition,  as  a  special  exception,  Nokia  gives  you  certain  additional
+
+**  rights.   These  rights  are  described  in  the  Nokia  Qt  LGPL  Exception
+
+**  version  1.1,  included  in  the  file  LGPL_EXCEPTION.txt  in  this  package.
+
+**
+
+**  If  you  have  questions  regarding  the  use  of  this  file,  please  contact
+
+**  Nokia  at  qt-info@nokia.com.
+
+**
+
+**************************************************************************/
+
+#ifndef QMLDESIGNER_TOKENCOMMAND_H
+#define QMLDESIGNER_TOKENCOMMAND_H
+
+
+#include <QMetaType>
+#include <QVector>
+
+namespace QmlDesigner {
+
+class TokenCommand
+{
+    friend QDataStream &operator>>(QDataStream &in, TokenCommand &command);
+
+public:
+    TokenCommand();
+    TokenCommand(const QString &tokenName, qint32 tokenNumber, const QVector<qint32> &instances);
+
+    QString tokenName() const;
+    qint32 tokenNumber() const;
+    QVector<qint32> instances() const;
+
+private:
+    QString m_tokenName;
+    qint32 m_tokenNumber;
+    QVector<qint32> m_instanceIdVector;
+};
+
+QDataStream &operator<<(QDataStream &out, const TokenCommand &command);
+QDataStream &operator>>(QDataStream &in, TokenCommand &command);
+
+} // namespace QmlDesigner
+
+Q_DECLARE_METATYPE(QmlDesigner::TokenCommand)
+
+
+#endif // QMLDESIGNER_TOKENCOMMAND_H
diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
index ad10cdc57ca0a4b449c5f386115a6d260d760e4e..bdefc54d91c34ab75b5c935850d61619c54faf29 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
@@ -57,6 +57,7 @@
 #include "changestatecommand.h"
 #include "completecomponentcommand.h"
 #include "synchronizecommand.h"
+#include "tokencommand.h"
 
 #include "informationchangedcommand.h"
 #include "pixmapchangedcommand.h"
@@ -133,6 +134,11 @@ void NodeInstanceClientProxy::componentCompleted(const ComponentCompletedCommand
     writeCommand(QVariant::fromValue(command));
 }
 
+void NodeInstanceClientProxy::token(const TokenCommand &command)
+{
+    writeCommand(QVariant::fromValue(command));
+}
+
 void NodeInstanceClientProxy::flush()
 {
 }
@@ -267,6 +273,10 @@ void NodeInstanceClientProxy::changeNodeSource(const ChangeNodeSourceCommand &co
 {
     nodeInstanceServer()->changeNodeSource(command);
 }
+void NodeInstanceClientProxy::redirectToken(const TokenCommand &command)
+{
+    nodeInstanceServer()->token(command);
+}
 
 void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
 {
@@ -285,6 +295,7 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
     static const int completeComponentCommandType = QMetaType::type("CompleteComponentCommand");
     static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand");
     static const int changeNodeSourceCommandType = QMetaType::type("ChangeNodeSourceCommand");
+    static const int tokenCommandType = QMetaType::type("TokenCommand");
 
     if (command.userType() ==  createInstancesCommandType) {
         createInstances(command.value<CreateInstancesCommand>());
@@ -314,6 +325,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
         completeComponent(command.value<CompleteComponentCommand>());
     else if (command.userType() ==  changeNodeSourceCommandType)
         changeNodeSource(command.value<ChangeNodeSourceCommand>());
+    else if (command.userType() ==  tokenCommandType)
+        redirectToken(command.value<TokenCommand>());
     else if (command.userType() == synchronizeCommandType) {
         SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>();
         m_synchronizeId = synchronizeCommand.synchronizeId();
diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h
index 0ee07bf354a113fd12385466a61999cd8dd400d8..ba429123f0a9f6a7f0484413e0af08ef878b6790 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h
@@ -75,6 +75,7 @@ public:
     void childrenChanged(const ChildrenChangedCommand &command);
     void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command);
     void componentCompleted(const ComponentCompletedCommand &command);    
+    void token(const TokenCommand &command);
 
     void flush();
     void synchronizeWithClientProcess();
@@ -101,6 +102,7 @@ protected:
     void changeState(const ChangeStateCommand &command);
     void completeComponent(const CompleteComponentCommand &command);
     void changeNodeSource(const ChangeNodeSourceCommand &command);
+    void redirectToken(const TokenCommand &command);
 
 private slots:
     void readDataStream();
diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp
index 84f7d8fcd2836117e88876c7378f8fdbbba7edba..5acbc7fcf8e32c356b0b03a86ac7ba840bb1e088 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp
@@ -74,6 +74,7 @@
 #include "componentcompletedcommand.h"
 #include "createscenecommand.h"
 #include "changenodesourcecommand.h"
+#include "tokencommand.h"
 
 #include "dummycontextobject.h"
 
@@ -338,6 +339,11 @@ void NodeInstanceServer::changeNodeSource(const ChangeNodeSourceCommand &command
     startRenderTimer();
 }
 
+void NodeInstanceServer::token(const TokenCommand &/*command*/)
+{
+
+}
+
 void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &containerVector)
 {
     foreach (const AddImportContainer &container, containerVector) {
diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h
index bd45ec484923e24db2363f62db329397ac231fb3..ea24316fda11338d0362463485cfb3bfdaa23bdd 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h
@@ -92,6 +92,7 @@ public:
     void changeState(const ChangeStateCommand &command);
     void completeComponent(const CompleteComponentCommand &command);
     void changeNodeSource(const ChangeNodeSourceCommand &command);
+    void token(const TokenCommand &command);
 
     ServerNodeInstance instanceForId(qint32 id) const;
     bool hasInstanceForId(qint32 id) const;
@@ -152,7 +153,6 @@ protected:
 
     virtual void collectItemChangesAndSendChangeCommands() = 0;
 
-
     ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
     ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const;
     PixmapChangedCommand createPixmapChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h
index 77bf3355efcaf8a4d2143034f13e5cf2ae568e09..46f45e794e69b9d00aeae9c98220cce65a30a9d9 100644
--- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h
+++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h
@@ -43,6 +43,7 @@ class InformationChangedCommand;
 class ChildrenChangedCommand;
 class StatePreviewImageChangedCommand;
 class ComponentCompletedCommand;
+class TokenCommand;
 
 class NodeInstanceClientInterface
 {
@@ -53,6 +54,7 @@ public:
     virtual void childrenChanged(const ChildrenChangedCommand &command) = 0;
     virtual void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command) = 0;
     virtual void componentCompleted(const ComponentCompletedCommand &command) = 0;
+    virtual void token(const TokenCommand &command) = 0;
 
     virtual void flush() {};
     virtual void synchronizeWithClientProcess() {}
diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp
index ce2bb0104275f4cb5b7af01b443cd4ae7bb472df..c047308ab5684bb96cded25c8585b94a7001cd19 100644
--- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp
+++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp
@@ -61,6 +61,7 @@
 #include "statepreviewimagechangedcommand.h"
 #include "componentcompletedcommand.h"
 #include "synchronizecommand.h"
+#include "tokencommand.h"
 
 
 namespace QmlDesigner {
@@ -169,6 +170,9 @@ void NodeInstanceServerInterface::registerCommands()
 
     qRegisterMetaType<ChangeAuxiliaryCommand>("ChangeAuxiliaryCommand");
     qRegisterMetaTypeStreamOperators<ChangeAuxiliaryCommand>("ChangeAuxiliaryCommand");
+
+    qRegisterMetaType<TokenCommand>("TokenCommand");
+    qRegisterMetaTypeStreamOperators<TokenCommand>("TokenCommand");
 }
 
 }
diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h
index 98d1fe38656fd50e98511e9aee53603a0922495c..3ba659746008ad5103a7028168cfe91430504267 100644
--- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h
+++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h
@@ -55,6 +55,7 @@ class RemovePropertiesCommand;
 class ChangeStateCommand;
 class CompleteComponentCommand;
 class ChangeNodeSourceCommand;
+class TokenCommand;
 
 class NodeInstanceServerInterface : public QObject
 {
@@ -81,6 +82,7 @@ public:
     virtual void changeState(const ChangeStateCommand &command) = 0;
     virtual void completeComponent(const CompleteComponentCommand &command) = 0;
     virtual void changeNodeSource(const ChangeNodeSourceCommand &command) = 0;
+    virtual void token(const TokenCommand &command) = 0;
 
     static void registerCommands();
 };
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 0997e125d01cefb17def415159176186f7257bc7..c0dd079a9fc1f913bddf0517fab7e4137849f211 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -60,6 +60,7 @@
 #include "completecomponentcommand.h"
 #include "componentcompletedcommand.h"
 #include "createscenecommand.h"
+#include "tokencommand.h"
 
 #include "dummycontextobject.h"
 
@@ -72,6 +73,20 @@ Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceC
 {
 }
 
+void Qt5InformationNodeInstanceServer::sendTokenBack()
+{
+    foreach (const TokenCommand &command, m_tokenList)
+        nodeInstanceClient()->token(command);
+
+    m_tokenList.clear();
+}
+
+void Qt5InformationNodeInstanceServer::token(const TokenCommand &command)
+{
+    m_tokenList.append(command);
+    startRenderTimer();
+}
+
 void Qt5InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands()
 {
     static bool inFunction = false;
@@ -125,6 +140,8 @@ void Qt5InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands()
             resetAllItems();
             clearChangedPropertyList();
 
+            sendTokenBack();
+
             if (!informationChangedInstanceSet.isEmpty())
                 nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList()));
 
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
index e97e2c25d5d38d49b0b208750d25238eedba02de..7e969428d6a0204f32af7edc0d0b8fafd5b29673 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
@@ -34,6 +34,7 @@
 #define QMLDESIGNER_QT5INFORMATIONNODEINSTANCESERVER_H
 
 #include "qt5nodeinstanceserver.h"
+#include "tokencommand.h"
 
 namespace QmlDesigner {
 
@@ -47,14 +48,18 @@ public:
     void clearScene(const ClearSceneCommand &command);
     void createScene(const CreateSceneCommand &command);
     void completeComponent(const CompleteComponentCommand &command);
+    void token(const TokenCommand &command);
 
 protected:
     void collectItemChangesAndSendChangeCommands();
     void sendChildrenChangedCommand(const QList<ServerNodeInstance> childList);
+    void sendTokenBack();
+
 
 private:
     QSet<ServerNodeInstance> m_parentChangedSet;
     QList<ServerNodeInstance> m_completedComponentList;
+    QList<TokenCommand> m_tokenList;
 };
 
 } // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp
index 9c23b88fbb8f8b47372f417259dccde4754f4861..48ab73adf9bd9fe2c650e40d60ddf0597aa5abf5 100644
--- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp
@@ -75,6 +75,8 @@
 #include "completecomponentcommand.h"
 #include "componentcompletedcommand.h"
 #include "createscenecommand.h"
+#include "tokencommand.h"
+
 
 #include "dummycontextobject.h"
 
@@ -85,6 +87,20 @@ Qt4InformationNodeInstanceServer::Qt4InformationNodeInstanceServer(NodeInstanceC
 {
 }
 
+void Qt4InformationNodeInstanceServer::sendTokenBack()
+{
+    foreach (const TokenCommand &command, m_tokenList)
+        nodeInstanceClient()->token(command);
+
+    m_tokenList.clear();
+}
+
+void Qt4InformationNodeInstanceServer::token(const TokenCommand &command)
+{
+    m_tokenList.append(command);
+    startRenderTimer();
+}
+
 void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands()
 {
     static bool inFunction = false;
@@ -143,10 +159,7 @@ void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands()
             clearChangedPropertyList();
             resetAllItems();
 
-            if (!m_parentChangedSet.isEmpty()) {
-                sendChildrenChangedCommand(m_parentChangedSet.toList());
-                m_parentChangedSet.clear();
-            }
+            sendTokenBack();
 
             if (!informationChangedInstanceSet.isEmpty())
                 nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList()));
@@ -154,6 +167,11 @@ void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands()
             if (!propertyChangedList.isEmpty())
                 nodeInstanceClient()->valuesChanged(createValuesChangedCommand(propertyChangedList));
 
+            if (!m_parentChangedSet.isEmpty()) {
+                sendChildrenChangedCommand(m_parentChangedSet.toList());
+                m_parentChangedSet.clear();
+            }
+
             if (adjustSceneRect) {
                 QRectF boundingRect = rootNodeInstance().boundingRect();
                 if (boundingRect.isValid()) {
diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h
index 1390827ff56a5229eb77962d1f9c048cf5ab39ab..04f3064b6d399ad0e5fb213d476f6eab2926f873 100644
--- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h
@@ -34,6 +34,7 @@
 #define INFORMATIONNODEINSTANCESERVER_H
 
 #include "qt4nodeinstanceserver.h"
+#include "tokencommand.h"
 
 namespace QmlDesigner {
 
@@ -47,14 +48,17 @@ public:
     void clearScene(const ClearSceneCommand &command);
     void createScene(const CreateSceneCommand &command);
     void completeComponent(const CompleteComponentCommand &command);
+    void token(const TokenCommand &command);
 
 protected:
     void collectItemChangesAndSendChangeCommands();
     void sendChildrenChangedCommand(const QList<ServerNodeInstance> childList);
+    void sendTokenBack();
 
 private:
     QSet<ServerNodeInstance> m_parentChangedSet;
     QList<ServerNodeInstance> m_completedComponentList;
+    QList<TokenCommand> m_tokenList;
 };
 
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 3cc5865564165c1072daae881ac505e6181bb711..473f6b2ebf1853e35fb1a64fb1977f3765e0f827 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -490,6 +490,10 @@ void FormEditorView::instancesPreviewImageChanged(const QVector<ModelNode> &/*no
 
 }
 
+void FormEditorView::instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector)
+{
+}
+
 void FormEditorView::instancesChildrenChanged(const QVector<ModelNode> &nodeList)
 {
     QList<FormEditorItem*> itemNodeList;
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index 44ff565aedc639259207737c9e842c1345d2be01..b723c4bcef324fd76ff13e8572a490306bde37d2 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -109,6 +109,7 @@ public:
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
     void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
 
     void rewriterBeginTransaction();
     void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp
index c673e74130899618f90cf2e758cd3bdccca0f47f..91926dc5dfda62d5f697aae23a2cc791f4715097 100644
--- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp
@@ -88,22 +88,33 @@ void MoveManipulator::setItems(const QList<FormEditorItem*> &itemList)
     }
 }
 
-void MoveManipulator::synchronizeInstanceParent(const QList<FormEditorItem*> &itemList)
+void MoveManipulator::synchronizeParent(const QList<FormEditorItem*> &itemList, const ModelNode &parentNode)
 {
-    if (m_view->model()) {
-        foreach (FormEditorItem *item, itemList) {
-            if (m_itemList.contains(item)) {
-                QmlItemNode parentItemNode = QmlItemNode(item->qmlItemNode().instanceParent());
-                if (parentItemNode.isValid()) {
+    bool snapperUpdated = false;
+
+    foreach (FormEditorItem *item, itemList) {
+        if (m_itemList.contains(item)) {
+            QmlItemNode parentItemNode = QmlItemNode(parentNode);
+            if (parentItemNode.isValid()) {
+                if (snapperUpdated == false && m_snapper.containerFormEditorItem() != m_view->scene()->itemForQmlItemNode(parentItemNode)) {
                     m_snapper.setContainerFormEditorItem(m_view->scene()->itemForQmlItemNode(parentItemNode));
                     m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem());
                     m_snapper.updateSnappingLines(m_itemList);
                     updateHashes();
-                    break;
+                    snapperUpdated = true;
                 }
             }
         }
     }
+
+    update(m_lastPosition, NoSnapping, UseBaseState);
+}
+
+void MoveManipulator::synchronizeInstanceParent(const QList<FormEditorItem*> &itemList)
+{
+    if (m_view->model() && !m_itemList.isEmpty())
+        synchronizeParent(itemList, m_itemList.first()->qmlItemNode().instanceParent());
+
 }
 
 void MoveManipulator::updateHashes()
@@ -257,6 +268,7 @@ QHash<FormEditorItem*, QRectF> MoveManipulator::tanslatedBoundingRects(const QHa
 */
 void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping, State stateToBeManipulated)
 {
+    m_lastPosition = updatePoint;
     deleteSnapLines(); //Since they position is changed and the item is moved the snapping lines are
                        //are obsolete. The new updated snapping lines (color and visibility) will be
                        //calculated in snapPoint() called in moveNode() later
@@ -329,6 +341,7 @@ void MoveManipulator::clear()
     m_beginPositionHash.clear();
     m_beginPositionInSceneSpaceHash.clear();
     m_itemList.clear();
+    m_lastPosition = QPointF();
 
     m_rewriterTransaction.commit();
 
@@ -350,17 +363,30 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent)
     if (!itemsCanReparented())
         return;
 
-    foreach (FormEditorItem* item, m_itemList) {
-        if (!item || !item->qmlItemNode().isValid())
-            continue;
+    QVector<ModelNode> nodeReparentVector;
+    NodeAbstractProperty parentProperty;
+
+    QmlItemNode parent(newParent->qmlItemNode());
+    if (parent.isValid()) {
+        if (parent.hasDefaultProperty()) {
+            parentProperty = parent.nodeAbstractProperty(parent.defaultProperty());
+        } else {
+            parentProperty = parent.nodeAbstractProperty("data");
+        }
+
+        foreach (FormEditorItem* item, m_itemList) {
+            if (!item || !item->qmlItemNode().isValid())
+                continue;
+
+            if (parentProperty != item->qmlItemNode().modelNode().parentProperty())
+                nodeReparentVector.append(item->qmlItemNode().modelNode());
 
-        QmlItemNode parent(newParent->qmlItemNode());
-        if (parent.isValid()) {
-            if (parent.hasDefaultProperty())
-                item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty(parent.defaultProperty()));
-            else
-                item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty("data"));
         }
+
+        foreach (const ModelNode &nodeToReparented, nodeReparentVector)
+            parentProperty.reparentHere(nodeToReparented);
+
+        synchronizeParent(m_itemList, parentProperty.parentModelNode());
     }
 }
 
diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h
index a755e62613c840bbeee11767d18229693ac6d719..671feef0388f72034760914fc5836b243c0345ba 100644
--- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h
+++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h
@@ -70,7 +70,7 @@ public:
     void setItems(const QList<FormEditorItem*> &itemList);
     void setItem(FormEditorItem* item);
     void synchronizeInstanceParent(const QList<FormEditorItem*> &itemList);
-
+    void synchronizeParent(const QList<FormEditorItem*> &itemList, const ModelNode &parentNode);
     void begin(const QPointF& beginPoint);
     void update(const QPointF& updatePoint, Snapping useSnapping, State stateToBeManipulated = UseActualState);
     void reparentTo(FormEditorItem *newParent);
@@ -123,6 +123,7 @@ private:
     QList<QGraphicsItem*> m_graphicsLineList;
     bool m_isActive;
     RewriterTransaction m_rewriterTransaction;
+    QPointF m_lastPosition;
 };
 
 }
diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp
index a2d818d4dd260ecc2021290bfce2634518bb2fb0..539c57578d4d5b7d04f6b2392be7fc205b6acb71 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.cpp
+++ b/src/plugins/qmldesigner/components/integration/componentview.cpp
@@ -212,6 +212,8 @@ void ComponentView::instanceInformationsChange(const QMultiHash<ModelNode, Infor
 void ComponentView::instancesRenderImageChanged(const QVector<ModelNode> &/*nodeList*/) {}
 void ComponentView::instancesPreviewImageChanged(const QVector<ModelNode> &/*nodeList*/) {}
 void ComponentView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeList*/) {}
+void ComponentView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) {}
+
 void ComponentView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) {}
 
 void ComponentView::rewriterBeginTransaction() {}
diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h
index fef34556b511b714afe8dcfe7d22170ac53d288b..3541fbc7602748f141d98a1a6ae94d3c132404f4 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.h
+++ b/src/plugins/qmldesigner/components/integration/componentview.h
@@ -81,6 +81,8 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
+
     void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
 
     void rewriterBeginTransaction();
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
index ead2ab44a1df169ac3a66833ed18a5c6ebfbfe58..41c0e819cca54e73f00e398185d2fbf07da4917a 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
@@ -92,6 +92,11 @@ void DesignDocumentControllerView::instancesChildrenChanged(const QVector<ModelN
 
 }
 
+void DesignDocumentControllerView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/)
+{
+
+}
+
 void DesignDocumentControllerView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/)
 {
 
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
index a915eeb4cd97a82da356aed627ffb74464dc72b5..6725ab4ea44c793434d451e61f3877e113c82aaa 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
@@ -68,6 +68,8 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
+
     void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
 
     void rewriterBeginTransaction();
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
index 611257b27f0fabb7daf9e1fa93fd34b6e9d8d3c8..27133cffde8d684df072bbfc7c1519c147b8a2bf 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
@@ -172,6 +172,11 @@ void ItemLibraryView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeL
 
 }
 
+void ItemLibraryView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/)
+{
+
+}
+
 void ItemLibraryView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/)
 {
 
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
index 3c61139efe3b5ae498a5be5dc3297d8c3c8863eb..576de2254629273f0b519908b33e6ed738e75111 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
@@ -84,6 +84,8 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
+
     void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
 
     void rewriterBeginTransaction();
diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h
index 88fc9204c9cd165066068cb1f4a563272f2a80a6..45b2a064d67f492fb2d2d64e3674c7904b63cd7b 100644
--- a/src/plugins/qmldesigner/designercore/include/abstractview.h
+++ b/src/plugins/qmldesigner/designercore/include/abstractview.h
@@ -121,8 +121,11 @@ public:
     void emitInstancesChildrenChanged(const QVector<ModelNode> &nodeList);
     void emitRewriterBeginTransaction();
     void emitRewriterEndTransaction();
+    void emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector);
     void emitActualStateChanged(const ModelNode &node);
 
+    void sendTokenToInstances(const QString &token, int number, const QVector<ModelNode> &nodeVector);
+
     virtual void modelAttached(Model *model);
     virtual void modelAboutToBeDetached(Model *model);
 
@@ -144,6 +147,8 @@ public:
     virtual void instancesRenderImageChanged(const QVector<ModelNode> &nodeList) = 0;
     virtual void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList) = 0;
     virtual void instancesChildrenChanged(const QVector<ModelNode> &nodeList) = 0;
+    virtual void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector) = 0;
+
     virtual void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) = 0;
 
     virtual void rewriterBeginTransaction() = 0;
diff --git a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h
index 6260a3461c38555455c8ec4a812ed9907507992a..9e69201688d8101110fd9fb25b96d7ec64007de2 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h
@@ -47,6 +47,11 @@ class NodeAbstractProperty : public AbstractProperty
     friend class QmlDesigner::ModelNode;
     friend class QmlDesigner::Internal::ModelPrivate;
     friend class QmlDesigner::AbstractProperty;
+
+    friend CORESHARED_EXPORT bool operator ==(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2);
+    friend CORESHARED_EXPORT bool operator !=(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2);
+    friend CORESHARED_EXPORT uint qHash(const NodeAbstractProperty& property);
+
 public:
     NodeAbstractProperty();
     NodeAbstractProperty(const NodeAbstractProperty &property, AbstractView *view);
@@ -63,6 +68,13 @@ protected:
     void reparentHere(const ModelNode &modelNode, bool isNodeList);
 };
 
+
+CORESHARED_EXPORT bool operator ==(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2);
+CORESHARED_EXPORT bool operator !=(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2);
+CORESHARED_EXPORT uint qHash(const NodeAbstractProperty& property);
+CORESHARED_EXPORT QTextStream& operator<<(QTextStream &stream, const NodeAbstractProperty &property);
+CORESHARED_EXPORT QDebug operator<<(QDebug debug, const NodeAbstractProperty &property);
+
 } // namespace QmlDesigner
 
 #endif // NODEABSTRACTPROPERTY_H
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
index 5d3ef307d42942ebc80813df3e536d9e757c4a72..053da698e22307923cb5b1b20086e9b1c266a468 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
@@ -70,6 +70,7 @@ class RemoveInstancesCommand;
 class RemovePropertiesCommand;
 class CompleteComponentCommand;
 class InformationContainer;
+class TokenCommand;
 
 class CORESHARED_EXPORT NodeInstanceView : public AbstractView, public NodeInstanceClientInterface
 {
@@ -107,10 +108,12 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
     void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data);
     void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
     void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
 
+
     void rewriterBeginTransaction();
     void rewriterEndTransaction();
 
@@ -136,11 +139,14 @@ public:
     void childrenChanged(const ChildrenChangedCommand &command);
     void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command);
     void componentCompleted(const ComponentCompletedCommand &command);
+    void token(const TokenCommand &command);
 
     QImage statePreviewImage(const ModelNode &stateNode) const;
 
     void setPathToQt(const QString &pathToQt);
 
+    void sendToken(const QString &token, int number, const QVector<ModelNode> &nodeVector);
+
 signals:
     void qmlPuppetCrashed();
 
diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
index 4b72f12481b9438f3780fa28e6b2ac12e21e56c0..d77bfbb6cb3e8396eda8771af54519d5e1ba17a6 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
@@ -98,6 +98,7 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
 
     void rewriterBeginTransaction();
     void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h
index 2f3bf35e5c7d50b509422988e7621006c2015a0f..e78b6e733a9873a32bf97352487de8686a775ee7 100644
--- a/src/plugins/qmldesigner/designercore/include/rewriterview.h
+++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h
@@ -143,6 +143,8 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
+
     void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
 
     void rewriterBeginTransaction();
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp
index 3af5c4f0ba1ef1d758eb634c3c40270ae7cd9c41..8c8f1bef42a360bab8c6b37787f0fbc34f92c8fd 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp
@@ -65,6 +65,7 @@
 #include "imagecontainer.h"
 #include "statepreviewimagechangedcommand.h"
 #include "componentcompletedcommand.h"
+#include "tokencommand.h"
 
 #include "synchronizecommand.h"
 
@@ -241,6 +242,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command)
     static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand");
     static const int componentCompletedCommandType = QMetaType::type("ComponentCompletedCommand");
     static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand");
+    static const int tokenCommandType = QMetaType::type("TokenCommand");
 
     if (command.userType() ==  informationChangedCommandType)
         nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>());
@@ -254,6 +256,8 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command)
         nodeInstanceClient()->statePreviewImagesChanged(command.value<StatePreviewImageChangedCommand>());
     else if (command.userType() == componentCompletedCommandType)
         nodeInstanceClient()->componentCompleted(command.value<ComponentCompletedCommand>());
+    else if (command.userType() == tokenCommandType)
+        nodeInstanceClient()->token(command.value<TokenCommand>());
     else if (command.userType() == synchronizeCommandType) {
         SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>();
         m_synchronizeId = synchronizeCommand.synchronizeId();
@@ -523,4 +527,9 @@ void NodeInstanceServerProxy::changeNodeSource(const ChangeNodeSourceCommand &co
     writeCommand(QVariant::fromValue(command));
 }
 
+void NodeInstanceServerProxy::token(const TokenCommand &command)
+{
+    writeCommand(QVariant::fromValue(command));
+}
+
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h
index 6197694df0e588f567ec1a4871f9116c4c733191..42bf3e95ce680581bd818905ffdd2bca41caf9e8 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h
@@ -71,6 +71,7 @@ public:
     void changeState(const ChangeStateCommand &command);
     void completeComponent(const CompleteComponentCommand &command);
     void changeNodeSource(const ChangeNodeSourceCommand &command);
+    void token(const TokenCommand &command);
 
 protected:
     void writeCommand(const QVariant &command);
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index eca58fa321bf615f43627879f4dfbf169003fb03..b21add18e2bb9c9c763b535e4355f07ecd9a54d2 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -80,6 +80,7 @@
 #include "statepreviewimagechangedcommand.h"
 #include "completecomponentcommand.h"
 #include "componentcompletedcommand.h"
+#include "tokencommand.h"
 
 #include "nodeinstanceserverproxy.h"
 
@@ -483,6 +484,11 @@ void NodeInstanceView::instancesChildrenChanged(const QVector<ModelNode> &/*node
 
 }
 
+void NodeInstanceView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/)
+{
+
+}
+
 void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data)
 {
     if (node.isRootNode() && (name == "width" || name == "height")) {
@@ -1165,4 +1171,30 @@ void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command)
         emitInstancesChildrenChanged(childNodeVector);
 }
 
+void NodeInstanceView::token(const TokenCommand &command)
+{
+    if (!model())
+        return;
+
+    QVector<ModelNode> nodeVector;
+
+    foreach (const qint32 &instanceId, command.instances()) {
+        if (hasModelNodeForInternalId(instanceId)) {
+            nodeVector.append(modelNodeForInternalId(instanceId));
+        }
+    }
+
+
+    emitInstanceToken(command.tokenName(), command.tokenNumber(), nodeVector);
+}
+
+void NodeInstanceView::sendToken(const QString &token, int number, const QVector<ModelNode> &nodeVector)
+{
+    QVector<qint32> instanceIdVector;
+    foreach (const ModelNode &node, nodeVector)
+        instanceIdVector.append(node.internalId());
+
+    nodeInstanceServer()->token(TokenCommand(token, number, instanceIdVector));
+}
+
 }
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index 4117986b1ea65eaf366d54b9a6ee4e7c68c2be31..b8f589b6694e064a8543de97b73f9c5c588274a1 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -429,6 +429,18 @@ void AbstractView::emitRewriterBeginTransaction()
         model()->m_d->notifyRewriterBeginTransaction();
 }
 
+void AbstractView::sendTokenToInstances(const QString &token, int number, const QVector<ModelNode> &nodeVector)
+{
+    if (nodeInstanceView())
+        nodeInstanceView()->sendToken(token, number, nodeVector);
+}
+
+void AbstractView::emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector)
+{
+    if (nodeInstanceView())
+        model()->m_d->notifyInstanceToken(token, number, nodeVector);
+}
+
 void AbstractView::emitRewriterEndTransaction()
 {
     if (model())
diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index 0e01f9c550f9c48ece78a1cf9aee6490cae54bd5..938026c3f9f42093dd4627910bc62c119f01b15e 100644
--- a/src/plugins/qmldesigner/designercore/model/model.cpp
+++ b/src/plugins/qmldesigner/designercore/model/model.cpp
@@ -681,6 +681,36 @@ void ModelPrivate::notifyRewriterEndTransaction()
     }
 }
 
+void ModelPrivate::notifyInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector)
+{
+    bool resetModel = false;
+    QString description;
+
+    QVector<Internal::InternalNode::Pointer> internalVector(toInternalNodeVector(nodeVector));
+
+
+    try {
+        if (rewriterView())
+            rewriterView()->instancesToken(token, number, toModelNodeVector(internalVector, rewriterView()));
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+    foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
+        Q_ASSERT(view != 0);
+        view->instancesToken(token, number, toModelNodeVector(internalVector, view.data()));
+    }
+
+    if (nodeInstanceView()) {
+        nodeInstanceView()->instancesToken(token, number, toModelNodeVector(internalVector, nodeInstanceView()));
+    }
+
+    if (resetModel) {
+        resetModelByRewriter(description);
+    }
+}
+
 void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data)
 {
     bool resetModel = false;
diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h
index c806b1b82ae7e27f7117c1488bbce33333ae1fa2..bc6ff14564e2def5c7505810903501cd5781043c 100644
--- a/src/plugins/qmldesigner/designercore/model/model_p.h
+++ b/src/plugins/qmldesigner/designercore/model/model_p.h
@@ -156,12 +156,13 @@ public:
     void notifyInstancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void notifyInstancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void notifyInstancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void notifyInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector);
+
     void notifyActualStateChanged(const ModelNode &node);
 
     void notifyRewriterBeginTransaction();
     void notifyRewriterEndTransaction();
 
-
     void setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList);
     void clearSelectedNodes();
     QList<InternalNodePointer> selectedNodes() const;
diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp
index 530269f22a36ad69eb5fb0e47d633c9587abc2d6..8ebd1d4a7e06eeb83884df02d8f025ea60744fd0 100644
--- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp
+++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp
@@ -141,4 +141,36 @@ QList<ModelNode> NodeAbstractProperty::allSubNodes()
     return toModelNodeList(property->allSubNodes(), view());
 }
 
+/*!
+  \brief Returns if the the two property handles reference the same property in the same node
+*/
+bool operator ==(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2)
+{
+    return AbstractProperty(property1) == AbstractProperty(property2);
+}
+
+/*!
+  \brief Returns if the the two property handles do not reference the same property in the same node
+  */
+bool operator !=(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2)
+{
+    return !(property1 == property2);
+}
+
+uint qHash(const NodeAbstractProperty &property)
+{
+    return qHash(AbstractProperty(property));
+}
+
+QDebug operator<<(QDebug debug, const NodeAbstractProperty &property)
+{
+    return debug.nospace() << "NodeAbstractProperty(" << (property.isValid() ? property.name() : QLatin1String("invalid")) << ')';
+}
+
+QTextStream& operator<<(QTextStream &stream, const NodeAbstractProperty &property)
+{
+    stream << "NodeAbstractProperty(" << property.name() << ')';
+
+    return stream;
+}
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
index 028f028677e4873b8c3ba3dd84eac7460cd53a33..ceec3fbd2125f7cf68809eb4ad0aa30550224fdf 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
@@ -414,6 +414,11 @@ void QmlModelView::importsChanged(const QList<Import> &/*addedImports*/, const Q
 
 }
 
+void QmlModelView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/)
+{
+
+}
+
 void QmlModelView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/)
 {
 
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index 6b1d820012c6e691b7e3152ba021b9b995501426..a2ce780006bc346ba10b19db670ac161b70d3df2 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -407,6 +407,11 @@ void RewriterView::instancesChildrenChanged(const QVector<ModelNode> & /*nodeLis
 
 }
 
+void RewriterView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/)
+{
+
+}
+
 void RewriterView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/)
 {
 
diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
index b49a2358a9520f9f495224534e8ed3696815b146..2bb3e4eadc882a900ad893a97fa0b96a486f5757 100644
--- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
@@ -260,6 +260,13 @@ void ViewLogger::instancesChildrenChanged(const QVector<ModelNode> &nodeList)
         m_output << time() << indent("node: ") << node << endl;
 }
 
+void ViewLogger::instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector)
+{
+    m_output << time() << indent("instancesToken:") << tokenName << tokenNumber << endl;
+    foreach (const ModelNode &node, nodeVector)
+        m_output << time() << indent("node: ") << node << endl;
+}
+
 void ViewLogger::nodeSourceChanged(const ModelNode &node, const QString & /*newNodeSource*/)
 {
     m_output << time() << indent("nodeSourceChanged:") << endl;
diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h
index 01fc89ca25e80614e95c0c04ffd9a756897eac4a..2ca8ffa5e7eb7f5c40bb4162cfb8770d4100c7fc 100644
--- a/src/plugins/qmldesigner/designercore/model/viewlogger.h
+++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h
@@ -81,6 +81,8 @@ public:
     void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
     void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
     void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
+    void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector);
+
     void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
 
     void rewriterBeginTransaction();