diff --git a/src/core/identification_sources/identificationdatasource.cpp b/src/core/identification_sources/identificationdatasource.cpp
index b8dcb46baadd0ac2bbaf3d290908bd7db33675dd..02b348175ba6019d686ccac8371553d6617eeaf7 100644
--- a/src/core/identification_sources/identificationdatasource.cpp
+++ b/src/core/identification_sources/identificationdatasource.cpp
@@ -24,6 +24,7 @@
 #include "identificationxtandemfile.h"
 #include <pappsomspp/pappsoexception.h>
 #include <QFileInfo>
+#include "../../utils/readspectrum.h"
 
 
 IdentificationDataSource::MapIdentificationDataSources IdentificationDataSource::_map_identification_data_sources = []
@@ -86,3 +87,9 @@ void IdentificationDataSource::setMsRunSp (pappso::MsRunIdSp ms_run_sp) {
 pappso::MsRunIdSp IdentificationDataSource::getMsRunSp () const {
     return (_ms_run_sp);
 }
+
+
+pappso::SpectrumSp IdentificationDataSource::getSpectrumSp(unsigned int scan_number) const {
+    pappso::SpectrumSp spectrum_sp = SpectrumStore::getSpectrumSpFromMsRunIdSp(_ms_run_sp, scan_number);
+    return spectrum_sp;
+}
diff --git a/src/core/identification_sources/identificationdatasource.h b/src/core/identification_sources/identificationdatasource.h
index 6b90eff21892fe0ecd54d5a509b8e4f558651fef..ebac8d5c8f3fdb118d2be621c8390c3edb0a8dde 100644
--- a/src/core/identification_sources/identificationdatasource.h
+++ b/src/core/identification_sources/identificationdatasource.h
@@ -46,7 +46,7 @@ public:
     pappso::MsRunIdSp getMsRunSp () const;
     /** @brief get the spectrum with scan number
      * */
-    virtual pappso::SpectrumSp getSpectrumSp(unsigned int scan_number) const = 0;
+    virtual pappso::SpectrumSp getSpectrumSp(unsigned int scan_number) const;
 
 protected :
     QString _resource_name;
diff --git a/src/core/identification_sources/identificationxtandemfile.cpp b/src/core/identification_sources/identificationxtandemfile.cpp
index 41b4d0e327cba3461785db085371c113ff87376b..ec3b44cb2c85996c9c1606bb7c0c1320f9c841af 100644
--- a/src/core/identification_sources/identificationxtandemfile.cpp
+++ b/src/core/identification_sources/identificationxtandemfile.cpp
@@ -41,6 +41,6 @@ bool IdentificationXtandemFile::operator==(const IdentificationXtandemFile& othe
 }
 
 pappso::SpectrumSp IdentificationXtandemFile::getSpectrumSp(unsigned int scan_number) const {
-    pappso::SpectrumSp spectrum_sp;
+    pappso::SpectrumSp spectrum_sp = IdentificationDataSource::getSpectrumSp(scan_number);
     return spectrum_sp;
 }
diff --git a/src/gui/peptide_detail_view/peptidewindow.cpp b/src/gui/peptide_detail_view/peptidewindow.cpp
index 9f68d3b542b4779832451e8cb9c5386aa5f2cce4..638bcdc3d8d3e315592a22dc41323765b9fe0adb 100644
--- a/src/gui/peptide_detail_view/peptidewindow.cpp
+++ b/src/gui/peptide_detail_view/peptidewindow.cpp
@@ -25,7 +25,9 @@
 #include "../project_view/projectwindow.h"
 #include "ui_peptide_detail_view.h"
 #include <pappsomspp/pappsoexception.h>
+#include <pappsomspp/spectrum/qualifiedspectrum.h>
 #include <QMessageBox>
+#include <QSettings>
 
 PeptideWindow::PeptideWindow(ProjectWindow *parent):
     QMainWindow(parent),
@@ -36,6 +38,15 @@ PeptideWindow::PeptideWindow(ProjectWindow *parent):
     /*
     */
 
+    QSettings settings;
+    QString unit = settings.value("peptideview/precision_unit", "dalton").toString();
+    pappso::mz precision = settings.value("peptideview/precision_value", "0.2").toDouble();
+
+    if (unit == "dalton") {
+        _p_precision = Precision::getDaltonInstance(precision);
+    } else {
+        _p_precision = Precision::getPpmInstance(precision);
+    }
 
 #if QT_VERSION >= 0x050000
     // Qt5 code
@@ -86,6 +97,13 @@ void PeptideWindow::updateDisplay() {
 void PeptideWindow::setPeptideMatch(PeptideMatch * p_peptide_match) {
     _p_peptide_match = p_peptide_match;
     
-    SpectrumSp spectrum = _p_peptide_match->getIdentificationDataSource()->getSpectrumSp(_p_peptide_match->getScan());
+    SpectrumSp spectrum = _p_peptide_match->getIdentificationDataSource()->getSpectrumSp(_p_peptide_match->getScan());  
+    pappso::QualifiedSpectrum spectrum_copy;
+    spectrum_copy.setOriginalSpectrumSp(spectrum);
+    ui->spectrumWidget->setQualifiedSpectrum(spectrum_copy);
+
+    pappso::PeptideSp peptide = p_peptide_match->getPeptideXtpSp();
+    ui->spectrumWidget->setPrecision(_p_precision);
+    ui->spectrumWidget->setPeptideSp(peptide);
     updateDisplay();
 }
diff --git a/src/gui/peptide_detail_view/peptidewindow.h b/src/gui/peptide_detail_view/peptidewindow.h
index 6253878af98796a3f8f78e34066d0aa92c2cf6aa..cddfc11ebc5054f6ee25d12362ded1322f96b4d6 100644
--- a/src/gui/peptide_detail_view/peptidewindow.h
+++ b/src/gui/peptide_detail_view/peptidewindow.h
@@ -25,6 +25,7 @@
 
 #include <QMainWindow>
 #include <QTextDocument>
+#include <pappsomspp/mass_range.h>
 #include "../../core/peptidematch.h"
 #include "../../core/identificationgroup.h"
 
@@ -53,6 +54,7 @@ private:
     Ui::PeptideDetailView *ui;
     ProjectWindow * _p_project_window;
     PeptideMatch * _p_peptide_match = nullptr;
+    pappso::PrecisionP _p_precision;
 
 };
 
diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp
index b1f4fcc7afa43a8d318c687766a065f8826ff578..57f6c18feb17140b286a0fa782517b21ed04b161 100644
--- a/src/gui/project_view/projectwindow.cpp
+++ b/src/gui/project_view/projectwindow.cpp
@@ -116,7 +116,7 @@ void ProjectWindow::refreshGroup(IdentificationGroup * p_ident_group) {
     }
     else {
         try {
-            vector< MsRunIdSp > ms_run_list = p_ident_group->getMsRunIdSpList();
+            vector< pappso::MsRunIdSp > ms_run_list = p_ident_group->getMsRunIdSpList();
             ui->sample_number_display->setText(QString("%1").arg(ms_run_list.size()));
 
             ui->group_number_display->setText(QString("%1").arg(p_ident_group->countGroup()));
@@ -251,6 +251,18 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) {
     _protein_list_window_collection.clear();
     _p_current_protein_list_window = nullptr;
 
+    for (auto && p_window :_protein_detail_window_collection) {
+        delete p_window;
+    }
+    _protein_detail_window_collection.clear();
+    _p_current_protein_detail_window = nullptr;
+
+    for (auto && p_window :_peptide_detail_window_collection) {
+        delete p_window;
+    }
+    _peptide_detail_window_collection.clear();
+    _p_current_peptide_detail_window = nullptr;
+
     _project_sp = project_sp;
     refreshGroup(_project_sp.get()->getCurrentIdentificationGroupP());
     //_protein_list_window->setIdentificationGroup(_project_sp.get()->getCurrentIdentificationGroupP());
diff --git a/src/utils/readspectrum.cpp b/src/utils/readspectrum.cpp
index 37944bff5bd92835584230f03bef88ef3da05fd9..e44815461cab1b53219c1d24be67750fe0c57b64 100644
--- a/src/utils/readspectrum.cpp
+++ b/src/utils/readspectrum.cpp
@@ -24,6 +24,9 @@
 #include "readspectrum.h"
 
 #include <QDebug>
+#include <QSettings>
+#include <QFileInfo>
+#include <QDir>
 #include <pappsomspp/spectrum/spectrum.h>
 #include <pappsomspp/exception/exceptionnotfound.h>
 
@@ -40,7 +43,7 @@ using namespace pappso;
 
 
 pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename) {
-      qDebug() << "getPwizMSDataFile opening file " << filename ;
+    qDebug() << "getPwizMSDataFile opening file " << filename ;
     std::string env;
     env=setlocale(LC_ALL,"");
     struct lconv * lc = localeconv ();
@@ -59,8 +62,8 @@ pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename) {
 SpectrumSp getSpectrumSpFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num, unsigned int & precursor_charge_state) {
 
     if (p_ms_data_file == nullptr) {
-      SpectrumSp empty;
-      return (empty);
+        SpectrumSp empty;
+        return (empty);
     }
 
     const bool getBinaryData = true;
@@ -216,3 +219,72 @@ Spectrum readSpectrum(const QString & filename, unsigned int scan_num, unsigned
     //qDebug() << " env=" << localeconv () << " lc->decimal_point " << lc->decimal_point;
     return spectrum;
 }
+
+
+std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> create_map()
+{
+    std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> m;
+    return m;
+}
+
+std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> SpectrumStore::_map_msrun_msdatafile = create_map();
+
+
+const QString SpectrumStore::findMzFile(const QString &filename) {
+
+    QFileInfo file(filename);
+
+    if (file.exists()) {
+        return file.absoluteFilePath();
+    }
+
+    QString basename = file.baseName();
+    QString onlyfilename = file.fileName();
+    QSettings settings;
+    QString path = settings.value("path/mzdatadir", "/gorgone/pappso/formation/Janvier2014/TD/mzXML").toString();
+
+    QDir dir_search(path);
+
+    QFileInfoList files = dir_search.entryInfoList();
+    foreach (QFileInfo file, files) {
+        if (file.isDir()) {
+            qDebug() << "DIR: " << file.fileName();
+        } else {
+            qDebug() << "FILE: " << file.fileName();
+            if (onlyfilename == file.fileName()) {
+                return file.absoluteFilePath();
+            }
+            if (file.fileName().contains(onlyfilename)) {
+                return file.absoluteFilePath();
+            }
+        }
+    }
+    return QString();
+}
+
+pappso::SpectrumSp SpectrumStore::getSpectrumSpFromMsRunIdSp(pappso::MsRunIdSp msrun, unsigned int scan_num) {
+    pappso::SpectrumSp spectrum;
+    pwiz::msdata::MSDataFile * p_msdatafile = nullptr;
+    std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *>::iterator it_msdata = _map_msrun_msdatafile.find(msrun);
+    if (it_msdata == _map_msrun_msdatafile.end()) {
+        //not found
+
+        QString mz_file = findMzFile(msrun.get()->getFilename());
+        if (mz_file.isEmpty()) {
+            qDebug() << "SpectrumStore::getSpectrumSpFromMsRunIdSp ERROR file not found " << msrun.get()->getFilename();
+            return spectrum;
+        }
+        p_msdatafile = getPwizMSDataFile(mz_file);
+        _map_msrun_msdatafile.insert(std::pair<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *>(msrun, p_msdatafile));
+    }
+    else {
+        p_msdatafile =it_msdata->second;
+    }
+    if (p_msdatafile == nullptr) {
+        return spectrum;
+    }
+    unsigned int precursor_charge_state;
+    spectrum = getSpectrumSpFromPwizMSDataFile(p_msdatafile, scan_num, precursor_charge_state);
+    return spectrum;
+
+}
diff --git a/src/utils/readspectrum.h b/src/utils/readspectrum.h
index da0cfeb53aa89c0abf063cf774a9024b4b0f00c1..919f7bd80382dc5ffe1a390ebe785c936994cc1d 100644
--- a/src/utils/readspectrum.h
+++ b/src/utils/readspectrum.h
@@ -26,15 +26,22 @@
 
 #include <QString>
 #include <pappsomspp/spectrum/spectrum.h>
-
+#include <pappsomspp/msrun/msrunid.h>
 #include <pwiz/data/msdata/MSDataFile.hpp>
+#include <map>
 
-using namespace pappso;
-
-Spectrum readSpectrum(const QString & filename, unsigned int scan_num,unsigned int & precursor_charge_state);
+pappso::Spectrum readSpectrum(const QString & filename, unsigned int scan_num,unsigned int & precursor_charge_state);
 
 pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename);
 
-SpectrumSp getSpectrumSpFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num, unsigned int & precursor_charge_state);
+pappso::SpectrumSp getSpectrumSpFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num, unsigned int & precursor_charge_state);
 
+class SpectrumStore {
+public:
+    static pappso::SpectrumSp getSpectrumSpFromMsRunIdSp(pappso::MsRunIdSp msrun, unsigned int scan_num);
+private:
+    static const QString findMzFile(const QString &filename);
+private:
+    static std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> _map_msrun_msdatafile;
+};
 #endif // READSPECTRUM_H