diff --git a/GUI/coregui/Models/ItemFactory.cpp b/GUI/coregui/Models/ItemFactory.cpp
index 7ac30d1e84a57b846c119c5ef786dc11acd09b41..1d889a534202b20d7b36ee891ea0842e95112389 100644
--- a/GUI/coregui/Models/ItemFactory.cpp
+++ b/GUI/coregui/Models/ItemFactory.cpp
@@ -48,3 +48,9 @@ ParameterizedItem *ItemFactory::createEmptyItem()
 {
     return new ParameterizedItem();
 }
+
+
+bool ItemFactory::isValidName(const QString &name)
+{
+    return m_all_item_names.contains(name);
+}
diff --git a/GUI/coregui/Models/ItemFactory.h b/GUI/coregui/Models/ItemFactory.h
index c51d0ca45ff38efa2449b91ac65d78bd8471a270..5aad2387c7e7335507db5bc21558d9581aefc23b 100644
--- a/GUI/coregui/Models/ItemFactory.h
+++ b/GUI/coregui/Models/ItemFactory.h
@@ -33,6 +33,9 @@ public:
         return m_all_item_names;
     }
 
+    //! returns true if item with given name can be created
+    static bool isValidName(const QString &name);
+
 private:
     static QList<QString> m_all_item_names;
     ItemFactory() {}
diff --git a/GUI/coregui/Models/MultiLayerItem.cpp b/GUI/coregui/Models/MultiLayerItem.cpp
index a4dad561d2fcc6034a64422c7ca7f9774d46262c..8ffe76200ac66452df9fb4dfb7166d05659634fb 100644
--- a/GUI/coregui/Models/MultiLayerItem.cpp
+++ b/GUI/coregui/Models/MultiLayerItem.cpp
@@ -21,6 +21,7 @@ MultiLayerItem::MultiLayerItem(ParameterizedItem *parent)
 {
     setProperty("Cross Correlation Length", 0.0);
     m_valid_children.append(QString("Layer"));
+    m_valid_children.append(QString("MultiLayer"));
 }
 
 MultiLayerItem::~MultiLayerItem()
diff --git a/GUI/coregui/Models/SessionModel.cpp b/GUI/coregui/Models/SessionModel.cpp
index 8d1d99fec939a493430600b731e1f60f759edb4b..8efdde8da724aea1823bf4e61fdeaff4513447eb 100644
--- a/GUI/coregui/Models/SessionModel.cpp
+++ b/GUI/coregui/Models/SessionModel.cpp
@@ -355,6 +355,7 @@ ParameterizedItem *SessionModel::insertNewItem(QString model_type,
             return 0;
     }
     ParameterizedItem *new_item = ItemFactory::createItem(model_type);
+    Q_ASSERT(new_item);
     parent->insertChildItem(row, new_item);
     return new_item;
 }
@@ -467,3 +468,36 @@ void SessionModel::writeProperty(QXmlStreamWriter *writer,
         writer->writeEndElement(); // end ParameterTag
     }
 }
+
+
+
+void SessionModel::moveParameterizedItem(ParameterizedItem *item, ParameterizedItem *new_parent, int row)
+{
+    qDebug() << "";
+    qDebug() << "";
+    qDebug() << "SessionModel::moveParameterizedItem() " << item << new_parent << row;
+
+    if(!new_parent) new_parent = m_root_item;
+
+    if(item->parent() == new_parent && indexOfItem(item).row() == row) {
+        qDebug() << "SessionModel::moveParameterizedItem() -> no need to move, same parent, same raw. ";
+        return;
+    }
+
+    QByteArray xml_data;
+    QXmlStreamWriter writer(&xml_data);
+    writeItemAndChildItems(&writer, item);
+
+    QXmlStreamReader reader(xml_data);
+    if (row == -1) row = new_parent->childItemCount();
+
+    qDebug() << "    >>> Beginning to insert indexOfItem(new_parent)" << indexOfItem(new_parent);
+    beginInsertRows(indexOfItem(new_parent), row, row);
+    readItems(&reader, new_parent, row);
+    endInsertRows();
+
+    qDebug() << "    >>> Now deleting indexOfItem(item).row()" << indexOfItem(item).row();
+
+    removeRows(indexOfItem(item).row(), 1, indexOfItem(item->parent()));
+
+}
diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h
index cc9def184269d052b280d1babfc4fb7a94b4fb0f..a0e511c1721a68bb01f35a4ae3916ce0110ebfd3 100644
--- a/GUI/coregui/Models/SessionModel.h
+++ b/GUI/coregui/Models/SessionModel.h
@@ -96,6 +96,8 @@ public:
     void writeTo(QXmlStreamWriter *writer);
 
 
+    void moveParameterizedItem(ParameterizedItem *item, ParameterizedItem *new_parent = 0, int row = -1);
+
 private:
     ParameterizedItem *insertNewItem(QString model_type,
                                      ParameterizedItem *parent,
diff --git a/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp b/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp
index caa521cb2732a0d0249c92a39201de771bfbed1f..3b0d6fe13e7060b87e7182980e5e070175ed49b1 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp
@@ -136,9 +136,16 @@ QList<QGraphicsItem *> ConnectableView::connectInputPort(ConnectableView *other)
     foreach(QGraphicsItem *item, childItems()) {
         NodeEditorPort *port = dynamic_cast<NodeEditorPort *>(item);
         if (port && port->isInput() && !port->isConnected()) {
+//        if (port && port->isInput()) {
+
+
             foreach(QGraphicsItem *other_item, other->childItems()) {
                 NodeEditorPort *other_port= dynamic_cast<NodeEditorPort *>(other_item);
                 if(other_port && port->getPortType() == other_port->getPortType()) {
+
+//                    // deleting old connection
+//                    if(port->isConnected()) port->deleteAllConnections();
+
                     NodeEditorConnection *conn = new NodeEditorConnection(0, scene());
                     conn->setPort2(port);
                     conn->setPort1(other_port);
diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp
index 7f82721ffd55388ede4d10c56766f959b2aaa7f1..ede0a40a0636607f4de2b692a0bc9c061599c858 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp
@@ -142,3 +142,21 @@ int DesignerHelper::nanometerToScreen(double nanometer)
     return result;
 }
 
+
+QRectF DesignerHelper::getDefaultBoundingRect(const QString &name)
+{
+    if (name==QString("MultiLayer")) {
+        return QRect(0, 0, getDefaultMultiLayerWidth(), getDefaultMultiLayerHeight());
+
+    } else  if (name==QString("Layer")) {
+        return QRect(0, 0, getDefaultLayerWidth(), getDefaultLayerHeight());
+
+    } else  if (name==QString("ParticleLayout")) {
+        return QRect(0, 0, getDefaultDecorationWidth(), getDefaultDecorationHeight());
+
+    } else {
+        return QRect();
+    }
+
+}
+
diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h
index d156419524b9e93ce96478a1cba596dca85c32b5..28d178d9ac1592b3e3ed48fd092d9a1001e362d4 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h
@@ -72,7 +72,10 @@ public:
     //! to have reasonable graphics representation of layer in the form of QRect
     static int nanometerToScreen(double nanometer);
 
-    private:
+    //! returns default bounding rectangle for given SampleView name
+    static QRectF getDefaultBoundingRect(const QString &name);
+
+private:
     static int m_default_layer_height;
     static int m_default_layer_width;
 };
diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp
index 4ea2ff4a30cd0e35710ba8c868ac812347b09b26..a58a2b5d74edcada600785ac29588320072868e1 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp
@@ -4,11 +4,17 @@
 #include "SampleViewFactory.h"
 #include "SampleViewAligner.h"
 #include "IView.h"
+#include "LayerView.h"
 #include "ConnectableView.h"
+#include "ItemFactory.h"
 #include "ParameterizedGraphicsItem.h"
 #include "NodeEditor.h"
+#include "NodeEditorConnection.h"
+#include "DesignerMimeData.h"
 #include <QItemSelection>
 #include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
 
 
 DesignerScene2::DesignerScene2(QObject *parent)
@@ -22,6 +28,7 @@ DesignerScene2::DesignerScene2(QObject *parent)
 
     NodeEditor *nodeEditor = new NodeEditor(parent);
     nodeEditor->install(this);
+    connect(nodeEditor, SIGNAL(connectionIsEstablished(NodeEditorConnection*)), this, SLOT(onEstablishedConnection(NodeEditorConnection*)));
 
     connect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged()));
 
@@ -36,19 +43,20 @@ void DesignerScene2::setSessionModel(SessionModel *model)
     if(model != m_sessionModel) {
 
         if(m_sessionModel) {
-            disconnect(m_sessionModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene()));
-            disconnect(m_sessionModel, SIGNAL(rowsInserted(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int)));
-            disconnect(m_sessionModel, SIGNAL(rowsRemoved(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int)));
-            disconnect(m_sessionModel, SIGNAL(modelReset()), this, SLOT(updateScene()));
+            // TODO disconnect all
         }
 
         m_sessionModel = model;
 
         connect(m_sessionModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene()));
-        connect(m_sessionModel, SIGNAL(rowsInserted(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int)));
-        connect(m_sessionModel, SIGNAL(rowsRemoved(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int)));
-        connect(m_sessionModel, SIGNAL(modelReset()), this, SLOT(updateScene()));
+
+        connect(m_sessionModel, SIGNAL(rowsInserted(QModelIndex, int,int)), this, SLOT(onRowsInserted(QModelIndex, int,int)));
         connect(m_sessionModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)), this, SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int)));
+        connect(m_sessionModel, SIGNAL(rowsRemoved(QModelIndex, int,int)), this, SLOT(onRowsRemoved(QModelIndex, int,int)));
+
+
+        connect(m_sessionModel, SIGNAL(modelReset()), this, SLOT(updateScene()));
+
 
         resetScene();
         updateScene();
@@ -88,24 +96,33 @@ void DesignerScene2::resetScene()
 }
 
 
-void DesignerScene2::updateScene(const QModelIndex &parent, int first, int last)
+void DesignerScene2::updateScene()
+{
+    qDebug() << "DesignerScene2::updateScene()";
+    m_orderedViews.clear();
+    updateViews();
+    alignViews();
+
+}
+
+
+void DesignerScene2::onRowsInserted(const QModelIndex &parent, int first, int last)
 {
     Q_UNUSED(parent);
     Q_UNUSED(first);
     Q_UNUSED(last);
-
-    qDebug() << "DesignerScene2::updateScene(const QModelIndex &parent, int first, int lastB)";
+    qDebug() << "DesignerScene2::onRowsInserted()" << parent;
     updateScene();
 }
 
 
