diff --git a/Core/include/Acts/EventData/TrackState.hpp b/Core/include/Acts/EventData/TrackState.hpp
index 3df7097951858e3109e3c8b4f87d8b328ceba473..652bac1858d35cbea17f3a46c57a147b67b7fc66 100644
--- a/Core/include/Acts/EventData/TrackState.hpp
+++ b/Core/include/Acts/EventData/TrackState.hpp
@@ -17,6 +17,18 @@
 
 namespace Acts {
 
+/// @enum TrackStateFlag
+///
+/// This enum describes the type of TrackState
+enum TrackStateFlag {
+  MeasurementFlag = 0,
+  ParameterFlag = 1,
+  OutlierFlag = 2,
+  HoleFlag = 3,
+  MaterialFlag = 4,
+  NumTrackStateFlags = 5
+};
+
 class Surface;
 
 /// @class TrackState
@@ -44,6 +56,7 @@ class TrackState {
   /// @param m The measurement object
   TrackState(SourceLink m) : m_surface(&m.referenceSurface()) {
     measurement.uncalibrated = std::move(m);
+    m_typeFlags.set(MeasurementFlag);
   }
 
   /// Constructor from parameters
@@ -53,6 +66,7 @@ class TrackState {
   TrackState(parameters_t p) {
     m_surface = &p.referenceSurface();
     parameter.predicted = std::move(p);
+    m_typeFlags.set(ParameterFlag);
   }
 
   /// Virtual destructor
@@ -64,7 +78,8 @@ class TrackState {
   TrackState(const TrackState& rhs)
       : parameter(rhs.parameter),
         measurement(rhs.measurement),
-        m_surface(rhs.m_surface) {}
+        m_surface(rhs.m_surface),
+        m_typeFlags(rhs.m_typeFlags) {}
 
   /// Copy move constructor
   ///
@@ -72,7 +87,8 @@ class TrackState {
   TrackState(TrackState&& rhs)
       : parameter(std::move(rhs.parameter)),
         measurement(std::move(rhs.measurement)),
-        m_surface(std::move(rhs.m_surface)) {}
+        m_surface(std::move(rhs.m_surface)),
+        m_typeFlags(std::move(rhs.m_typeFlags)) {}
 
   /// Assignment operator
   ///
@@ -81,6 +97,7 @@ class TrackState {
     parameter = rhs.parameter;
     measurement = rhs.measurement;
     m_surface = rhs.m_surface;
+    m_typeFlags = rhs.m_typeFlags;
     return (*this);
   }
 
@@ -91,12 +108,27 @@ class TrackState {
     parameter = std::move(rhs.parameter);
     measurement = std::move(rhs.measurement);
     m_surface = std::move(rhs.m_surface);
+    m_typeFlags = std::move(rhs.m_typeFlags);
     return (*this);
   }
 
   /// @brief return method for the surface
   const Surface& referenceSurface() const { return (*m_surface); }
 
+  /// @brief set the type flag
+  void setType(const TrackStateFlag& flag, bool status = true) {
+    m_typeFlags.set(flag, status);
+  }
+
+  /// @brief test if the tracks state is flagged as a given type
+  bool isType(const TrackStateFlag& flag) const {
+    assert(flag < NumTrackStateFlags);
+    return m_typeFlags.test(flag);
+  }
+
+  /// @brief return method for the type flags
+  std::bitset<NumTrackStateFlags> type() const { return m_typeFlags; }
+
   /// @brief number of Measured parameters, forwarded
   /// @note This only returns a value if there is a calibrated measurement
   ///       set. If not, this returns boost::none
@@ -141,5 +173,7 @@ class TrackState {
  private:
   /// The surface of this TrackState
   const Surface* m_surface = nullptr;
+  /// The type flag of this TrackState
+  std::bitset<NumTrackStateFlags> m_typeFlags;
 };
 }  // namespace Acts