diff --git a/macro/rich/run/run_qa.C b/macro/rich/run/run_qa.C
index de4172d08ff6cc7a1a00e1bd1fa5d9868d5a39a1..e97bc1d997921e47c861b7b60809318d0eb2aafe 100644
--- a/macro/rich/run/run_qa.C
+++ b/macro/rich/run/run_qa.C
@@ -10,6 +10,7 @@
 #include "CbmRichGeoTest.h"
 #include "CbmRichMatchRings.h"
 #include "CbmRichRecoQa.h"
+#include "CbmRichUrqmdTest.h"
 // #include "CbmRichRingFinderQa.h"
 // #include "CbmRichTrackProjQa.h"
 #include "CbmSetup.h"
@@ -140,6 +141,12 @@ void run_qa(TString traFile = "", TString parFile = "", TString digiFile = "", T
   // run->AddTask(geoTest);
   // ------------------------------------------------------------------------
 
+  // -----   RICH UrqmdTest   -----------------------------------------------
+  // CbmRichUrqmdTest* urqmdTest = new CbmRichUrqmdTest();
+  // urqmdTest->SetOutputDir(resultDir.Data());
+  // run->AddTask(urqmdTest);
+  // ------------------------------------------------------------------------
+
   // -----   Lit Tracking Qa   ----------------------------------------------
   // CbmLitTrackingQa* trackingQa = new CbmLitTrackingQa();
   // trackingQa->SetMinNofPointsSts(4);
diff --git a/reco/detectors/rich/qa/CbmRichGeoOpt.cxx b/reco/detectors/rich/qa/CbmRichGeoOpt.cxx
index 7de1ec5aee1fec41ff6dfb69fd26656fbd04ffe0..4d2e4e0ca167811500c87959b0af6eab9441ab2e 100644
--- a/reco/detectors/rich/qa/CbmRichGeoOpt.cxx
+++ b/reco/detectors/rich/qa/CbmRichGeoOpt.cxx
@@ -559,7 +559,7 @@ void CbmRichGeoOpt::RingParameters()
     CbmRichRing* ring = (CbmRichRing*) fRichRings->At(iR);
     if (NULL == ring) continue;
     CbmTrackMatchNew* ringMatch = (CbmTrackMatchNew*) fRichRingMatches->At(iR);
-    if (NULL == ringMatch) {
+    if (NULL == ringMatch || ringMatch->GetNofLinks() < 1) {
       // H_NofRings->SetBinContent(8,H_NofRings->GetBinCenter(8)+1);
       continue;
     }
diff --git a/reco/detectors/rich/qa/CbmRichGeoTest.cxx b/reco/detectors/rich/qa/CbmRichGeoTest.cxx
index 3e1d5d4eda23f550ccdf679b99c33bafcd3220c8..e824815ef1ea8706134165b23f6241af3d994efd 100644
--- a/reco/detectors/rich/qa/CbmRichGeoTest.cxx
+++ b/reco/detectors/rich/qa/CbmRichGeoTest.cxx
@@ -68,7 +68,7 @@
 using namespace std;
 using namespace Cbm;
 
-CbmRichGeoTest::CbmRichGeoTest() : FairTask("RichGeoTestQa") {}
+CbmRichGeoTest::CbmRichGeoTest() : FairTask("CbmRichGeoTestQa") {}
 
 CbmRichGeoTest::~CbmRichGeoTest() {}
 
@@ -98,7 +98,7 @@ InitStatus CbmRichGeoTest::Init()
 void CbmRichGeoTest::Exec(Option_t* /*option*/)
 {
   fEventNum++;
-  cout << "CbmRichGeoTest, event No. " << fEventNum << endl;
+  LOG(info) << "CbmRichGeoTest, event No. " << fEventNum;
 
   ProcessMc();
   RingParameters();
@@ -194,6 +194,9 @@ void CbmRichGeoTest::InitHistograms()
     fHM->Create2<TH2D>("fhPYEl" + t, "fhPYEl" + t + ";Rapidity;P [GeV/c];Yield", 25, 0., 4., 25, 0., 10.);
   }
 
+  fHM->Create1<TH1D>("fhMcMomPi", "fhMcMomPi;p [GeV/c];Yield", 50, 0., 10.);
+  fHM->Create2<TH2D>("fhMcPtyPi", "fhMcPtyPi;Rapidity;P_{t} [GeV/c];Yield", 25, 0., 4., 25, 0., 3.);
+
   // Numbers in dependence on XY position onto the photodetector.
   fHM->Create3<TH3D>("fhNofHitsXYZ", "fhNofHitsXYZ;X [cm];Y [cm];# hits/ring", nBinsX, xMin, xMax, nBinsY, yMin, yMax,
                      50, 0., 50);
@@ -348,7 +351,7 @@ void CbmRichGeoTest::RingParameters()
     const CbmRichRing* ring = static_cast<CbmRichRing*>(fRichRings->At(iR));
     if (ring == nullptr) continue;
     const CbmTrackMatchNew* ringMatch = static_cast<CbmTrackMatchNew*>(fRichRingMatches->At(iR));
-    if (ringMatch == nullptr) continue;
+    if (ringMatch == nullptr || ringMatch->GetNofLinks() < 1) continue;
     int mcEventId             = ringMatch->GetMatchedLink().GetEntry();
     int mcTrackId             = ringMatch->GetMatchedLink().GetIndex();
     const CbmMCTrack* mcTrack = static_cast<CbmMCTrack*>(fMcTracks->Get(fileId, mcEventId, mcTrackId));
@@ -792,15 +795,15 @@ void CbmRichGeoTest::DrawHist()
     TH1D* fhNofHitsEllipseFitEff = Cbm::DivideH1(fHM->H1("fhNofHitsEllipseFit"), fHM->H1("fhNofHitsAll"));
     c->cd(2);
     DrawH1(fhNofHitsCircleFitEff);
-    TLatex* circleFitEffTxt =
-      new TLatex(15, 0.5, CalcEfficiency(fHM->H1("fhNofHitsCircleFit"), fHM->H1("fhNofHitsAll")).c_str());
-    cout << "Circle fit efficiency:" << circleFitEffTxt << "%" << endl;
+    auto circleEff          = CalcEfficiency(fHM->H1("fhNofHitsCircleFit"), fHM->H1("fhNofHitsAll"));
+    TLatex* circleFitEffTxt = new TLatex(15, 0.5, circleEff.c_str());
+    LOG(info) << "Circle fit efficiency:" << circleEff << "%";
     circleFitEffTxt->Draw();
     c->cd(3);
     DrawH1(fhNofHitsEllipseFitEff);
-    TLatex* ellipseFitEffTxt =
-      new TLatex(15, 0.5, CalcEfficiency(fHM->H1("fhNofHitsEllipseFit"), fHM->H1("fhNofHitsAll")).c_str());
-    cout << "Ellipse fit efficiency:" << ellipseFitEffTxt << "%" << endl;
+    auto ellipseFitEff       = CalcEfficiency(fHM->H1("fhNofHitsEllipseFit"), fHM->H1("fhNofHitsAll"));
+    TLatex* ellipseFitEffTxt = new TLatex(15, 0.5, ellipseFitEff.c_str());
+    LOG(info) << "Ellipse fit efficiency:" << ellipseFitEff << "%";
     ellipseFitEffTxt->Draw();
   }
 
@@ -830,7 +833,7 @@ void CbmRichGeoTest::DrawHist()
   {
     fHM->CreateCanvas("richgeo_acc_eff_el_mom", "richgeo_acc_eff_el_mom", 800, 800);
     string effEl = CalcEfficiency(fHM->H1Clone("fhMomElAcc"), fHM->H1Clone("fhMomElMc"));
-    cout << "Geometrical acceptance electrons:" << effEl << "%" << endl;
+    LOG(info) << "Geometrical acceptance electrons:" << effEl << "%";
     DrawH1({pxEff}, {"e^{#pm} (" + effEl + "%)"}, kLinear, kLinear, true, 0.6, 0.55, 0.88, 0.65);
   }
 
@@ -1111,17 +1114,20 @@ void CbmRichGeoTest::DrawPmtPoint(const string& coordOpt, const vector<int>& ids
 
 void CbmRichGeoTest::Finish()
 {
-  DrawHist();
   if (fDrawPmts) { DrawPmts(); }
 
   TDirectory* oldir = gDirectory;
   TFile* outFile    = FairRootManager::Instance()->GetOutFile();
   if (outFile != nullptr) {
-    outFile->cd();
+    outFile->mkdir(GetName());
+    outFile->cd(GetName());
     fHM->WriteToFile();
   }
-  gDirectory->cd(oldir->GetPath());
+
+  DrawHist();
   fHM->SaveCanvasToImage(fOutputDir, "png");
+  fHM->Clear();
+  gDirectory->cd(oldir->GetPath());
 }
 
 string CbmRichGeoTest::CalcEfficiency(TH1* histRec, TH1* histAcc)
diff --git a/reco/detectors/rich/qa/CbmRichRecoQa.cxx b/reco/detectors/rich/qa/CbmRichRecoQa.cxx
index 71a791b48a5643bdbf0ea9621ed2908cd4112b89..c2a91aa68660c3a73743abe9539bd70c6baee3ac 100644
--- a/reco/detectors/rich/qa/CbmRichRecoQa.cxx
+++ b/reco/detectors/rich/qa/CbmRichRecoQa.cxx
@@ -176,7 +176,7 @@ void CbmRichRecoQa::RingTrackMismatchSource()
     int stsId = globalTrack->GetStsTrackIndex();
     if (stsId < 0) continue;
     const CbmTrackMatchNew* stsTrackMatch = static_cast<const CbmTrackMatchNew*>(fStsTrackMatches->At(stsId));
-    if (stsTrackMatch == nullptr) continue;
+    if (stsTrackMatch == nullptr || stsTrackMatch->GetNofLinks() < 1) continue;
     auto stsMatchedLink       = stsTrackMatch->GetMatchedLink();
     const CbmMCTrack* mcTrack = static_cast<CbmMCTrack*>(fMcTracks->Get(stsMatchedLink));
     if (!IsMcPrimaryElectron(mcTrack)) continue;
@@ -224,7 +224,7 @@ void CbmRichRecoQa::RingTrackMismatchSource()
       fHM->H1("fhMismatchSrc")->Fill(3);
       fHM->H1("fhMismatchSrcMomStsRich")->Fill(mom);
       const CbmTrackMatchNew* richRingMatch = static_cast<const CbmTrackMatchNew*>(fRichRingMatches->At(richId));
-      if (richRingMatch == nullptr) continue;
+      if (richRingMatch == nullptr || richRingMatch->GetNofLinks() < 1) continue;
       auto richMcTrackLink    = richRingMatch->GetMatchedLink();
       const CbmRichRing* ring = static_cast<const CbmRichRing*>(fRichRings->At(richId));
       if (nullptr == ring) continue;
@@ -257,7 +257,7 @@ bool CbmRichRecoQa::WasRingFound(const CbmLink& mcTrackLink)
     const CbmRichRing* ring = static_cast<const CbmRichRing*>(fRichRings->At(iR));
     if (ring == nullptr) continue;
     const CbmTrackMatchNew* richRingMatch = static_cast<const CbmTrackMatchNew*>(fRichRingMatches->At(iR));
-    if (richRingMatch == nullptr) continue;
+    if (richRingMatch == nullptr || richRingMatch->GetNofLinks() < 1) continue;
     auto richMcTrackLink = richRingMatch->GetMatchedLink();
     if (richMcTrackLink == mcTrackLink) return true;
   }
@@ -273,7 +273,7 @@ bool CbmRichRecoQa::WasRingMatched(const CbmLink& mcTrackLink)
     int richId = globalTrack->GetRichRingIndex();
     if (richId < 0) continue;
     const CbmTrackMatchNew* richRingMatch = static_cast<const CbmTrackMatchNew*>(fRichRingMatches->At(richId));
-    if (richRingMatch == nullptr) continue;
+    if (richRingMatch == nullptr || richRingMatch->GetNofLinks() < 1) continue;
     auto richMcTrackLink = richRingMatch->GetMatchedLink();
     if (richMcTrackLink == mcTrackLink) {
       return true;
@@ -306,11 +306,11 @@ void CbmRichRecoQa::FillRingTrackDistance()
     if (stsId < 0 || richId < 0) continue;
 
     const CbmTrackMatchNew* stsTrackMatch = static_cast<const CbmTrackMatchNew*>(fStsTrackMatches->At(stsId));
-    if (stsTrackMatch == nullptr) continue;
+    if (stsTrackMatch == nullptr || stsTrackMatch->GetNofLinks() < 1) continue;
     auto stsMcMatchedLink = stsTrackMatch->GetMatchedLink();
 
     const CbmTrackMatchNew* richRingMatch = static_cast<const CbmTrackMatchNew*>(fRichRingMatches->At(richId));
-    if (richRingMatch == nullptr) continue;
+    if (richRingMatch == nullptr || richRingMatch->GetNofLinks() < 1) continue;
     auto richMcTrackLink    = richRingMatch->GetMatchedLink();
     const CbmRichRing* ring = static_cast<const CbmRichRing*>(fRichRings->At(richId));
     if (nullptr == ring) continue;
@@ -359,6 +359,34 @@ void CbmRichRecoQa::FillRingTrackDistance()
   }
 }
 
