diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py b/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py
index d9a225b90343c5549056e169aa45624ea30f7b52..af8466ecde171792f541dc99344b0099bc590d0c 100644
--- a/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py
+++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py
@@ -32,6 +32,9 @@ NSWPRDValAlg.doSTGCFastDigit = False
 NSWPRDValAlg.doRPCHit = True
 NSWPRDValAlg.doRPCDigit = True
 
+NSWPRDValAlg.doMDTHit = True
+NSWPRDValAlg.doMDTDigit = True
+
 #-----------------------------------------------------------------------------
 # save ROOT histograms and Tuple
 #-----------------------------------------------------------------------------
diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.cxx b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..1860bfd0f704ef83fc1f6389e742d2aab5ad75dc
--- /dev/null
+++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.cxx
@@ -0,0 +1,166 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "MDTDigitVariables.h"
+#include "AthenaKernel/errorcheck.h"
+
+#include "MuonDigitContainer/MdtDigitContainer.h"
+#include "MuonDigitContainer/MdtDigit.h"
+
+#include "MuonReadoutGeometry/MdtReadoutElement.h"
+
+#include "MuonDigitContainer/MdtDigitCollection.h"
+
+#include "TTree.h"
+/** ---------- filling of variables */
+/** ---------- to be called on each evt i.e. execute level of main alg */
+StatusCode MdtDigitVariables::fillVariables(const MuonGM::MuonDetectorManager* MuonDetMgr)
+{
+  ATH_MSG_DEBUG(" do fillMdtDigitVariables()");
+  CHECK( this->clearVariables() );
+
+  const MdtDigitContainer* MdtDigitContainer = nullptr;
+  CHECK( m_evtStore->retrieve(MdtDigitContainer, m_ContainerName.c_str()) );
+
+  ATH_MSG_DEBUG("retrieved MDT Digit Container with size "<<MdtDigitContainer->digit_size());
+
+  if(MdtDigitContainer->size()==0) ATH_MSG_DEBUG(" MDT Digit Continer empty ");
+  for(const MdtDigitCollection* coll : *MdtDigitContainer) {
+    ATH_MSG_DEBUG( "processing collection with size " << coll->size() );
+    for (unsigned int digitNum=0; digitNum<coll->size(); digitNum++) {
+      const MdtDigit* digit = coll->at(digitNum);
+      Identifier Id = digit->identify();
+
+      std::string stName   = m_MdtIdHelper->stationNameString(m_MdtIdHelper->stationName(Id));
+      int stationEta       = m_MdtIdHelper->stationEta(Id);
+      int stationPhi       = m_MdtIdHelper->stationPhi(Id);
+      int multiplet        = m_MdtIdHelper->multilayer(Id);
+      int channel          = m_MdtIdHelper->channel(Id);
+      int stationEtaMin    = m_MdtIdHelper->stationEtaMin(Id);
+      int stationEtaMax    = m_MdtIdHelper->stationEtaMax(Id);
+      int stationPhiMin    = m_MdtIdHelper->stationPhiMin(Id);
+      int stationPhiMax    = m_MdtIdHelper->stationPhiMax(Id);
+      int NofMultilayers   = m_MdtIdHelper->numberOfMultilayers(Id);
+      int multilayerMin    = m_MdtIdHelper->multilayerMin(Id);
+      int multilayerMax    = m_MdtIdHelper->multilayerMax(Id);
+      int tubeLayerMin     = m_MdtIdHelper->tubeLayerMin(Id);
+      int tubeLayerMax     = m_MdtIdHelper->tubeLayerMax(Id);
+      int tubeMin          = m_MdtIdHelper->tubeMin(Id);
+      int tubeMax          = m_MdtIdHelper->tubeMax(Id);
+
+      ATH_MSG_DEBUG(     "MDT Digit Offline id:  Station Name [" << stName << " ]"
+                         << " Station Eta ["  << stationEta      << "]"
+                         << " Station Phi ["  << stationPhi      << "]"
+                         << " Multiplet  ["   << multiplet       << "]"
+                         << " ChNr ["         << channel         << "]"
+                         << " Station EtaMin ["  << stationEtaMin      << "]"
+                         << " Station EtaMax ["  << stationEtaMax      << "]"
+                         << " Station PhiMin ["  << stationPhiMin      << "]"
+                         << " Station PhiMax ["  << stationPhiMax      << "]");
+
+      const MuonGM::MdtReadoutElement* rdoEl = MuonDetMgr->getMdtReadoutElement(Id);
+      if (!rdoEl) return StatusCode::FAILURE;
+
+      Amg::Vector3D gpos(0.,0.,0.);
+      Amg::Vector2D lpos(0.,0.);
+
+      rdoEl->surface(Id).localToGlobal(lpos, gpos,gpos);
+      
+      m_MDT_dig_localPosX.push_back( lpos.x() );
+      m_MDT_dig_localPosY.push_back( lpos.y() );
+      m_MDT_dig_globalPosX.push_back( gpos.x() );
+      m_MDT_dig_globalPosY.push_back( gpos.y() );
+      m_MDT_dig_globalPosZ.push_back( gpos.z() );
+      
+      m_MDT_dig_stationName.push_back(stName);
+      m_MDT_dig_stationEta.push_back(stationEta);
+      m_MDT_dig_stationPhi.push_back(stationPhi);
+      m_MDT_dig_multiplet.push_back(multiplet);
+      m_MDT_dig_channel.push_back(channel);
+      m_MDT_dig_stationEtaMin.push_back(stationEtaMin);
+      m_MDT_dig_stationEtaMax.push_back(stationEtaMax);
+      m_MDT_dig_stationPhiMin.push_back(stationPhiMin);
+      m_MDT_dig_stationPhiMax.push_back(stationPhiMax);
+      m_MDT_dig_numberOfMultilayers.push_back(NofMultilayers);
+      m_MDT_dig_multilayerMin.push_back(multilayerMin);
+      m_MDT_dig_multilayerMax.push_back(multilayerMax);
+      m_MDT_dig_tubeLayerMin.push_back(tubeLayerMin);
+      m_MDT_dig_tubeLayerMax.push_back(tubeLayerMax);
+      m_MDT_dig_tubeMin.push_back(tubeMin);
+      m_MDT_dig_tubeMax.push_back(tubeMax);
+      
+      m_MDT_nDigits++;
+    }
+  }
+  ATH_MSG_DEBUG(" finished fillMdtDigitVariables()");
+  return StatusCode::SUCCESS;
+}
+
+/** ---------- clearing of variables */
+/** ---------- to be called inside filling method before filling starts */
+StatusCode MdtDigitVariables::clearVariables()
+{
+  m_MDT_nDigits = 0;
+  m_MDT_dig_stationName.clear();
+  m_MDT_dig_stationEta.clear();
+  m_MDT_dig_stationPhi.clear();
+  m_MDT_dig_multiplet.clear();
+  m_MDT_dig_channel.clear();
+  m_MDT_dig_stationEtaMin.clear();
+  m_MDT_dig_stationEtaMax.clear();
+  m_MDT_dig_stationPhiMin.clear();
+  m_MDT_dig_stationPhiMax.clear();
+  m_MDT_dig_numberOfMultilayers.clear();
+  m_MDT_dig_multilayerMin.clear();
+  m_MDT_dig_multilayerMax.clear();
+  m_MDT_dig_tubeLayerMin.clear();
+  m_MDT_dig_tubeLayerMax.clear();
+  m_MDT_dig_tubeMin.clear();
+  m_MDT_dig_tubeMax.clear(); 
+  m_MDT_dig_channelPosX.clear();
+  m_MDT_dig_channelPosY.clear();
+  m_MDT_dig_localPosX.clear();
+  m_MDT_dig_localPosY.clear();
+  m_MDT_dig_globalPosX.clear();
+  m_MDT_dig_globalPosY.clear();
+  m_MDT_dig_globalPosZ.clear();
+
+  return StatusCode::SUCCESS;
+}
+
+/** ---------- creating variables and associate them to branches */
+/** ---------- to be called on initialization level of main alg */
+StatusCode MdtDigitVariables::initializeVariables()
+{
+
+  if(m_tree) {
+    ATH_MSG_DEBUG("MDT digit:  init m_tree ");
+    m_tree->Branch("Digits_MDT",              &m_MDT_nDigits, "Digits_MDT_n/i");
+    m_tree->Branch("Digits_MDT_stationName", &m_MDT_dig_stationName);
+    m_tree->Branch("Digits_MDT_stationEta",  &m_MDT_dig_stationEta);
+    m_tree->Branch("Digits_MDT_stationPhi",  &m_MDT_dig_stationPhi);
+    m_tree->Branch("Digits_MDT_stationEtaMin",  &m_MDT_dig_stationEtaMin);
+    m_tree->Branch("Digits_MDT_stationEtaMax",  &m_MDT_dig_stationEtaMax);
+    m_tree->Branch("Digits_MDT_stationPhiMin",  &m_MDT_dig_stationPhiMin);
+    m_tree->Branch("Digits_MDT_stationPhiMax",  &m_MDT_dig_stationPhiMax);
+    m_tree->Branch("Digits_MDT_numberOfMultilayers",  &m_MDT_dig_numberOfMultilayers);
+    m_tree->Branch("Digits_MDT_multilayerMin",  &m_MDT_dig_multilayerMin);
+    m_tree->Branch("Digits_MDT_multilayerMax",  &m_MDT_dig_multilayerMax);
+    
+    m_tree->Branch("Digits_MDT_tubeLayerMin",  &m_MDT_dig_tubeLayerMin);
+    m_tree->Branch("Digits_MDT_tubeLayerMax",  &m_MDT_dig_tubeLayerMax);
+    m_tree->Branch("Digits_MDT_tubeMin",  &m_MDT_dig_tubeMin);
+    m_tree->Branch("Digits_MDT_tubeMax",  &m_MDT_dig_tubeMax);
+    
+    m_tree->Branch("Digits_MDT_channelPosX",  &m_MDT_dig_channelPosX);
+    m_tree->Branch("Digits_MDT_channelPosY",  &m_MDT_dig_channelPosY);
+    m_tree->Branch("Digits_MDT_localPosX", &m_MDT_dig_localPosX);
+    m_tree->Branch("Digits_MDT_localPosY", &m_MDT_dig_localPosY);
+    m_tree->Branch("Digits_MDT_globalPosX", &m_MDT_dig_globalPosX);
+    m_tree->Branch("Digits_MDT_globalPosY",  &m_MDT_dig_globalPosY);
+    m_tree->Branch("Digits_MDT_globalPosZ",  &m_MDT_dig_globalPosZ);
+  }
+
+  return StatusCode::SUCCESS;
+}
diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.h b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.h
new file mode 100644
index 0000000000000000000000000000000000000000..4b1019e8fe50c4becb04f164e679193c1b5d3494
--- /dev/null
+++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.h
@@ -0,0 +1,74 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef MuonPRDTEST_MDTDigitVARIABLES_H
+#define MuonPRDTEST_MDTDigitVARIABLES_H
+
+#include "ValAlgVariables.h"
+#include "MuonIdHelpers/MdtIdHelper.h"
+#include "AthenaBaseComps/AthMsgStreamMacros.h"
+#include <vector>
+
+class MdtDigitVariables : public ValAlgVariables
+{
+ public:
+  MdtDigitVariables(StoreGateSvc* evtStore,
+                     const MuonGM::MuonDetectorManager* detManager,
+                     const MuonIdHelper* idhelper,
+                     TTree* tree,
+							std::string containername,
+							MSG::Level msglvl) :
+    ValAlgVariables(evtStore, detManager, tree, containername, msglvl)
+  {
+    setHelper(idhelper);
+  }
+
+  ~MdtDigitVariables() = default;
+
+  StatusCode initializeVariables();
+  StatusCode fillVariables(const MuonGM::MuonDetectorManager* MuonDetMgr);
+
+ private:
+
+  void setHelper(const MuonIdHelper* idhelper){
+    m_MdtIdHelper = dynamic_cast<const MdtIdHelper*>(idhelper);
+    if (!m_MdtIdHelper){
+     throw std::runtime_error("Could not cast the MDTIdHelper");
+    }
+  }
+  
+  void deleteVariables(){};
+  StatusCode clearVariables();
+  
+  const MdtIdHelper* m_MdtIdHelper;
+
+  int m_MDT_nDigits;
+  std::vector<std::string> m_MDT_dig_stationName;
+  std::vector<int> m_MDT_dig_stationEta;
+  std::vector<int> m_MDT_dig_stationPhi;
+  std::vector<int> m_MDT_dig_multiplet;
+  std::vector<int> m_MDT_dig_channel;
+  std::vector<int> m_MDT_dig_stationEtaMin;
+  std::vector<int> m_MDT_dig_stationEtaMax;
+  std::vector<int> m_MDT_dig_stationPhiMin;
+  std::vector<int> m_MDT_dig_stationPhiMax;
+  std::vector<int> m_MDT_dig_numberOfMultilayers;
+  std::vector<int> m_MDT_dig_multilayerMin;
+  std::vector<int> m_MDT_dig_multilayerMax;
+  std::vector<int> m_MDT_dig_tubeLayerMin;
+  std::vector<int> m_MDT_dig_tubeLayerMax;
+  std::vector<int> m_MDT_dig_tubeMin;
+  std::vector<int> m_MDT_dig_tubeMax; 
+  std::vector<int> m_MDT_dig_channelNumber;
+  
+  std::vector< double > m_MDT_dig_channelPosX;
+  std::vector< double > m_MDT_dig_channelPosY;
+  std::vector< double > m_MDT_dig_localPosX;
+  std::vector< double > m_MDT_dig_localPosY;
+  std::vector< double > m_MDT_dig_globalPosX;
+  std::vector< double > m_MDT_dig_globalPosY;
+  std::vector< double > m_MDT_dig_globalPosZ;
+};
+
+#endif // MuonPRDTEST_MDTDigitVARIABLES_H
diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx
index 5bb4624c49205691ba93c157aadedf7e50c1e59a..9392fbdb5c653b5be3ebdf5e8daa27c6df0ab837 100644
--- a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx
@@ -9,6 +9,7 @@
 
 #include "MMDigitVariables.h"
 #include "MMSimHitVariables.h"
