diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp
index debd8341432301e993a76caaf2500a9843102d13..0ff4a817c36f406ae2fb31b0999ba84ebd3da9b2 100644
--- a/GUI/coregui/Models/ApplicationModels.cpp
+++ b/GUI/coregui/Models/ApplicationModels.cpp
@@ -44,6 +44,11 @@ ApplicationModels::~ApplicationModels()
     delete m_materialSvc;
 }
 
+DocumentModel *ApplicationModels::documentModel()
+{
+    return m_documentModel;
+}
+
 MaterialModel *ApplicationModels::materialModel()
 {
     return m_materialModel;
@@ -123,12 +128,14 @@ void ApplicationModels::createDocumentModel()
 {
     delete m_documentModel;
     m_documentModel = new DocumentModel(this);
+    connectModel(m_documentModel);
 }
 
 void ApplicationModels::createMaterialModel()
 {
     delete m_materialModel;
     m_materialModel = new MaterialModel(this);
+    connectModel(m_materialModel);
     m_materialSvc = new MaterialSvc(m_materialModel);
 }
 
@@ -137,6 +144,7 @@ void ApplicationModels::createSampleModel()
     Q_ASSERT(m_materialModel);
     delete m_sampleModel;
     m_sampleModel = new SampleModel(this);
+    connectModel(m_sampleModel);
     connect(m_materialModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
             m_sampleModel, SLOT(onMaterialModelChanged(QModelIndex,QModelIndex)));
 }
@@ -145,12 +153,14 @@ void ApplicationModels::createJobModel()
 {
     delete m_jobModel;
     m_jobModel = new JobModel(this);
+    connectModel(m_jobModel);
 }
 
 void ApplicationModels::createInstrumentModel()
 {
     delete m_instrumentModel;
     m_instrumentModel = new InstrumentModel(this);
+    connectModel(m_instrumentModel);
     m_instrumentModel->setIconProvider(new IconProvider());
 }
 
@@ -158,6 +168,7 @@ void ApplicationModels::createFitModel()
 {
     delete m_fitModel;
     m_fitModel = new FitModel(m_sampleModel, m_instrumentModel, this);
+    connectModel(m_fitModel);
 }
 
 void ApplicationModels::testGUIObjectBuilder()
@@ -172,3 +183,28 @@ void ApplicationModels::testGUIObjectBuilder()
 //    const std::unique_ptr<GISASSimulation> simulation(simRegistry.createSimulation("RectDetectorPerpToReflectedBeamDpos"));
 //    guiBuilder.populateInstrumentModel(m_instrumentModel, *simulation);
 }
+
+void ApplicationModels::disconnectModel(SessionModel *model)
+{
+    if(model) {
+        disconnect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
+                   SIGNAL(modelChanged()));
+        disconnect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
+                   SIGNAL(modelChanged()));
+        disconnect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this,
+                   SIGNAL(modelChanged()));
+    }
+}
+
+void ApplicationModels::connectModel(SessionModel *model)
+{
+    if(model) {
+        connect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
+                   SIGNAL(modelChanged()), Qt::UniqueConnection);
+        connect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
+                   SIGNAL(modelChanged()), Qt::UniqueConnection);
+        connect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this,
+                   SIGNAL(modelChanged()), Qt::UniqueConnection);
+    }
+}
+
diff --git a/GUI/coregui/Models/ApplicationModels.h b/GUI/coregui/Models/ApplicationModels.h
index 1b59ffe30816ee69fe5a80c8b287631fa5c0ff5c..c10c2b8590af0793e12bcff954f4c0700dd5a6f7 100644
--- a/GUI/coregui/Models/ApplicationModels.h
+++ b/GUI/coregui/Models/ApplicationModels.h
@@ -20,6 +20,7 @@
 #include "WinDllMacros.h"
 #include <QObject>
 
+class SessionModel;
 class DocumentModel;
 class MaterialModel;
 class MaterialSvc;
@@ -35,6 +36,7 @@ public:
     ApplicationModels(QObject *parent);
     ~ApplicationModels();
 
+    DocumentModel *documentModel();
     MaterialModel *materialModel();
     InstrumentModel *instrumentModel();
     SampleModel *sampleModel();
@@ -43,6 +45,9 @@ public:
 
     void resetModels();
 
+signals:
+    void modelChanged();
+
 private:
     void createModels();
     void createDocumentModel();
@@ -53,6 +58,9 @@ private:
     void createFitModel();
     void testGUIObjectBuilder();
 
+    void disconnectModel(SessionModel *model);
+    void connectModel(SessionModel *model);
+
     DocumentModel *m_documentModel;
     MaterialModel *m_materialModel;
     MaterialSvc *m_materialSvc;
diff --git a/GUI/coregui/Models/SimulationOptionsItem.cpp b/GUI/coregui/Models/SimulationOptionsItem.cpp
index 8ec488701da21f243aa8bbc7f970ccbe812f322c..2d44b1eb30995b1883046696b1906fdccfe2dab0 100644
--- a/GUI/coregui/Models/SimulationOptionsItem.cpp
+++ b/GUI/coregui/Models/SimulationOptionsItem.cpp
@@ -45,8 +45,6 @@ SimulationOptionsItem::SimulationOptionsItem()
     addProperty(P_MC_POINTS, 100);
 }
 
-
-
 //! returns list with number of threads to select
 QStringList SimulationOptionsItem::getCPUUsageOptions()
 {
diff --git a/GUI/coregui/mainwindow/projectdocument.cpp b/GUI/coregui/mainwindow/projectdocument.cpp
index 88406c26dffddb58d836a59cb6cee28a8a257bce..32fd79cff155b375c73e8e285c54ed1634769482 100644
--- a/GUI/coregui/mainwindow/projectdocument.cpp
+++ b/GUI/coregui/mainwindow/projectdocument.cpp
@@ -15,6 +15,7 @@
 // ************************************************************************** //
 
 #include "projectdocument.h"
+#include "ApplicationModels.h"
 #include "MaterialModel.h"
 #include "InstrumentModel.h"
 #include "JobQueueData.h"
@@ -45,14 +46,14 @@ const QString XML_FORMAT_ERROR = "XML_FORMAT_ERROR";
 }
 
 ProjectDocument::ProjectDocument()
-    : m_materialModel(0), m_instrumentModel(0), m_sampleModel(0), m_jobModel(0), m_fitModel(0)
+    : m_applicationModels(0)
     , m_modified(false), m_documentStatus(STATUS_OK), m_messageService(0)
 {
     setObjectName("ProjectDocument");
 }
 
 ProjectDocument::ProjectDocument(const QString &projectFileName)
-    : m_materialModel(0), m_instrumentModel(0), m_sampleModel(0), m_jobModel(0)
+    : m_applicationModels(0)
     , m_modified(false), m_documentStatus(STATUS_OK), m_messageService(0)
 {
     setObjectName("ProjectDocument");
@@ -98,48 +99,12 @@ QString ProjectDocument::getProjectFileExtension()
     return QString(".pro");
 }
 
-void ProjectDocument::setMaterialModel(MaterialModel *materialModel)
+void ProjectDocument::setApplicationModels(ApplicationModels *applicationModels)
 {
-    if (materialModel != m_materialModel) {
-        disconnectModel(m_materialModel);
-        m_materialModel = materialModel;
-        connectModel(m_materialModel);
-    }
-}
-
-void ProjectDocument::setInstrumentModel(InstrumentModel *instrumentModel)
-{
-    if (instrumentModel != m_instrumentModel) {
-        disconnectModel(m_instrumentModel);
-        m_instrumentModel = instrumentModel;
-        connectModel(m_instrumentModel);
-    }
-}
-
-void ProjectDocument::setSampleModel(SampleModel *sampleModel)
-{
-    if (sampleModel != m_sampleModel) {
-        disconnectModel(m_sampleModel);
-        m_sampleModel = sampleModel;
-        connectModel(m_sampleModel);
-    }
-}
-
-void ProjectDocument::setJobModel(JobModel *jobModel)
-{
-    if (jobModel != m_jobModel) {
-        disconnectModel(m_jobModel);
-        m_jobModel = jobModel;
-        connectModel(m_jobModel);
-    }
-}
-
-void ProjectDocument::setFitModel(FitModel *fitModel)
-{
-    if (fitModel != m_fitModel) {
-        disconnectModel(m_fitModel);
-        m_fitModel = fitModel;
-        connectModel(m_fitModel);
+    if (applicationModels != m_applicationModels) {
+        disconnectModels();
+        m_applicationModels = applicationModels;
+        connectModels();
     }
 }
 
@@ -238,19 +203,7 @@ QString ProjectDocument::getDocumentVersion() const
     return result;
 }
 