-void DesignerScene2::updateScene()
+void DesignerScene2::onRowsRemoved(const QModelIndex &parent, int first, int last)
 {
-    qDebug() << "DesignerScene2::updateScene()";
-    m_orderedViews.clear();
-    updateViews();
-    alignViews();
-
+    Q_UNUSED(parent);
+    Q_UNUSED(first);
+    Q_UNUSED(last);
+    qDebug() << "DesignerScene2::onRowsRemoved()" << parent;
+    updateScene();
 }
 
 
@@ -115,10 +132,8 @@ void DesignerScene2::onRowsAboutToBeRemoved(const QModelIndex &parent, int first
     qDebug() << "DesignerScene2::onRowsAboutToBeRemoved()" << parent << first << last;
     for(int irow = first; irow<=last; ++irow ) {
         QModelIndex itemIndex = m_sessionModel->index(irow, 0, parent);
-        deleteViews(itemIndex);
-        removeItemFromScene(m_sessionModel->itemForIndex(itemIndex));
-//        ParameterizedItem *item = m_sessionModel->itemForIndex(itemIndex);
-//        removeItemFromScene(item);
+        deleteViews(itemIndex); // deleting all child items
+        removeItemFromScene(m_sessionModel->itemForIndex(itemIndex)); // deleting parent item
     }
     m_block_selection = false;
 }
@@ -126,12 +141,11 @@ void DesignerScene2::onRowsAboutToBeRemoved(const QModelIndex &parent, int first
 
 void DesignerScene2::onSessionSelectionChanged(const QItemSelection &selected, const QItemSelection & /* deselected */)
 {
-    qDebug() << "DesignerScene2::onSessionSelectionChanged()";
+    //qDebug() << "DesignerScene2::onSessionSelectionChanged()";
 
     QModelIndexList indices = selected.indexes();
     if(indices.size()) {
-        ParameterizedGraphicsItem *item = static_cast<ParameterizedGraphicsItem *>(
-                indices.back().internalPointer());
+        ParameterizedItem *item = m_sessionModel->itemForIndex(indices.back());
         Q_ASSERT(item);
         IView *view = m_ItemToView[item];
         //Q_ASSERT(view);
@@ -147,11 +161,11 @@ void DesignerScene2::onSessionSelectionChanged(const QItemSelection &selected, c
 
 }
 
+
 void DesignerScene2::onSceneSelectionChanged()
 {
-    qDebug() << "DesignerScene2::onSceneSelectionChanged() 1.1";
+    //qDebug() << "DesignerScene2::onSceneSelectionChanged() 1.1";
     if(m_block_selection) return;
-    qDebug() << "DesignerScene2::onSceneSelectionChanged() 1.2";
 
     m_selectionModel->clearSelection();
 
@@ -159,7 +173,7 @@ void DesignerScene2::onSceneSelectionChanged()
     for(int i=0; i<selected.size(); ++i) {
         IView *view = dynamic_cast<IView *>(selected[i]);
         if(view) {
-            ParameterizedItem *sessionItem = view->getSessionItem();
+            ParameterizedItem *sessionItem = view->getParameterizedItem();
             QModelIndex itemIndex = m_sessionModel->indexOfItem(sessionItem);
             Q_ASSERT(itemIndex.isValid());
             m_selectionModel->select(itemIndex, QItemSelectionModel::Select);
@@ -169,13 +183,11 @@ void DesignerScene2::onSceneSelectionChanged()
 }
 
 
-
-
 void DesignerScene2::updateViews(const QModelIndex & parentIndex, IView *parentView)
 {
     Q_ASSERT(m_sessionModel);
 
-    qDebug() << "DesignerScene2::update()";
+    qDebug() << "DesignerScene2::updateVIews()";
 
     if(!parentIndex.isValid()) {
         qDebug() << "Dumping model";
@@ -189,7 +201,7 @@ void DesignerScene2::updateViews(const QModelIndex & parentIndex, IView *parentV
 
                 childView = addViewForItem(item);
                 m_orderedViews.push_back(childView);
-                if(parentView) parentView->addView(childView);
+                if(parentView) parentView->addView(childView, i_row);
 
          } else {
              qDebug() << "not a parameterized graphics item";
@@ -197,7 +209,6 @@ void DesignerScene2::updateViews(const QModelIndex & parentIndex, IView *parentV
 
          updateViews( itemIndex, childView);
      }
-
 }
 
 
@@ -212,7 +223,7 @@ IView *DesignerScene2::addViewForItem(ParameterizedItem *item)
         view = SampleViewFactory::createSampleView(item->modelType());
         if(view) {
             m_ItemToView[item] = view;
-            view->setSessionItem(item);
+            view->setParameterizedItem(item);
             addItem(view);
             return view;
         }
@@ -261,7 +272,8 @@ void DesignerScene2::removeItemFromScene(ParameterizedItem *item)
             IView *view = it.value();
             view->setSelected(false);
             m_ItemToView.erase(it);
-            delete view;
+            emit view->aboutToBeDeleted();
+            view->deleteLater();
             update();
             break;
         }
@@ -269,4 +281,160 @@ void DesignerScene2::removeItemFromScene(ParameterizedItem *item)
 }
 
 
+void DesignerScene2::deleteSelectedItems()
+{
+    qDebug() << "DesignerScene::deleteSelectedItems()" << selectedItems().size();
+    // FIXME handle multiple selection
+    foreach(QGraphicsItem *graphicsItem, selectedItems()) {
+        IView *view = dynamic_cast<IView *>(graphicsItem);
+        if(view) {
+            qDebug() << "xxx";
+            ParameterizedItem *item = view->getParameterizedItem();
+            Q_ASSERT(item);
+            m_sessionModel->removeRows(m_sessionModel->indexOfItem(item).row(), 1, m_sessionModel->indexOfItem(item->parent()));
+        }
+
+
+        NodeEditorConnection *connection = dynamic_cast<NodeEditorConnection *>(graphicsItem);
+        if(connection) removeConnection(connection);
+    }
+
+
+}
+
+
+
+void DesignerScene2::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+
+//    if(event->button()==Qt::LeftButton) {
+//        qDebug() << "DesignerScene2::mouseMoveEvent()";
+
+//    }
+
+//    LayerView2 *layer = qgraphicsitem_cast<LayerView2 *>(mouseGrabberItem());
+//    if(layer) {
+//        qDebug() << "DesignerScene2::mouseMoveEvent()";
+//        foreach(QGraphicsItem *item, items()) {
+//            if(item->type() == DesignerHelper::MultiLayerType) {
+//                MultiLayerView2 *multilayer = qgraphicsitem_cast<MultiLayerView2 *>(item);
+//                if(multilayer->mapRectToScene(multilayer->boundingRect()).intersects(layerRect)) {
+
+
+
+//    }
+
+
+    QGraphicsScene::mouseMoveEvent(event);
+}
+
+
+void DesignerScene2::drawForeground(QPainter* painter, const QRectF& rect)
+{
+    Q_UNUSED(rect);
+    //    QRectF SceneRect = this->sceneRect();
+
+    LayerView *layer = qgraphicsitem_cast<LayerView *>(mouseGrabberItem());
+    if(!m_layer_drop_area.isNull() && layer) {
+        //qDebug() << "DesignerScene2::drawForeground" << m_layer_drop_area;
+        painter->setPen(QPen(Qt::darkBlue, 2, Qt::DashLine));
+        painter->drawLine(m_layer_drop_area.left()-10, m_layer_drop_area.center().y(), m_layer_drop_area.right()+10, m_layer_drop_area.center().y());
+        //painter->drawRect(m_layer_drop_area);
+        invalidate();
+    }
+
+
+}
+
+
+
+void DesignerScene2::onEstablishedConnection(NodeEditorConnection *connection)
+{
+    qDebug() << "DesignerScene2::onEstablishedConnection()";
+    IView *parentView = dynamic_cast<IView *>(connection->getInputPort()->parentItem());
+    IView *childView = dynamic_cast<IView *>(connection->getOutputPort()->parentItem());
+    Q_ASSERT(parentView);
+    Q_ASSERT(childView);
+    delete connection; // deleting just created connection because it will be recreated from the model
+    m_sessionModel->moveParameterizedItem(childView->getParameterizedItem(), parentView->getParameterizedItem());
+}
+
+
+void DesignerScene2::removeConnection(NodeEditorConnection *connection)
+{
+    IView *childView = dynamic_cast<IView *>(connection->getOutputPort()->parentItem());
+    m_sessionModel->moveParameterizedItem(childView->getParameterizedItem(), 0);
+}
+
+
+
+void DesignerScene2::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
+{
+    qDebug() << "DesignerScene2::dragEnterEvent()";
+    return QGraphicsScene::dragEnterEvent(event);
+}
+
+void DesignerScene2::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
+{
+    qDebug() << "DesignerScene2::dragMoveEvent()";
+    const DesignerMimeData *mimeData = checkDragEvent(event);
+    if(mimeData) {
+        // Layer can be droped only on MultiLayer
+        if(mimeData->getClassName() == QString("Layer")) {
+            QGraphicsScene::dragMoveEvent(event);
+        }
+    }
+}
+
+//void DesignerScene2::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
+//{
+//    qDebug() << "DesignerScene2::dragLeaveEvent()";
+//    return QGraphicsScene::dragLeaveEvent(event);
+//}
+
+void DesignerScene2::dropEvent(QGraphicsSceneDragDropEvent *event)
+{
+    const DesignerMimeData *mimeData = checkDragEvent(event);
+    qDebug() << "DesignerScene2::dropEvent()" << mimeData;
+    if (mimeData) {
+        // layer can be dropped on MultiLayer only
+        if(mimeData->getClassName() == "Layer") {
+            qDebug() << "DesignerScene2::dropEvent() dont want to drop" << mimeData;
+            QGraphicsScene::dropEvent(event);
+        } else {
+            qDebug() << "DesignerScene2::dropEvent() -> about to drop";
+            if(SampleViewFactory::isValidName(mimeData->getClassName())) {
+                ParameterizedItem *new_item = m_sessionModel->insertNewItem(mimeData->getClassName());
+
+                // propagating drop coordinates to ParameterizedItem
+                QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(mimeData->getClassName());
+                new_item->setProperty("xpos", event->scenePos().x()-boundingRect.width()/2);
+                new_item->setProperty("ypos", event->scenePos().y()-boundingRect.height()/2);
+            }
+        }
+
+    }
+
+//    return QGraphicsScene::dropEvent(event);
+}
+
+
+
+const DesignerMimeData *DesignerScene2::checkDragEvent(QGraphicsSceneDragDropEvent * event)
+{
+    //qDebug() << "DesignerScene2::checkDragEvent -> ";
+    const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData());
+    if (!mimeData) {
+        event->ignore();
+        return 0;
+    }
+
+    if(mimeData->hasFormat("bornagain/widget") ) {
+        //qDebug() << "DesignerScene::checkDragEvent -> yes";
+        event->setAccepted(true);
+    } else {
+        event->setAccepted(false);
+    }
+    return mimeData;
+}
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h
index 271c7c17b9440a1200a6b47da3e8eb0214dd2435..43061215f0c95a69d7a5dc30050d27290aa4aa7d 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h
@@ -12,6 +12,8 @@ class ParameterizedGraphicsItem;
 class QItemSelectionModel;
 class IView;
 class QItemSelection;
+class NodeEditorConnection;
+class DesignerMimeData;
 
 
 class DesignerScene2 : public DesignerSceneInterface
@@ -25,13 +27,35 @@ public:
     void setSessionModel(SessionModel *model);
     void setSelectionModel(QItemSelectionModel *model);
 
+    SessionModel *getSessionModel() { return m_sessionModel; }
+
 public slots:
     void onSceneSelectionChanged();
     void onSessionSelectionChanged(const QItemSelection &, const QItemSelection &);
     void resetScene();
     void updateScene();
-    void updateScene(const QModelIndex &parent, int first, int last);
+
+    void onRowsInserted(const QModelIndex &parent, int first, int last);
     void onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
+    void onRowsRemoved(const QModelIndex &parent, int first, int last);
+
+    void setLayerDropArea(const QRectF &rect) { m_layer_drop_area = rect; }
+
+    void deleteSelectedItems();
+
+    void onEstablishedConnection(NodeEditorConnection *); // to process signals from NodeEditor
+    void removeConnection(NodeEditorConnection *);
+
+    void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
+    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
+    //void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
+    void dropEvent(QGraphicsSceneDragDropEvent *event);
+
+protected:
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void drawForeground(QPainter* painter, const QRectF& rect);
+    const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event);
+
 
 private:
     IView *addViewForItem(ParameterizedItem *item);
@@ -46,6 +70,8 @@ private:
 
     QMap<ParameterizedItem *, IView *> m_ItemToView;
     QList<IView *> m_orderedViews;
+
+    QRectF m_layer_drop_area;
 };
 
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp
index feb850c509e0eac08ce9990f9531d75d76a78bb5..6a920713bfcd463eb48080d742bea0cae7cd25b7 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp
@@ -1,5 +1,6 @@
 #include "DesignerView.h"
 #include "DesignerMimeData.h"
+#include "DesignerScene2.h"
 #include <QGraphicsScene>
 #include <QGraphicsView>
 #include <QVBoxLayout>
@@ -84,14 +85,11 @@ void DesignerView::clearAll()
 }
 
 