+void CbmRichRecoQa::DrawMismatchSrc()
+{
+  gStyle->SetPaintTextFormat("4.1f");
+  fHM->CreateCanvas("richqa_mismatch_src", "richqa_mismatch_src", 1000, 800);
+  double nofMcEl = fHM->H1("fhMismatchSrc")->GetBinContent(1);
+  fHM->Scale("fhMismatchSrc", 100. / nofMcEl);
+  DrawH1(fHM->H1("fhMismatchSrc"), kLinear, kLog, "hist text");
+  fHM->H1("fhMismatchSrc")->SetMarkerSize(1.9);
+
+  vector<string> labels{"MC",
+                        "STS",
+                        "STS-Acc RICH",
+                        "STS-RICH",
+                        "STS-RICH true",
+                        "STS-NoRICH",
+                        "STS-NoRICH RF",
+                        "STS-NoRICH RM",
+                        "STS-NoRICH NoRF",
+                        "STS-NoRICH NoPrj",
+                        "STS-RICH wrong",
+                        "STS-RICH wrong RF",
+                        "STS-RICH wrong RM"};
+
+  for (size_t i = 0; i < labels.size(); i++) {
+    fHM->H1("fhMismatchSrc")->GetXaxis()->SetBinLabel(i + 1, labels[i].c_str());
+  }
+  fHM->H1("fhMismatchSrc")->GetXaxis()->SetLabelSize(0.03);
+}
 
 void CbmRichRecoQa::DrawHist()
 {
@@ -393,34 +421,6 @@ void CbmRichRecoQa::DrawHist()
            kLinear, kLog, true, 0.5, 0.85, 0.99, 0.99, "hist");
   }
 
