diff --git a/core/data/raw/StsXyterMessage.cxx b/core/data/raw/StsXyterMessage.cxx
index 1d63ec3aa2ae264f8b9b65c7b52fefe4ded7d6dd..3c4718d2247af58fd5d40b2f78b32b808dae9cd1 100644
--- a/core/data/raw/StsXyterMessage.cxx
+++ b/core/data/raw/StsXyterMessage.cxx
@@ -19,16 +19,6 @@ using namespace stsxyter;  // Class own namespace
 
 //************************* Messages OP ************************************//
 //----------------------------------------------------------------------------
-MessSubType Message::GetSubType() const
-{
-  switch (GetField(kFieldSubtype)) {
-    case static_cast<uint16_t>(MessSubType::TsMsb): return MessSubType::TsMsb;
-    case static_cast<uint16_t>(MessSubType::Epoch): return MessSubType::Epoch;
-    case static_cast<uint16_t>(MessSubType::Status): return MessSubType::Status;
-    default: return MessSubType::Empty;
-  }  // switch( static_cast< uint16_t>( GetField( kFieldSubtype ) ) )
-}
-//----------------------------------------------------------------------------
 bool Message::PrintMess(std::ostream& os, MessagePrintMask ctrl, bool bBinning) const
 {
   bool bPrintHex    = static_cast<bool>(ctrl & MessagePrintMask::msg_print_Hex);
diff --git a/core/data/raw/StsXyterMessage.h b/core/data/raw/StsXyterMessage.h
index 9a9fff1c2a81c0f96838abef43c6e7f714ccf491..e90f3e62645d3d3379663bc3dae293ab00d1ccb7 100644
--- a/core/data/raw/StsXyterMessage.h
+++ b/core/data/raw/StsXyterMessage.h
@@ -13,6 +13,8 @@
 #include <cstdint>
 #include <iostream>
 
+#include <xpu/device.h>
+
 namespace stsxyter
 {
 
@@ -26,7 +28,7 @@ namespace stsxyter
     uint16_t fusPos;  //! Start bit index
     uint16_t fusLen;  //! Field length
 
-    MessField(uint16_t usPos, uint16_t usLen) : fusPos(usPos), fusLen(usLen) {};
+    constexpr MessField(uint16_t usPos, uint16_t usLen) : fusPos(usPos), fusLen(usLen) {};
   };
   /// Message types
   enum class MessType : uint16_t
@@ -67,103 +69,103 @@ namespace stsxyter
   };
 
   /// Fields position (Start bit index)
-  static const uint16_t kusPosNotHitFlag = 31;
-  static const uint16_t kusPosLinkIndex  = 22;
+  static constexpr uint16_t kusPosNotHitFlag = 31;
+  static constexpr uint16_t kusPosLinkIndex  = 22;
   // Hit message
-  static const uint16_t kusPosHitChannel = 15;
-  static const uint16_t kusPosHitAdc     = 10;
-  static const uint16_t kusPosHitTsOver  = 9;
-  static const uint16_t kusPosHitTs      = 1;
-  static const uint16_t kusPosHitEmFlag  = 0;
+  static constexpr uint16_t kusPosHitChannel = 15;
+  static constexpr uint16_t kusPosHitAdc     = 10;
+  static constexpr uint16_t kusPosHitTsOver  = 9;
+  static constexpr uint16_t kusPosHitTs      = 1;
+  static constexpr uint16_t kusPosHitEmFlag  = 0;
   // Non-hit messages
-  static const uint16_t kusPosSubtype = 29;
+  static constexpr uint16_t kusPosSubtype = 29;
   // TS_MSB message
-  static const uint16_t kusPosTsMsbVal = 0;
+  static constexpr uint16_t kusPosTsMsbVal = 0;
   // Epoch
-  static const uint16_t kusPosEpochVal = 0;
+  static constexpr uint16_t kusPosEpochVal = 0;
   // Status
