diff --git a/reco/detectors/trd/qa/CbmTrdQa.cxx b/reco/detectors/trd/qa/CbmTrdQa.cxx
index 02b757ecd966f892aada45214b5de34cba35b74a..dc4ce9e17e40f888fa307ff253f9d1ade6057570 100644
--- a/reco/detectors/trd/qa/CbmTrdQa.cxx
+++ b/reco/detectors/trd/qa/CbmTrdQa.cxx
@@ -48,16 +48,21 @@
 #include "CbmTrdRadiator.h"
 #include "CbmTrdUtils.h"
 
-using std::cin;
 using std::cout;
 using std::endl;
 using std::fabs;
-using std::pair;
+
 
 CbmTrdQa::CbmTrdQa(CbmTrdRadiator* radiator) : CbmTrdQa("TrdQa", "", "", 1e-6, radiator) {}
 
-CbmTrdQa::CbmTrdQa(const char* /*name*/, const char* /*title*/, const char* geo, Double_t triggerThreshold,
+CbmTrdQa::CbmTrdQa(const char* name, const char* title, const char* geo, Double_t triggerThreshold,
                    CbmTrdRadiator* radiator)
+  : CbmTrdQa(name, title, geo, triggerThreshold, std::make_shared<CbmTrdRadiator>(radiator)) {};
+
+CbmTrdQa::CbmTrdQa(std::shared_ptr<CbmTrdRadiator> radiator) : CbmTrdQa("TrdQa", "", "", 1e-6, radiator) {}
+
+CbmTrdQa::CbmTrdQa(const char* /*name*/, const char* /*title*/, const char* geo, Double_t triggerThreshold,
+                   std::shared_ptr<CbmTrdRadiator> radiator)
   : FairTask("TrdQa")
   , fMCTracks(NULL)
   , fPoints(NULL)
diff --git a/reco/detectors/trd/qa/CbmTrdQa.h b/reco/detectors/trd/qa/CbmTrdQa.h
index 70e66fc129d789ad5722c35f41013402afcdc236..e432b42b5a38c7ad973d1b58afb1a2d28a7c6093 100644
--- a/reco/detectors/trd/qa/CbmTrdQa.h
+++ b/reco/detectors/trd/qa/CbmTrdQa.h
@@ -28,9 +28,11 @@ class TPolyLine;
 class CbmTrdQa : public FairTask {
 
 public:
-  CbmTrdQa(CbmTrdRadiator* radiator = NULL);
+  CbmTrdQa(std::shared_ptr<CbmTrdRadiator> radiator = nullptr);
+  CbmTrdQa(CbmTrdRadiator* radiator);
   CbmTrdQa(const char* name, const char* title = "CBM Task", const char* geo = "", Double_t triggerThreshold = 1.0e-6,
-           CbmTrdRadiator* radiator = NULL);
+           std::shared_ptr<CbmTrdRadiator> radiator = nullptr);
+  CbmTrdQa(const char* name, const char* title, const char* geo, Double_t triggerThreshold, CbmTrdRadiator* radiator);
   virtual ~CbmTrdQa();
   virtual InitStatus ReInit();
   virtual InitStatus Init();
@@ -184,7 +186,7 @@ private:
   TH2I* fPRF_2D;
   //LayerView
 
-  CbmTrdRadiator* fRadiator;
+  std::shared_ptr<CbmTrdRadiator> fRadiator = nullptr;
 
   ClassDef(CbmTrdQa, 1);
 };
diff --git a/sim/detectors/trd/CbmTrdDigitizer.cxx b/sim/detectors/trd/CbmTrdDigitizer.cxx
index 7e1052fd8e54bdc6642922da76a4fcbcf4e9271c..60af95270052bf63e25f9d2c05c3aaeb1b1f8388 100644
--- a/sim/detectors/trd/CbmTrdDigitizer.cxx
+++ b/sim/detectors/trd/CbmTrdDigitizer.cxx
@@ -43,20 +43,18 @@
 
 #include <iomanip>
 #include <iostream>
+#include <memory>
 
 #include <cmath>
-using std::cout;
-using std::endl;
-using std::make_pair;
+
 using std::map;
-using std::max;
 using std::pair;