-  {
-    gStyle->SetPaintTextFormat("4.1f");
-    fHM->CreateCanvas("richqa_mismatch_src", "richqa_mismatch_src", 1000, 800);
-    double nofMcEl = fHM->H1("fhMismatchSrc")->GetBinContent(1);
-    fHM->Scale("fhMismatchSrc", 100. / nofMcEl);
-    DrawH1(fHM->H1("fhMismatchSrc"), kLinear, kLog, "hist text");
-    fHM->H1("fhMismatchSrc")->SetMarkerSize(1.9);
-
-    vector<string> labels {"MC",
-                           "STS",
-                           "STS-Acc RICH",
-                           "STS-RICH",
-                           "STS-RICH true",
-                           "STS-NoRICH",
-                           "STS-NoRICH RF",
-                           "STS-NoRICH RM",
-                           "STS-NoRICH NoRF",
-                           "STS-NoRICH NoPrj",
-                           "STS-RICH wrong",
-                           "STS-RICH wrong RF",
-                           "STS-RICH wrong RM"};
-
-    for (size_t i = 0; i < labels.size(); i++) {
-      fHM->H1("fhMismatchSrc")->GetXaxis()->SetBinLabel(i + 1, labels[i].c_str());
-    }
-    fHM->H1("fhMismatchSrc")->GetXaxis()->SetLabelSize(0.03);
-  }
-
   {
     fHM->CreateCanvas("richqa_mismatch_src_mom", "richqa_mismatch_src_mom", 1000, 800);
     vector<string> labels {"MC",
@@ -548,6 +548,8 @@ bool CbmRichRecoQa::IsMcPion(const CbmMCTrack* mctrack)
 
 void CbmRichRecoQa::Finish()
 {
+  DrawMismatchSrc();
+
   TDirectory* oldir = gDirectory;
   TFile* outFile    = FairRootManager::Instance()->GetOutFile();
   if (outFile != nullptr) {
@@ -558,7 +560,7 @@ void CbmRichRecoQa::Finish()
 
   DrawHist();
   fHM->SaveCanvasToImage(fOutputDir);
-
+  fHM->Clear();
   gDirectory->cd(oldir->GetPath());
 }
 
@@ -576,6 +578,7 @@ void CbmRichRecoQa::DrawFromFile(const string& fileName, const string& outputDir
   TFile* file = new TFile(fileName.c_str());
   fHM->ReadFromFile(file);
 
+  DrawMismatchSrc();
   DrawHist();
 
   fHM->SaveCanvasToImage(fOutputDir);
diff --git a/reco/detectors/rich/qa/CbmRichRecoQa.h b/reco/detectors/rich/qa/CbmRichRecoQa.h
index 4e5a731d1f413c40f97f1cab5906d107c5f7b4c1..23366c426452ca1ddcc426fb845822d65e99dc61 100644
--- a/reco/detectors/rich/qa/CbmRichRecoQa.h
+++ b/reco/detectors/rich/qa/CbmRichRecoQa.h
@@ -87,6 +87,11 @@ private:
      */
   void RingTrackMismatchSource();
 
+  /**
+     *  \brief Draw MismatchSrc histogram and canvas.
+     */
+  void DrawMismatchSrc();
+
   /**
      *  \brief Draw histograms.
      */
diff --git a/reco/detectors/rich/qa/CbmRichUrqmdTest.cxx b/reco/detectors/rich/qa/CbmRichUrqmdTest.cxx
index 8a9c401646e453e44227b3fc11ff0c9ef6fe0247..4146849220d3a14f8c23495a488e8c4ad55b65e1 100644
--- a/reco/detectors/rich/qa/CbmRichUrqmdTest.cxx
+++ b/reco/detectors/rich/qa/CbmRichUrqmdTest.cxx
@@ -71,7 +71,7 @@ void CbmRichUrqmdTest::Exec(Option_t* /*option*/)
 {
   fEventNum++;
 
-  cout << "CbmRichUrqmdTest, event No. " << fEventNum << endl;
+  LOG(info) << "CbmRichUrqmdTest, event No. " << fEventNum;
 
   FillRichRingNofHits();
   NofRings();
@@ -170,7 +170,7 @@ void CbmRichUrqmdTest::NofRings()
     const CbmRichRing* ring = static_cast<CbmRichRing*>(fRichRings->At(iR));
     if (ring == nullptr) continue;
     const CbmTrackMatchNew* ringMatch = static_cast<CbmTrackMatchNew*>(fRichRingMatches->At(iR));
-    if (ringMatch == nullptr) continue;
+    if (ringMatch == nullptr || ringMatch->GetNofLinks() < 1) continue;
 
     auto matchedLink          = ringMatch->GetMatchedLink();
     const CbmMCTrack* mcTrack = static_cast<CbmMCTrack*>(fMcTracks->Get(matchedLink));
@@ -606,7 +606,7 @@ void CbmRichUrqmdTest::Finish()
 
   DrawHist();
   fHM->SaveCanvasToImage(fOutputDir);
-
+  fHM->Clear();
   gDirectory->cd(oldir->GetPath());
 }