-  static const uint16_t kusPosStatLinkId = 20;
-  static const uint16_t kusPosStatSxTs   = 14;
-  static const uint16_t kusPosStatStatus = 10;
-  static const uint16_t kusPosStatDpbTs  = 1;
-  static const uint16_t kusPosStatCpFlag = 0;
+  static constexpr uint16_t kusPosStatLinkId = 20;
+  static constexpr uint16_t kusPosStatSxTs   = 14;
+  static constexpr uint16_t kusPosStatStatus = 10;
+  static constexpr uint16_t kusPosStatDpbTs  = 1;
+  static constexpr uint16_t kusPosStatCpFlag = 0;
   // Empty/End of MS
-  static const uint16_t kusPosEmptyFlag = 28;
-  static const uint16_t kusPosMsErrType = 1;
-  static const uint16_t kusPosMsErrFlag = 0;
+  static constexpr uint16_t kusPosEmptyFlag = 28;
+  static constexpr uint16_t kusPosMsErrType = 1;
+  static constexpr uint16_t kusPosMsErrFlag = 0;
 
   /// Fields length (bits)
-  static const uint16_t kusLenNotHitFlag = 1;
-  static const uint16_t kusLenLinkIndex  = 9;
+  static constexpr uint16_t kusLenNotHitFlag = 1;
+  static constexpr uint16_t kusLenLinkIndex  = 9;
   // Hit message
-  static const uint16_t kusLenHitChannel = 7;
-  static const uint16_t kusLenHitAdc     = 5;
-  static const uint16_t kusLenHitTsFull  = 9;  // Includes 1 bit overlap with TS message ?
-  static const uint16_t kusLenHitTsOver  = 0;  // 0 bit overlap with TS message
-  static const uint16_t kusLenHitTs      = 9;  // No overlap in this version of FW
-  static const uint16_t kusLenHitEmFlag  = 1;
+  static constexpr uint16_t kusLenHitChannel = 7;
+  static constexpr uint16_t kusLenHitAdc     = 5;
+  static constexpr uint16_t kusLenHitTsFull  = 9;  // Includes 1 bit overlap with TS message ?
+  static constexpr uint16_t kusLenHitTsOver  = 0;  // 0 bit overlap with TS message
+  static constexpr uint16_t kusLenHitTs      = 9;  // No overlap in this version of FW
+  static constexpr uint16_t kusLenHitEmFlag  = 1;
   // Other message
-  static const uint16_t kusLenSubtype = 2;
+  static constexpr uint16_t kusLenSubtype = 2;
   // TS_MSB message
-  static const uint16_t kusLenTsMsbVal        = 22;
-  static const uint16_t kusLenTsMsbValBinning = 29;
+  static constexpr uint16_t kusLenTsMsbVal        = 22;
+  static constexpr uint16_t kusLenTsMsbValBinning = 29;
   // Epoch
-  static const uint16_t kusLenEpochVal = 29;
+  static constexpr uint16_t kusLenEpochVal = 29;
   // Status
-  static const uint16_t kusLenStatLinkId = 9;
-  static const uint16_t kusLenStatSxTs   = 6;
-  static const uint16_t kusLenStatStatus = 4;
-  static const uint16_t kusLenStatDpbTs  = 9;
-  static const uint16_t kusLenStatCpFlag = 1;
+  static constexpr uint16_t kusLenStatLinkId = 9;
+  static constexpr uint16_t kusLenStatSxTs   = 6;
+  static constexpr uint16_t kusLenStatStatus = 4;
+  static constexpr uint16_t kusLenStatDpbTs  = 9;
+  static constexpr uint16_t kusLenStatCpFlag = 1;
   // Empty/End of MS
-  static const uint16_t kusLenEmptyFlag = 1;
-  static const uint16_t kusLenMsErrType = 4;
-  static const uint16_t kusLenMsErrFlag = 1;
+  static constexpr uint16_t kusLenEmptyFlag = 1;
+  static constexpr uint16_t kusLenMsErrType = 4;
+  static constexpr uint16_t kusLenMsErrFlag = 1;
 
   /// Fields Info
-  static const MessField kFieldLinkIndex(kusPosLinkIndex, kusLenLinkIndex);
-  static const MessField kFieldNotHitFlag(kusPosNotHitFlag, kusLenNotHitFlag);
+  static constexpr MessField kFieldLinkIndex(kusPosLinkIndex, kusLenLinkIndex);
+  static constexpr MessField kFieldNotHitFlag(kusPosNotHitFlag, kusLenNotHitFlag);
   // Hit message
