diff --git a/GUI/coregui/Models/ModelMapper.cpp b/GUI/coregui/Models/ModelMapper.cpp
index 75f1ed9a7541db6bb35597c803704a3dd5dbf39e..eadf4609925c8940c899445958ea918ea414e773 100644
--- a/GUI/coregui/Models/ModelMapper.cpp
+++ b/GUI/coregui/Models/ModelMapper.cpp
@@ -72,6 +72,11 @@ void ModelMapper::setOnItemDestroy(std::function<void (SessionItem *)> f, const
     m_onItemDestroy.push_back(call_item_t(f, caller));
 }
 
+void ModelMapper::setOnAboutToRemoveChild(std::function<void (SessionItem*)> f, const void* caller)
+{
+    m_onAboutToRemoveChild.push_back(call_item_t(f, caller));
+}
+
 //! Cancells all subscribtion of given caller
 void ModelMapper::unsubscribe(const void *caller)
 {
@@ -83,6 +88,7 @@ void ModelMapper::unsubscribe(const void *caller)
     clean_container(m_onSiblingsChange, caller);
     clean_container(m_onAnyChildChange, caller);
     clean_container(m_onItemDestroy, caller);
+    clean_container(m_onAboutToRemoveChild, caller);
 }
 
 void ModelMapper::setModel(SessionModel *model)
@@ -189,7 +195,16 @@ void ModelMapper::callOnAnyChildChange(SessionItem *item)
             f.first(item);
         }
     }
-//    if(m_active) emit anyChildChange(item);
+    //    if(m_active) emit anyChildChange(item);
+}
+
+void ModelMapper::callOnAboutToRemoveChild(SessionItem* item)
+{
+    if (m_active && m_onAboutToRemoveChild.size() > 0) {
+        for (auto f : m_onAboutToRemoveChild) {
+            f.first(item);
+        }
+    }
 }
 
 //! Notifies subscribers if an item owning given mapper is about to be destroyed
@@ -215,6 +230,7 @@ void ModelMapper::clearMapper()
     m_onSiblingsChange.clear();
     m_onAnyChildChange.clear();
     m_onItemDestroy.clear();
+    m_onAboutToRemoveChild.clear();
 }
 
 void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
@@ -309,6 +325,7 @@ void ModelMapper::onBeginRemoveRows(const QModelIndex &parent, int first, int /*
         if (nestling == 0) {
 
             callOnChildrenChange(0);
+            callOnAboutToRemoveChild(oldChild);
 
             // inform siblings about the change
 //            if(SessionItem *parent = oldChild->parent()) {
diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h
index 6ff7158f7ff6bc40a2f87eb9244e3d5c9750ed4e..94a274d5aebdc611cce3328330ed3b4378d50105 100644
--- a/GUI/coregui/Models/ModelMapper.h
+++ b/GUI/coregui/Models/ModelMapper.h
@@ -51,6 +51,8 @@ public:
 
     void setOnItemDestroy(std::function<void(SessionItem*)> f, const void *caller=0);
 
+    void setOnAboutToRemoveChild(std::function<void(SessionItem*)> f, const void *caller=0);
+
     void unsubscribe(const void *caller);
 
     void callOnItemDestroy();
@@ -89,6 +91,7 @@ private:
     void callOnChildrenChange(SessionItem *item);
     void callOnSiblingsChange();
     void callOnAnyChildChange(SessionItem *item);
+    void callOnAboutToRemoveChild(SessionItem *item);
 
     void clearMapper();
 
@@ -109,6 +112,7 @@ private:
     std::vector<call_t> m_onSiblingsChange;
     std::vector<call_item_t> m_onAnyChildChange;
     std::vector<call_item_t> m_onItemDestroy;
+    std::vector<call_item_t> m_onAboutToRemoveChild;
     QModelIndex m_aboutToDelete;
 };
 
diff --git a/Tests/UnitTests/GUI/TestMapperForItem.h b/Tests/UnitTests/GUI/TestMapperForItem.h
index 4d2ad7cea8c1828ec95bd22501d66bbc8aa828ab..271e728f125772d5745f3cfc72575a460a2559aa 100644
--- a/Tests/UnitTests/GUI/TestMapperForItem.h
+++ b/Tests/UnitTests/GUI/TestMapperForItem.h
@@ -16,6 +16,7 @@ public:
         , m_onParentChangeCount(0)
         , m_onChildrenChangeCount(0)
         , m_onSiblingsChangeCount(0)
+        , m_onAboutToRemoveChild(0)
     { }
 
     void clear()
@@ -25,6 +26,7 @@ public:
         m_onParentChangeCount = 0;
         m_onChildrenChangeCount = 0;
         m_onSiblingsChangeCount = 0;
+        m_onAboutToRemoveChild = 0;
         m_reported_items.clear();
         m_reported_names.clear();
     }
@@ -65,6 +67,13 @@ public:
             onSiblingsChange();
         }, caller);
 
+
+        mapper->setOnAboutToRemoveChild(
+                    [this](SessionItem* item)
+        {
+            onAboutToRemoveChild(item);
+        }, caller);
+
     }
 
     void onPropertyChange(const QString &name)
@@ -100,11 +109,18 @@ public:
         mapper->unsubscribe(this);
     }
 
+    void onAboutToRemoveChild(SessionItem *item)
+    {
+        m_reported_items.append(item);
+        m_onAboutToRemoveChild++;
+    }
+
     int m_onPropertyChangeCount;
     int m_onChildPropertyChangeCount;
     int m_onParentChangeCount;
     int m_onChildrenChangeCount;
     int m_onSiblingsChangeCount;
+    int m_onAboutToRemoveChild;
     QList<SessionItem *> m_reported_items;
     QStringList m_reported_names;
 };
@@ -141,6 +157,7 @@ private slots:
     void test_onSiblingsChange();
     void test_Subscription();
     void test_TwoWidgetsSubscription();
+    void test_AboutToRemoveChild();
 };
 
 inline void TestMapperForItem::test_initialCondition()
@@ -338,3 +355,22 @@ inline void TestMapperForItem::test_TwoWidgetsSubscription()
     QCOMPARE(w2.m_onPropertyChangeCount, 2);
 
 }
+
+inline void TestMapperForItem::test_AboutToRemoveChild()
+{
+    Widget w;
+    SampleModel model;
+    SessionItem *container = model.insertNewItem(Constants::ProjectionContainerType);
+
+    SessionItem *line = model.insertNewItem(Constants::HorizontalLineMaskType, container->index());
+
+    setItem(container, &w);
+    QCOMPARE(w.m_onAboutToRemoveChild, 0);
+    QCOMPARE(w.m_reported_items.size(), 0);
+
+    line->parent()->takeRow(line->parent()->rowOfChild(line));
+    QCOMPARE(w.m_onAboutToRemoveChild, 1);
+    QCOMPARE(w.m_reported_items.size(), 1);
+    QCOMPARE(w.m_reported_items.back(), line);
+
+}