-void DesignerView::deleteItem()
+void DesignerView::deleteSelectedItems()
 {
-    QList<QGraphicsItem*> selected = m_graphicsView->scene()->selectedItems();
-    for(int i=0; i<selected.size(); ++i) {
-        m_graphicsView->scene()->removeItem(selected[i]);
-        delete selected[i];
-    }
-    m_graphicsView->scene()->update();
+    DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(m_graphicsView->scene());
+    Q_ASSERT(designerScene);
+    designerScene->deleteSelectedItems();
 }
 
 
@@ -103,10 +101,10 @@ void DesignerView::keyPressEvent(QKeyEvent *event)
     case Qt::Key_Space:
         break;
     case Qt::Key_Delete:
-        deleteItem();
+        deleteSelectedItems();
         break;
     case Qt::Key_Backspace:
-        deleteItem();
+        deleteSelectedItems();
         break;
     default:
         QWidget::keyPressEvent(event);
diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h
index c6ff997a23688ae1b5e22e703027758dc4888f67..2f4d5d5ae8addd45fb838cce02c24738469ee3ef 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h
@@ -26,9 +26,10 @@ public slots:
     void zoomIn();
     void zoomOut();
     void zoomFit();
-    void deleteItem();
+    void deleteSelectedItems();
     void clearAll();
 
+
 protected:
 //    void wheelEvent(QWheelEvent *event);
     void scaleView(qreal scaleFactor);
diff --git a/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp b/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp
index 2686e9a417a87a5095e3f1be880ad0342b00c2cc..c210f077072b14fc46ebc2aee90658ae66f7b64d 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp
@@ -85,22 +85,22 @@ void ISampleToIView::visit(const ParticleLayout *sample)
 }
 
 
-void ISampleToIView::visit(const Layer *sample)
+void ISampleToIView::visit(const Layer *)
 {
-    LayerView *layerView = new LayerView();
-    layerView->setThickness(sample->getThickness());
-    layerView->setName(sample->getName().c_str());
-    m_multiLayer->addBottomLayer(layerView);
-    m_sample_to_view[sample] = layerView;
+//    LayerView *layerView = new LayerView();
+//    layerView->setThickness(sample->getThickness());
+//    layerView->setName(sample->getName().c_str());
+//    m_multiLayer->addBottomLayer(layerView);
+//    m_sample_to_view[sample] = layerView;
 
-    const ILayout *decoration = sample->getLayout();
-    if(decoration) {
-        decoration->accept(this);
+//    const ILayout *decoration = sample->getLayout();
+//    if(decoration) {
+//        decoration->accept(this);
 
-        Q_ASSERT(m_sample_to_view[sample]);
-        Q_ASSERT(m_sample_to_view[decoration]);
-        m_connections += m_sample_to_view[sample]->connectInputPort(m_sample_to_view[decoration]);
-    }
+//        Q_ASSERT(m_sample_to_view[sample]);
+//        Q_ASSERT(m_sample_to_view[decoration]);
+//        m_connections += m_sample_to_view[sample]->connectInputPort(m_sample_to_view[decoration]);
+//    }
 
 }
 
@@ -111,24 +111,24 @@ void ISampleToIView::visit(const LayerInterface *)
 }
 
 
-void ISampleToIView::visit(const MultiLayer *sample)
+void ISampleToIView::visit(const MultiLayer *)
 {
-    Q_ASSERT(sample);
+//    Q_ASSERT(sample);
 
-    m_multiLayer = MultiLayerView::createTopMultiLayer();
+//    m_multiLayer = MultiLayerView::createTopMultiLayer();
 
-    //    goForward();
-    for(size_t i_layer=0; i_layer < sample->getNumberOfLayers(); ++i_layer) {
-        const Layer *layer = sample->getLayer(i_layer);
-        layer->accept(this);
-        if(i_layer < sample->getNumberOfInterfaces()) {
-            const LayerInterface *interface = sample->getLayerInterface(i_layer);
-            interface->accept(this);
-        }
-    }
-    //    goBack();
+//    //    goForward();
+//    for(size_t i_layer=0; i_layer < sample->getNumberOfLayers(); ++i_layer) {
+//        const Layer *layer = sample->getLayer(i_layer);
+//        layer->accept(this);
+//        if(i_layer < sample->getNumberOfInterfaces()) {
+//            const LayerInterface *interface = sample->getLayerInterface(i_layer);
+//            interface->accept(this);
+//        }
+//    }
+//    //    goBack();
 
-    m_sample_to_view[sample] = m_multiLayer;
+//    m_sample_to_view[sample] = m_multiLayer;
 
 }
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/IView.cpp b/GUI/coregui/Views/Components/SampleDesigner/IView.cpp
index ef854bb758b3cf47339dc69cfb47913aa34d6bca..0457e2868fdf77fd2db9e6d26f97ff0cfc6bf1e1 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/IView.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/IView.cpp
@@ -4,8 +4,6 @@
 #include <QDebug>
 
 
-
-
 IView::IView(QGraphicsItem *parent)
     : QGraphicsObject(parent), m_item(0)
 {
@@ -14,7 +12,7 @@ IView::IView(QGraphicsItem *parent)
 }
 
 
-void IView::setSessionItem(ParameterizedItem *item)
+void IView::setParameterizedItem(ParameterizedItem *item)
 {
     if(item) {
         m_item = item;
@@ -27,9 +25,9 @@ void IView::setSessionItem(ParameterizedItem *item)
 }
 
 
-void IView::addView(IView *childView)
+void IView::addView(IView *childView, int row)
 {
-    qDebug() << "IView::addView() " << m_item->itemName() << childView->getSessionItem()->itemName();
+    qDebug() << "IView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName() << " row:" << row;
 }
 
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/IView.h b/GUI/coregui/Views/Components/SampleDesigner/IView.h
index e7b8c95581ec6cb6f0ea53850639bf8e15d03d3f..aae2b5710c659415de855c6898fff74ad766f3fd 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/IView.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/IView.h
@@ -22,11 +22,14 @@ public:
 
     int type() const { return Type; }
 
-    virtual void setSessionItem(ParameterizedItem *item);
+    virtual void setParameterizedItem(ParameterizedItem *item);
 
-    virtual ParameterizedItem *getSessionItem() { return m_item; }
+    virtual ParameterizedItem *getParameterizedItem() { return m_item; }
 
-    virtual void addView(IView *childView);
+    virtual void addView(IView *childView, int row = 0);
+
+signals:
+    void aboutToBeDeleted();
 
 public slots:
     virtual void onChangedX();
@@ -35,7 +38,6 @@ public slots:
 
 protected:
     ParameterizedItem *m_item;
-
 };
 
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp b/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp
index 6e9b0a8dec1f1daa99fa8081fe0e5139782c7e73..ddf1beed327ee84c4e8fa67198f00e8a77b878f2 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp
@@ -65,21 +65,21 @@ void IViewToISample::visit(MultiLayerView *view)
 }
 
 
