diff --git a/src/pappsomspp/vendors/tims/timsdata.cpp b/src/pappsomspp/vendors/tims/timsdata.cpp
index 778196d9a598bf9cbca782c431553b358e03de14..32049a491fb7e66fd04f721bdf6de35b6668f5e6 100644
--- a/src/pappsomspp/vendors/tims/timsdata.cpp
+++ b/src/pappsomspp/vendors/tims/timsdata.cpp
@@ -613,7 +613,7 @@ TimsData::getPrecursorsFromMzRtCharge(int charge,
   QSqlDatabase qdb = openDatabaseConnection();
   QSqlQuery q      = qdb.exec(
     QString(
-      "SELECT Frames.time, Precursors.MonoisotopicMz, Precursors.Charge, "
+      "SELECT Frames.Time, Precursors.MonoisotopicMz, Precursors.Charge, "
       "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
       "PasefFrameMsMsInfo.scanNumEnd "
       "FROM Frames "
@@ -622,7 +622,7 @@ TimsData::getPrecursorsFromMzRtCharge(int charge,
       "WHERE Precursors.Charge == %1 "
       "AND Precursors.MonoisotopicMz > %2 -0.01 "
       "AND Precursors.MonoisotopicMz < %2 +0.01 "
-      "AND Frames.Time >= %3 "
+      "AND Frames.Time >= %3 -1 "
       "AND Frames.Time < %3 +1; ")
       .arg(charge)
       .arg(mz_val)
diff --git a/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp b/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp
index 9e58942bf6a26ef41da32688bef5ddfccf9b2523..9e6acb4c1db19dd0d5c29dfaf9e4a53129a048fa 100644
--- a/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp
+++ b/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp
@@ -105,7 +105,7 @@ TimsDirectXicExtractor::extractTimsXicList(
       frame_sptr.get()->extractTimsXicListInRtRange(
         itXicListbegin, itXicListend, m_xicExtractMethod);
       
-      qInfo() << "" << frame_sptr.get()->getId();
+      qDebug() << "" << frame_sptr.get()->getId();
     }
   qDebug();
 }
diff --git a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp
index ed22e8c2d570b84c55f4a10281b1e6d15792307a..c2a79237dc9df6ea6a480211b7a613b3fed82467 100644
--- a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp
+++ b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp
@@ -318,7 +318,6 @@ MassSpectrumWidget::plot()
     }
   else
     {
-
       _peak_ion_isotope_match_list.sort(
         [](const PeakIonIsotopeMatch &a, const PeakIonIsotopeMatch &b) {
           return a.getPeak().y > b.getPeak().y;
@@ -455,3 +454,12 @@ MassSpectrumWidget::computeIsotopeMassList()
         }
     }
 }
+
+void
+pappso::MassSpectrumWidget::highlightPrecursorPeaks(double precursor_mz)
+{
+  if(_ms_level > 1)
+    {
+      _custom_plot->highlightPrecursorPeaks(precursor_mz, _p_ms2_precision);
+    }
+}
diff --git a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h
index fab9f4783b0cac315786a22df39c291d8f7f49d0..ca240734b2e47ea2eb735b40d942303d064c4e29 100644
--- a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h
+++ b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h
@@ -68,6 +68,7 @@ class PMSPP_LIB_DECL MassSpectrumWidget : public GraphicDeviceWidget
 
   bool savePdf(const QString &fileName, int width = 0, int height = 0);
   void toQPaintDevice(QPaintDevice *device, const QSize &size) override;
+  void highlightPrecursorPeaks(double precursor_mz);
   // void setIsotopeMassList(std::vector<pappso::PeptideNaturalIsotopeAverageSp>
   // & isotope_mass_list);
 
diff --git a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp
index e95b622e13b2cc46ec7672b6567e6f7571069490..117c801607d3e90d3ceea37aebccfc09425bb09f 100644
--- a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp
+++ b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp
@@ -68,6 +68,12 @@ QCPSpectrum::QCPSpectrum(MassSpectrumWidget *parent, bool visible)
   _p_peak_bars_isotope->setPen(QPen(red, 1));
   _p_peak_bars_isotope->setBrush(QBrush(red));
 
+  mp_peak_bars_precursor = new QCPBars(xAxis, yAxis);
+  mp_peak_bars_precursor->setWidthType(QCPBars::WidthType::wtAbsolute);
+  mp_peak_bars_precursor->setWidth(_bar_width * 1.5);
+  mp_peak_bars_precursor->setPen(QPen(Qt::cyan, 1));
+  mp_peak_bars_precursor->setVisible(true);
+
   connect(this->xAxis,
           SIGNAL(rangeChanged(QCPRange)),
           this,
@@ -458,3 +464,28 @@ QCPSpectrum::addMs1IsotopePattern(
                                       total_intensity);
     }
 }
+
+void
+pappso::QCPSpectrum::highlightPrecursorPeaks(double precursor_mz,
+                                             PrecisionPtr ms2_precision)
+{
+  MzRange range(precursor_mz, ms2_precision);
+
+  for(const DataPoint &peak : *_p_spectrum)
+    {
+      if((peak.x > range.lower()) && (peak.x < range.upper()))
+        {
+          mp_peak_bars_precursor->addData(peak.x, peak.y);
+          QCPItemText *text_label = new QCPItemText(this);
+          text_label->setVisible(true);
+          text_label->setPositionAlignment(Qt::AlignBottom | Qt::AlignHCenter);
+          text_label->position->setType(QCPItemPosition::ptPlotCoords);
+          text_label->position->setCoords(
+            peak.x,
+            peak.y); // place position at center/top of axis rect
+          text_label->setFont(QFont(font().family(), 8));
+          text_label->setText("precursor");
+          text_label->setColor(Qt::cyan);
+        }
+    }
+}
diff --git a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h
index 1540ca94d173fd99690a962053b7f0210870556e..199886df76708fb5876c4a56312d8554723bfe29 100644
--- a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h
+++ b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h
@@ -60,6 +60,7 @@ class QCPSpectrum : public QCustomPlot
                          &isotope_mass_list,
                        pappso_double intensity);
   void addPeakIonIsotopeMatch(const PeakIonIsotopeMatch &peak_ion_match);
