diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp
index b1ba821069d2791e3694f1c208c3b31b3857bed7..98c9a6ba68c1a20d31c35765cedc71fd71815748 100644
--- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp
+++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp
@@ -57,35 +57,37 @@ DistributionEditor::DistributionEditor(QWidget *parent)
     setLayout(mainLayout);
 }
 
-DistributionEditor::~DistributionEditor() {}
+DistributionEditor::~DistributionEditor()
+{
+    if(m_item) m_item->mapper()->unsubscribe(this);
+}
 
 void DistributionEditor::setItem(SessionItem *item)
 {
     m_propertyEditor->clearEditor();
     m_propertyEditor->addPropertyItems(item);
 
-    if (m_item == item)
-        return;
-
-    m_item = dynamic_cast<GroupItem *>(item);
-
-    if (!m_item)
+    if (m_item == item) {
         return;
 
-    m_mapper.reset(new ModelMapper);
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
 
-    m_mapper->setItem(m_item);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        onPropertyChanged(name);
-    });
+        m_item = dynamic_cast<GroupItem *>(item);
+        if(!m_item) return;
 
-    DistributionItem *distrItem = dynamic_cast<DistributionItem *>(
-        m_item->getCurrentItem());
+        m_item->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
 
-    Q_ASSERT(distrItem);
-    m_plotwidget->setItem(distrItem);
+        DistributionItem *distrItem = dynamic_cast<DistributionItem *>(
+            m_item->getCurrentItem());
+        Q_ASSERT(distrItem);
+        m_plotwidget->setItem(distrItem);
+    }
 }
 
 void DistributionEditor::onPropertyChanged(const QString &property_name)
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h
index 606a52187b121fe2f1e3a8334935753d516b8ef2..9fd419948d353597efeb8ec27cae99469203c270 100644
--- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h
+++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h
@@ -25,7 +25,6 @@ class QGroupBox;
 class DistributionWidget;
 class GroupItem;
 class ComponentBoxEditor;
-class ModelMapper;
 
 //! The DistributionEditor class, being a child of DistributionDialog, contains a widget
 //! to show Distribution1D and awesome property editor to change distribution parameters
@@ -49,7 +48,6 @@ private:
     DistributionWidget *m_plotwidget;
     QString m_nameOfEditor;
     QGroupBox *m_box;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp
index 2191afb983f657f6e579925342aad635451265a9..18348ed0c6f1bb185c481f8f6212dd407dc49b9a 100644
--- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp
+++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp
@@ -69,26 +69,51 @@ DistributionWidget::DistributionWidget(QWidget *parent)
 
 void DistributionWidget::setItem(DistributionItem *item)
 {
-    if (m_item == item)
+    if (m_item == item) {
         return;
-    if (m_item) {
 
-        disconnect();
+    } else {
+        if (m_item) {
+            disconnect();
+            m_item->mapper()->unsubscribe(this);
+        }
+
+        m_item = item;
+        if (!m_item) return;
+
+        plotItem();
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](QString)
+        {
+            plotItem();
+        }, this);
+
     }
-    m_item = item;
 
-    if (!m_item)
-        return;
 
-    plotItem();
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(item);
-    m_mapper->setOnPropertyChange(
-                [this](QString)
-    {
-        plotItem();
-    });
+//    if (m_item == item)
+//        return;
+//    if (m_item) {
+
+//        disconnect();
+//    }
+//    m_item = item;
+
+//    if (!m_item)
+//        return;
+
+//    plotItem();
+
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(item);
+//    m_mapper->setOnPropertyChange(
+//                [this](QString)
+//    {
+//        plotItem();
+//    });
+
 }
 
 void DistributionWidget::plotItem()
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h
index 8b028014fce5d763a41f7aced3ea7c029e910df8..b80c405381a12a1c9595b26cd0995fd608170a0b 100644
--- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h
+++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h
@@ -29,7 +29,6 @@ class QCustomPlot;
 class DistributionItem;
 class QCPRange;
 class QAction;
-class ModelMapper;
 
 //! The DistributionWidget class plots 1d functions corresponding to domain's Distribution1D
 class DistributionWidget : public QWidget
@@ -64,7 +63,6 @@ private:
     QCPRange *m_xRange;
     QCPRange *m_yRange;
     WarningSignWidget *m_warningSign;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp
index ee21111da9d24e61728414f555dff4c6b00d25ff..0c78091d2b370be110f595fa06a3d3ff4303d1d5 100644
--- a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp
@@ -58,23 +58,46 @@ DetectorEditorWidget::~DetectorEditorWidget()
 
 void DetectorEditorWidget::setDetectorItem(DetectorItem *detectorItem)
 {
-    qDebug() << "DetectorEditorWidget::setDetectorItem() -> XXX";
+    if(m_detectorItem == detectorItem) {
+        return;
 
-    m_detectorItem = detectorItem;
-    if(!m_detectorItem) return;
+    } else {
+        if(m_detectorItem)
+            m_detectorItem->mapper()->unsubscribe(this);
+
+        m_detectorItem = detectorItem;
+        if(!m_detectorItem) return;
+
+        m_detectorItem->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
+
+        m_detectorTypeEditor->clearEditor();
+        m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR));
+
+        init_SubDetector_Widget();
+    }
+
+
+
+//    qDebug() << "DetectorEditorWidget::setDetectorItem() -> XXX";
+//    m_detectorItem = detectorItem;
+//    if(!m_detectorItem) return;
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(m_detectorItem);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        onPropertyChanged(name);
-    });
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(m_detectorItem);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        onPropertyChanged(name);
+//    });
 
-    m_detectorTypeEditor->clearEditor();
-    m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR));
+//    m_detectorTypeEditor->clearEditor();
+//    m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR));
 
-    init_SubDetector_Widget();
+//    init_SubDetector_Widget();
 }
 
 void DetectorEditorWidget::onPropertyChanged(const QString &propertyName)
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h
index 573188478217c3c6fb6e94db2f8d8f0e0713ad88..411f8b19ef23177e299fd6331ebafff10da174cb 100644
--- a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h
@@ -27,7 +27,6 @@ class ComponentBoxEditor;
 class QGridLayout;
 class SphericalDetectorWidget;
 class ColumnResizer;