-void IViewToISample::visit(LayerView *view)
+void IViewToISample::visit(LayerView *)
 {
-    Q_ASSERT(view);
-    std::cout << get_indent() << "ViewVisitor(LayerView ) " << m_level << " " << view->type() << " " << view->getName().toStdString() << std::endl;
-    //m_views.insertMulti(m_level, view);
+//    Q_ASSERT(view);
+//    std::cout << get_indent() << "ViewVisitor(LayerView ) " << m_level << " " << view->type() << " " << view->getName().toStdString() << std::endl;
+//    //m_views.insertMulti(m_level, view);
 
 
-    QList<ConnectableView *> connections = view->getConnectedInputItems();
+//    QList<ConnectableView *> connections = view->getConnectedInputItems();
 
-    // in the absence of connections it is simple Layer
-    if(connections.empty()) {
-        m_view_to_sample[view] = view->getLayer()->clone();
+//    // in the absence of connections it is simple Layer
+//    if(connections.empty()) {
+//        m_view_to_sample[view] = view->getLayer()->clone();
 
-    // with connections it is LayerDecorator
-    } else {
+//    // with connections it is LayerDecorator
+//    } else {
 //        goForward();
 //        foreach(ConnectableView *item, connections) {
 //            item->accept(this);
@@ -92,7 +92,7 @@ void IViewToISample::visit(LayerView *view)
 //        }
 //        goBack();
 
-    }
+//    }
 
 }
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp b/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp
index 658163a21c014ae021f733050880e15c9c2f3783..0caf2125f191b8444f87d391bd1d0ed23407eebc 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp
@@ -2,27 +2,23 @@
 #include "Units.h"
 #include "ParticleLayoutView.h"
 #include "ParameterizedItem.h"
-
+#include "MultiLayerView.h"
+#include "DesignerScene2.h"
+#include "SessionModel.h"
+#include "GUIHelpers.h"
+#include "DesignerHelper.h"
 #include <QPainter>
-#include <QGraphicsSceneMouseEvent>
-#include <QDrag>
-#include <QCursor>
-#include <QApplication>
-#include <QMimeData>
-#include <QBitmap>
-#include <QWidget>
-#include <QGradient>
 #include <QStyleOptionGraphicsItem>
 #include <QDebug>
-
-#include "DesignerHelper.h"
-#include <iostream>
-
+#include <QGraphicsSceneMouseEvent>
 
 
 
-LayerView2::LayerView2(QGraphicsItem *parent)
+LayerView::LayerView(QGraphicsItem *parent)
     : ConnectableView(parent)
+    , m_requested_parent(0)
+      , m_requested_row(-1)
+
 {
     setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256) );
     setRectangle(QRect(0, 0, DesignerHelper::getDefaultLayerWidth(), DesignerHelper::getDefaultLayerHeight()));
@@ -37,7 +33,7 @@ LayerView2::LayerView2(QGraphicsItem *parent)
 }
 
 
-void LayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
 {
     Q_UNUSED(widget);
     painter->setPen(Qt::black);
@@ -49,16 +45,17 @@ void LayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option
 }
 
 
-void LayerView2::addView(IView *childView)
+void LayerView::addView(IView *childView, int row)
 {
-    qDebug() << "LayerView2::addView() " << m_item->itemName() << childView->getSessionItem()->itemName();
+    Q_UNUSED(row);
+    qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName();
     ParticleLayoutView *layout = dynamic_cast<ParticleLayoutView *>(childView);
     Q_ASSERT(layout);
     connectInputPort(layout);
 }
 
 
-void LayerView2::onPropertyChange(QString propertyName)
+void LayerView::onPropertyChange(QString propertyName)
 {
     Q_ASSERT(m_item);
     if(propertyName == "Thickness") {
@@ -71,71 +68,99 @@ void LayerView2::onPropertyChange(QString propertyName)
 }
 
 
-// ----------------------------------------------------------------------------
+QVariant LayerView::itemChange(GraphicsItemChange change, const QVariant &value)
+{
+    if (change == ItemPositionChange && scene()) {
+
+        m_requested_parent = 0;
+        m_requested_row = -1;
+        QRectF layerRect = mapRectToScene(boundingRect());
+        foreach(QGraphicsItem *item, scene()->items()) {
+            if(item->type() == DesignerHelper::MultiLayerType) {
+                MultiLayerView *multilayer = qgraphicsitem_cast<MultiLayerView *>(item);
+                if(multilayer->mapRectToScene(multilayer->boundingRect()).intersects(layerRect)) {
+                    //qDebug() << "   XXX " << multilayer->getDropArea(multilayer->mapFromScene(layerRect.center()));
+                    m_requested_parent = multilayer;
+                    m_requested_row = multilayer->getDropArea(multilayer->mapFromScene(layerRect.center()));
+                    break;
+                }
+            }
+        }
+
+        if(m_requested_parent) {
+            DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(scene());
+            QRectF rect = m_requested_parent->getDropAreaRectangle(m_requested_row);
+            designerScene->setLayerDropArea(m_requested_parent->mapRectToScene(rect));
+        }
+     }
+     return QGraphicsItem::itemChange(change, value);
+ }
 
 
-LayerView::LayerView(QGraphicsItem *parent)
-    : ConnectableView(parent)
-    , m_fixed_xpos(0)
-    , m_fixed(false)
-    , m_layer(new Layer())
-//    , m_thickness(10*Units::nanometer)
+void LayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
-    //setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256) );
-    setRectangle(QRect(0, 0, DesignerHelper::getDefaultLayerWidth(), DesignerHelper::getDefaultLayerHeight()));
-    setName(QString("Layer"));
-    setToolTip(QString("%1\n%2").arg("LayerView").arg("Homogeneous layer"));
-    setFlag(QGraphicsItem::ItemIsMovable, true);
-    setFlag(QGraphicsItem::ItemIsSelectable, true);
-    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
-    setAcceptDrops(false);
-
-    addPort(" ", NodeEditorPort::Input, NodeEditorPort::ParticleFactory);
-    setMaterialProperty(MaterialBrowser::getDefaultMaterialProperty());
+    if(event->button() == Qt::LeftButton) {
+        m_drag_start_position = pos();
+    }
+    QGraphicsItem::mousePressEvent(event);
 }
 
 
-void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+void LayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
-    Q_UNUSED(widget);
-    painter->setPen(Qt::black);
-    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
-        painter->setPen(Qt::DashLine);
+    //qDebug() << "LayerView::mouseReleaseEvent()" << parentItem() << m_requested_parent << m_requested_row;
+
+    DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(scene());
+    designerScene->setLayerDropArea(QRectF());
+
+    // Simple move of lonely layer across the scene: let it be.
+    if(m_requested_parent == 0 && parentItem() == 0) {
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
     }
-    painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) );
-    painter->drawRect(getRectangle());
-}
 
+    Q_ASSERT(designerScene);
+    SessionModel *model = designerScene->getSessionModel();
 
-void LayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
-    // remove selection from child items
-    QList<QGraphicsItem *> list = childItems();
-    foreach(QGraphicsItem *item, list) {
-        item->setSelected(false);
+    // Layer was moved on top of MultiLayer but not in the right drop area:
+    // returning layer back to starting position.
+    if(m_requested_parent && m_requested_row == -1) {
+        //qDebug() << "1.1 Layer->MultiLayer, wrong drop area.";
+        setPos(m_drag_start_position);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
     }
 
-    QGraphicsObject::mousePressEvent(event);
-}
+    // Layer was moved to the wrong row of his own MultiLayer: returning back.
+    if(m_requested_parent == parentItem() && m_requested_row == model->indexOfItem(getParameterizedItem()).row()) {
+        //Debug() << "1.2 Layer->MultiLayer (same), same drop area";
+        setPos(m_drag_start_position);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
 
-void LayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
-    std::cout << "LayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl;
-    emit LayerMoved();
-    QGraphicsObject::mouseReleaseEvent(event);
-//    setCursor(Qt::ArrowCursor);
-}
+    // Layer was moved from MultiLayer he belong's to, to the empty place of
+    // the scene: changing ownership.
+    if(parentItem() && !m_requested_parent) {
+        //qDebug() << "1.3 Layer->Scene";
+        setPos( mapToScene(event->pos()) - event->pos());
+        model->moveParameterizedItem(this->getParameterizedItem(), 0);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
 
+    // Layer was moved either from one MultiLayer to another, or is moved inside
+    // one multilayer: changing ownership.
+    if(m_requested_parent) {
+        //qDebug() << "1.4 MultiLayer->MultiLayer";
+        model->moveParameterizedItem(this->getParameterizedItem(), m_requested_parent->getParameterizedItem(), m_requested_row);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    // should not be here
+    throw GUIHelpers::Error(tr("LayerView::mouseReleaseEvent() -> Loggic error."));
+}
 
-// layers are not allowed to move horizontally
-QVariant LayerView::itemChange(GraphicsItemChange change, const QVariant &value)
-{
-     if (change == ItemPositionChange && scene() && m_fixed) {
-         QPointF newPos = value.toPointF();
-         newPos.setX(m_fixed_xpos);
-         return newPos;
-     }
-     return QGraphicsItem::itemChange(change, value);
- }
 
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/LayerView.h b/GUI/coregui/Views/Components/SampleDesigner/LayerView.h
index b3d7aaf3c34432f95472ebed4df640199f057d3b..580f1c06e8eb5a98df9fa8ad61b0cad500d7ca8b 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/LayerView.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/LayerView.h
@@ -2,104 +2,41 @@
 #define LAYERVIEW_H
 
 #include "ConnectableView.h"
-#include "MaterialBrowser.h"
-#include "Layer.h"
 
 
+class MultiLayerView;
 
-
-class LayerView2 : public ConnectableView
-{
-    Q_OBJECT
-public:
-    enum { Type = DesignerHelper::LayerType };
-
-    LayerView2(QGraphicsItem *parent = 0);
-    ~LayerView2() { }
-
-    int type() const { return Type; }
-
-    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
-
-    void addView(IView *childView);
-
-public slots:
-    void onPropertyChange(QString propertyName);
-
-};
-
-
-
-
-
-//! graphics representation of Layer
 class LayerView : public ConnectableView
 {
     Q_OBJECT
-
-    Q_PROPERTY(QString name READ getName WRITE setName )
-    Q_PROPERTY(double thickness READ getThickness WRITE setThickness )
-    Q_PROPERTY(MaterialProperty material READ getMaterialProperty WRITE setMaterialProperty )
-
 public:
     enum { Type = DesignerHelper::LayerType };
 
     LayerView(QGraphicsItem *parent = 0);
-    ~LayerView() { delete m_layer; }
-
-    //! сalls the ISampleViewVisitor's visit method
-    virtual void accept(IViewVisitor *visitor) { visitor->visit(this); }
+    ~LayerView() { }
 
     int type() const { return Type; }
 
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
 
-    void setFixedX() { m_fixed_xpos = x(); m_fixed=true; }
-    qreal getFixedX() { return m_fixed_xpos; }
-    double getThickness() const { return m_layer->getThickness(); }
-    MaterialProperty getMaterialProperty() const { return m_materialProperty; }
-
-    void setLayer(Layer *layer) { delete m_layer; m_layer = layer; }
-    const Layer *getLayer() { return m_layer; }
-
-public slots:
-    void setThickness(double thickness);
-    void setMaterialProperty(const MaterialProperty &materialProperty);
-
-signals:
-    void LayerMoved();
+    void addView(IView *childView, int row = 0); // to add ParticleLayout
 
 protected:
-    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
-    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
     QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
 
-private:
-    qreal m_fixed_xpos;
-    bool m_fixed;
+public slots:
+    void onPropertyChange(QString propertyName);
 
-    MaterialProperty m_materialProperty;
-    Layer *m_layer;
+private:
+    MultiLayerView * m_requested_parent;
+    //! Possible parent (MultiLayer) encountered during  the movement of the Layer across the scene.
+    int m_requested_row;
+    //! possible row to drop the layer in  encountered MultiLayer
+    QPointF m_drag_start_position;
 };
 
 
-inline void LayerView::setThickness(double thickness)
-{
-    if(thickness != m_layer->getThickness()) {
-        m_layer->setThickness(thickness);
-        m_rect.setHeight(DesignerHelper::nanometerToScreen(getThickness()));
-        setPortCoordinates();
-        emit heightChanged();
-    }
-}
-
-
-inline void LayerView::setMaterialProperty(const MaterialProperty &materialProperty)
-{
-    m_materialProperty = materialProperty;
-    setColor(materialProperty.getColor());
-    update();
-}
-
 
 #endif // LAYERVIEW_H
diff --git a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp
index 88d84f24bce19eb7b405310abc9e982caa5b9bd3..04fa19c33dd535b2811e227b2eb74b58ed4a4aa9 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp
@@ -1,5 +1,7 @@
 #include "MultiLayerView.h"
 #include "ParameterizedItem.h"
+#include "DesignerScene2.h"
+#include "SessionModel.h"
 
 #include <QPainter>
 #include <QGraphicsSceneMouseEvent>
@@ -21,11 +23,7 @@
 
 
 
-
-
-
-
-MultiLayerView2::MultiLayerView2(QGraphicsItem *parent)
+MultiLayerView::MultiLayerView(QGraphicsItem *parent)
     : ConnectableView(parent)
 {
     setColor(QColor(Qt::blue));
@@ -34,13 +32,15 @@ MultiLayerView2::MultiLayerView2(QGraphicsItem *parent)
     setFlag(QGraphicsItem::ItemIsMovable, true);
     setFlag(QGraphicsItem::ItemIsSelectable, true);
     setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+    setAcceptHoverEvents(false);
     setAcceptDrops(true);
 
     connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight()));
     updateHeight();
 }
 