-  static const MessField kFieldHitChannel(kusPosHitChannel, kusLenHitChannel);
-  static const MessField kFieldHitAdc(kusPosHitAdc, kusLenHitAdc);
-  static const MessField kFieldHitTsFull(kusPosHitTs, kusLenHitTsFull);
-  static const MessField kFieldHitTsOver(kusPosHitTsOver, kusLenHitTsOver);
-  static const MessField kFieldHitTs(kusPosHitTs, kusLenHitTs);
-  static const MessField kFieldHitEmFlag(kusPosHitEmFlag, kusLenHitEmFlag);
+  static constexpr MessField kFieldHitChannel(kusPosHitChannel, kusLenHitChannel);
+  static constexpr MessField kFieldHitAdc(kusPosHitAdc, kusLenHitAdc);
+  static constexpr MessField kFieldHitTsFull(kusPosHitTs, kusLenHitTsFull);
+  static constexpr MessField kFieldHitTsOver(kusPosHitTsOver, kusLenHitTsOver);
+  static constexpr MessField kFieldHitTs(kusPosHitTs, kusLenHitTs);
+  static constexpr MessField kFieldHitEmFlag(kusPosHitEmFlag, kusLenHitEmFlag);
   // Non-hit messages
-  static const MessField kFieldSubtype(kusPosSubtype, kusLenSubtype);
+  static constexpr MessField kFieldSubtype(kusPosSubtype, kusLenSubtype);
   // TS_MSB message
-  static const MessField kFieldTsMsbVal(kusPosTsMsbVal, kusLenTsMsbVal);
-  static const MessField kFieldTsMsbValBinning(kusPosTsMsbVal, kusLenTsMsbValBinning);
+  static constexpr MessField kFieldTsMsbVal(kusPosTsMsbVal, kusLenTsMsbVal);
+  static constexpr MessField kFieldTsMsbValBinning(kusPosTsMsbVal, kusLenTsMsbValBinning);
   // Epoch message
-  static const MessField kFieldEpochVal(kusPosEpochVal, kusLenEpochVal);
+  static constexpr MessField kFieldEpochVal(kusPosEpochVal, kusLenEpochVal);
   // Status
-  static const MessField kFieldStatLinkId(kusPosStatLinkId, kusLenStatLinkId);
-  static const MessField kFieldStatSxTs(kusPosStatSxTs, kusLenStatSxTs);
-  static const MessField kFieldStatStatus(kusPosStatStatus, kusLenStatStatus);
-  static const MessField kFieldStatDpbTs(kusPosStatDpbTs, kusLenStatDpbTs);
-  static const MessField kFieldStatCpFlag(kusPosStatCpFlag, kusLenStatCpFlag);
+  static constexpr MessField kFieldStatLinkId(kusPosStatLinkId, kusLenStatLinkId);
+  static constexpr MessField kFieldStatSxTs(kusPosStatSxTs, kusLenStatSxTs);
+  static constexpr MessField kFieldStatStatus(kusPosStatStatus, kusLenStatStatus);
+  static constexpr MessField kFieldStatDpbTs(kusPosStatDpbTs, kusLenStatDpbTs);
+  static constexpr MessField kFieldStatCpFlag(kusPosStatCpFlag, kusLenStatCpFlag);
   // Empty/End of MS
-  static const MessField kFieldEmptyFlag(kusPosEmptyFlag, kusLenEmptyFlag);
-  static const MessField kFieldMsErrFlag(kusPosMsErrFlag, kusLenMsErrFlag);
-  static const MessField kFieldMsErrType(kusPosMsErrType, kusLenMsErrType);
+  static constexpr MessField kFieldEmptyFlag(kusPosEmptyFlag, kusLenEmptyFlag);
+  static constexpr MessField kFieldMsErrFlag(kusPosMsErrFlag, kusLenMsErrFlag);
+  static constexpr MessField kFieldMsErrType(kusPosMsErrType, kusLenMsErrType);
 
   /// Status/properties constants