+#include "MDTDigitVariables.h"
 #include "MDTSimHitVariables.h"
 #include "RPCDigitVariables.h"
 #include "RPCSimHitVariables.h"
@@ -61,7 +62,9 @@ NSWPRDValAlg::NSWPRDValAlg(const std::string& name, ISvcLocator* pSvcLocator)
     m_MmPrdVar(nullptr),
     m_CscDigitVar(nullptr),
     m_MDTSimHitVar(nullptr),
+    m_MDTDigitVar(nullptr),
     m_RPCSimHitVar(nullptr),
+    m_RPCDigitVar(nullptr),
     m_CSCSimHitVar(nullptr),
     m_TGCSimHitVar(nullptr),
     m_thistSvc(nullptr),
@@ -84,6 +87,7 @@ NSWPRDValAlg::NSWPRDValAlg(const std::string& name, ISvcLocator* pSvcLocator)
   declareProperty("NSWMM_PRDContainerName",         m_NSWMM_PRDContainerName="MM_Measurements");
   declareProperty("CSC_DigitContainerName",         m_CSC_DigitContainerName="CSC_DIGITS");
   declareProperty("MDT_SimContainerName",           m_MDT_SimContainerName="MDT_Hits");
+  declareProperty("MDT_DigitContainerName",         m_MDT_DigitContainerName="MDT_DIGITS");
   declareProperty("RPC_SimContainerName",           m_RPC_SimContainerName="RPC_Hits");
   declareProperty("RPC_DigitContainerName",         m_RPC_DigitContainerName="RPC_DIGITS");
   declareProperty("CSC_SimContainerName",           m_CSC_SimContainerName="CSC_Hits");