-void MultiLayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+
+void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
 {
     Q_UNUSED(widget);
     painter->setPen(m_color);
@@ -52,176 +52,83 @@ void MultiLayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *o
 }
 
 
-void MultiLayerView2::addView(IView *childView)
+void MultiLayerView::addView(IView *childView, int row)
 {
-    qDebug() << "MultiLayerView2::addView() " << m_item->itemName() << childView->getSessionItem()->itemName();
-    LayerView2 *layer = dynamic_cast<LayerView2 *>(childView);
+    qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName() << "row" << row;
+    LayerView *layer = dynamic_cast<LayerView *>(childView);
     Q_ASSERT(layer);
 
     if(!childItems().contains(layer)) {
-        addLayer(layer, getRectangle().bottomLeft());
-        qDebug() << "adding layer";
+        addNewLayer(layer, row);
     } else {
-        qDebug() << "layer exists";
-
+        int previous_row = m_layers.indexOf(layer);
+        m_layers.swap(previous_row, row);
+        qDebug() << "layer exists, swapping" << previous_row << row;
     }
+    updateHeight();
 }
 
 
-void MultiLayerView2::addLayer(LayerView2 *layer, QPointF pos)
+void MultiLayerView::addNewLayer(LayerView *layer, int row)
 {
-    m_rect.setHeight(m_rect.height()+layer->boundingRect().height());
-
+    qDebug() << "MultiLayerView::addNewLayer(), row" << row;
+    m_layers.insert(row, layer);
     int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.;
-    layer->setPos(xpos, pos.y());
-    //connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) );
+    layer->setX(xpos);
     connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
+    connect(layer, SIGNAL(aboutToBeDeleted()), this, SLOT(onLayerAboutToBeDeleted()) );
     layer->setParentItem(this);
 }
 
 
-void MultiLayerView2::updateHeight()
-{
-    qDebug() << "MultiLayerView2::updateHeight()";
-    QList<QGraphicsItem *> list = childItems();
-    qSort(list.begin(), list.end(), DesignerHelper::sort_layers);
-
-    int total_height = 0;
-    if( childItems().size() > 0) {
-        foreach(QGraphicsItem *item, list) {
-            item->setY(total_height);
-            total_height += item->boundingRect().height();
-        }
-    } else {
-        total_height = DesignerHelper::getDefaultMultiLayerHeight();
-    }
-
-    m_rect.setHeight(total_height);
-    update();
-    emit heightChanged();
-}
-
-
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-
-
-MultiLayerView::MultiLayerView(QGraphicsItem *parent)
-    : ConnectableView(parent)
-    , m_fixed_xpos(0)
-    , m_fixed(false)
-{
-    setColor(QColor(Qt::blue));
-    setRectangle(QRect(0, 0, DesignerHelper::getDefaultMultiLayerWidth(), DesignerHelper::getDefaultMultiLayerHeight()));
-    setToolTip(QString("MultiLayer"));
-    setFlag(QGraphicsItem::ItemIsMovable, true);
-    setFlag(QGraphicsItem::ItemIsSelectable, true);
-    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
-    setAcceptDrops(true);
-
-    m_expected_types << QString("Layer") << QString("MultiLayer");
-    allowDropType(QString("Layer"));
-
-    connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight()));
-    updateHeight();
-}
-
-
-// create top MultiLayer, which will be the dock for all Layer's and MultiLayer's
-MultiLayerView *MultiLayerView::createTopMultiLayer()
-{
-    MultiLayerView *result = new MultiLayerView();
-    result->setColor(Qt::lightGray);
-    result->allowDropType(QString("MultiLayer"));
-    result->setToolTip(QString("LayerDock\nDrag and drop here layer or multi layer"));
-    result->setFlag(QGraphicsItem::ItemIsSelectable, false);
-    result->setPos(-result->getRectangle().width()/2, 100.0);
-    return result;
-}
-
-
-
-// allows droping of object of given type
-void MultiLayerView::allowDropType(const QString &name) {
-    if(m_current_types.contains(name)) {
-        std::cout << "MultiLayerView::allowDropType -> Info. Name '" << name.toStdString() << "' is already in the list" << std::endl;
-        return;
-    }
-    if(m_expected_types.contains(name)) {
-        m_current_types.append(name);
-    } else {
-        std::cout << "MultiLayerView::allowDropType -> Warning. Can't handle the object with name' '" << name.toStdString() << "', expected names " << std::endl;
-        foreach(QString s, m_expected_types) {
-            std::cout << s.toStdString() << std::endl;
-        }
-    }
-}
-
-
-
-void MultiLayerView::addLayer(LayerView *layer, QPointF pos)
+void MultiLayerView::addLayer(LayerView *layer, QPointF /* pos */)
 {
-    //std::cout << "MultiLayerView::addLayer" << std::endl;
-    // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange'
     m_rect.setHeight(m_rect.height()+layer->boundingRect().height());
 
-    int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.;
-    layer->setPos(xpos, pos.y());
-    layer->setFixedX();
-    connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) );
-    connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
-    //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) );
     layer->setParentItem(this);
-    //emit heightChanged();
+    //connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) );
+    connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
 }
 
-void MultiLayerView::addBottomLayer(LayerView *layer)
+
+void MultiLayerView::onLayerAboutToBeDeleted()
 {
-    QPointF pos(0, m_rect.height());
-    addLayer(layer, pos);
+    qDebug() << "MultiLayerView::onLayerAboutToBeDeleted()";
+    LayerView *layer = qobject_cast<LayerView *>(sender());
+    Q_ASSERT(layer);
+    removeLayer(layer);
 }
 
 
-
-void MultiLayerView::addMultiLayer(MultiLayerView *layer, QPointF pos)
+void MultiLayerView::removeLayer(LayerView *layer)
 {
-    std::cout << "MultiLayerView::addMultiLayer" << std::endl;
-    // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange'
-    m_rect.setHeight(m_rect.height()+layer->boundingRect().height());
-
-    int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.;
-    layer->setPos(xpos, pos.y());
-    layer->setFixedX();
-    connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) );
-    connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
-    //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) );
-    layer->setParentItem(this);
-    //emit heightChanged();
+    qDebug() << "MultiLayerView::removeLayer()";
+    Q_ASSERT(m_layers.contains(layer));
+    disconnect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
+    m_layers.removeOne(layer);
+    updateHeight();
 }
 
 