-  static const uint32_t kuHitNbAdcBins  = (0 < kusLenHitAdc ? 1 << kusLenHitAdc : 0);
-  static const uint32_t kuHitNbTsBins   = (0 < kusLenHitTs ? 1 << kusLenHitTs : 0);
-  static const uint32_t kuHitNbOverBins = (0 < kusLenHitTsOver ? 1 << kusLenHitTsOver : 0);
-  static const uint32_t kuTsMsbNbTsBins = (0 < kusLenTsMsbVal ? 1 << kusLenTsMsbVal : 0);
-  static const uint64_t kulTsCycleNbBins =
+  static constexpr uint32_t kuHitNbAdcBins  = (0 < kusLenHitAdc ? 1 << kusLenHitAdc : 0);
+  static constexpr uint32_t kuHitNbTsBins   = (0 < kusLenHitTs ? 1 << kusLenHitTs : 0);
+  static constexpr uint32_t kuHitNbOverBins = (0 < kusLenHitTsOver ? 1 << kusLenHitTsOver : 0);
+  static constexpr uint32_t kuTsMsbNbTsBins = (0 < kusLenTsMsbVal ? 1 << kusLenTsMsbVal : 0);
+  static constexpr uint64_t kulTsCycleNbBins =
     static_cast<uint64_t>(kuTsMsbNbTsBins) * static_cast<uint64_t>(kuHitNbTsBins);
-  static const uint16_t kusMaskTsMsbOver     = (1 << kusLenHitTsOver) - 1;
+  static constexpr uint16_t kusMaskTsMsbOver = (1 << kusLenHitTsOver) - 1;
   static constexpr uint32_t kulClockCycleNom = 25;  ///< Clock cycle nominator [ns], equivalent to 2*160 MHz clock
   static constexpr uint32_t kulClockCycleDen = 8;   ///< Clock cycle denominator, equivalent to 2*160 MHz clock
   static constexpr double kdClockCycleNs = static_cast<double>(kulClockCycleNom) / kulClockCycleDen;  // ns, not rounded
 
   // Binning FW adds 1 bit to TS in HIT message => Quick and dirty hack is a factor 2!!!
-  static const uint32_t kuHitNbTsBinsBinning   = 1 << 10;
-  static const uint32_t kuTsMsbNbTsBinsBinning = 1 << kusLenTsMsbValBinning;
-  static const uint64_t kulTsCycleNbBinsBinning =
+  static constexpr uint32_t kuHitNbTsBinsBinning   = 1 << 10;
+  static constexpr uint32_t kuTsMsbNbTsBinsBinning = 1 << kusLenTsMsbValBinning;
+  static constexpr uint64_t kulTsCycleNbBinsBinning =
     static_cast<uint64_t>(kuTsMsbNbTsBinsBinning) * static_cast<uint64_t>(kuHitNbTsBinsBinning);
 
   class Message {
@@ -188,64 +190,64 @@ namespace stsxyter
       return *this;
     }
 
-    inline void reset() { fuData = 0; }
+    XPU_D inline void reset() { fuData = 0; }
 
     // --------------------------- Accessors ---------------------------------
-    inline uint32_t GetData() const { return fuData; }
-    inline void SetData(uint32_t uValue) { fuData = uValue; }
+    XPU_D inline uint32_t GetData() const { return fuData; }
+    XPU_D inline void SetData(uint32_t uValue) { fuData = uValue; }
 
-    inline uint32_t GetField(uint32_t uShift, uint32_t uLen) const
+    XPU_D inline uint32_t GetField(uint32_t uShift, uint32_t uLen) const
     {
       return (fuData >> uShift) & (((static_cast<uint32_t>(1)) << uLen) - 1);
     }
 
-    inline uint8_t GetBit(uint32_t uShift) const { return (fuData >> uShift) & 1; }
+    XPU_D inline uint8_t GetBit(uint32_t uShift) const { return (fuData >> uShift) & 1; }
 
-    inline uint32_t GetFieldBE(uint32_t uShift, uint32_t uLen) const
+    XPU_D inline uint32_t GetFieldBE(uint32_t uShift, uint32_t uLen) const
     {
       return (DataBE() >> uShift) & (((static_cast<uint32_t>(1)) << uLen) - 1);
     }