-void ProjectDocument::onDataChanged(const QModelIndex &, const QModelIndex &)
-{
-    m_modified = true;
-    emit modified();
-}
-
-void ProjectDocument::onJobModelChanged(const QString &)
-{
-    m_modified = true;
-    emit modified();
-}
-
-void ProjectDocument::onRowsChanged(const QModelIndex &, int , int )
+void ProjectDocument::onModelChanged()
 {
     m_modified = true;
     emit modified();
@@ -258,11 +211,7 @@ void ProjectDocument::onRowsChanged(const QModelIndex &, int , int )
 
 void ProjectDocument::readFrom(QIODevice *device)
 {
-    disconnectModel(m_materialModel);
-    disconnectModel(m_instrumentModel);
-    disconnectModel(m_sampleModel);
-    disconnectModel(m_jobModel);
-    //disconnectModel(m_fitModel);
+    disconnectModels();
 
     QXmlStreamReader reader(device);
 
@@ -276,16 +225,17 @@ void ProjectDocument::readFrom(QIODevice *device)
             } else if (reader.name() == ProjectDocumentXML::InfoTag) {
                 //
             } else if (reader.name() == SessionXML::MaterialModelTag) {
-                readModel(m_materialModel, &reader);
+                readModel(m_applicationModels->materialModel(), &reader);
 
             } else if (reader.name() == SessionXML::InstrumentModelTag) {
-                readModel(m_instrumentModel, &reader);
+                readModel(m_applicationModels->instrumentModel(), &reader);
 
             } else if (reader.name() == SessionXML::SampleModelTag) {
-                readModel(m_sampleModel, &reader);
+                readModel(m_applicationModels->sampleModel(), &reader);
 
             } else if (reader.name() == SessionXML::JobModelTag) {
-                readModel(m_jobModel, &reader);
+                readModel(m_applicationModels->jobModel(), &reader);
+
             } /*else if (reader.name() == SessionXML::FitModelTag) {
                 readModel(m_fitModel, &reader);
             }*/
@@ -298,12 +248,9 @@ void ProjectDocument::readFrom(QIODevice *device)
         return;
     }
 
-    connectModel(m_materialModel);
-    connectModel(m_instrumentModel);
-    connectModel(m_sampleModel);
-    connectModel(m_jobModel);
-    m_jobModel->modelLoaded();
-    //connectModel(m_fitModel);
+    m_applicationModels->jobModel()->modelLoaded();
+
+    connectModels();
 }
 
 void ProjectDocument::writeTo(QIODevice *device)
@@ -319,11 +266,10 @@ void ProjectDocument::writeTo(QIODevice *device)
     writer.writeAttribute(ProjectDocumentXML::InfoNameAttribute, getProjectName());
     writer.writeEndElement(); // InfoTag
 
-    m_materialModel->writeTo(&writer);
-    m_instrumentModel->writeTo(&writer);
-    m_sampleModel->writeTo(&writer);
-    m_jobModel->writeTo(&writer);
-    //m_fitModel->writeTo(&writer);
+    m_applicationModels->materialModel()->writeTo(&writer);
+    m_applicationModels->instrumentModel()->writeTo(&writer);
+    m_applicationModels->sampleModel()->writeTo(&writer);
+    m_applicationModels->jobModel()->writeTo(&writer);
 
     writer.writeEndElement(); // BornAgain tag
     writer.writeEndDocument();
@@ -345,8 +291,11 @@ void ProjectDocument::readModel(SessionModel *model, QXmlStreamReader *reader)
 //! *.int files in project directory by removing them.
 void ProjectDocument::reviseOutputData()
 {
-    for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) {
-        JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex()));
+    JobModel *jobModel = m_applicationModels->jobModel();
+    Q_ASSERT(jobModel);
+
+    for (int i = 0; i < jobModel->rowCount(QModelIndex()); ++i) {
+        JobItem *jobItem = jobModel->getJobItemForIndex(jobModel->index(i, 0, QModelIndex()));
         IntensityDataItem *dataItem = jobItem->getIntensityDataItem();
         if (dataItem) {
             // handling case when user has renamed jobItem and we have to clean previous
@@ -366,9 +315,11 @@ void ProjectDocument::reviseOutputData()
 //! saves OutputData into project directory
 void ProjectDocument::saveOutputData()
 {
-    Q_ASSERT(m_jobModel);
-    for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) {
-        JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex()));
+    JobModel *jobModel = m_applicationModels->jobModel();
+    Q_ASSERT(jobModel);
+
+    for (int i = 0; i < jobModel->rowCount(QModelIndex()); ++i) {
+        JobItem *jobItem = jobModel->getJobItemForIndex(jobModel->index(i, 0, QModelIndex()));
         JobResultsPresenter::saveIntensityData(jobItem, getProjectDir());
     }
 }
@@ -376,33 +327,27 @@ void ProjectDocument::saveOutputData()
 //! load OutputData from project directory
 void ProjectDocument::loadOutputData()
 {
-    for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) {
-        JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex()));
+    JobModel *jobModel = m_applicationModels->jobModel();
+    Q_ASSERT(jobModel);
+
+    for (int i = 0; i < jobModel->rowCount(QModelIndex()); ++i) {
+        JobItem *jobItem = jobModel->getJobItemForIndex(jobModel->index(i, 0, QModelIndex()));
         JobResultsPresenter::loadIntensityData(jobItem, getProjectDir());
     }
 }
 