-using std::vector;
+using std::shared_ptr;
 using namespace std;
 Int_t CbmTrdDigitizer::fConfig = 0;
 
 //________________________________________________________________________________________
-CbmTrdDigitizer::CbmTrdDigitizer(CbmTrdRadiator* radiator)
+CbmTrdDigitizer::CbmTrdDigitizer(shared_ptr<CbmTrdRadiator> radiator)
   : CbmDigitize<CbmTrdDigi>("TrdDigitize")
   , fLastEventTime(0)
   , fpoints(0)
@@ -79,9 +77,13 @@ CbmTrdDigitizer::CbmTrdDigitizer(CbmTrdRadiator* radiator)
   , fModuleMap()
   , fDigiMap()
 {
-  if (fRadiator == NULL) fRadiator = new CbmTrdRadiator(kTRUE, "tdr18");
+  if (fRadiator == NULL) fRadiator = make_shared<CbmTrdRadiator>(kTRUE, "tdr18");
 }
 
+//________________________________________________________________________________________
+CbmTrdDigitizer::CbmTrdDigitizer(CbmTrdRadiator* radiator)
+  : CbmTrdDigitizer(std::make_shared<CbmTrdRadiator>(radiator)) {};
+
 
 //________________________________________________________________________________________
 CbmTrdDigitizer::~CbmTrdDigitizer()
@@ -93,7 +95,6 @@ CbmTrdDigitizer::~CbmTrdDigitizer()
     delete imod->second;
   fModuleMap.clear();
 
-  // if (fRadiator2D) delete fRadiator2D;
   delete fConverter;
   delete fQA;
 }
@@ -330,7 +331,7 @@ CbmTrdModuleSim* CbmTrdDigitizer::AddModule(Int_t detId)
         //     0.0025, // polyethylen sheets of 50 µm thickness
         //     1.2e-3, // 12 µm aluminized polyester foil
         //   };  pwidth = widths;
-        fRadiator2D = new CbmTrdRadiator(kTRUE, "tdr18", ewin);
+        fRadiator2D = make_shared<CbmTrdRadiator>(kTRUE, "tdr18", ewin);
         fRadiator2D->SetEWwidths(5, widths);
         fRadiator2D->Init();
       }
diff --git a/sim/detectors/trd/CbmTrdDigitizer.h b/sim/detectors/trd/CbmTrdDigitizer.h
index a4fe73831613a95504eb92c7221bac6c84d9c124..99c68c9d399ce75b89c6be825f2c727a1452f3e1 100644
--- a/sim/detectors/trd/CbmTrdDigitizer.h
+++ b/sim/detectors/trd/CbmTrdDigitizer.h
@@ -22,6 +22,7 @@
 #include "CbmTrdRawToDigiR.h"
 
 #include <map>
+#include <memory>
 
 class TClonesArray;
 
@@ -52,7 +53,14 @@ public:
   * \brief Constructor.
   * \param[in] radiator TRD radiator to be used in digitization.
   */
-  CbmTrdDigitizer(CbmTrdRadiator* radiator = NULL);
+  CbmTrdDigitizer(std::shared_ptr<CbmTrdRadiator> radiator = nullptr);
+
+  /**
+  * \brief Constructor.
+  * \param[in] radiator TRD radiator to be used in digitization.
+  * @remark This is needed for backward compatibility with macros not using smart pointers.
+  */
+  CbmTrdDigitizer(CbmTrdRadiator* radiator);
 
   /**
   * \brief Destructor.
@@ -137,8 +145,10 @@ private:
   CbmTrdParSetDigi* fDigiPar;  ///< parameter list for read-out geometry
   CbmTrdParSetGain* fGainPar;  ///< parameter list for keV->ADC gain conversion
   CbmTrdParSetGeo* fGeoPar;    ///< parameter list for geometry definitions
-  CbmTrdRadiator* fRadiator;   ///< parametrization of radiator TR yield
-  CbmTrdRadiator* fRadiator2D;  ///< parametrization of 2D radiator TR yield
+  /** @brief parametrization of radiator TR yield */
+  std::shared_ptr<CbmTrdRadiator> fRadiator = nullptr;
+  /** @brief parametrization of 2D radiator TR yield */
+  std::shared_ptr<CbmTrdRadiator> fRadiator2D = nullptr;
 
   CbmTrdRawToDigiR* fConverter;
   CbmTrdCheckUtil* fQA;