-    inline uint8_t GetBitBE(uint32_t uShift) const { return (DataBE() >> uShift) & 1; }
-    inline uint32_t DataBE() const
+    XPU_D inline uint8_t GetBitBE(uint32_t uShift) const { return (DataBE() >> uShift) & 1; }
+    XPU_D inline uint32_t DataBE() const
     {
       return ((fuData & 0x000000FF) << 24) + ((fuData & 0x0000FF00) << 8) + ((fuData >> 8) & 0x0000FF00)
              + ((fuData >> 24) & 0x000000FF);
     }
 
     // --------------------------- Setters ---------------------------------------
-    inline void SetField(uint32_t uShift, uint32_t uLen, uint32_t uValue)
+    XPU_D inline void SetField(uint32_t uShift, uint32_t uLen, uint32_t uValue)
     {
       fuData = (fuData & ~((((static_cast<uint32_t>(1)) << uLen) - 1) << uShift))
                | ((static_cast<uint64_t>(uValue)) << uShift);
     }
 
-    inline void SetBit(uint32_t uShift, uint8_t uValue)
+    XPU_D inline void SetBit(uint32_t uShift, uint8_t uValue)
     {
       fuData =
         uValue ? (fuData | ((static_cast<uint32_t>(1)) << uShift)) : (fuData & ~((static_cast<uint32_t>(1)) << uShift));
     }
 
     // --------------------------- Simplified Acc_or/Setters ---------------------
-    inline uint32_t GetField(MessField field) const { return GetField(field.fusPos, field.fusLen); }
-    inline uint8_t GetBit(MessField field) const { return GetBit(field.fusPos); }
-    inline bool GetFlag(MessField field) const { return (1 == GetBit(field.fusPos)); }
-    inline uint32_t GetFieldBE(MessField field) const { return GetFieldBE(field.fusPos, field.fusLen); }
-    inline uint8_t GetBitBE(MessField field) const { return GetBitBE(field.fusPos); }
+    XPU_D inline uint32_t GetField(MessField field) const { return GetField(field.fusPos, field.fusLen); }
+    XPU_D inline uint8_t GetBit(MessField field) const { return GetBit(field.fusPos); }
+    XPU_D inline bool GetFlag(MessField field) const { return (1 == GetBit(field.fusPos)); }
+    XPU_D inline uint32_t GetFieldBE(MessField field) const { return GetFieldBE(field.fusPos, field.fusLen); }
+    XPU_D inline uint8_t GetBitBE(MessField field) const { return GetBitBE(field.fusPos); }
 
-    inline void SetField(MessField field, uint32_t uValue) { SetField(field.fusPos, field.fusLen, uValue); }
-    inline void SetBit(MessField field, uint8_t ucValue) { SetBit(field.fusPos, ucValue); }
+    XPU_D inline void SetField(MessField field, uint32_t uValue) { SetField(field.fusPos, field.fusLen, uValue); }
+    XPU_D inline void SetBit(MessField field, uint8_t ucValue) { SetBit(field.fusPos, ucValue); }
 
     // --------------------------- common fields ---------------------------------
     //! For all data: Returns the (global) index of the eLink on which the message was received (n bit field)
-    inline uint16_t GetLinkIndex() const { return GetField(kFieldLinkIndex); }
+    XPU_D inline uint16_t GetLinkIndex() const { return GetField(kFieldLinkIndex); }
     //! Check if the message if a Hit Message
-    inline bool IsHit() const { return !GetFlag(kFieldNotHitFlag); }
+    XPU_D inline bool IsHit() const { return !GetFlag(kFieldNotHitFlag); }
     //! Check if the message if a Dummy Hit Message
-    inline bool IsDummy() const { return IsHit() && (0 == GetHitAdc()); }
+    XPU_D inline bool IsDummy() const { return IsHit() && (0 == GetHitAdc()); }
     //! Check if the message if a Ts_Msb
-    inline bool IsTsMsb() const { return (!IsHit() && MessSubType::TsMsb == GetSubType()); }
+    XPU_D inline bool IsTsMsb() const { return (!IsHit() && MessSubType::TsMsb == GetSubType()); }
     //! Returns the message type, see enum MessType