-class ModelMapper;
 
 class BA_CORE_API_ DetectorEditorWidget : public QWidget
 {
@@ -54,7 +53,6 @@ private:
     GroupInfoBox *m_groupBox;
     DetectorItem *m_detectorItem;
     QWidget *m_subDetectorWidget;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp
index 41ffc5a885978b769ac33b9ad7a931b1363b9a25..2586d477264b5d7f07afdf0b3ecc3ca9f5225649 100644
--- a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp
@@ -60,18 +60,39 @@ RectangularDetectorWidget::~RectangularDetectorWidget()
 
 void RectangularDetectorWidget::setDetectorItem(RectangularDetectorItem *detectorItem)
 {
-    m_detectorItem = detectorItem;
-    if(!m_detectorItem) return;
-
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(m_detectorItem);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        onPropertyChanged(name);
-    });
-
-    init_editors();
+    if(m_detectorItem == detectorItem) {
+        return;
+
+    } else {
+        if(m_detectorItem)
+            m_detectorItem->mapper()->unsubscribe(this);
+
+        m_detectorItem = detectorItem;
+        if(!m_detectorItem) return;
+
+        m_detectorItem->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
+
+        init_editors();
+    }
+
+
+
+//    m_detectorItem = detectorItem;
+//    if(!m_detectorItem) return;
+
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(m_detectorItem);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        onPropertyChanged(name);
+//    });
+
+//    init_editors();
 }
 
 void RectangularDetectorWidget::onPropertyChanged(const QString &propertyName)
diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h
index 63eadb3b49993b20ca5c37204e54e19422bfcdd7..603bd27e5890bf42295aff9622714b2cf78c8ea9 100644
--- a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h
+++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h
@@ -28,7 +28,6 @@ class AwesomePropertyEditor;
 class ComponentBoxEditor;
 class QGridLayout;
 class ColumnResizer;
-class ModelMapper;
 
 class BA_CORE_API_ RectangularDetectorWidget : public QWidget
 {
@@ -63,7 +62,6 @@ private:
     QGridLayout *m_gridLayout;
 
     RectangularDetectorItem *m_detectorItem;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp
index d35ee15fe0b9780cfb8b1f5dcfac73f205f5b419..2dad456db999c402e3cb790967d70bc60dc1d6e4 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp
@@ -46,41 +46,59 @@ ColorMapPlot::~ColorMapPlot()
 //! initializes everything with new IntensityDataItem or plot it, if it was already the case
 void ColorMapPlot::setItem(IntensityDataItem *item)
 {
-    if (item && (m_item == item)) {
-        // qDebug() << "ColorMapPlot::setItem(NIntensityDataItem *item) item==m_item";
-        plotItem(m_item);
+    if(item == m_item) {
+        if(m_item)
+            plotItem(m_item);
         return;
+
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if(!m_item) return;
+
+        plotItem(m_item);
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+            onIntensityModified();
+        }, this);
+        m_item->mapper()->setOnChildPropertyChange(
+                    [this](SessionItem* item, const QString name)
+        {
+                onSubItemPropertyChanged(item->itemName(), name);
+        }, this);
+
     }
 
-//    if (m_item) {
-//        disconnect(m_item, SIGNAL(intensityModified()), this,
-//                   SLOT(onIntensityModified()));
-//    }
 
-    m_item = item;
+//    m_item = item;
 
-    if (!m_item)
-        return;
+//    if (!m_item)
+//        return;
 
-    plotItem(m_item);
+//    plotItem(m_item);
+
+////    connect(m_item, SIGNAL(intensityModified()), this,
+////               SLOT(onIntensityModified()));
+//    m_mapper.reset(new ModelMapper);
 
-//    connect(m_item, SIGNAL(intensityModified()), this,
-//               SLOT(onIntensityModified()));
-    m_mapper.reset(new ModelMapper);
-
-    m_mapper->setItem(item);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        onPropertyChanged(name);
-        onIntensityModified();
-    });
-    m_mapper->setOnChildPropertyChange(
-                [this](SessionItem* item, const QString name)
-    {
-//        if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
-            onSubItemPropertyChanged(item->itemName(), name);
-    });
+//    m_mapper->setItem(item);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        onPropertyChanged(name);
+//        onIntensityModified();
+//    });
+//    m_mapper->setOnChildPropertyChange(
+//                [this](SessionItem* item, const QString name)
+//    {
+////        if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+//            onSubItemPropertyChanged(item->itemName(), name);
+//    });
 }
 
 //! returns string containing bin content information
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h
index 7b4bef0c50b7b0e9c63e7e018ecf60415eacaa14..bfcf7d04f1bbb3db84cc15ddf5bb2d4334c39e80 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h
@@ -28,7 +28,6 @@ class IntensityDataItem;
 class QCustomPlot;
 class QCPColorMap;
 class QCPColorScale;
-class ModelMapper;
 
 //! 2D color map widget for IntensityData
 class BA_CORE_API_ ColorMapPlot : public QWidget
@@ -119,7 +118,6 @@ private:
     QMap<QString, QCPColorGradient > m_gradient_map;
     bool m_block_update;
     PositionData m_posData;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 
diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
index 4b0ff0fe25bf0ccd8b6d7d212aaa38a908be0905..08293e717487d2da99959263a07b95a3daa9236a 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
@@ -42,40 +42,64 @@ HorizontalSlicePlot::HorizontalSlicePlot(QWidget *parent)
 
 void HorizontalSlicePlot::setItem(IntensityDataItem *item)
 {
-    if (m_item == item) return;
+    if(m_item == item) {
+        return;
 
-    if (m_item) {
-//        disconnect(m_item, SIGNAL(propertyChanged(QString)),
-//                this, SLOT(onPropertyChanged(QString)));
-//        disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
-//                this, SLOT(onSubItemPropertyChanged(QString,QString)));
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if (!m_item) return;
+
+        plotItem(m_item);
+
+        m_item->mapper()->setOnChildPropertyChange(
+                    [this](SessionItem* item, const QString name)
+        {
+            if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+                onSubItemPropertyChanged(item->itemName(), name);
+        }, this);
     }
 
-    m_item = item;
 
-    if (!m_item) return;
 
-    plotItem(m_item);
 
-//    connect(m_item, SIGNAL(propertyChanged(QString)),
-//            this, SLOT(onPropertyChanged(QString)));
 
-//    if (m_mapper)
-//        m_mapper->deleteLater();
-//    m_mapper = new ModelMapper(this);
+//    if (m_item == item) return;
+
+//    if (m_item) {
+////        disconnect(m_item, SIGNAL(propertyChanged(QString)),
+////                this, SLOT(onPropertyChanged(QString)));
+////        disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
+////                this, SLOT(onSubItemPropertyChanged(QString,QString)));
+//    }
+
+//    m_item = item;
+
+//    if (!m_item) return;
+
+//    plotItem(m_item);
+
+////    connect(m_item, SIGNAL(propertyChanged(QString)),
+////            this, SLOT(onPropertyChanged(QString)));
+
+////    if (m_mapper)
+////        m_mapper->deleteLater();
+////    m_mapper = new ModelMapper(this);
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(item);
-    m_mapper->setOnChildPropertyChange(
-                [this](SessionItem* item, const QString name)
-    {
-        if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
-            onSubItemPropertyChanged(item->itemName(), name);
-    });
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(item);
+//    m_mapper->setOnChildPropertyChange(
+//                [this](SessionItem* item, const QString name)
+//    {
+//        if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+//            onSubItemPropertyChanged(item->itemName(), name);
+//    });
 
 
-//    connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
-//            this, SLOT(onSubItemPropertyChanged(QString,QString)));
+////    connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
+////            this, SLOT(onSubItemPropertyChanged(QString,QString)));
 
 }
 
diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h
index 4457388be376293feeb98dc0ad5ecb0919e4e4ec..0cbe2693e3017d2437710cf2dae890ba4ffd1d84 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h
+++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h
@@ -24,7 +24,6 @@
 class IntensityDataItem;
 class QCustomPlot;
 class QCPBars;
-class ModelMapper;
 
 //! Slice of 2D IntensityData along x-axis
 //!  FIXME functionality has to be merged with VerticalSlicePlot (code duplication)
@@ -59,7 +58,6 @@ private:
     QCustomPlot *m_customPlot;
     QCPBars *m_bars;
     IntensityDataItem *m_item;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp
index 79f9539e29358986c8ad75f1989760efc2bd1c6f..2ad6de8689217e6be056400d1a4a5f495073945a 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp
@@ -94,43 +94,75 @@ IntensityDataPlotWidget::~IntensityDataPlotWidget()
 //! initializes the class with NIntensityDataItem
 void IntensityDataPlotWidget::setItem(IntensityDataItem *item)
 {
-    //qDebug() << "IntensityDataPlotWidget::setItem(NIntensityDataItem *item)";
-
     m_centralPlot->setItem(item);
     m_horizontalPlot->setItem(item);
     m_verticalPlot->setItem(item);
 
-    if (m_item == item) return;
+    if (m_item == item) {
+        return;
 
-    if (m_item) {
-//        disconnect(m_item, SIGNAL(propertyChanged(QString)),
-//                this, SLOT(onPropertyChanged(QString)));
-//        disconnect(m_item, SIGNAL(intensityModified()), this, SLOT(onIntensityModified()));
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if (!m_item) return;
+
+        updateItem(m_item);
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            if(name == IntensityDataItem::P_PROJECTIONS_FLAG) {
+                showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
+            }
+        }, this);
+        m_item->mapper()->setOnValueChange([this](void){
+            onIntensityModified();
+        }, this);
     }
 
-    m_item = item;
 
-    if (!m_item) return;
 
-    updateItem(m_item);
 
-//    if (m_mapper)
-//        m_mapper->deleteLater();
-//    m_mapper = new ModelMapper(this);
+//    //qDebug() << "IntensityDataPlotWidget::setItem(NIntensityDataItem *item)";
+
+//    m_centralPlot->setItem(item);
+//    m_horizontalPlot->setItem(item);
+//    m_verticalPlot->setItem(item);
+
+//    if (m_item == item) return;
+
+//    if (m_item) {
+////        disconnect(m_item, SIGNAL(propertyChanged(QString)),
+////                this, SLOT(onPropertyChanged(QString)));
+////        disconnect(m_item, SIGNAL(intensityModified()), this, SLOT(onIntensityModified()));
+//    }
+
+//    m_item = item;
+
+//    if (!m_item) return;
+
+//    updateItem(m_item);
+
+////    if (m_mapper)
+////        m_mapper->deleteLater();
+////    m_mapper = new ModelMapper(this);
+
 
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(item);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        if(name == IntensityDataItem::P_PROJECTIONS_FLAG) {
+//            showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
+//        }
+//    });
+//    m_mapper->setOnValueChange([this](void){
+//        onIntensityModified();
+//    });
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(item);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        if(name == IntensityDataItem::P_PROJECTIONS_FLAG) {
-            showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
-        }
-    });
-    m_mapper->setOnValueChange([this](void){
-        onIntensityModified();
-    });
 }
 
 //! provide syncronious move of top and bottom splitters
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h
index 7ee0f993bbf06489dc1659d8039e83320e61b7a3..6f5e0b54db81b533f1bc868116c2a8cc2f5d1e65 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h
@@ -27,7 +27,6 @@ class VerticalSlicePlot;
 class ColorMapPlot;
 class QLabel;
 class IntensityDataItem;
-class ModelMapper;
 
 //! The widget contains IntensityDataItem color map, two projections and all
 //! logic. Belongs to IntensityDataWidget.
@@ -82,7 +81,6 @@ private:
     int m_leftHistogramArea;
     int m_bottomHistogramArea;
     IntensityDataItem *m_item;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp
index 588db865406f3850b8a877e6a778df99c037f4ed..d454aa38dbca8d6998a939e32f7398a8392c140d 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp
@@ -59,14 +59,40 @@ void IntensityDataWidget::setItem(IntensityDataItem *item)
     m_plotWidget->setItem(item);
     m_propertyWidget->setItem(item);
 
-    if (m_currentItem == item) return;
+    if (m_currentItem == item) {
+        return;
+
+    } else {
+        if(m_currentItem)
+            m_currentItem->mapper()->unsubscribe(this);
+
+        m_currentItem = item;
+        if (!m_currentItem) return;
+
+        setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+
+        m_currentItem->mapper()->setOnPropertyChange(
+                     [this](const QString &name)
+        {
+            if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) {
+                setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+            }
+        }, this);
+    }
 
 
-    m_currentItem = item;
+//    m_plotWidget->setItem(item);
+//    m_propertyWidget->setItem(item);
 
-    if (!m_currentItem) return;
+//    if (m_currentItem == item) return;
+
+
+//    m_currentItem = item;
+
+//    if (!m_currentItem) return;
+
+//    updateItem(m_currentItem);
 
-    updateItem(m_currentItem);
 }
 
 void IntensityDataWidget::togglePropertyPanel()