-// adjusts positions of Layers inside MultiLayer, updates total MultiLayer height
-// calculates drop areas for new layers
-// called when one of Layer is changed
+
 void MultiLayerView::updateHeight()
 {
-    //std::cout << "MultiLayerView::updateHeight() " << std::endl;
+    qDebug() << "MultiLayerView::updateHeight()";
+
     // drop areas are rectangles covering the area of layer interfaces
     m_drop_areas.clear();
 
-    QList<QGraphicsItem *> list = childItems();
-    qSort(list.begin(), list.end(), DesignerHelper::sort_layers);
 
     int total_height = 0;
-    if( childItems().size() > 0) {
-        foreach(QGraphicsItem *item, list) {
-            item->setY(total_height);
-            total_height += item->boundingRect().height();
-            m_drop_areas.append(QRectF(0, item->y() - item->boundingRect().height()/4., boundingRect().width(), item->boundingRect().height()/2.));
+    if(m_layers.size()) {
+        foreach(LayerView *layer, m_layers) {
+            int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.;
+            layer->setPos(xpos, total_height);
+            layer->update();
+            total_height += layer->boundingRect().height();
+            m_drop_areas.append(QRectF(0, layer->y() - layer->boundingRect().height()/4., boundingRect().width(), layer->boundingRect().height()/2.));
         }
-        m_drop_areas.append(QRectF(0, list.back()->y() +list.back()->boundingRect().height() - list.back()->boundingRect().height()/4., boundingRect().width(), list.back()->boundingRect().height()/2.));
+        m_drop_areas.append(QRectF(0, m_layers.back()->y() +m_layers.back()->boundingRect().height() - m_layers.back()->boundingRect().height()/4., boundingRect().width(), m_layers.back()->boundingRect().height()/2.));
     } else {
         total_height = DesignerHelper::getDefaultMultiLayerHeight();
         m_drop_areas.append(boundingRect());
@@ -233,6 +140,23 @@ void MultiLayerView::updateHeight()
 }
 
 
+
+//! returns index of drop area for given coordinate
+int MultiLayerView::getDropArea(QPointF pos)
+{
+//    qDebug() << "MultiLayerView::getDropArea(QPointF pos)" << pos;
+
+    int area(-1);
+    for(int i=0; i<m_drop_areas.size(); ++i) {
+        if( m_drop_areas.at(i).contains(pos) ) {
+            area = i;
+            break;
+        }
+    }
+    return area;
+}
+
+
 bool MultiLayerView::isInDropArea(QPointF pos)
 {
     foreach(QRectF rect, m_drop_areas) {
@@ -242,41 +166,26 @@ bool MultiLayerView::isInDropArea(QPointF pos)
     return false;
 }
 
-bool MultiLayerView::isExpectedObject(const QString &name)
-{
-    if(m_current_types.contains(name)) return true;
-    return false;
-}
-
-
 
-void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+QRectF MultiLayerView::getDropAreaRectangle(int row)
 {
-    Q_UNUSED(widget);
-    painter->setPen(m_color);
-    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
-        painter->setPen(Qt::DashLine);
+    if(row>=0 && row < m_drop_areas.size()) {
+        return m_drop_areas[row];
+    } else {
+        return QRectF();
     }
-    painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) );
-    painter->drawRect(getRectangle());
 }
 
 
-void MultiLayerView::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
+void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
 {
     const DesignerMimeData *mimeData = checkDragEvent(event);
-    if (mimeData) {
-        std::cout << "MultiLayerView::dragEnterEvent() -> INSIDE " << std::endl;
+    if (!mimeData) {
+        QGraphicsItem::dragMoveEvent(event);
     }
 }
 
 
-void MultiLayerView::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
-{
-    Q_UNUSED(event);
-    std::cout << "MultiLayerView::dragLeaveEvent() -> " << std::endl;
-}
-
 
 void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event)
 {
@@ -284,110 +193,331 @@ void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event)
 
     const DesignerMimeData *mimeData = checkDragEvent(event);
     if (mimeData) {
-//        ISampleView *layer(0);
-//        if(mimeData->getClassName() == QString("Layer") ) layer = new LayerView();
-//        if(mimeData->getClassName() == QString("MultiLayer") ) layer = new MultiLayerView();
-
-        if(mimeData->getClassName() == QString("Layer") ) {
-            addLayer(new LayerView(), event->pos());
-            update();
-        } else if(mimeData->getClassName() == QString("MultiLayer") ) {
-            addMultiLayer(new MultiLayerView(), event->pos());
-            update();
-
-//        if(layer){
-//            std::cout << "MultiLayerView::dropEvent() -> adding layer or multilayer" << std::endl;
-//            addLayer(layer, event->pos());
-//            update();
-        } else {
-            std::cout << "MultiLayerView::dropEvent() -> Error. Can't create object " << mimeData->getClassName().toStdString() << std::endl;
+
+        DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(scene());
+        if(designerScene) {
+            SessionModel *sessionModel = designerScene->getSessionModel();
+
+            qDebug() << "\n XXX" << getDropArea(event->scenePos()) << event->scenePos();
+            sessionModel->insertNewItem(
+                        mimeData->getClassName(),
+                        sessionModel->indexOfItem(this->getParameterizedItem()),
+                        getDropArea(event->pos())
+                        );
         }
     }
 }
 
 
-void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
+
+const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event)
 {
-    const DesignerMimeData *mimeData = checkDragEvent(event);
-    if (mimeData) {
-        std::cout << "MultiLayerView::dragMoveEvent() -> pos:" << event->pos().x() << " " << event->pos().y() << std::endl;
-        update();
+    std::cout << "MultiLayerView::checkDragEvent -> "  << std::endl;
+    const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData());
+    if (!mimeData) {
+        event->ignore();
+        return 0;
+    }
 
+    if(mimeData->hasFormat("bornagain/widget")
+            && getParameterizedItem()->acceptsAsChild(mimeData->getClassName())
+            && isInDropArea(event->pos()) ) {
+        std::cout << "MultiLayerView::checkDragEvent -> yes"  << std::endl;
+        event->setAccepted(true);
+    } else {
+        event->setAccepted(false);
     }
+    return mimeData;
 }
 
 
-void MultiLayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
-    std::cout << "MultiLayerView::mousePressEvent -> " << x() << " " << y() << std::endl;
-    // remove selection from child items
-    QList<QGraphicsItem *> list = childItems();
-    foreach(QGraphicsItem *item, list) {
-        item->setSelected(false);
-    }
 
-    QGraphicsObject::mousePressEvent(event);
-}
 
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
 
-void MultiLayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
-    std::cout << "MultiLayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl;
-    emit LayerMoved();
-    QGraphicsObject::mouseReleaseEvent(event);
-}
+
+//MultiLayerView::MultiLayerView(QGraphicsItem *parent)
+//    : ConnectableView(parent)
+//    , m_fixed_xpos(0)
+//    , m_fixed(false)
+//{
+//    setColor(QColor(Qt::blue));
+//    setRectangle(QRect(0, 0, DesignerHelper::getDefaultMultiLayerWidth(), DesignerHelper::getDefaultMultiLayerHeight()));
+//    setToolTip(QString("MultiLayer"));
+//    setFlag(QGraphicsItem::ItemIsMovable, true);
+//    setFlag(QGraphicsItem::ItemIsSelectable, true);
+//    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+//    setAcceptDrops(true);
+
+//    m_expected_types << QString("Layer") << QString("MultiLayer");
+//    allowDropType(QString("Layer"));
+
+//    connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight()));
+//    updateHeight();
+//}
+
+
+//// create top MultiLayer, which will be the dock for all Layer's and MultiLayer's
+//MultiLayerView *MultiLayerView::createTopMultiLayer()
+//{
+//    MultiLayerView *result = new MultiLayerView();
+//    result->setColor(Qt::lightGray);
+//    result->allowDropType(QString("MultiLayer"));
+//    result->setToolTip(QString("LayerDock\nDrag and drop here layer or multi layer"));
+//    result->setFlag(QGraphicsItem::ItemIsSelectable, false);
+//    result->setPos(-result->getRectangle().width()/2, 100.0);
+//    return result;
+//}
+
+
+
+//// allows droping of object of given type
+//void MultiLayerView::allowDropType(const QString &name) {
+//    if(m_current_types.contains(name)) {
+//        std::cout << "MultiLayerView::allowDropType -> Info. Name '" << name.toStdString() << "' is already in the list" << std::endl;
+//        return;
+//    }
+//    if(m_expected_types.contains(name)) {
+//        m_current_types.append(name);
+//    } else {
+//        std::cout << "MultiLayerView::allowDropType -> Warning. Can't handle the object with name' '" << name.toStdString() << "', expected names " << std::endl;
+//        foreach(QString s, m_expected_types) {
+//            std::cout << s.toStdString() << std::endl;
+//        }
+//    }
+//}
+
+
+
+//void MultiLayerView::addLayer(LayerView *layer, QPointF pos)
+//{
+//    //std::cout << "MultiLayerView::addLayer" << std::endl;
+//    // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange'
+//    m_rect.setHeight(m_rect.height()+layer->boundingRect().height());
+
+//    int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.;
+//    layer->setPos(xpos, pos.y());
+//    layer->setFixedX();
+//    connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) );
+//    connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
+//    //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) );
+//    layer->setParentItem(this);
+//    //emit heightChanged();
+//}
+
+//void MultiLayerView::addBottomLayer(LayerView *layer)
+//{
+//    QPointF pos(0, m_rect.height());
+//    addLayer(layer, pos);
+//}
+
+
+
+//void MultiLayerView::addMultiLayer(MultiLayerView *layer, QPointF pos)
+//{
+//    std::cout << "MultiLayerView::addMultiLayer" << std::endl;
+//    // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange'
+//    m_rect.setHeight(m_rect.height()+layer->boundingRect().height());
+
+//    int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.;
+//    layer->setPos(xpos, pos.y());
+//    layer->setFixedX();
+//    connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) );
+//    connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
+//    //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) );
+//    layer->setParentItem(this);
+//    //emit heightChanged();
+//}
+
+
+//// adjusts positions of Layers inside MultiLayer, updates total MultiLayer height
+//// calculates drop areas for new layers
+//// called when one of Layer is changed
+//void MultiLayerView::updateHeight()
+//{
+//    //std::cout << "MultiLayerView::updateHeight() " << std::endl;
+//    // drop areas are rectangles covering the area of layer interfaces
+//    m_drop_areas.clear();
+
+//    QList<QGraphicsItem *> list = childItems();
+//    qSort(list.begin(), list.end(), DesignerHelper::sort_layers);
+
+//    int total_height = 0;
+//    if( childItems().size() > 0) {
+//        foreach(QGraphicsItem *item, list) {
+//            item->setY(total_height);
+//            total_height += item->boundingRect().height();
+//            m_drop_areas.append(QRectF(0, item->y() - item->boundingRect().height()/4., boundingRect().width(), item->boundingRect().height()/2.));
+//        }
+//        m_drop_areas.append(QRectF(0, list.back()->y() +list.back()->boundingRect().height() - list.back()->boundingRect().height()/4., boundingRect().width(), list.back()->boundingRect().height()/2.));
+//    } else {
+//        total_height = DesignerHelper::getDefaultMultiLayerHeight();
+//        m_drop_areas.append(boundingRect());
+//    }
+
+//    m_rect.setHeight(total_height);
+//    update();
+//    emit heightChanged();
+//}
+
+
+//bool MultiLayerView::isInDropArea(QPointF pos)
+//{
+//    foreach(QRectF rect, m_drop_areas) {
+//        //std::cout << " drop areas " << rect.x() << " " << rect.y() << " " << rect.width() << " " << rect.height() << " point" << pos.x() << " " << pos.y() << std::endl;
+//        if (rect.contains(pos)) return true;
+//    }
+//    return false;
+//}
+
+//bool MultiLayerView::isExpectedObject(const QString &name)
+//{
+//    if(m_current_types.contains(name)) return true;
+//    return false;
+//}
+
+
+
+//void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+//{
+//    Q_UNUSED(widget);
+//    painter->setPen(m_color);
+//    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
+//        painter->setPen(Qt::DashLine);
+//    }
+//    painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) );
+//    painter->drawRect(getRectangle());
+//}
+
+
+//void MultiLayerView::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
+//{
+//    const DesignerMimeData *mimeData = checkDragEvent(event);
+//    if (mimeData) {
+//        std::cout << "MultiLayerView::dragEnterEvent() -> INSIDE " << std::endl;
+//    }
+//}
+
+
+//void MultiLayerView::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
+//{
+//    Q_UNUSED(event);
+//    std::cout << "MultiLayerView::dragLeaveEvent() -> " << std::endl;
+//}
+
+
+//void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event)
+//{
+//    std::cout << "MultiLayerView::dropEvent() -> " << std::endl;
+
+//    const DesignerMimeData *mimeData = checkDragEvent(event);
+//    if (mimeData) {
+////        ISampleView *layer(0);
+////        if(mimeData->getClassName() == QString("Layer") ) layer = new LayerView();
+////        if(mimeData->getClassName() == QString("MultiLayer") ) layer = new MultiLayerView();
+
+//        if(mimeData->getClassName() == QString("Layer") ) {
+//            addLayer(new LayerView(), event->pos());
+//            update();
+//        } else if(mimeData->getClassName() == QString("MultiLayer") ) {
+//            addMultiLayer(new MultiLayerView(), event->pos());
+//            update();
+
+////        if(layer){
+////            std::cout << "MultiLayerView::dropEvent() -> adding layer or multilayer" << std::endl;
+////            addLayer(layer, event->pos());
+////            update();
+//        } else {
+//            std::cout << "MultiLayerView::dropEvent() -> Error. Can't create object " << mimeData->getClassName().toStdString() << std::endl;
+//        }
+//    }
+//}
 
 
-//void MultiLayerView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+//void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
 //{