-    inline MessType GetMessType() const
+    XPU_D inline MessType GetMessType() const
     {
       return !GetFlag(kFieldNotHitFlag) ? (0 == GetHitAdc() ? MessType::Dummy : MessType::Hit)
                                         : (MessSubType::TsMsb == GetSubType()
@@ -259,128 +261,137 @@ namespace stsxyter
 
     // ------------------------ Hit message fields -------------------------------
     //! For Hit data: Returns StsXYTER channel number (7 bit field)
-    inline uint16_t GetHitChannel() const { return GetField(kFieldHitChannel); }
+    XPU_D inline uint16_t GetHitChannel() const { return GetField(kFieldHitChannel); }
 
     //! For Hit data: Returns ADC value (5 bit field)
-    inline uint16_t GetHitAdc() const { return GetField(kFieldHitAdc); }
+    XPU_D inline uint16_t GetHitAdc() const { return GetField(kFieldHitAdc); }
 
     //! For Hit data: Returns Full timestamp (10 bit field including 2 bits overlap)
-    inline uint16_t GetHitTimeFull() const { return GetField(kFieldHitTsFull); }
+    XPU_D inline uint16_t GetHitTimeFull() const { return GetField(kFieldHitTsFull); }
 
     //! For Hit data: Returns timestamp overlap bits (2 bits field, overlap with 2 LSBs of TS_MSB message)
-    inline uint16_t GetHitTimeOver() const { return GetField(kFieldHitTsOver); }
+    XPU_D inline uint16_t GetHitTimeOver() const { return GetField(kFieldHitTsOver); }
 
     //! For Hit data: Returns timestamp (8 bit field, 2 MSB bits overlap removed)
-    inline uint16_t GetHitTime() const { return GetField(kFieldHitTs); }
+    XPU_D inline uint16_t GetHitTime() const { return GetField(kFieldHitTs); }
 
     //! For Hit data: Returns timestamp (9 bit field + 1b extra on b30)
     /// => Quick and dirty hack for binning FW!!!
-    inline uint16_t GetHitTimeBinning() const
+    XPU_D inline uint16_t GetHitTimeBinning() const
     {
       return ((static_cast<uint16_t>(GetBit(30)) << 9) + GetField(kFieldHitTs));
     }
 
     //! For Hit data: Returns (global) index of the eLink on which the message was received (6 bit field)
     /// => Quick and dirty hack for binning FW!!!
-    inline uint16_t GetLinkIndexHitBinning() const { return GetField(kFieldLinkIndex) & 0x3F; }
+    XPU_D inline uint16_t GetLinkIndexHitBinning() const { return GetField(kFieldLinkIndex) & 0x3F; }
 
     //! For Hit data: Returns Missed event flag (1 bit field)
-    inline bool IsHitMissedEvts() const { return GetFlag(kFieldHitEmFlag); }
+    XPU_D inline bool IsHitMissedEvts() const { return GetFlag(kFieldHitEmFlag); }
 
     //! For Hit data: Sets StsXYTER channel number (7 bit field)
-    inline void SetHitChannel(uint16_t usVal) { SetField(kFieldHitChannel, usVal); }
+    XPU_D inline void SetHitChannel(uint16_t usVal) { SetField(kFieldHitChannel, usVal); }
 
     //! For Hit data: Sets ADC value (5 bit field)
-    inline void SetHitAdc(uint16_t usVal) { SetField(kFieldHitAdc, usVal); }
+    XPU_D inline void SetHitAdc(uint16_t usVal) { SetField(kFieldHitAdc, usVal); }
 
     //! For Hit data: Sets Full timestamp (10 bit field including 2 bits overlap)
-    inline void SetHitTimeFull(uint16_t usVal) { SetField(kFieldHitTsFull, usVal); }
+    XPU_D inline void SetHitTimeFull(uint16_t usVal) { SetField(kFieldHitTsFull, usVal); }
 
     //! For Hit data: Sets timestamp overlap bits (2 bits field, overlap with 2 LSBs of TS_MSB message)
-    inline void SetHitTimeOver(uint16_t usVal) { SetField(kFieldHitTsOver, usVal); }
+    XPU_D inline void SetHitTimeOver(uint16_t usVal) { SetField(kFieldHitTsOver, usVal); }
 
     //! For Hit data: Sets Full timestamp (8 bit field, 2 MSB bits overlap removed)
-    inline void SetHitTime(uint16_t usVal) { SetField(kFieldHitTs, usVal); }
+    XPU_D inline void SetHitTime(uint16_t usVal) { SetField(kFieldHitTs, usVal); }
 
     //! For Hit data: Sets Missed event flag (1 bit field)
-    inline void SetHitMissEvtsFlag(bool bVal) { SetBit(kFieldHitEmFlag, bVal); }
+    XPU_D inline void SetHitMissEvtsFlag(bool bVal) { SetBit(kFieldHitEmFlag, bVal); }
 
     // ----------------------- Non-Hit message fields ----------------------------
     //! For non-Hit data: Returns subtype (2 bit field)
     //         inline MessSubType GetSubType() const { return static_cast< uint16_t >( GetField( kFieldSubtype ) ); }
-    MessSubType GetSubType() const;
+    XPU_D MessSubType GetSubType() const
+    {
+      switch (GetField(kFieldSubtype)) {
+        case static_cast<uint16_t>(MessSubType::TsMsb): return MessSubType::TsMsb;
+        case static_cast<uint16_t>(MessSubType::Epoch): return MessSubType::Epoch;
+        case static_cast<uint16_t>(MessSubType::Status): return MessSubType::Status;
+        default: return MessSubType::Empty;
+      }  // switch( static_cast< uint16_t>( GetField( kFieldSubtype ) ) )
+    }
 
     // ------------------------ TS_MSB message fields ----------------------------
     //! For TS MSB data: Returns the TS MSB 22 bit field)
-    inline uint32_t GetTsMsbVal() const { return GetField(kFieldTsMsbVal); }
+    XPU_D inline uint32_t GetTsMsbVal() const { return GetField(kFieldTsMsbVal); }
 
     //! For TS MSB data: Returns the TS MSB 29 bit field)
-    inline uint32_t GetTsMsbValBinning() const { return GetField(kFieldTsMsbValBinning); }
+    XPU_D inline uint32_t GetTsMsbValBinning() const { return GetField(kFieldTsMsbValBinning); }
 
     //! For TS MSB data: Sets the TS MSB (22 bit field)
-    inline void SetTsMsbVal(uint32_t uVal) { SetField(kFieldTsMsbVal, uVal); }
+    XPU_D inline void SetTsMsbVal(uint32_t uVal) { SetField(kFieldTsMsbVal, uVal); }
 
     // ------------------------ Epoch message fields -----------------------------
     //! For Epoch data: Returns the Epoch (29 bit field)
-    inline uint32_t GetEpochVal() const { return GetField(kFieldEpochVal); }
+    XPU_D inline uint32_t GetEpochVal() const { return GetField(kFieldEpochVal); }
 
     //! For Epoch data: Sets the Epoch (29 bit field)
-    inline void SetEpochVal(uint32_t uVal) { SetField(kFieldEpochVal, uVal); }
+    XPU_D inline void SetEpochVal(uint32_t uVal) { SetField(kFieldEpochVal, uVal); }
 
     // ------------------------ Status message fields ----------------------------
     //! For Status data: Returns the Link Inedx (9 bit field)
-    inline uint16_t GetStatusLink() const { return GetField(kFieldStatLinkId); }
+    XPU_D inline uint16_t GetStatusLink() const { return GetField(kFieldStatLinkId); }
 
     //! For Status data: Returns the SMX TS from ACK frame (6 bit field)
-    inline uint16_t GetStatusSxTs() const { return GetField(kFieldStatSxTs); }
+    XPU_D inline uint16_t GetStatusSxTs() const { return GetField(kFieldStatSxTs); }
 
     //! For Status data: Returns the Status field from ACK frame (4 bit field)
-    inline uint16_t GetStatusStatus() const { return GetField(kFieldStatStatus); }
+    XPU_D inline uint16_t GetStatusStatus() const { return GetField(kFieldStatStatus); }
 
     //! For Status data: Returns the DPB TS when frame received (9 bit field)
-    inline uint16_t GetStatusDpbTs() const { return GetField(kFieldStatDpbTs); }
+    XPU_D inline uint16_t GetStatusDpbTs() const { return GetField(kFieldStatDpbTs); }
 
     //! For Status data: Returns the CP flag from ACK frame (1 bit field)
-    inline bool IsCpFlagOn() const { return GetField(kFieldStatCpFlag); }
+    XPU_D inline bool IsCpFlagOn() const { return GetField(kFieldStatCpFlag); }
 
     //! For Status data: Sets the Status (9 bit field)
-    inline void SetStatusLink(uint16_t usVal) { SetField(kFieldStatLinkId, usVal); }
+    XPU_D inline void SetStatusLink(uint16_t usVal) { SetField(kFieldStatLinkId, usVal); }
 
     //! For Status data: Sets the Status (6 bit field)
-    inline void SetStatusSxTs(uint16_t usVal) { SetField(kFieldStatSxTs, usVal); }
+    XPU_D inline void SetStatusSxTs(uint16_t usVal) { SetField(kFieldStatSxTs, usVal); }
 
     //! For Status data: Sets the Status (4 bit field)
-    inline void SetStatusStatus(uint16_t usVal) { SetField(kFieldStatStatus, usVal); }
+    XPU_D inline void SetStatusStatus(uint16_t usVal) { SetField(kFieldStatStatus, usVal); }
 
     //! For Status data: Sets the Status (9 bit field)
-    inline void SetStatusDpbTs(uint16_t usVal) { SetField(kFieldStatDpbTs, usVal); }
+    XPU_D inline void SetStatusDpbTs(uint16_t usVal) { SetField(kFieldStatDpbTs, usVal); }
 
     //! For Status data: Sets the Status (1 bit field)
-    inline void SetCpFlag(bool bVal) { SetField(kFieldStatCpFlag, bVal); }
+    XPU_D inline void SetCpFlag(bool bVal) { SetField(kFieldStatCpFlag, bVal); }
 
     // -------------------- Empty/End of MS message fields -----------------------
     //! For Empty/End of MS data: Check if this is an empty message (1 bit field)
-    inline bool IsEmptyMsg() const { return GetField(kFieldEmptyFlag); }
+    XPU_D inline bool IsEmptyMsg() const { return GetField(kFieldEmptyFlag); }
 
     //! For End of MS data: Returns the MS error flag (1 bit field)
-    inline bool IsMsErrorFlagOn() const { return GetField(kFieldMsErrFlag); }
+    XPU_D inline bool IsMsErrorFlagOn() const { return GetField(kFieldMsErrFlag); }
 
     //! For End of MS data: Returns the MS error type field (2 bit field)
-    inline uint16_t GetMsErrorType() const { return GetField(kFieldMsErrType); }
+    XPU_D inline uint16_t GetMsErrorType() const { return GetField(kFieldMsErrType); }
 
     //! For Empty/End of MS data data: Sets the Empty message flag (1 bit field)
-    inline void SetEmptyMsgFlag(bool bVal) { SetField(kFieldEmptyFlag, bVal); }
+    XPU_D inline void SetEmptyMsgFlag(bool bVal) { SetField(kFieldEmptyFlag, bVal); }
 
     //! For End of MS data data: Sets the MS Error flag (1 bit field)
-    inline void SetMsErrorFlag(bool bVal) { SetField(kFieldMsErrFlag, bVal); }
+    XPU_D inline void SetMsErrorFlag(bool bVal) { SetField(kFieldMsErrFlag, bVal); }
 
     //! For End of MS data: Sets the MS error type field (2 bit field)
-    inline void SetMsErrorType(uint16_t usVal) { SetField(kFieldMsErrType, usVal); }
+    XPU_D inline void SetMsErrorType(uint16_t usVal) { SetField(kFieldMsErrType, usVal); }
 
     // ------------------------ General OP ---------------------------------------
     bool PrintMess(std::ostream& os, MessagePrintMask ctrl = MessagePrintMask::msg_print_Human,
                    bool bBinning = true) const;
 
+
     static std::string PrintMessType(MessType type);
   };
 }  // namespace stsxyter