@@ -88,20 +114,20 @@ void IntensityDataWidget::setPropertyPanelVisible(bool visible)
     m_propertyWidget->setVisible(visible);
 }
 
-void IntensityDataWidget::updateItem(IntensityDataItem *item)
-{
-    setPropertyPanelVisible(item->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
-
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(item);
-    m_mapper->setOnPropertyChange(
-                 [this](const QString &name)
-    {
-        if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) {
-            setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
-        }
-    });
-}
+//void IntensityDataWidget::updateItem(IntensityDataItem *item)
+//{
+//    setPropertyPanelVisible(item->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(item);
+//    m_mapper->setOnPropertyChange(
+//                 [this](const QString &name)
+//    {
+//        if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) {
+//            setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+//        }
+//    });
+//}
 
 void IntensityDataWidget::toggleProjections()
 {
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h
index 054bbe684cb337e5ac0c11cff98da49ced5b1918..0a8ec8c974d54a0dea67a3351d285a24c9979275 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h
@@ -24,7 +24,6 @@
 class IntensityDataPropertyWidget;
 class IntensityDataItem;
 class IntensityDataPlotWidget;
-class ModelMapper;
 
 //! The widget presents IntensityData color map and property editor.
 //! Belongs to the stack handled by JobOutputDataWidget
@@ -50,12 +49,11 @@ public slots:
     void setPropertyPanelVisible(bool visible);
 
 private:
-    void updateItem(IntensityDataItem *item);
+//    void updateItem(IntensityDataItem *item);
 
     IntensityDataPlotWidget *m_plotWidget;
     IntensityDataPropertyWidget *m_propertyWidget;
     IntensityDataItem *m_currentItem;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 
diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
index 9f408bdf53921c8e21e99234c2eaf71b068ceba0..1f28dc92b0b111486075439f30ba8a5da294dabd 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
@@ -42,38 +42,60 @@ VerticalSlicePlot::VerticalSlicePlot(QWidget *parent)
 
 void VerticalSlicePlot::setItem(IntensityDataItem *item)
 {
-    if (m_item == item) return;
+    if (m_item == item) {
+        return;
 
-    if (m_item) {
-//        disconnect(m_item, SIGNAL(propertyChanged(QString)),
-//                this, SLOT(onPropertyChanged(QString)));
-//        disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
-//                this, SLOT(onSubItemPropertyChanged(QString,QString)));
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if (!m_item) return;
+
+        plotItem(m_item);
+
+        m_item->mapper()->setOnChildPropertyChange(
+                    [this](SessionItem* item, const QString name)
+        {
+            if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+                onSubItemPropertyChanged(item->itemName(), name);
+        }, this);
     }
 
-    m_item = item;
 
-    if (!m_item) return;
 
-    plotItem(m_item);
-//    if (m_mapper)
-//        m_mapper->deleteLater();
-//    m_mapper = new ModelMapper(this);
+//    if (m_item == item) return;
+
+//    if (m_item) {
+////        disconnect(m_item, SIGNAL(propertyChanged(QString)),
+////                this, SLOT(onPropertyChanged(QString)));
+////        disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
+////                this, SLOT(onSubItemPropertyChanged(QString,QString)));
+//    }
+
+//    m_item = item;
+
+//    if (!m_item) return;
+
+//    plotItem(m_item);
+////    if (m_mapper)
+////        m_mapper->deleteLater();
+////    m_mapper = new ModelMapper(this);
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(item);
-    m_mapper->setOnChildPropertyChange(
-                [this](SessionItem* item, const QString name)
-    {
-        if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
-            onSubItemPropertyChanged(item->itemName(), name);
-    });
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(item);
+//    m_mapper->setOnChildPropertyChange(
+//                [this](SessionItem* item, const QString name)
+//    {
+//        if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+//            onSubItemPropertyChanged(item->itemName(), name);
+//    });
 
-//    connect(m_item, SIGNAL(propertyChanged(QString)),
-//            this, SLOT(onPropertyChanged(QString)));
+////    connect(m_item, SIGNAL(propertyChanged(QString)),
+////            this, SLOT(onPropertyChanged(QString)));
 
-//    connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
-//            this, SLOT(onSubItemPropertyChanged(QString,QString)));
+////    connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)),
+////            this, SLOT(onSubItemPropertyChanged(QString,QString)));
 
 }
 
diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h
index 5fd94ce644c007cecc57631b63d034a90e85c426..970cd27a221790f9ce15bee9a9fd19d893d8608e 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h
+++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h
@@ -24,7 +24,6 @@
 class IntensityDataItem;
 class QCustomPlot;
 class QCPBars;
-class ModelMapper;
 
 //! Slice of 2D IntensityData along x-axis
 class BA_CORE_API_ VerticalSlicePlot : public QWidget
@@ -58,8 +57,6 @@ private:
     QCustomPlot *m_customPlot;
     QCPBars *m_bars;
     IntensityDataItem *m_item;
-//    ModelMapper *m_mapper;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 
diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp
index 8fa46dd4e760328a88e1a6004f92f1c6b42a8a6f..9b814bb6529d47c5272c59274730d20d20344615 100644
--- a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp
+++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp
@@ -85,26 +85,50 @@ void JobPropertiesWidget::setItem(JobItem *jobItem)
 {
     m_propertyEditor->setItem(jobItem);
 
-    if (m_currentItem == jobItem) return;
+    if (m_currentItem == jobItem) {
+        return;
 
-    m_currentItem = jobItem;
+    } else {
+        if(m_currentItem)
+            m_currentItem->mapper()->unsubscribe(this);
 
-    if (!m_currentItem) return;
+        m_currentItem = jobItem;
+        if (!m_currentItem) return;
 
-    updateItem(m_currentItem);
-//    if (m_mapper)
-//        m_mapper->deleteLater();
-//    m_mapper = new ModelMapper(this);
+        updateItem(m_currentItem);
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(jobItem);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        if(name == JobItem::P_COMMENTS) {
-            updateItem(m_currentItem);
-        }
-    });
+        m_currentItem->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            if(name == JobItem::P_COMMENTS) {
+                updateItem(m_currentItem);
+            }
+        }, this);
+    }
+
+
+//    m_propertyEditor->setItem(jobItem);
+
+//    if (m_currentItem == jobItem) return;
+
+//    m_currentItem = jobItem;
+
+//    if (!m_currentItem) return;
+
+//    updateItem(m_currentItem);
+////    if (m_mapper)
+////        m_mapper->deleteLater();
+////    m_mapper = new ModelMapper(this);
+
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(jobItem);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        if(name == JobItem::P_COMMENTS) {
+//            updateItem(m_currentItem);
+//        }
+//    });
 
 }
 
diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h
index 753361e39fb0a4d387626d28f514a054fae944b8..b75fb0b3d310b512c7419a0e3e2430d709e546ec 100644
--- a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h
+++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h
@@ -27,7 +27,6 @@ class JobItem;
 class QTextEdit;
 class QTabWidget;
 class ComponentEditor;
-class ModelMapper;
 
 //! Widget to show and change properties of currently selected JobItem
 //! Left buttom corner of JobView
@@ -58,7 +57,6 @@ private:
     ComponentEditor *m_propertyEditor;
     QTextEdit *m_commentsEditor;
     bool m_block_update;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp
index 57cf198b7176fd98e951855c8b62f9695217ea86..aa11bce1c4e0c8db355f3296d60ee2ce5be5c49c 100644
--- a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp
+++ b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp
@@ -183,7 +183,7 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent,
         m_contentLayout->addWidget(m_valueBox);
         m_contentLayout->addWidget(m_slider);
 
-//        ModelMapper *mapper = new ModelMapper(m_contentWidget);
+////        ModelMapper *mapper = new ModelMapper(m_contentWidget);
 
         m_mapper.reset(new ModelMapper);
         m_mapper->setItem(m_currentItem);
@@ -192,6 +192,14 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent,
             m_valueBox->setValue(m_currentItem->value().toDouble());
         });
 
+//        m_currentItem->mapper()->unsubscribe(this);
+//        m_currentItem->mapper()->setOnValueChange(
+//                     [this](){
+//              m_valueBox->setValue(m_currentItem->value().toDouble());
+//         }, this);
+
+
+
         m_contentWidget->setLayout(m_contentLayout);
 
         return m_contentWidget;
diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp
index 28064f7caacdae759a845eff2336aee9500889eb..9da9cc621ea509f551a9836351015c6f36134311 100644
--- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp
+++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp
@@ -95,29 +95,51 @@ ModelTuningWidget::~ModelTuningWidget()
 
 void ModelTuningWidget::setCurrentItem(JobItem *item)
 {
-    if (m_currentJobItem == item) return;
+    if (m_currentJobItem == item) {
+        return;
+
+    } else {
+        if(m_currentJobItem)
+            m_currentJobItem->mapper()->unsubscribe(this);
+
+        m_currentJobItem = item;
+        if (!m_currentJobItem) return;
 
+        updateParameterModel();
 
-    m_currentJobItem = item;
+        m_currentJobItem->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
 
-    if (!m_currentJobItem) return;
+        m_fitTools->setCurrentItem(m_currentJobItem, m_treeView->selectionModel());
+    }
 
-    updateParameterModel();
+//    if (m_currentJobItem == item) return;
 
-//    if (m_mapper)
-//        m_mapper->deleteLater();
-//    m_mapper = new ModelMapper(this);
 
-    m_mapper.reset(new ModelMapper);
-    m_mapper->setItem(item);
-    m_mapper->setOnPropertyChange(
-                [this](const QString &name)
-    {
-        onPropertyChanged(name);
-    });
+//    m_currentJobItem = item;
+
+//    if (!m_currentJobItem) return;
+
+//    updateParameterModel();
+
+////    if (m_mapper)
+////        m_mapper->deleteLater();
+////    m_mapper = new ModelMapper(this);
+
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(item);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        onPropertyChanged(name);
+//    });
+
 
+//    m_fitTools->setCurrentItem(item, m_treeView->selectionModel());
 
-    m_fitTools->setCurrentItem(item, m_treeView->selectionModel());
 }
 
 void ModelTuningWidget::onCurrentLinkChanged(SessionItem *item)
diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h
index 85b24754c94bfb8a51d6b65ac1764073a6f823e7..d3f82474e8b5b5aac5d55b021ee77c7e6851ae12 100644
--- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h
+++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h
@@ -28,7 +28,6 @@ class QTreeView;
 class SampleModel;
 class InstrumentModel;
 class WarningSignWidget;
-class ModelMapper;
 class SessionItem;
 class FitTools;
 
@@ -65,7 +64,6 @@ private:
     ModelTuningDelegate *m_delegate;
     WarningSignWidget *m_warningSign;
     FitTools *m_fitTools;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 #endif
diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp
index 680b4d41c39de5e3010fafb65f79594c05332c67..4e2cd4626a319dbd1d9255d1b24b24aacc74723a 100644
--- a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp
+++ b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp
@@ -41,44 +41,64 @@ QRectF IMaskView::boundingRect() const
 
 void IMaskView::setParameterizedItem(SessionItem *item)
 {
-//    if(m_item != item) {
-//        if(m_item) {
-//            disconnect(m_item, SIGNAL(propertyChanged(const QString &)), this,
-//                    SLOT(onPropertyChange(const QString &)));
-//            disconnect(m_item, SIGNAL(subItemChanged(const QString &)), this,
-//                    SLOT(onPropertyChange(const QString &)));
-
-//        }
-
-//        m_item = item;
+    if(m_item == item) {
+        return;
 
-//        if(m_item) {
-//            connect(m_item, SIGNAL(propertyChanged(const QString &)), this,
-//                    SLOT(onPropertyChange(const QString &)));
-//            connect(m_item, SIGNAL(subItemChanged(const QString &)), this,
-//                    SLOT(onPropertyChange(const QString &)));
-//        }
-//    }
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
 
-    if(m_item != item) {
         m_item = item;
+        if(!m_item) return;
 
-//        if (m_mapper)
-//            m_mapper->deleteLater();
-//        m_mapper = new ModelMapper(this);
-
-        m_mapper.reset(new ModelMapper);
-        m_mapper->setItem(item);
-        m_mapper->setOnPropertyChange(
+        m_item->mapper()->setOnPropertyChange(
                     [this](const QString &name)
         {
             onPropertyChange(name);
-        });
-
+        }, this);
     }
 
 
 
+
+////    if(m_item != item) {
+////        if(m_item) {
+////            disconnect(m_item, SIGNAL(propertyChanged(const QString &)), this,
+////                    SLOT(onPropertyChange(const QString &)));
+////            disconnect(m_item, SIGNAL(subItemChanged(const QString &)), this,
+////                    SLOT(onPropertyChange(const QString &)));
+
+////        }
+
+////        m_item = item;
+
+////        if(m_item) {
+////            connect(m_item, SIGNAL(propertyChanged(const QString &)), this,
+////                    SLOT(onPropertyChange(const QString &)));
+////            connect(m_item, SIGNAL(subItemChanged(const QString &)), this,
+////                    SLOT(onPropertyChange(const QString &)));
+////        }
+////    }
+
+//    if(m_item != item) {
+//        m_item = item;
+
+////        if (m_mapper)
+////            m_mapper->deleteLater();
+////        m_mapper = new ModelMapper(this);
+
+//        m_mapper.reset(new ModelMapper);
+//        m_mapper->setItem(item);
+//        m_mapper->setOnPropertyChange(
+//                    [this](const QString &name)
+//        {
+//            onPropertyChange(name);
+//        });
+
+//    }
+
+
+
 }
 
 SessionItem *IMaskView::getParameterizedItem()
diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.h b/GUI/coregui/Views/MaskWidgets/IMaskView.h
index 3c89bbeb805dfa517eb38d1a339d8b8315b9a7b9..e98286eb6727d16bb92f8c469ec1a7799430212a 100644
--- a/GUI/coregui/Views/MaskWidgets/IMaskView.h
+++ b/GUI/coregui/Views/MaskWidgets/IMaskView.h
@@ -25,7 +25,6 @@
 class SessionItem;
 class ISceneAdaptor;
 class QPainter;
-class ModelMapper;
 
 //! Main interface class for views representing MaskItems on graphics scene
 
@@ -73,8 +72,6 @@ protected:
     SessionItem *m_item;
     const ISceneAdaptor *m_adaptor;
     QRectF m_bounding_rect;
-//    ModelMapper *m_mapper;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
index 4d3a162d79f6157676226d257616d4107a222b4f..114fa5b1b8535aa95c7af84983572f09f84e977b 100644
--- a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
+++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
@@ -204,7 +204,7 @@ void DesignerScene::onSceneSelectionChanged()
     for (int i = 0; i < selected.size(); ++i) {
         IView *view = dynamic_cast<IView *>(selected[i]);
         if (view) {
-            SessionItem *sampleItem = view->getParameterizedItem();
+            SessionItem *sampleItem = view->getItem();
             QModelIndex itemIndex = m_sampleModel->indexOfItem(sampleItem);
             Q_ASSERT(itemIndex.isValid());
             if (!m_selectionModel->isSelected(m_proxy->mapFromSource(itemIndex)))
@@ -241,7 +241,7 @@ void DesignerScene::updateViews(const QModelIndex &parentIndex, IView *parentVie
                 if (parentView) {
                     qDebug() << "       DesignerScene::updateViews() -> adding child "
                              << item->modelType() << " to parent"
-                             << parentView->getParameterizedItem()->modelType();
+                             << parentView->getItem()->modelType();
                     parentView->addView(childView, childCount++);
                 }
             }
@@ -380,11 +380,11 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection *connection)
 //    childView->getParameterizedItem()->setPort(input_port_index);
     qDebug() << parentView->getInputPortIndex(connection->getInputPort());
     QString tag;
-    if (connection->getParentView()->getParameterizedItem()->modelType() == Constants::ParticleLayoutType) {
+    if (connection->getParentView()->getItem()->modelType() == Constants::ParticleLayoutType) {
         if (connection->getInputPort()->getPortType() == NodeEditorPort::INTERFERENCE)
             tag = ParticleLayoutItem::T_INTERFERENCE;
     }
-    else if (connection->getParentView()->getParameterizedItem()->modelType() == Constants::ParticleCoreShellType) {
+    else if (connection->getParentView()->getItem()->modelType() == Constants::ParticleCoreShellType) {
         if (parentView->getInputPortIndex(connection->getInputPort()) == 0)
             tag = ParticleCoreShellItem::T_CORE;
         else if (parentView->getInputPortIndex(connection->getInputPort()) == 1)
@@ -392,14 +392,14 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection *connection)
         else if (connection->getInputPort()->getPortType() == NodeEditorPort::TRANSFORMATION)
             tag = ParticleItem::T_TRANSFORMATION;
 
-    } else if (connection->getParentView()->getParameterizedItem()->modelType() == Constants::ParticleCompositionType) {
+    } else if (connection->getParentView()->getItem()->modelType() == Constants::ParticleCompositionType) {
         if (connection->getInputPort()->getPortType() == NodeEditorPort::TRANSFORMATION)
             tag = ParticleItem::T_TRANSFORMATION;
     }
     delete connection; // deleting just created connection because it will be recreated from the
                        // model
-    m_sampleModel->moveParameterizedItem(childView->getParameterizedItem(),
-                                         parentView->getParameterizedItem(), -1, tag);
+    m_sampleModel->moveParameterizedItem(childView->getItem(),
+                                         parentView->getItem(), -1, tag);
 }
 
 //! propagates break of connection between views on scene to the model
@@ -407,7 +407,7 @@ void DesignerScene::removeConnection(NodeEditorConnection *connection)
 {
     qDebug() << "DesignerScene::removeConnection()";
     IView *childView = dynamic_cast<IView *>(connection->getOutputPort()->parentItem());
-    m_sampleModel->moveParameterizedItem(childView->getParameterizedItem(), 0);
+    m_sampleModel->moveParameterizedItem(childView->getItem(), 0);
 }
 
 //! handles drag event
diff --git a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
index 690e11eebd0e13294b222ccd5c21956cf5fc8d50..40474d2878413b01fbd8345c1326299827d91951 100644
--- a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
@@ -107,7 +107,7 @@ void ILayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
 void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
     qDebug() << "ILayerView::mouseReleaseEvent()  this:" << this
-             << getParameterizedItem()->itemName() << " parentItem: " << parentItem();
+             << getItem()->itemName() << " parentItem: " << parentItem();
 
     DesignerScene *designerScene = dynamic_cast<DesignerScene *>(scene());
     Q_ASSERT(designerScene);
@@ -145,7 +145,7 @@ void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 
     // Layer was moved only slightly, to the same row of his own MultiLayer: returning back.
     if (requested_parent == parentItem()
-        && requested_row == getParameterizedItem()->parent()->getItems().indexOf(getParameterizedItem())) {
+        && requested_row == getItem()->parent()->getItems().indexOf(getItem())) {
         qDebug() << "1.2 Layer->MultiLayer (same), same drop area";
         setPos(m_drag_start_position);
         QGraphicsItem::mouseReleaseEvent(event);
@@ -157,7 +157,7 @@ void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
     if (parentItem() && !requested_parent) {
         qDebug() << "1.3 Layer->Scene";
         setPos(mapToScene(event->pos()) - event->pos());
-        model->moveParameterizedItem(this->getParameterizedItem(), 0);
+        model->moveParameterizedItem(this->getItem(), 0);
         QGraphicsItem::mouseReleaseEvent(event);
         return;
     }
@@ -166,8 +166,8 @@ void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
     // one multilayer: changing ownership or row within same ownership.
     if (requested_parent) {
         qDebug() << "1.4 ILayerView->MultiLayer";
-        model->moveParameterizedItem(this->getParameterizedItem(),
-                                     requested_parent->getParameterizedItem(), requested_row);
+        model->moveParameterizedItem(this->getItem(),
+                                     requested_parent->getItem(), requested_row);
         QGraphicsItem::mouseReleaseEvent(event);
         return;
     }
diff --git a/GUI/coregui/Views/SampleDesigner/IView.cpp b/GUI/coregui/Views/SampleDesigner/IView.cpp
index e18b5a5741a04f94ab64c5d401dc422f77fbb74c..ae8a4f3ac514789026dda64e5154d01b4cd910af 100644
--- a/GUI/coregui/Views/SampleDesigner/IView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/IView.cpp
@@ -36,34 +36,30 @@ void IView::setParameterizedItem(SessionItem *item)
     Q_ASSERT(item);
     Q_ASSERT(m_item == nullptr);
 
-    if (item) {
-        m_item = item;
-        setX(m_item->getItemValue(SessionGraphicsItem::P_XPOS).toReal());
-        setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal());
+    m_item = item;
+    setX(m_item->getItemValue(SessionGraphicsItem::P_XPOS).toReal());
+    setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal());
 
-        m_mapper.reset(new ModelMapper);
-        m_mapper->setItem(item);
-        m_mapper->setOnPropertyChange(
-                    [this] (const QString &name)
-        {
-            onPropertyChange(name);
-        });
+    m_item->mapper()->setOnPropertyChange(
+                [this] (const QString &name)
+    {
+        onPropertyChange(name);
+    }, this);
 
-        m_mapper->setOnSiblingsChange(
-                    [this]()
-        {
-            onSiblingsChange();
-        });
+    m_item->mapper()->setOnSiblingsChange(
+                [this]()
+    {
+         onSiblingsChange();
+    }, this);
 
 
-        update_appearance();
-    }
+    update_appearance();
 }
 
 void IView::addView(IView *childView, int row)
 {
     qDebug() << "IView::addView() " << m_item->itemName()
-             << childView->getParameterizedItem()->itemName() << " row:" << row;
+             << childView->getItem()->itemName() << " row:" << row;
 }
 
 void IView::onChangedX()