diff --git a/sim/detectors/trd/CbmTrdModuleSim.h b/sim/detectors/trd/CbmTrdModuleSim.h
index 1cfb020172c5fd8c886959b77c2e7963fcf248e8..478adae7c61a2674e479e346eb703e06d647569c 100644
--- a/sim/detectors/trd/CbmTrdModuleSim.h
+++ b/sim/detectors/trd/CbmTrdModuleSim.h
@@ -10,6 +10,7 @@
 #include "CbmTrdRawToDigiR.h"
 
 #include <map>
+#include <memory>
 
 class TClonesArray;
 class CbmTrdPoint;
@@ -72,8 +73,9 @@ public:
   virtual void SetEventId(Int_t id) { fEventId = id; }
   virtual void SetInputId(Int_t id) { fInputId = id; }
   virtual void SetPointId(Int_t id) { fPointId = id; }
-  virtual void SetRadiator(CbmTrdRadiator* radiator = NULL) = 0;
-  virtual void SetGamma(Double_t gamma = 0.)                = 0;
+  /** @brief Set the Radiator @param radiator Defintion of the radiator to be used for this module */
+  virtual void SetRadiator(std::shared_ptr<CbmTrdRadiator> radiator) { fRadiator = radiator; }
+  virtual void SetGamma(Double_t gamma = 0.) = 0;
   virtual void SetPositionMC(Double_t pos[3]) { memcpy(fXYZ, pos, 3 * sizeof(Double_t)); }
   virtual void SetLinkId(Int_t input, Int_t event = -1, Int_t point = -1)
   {
@@ -94,7 +96,8 @@ protected:
   CbmTrdDigitizer* fDigitizer;  //! Pointer to digitizer
 
   // calibration objects
-  CbmTrdRadiator* fRadiator;  ///< TR description for radiator
+  /** @brief TR description for radiator */
+  std::shared_ptr<CbmTrdRadiator> fRadiator = nullptr;
 
   std::map<Int_t, std::pair<CbmTrdDigi*, CbmMatch*>>
     fDigiMap;  ///< Temporary storage for complete digis for each CBM address.
diff --git a/sim/detectors/trd/CbmTrdModuleSimR.h b/sim/detectors/trd/CbmTrdModuleSimR.h
index 82b45a2b88f1308f4fa2e0b72b39047aec4a14b9..720b7ed5edb33350279ad85f808f2882d8f69787 100644
--- a/sim/detectors/trd/CbmTrdModuleSimR.h
+++ b/sim/detectors/trd/CbmTrdModuleSimR.h
@@ -42,7 +42,6 @@ public:
   void SetSpadicResponse(Double_t calibration, Double_t tau);
   void SetPulsePars(Int_t mode);
   void SetPulseMode(Bool_t pulsed);
-  void SetRadiator(CbmTrdRadiator* radiator) { fRadiator = radiator; }
   void SetGamma(Double_t gamma) { fGamma = gamma; }
   void SetTriggerThreshold(Double_t minCharge) { fMinimumChargeTH = minCharge; }
   void SetPadPlaneScanArea(Int_t row);
diff --git a/sim/detectors/trd/CbmTrdModuleSimT.h b/sim/detectors/trd/CbmTrdModuleSimT.h
index 48013813ab01e73672fef7880299407a5aacc8d2..7224d7e653e8d73bcde0ad85cb1c2885fd856ef7 100644
--- a/sim/detectors/trd/CbmTrdModuleSimT.h
+++ b/sim/detectors/trd/CbmTrdModuleSimT.h
@@ -47,7 +47,6 @@ public:
    **/
   Bool_t MakeDigi(CbmTrdPoint* p, Double_t time, Bool_t TR);
   Bool_t MakeRaw(/*CbmTrdPoint *p*/) { return kTRUE; }
-  void SetRadiator(CbmTrdRadiator* radiator) { fRadiator = radiator; }
   void SetGamma(Double_t /*gamma*/) { ; }
   void SetMessageConverter(CbmTrdRawToDigiR* conv = NULL) { (void) conv; }
   void SetQA(CbmTrdCheckUtil* qa = NULL) { (void) qa; }