diff --git a/core/qa/CbmQaIO.cxx b/core/qa/CbmQaIO.cxx
index a5f91d42c7c823ca9352b7a791232ad83c397f40..426e3e57f3a20c55a99a4c5c806955572aa85549 100644
--- a/core/qa/CbmQaIO.cxx
+++ b/core/qa/CbmQaIO.cxx
@@ -53,7 +53,7 @@ void CbmQaIO::SetTH2Properties(TH2* pHist) const
 
   pHist->SetOption("colz");
   pHist->SetStats(false);
-  pHist->GetYaxis()->SetLabelOffset(0.95);
+  //pHist->GetYaxis()->SetLabelOffset(0.95);
   /*
   TPaveStats* stats = cbm::qa::util::GetHistStats(pHist);
   assert(stats);
diff --git a/core/qa/checker/CbmQaCheckerCore.h b/core/qa/checker/CbmQaCheckerCore.h
index de0d419119ae034f71f49709568c5201a4f634ec..5390e4f3873028d04c382dd2e41d8d0a91000d32 100644
--- a/core/qa/checker/CbmQaCheckerCore.h
+++ b/core/qa/checker/CbmQaCheckerCore.h
@@ -60,6 +60,9 @@ namespace cbm::qa::checker
     /// @brief Runs checking routine
     /// @param opt  Option:
     ///             "B": suppress canvas creation
+    ///             "F": forces canvas creation (even if there is no difference)
+    ///             "R": draw ratio on canvas
+    ///             "D": draw difference on canvas
     ///             "P": enables bin-by-bin comparison
     ///             "S": enables statistical hypothesis test, where is possible
     ///             "U": enables interval comparison, where is possible
diff --git a/core/qa/checker/CbmQaCheckerFileHandler.cxx b/core/qa/checker/CbmQaCheckerFileHandler.cxx
index 140c24f711ae143d7c493b33db1a22d0b1a0c658..5f935242ccad50baee55b405b2710c77edcd4905 100644
--- a/core/qa/checker/CbmQaCheckerFileHandler.cxx
+++ b/core/qa/checker/CbmQaCheckerFileHandler.cxx
@@ -92,6 +92,7 @@ void FileHandler::Process(Option_t* opt)
     ch = std::tolower(ch);
   }
   bool bSuppressCanvases = sOption.find("b") != std::string::npos;
+  bool bForceCanvases    = sOption.find("c") != std::string::npos;
   bool bCmpPointByPoint  = sOption.find("p") != std::string::npos;
   bool bCmpStatAny       = sOption.find("s") != std::string::npos;
 
@@ -164,8 +165,8 @@ void FileHandler::Process(Option_t* opt)
           areDifferent = true;
         }
       }
-      if (areDifferent) {
-        pObjHandler->CreateCanvases();
+      if (areDifferent || bForceCanvases) {
+        pObjHandler->CreateCanvases(opt);
       }
     }
     pObjHandler->Write();
diff --git a/core/qa/checker/CbmQaCheckerHist1DHandler.cxx b/core/qa/checker/CbmQaCheckerHist1DHandler.cxx
index e27e32afb49132c1be929671f819d81d79bf9976..e107920b3e105e0a4bba3ff7758a2f1060394a2e 100644
--- a/core/qa/checker/CbmQaCheckerHist1DHandler.cxx
+++ b/core/qa/checker/CbmQaCheckerHist1DHandler.cxx
@@ -9,7 +9,6 @@
 
 #include "CbmQaCheckerHist1DHandler.h"
 
-#include "CbmQaCanvas.h"
 #include "CbmQaCheckerTypedefs.h"
 #include "Logger.h"
 #include "TCanvas.h"
@@ -44,6 +43,15 @@ CmpResult_t Hist1DHandler::Compare(const TNamed* pNum, const TNamed* pDenom) con
   std::bitset<sizeof(CmpResult_t) * 8> res;
   auto* pNumerator   = static_cast<const TH1*>(pNum);
   auto* pDenominator = static_cast<const TH1*>(pDenom);
+  if (pNumerator->GetNbinsX() != pDenominator->GetNbinsX() || pNumerator->GetNbinsY() != pDenominator->GetNbinsY()
+      || pNumerator->GetNbinsZ() != pDenominator->GetNbinsZ()) {
+    res[EFlags::kPOINT] = false;
+    res[EFlags::kRATIO] = false;
+    res[EFlags::kCHI2]  = false;
+    res[EFlags::kKOLM]  = false;
+    return res.to_ulong();
+  }
+
   if (fOptionBits[EFlags::kPOINT] && ComparePointToPoint(pNumerator, pDenominator)) {
     res[EFlags::kPOINT] = true;
   }
@@ -61,24 +69,51 @@ CmpResult_t Hist1DHandler::Compare(const TNamed* pNum, const TNamed* pDenom) con
 
 // ---------------------------------------------------------------------------------------------------------------------
 //
-void Hist1DHandler::CreateCanvases()
+void Hist1DHandler::CreateCanvases(Option_t* opt)
 {
   int nVersions = fpObjDB->GetNofVersions();
   int iDef      = fpObjDB->GetDefaultID();
 
+  // ----- Option parsing
+  std::string sOption = opt;
+  for (auto& ch : sOption) {
+    ch = std::tolower(ch);
+  }
+  bool bDrawRatio = sOption.find("r") != std::string::npos;
+  bool bDrawDiff  = sOption.find("d") != std::string::npos;
+  int nPads       = static_cast<int>(bDrawRatio) + static_cast<int>(bDrawDiff) + 1;
+
   // ----- Canvas: comparison of original histograms, ratios and subtractions
   std::string sCanvName  = fsBaseName + "_cmp_canvas";
   std::string sCanvTitle = "Comparison result for \"" + fsBaseName + "\"";
-  fpCanvas               = std::make_shared<CbmQaCanvas>(sCanvName.data(), sCanvTitle.data(), 1500, 500);
+  fpCanvas               = std::make_shared<TCanvas>(sCanvName.data(), sCanvTitle.data(), 500 * nPads, 500);
   fpCanvas->cd();
-  auto* pPadOrig = new TPad("p1", "p1", 0.0, 0.0, 0.3333, 1.0);
+
+  TPad* pPadOrig  = nullptr;
+  TPad* pPadRatio = nullptr;
+  TPad* pPadDiff  = nullptr;
+
+  double xPadSize = 1.0 / nPads;
+  double xNext    = 0.;
+
+  pPadOrig = new TPad("p1", "p1", 0.0, 0.0, xPadSize, 1.0);
   pPadOrig->SetMargin(0.20, 0.05, 0.20, 0.10);
   fpCanvas->cd();
-  auto* pPadRatio = new TPad("p2", "p2", 0.3333, 0.0, 0.6666, 1.0);
-  pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10);
-  fpCanvas->cd();
-  auto* pPadDiff = new TPad("p3", "p3", 0.6666, 0.0, 1.0, 1.0);
-  pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10);
+  xNext += xPadSize;
+
+  if (bDrawRatio) {
+    pPadRatio = new TPad("p2", "p2", xNext, 0.0, xNext + xPadSize, 1.0);
+    pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10);
+    fpCanvas->cd();
+    xNext += xPadSize;
+  }
+
+  if (bDrawDiff) {
+    pPadDiff = new TPad("p3", "p3", xNext, 0.0, xNext + xPadSize, 1.0);
+    pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10);
+    fpCanvas->cd();
+    xNext += xPadSize;
+  }
 
   // Title definitions
   const char* title      = fvpObjects[0]->GetTitle();
@@ -104,54 +139,58 @@ void Hist1DHandler::CreateCanvases()
   auto* pDefault = static_cast<TH1*>(fvpObjects[iDef]);
 
   // Histogram ratios to default
-  pPadRatio->cd();
-  auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio);
-  for (int iV = 0; iV < nVersions; ++iV) {
-    if (iV == iDef) {
-      continue;
-    }
-    auto* pRatio = static_cast<TH1*>(fvpObjects[iV]->Clone());
-    pRatio->SetDirectory(fpOutDir);
-    auto currErrorLevel = gErrorIgnoreLevel;
-    gErrorIgnoreLevel   = kError;
-    auto* pCopy         = new TGraphAsymmErrors(pRatio, pDefault, "pois");
-    gErrorIgnoreLevel   = currErrorLevel;
-    pCopy->SetMarkerStyle(20);
-    pMultiGraphRatio->Add(pCopy, "P");
-    if (pRatio) {
-      delete pRatio;
-      pRatio = nullptr;
+  if (bDrawRatio) {
+    pPadRatio->cd();
+    auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio);
+    for (int iV = 0; iV < nVersions; ++iV) {
+      if (iV == iDef) {
+        continue;
+      }
+      auto* pRatio = static_cast<TH1*>(fvpObjects[iV]->Clone());
+      pRatio->SetDirectory(fpOutDir);
+      auto currErrorLevel = gErrorIgnoreLevel;
+      gErrorIgnoreLevel   = kError;
+      auto* pCopy         = new TGraphAsymmErrors(pRatio, pDefault, "pois");
+      gErrorIgnoreLevel   = currErrorLevel;
+      pCopy->SetMarkerStyle(20);
+      pMultiGraphRatio->Add(pCopy, "P");
+      if (pRatio) {
+        delete pRatio;
+        pRatio = nullptr;
+      }
     }
+    pMultiGraphRatio->GetYaxis()->SetTitle("ratio");
+    pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle);
+    pMultiGraphRatio->Draw("A pmc plc");
   }
-  pMultiGraphRatio->GetYaxis()->SetTitle("ratio");
-  pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle);
-  pMultiGraphRatio->Draw("A pmc plc");
 
-  // Histogram ratios to default
-  pPadDiff->cd();
-  auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff);
-  for (int iV = 0; iV < nVersions; ++iV) {
-    if (iV == iDef) {
-      continue;
-    }
-    auto* pDiff = static_cast<TH1*>(fvpObjects[iV]->Clone());
-    pDiff->SetDirectory(fpOutDir);
-    pDiff->Add(pDefault, -1.);
-    auto* pCopy = new TGraphAsymmErrors(pDiff);
-    pCopy->SetMarkerStyle(20);
-    pMultiGraphDiff->Add(pCopy, "P");
-    if (pDiff) {
-      delete pDiff;
-      pDiff = nullptr;
+  // Histogram differences to default
+  if (bDrawDiff) {
+    pPadDiff->cd();
+    auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff);
+    for (int iV = 0; iV < nVersions; ++iV) {
+      if (iV == iDef) {
+        continue;
+      }
+      auto* pDiff = static_cast<TH1*>(fvpObjects[iV]->Clone());
+      pDiff->SetDirectory(fpOutDir);
+      pDiff->Add(pDefault, -1.);
+      auto* pCopy = new TGraphAsymmErrors(pDiff);
+      pCopy->SetMarkerStyle(20);
+      pMultiGraphDiff->Add(pCopy, "P");
+      if (pDiff) {
+        delete pDiff;
+        pDiff = nullptr;
+      }
     }
+    pMultiGraphDiff->GetYaxis()->SetTitle("difference");
+    pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle);
+    pMultiGraphDiff->Draw("A pmc plc");
   }
-  pMultiGraphDiff->GetYaxis()->SetTitle("difference");
-  pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle);
-  pMultiGraphDiff->Draw("A pmc plc");
   fpCanvas->cd();
   pPadOrig->Draw();
-  pPadRatio->Draw();
-  pPadDiff->Draw();
+  if (pPadRatio) pPadRatio->Draw();
+  if (pPadDiff) pPadDiff->Draw();
 }
 
 // ---------------------------------------------------------------------------------------------------------------------
diff --git a/core/qa/checker/CbmQaCheckerHist1DHandler.h b/core/qa/checker/CbmQaCheckerHist1DHandler.h
index 9193f6e9f9c76ca60319e83db86b157352403d98..bef26ff20a4699a86f34cdca816ded510e3a789a 100644
--- a/core/qa/checker/CbmQaCheckerHist1DHandler.h
+++ b/core/qa/checker/CbmQaCheckerHist1DHandler.h
@@ -47,7 +47,8 @@ namespace cbm::qa::checker
     ~Hist1DHandler() = default;
 
     /// @brief Creates object comparison canvas
-    void CreateCanvases();
+    /// @param opt  Canvas options
+    void CreateCanvases(Option_t* opt = "") override;
 
     /// @brief Compares objects to default
     /// @param pNum    Pointer to "numerator" object
@@ -63,7 +64,7 @@ namespace cbm::qa::checker
     ///         1: Comparison based on the ratio deviation
     ///         2: Statistical test comparison with chi2-test
     ///         3: Statistical test comparison with Kolmogorov test
-    CmpResult_t Compare(const TNamed* pNum, const TNamed* pDenom) const;
+    CmpResult_t Compare(const TNamed* pNum, const TNamed* pDenom) const override;
 
    private:
     /// @brief Compares two histograms point-to-point
diff --git a/core/qa/checker/CbmQaCheckerHist2DHandler.cxx b/core/qa/checker/CbmQaCheckerHist2DHandler.cxx
index e0ee23f9c3ee9988fc34180161b1780d991f64e8..56e14b9a22bd4a1c6110d8b5daa5461630b3f601 100644
--- a/core/qa/checker/CbmQaCheckerHist2DHandler.cxx
+++ b/core/qa/checker/CbmQaCheckerHist2DHandler.cxx
@@ -9,8 +9,38 @@
 
 #include "CbmQaCheckerHist2DHandler.h"
 
+#include "TCanvas.h"
+#include "TH2.h"
+
 using cbm::qa::checker::Hist2DHandler;
 
 // ---------------------------------------------------------------------------------------------------------------------
 //
 Hist2DHandler::Hist2DHandler(int iObject, int iFile, int iDataset) : Hist1DHandler(iObject, iFile, iDataset) {}
+
+// ---------------------------------------------------------------------------------------------------------------------
+//
+void Hist2DHandler::CreateCanvases(Option_t*)
+{
+  std::string sCanvName = fsBaseName + "_cmp_canvas";
+
+  // Title definitions
+  const char* title      = fvpObjects[0]->GetTitle();
+  const char* xAxisTitle = static_cast<TH1*>(fvpObjects[0])->GetXaxis()->GetTitle();
+  const char* yAxisTitle = static_cast<TH1*>(fvpObjects[0])->GetYaxis()->GetTitle();
+  const char* zAxisTitle = static_cast<TH1*>(fvpObjects[0])->GetZaxis()->GetTitle();
+
+  int nVersions = fpObjDB->GetNofVersions();
+  fpCanvas      = std::make_shared<TCanvas>(sCanvName.data(), title, 1500, 700);
+  fpCanvas->DivideSquare(nVersions);
+  for (int iVer = 0; iVer < nVersions; ++iVer) {
+    fpCanvas->cd(iVer + 1);
+    gPad->SetMargin(0.20, 0.20, 0.20, 0.10);
+    auto* pCopy = static_cast<TH2*>(static_cast<TH2*>(fvpObjects[iVer])->Clone());
+    pCopy->SetTitle(Form("%s: %s", title, fpObjDB->GetVersionLabel(iVer).c_str()));
+    pCopy->GetXaxis()->SetTitle(xAxisTitle);
+    pCopy->GetYaxis()->SetTitle(yAxisTitle);
+    pCopy->GetZaxis()->SetTitle(zAxisTitle);
+    pCopy->Draw("colz");
+  }
+}
diff --git a/core/qa/checker/CbmQaCheckerHist2DHandler.h b/core/qa/checker/CbmQaCheckerHist2DHandler.h
index dbd6aaa73a5744492f05a8eecada63b756946ad1..8ee2ceeeee08bd619995602a19dead1dae69f33f 100644
--- a/core/qa/checker/CbmQaCheckerHist2DHandler.h
+++ b/core/qa/checker/CbmQaCheckerHist2DHandler.h
@@ -28,7 +28,8 @@ namespace cbm::qa::checker
     ~Hist2DHandler() = default;
 
     /// @brief Creates object comparison canvas
-    void CreateCanvases(){};
+    /// @param opt  Canvas options
+    void CreateCanvases(Option_t* opt = "") override;
   };
 }  // namespace cbm::qa::checker
 
diff --git a/core/qa/checker/CbmQaCheckerObjectHandler.cxx b/core/qa/checker/CbmQaCheckerObjectHandler.cxx
index e7feabf6602548bf63eaff706e465d88c29d0007..f28573caec5137e8c0b77482b8d1c29ce697bb50 100644
--- a/core/qa/checker/CbmQaCheckerObjectHandler.cxx
+++ b/core/qa/checker/CbmQaCheckerObjectHandler.cxx
@@ -9,8 +9,8 @@
 
 #include "CbmQaCheckerObjectHandler.h"
 
-#include "CbmQaCanvas.h"
 #include "Logger.h"
+#include "TCanvas.h"
 #include "TDirectory.h"
 #include "TNamed.h"
 
diff --git a/core/qa/checker/CbmQaCheckerObjectHandler.h b/core/qa/checker/CbmQaCheckerObjectHandler.h
index 7990060dea5a201d0f62ff9c0fc4bb019e87ff90..2d188b0bbedb1aae8e75bba85479e755b3df445c 100644
--- a/core/qa/checker/CbmQaCheckerObjectHandler.h
+++ b/core/qa/checker/CbmQaCheckerObjectHandler.h
@@ -21,7 +21,6 @@ class TDirectory;
 class TNamed;
 class TObject;
 class TCanvas;
-class CbmQaCanvas;
 
 namespace cbm::qa::checker
 {
@@ -47,7 +46,8 @@ namespace cbm::qa::checker
     void AddObjects(const std::vector<TNamed*>& vpObj);
 
     /// @brief Creates object comparison canvas
-    virtual void CreateCanvases(){};
+    /// @param opt  Canvas options
+    virtual void CreateCanvases(Option_t*){};
 
     /// @brief Compares two objects with different methods
     /// @param pNum    Pointer to "numerator" object
@@ -89,7 +89,7 @@ namespace cbm::qa::checker
     int fVerbose                          = 0;         ///< Verbosity level
     TDirectory* fpOutDir                  = nullptr;   ///< Pointer to directory
     std::shared_ptr<ObjectDB> fpObjDB     = nullptr;   ///< Pointer to object database
-    std::shared_ptr<CbmQaCanvas> fpCanvas = nullptr;   ///< Comparison canvas
+    std::shared_ptr<TCanvas> fpCanvas     = nullptr;   ///< Comparison canvas
     std::bitset<sizeof(CmpResult_t) * 8> fOptionBits;  ///< Bitset for option
 
     std::string fsObjType  = "";      ///< Base type of the object to be handled
diff --git a/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx b/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx
index 683c751229018966fd42ab9688214c3e51b0f92f..2d861ad7f4b2b6f43812a85c3b741951de0a7dfe 100644
--- a/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx
+++ b/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx
@@ -9,7 +9,6 @@
 
 #include "CbmQaCheckerProfile1DHandler.h"
 
-#include "CbmQaCanvas.h"
 #include "CbmQaCheckerHist1DHandler.h"
 #include "CbmQaCheckerTypedefs.h"
 #include "Logger.h"
@@ -35,24 +34,51 @@ Profile1DHandler::Profile1DHandler(int iObject, int iFile, int iDataset) : Hist1
 
 // ---------------------------------------------------------------------------------------------------------------------
 //
-void Profile1DHandler::CreateCanvases()
+void Profile1DHandler::CreateCanvases(Option_t* opt)
 {
   int nVersions = fpObjDB->GetNofVersions();
   int iDef      = fpObjDB->GetDefaultID();
 
+  // ----- Option parsing
+  std::string sOption = opt;
+  for (auto& ch : sOption) {
+    ch = std::tolower(ch);
+  }
+  bool bDrawRatio = sOption.find("r") != std::string::npos;
+  bool bDrawDiff  = sOption.find("d") != std::string::npos;
+  int nPads       = static_cast<int>(bDrawRatio) + static_cast<int>(bDrawDiff) + 1;
+
   // ----- Canvas: comparison of original histograms, ratios and subtractions
   std::string sCanvName  = fsBaseName + "_cmp_canvas";
   std::string sCanvTitle = "Comparison result for \"" + fsBaseName + "\"";
-  fpCanvas               = std::make_shared<CbmQaCanvas>(sCanvName.data(), sCanvTitle.data(), 1500, 500);
+  fpCanvas               = std::make_shared<TCanvas>(sCanvName.data(), sCanvTitle.data(), 1500, 500);
   fpCanvas->cd();
-  auto* pPadOrig = new TPad("p1", "p1", 0.0, 0.0, 0.3333, 1.0);
+
+  TPad* pPadOrig  = nullptr;
+  TPad* pPadRatio = nullptr;
+  TPad* pPadDiff  = nullptr;
+
+  double xPadSize = 1.0 / nPads;
+  double xNext    = 0.;
+
+  pPadOrig = new TPad("p1", "p1", 0.0, 0.0, xPadSize, 1.0);
   pPadOrig->SetMargin(0.20, 0.05, 0.20, 0.10);
   fpCanvas->cd();
-  auto* pPadRatio = new TPad("p2", "p2", 0.3333, 0.0, 0.6666, 1.0);
-  pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10);
-  fpCanvas->cd();
-  auto* pPadDiff = new TPad("p3", "p3", 0.6666, 0.0, 1.0, 1.0);
-  pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10);
+  xNext += xPadSize;
+
+  if (bDrawRatio) {
+    pPadRatio = new TPad("p2", "p2", xNext, 0.0, xNext + xPadSize, 1.0);
+    pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10);
+    fpCanvas->cd();
+    xNext += xPadSize;
+  }
+
+  if (bDrawDiff) {
+    pPadDiff = new TPad("p3", "p3", xNext, 0.0, xNext + xPadSize, 1.0);
+    pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10);
+    fpCanvas->cd();
+    xNext += xPadSize;
+  }
 
   const char* title      = fvpObjects[0]->GetTitle();
   const char* titleRatio = Form("Ratio to %s", fpObjDB->GetVersionLabel(iDef).data());
@@ -79,55 +105,60 @@ void Profile1DHandler::CreateCanvases()
   auto* pDefault = static_cast<TProfile*>(fvpObjects[iDef])->ProjectionX();
 
   // Histogram ratios to default
-  pPadRatio->cd();
-  auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio);
-  for (int iV = 0; iV < nVersions; ++iV) {
-    if (iV == iDef) {
-      continue;
-    }
-    auto* pRatio        = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX();
-    auto currErrorLevel = gErrorIgnoreLevel;
-    gErrorIgnoreLevel   = kError;
-    auto* pCopy         = new TGraphAsymmErrors(pRatio, pDefault, "pois");
-    gErrorIgnoreLevel   = currErrorLevel;
-    pCopy->SetMarkerStyle(20);
-    pMultiGraphRatio->Add(pCopy, "P");
-
-    if (pRatio) {
-      delete pRatio;
-      pRatio = nullptr;
+  if (bDrawRatio) {
+    pPadRatio->cd();
+    auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio);
+    for (int iV = 0; iV < nVersions; ++iV) {
+      if (iV == iDef) {
+        continue;
+      }
+      auto* pRatio        = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX();
+      auto currErrorLevel = gErrorIgnoreLevel;
+      gErrorIgnoreLevel   = kError;
+      auto* pCopy         = new TGraphAsymmErrors(pRatio, pDefault, "pois");
+      gErrorIgnoreLevel   = currErrorLevel;
+      pCopy->SetMarkerStyle(20);
+      pMultiGraphRatio->Add(pCopy, "P");
+
+      if (pRatio) {
+        delete pRatio;
+        pRatio = nullptr;
+      }
     }
+    pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle);
+    pMultiGraphRatio->GetYaxis()->SetTitle("ratio");
+    pMultiGraphRatio->Draw("A pmc plc");
   }
-  pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle);
-  pMultiGraphRatio->GetYaxis()->SetTitle("ratio");
-  pMultiGraphRatio->Draw("A pmc plc");
 
   // Histogram ratios to default
-  pPadDiff->cd();
-  auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff);
-  for (int iV = 0; iV < nVersions; ++iV) {
-    if (iV == iDef) {
-      continue;
-    }
-    auto* pDiff = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX();
-    pDiff->Add(pDefault, -1.);
-    auto* pCopy = new TGraphAsymmErrors(pDiff);
-    pCopy->GetYaxis()->SetTitle("difference");
-    pCopy->SetMarkerStyle(20);
-    pMultiGraphDiff->Add(pCopy, "P");
-
-    if (pDiff) {
-      delete pDiff;
-      pDiff = nullptr;
+  if (bDrawDiff) {
+    pPadDiff->cd();
+    auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff);
+    for (int iV = 0; iV < nVersions; ++iV) {
+      if (iV == iDef) {
+        continue;
+      }
+      auto* pDiff = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX();
+      pDiff->Add(pDefault, -1.);
+      auto* pCopy = new TGraphAsymmErrors(pDiff);
+      pCopy->GetYaxis()->SetTitle("difference");
+      pCopy->SetMarkerStyle(20);
+      pMultiGraphDiff->Add(pCopy, "P");
+
+      if (pDiff) {
+        delete pDiff;
+        pDiff = nullptr;
+      }
     }
+    pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle);
+    pMultiGraphDiff->GetYaxis()->SetTitle("difference");
+    pMultiGraphDiff->Draw("A pmc plc");
   }
-  pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle);
-  pMultiGraphDiff->GetYaxis()->SetTitle("difference");
-  pMultiGraphDiff->Draw("A pmc plc");
+
   fpCanvas->cd();
   pPadOrig->Draw();
-  pPadRatio->Draw();
-  pPadDiff->Draw();
+  if (pPadRatio) pPadRatio->Draw();
+  if (pPadDiff) pPadDiff->Draw();
 
   if (pDefault) {
     delete pDefault;
diff --git a/core/qa/checker/CbmQaCheckerProfile1DHandler.h b/core/qa/checker/CbmQaCheckerProfile1DHandler.h
index 7a2de22d8cbbeb4b8e6389ecf38fcd4c556cb6c8..b962569886bfc94f6d04475be0f1a2b20f874ae2 100644
--- a/core/qa/checker/CbmQaCheckerProfile1DHandler.h
+++ b/core/qa/checker/CbmQaCheckerProfile1DHandler.h
@@ -28,7 +28,8 @@ namespace cbm::qa::checker
     ~Profile1DHandler() = default;
 
     /// @brief Creates object comparison canvas
-    void CreateCanvases();
+    /// @param opt  Options
+    void CreateCanvases(Option_t* opt = "") override;
   };
 }  // namespace cbm::qa::checker
 
diff --git a/macro/qa/qa_compare_ca.C b/macro/qa/qa_compare_ca.C
index 3bc59effd5b419a213df06a3f32c8ef16d909923..00c65783e164affe5b685c9f1a88e92f2e3a528d 100644
--- a/macro/qa/qa_compare_ca.C
+++ b/macro/qa/qa_compare_ca.C
@@ -36,7 +36,7 @@ int qa_compare_ca(
   pQaChecker->SetFromYAML(configName);      // Read file-object map
 
   //// ----- Run comparision routine
-  pQaChecker->Process("P");
+  pQaChecker->Process("PR");  // P -
 
   //// ----- Scan results
   bool res = pQaChecker->Scan();  // true - objects are the same, false - objects differ