diff --git a/GUI/coregui/Views/SampleDesigner/IView.h b/GUI/coregui/Views/SampleDesigner/IView.h
index 9f56ecdc61e356af22a0901dd0fbf3012d1a286a..0889d6d076554bf65659176f439b040df688af0d 100644
--- a/GUI/coregui/Views/SampleDesigner/IView.h
+++ b/GUI/coregui/Views/SampleDesigner/IView.h
@@ -22,7 +22,6 @@
 #include <memory>
 
 class SessionItem;
-class ModelMapper;
 
 //! parent class for graphic representation of all ISample's
 class BA_CORE_API_ IView : public QGraphicsObject
@@ -38,7 +37,7 @@ public:
 
     virtual void setParameterizedItem(SessionItem *item);
 
-    virtual SessionItem *getParameterizedItem();
+    virtual SessionItem *getItem();
 
     virtual void addView(IView *childView, int row = 0);
 
@@ -55,7 +54,6 @@ protected:
     virtual void onSiblingsChange();
 
     SessionItem *m_item;
-    std::unique_ptr<ModelMapper> m_mapper;
 };
 
 inline int IView::type() const
@@ -63,7 +61,7 @@ inline int IView::type() const
     return TYPE;
 }
 
-inline SessionItem *IView::getParameterizedItem()
+inline SessionItem *IView::getItem()
 {
     return m_item;
 }
diff --git a/GUI/coregui/Views/SampleDesigner/LayerView.cpp b/GUI/coregui/Views/SampleDesigner/LayerView.cpp
index b24beeebe91bce880084f97c9d778f8c42b1c887..35b336a2a7012e93fc2b49f7ed2f3a1a7e06c6cd 100644
--- a/GUI/coregui/Views/SampleDesigner/LayerView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/LayerView.cpp
@@ -54,7 +54,7 @@ void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
 
 void LayerView::addView(IView *childView, int /* row */)
 {
-    qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName();
+    qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getItem()->itemName();
     ParticleLayoutView *layout = dynamic_cast<ParticleLayoutView *>(childView);
     Q_ASSERT(layout);
     connectInputPort(layout, 0);
diff --git a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
index bf881f5d623876d3e94b440670333c3c7db5d19b..474eb4317184a44825dd11ff4f102dc410689dd6 100644
--- a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
@@ -57,7 +57,7 @@ void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *op
 
 void MultiLayerView::addView(IView *childView, int row)
 {
-    qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName() << "row" << row;
+    qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getItem()->itemName() << "row" << row;
     ILayerView *layer = dynamic_cast<ILayerView *>(childView);
     Q_ASSERT(layer);
 
@@ -254,7 +254,7 @@ void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event)
             qDebug() << "\n XXX" << getDropArea(event->scenePos()) << event->scenePos();
             sampleModel->insertNewItem(
                         mimeData->getClassName(),
-                        sampleModel->indexOfItem(this->getParameterizedItem()),
+                        sampleModel->indexOfItem(this->getItem()),
                         getDropArea(event->pos())
                         );
         }