+  void highlightPrecursorPeaks(double precursor_mz, PrecisionPtr ms2_precision);
   virtual void mouseMoveEvent(QMouseEvent *event) override;
   virtual void mousePressEvent(QMouseEvent *event) override;
   virtual void mouseReleaseEvent(QMouseEvent *event) override;
@@ -83,6 +84,7 @@ class QCPSpectrum : public QCustomPlot
   QCPRange _mass_delta_range;
   QCPBars *_p_peak_bars;
   QCPBars *_p_peak_bars_isotope;
+  QCPBars *mp_peak_bars_precursor;
   std::map<PeptideIon, QCPBars *> _map_ion_type_bars;
   QCPAxisRect *_p_delta_axis_rect;
   QCPGraph *_p_delta_graph;
diff --git a/tests/test_timsxicextractor.cpp b/tests/test_timsxicextractor.cpp
index f3cc9d7f44bf40a5b8a73a7059f98abfad3fc4d4..99a30cd4babd8625b12747efbea67b0ab0ccdf50 100644
--- a/tests/test_timsxicextractor.cpp
+++ b/tests/test_timsxicextractor.cpp
@@ -42,6 +42,7 @@
 #include <pappsomspp/processing/filters/filtersuitestring.h>
 #include "config.h"
 #include "common.h"
+#include <time.h>
 
 
 using namespace pappso;
@@ -66,16 +67,16 @@ TEST_CASE("Extracting XIC from timsdata.", "[TimsXicExtractor]")
         "200ngHeLaPASEF_2min_compressed.d/analysis.tdf",
         "a1");
     */
-  pappso::MsFileAccessor accessor(
-    "/gorgone/pappso/jouy/raw/2021_Tims_TOF/20210126_HeLa/"
-    "1-26-2021_1_QC_HeLa10ng_825.d/analysis.tdf",
-    "a1");
-  /*
+//   pappso::MsFileAccessor accessor(
+//     "/gorgone/pappso/jouy/raw/2021_Tims_TOF/20210126_HeLa/"
+//     "1-26-2021_1_QC_HeLa10ng_825.d/analysis.tdf",
+//     "a1");
+//   
 
   pappso::MsFileAccessor accessor(
     "/data/test_tdf_quality/2-3-2021_1_HeLa10ng_871.d/analysis.tdf",
     "a1");
-*/
+
 
   accessor.setPreferedFileReaderType(pappso::MzFormat::brukerTims,
                                      pappso::FileReaderType::tims_ms2);
@@ -95,24 +96,39 @@ TEST_CASE("Extracting XIC from timsdata.", "[TimsXicExtractor]")
 
   pappso::TimsDataSp tims_data = tims2_reader->getTimsDataSPtr();
 
-  std::vector<std::size_t> precursor_list = {3, 4, 5, 3000, 3001};
+  std::vector<std::size_t> precursor_list = {2159};
+  std::vector<pappso_double> mz_list      = {466.738, 467.239};
 
   std::vector<pappso::TimsXicStructure> xic_list;
+  std::vector<pappso::TimsXicStructure> xic_struct_list;
 
+  clock_t start = clock();
   for(auto precursor_id : precursor_list)
     {
       xic_list.push_back(tims_data.get()->getTimsXicStructureFromPrecursorId(
-        precursor_id, PrecisionFactory::getPpmInstance(10.0)));
+        precursor_id, PrecisionFactory::getPpmInstance(30.0)));
     }
 
+  for(pappso::pappso_double mz : mz_list)
+    {
+      pappso::TimsXicStructure new_xic_struct =
+        pappso::TimsXicStructure(xic_list[0]);
+      new_xic_struct.mzRange =
+        pappso::MzRange(mz, PrecisionFactory::getPpmInstance(30.0));
+      new_xic_struct.xicSptr = std::make_shared<Xic>();
+      xic_struct_list.push_back(new_xic_struct);
+    }
 
   tims_data.get()->extractXicListByTimsXicStructureList(
-    xic_list, pappso::XicExtractMethod::sum, 100000);
-
-  for(auto &&xic_struct : xic_list)
+    xic_struct_list, pappso::XicExtractMethod::sum, 100000);
+  
+  qInfo() << QString("Time taken: %1\n").arg((double)(clock() - start)/CLOCKS_PER_SEC);
+  for(auto &&xic_struct : xic_struct_list)
     {
       REQUIRE(xic_struct.xicSptr.get() != nullptr);
-      QFile fileods(QString("tims_xic_%1.ods").arg(xic_struct.precursorId));
+      QFile fileods(QString("/data/test_tdf_quality/tims_xic_%1_%2.ods")
+                      .arg(xic_struct.precursorId)
+                      .arg(xic_struct.mzRange.getMz()));
       OdsDocWriter writer(&fileods);
       writer.writeLine();
       writer.writeCell("precursorId");