diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 9b206119250681af301009be7fe5b7e20930471f..966ef3179a43fe8785ff3bda7d1501ffd1428076 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -42,7 +42,7 @@ MainWindow::MainWindow(QWidget *parent):
     ui->setupUi(this);
     setWindowTitle(QString("%1 %2").arg(SOFTWARE_NAME).arg(XTPCPP_VERSION));
 
-    WorkerThread *worker = new WorkerThread;
+    WorkerThread *worker = new WorkerThread(this);
     worker->moveToThread(&workerThread);
     /*
     */
@@ -75,23 +75,9 @@ MainWindow::MainWindow(QWidget *parent):
 #else
 // Qt4 code
 
-    connect(this, SIGNAL(operateXpipFile(QString)), worker,SLOT(doXpipFileLoad(QString)));
-    connect(worker, SIGNAL(projectReady(ProjectSp)), this,SLOT(doProjectReady(ProjectSp)));
-    connect(this, SIGNAL(operateLoadingResults(bool,AutomaticFilterParameters,QStringList)), worker,SLOT(doLoadingResults(bool,AutomaticFilterParameters,QStringList)));
     connect(_p_load_results_dialog, SIGNAL(accepted()), this,SLOT(doAcceptedLoadResultDialog()));
     connect(_p_export_spreadsheet_dialog, SIGNAL(accepted()), this,SLOT(doAcceptedExportSpreadsheetDialog()));
-    connect(worker, SIGNAL(loadingMessage(QString)), this,SLOT(doDisplayLoadingMessage(QString)));
-    connect(worker, SIGNAL(projectNotReady(QString)), this,SLOT(doProjectNotReady(QString)));
-
-    //grouping
-    connect(this, SIGNAL(operateGrouping(ProjectSp)), worker,SLOT(doGrouping(ProjectSp)));
-    connect(worker, SIGNAL(groupingFinished()), this,SLOT(doGroupingFinished()));
-    //masschroq write
-    connect(this, SIGNAL(operateWritingMassChroqFile(QString, ProjectSp)), worker,SLOT(doWritingMassChroqFile(QString, ProjectSp)));
-    //writing ODS file :
-    connect(this, SIGNAL(operateWritingOdsFile(QString, ProjectSp)), worker,SLOT(doWritingOdsFile(QString, ProjectSp)));
-    connect(worker, SIGNAL(operationFailed(QString)), this,SLOT(doOperationFailed(QString)));
-    connect(worker, SIGNAL(operationFinished()), this,SLOT(doOperationFinished()));
+
     /*
         connect(&workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
         connect(this, SIGNAL(operateMsDataFile(QString)), worker,SLOT(doMsDataFileLoad(QString)));
diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp
index a00a2710ad63d7ab156f7f43842c1b04d945e4ef..363adb74c152e5e19b099ce6dc8ea9c5a4c8d578 100644
--- a/src/gui/project_view/projectwindow.cpp
+++ b/src/gui/project_view/projectwindow.cpp
@@ -33,6 +33,7 @@
 #include <QMessageBox>
 #include <pappsomspp/pappsoexception.h>
 #include <numeric>
+#include "../workerthread.h"
 
 
 
@@ -41,6 +42,7 @@ ProjectWindow::ProjectWindow(MainWindow *parent):
     ui(new Ui::ProjectView)
 {
     main_window = parent;
+
     ui->setupUi(this);
 
     _p_fasta_str_li = new QStandardItemModel();
@@ -53,6 +55,7 @@ ProjectWindow::ProjectWindow(MainWindow *parent):
 
     _p_edit_modifications = new EditModifications(this);
     _p_edit_label_methods = new EditLabelMethods(this);
+    _p_waiting_message_dialog = new WaitingMessageDialog(this);
 
 #if QT_VERSION >= 0x050000
     // Qt5 code
@@ -71,6 +74,10 @@ ProjectWindow::ProjectWindow(MainWindow *parent):
     */
 
     this->setDisabled(true);