@@ -272,7 +272,7 @@ const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEve
 
     int row = getDropArea(event->pos());
     if(mimeData->hasFormat("bornagain/widget")
-            && getParameterizedItem()->acceptsAsDefaultItem(mimeData->getClassName())
+            && getItem()->acceptsAsDefaultItem(mimeData->getClassName())
             && row!=-1 ) {
 
         qDebug() << "MultiLayerView::checkDragEvent -> yes"  << row << getDropAreaRectangle(row);
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp
index 1a43e63cb594f40eb3c11a415d0305a3a76542a8..bfce10b47e3af6cecabff43655e29e72daeaa7e2 100644
--- a/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp
@@ -38,7 +38,7 @@ void ParticleCompositionView::addView(IView *childView, int /* row */)
     int index = 0;//int(childView->getParameterizedItem()->port());
 //                    ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT)
 //                    .toInt();
-    if (this->getParameterizedItem()->tagFromItem(childView->getParameterizedItem()) == ParticleItem::T_TRANSFORMATION)
+    if (this->getItem()->tagFromItem(childView->getItem()) == ParticleItem::T_TRANSFORMATION)
         index = 1;
     qDebug() << "ParticleCompositionView::addView()" << index;
     connectInputPort(dynamic_cast<ConnectableView *>(childView), index);
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp
index 7cf675063e1e4d36d8ee4b159d6eae8974912ef8..eea4e9e1ed0e2d563c97ea0b0b596c86f904991f 100644
--- a/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp
@@ -42,9 +42,9 @@ void ParticleCoreShellView::addView(IView *childView, int /* row */)
 //                    ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT)
 //                    .toInt();
     int index = 0;
-    if (this->getParameterizedItem()->tagFromItem(childView->getParameterizedItem()) == ParticleCoreShellItem::T_CORE) {
+    if (this->getItem()->tagFromItem(childView->getItem()) == ParticleCoreShellItem::T_CORE) {
         index = 0;
-    } else if (this->getParameterizedItem()->tagFromItem(childView->getParameterizedItem()) == ParticleCoreShellItem::T_SHELL) {
+    } else if (this->getItem()->tagFromItem(childView->getItem()) == ParticleCoreShellItem::T_SHELL) {
         index = 1;
     } else {
         index = 2;
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp
index bb11920aec4ccefc4e8918bb69a71fb1a897999d..ac0105fe54fedd248190f9d54d78cd30c81bd905 100644
--- a/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp
@@ -37,7 +37,7 @@ ParticleLayoutView::ParticleLayoutView(QGraphicsItem *parent)
 void ParticleLayoutView::addView(IView *childView, int /* row */)
 {
     qDebug() << "ParticleLayoutView::addView() xxx " << m_item->itemName()
-             << childView->getParameterizedItem()->itemName() << childView->type()
+             << childView->getItem()->itemName() << childView->type()
              << DesignerHelper::PARTICLE;
     if(childView->type() == DesignerHelper::PARTICLE) {
         connectInputPort(dynamic_cast<ConnectableView *>(childView), 0);
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleView.cpp
index 09a065cc2706363d08c4d8859b28ffeb7daded93..08109d4a6c985309a7d915bb8a8835683c97add7 100644
--- a/GUI/coregui/Views/SampleDesigner/ParticleView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ParticleView.cpp
@@ -100,7 +100,7 @@ void ParticleView::updatePixmap()
 {
     GroupProperty_t group_property
         = dynamic_cast<GroupItem *>(
-              getParameterizedItem()->getItem(ParticleItem::P_FORM_FACTOR))
+              getItem()->getItem(ParticleItem::P_FORM_FACTOR))
               ->group();
     QString current_ff_type = group_property->getCurrentType();
     QString filename
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp
index 4bc107554afd9a41203fdf74f41eb908a0202d76..4b7d7b8128a9157e8333a50b8551beb558a940e6 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp
@@ -118,7 +118,7 @@ QList<IView *> SampleViewAligner::getConnectedViews(IView *view)
 {
     QList<IView *> result;
 
-    SessionItem *itemOfView = view->getParameterizedItem();
+    SessionItem *itemOfView = view->getItem();
 
     QList<SessionItem *> connected_items;
 
diff --git a/Tests/UnitTests/TestGUI/TestMapperForItem.h b/Tests/UnitTests/TestGUI/TestMapperForItem.h
index 1a5ae46a3c5ca37b8f8cac86544c9c4d05d583d9..e52bad899772cb3cf9b3414871c853b4fbfaa980 100644
--- a/Tests/UnitTests/TestGUI/TestMapperForItem.h
+++ b/Tests/UnitTests/TestGUI/TestMapperForItem.h
@@ -124,12 +124,12 @@ public:
         , m_mapped_item(0)
     { }
 
-    void setItem(SessionItem *item, Widget *widget, bool with_subscription = false)
+    void setItem(SessionItem *item, Widget *widget = 0, bool with_subscription = false)
     {
         m_mapped_item = item;
         m_mapper.reset(new ModelMapper);
         m_mapper->setItem(item);
-        widget->subscribe(m_mapper.get(), with_subscription);
+        if(widget) widget->subscribe(m_mapper.get(), with_subscription);
     }
 
 private:
@@ -143,6 +143,7 @@ private slots:
     void test_onChildrenChange();
     void test_onSiblingsChange();
     void test_Subscription();
+    void test_TwoWidgetsSubscription();
 };
 
 inline void TestMapperForItem::test_initialCondition()
@@ -310,11 +311,37 @@ inline void TestMapperForItem::test_Subscription()
     layer->setItemValue(LayerItem::P_THICKNESS, 2.0);
     QCOMPARE(w.m_onPropertyChangeCount, 2);
 
+    // unsubscribe widget and check that it doesn't react on item value change
     w.unsubscribe(m_mapper.get());
     layer->setItemValue(LayerItem::P_THICKNESS, 3.0);
     QCOMPARE(w.m_onPropertyChangeCount, 2);
 }
 
+inline void TestMapperForItem::test_TwoWidgetsSubscription()
+{
+    Widget w1, w2;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+
+    // Mapper is looking on child; set property of child
+    setItem(layer);
+    w1.subscribe(m_mapper.get(), true);
+    w2.subscribe(m_mapper.get(), true);
+    QCOMPARE(w1.m_onPropertyChangeCount, 0);
+    QCOMPARE(w2.m_onPropertyChangeCount, 0);
+
+    layer->setItemValue(LayerItem::P_THICKNESS, 1.0);
+    QCOMPARE(w1.m_onPropertyChangeCount, 1);
+    QCOMPARE(w2.m_onPropertyChangeCount, 1);
+
+    w1.unsubscribe(m_mapper.get());
+    layer->setItemValue(LayerItem::P_THICKNESS, 2.0);
+    QCOMPARE(w1.m_onPropertyChangeCount, 1);
+    QCOMPARE(w2.m_onPropertyChangeCount, 2);
+
+}
+
 
 
 #endif