-//    std::cout << "MultiLayerView::mouseMoveEvent -> " << x() << " " << y() << std::endl;
-//    QGraphicsObject::mouseMoveEvent(event);
+//    const DesignerMimeData *mimeData = checkDragEvent(event);
+//    if (mimeData) {
+//        std::cout << "MultiLayerView::dragMoveEvent() -> pos:" << event->pos().x() << " " << event->pos().y() << std::endl;
+//        update();
+
+//    }
 //}
 
 
 //void MultiLayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
 //{
 //    std::cout << "MultiLayerView::mousePressEvent -> " << x() << " " << y() << std::endl;
+//    // remove selection from child items
+//    QList<QGraphicsItem *> list = childItems();
+//    foreach(QGraphicsItem *item, list) {
+//        item->setSelected(false);
+//    }
+
 //    QGraphicsObject::mousePressEvent(event);
 //}
 
+
 //void MultiLayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 //{
 //    std::cout << "MultiLayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl;
+//    emit LayerMoved();
 //    QGraphicsObject::mouseReleaseEvent(event);
 //}
 
 
-const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event)
-{
-    std::cout << "MultiLayerView::checkDragEvent -> "  << std::endl;
-    const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData());
-    if (!mimeData) {
-        event->ignore();
-        return 0;
-    }
+////void MultiLayerView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+////{
+////    std::cout << "MultiLayerView::mouseMoveEvent -> " << x() << " " << y() << std::endl;
+////    QGraphicsObject::mouseMoveEvent(event);
+////}
 
-    if(mimeData->hasFormat("bornagain/widget")
-            && isExpectedObject(mimeData->getClassName())
-            && isInDropArea(event->pos()) ) {
-        std::cout << "LayerDockView::checkDragEvent -> yes"  << std::endl;
-        event->setAccepted(true);
-    } else {
-        event->setAccepted(false);
-    }
-    return mimeData;
-}
 
+////void MultiLayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
+////{
+////    std::cout << "MultiLayerView::mousePressEvent -> " << x() << " " << y() << std::endl;
+////    QGraphicsObject::mousePressEvent(event);
+////}
 
-// multi-layers are not allowed to move horizontally
-QVariant MultiLayerView::itemChange(GraphicsItemChange change, const QVariant &value)
-{
-     if (change == ItemPositionChange && scene() && m_fixed) {
-         // value is the new position.
-         QPointF newPos = value.toPointF();
-         newPos.setX(m_fixed_xpos);
-         return newPos;
-     }
-     return QGraphicsItem::itemChange(change, value);
- }
+////void MultiLayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+////{
+////    std::cout << "MultiLayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl;
+////    QGraphicsObject::mouseReleaseEvent(event);
+////}
+
+
+//const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event)
+//{
+//    std::cout << "MultiLayerView::checkDragEvent -> "  << std::endl;
+//    const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData());
+//    if (!mimeData) {
+//        event->ignore();
+//        return 0;
+//    }
+
+//    if(mimeData->hasFormat("bornagain/widget")
+//            && isExpectedObject(mimeData->getClassName())
+//            && isInDropArea(event->pos()) ) {
+//        std::cout << "LayerDockView::checkDragEvent -> yes"  << std::endl;
+//        event->setAccepted(true);
+//    } else {
+//        event->setAccepted(false);
+//    }
+//    return mimeData;
+//}
+
+
+//// multi-layers are not allowed to move horizontally
+//QVariant MultiLayerView::itemChange(GraphicsItemChange change, const QVariant &value)
+//{
+//     if (change == ItemPositionChange && scene() && m_fixed) {
+//         // value is the new position.
+//         QPointF newPos = value.toPointF();
+//         newPos.setX(m_fixed_xpos);
+//         return newPos;
+//     }
+//     return QGraphicsItem::itemChange(change, value);
+// }
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h
index eb2ec2398427b50312ea4de8b41881dd0ce6dd86..22998049b0d69557b467724307a5611bd0df8179 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h
@@ -12,102 +12,113 @@
 
 
 class LayerView;
-class LayerView2;
 class DesignerMimeData;
 
 
 
-class MultiLayerView2 : public ConnectableView
+class MultiLayerView : public ConnectableView
 {
     Q_OBJECT
 
 public:
     enum { Type = DesignerHelper::MultiLayerType };
 
-    MultiLayerView2(QGraphicsItem *parent = 0);
+    MultiLayerView(QGraphicsItem *parent = 0);
 
     int type() const { return Type; }
 
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
 
-    void addView(IView *childView);
+    void addView(IView *childView, int row = 0);
+
+    virtual void addLayer(LayerView *layer, QPointF pos=QPointF());
+    virtual void addNewLayer(LayerView *layer, int row);
+    virtual void removeLayer(LayerView *layer);
+
+    bool isInDropArea(QPointF pos);
+    int getDropArea(QPointF pos);
 
-    virtual void addLayer(LayerView2 *layer, QPointF pos=QPointF());
+    QRectF getDropAreaRectangle(int row);
 
 public slots:
     void updateHeight();
+    void onLayerAboutToBeDeleted();
 
-};
+protected:
+    void dropEvent(QGraphicsSceneDragDropEvent *event);
+    const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event);
+    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
 
 
+private:
+    QList<LayerView *> m_layers;
+    QList<QRectF> m_drop_areas;
 
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
+};
 
-#include "LayerView.h"
 
-class MultiLayerView : public ConnectableView
-{
-    Q_OBJECT
 
-public:
-    enum { Type = DesignerHelper::MultiLayerType };
+//class MultiLayerView : public ConnectableView
+//{
+//    Q_OBJECT
 
-    MultiLayerView(QGraphicsItem *parent = 0);
+//public:
+//    enum { Type = DesignerHelper::MultiLayerType };
 
-    int type() const { return Type; }
+//    MultiLayerView(QGraphicsItem *parent = 0);
 
-    //! create top MultiLayer, which will be the dock for all Layer's and MultiLayer's
-    static MultiLayerView *createTopMultiLayer();
+//    int type() const { return Type; }
 
-    //! сalls the ISampleViewVisitor's visit method
-    virtual void accept(IViewVisitor *visitor) { visitor->visit(this); }
+//    //! create top MultiLayer, which will be the dock for all Layer's and MultiLayer's
+//    static MultiLayerView *createTopMultiLayer();
 
-    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+//    //! сalls the ISampleViewVisitor's visit method
+//    virtual void accept(IViewVisitor *visitor) { visitor->visit(this); }
 
-    void addLayer(LayerView *layer, QPointF pos=QPointF());
-    void addBottomLayer(LayerView *layer);
-    void addMultiLayer(MultiLayerView *layer, QPointF pos=QPointF());
+//    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
 
-    //! allows droping of object of given type
-    void allowDropType(const QString &name);
+//    void addLayer(LayerView *layer, QPointF pos=QPointF());
+//    void addBottomLayer(LayerView *layer);
+//    void addMultiLayer(MultiLayerView *layer, QPointF pos=QPointF());
 
-    void setFixedX() { m_fixed_xpos = x(); m_fixed=true; }
-    qreal getFixedX() { return m_fixed_xpos; }
+//    //! allows droping of object of given type
+//    void allowDropType(const QString &name);
 
-public slots:
-    void updateHeight();
+//    void setFixedX() { m_fixed_xpos = x(); m_fixed=true; }
+//    qreal getFixedX() { return m_fixed_xpos; }
 
-signals:
-    void LayerMoved();
+//public slots:
+//    void updateHeight();
 
-protected:
-    void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
-    void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
-    void dropEvent(QGraphicsSceneDragDropEvent *event);
-    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
+//signals:
+//    void LayerMoved();
 
-//    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
-    void mousePressEvent(QGraphicsSceneMouseEvent *event);
-    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
-    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+//protected:
+//    void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
+//    void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
+//    void dropEvent(QGraphicsSceneDragDropEvent *event);
+//    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
 
-    const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event);
+////    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+//    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+//    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+//    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
 