+    
+    
+    WorkerThread * p_worker = new WorkerThread(this);
+    p_worker->moveToThread(&worker_thread);
 
 }
 
@@ -218,51 +225,50 @@ void ProjectWindow::refresh() {
 }
 void ProjectWindow::doAutomaticFilterParametersChanged(AutomaticFilterParameters parameters) {
     qDebug() << "ProjectWindow::doAutomaticFilterParametersChanged begin ";
+    showWaitingMessage(tr("Updating filters"));
+
     _project_sp.get()->getProteinStore().setRegexpContaminantPattern(ui->contaminant_protein_regexp_line_edit->text());
     _project_sp.get()->updateAutomaticFilters(parameters);
 
-    //re group
-    for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) {
-        doIdentificationGroupEdited(identification_group);
-    }
-
-    refresh();
+    qDebug() << "ProjectWindow::doAutomaticFilterParametersChanged emit operateGrouping(_project_sp) ";
+    emit operateGrouping(_project_sp);
     qDebug() << "ProjectWindow::doAutomaticFilterParametersChanged end ";
 }
 
+void ProjectWindow::doOperationFailed(QString error) {
+    hideWaitingMessage();
+    viewError(error);
+}
+void ProjectWindow::doOperationFinished() {
+    hideWaitingMessage();
+}
 