@@ -105,6 +109,7 @@ NSWPRDValAlg::NSWPRDValAlg(const std::string& name, ISvcLocator* pSvcLocator)
   declareProperty("doMMPRD",         m_doMMPRD=false);
   declareProperty("doCSCDigit",      m_doCSCDigit=false);
   declareProperty("doMDTHit",        m_doMDTHit=false);
+  declareProperty("doMDTDigit",      m_doMDTDigit=false);
   declareProperty("doRPCHit",        m_doRPCHit=false);
   declareProperty("doRPCDigit",      m_doRPCDigit=false);
   declareProperty("doCSCHit",        m_doCSCHit=false);
@@ -241,6 +246,11 @@ StatusCode NSWPRDValAlg::initialize() {
                                              &m_idHelperSvc->mdtIdHelper(), m_tree, m_MDT_SimContainerName, msgLevel());
      ATH_CHECK( m_MDTSimHitVar->initializeVariables() );
   }
+  if (m_doMDTDigit){
+     m_MDTDigitVar = new MdtDigitVariables(&(*(evtStore())), m_muonDetMgrDS,
+                                             &m_idHelperSvc->mdtIdHelper(), m_tree, m_MDT_DigitContainerName, msgLevel());
+     ATH_CHECK( m_MDTDigitVar->initializeVariables() );
+  }
 
     if (m_doRPCHit){
      m_RPCSimHitVar = new RPCSimHitVariables(&(*(evtStore())), m_muonDetMgrDS,
@@ -283,6 +293,7 @@ StatusCode NSWPRDValAlg::finalize()
   if (m_MmPrdVar) { delete m_MmPrdVar; m_MmPrdVar=0;}
   if (m_CscDigitVar) { delete m_CscDigitVar; m_CscDigitVar=0;}
   if (m_MDTSimHitVar) { delete m_MDTSimHitVar; m_MDTSimHitVar=0;}
+  if (m_MDTDigitVar) { delete m_MDTDigitVar; m_MDTDigitVar=0;}
   if (m_RPCSimHitVar) { delete m_RPCSimHitVar; m_RPCSimHitVar=0;}
   if (m_CSCSimHitVar) { delete m_CSCSimHitVar; m_CSCSimHitVar=0;}
   if (m_TGCSimHitVar) { delete m_TGCSimHitVar; m_TGCSimHitVar=0;}
@@ -345,6 +356,8 @@ StatusCode NSWPRDValAlg::execute()
   if (m_doCSCDigit) ATH_CHECK( m_CscDigitVar->fillVariables(muonDetMgr) );
 
   if (m_doMDTHit) ATH_CHECK( m_MDTSimHitVar->fillVariables(muonDetMgr) );
+  
+  if (m_doMDTDigit) ATH_CHECK( m_MDTDigitVar->fillVariables(muonDetMgr) );
 
   if (m_doRPCHit) ATH_CHECK( m_RPCSimHitVar->fillVariables(muonDetMgr) );
 
diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h
index dc520be802d994fed9981b3c87b207f10ee95df2..d333d70866a91ef3c12e96f6c0bf02923ff4eac9 100644
--- a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h
@@ -14,8 +14,9 @@
 #include <vector>
 
 class MDTSimHitVariables;
+class MdtDigitVariables;
 class RPCSimHitVariables;
-class RPCDigitVariables;
+class RpcDigitVariables;
 class CSCSimHitVariables;
 class TGCSimHitVariables;
 class MMDigitVariables;
@@ -69,7 +70,9 @@ class NSWPRDValAlg:public AthAlgorithm
   MMPRDVariables*         m_MmPrdVar;
   CSCDigitVariables*      m_CscDigitVar;
   MDTSimHitVariables*     m_MDTSimHitVar;
+  MdtDigitVariables*      m_MDTDigitVar;
   RPCSimHitVariables*     m_RPCSimHitVar;
+  RpcDigitVariables*      m_RPCDigitVar;
   CSCSimHitVariables*     m_CSCSimHitVar;
   TGCSimHitVariables*     m_TGCSimHitVar;
 
@@ -100,7 +103,8 @@ class NSWPRDValAlg:public AthAlgorithm
   BooleanProperty  m_doMMRDO;            // switch on the output of the MicroMegas RDO
   BooleanProperty  m_doMMPRD;            // switch on the output of the MicroMegas prepdata
   BooleanProperty  m_doCSCDigit;         // switch on the output of the MicroMegas digitization
-  BooleanProperty  m_doMDTHit;
+  BooleanProperty  m_doMDTHit;           // switch on the output of the MDT data 
+  BooleanProperty  m_doMDTDigit;         // switch on the output of the MDT digitization 
   BooleanProperty  m_doRPCHit;           // switch on the output of the RPC data   
   BooleanProperty  m_doRPCDigit;         // switch on the output of the RPC digitization 
   BooleanProperty  m_doCSCHit;
@@ -123,6 +127,7 @@ class NSWPRDValAlg:public AthAlgorithm
   std::string m_NSWMM_PRDContainerName;
   std::string m_CSC_DigitContainerName;
   std::string m_MDT_SimContainerName;
+  std::string m_MDT_DigitContainerName;
   std::string m_RPC_DigitContainerName;
   std::string m_RPC_SimContainerName;
   std::string m_CSC_SimContainerName;