-    //! returns true if given point is in alowed areas of multilayer
-    bool isInDropArea(QPointF pos);
+//    const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event);
 
-    //! returns true if name of the object match whose the multi layer can handle
-    bool isExpectedObject(const QString &name);
+//    //! returns true if given point is in alowed areas of multilayer
+//    bool isInDropArea(QPointF pos);
 
-private:
-    QList<QRectF> m_drop_areas;
-    QStringList m_expected_types;
-    QStringList m_current_types;
-    qreal m_fixed_xpos;
-    bool m_fixed;
-};
+//    //! returns true if name of the object match whose the multi layer can handle
+//    bool isExpectedObject(const QString &name);
+
+//private:
+//    QList<QRectF> m_drop_areas;
+//    QStringList m_expected_types;
+//    QStringList m_current_types;
+//    qreal m_fixed_xpos;
+//    bool m_fixed;
+//};
 
 
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp
index 7071078211aa4d6da0a39b5baa4dce63a8aa9bfa..aa0a2173d7e891a731a7344a78d3711de92489b9 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp
@@ -88,6 +88,7 @@ bool NodeEditor::eventFilter(QObject *o, QEvent *e)
                     conn->setPos2(port2->scenePos());
                     conn->setPort2(port2);
                     conn->updatePath();
+                    emit connectionIsEstablished(conn);
                     conn = 0;
                     return true;
                 }
diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h
index 59e6188117e0ee50b3c2e7aafde1efb25cf8e67b..6996134e0b3549b32d50f4d2d7a41e48901e0637 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h
@@ -28,6 +28,9 @@ public:
 
 	bool eventFilter(QObject *, QEvent *);
 
+signals:
+    void connectionIsEstablished(NodeEditorConnection *);
+
 private:
 	QGraphicsItem *itemAt(const QPointF&);
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp
index 215db8bf1009ee51a61e1def87d6928833d88c32..9a80e0d002bac91bba072c35252da7cc1ecb95fe 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp
@@ -85,6 +85,20 @@ NodeEditorPort* NodeEditorConnection::port2() const
 }
 
 
+NodeEditorPort *NodeEditorConnection::getInputPort()
+{
+    Q_ASSERT(m_port1 && m_port2);
+    return (m_port1->isInput() ? m_port1 : m_port2);
+}
+
+
+NodeEditorPort *NodeEditorConnection::getOutputPort()
+{
+    Q_ASSERT(m_port1 && m_port2);
+    return (m_port1->isOutput() ? m_port1 : m_port2);
+}
+
+
 void NodeEditorConnection::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
 {
     Q_UNUSED(option)
diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h
index 6139c703d0cdb98cfe6f0d0e1a7557b5d944f2d6..d15015b928d172f411269761e56de75133b2df31 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h
@@ -29,6 +29,9 @@ public:
 	NodeEditorPort* port1() const;
 	NodeEditorPort* port2() const;
 
+    NodeEditorPort *getInputPort();
+    NodeEditorPort *getOutputPort();
+
 	int type() const { return Type; }
 
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp
index ba3fc1e6b2717efd53dd784b737369d61e68dfc7..559cbef7318d98cd53e4054e86100f3b74be913f 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp
@@ -58,6 +58,14 @@ NodeEditorPort::~NodeEditorPort()
 }
 
 
+void NodeEditorPort::deleteAllConnections()
+{
+    foreach(NodeEditorConnection *conn, m_connections)
+        delete conn;
+    m_connections.clear();
+}
+
+
 bool NodeEditorPort::isOutput()
 {
     return (m_direction == Output ? true : false);
diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h
index a7f84bbc8d38e672170117fcf804bc53d5e1fe76..d894cb4a15f8bad666873c931aa28bf69548f381 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h
+++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h
@@ -64,6 +64,8 @@ public:
 
     static QColor getPortTypeColor(NodeEditorPort::PortType port_type);
 
+    void deleteAllConnections();
+
 protected:
 	QVariant itemChange(GraphicsItemChange change, const QVariant &value);
 
diff --git a/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp b/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp
index d23471faffd31f53a2472ef28b640ab7fdb4e6d1..8a2cc00b6c565470aedec565ac1c2cbfbb4c27f1 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp
@@ -28,19 +28,19 @@ QMap<QString, int> SampleViewAligner::m_typeToArea = initTypeToAreaMap();
 //! aligns Views according to predefined areas
 void SampleViewAligner::align(QList<IView *> views, QPointF reference)
 {
-    qDebug() << "---------------------------------------";
-    qDebug() << "SampleViewAligner::align()" << reference;
+    //qDebug() << "---------------------------------------";
+    //qDebug() << "SampleViewAligner::align()" << reference;
     QMap<int, IView *> areaToView;
     foreach(IView *view, views) {
-        int area = m_typeToArea[view->getSessionItem()->modelType()];
-        qDebug() << "area" << area << view->getSessionItem()->modelType();
+        int area = m_typeToArea[view->getParameterizedItem()->modelType()];
+        //qDebug() << "area" << area << view->getSessionItem()->modelType();
         if(!view->parentObject())
             areaToView.insertMulti(area, view);
     }
 
     for(int i_level = 0; i_level <= getMaximumAreaNumber(); ++i_level) {
         QList<IView *> items = areaToView.values(i_level);
-        qDebug() << "SampleViewAligner::align() i_level" << i_level << "size" << items.size();
+        //qDebug() << "SampleViewAligner::align() i_level" << i_level << "size" << items.size();
         reference = placeItems(items, reference);
     }
 }
@@ -53,14 +53,15 @@ QPointF SampleViewAligner::placeItems(const QList<IView *> &items, QPointF refer
     qreal dy = getTotalVerticalSpace(items) + (items.size()-1)*vertical_gap;
     qreal dx = size_factor*getMaximumHorizontalSpace(items);
     reference.setX(reference.x() - dx );
-    qDebug() << "SampleViewAligner::placeItems() dy:" << dy << " dx:" << dx << " reference:" << reference;
+    //qDebug() << "SampleViewAligner::placeItems() dy:" << dy << " dx:" << dx << " reference:" << reference;
     for(int i=0; i<items.size(); ++i) {
         IView *view = items[i];
-        qDebug() << "SampleViewAligner::placeItems()" << view->getSessionItem()->modelType() << view->parentObject();
+        //qDebug() << "SampleViewAligner::placeItems()" << view->getSessionItem()->modelType() << view->parentObject();
         QPointF pos = reference;
-        qDebug() << "xxx " << view->x() << view->y() << (pos.y() - i*dy/items.size());
+        //qDebug() << "xxx " << view->x() << view->y() << (pos.y() - i*dy/items.size());
         pos.setY(pos.y() - i*dy/items.size());
-        view->setPos(pos);
+        if(view->pos().isNull())
+            view->setPos(pos);
     }
     return reference;
 }
diff --git a/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp
index f59e02f0716273213831d733ec9e83c8ce233563..722939b85a1535d4cbb0d1d7ee9e4e404b05aab1 100644
--- a/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp
+++ b/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp
@@ -20,11 +20,11 @@ bool SampleViewFactory::isValidName(const QString &name)
 IView *SampleViewFactory::createSampleView(const QString &name)
 {
     if (name==QString("MultiLayer")) {
-        return new MultiLayerView2();
+        return new MultiLayerView();
     }
 
     if (name==QString("Layer")) {
-        return new LayerView2();
+        return new LayerView();
     }
 
     if (name==QString("ParticleLayout")) {
diff --git a/GUI/coregui/Views/Components/widgetbox/widgetbox.xml b/GUI/coregui/Views/Components/widgetbox/widgetbox.xml
index 14f8e89b32bc46ea9a2124166eb5b5fe0d5dedc2..51e90f6839011047cf4cd44aa42565e18677ae56 100644
--- a/GUI/coregui/Views/Components/widgetbox/widgetbox.xml
+++ b/GUI/coregui/Views/Components/widgetbox/widgetbox.xml
@@ -20,22 +20,13 @@
             </widget>
         </categoryentry>
         
-        <categoryentry  name="Layer repeater" icon="images/sample_vspacer.png">
-            <widget class="LayerRepeater">
-                <property name="objectName">
-                    <string notr="true">somestring</string>
-                </property>
-            </widget>
-        </categoryentry>
-
-        
     </category>
     
     
-    <category name="Particle factories">
+    <category name="Particle layouts">
         
-        <categoryentry name="Particle Decoration" icon="images/sample_spacer.png">
-            <widget class="ParticleDecoration">
+        <categoryentry name="Basic particle layout" icon="images/sample_spacer.png">
+            <widget class="ParticleLayout">
                 <property name="objectName">
                     <string notr="true">somestring</string>
                 </property>
diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp
index ba5ba48499ea6b8cdceab485f5592bbf1047af64..ae3cca53c3c25c78e797d34f19dba71f9af16283 100644
--- a/GUI/coregui/mainwindow/mainwindow.cpp
+++ b/GUI/coregui/mainwindow/mainwindow.cpp
@@ -249,6 +249,15 @@ void MainWindow::initSessionModel()
     m_sessionModel->insertNewItem("ParticleLayout",
                    m_sessionModel->indexOfItem(layer));
     m_sessionModel->insertNewItem("Layer");
+    m_sessionModel->insertNewItem("Layer");
+
+    m_sessionModel->insertNewItem("MultiLayer");
+
+    m_sessionModel->insertNewItem("ParticleLayout");
+
+    //ParameterizedItem *layer2 = m_sessionModel->insertNewItem("Layer");
+    //m_sessionModel->moveParameterizedItem(layer2, multilayer);
+    //m_sessionModel->moveParameterizedItem(layer, 0);
 
     //m_sessionModel->save("session.xml");
 }