diff --git a/FTagDumper/src/JetDumperConfig.cxx b/FTagDumper/src/JetDumperConfig.cxx
index 671457ae44523e06bc01513c77f7689335ea0687..9cd750572a98c1b712b30386c49c110451aa1f97 100644
--- a/FTagDumper/src/JetDumperConfig.cxx
+++ b/FTagDumper/src/JetDumperConfig.cxx
@@ -275,6 +275,7 @@ namespace {
     TRY(stableNonGeant);
     TRY(higgs);
     TRY(top);
+    TRY(stableCharged);
 #undef TRY
     throw std::logic_error("unknown truth particle type: " + name);
   }
diff --git a/FTagDumper/src/JetTruthAssociator.cxx b/FTagDumper/src/JetTruthAssociator.cxx
index ab825331367f8b6bcf3fce2dd98b6d4d7f70f0fc..3dc7d822f9398348c4d61de552cfb6f9d4b117b6 100644
--- a/FTagDumper/src/JetTruthAssociator.cxx
+++ b/FTagDumper/src/JetTruthAssociator.cxx
@@ -32,6 +32,13 @@ namespace {
       return true;
   }
 
+  bool is_stable_charged(const xAOD::TruthParticle& x) {
+    if (x.status() != 1) return false;      // not stable
+    if (x.e() <= 500) return false;         // energy <= 500 MeV
+    if (!x.isCharged()) return false;       // not charged
+    return true;
+}
+
   std::function<bool(const xAOD::TruthParticle&)> get_selector(
     TruthSelectorConfig::Particle particle)
   {
@@ -95,6 +102,8 @@ namespace {
       return [](const TP& x) { return is_higgs(x); };  
     case p::top:
       return [](const TP& x) { return is_top(x); };
+    case p::stableCharged:
+      return [](const TP& x) {return is_stable_charged(x); };
     default:
       throw std::logic_error("unknown particle type");
     }
diff --git a/FTagDumper/src/TruthSelectorConfig.hh b/FTagDumper/src/TruthSelectorConfig.hh
index a0a677f7ba702f084135a9e3e9e7f0f335d5cb9d..a9440d8cd48923e3ae3793013121abbcf070c061 100644
--- a/FTagDumper/src/TruthSelectorConfig.hh
+++ b/FTagDumper/src/TruthSelectorConfig.hh
@@ -17,7 +17,7 @@ struct TruthSelectorConfig
   std::vector<std::string> containers;
   enum class Particle { hadron, lepton, fromBC, overlapLepton,
     promptLepton, nonPromptLepton, muon, stableNonGeant, higgs, top,
-    any};
+    any, stableCharged};
   Particle particle;
   TruthKinematicConfig kinematics;
 };
diff --git a/configs/TracklessEMPFlow.json b/configs/TracklessEMPFlow.json
index 0ef55509d20f8c81bed0820eace1f2effd42669b..83b280737f0029e542305ec9ae9b76e27b740e0d 100644
--- a/configs/TracklessEMPFlow.json
+++ b/configs/TracklessEMPFlow.json
@@ -117,7 +117,9 @@
             "variables": {
                 "file": "fragments/pflow-track-variables-all.json",
                 "ints" :[
-                    "TrackID"
+                    "TrackID",
+                    "ftagTruthBarcode",
+                    "ftagTruthParentBarcode"
                 ]
             },
             "ip_prefix": "btagIp_"
@@ -144,7 +146,22 @@
                 "particles": "promptLepton"
             },
             "decorate_summary": true
+        },
+        {
+            "association": {
+                "file": "fragments/baseline-truth-kinematics.json",
+                "particles": "stableCharged"
+            },
+            "association_name": "charged_particles",
+            "output": {
+                "n_to_save": 40,
+                "sort_order": "pt"
+            },
+            "vars" : {
+                "file": "fragments/truth-variables.json"
+            }
         }
+
     ],
     "decorate": {
         "jet_aug": false,
diff --git a/configs/trigger_hits.json b/configs/trigger_hits.json
index fe6f32df793f42346df558b3786d3a50421fac87..607b50c895e00da8e2d6bf751d578edf5df69380 100644
--- a/configs/trigger_hits.json
+++ b/configs/trigger_hits.json
@@ -20,7 +20,8 @@
                 "isBarrel",
                 "j",
                 "a",
-                "b"
+                "b",
+                "TruthBarcode"
             ]
         }
     }