-void ProjectDocument::disconnectModel(SessionModel *model)
+void ProjectDocument::disconnectModels()
 {
-    if(model) {
-        disconnect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
-                   SLOT(onDataChanged(QModelIndex, QModelIndex)));
-        disconnect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
-                   SLOT(onRowsChanged(QModelIndex, int, int)));
-        disconnect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this,
-                   SLOT(onRowsChanged(QModelIndex, int,int)));
+    if(m_applicationModels) {
+        disconnect(m_applicationModels, SIGNAL(modelChanged()), this,
+                   SLOT(onModelChanged()));
     }
 }
 
-void ProjectDocument::connectModel(SessionModel *model)
+void ProjectDocument::connectModels()
 {
-    if(model) {
-        connect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
-                   SLOT(onDataChanged(QModelIndex, QModelIndex)));
-        connect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
-                   SLOT(onRowsChanged(QModelIndex, int, int)));
-        connect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this,
-                   SLOT(onRowsChanged(QModelIndex, int,int)));
+    if(m_applicationModels) {
+        connect(m_applicationModels, SIGNAL(modelChanged()), this,
+                   SLOT(onModelChanged()), Qt::UniqueConnection);
     }
 }
-
diff --git a/GUI/coregui/mainwindow/projectdocument.h b/GUI/coregui/mainwindow/projectdocument.h
index 84866a31fd4a6f3b27ab886414d4fd9c68be2492..76ed266a32feaf97dce227bee3c0df558e30a9ef 100644
--- a/GUI/coregui/mainwindow/projectdocument.h
+++ b/GUI/coregui/mainwindow/projectdocument.h
@@ -23,13 +23,8 @@
 
 class QIODevice;
 class QModelIndex;
-class JobItem;
+class ApplicationModels;
 class SessionModel;
-class InstrumentModel;
-class MaterialModel;
-class SampleModel;
-class JobModel;
-class FitModel;
 class QXmlStreamReader;
 class WarningMessageService;
 
@@ -74,11 +69,7 @@ public:
 
     static QString getProjectFileExtension();
 
-    void setMaterialModel(MaterialModel *materialModel);
-    void setInstrumentModel(InstrumentModel *instrumentModel);
-    void setSampleModel(SampleModel *sampleModel);
-    void setJobModel(JobModel *jobModel);
-    void setFitModel(FitModel *fitModel);
+    void setApplicationModels(ApplicationModels *applicationModels);
 
     bool save();
     bool load(const QString &project_file_name);
@@ -103,9 +94,7 @@ signals:
     void modified();
 
 public slots:
-    void onDataChanged(const QModelIndex &, const QModelIndex &);
-    void onJobModelChanged(const QString &);
-    void onRowsChanged(const QModelIndex &parent, int, int);
+    void onModelChanged();
 
 private:
     void readFrom(QIODevice *device);
@@ -116,16 +105,12 @@ private:
     void saveOutputData();
     void loadOutputData();
 
-    void disconnectModel(SessionModel *model);
-    void connectModel(SessionModel *model);
+    void disconnectModels();
+    void connectModels();
 
     QString m_project_dir;
     QString m_project_name;
-    MaterialModel *m_materialModel;
-    InstrumentModel *m_instrumentModel;
-    SampleModel *m_sampleModel;
-    JobModel *m_jobModel;
-    FitModel *m_fitModel;
+    ApplicationModels *m_applicationModels;
     bool m_modified;
     EDocumentStatus m_documentStatus;
     WarningMessageService *m_messageService;
diff --git a/GUI/coregui/mainwindow/projectmanager.cpp b/GUI/coregui/mainwindow/projectmanager.cpp
index 4f0c43aa9ba56ab07912cc7036b7ea9c2b004013..9397f3ae52656419c4ba577b4398e5580775d232 100644
--- a/GUI/coregui/mainwindow/projectmanager.cpp
+++ b/GUI/coregui/mainwindow/projectmanager.cpp
@@ -95,11 +95,7 @@ void ProjectManager::createNewProject()
     m_project_document = new ProjectDocument();
     connect(m_project_document, SIGNAL(modified()), this, SLOT(onDocumentModified()));
     m_project_document->setProjectName("Untitled");
-    m_project_document->setMaterialModel(m_mainWindow->getMaterialModel());
-    m_project_document->setInstrumentModel(m_mainWindow->instrumentModel());
-    m_project_document->setSampleModel(m_mainWindow->sampleModel());
-    m_project_document->setJobModel(m_mainWindow->jobModel());
-    m_project_document->setFitModel(m_mainWindow->getFitModel());
+    m_project_document->setApplicationModels(m_mainWindow->models());
     m_project_document->setMessageService(m_messageService);
 }