-void ProjectWindow::doMassPrecisionUnitChanged(QString combo_value) {
-    qDebug() << "ProjectWindow::doMassPrecisionUnitChanged begin "<< combo_value;
-
-    refresh();
-    qDebug() << "ProjectWindow::doMassPrecisionUnitChanged end ";
+void ProjectWindow::doDisplayLoadingMessage(QString message) {
+    qDebug() << "ProjectWindow::doDisplayLoadingMessage " <<  message;
+    _p_waiting_message_dialog->message(message);
 }
-void ProjectWindow::doIdentificationGroupEdited(IdentificationGroup * p_ident_group) {
-    qDebug() << "ProjectWindow::doIdentificationGroupEdited begin " << p_ident_group;
-    if (p_ident_group == nullptr) {
-        qDebug() << "ProjectWindow::doIdentificationGroupEdited p_ident_group == nullptr";
-    }
-    else {
-        try {
-            p_ident_group->startGrouping(_project_sp.get()->getGroupingType());
 
-        }
-        catch (pappso::PappsoException exception_pappso) {
-            QMessageBox::warning(this,
-                                 tr("Error grouping project :"), exception_pappso.qwhat());
-        }
-        catch (std::exception exception_std) {
-            QMessageBox::warning(this,
-                                 tr("Error grouping project :"), exception_std.what());
-        }
+void ProjectWindow::doGroupingFinished() {
+    qDebug() << "ProjectWindow::doGroupingFinished begin " ;
+    hideWaitingMessage();
 
+    //re group
+    for (IdentificationGroup * p_ident_group : _project_sp.get()->getIdentificationGroupList()) {
         refreshGroup(p_ident_group);
     }
 
     refresh();
-    qDebug() << "ProjectWindow::doIdentificationGroupEdited end";
+
+    qDebug() << "ProjectWindow::doGroupingFinished end";
 }
 
+
+void ProjectWindow::doMassPrecisionUnitChanged(QString combo_value) {
+    qDebug() << "ProjectWindow::doMassPrecisionUnitChanged begin "<< combo_value;
+
+    refresh();
+    qDebug() << "ProjectWindow::doMassPrecisionUnitChanged end ";
+}
 void ProjectWindow::doViewPeptideList(IdentificationGroup * p_ident_group, ProteinMatch * protein_match) {
 
 
@@ -350,12 +356,12 @@ void ProjectWindow::doViewProteinList(IdentificationGroup* p_identification_grou
 
 void ProjectWindow::setProjectSp(ProjectSp project_sp) {
     qDebug() << "ProjectWindow::setProjectSp begin" ;
-    
+
     _project_sp = project_sp;
 
     qDebug() << "ProjectWindow::setProjectSp begin " << _project_sp.get()->getFastaFileStore().getFastaFileList().size() ;
     _fastafile_list = _project_sp.get()->getFastaFileStore().getFastaFileList();
-    
+
     _p_fasta_str_li->removeRows(0, _p_fasta_str_li->rowCount());
     for (FastaFileSp fasta_file : _fastafile_list ) {
 
@@ -365,8 +371,8 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) {
         _p_fasta_str_li->appendRow(item);
         item->setData(QVariant(QString("%1").arg(fasta_file.get()->getFilename())),Qt::UserRole);
     }
-    
-    
+
+
     for (auto && p_window :_peptide_list_window_collection) {
         delete p_window;
     }
@@ -425,7 +431,7 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) {
 
     ui->decoy_protein_regexp_line_edit->setText(_project_sp.get()->getProteinStore().getRegexpDecoy().pattern());
     ui->contaminant_protein_regexp_line_edit->setText(_project_sp.get()->getProteinStore().getRegexpContaminant().pattern());
-    
+
     refresh();
     this->setEnabled(true);
 }
@@ -446,3 +452,24 @@ void ProjectWindow::editLabelingMethods() {
     _p_edit_label_methods->activateWindow();
 
 }
+
+void ProjectWindow::hideWaitingMessage() {
+
+    _p_waiting_message_dialog->hide();
+}
+
+void ProjectWindow::showWaitingMessage(const QString title) {
+    _p_waiting_message_dialog->setWindowTitle(title);
+    _p_waiting_message_dialog->show();
+    _p_waiting_message_dialog->raise();
+    _p_waiting_message_dialog->activateWindow();
+
+}
+
+void ProjectWindow::doIdentificationGroupEdited(IdentificationGroup* p_identification_group) {
+}
+
+void ProjectWindow::viewError(QString error) {
+    QMessageBox::warning(this,
+                         tr("Oops! an error occurred in XTPCPP. Dont Panic :"), error);
+}
diff --git a/src/gui/project_view/projectwindow.h b/src/gui/project_view/projectwindow.h
index daae90f48023610da4ebe699b5285649e8d96d8f..b406fb3e4237239d4273d19461e45d50082e64aa 100644
--- a/src/gui/project_view/projectwindow.h
+++ b/src/gui/project_view/projectwindow.h
@@ -25,6 +25,7 @@
 #define PROJECTWINDOW_H
 
 #include <QMainWindow>
+#include <QThread>
 #include <set>
 #include "../../core/project.h"
 #include "../edit_label_methods/editlabelmethods.h"
@@ -34,6 +35,7 @@
 #include "../protein_view/proteinwindow.h"
 #include "../peptide_detail_view/peptidewindow.h"
 #include "gui/project_view/automatic_filter_widget/automaticfilterwidget.h"
+#include "../waiting_message_dialog/waitingmessagedialog.h"
 
 class MainWindow;
 
@@ -44,6 +46,7 @@ class ProjectView;
 
 class ProjectWindow: public QMainWindow {
     Q_OBJECT
+    QThread worker_thread;
 
     friend class ProteinListWindow;
     friend class PeptideListWindow;
@@ -62,18 +65,23 @@ public slots:
     void doAutomaticFilterParametersChanged(AutomaticFilterParameters parameters);
     void doFdrChanged();
     void doMassPrecisionUnitChanged(QString combo_value);
+    void doOperationFailed(QString);
+    void doOperationFinished();
+    void doGroupingFinished();
+    void doDisplayLoadingMessage(QString message);
     // void setColor(const QColor &color);
     // void setShape(Shape shape);
 signals:
     void identificationGroupGrouped(IdentificationGroup * p_identification_group);
     void peptideMatchSelected(PeptideMatch * peptide_match);
+    void operateGrouping(ProjectSp project_sp);
     //void peptideChanged(pappso::PeptideSp peptide);
     
 protected :
     void doViewPeptideList(IdentificationGroup * p_ident_group, ProteinMatch * protein_match);
     void doViewPeptideDetail(PeptideMatch * peptide_match);
     void doViewProteinDetail(ProteinMatch * protein_match);
-    void doIdentificationGroupEdited(IdentificationGroup * p_identification_group);
+    void doIdentificationGroupEdited(IdentificationGroup* p_identification_group);
     void computeFdr();
     void computeMassPrecision();
 
@@ -84,6 +92,10 @@ private :
     void connectNewPeptideDetailWindow();
     void refreshGroup(IdentificationGroup * p_ident_group);
     void refresh();
+    void showWaitingMessage(const QString title);
+    void hideWaitingMessage();
+    void viewError(QString error);
+
     
 private:
     Ui::ProjectView *ui;
@@ -106,6 +118,7 @@ private:
     
     QStandardItemModel * _p_fasta_str_li;
     std::vector<FastaFileSp> _fastafile_list;
+    WaitingMessageDialog * _p_waiting_message_dialog;
 
 
 };
diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp
index ec64fb940957a6709d2a465e4423c3654b97c634..6610a2813110df2ad4bbdd34f1ee1df786435fe5 100644
--- a/src/gui/workerthread.cpp
+++ b/src/gui/workerthread.cpp
@@ -30,10 +30,73 @@
 #include "workerthread.h"
 #include <odsstream/odsdocwriter.h>
 #include <pappsomspp/pappsoexception.h>
+#include <QDebug>
 #include "../output/masschroqml.h"
 #include "../output/ods/odsexport.h"
 #include "files/xpipfile.h"
 
+WorkerThread::WorkerThread(MainWindow * p_main_window)
+{
+    qDebug() << "WorkerThread::WorkerThread begin MainWindow";
+#if QT_VERSION >= 0x050000
+    // Qt5 code
+    /*
+    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
+    connect(this, &PtSpectrumViewer::operateMsDataFile, worker, &PwizLoaderThread::doMsDataFileLoad);
+    connect(worker, &PwizLoaderThread::msDataReady, this, &PtSpectrumViewer::handleMsDataFile);
+    */
+#else
+// Qt4 code
+
+    connect(p_main_window, SIGNAL(operateXpipFile(QString)), this,SLOT(doXpipFileLoad(QString)));
+    connect(this, SIGNAL(projectReady(ProjectSp)), p_main_window,SLOT(doProjectReady(ProjectSp)));
+    connect(p_main_window, SIGNAL(operateLoadingResults(bool,AutomaticFilterParameters,QStringList)), this,SLOT(doLoadingResults(bool,AutomaticFilterParameters,QStringList)));
+    connect(this, SIGNAL(loadingMessage(QString)), p_main_window,SLOT(doDisplayLoadingMessage(QString)));
+    connect(this, SIGNAL(projectNotReady(QString)), p_main_window,SLOT(doProjectNotReady(QString)));
+
+    //grouping
+    connect(p_main_window, SIGNAL(operateGrouping(ProjectSp)), this,SLOT(doGrouping(ProjectSp)));
+    connect(this, SIGNAL(groupingFinished()), p_main_window,SLOT(doGroupingFinished()));
+    //masschroq write
+    connect(p_main_window, SIGNAL(operateWritingMassChroqFile(QString, ProjectSp)), this,SLOT(doWritingMassChroqFile(QString, ProjectSp)));
+    //writing ODS file :
+    connect(p_main_window, SIGNAL(operateWritingOdsFile(QString, ProjectSp)), this,SLOT(doWritingOdsFile(QString, ProjectSp)));
+    connect(this, SIGNAL(operationFailed(QString)), p_main_window,SLOT(doOperationFailed(QString)));
+    connect(this, SIGNAL(operationFinished()), p_main_window,SLOT(doOperationFinished()));
+    /*
+        connect(&workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
+        connect(this, SIGNAL(operateMsDataFile(QString)), worker,SLOT(doMsDataFileLoad(QString)));
+        connect(worker, SIGNAL(msDataReady(pwiz::msdata::MSDataFile *)), this, SLOT(handleMsDataFile(pwiz::msdata::MSDataFile *)));
+        */
+#endif
+
+    qDebug() << "WorkerThread::WorkerThread end MainWindow";
+}
+
+WorkerThread::WorkerThread(ProjectWindow * p_project_window)
+{
+    qDebug() << "WorkerThread::WorkerThread begin ProjectWindow";
+#if QT_VERSION >= 0x050000
+    // Qt5 code
+#else
+// Qt4 code
+    qDebug() << "WorkerThread::WorkerThread Qt4 code";
+    connect(this, SIGNAL(loadingMessage(QString)), p_project_window,SLOT(doDisplayLoadingMessage(QString)));
+   //grouping
+    connect(p_project_window, SIGNAL(operateGrouping(ProjectSp)), this,SLOT(doGrouping(ProjectSp)));
+    connect(this, SIGNAL(groupingFinished()), p_project_window,SLOT(doGroupingFinished()));
+    connect(this, SIGNAL(operationFailed(QString)), p_project_window,SLOT(doOperationFailed(QString)));
+    connect(this, SIGNAL(operationFinished()), p_project_window,SLOT(doOperationFinished()));
+
+#endif
+qDebug() << "WorkerThread::WorkerThread end ProjectWindow";
+}
+
+WorkerThread::~WorkerThread()
+{
+    qDebug() << "WorkerThread::WorkerThread destructor";
+}
+
 void WorkerThread::doXpipFileLoad(QString filename) {
     qDebug() << "WorkerThread::doXpipFileLoad begin "<< filename;
     try {
@@ -58,7 +121,16 @@ void WorkerThread::doXpipFileLoad(QString filename) {
 void WorkerThread::doGrouping(ProjectSp project_sp) {
     try {
         emit loadingMessage(tr("grouping proteins"));
-        project_sp.get()->startGrouping();
+        try {
+            project_sp.get()->startGrouping();
+
+        }
+        catch (pappso::PappsoException exception_pappso) {
+            emit operationFailed(tr("Error grouping project : %1").arg(exception_pappso.qwhat()));
+        }
+        catch (std::exception exception_std) {
+            emit operationFailed(tr("Error grouping project : %1").arg(exception_std.what()));
+        }
         emit loadingMessage(tr("grouping proteins finished"));
         emit groupingFinished();
     }
@@ -95,7 +167,7 @@ void WorkerThread::doWritingMassChroqFile(QString filename, ProjectSp project_sp
         emit operationFailed(tr("Error while writing MassChroqML file :\n%1").arg(error.qwhat()));
     }
 }
-        
+
 void WorkerThread::doLoadingResults(bool is_individual, AutomaticFilterParameters param, QStringList file_list) {
 
     qDebug() << "WorkerThread::doLoadingResults begin ";
diff --git a/src/gui/workerthread.h b/src/gui/workerthread.h
index 87617697de98d05664e634e03e3dbd1ad031d2a3..946d7a99e1df9dec79b933c7935492d07c4da6cb 100644
--- a/src/gui/workerthread.h
+++ b/src/gui/workerthread.h
@@ -34,12 +34,18 @@
 #include <QCloseEvent>
 #include "../core/automaticfilterparameters.h"
 #include "../core/project.h"
+#include "mainwindow.h"
 
 class WorkerThread : public QObject
 {
     Q_OBJECT
+
 public:
 
+    WorkerThread(MainWindow * parent);
+    WorkerThread(ProjectWindow * parent);
+    ~WorkerThread();
+
 
 protected: