diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h
index f5d049d97..3c3dddb0b 100644
--- a/sbncode/CAFMaker/CAFMakerParams.h
+++ b/sbncode/CAFMaker/CAFMakerParams.h
@@ -252,6 +252,18 @@ namespace caf
       "pandoraTrackCRTTrack"
     };
 
+    Atom<string> CRTSpacePointMatchLabel {
+      Name("CRTSpacePointMatchLabel"),
+      Comment("Base label of track to CRT spacepoint matching producer."),
+      "crtspacepointmatching"
+    };
+
+    Atom<string> SBNDCRTTrackMatchLabel {
+      Name("SBNDCRTTrackMatchLabel"),
+      Comment("Base label of track to SBND CRT track matching producer."),
+      "crttrackmatching"
+    };
+
     Atom<string> TrackMCSLabel {
       Name("TrackMCSLabel"),
       Comment("Base label of track MCS momentum calculation producer."),
@@ -267,15 +279,27 @@ namespace caf
     Atom<string> CRTHitLabel {
       Name("CRTHitLabel"),
       Comment("Label of sbn CRT hits."),
-      "crthit" // same for icarus and sbnd
+      "crthit" // icarus
     };
 
     Atom<string> CRTTrackLabel {
       Name("CRTTrackLabel"),
       Comment("Label of sbn CRT tracks."),
-      "crttrack" // same for icarus and sbnd
+      "crttrack" // icarus
     };
-    
+
+    Atom<string> CRTSpacePointLabel {
+      Name("CRTSpacePointLabel"),
+      Comment("Label of sbnd CRT spacepoints."),
+      "crtspacepoints" // sbnd
+    };
+
+    Atom<string> SBNDCRTTrackLabel {
+      Name("SBNDCRTTrackLabel"),
+      Comment("Label of sbnd CRT tracks."),
+      "crttracks" // sbnd
+    };
+
     Atom<string> CRTPMTLabel {
       Name("CRTPMTLabel"),
       Comment("Label for the CRTPMT Matched variables from the crtpmt data product"),
diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc
index c902272fc..a61e27e9a 100644
--- a/sbncode/CAFMaker/CAFMaker_module.cc
+++ b/sbncode/CAFMaker/CAFMaker_module.cc
@@ -276,6 +276,10 @@ class CAFMaker : public art::EDProducer {
   art::FindOneP<T> FindOnePStrict(const U& from, const art::Event& evt,
 				  const art::InputTag& label) const;
 
+  template <class T, class D, class U>
+  art::FindOneP<T, D> FindOnePDStrict(const U& from,
+                                      const art::Event& evt,
+                                      const art::InputTag& tag) const;
 
   /// \brief Retrieve an object from an association, with error handling
   ///
@@ -1005,6 +1009,25 @@ art::FindOneP<T> CAFMaker::FindOnePStrict(const U& from,
   return ret;
 }
 
+//......................................................................
+template <class T, class D, class U>
+art::FindOneP<T, D> CAFMaker::FindOnePDStrict(const U& from,
+                                              const art::Event& evt,
+                                              const art::InputTag& tag) const {
+  art::FindOneP<T, D> ret(from, evt, tag);
+
+  if (!tag.label().empty() && !ret.isValid() && fParams.StrictMode()) {
+    std::cout << "CAFMaker: No Assn from '"
+              << cet::demangle_symbol(typeid(from).name()) << "' to '"
+              << cet::demangle_symbol(typeid(T).name())
+              << "' found under label '" << tag << "'. "
+              << "Set 'StrictMode: false' to continue anyway." << std::endl;
+    abort();
+  }
+
+  return ret;
+}
+
 //......................................................................
 template <class T>
 bool CAFMaker::GetAssociatedProduct(const art::FindManyP<T>& fm, int idx,
@@ -1311,40 +1334,64 @@ void CAFMaker::produce(art::Event& evt) noexcept {
     pass_flash_trig = *flashtrig_handle;
   }
 
-  // Fill various detector information associated with the event
-  //
-  // Get all of the CRT hits
-  std::vector<caf::SRCRTHit> srcrthits;
-
-  art::Handle<std::vector<sbn::crt::CRTHit>> crthits_handle;
-  GetByLabelStrict(evt, fParams.CRTHitLabel(), crthits_handle);
-  // fill into event
-  //int64_t CRT_T0_reference_time = fParams.ReferenceCRTT0ToBeam() ? -srtrigger.beam_gate_time_abs : 0; // ns, signed
-  //double CRT_T1_reference_time = fParams.ReferenceCRTT1FromTriggerToBeam() ? srtrigger.trigger_within_gate : 0.;
   int64_t CRT_T0_reference_time = isRealData ?  -srtrigger.beam_gate_time_abs : -fParams.CRTSimT0Offset();
   double CRT_T1_reference_time = isRealData ? srtrigger.trigger_within_gate : -fParams.CRTSimT0Offset();
 
-  if (crthits_handle.isValid()) {
-    const std::vector<sbn::crt::CRTHit> &crthits = *crthits_handle;
-    for (unsigned i = 0; i < crthits.size(); i++) {
-      srcrthits.emplace_back();
-      FillCRTHit(crthits[i], fParams.CRTUseTS0(), CRT_T0_reference_time, CRT_T1_reference_time, srcrthits.back());
-    }
-  }
+  // Fill various detector information associated with the event
 
-  // Get all of the CRT Tracks
+  std::vector<caf::SRCRTHit> srcrthits;
   std::vector<caf::SRCRTTrack> srcrttracks;
+  std::vector<caf::SRCRTSpacePoint> srcrtspacepoints;
+  std::vector<caf::SRSBNDCRTTrack> srsbndcrttracks;
+
+  if(fDet == kICARUS)
+    {
+      art::Handle<std::vector<sbn::crt::CRTHit>> crthits_handle;
+      GetByLabelStrict(evt, fParams.CRTHitLabel(), crthits_handle);
+      // fill into event
+      if (crthits_handle.isValid()) {
+        const std::vector<sbn::crt::CRTHit> &crthits = *crthits_handle;
+        for (unsigned i = 0; i < crthits.size(); i++) {
+          srcrthits.emplace_back();
+          FillCRTHit(crthits[i], fParams.CRTUseTS0(), CRT_T0_reference_time, CRT_T1_reference_time, srcrthits.back());
+        }
+      }
 
-  art::Handle<std::vector<sbn::crt::CRTTrack>> crttracks_handle;
-  GetByLabelStrict(evt, fParams.CRTTrackLabel(), crttracks_handle);
-  // fill into event
-  if (crttracks_handle.isValid()) {
-    const std::vector<sbn::crt::CRTTrack> &crttracks = *crttracks_handle;
-    for (unsigned i = 0; i < crttracks.size(); i++) {
-      srcrttracks.emplace_back();
-      FillCRTTrack(crttracks[i], fParams.CRTUseTS0(), srcrttracks.back());
+      art::Handle<std::vector<sbn::crt::CRTTrack>> crttracks_handle;
+      GetByLabelStrict(evt, fParams.CRTTrackLabel(), crttracks_handle);
+      // fill into event
+      if (crttracks_handle.isValid()) {
+        const std::vector<sbn::crt::CRTTrack> &crttracks = *crttracks_handle;
+        for (unsigned i = 0; i < crttracks.size(); i++) {
+          srcrttracks.emplace_back();
+          FillCRTTrack(crttracks[i], fParams.CRTUseTS0(), srcrttracks.back());
+        }
+      }
+    }
+  else if(fDet == kSBND)
+    {
+      art::Handle<std::vector<sbnd::crt::CRTSpacePoint>> crtspacepoints_handle;
+      GetByLabelStrict(evt, fParams.CRTSpacePointLabel(), crtspacepoints_handle);
+
+      if (crtspacepoints_handle.isValid()) {
+        const std::vector<sbnd::crt::CRTSpacePoint> &crtspacepoints = *crtspacepoints_handle;
+        for (unsigned i = 0; i < crtspacepoints.size(); i++) {
+          srcrtspacepoints.emplace_back();
+          FillCRTSpacePoint(crtspacepoints[i], srcrtspacepoints.back());
+        }
+      }
+
+      art::Handle<std::vector<sbnd::crt::CRTTrack>> sbndcrttracks_handle;
+      GetByLabelStrict(evt, fParams.SBNDCRTTrackLabel(), sbndcrttracks_handle);
+      // fill into event
+      if (sbndcrttracks_handle.isValid()) {
+        const std::vector<sbnd::crt::CRTTrack> &sbndcrttracks = *sbndcrttracks_handle;
+        for (unsigned i = 0; i < sbndcrttracks.size(); i++) {
+          srsbndcrttracks.emplace_back();
+          FillSBNDCRTTrack(sbndcrttracks[i], srsbndcrttracks.back());
+        }
+      }
     }
-  }
 
   // Get all of the CRTPMT Matches .. 
   std::vector<caf::SRCRTPMTMatch> srcrtpmtmatches;
@@ -1622,6 +1669,14 @@ void CAFMaker::produce(art::Event& evt) noexcept {
       FindManyPStrict<anab::T0>(slcTracks, evt,
                fParams.CRTTrackMatchLabel() + slice_tag_suff);
 
+    art::FindOneP<sbnd::crt::CRTSpacePoint, anab::T0> foCRTSpacePointMatch =
+      FindOnePDStrict<sbnd::crt::CRTSpacePoint, anab::T0>(slcTracks, evt,
+               fParams.CRTSpacePointMatchLabel() + slice_tag_suff);
+
+    art::FindOneP<sbnd::crt::CRTTrack, anab::T0> foSBNDCRTTrackMatch =
+      FindOnePDStrict<sbnd::crt::CRTTrack, anab::T0>(slcTracks, evt,
+               fParams.SBNDCRTTrackMatchLabel() + slice_tag_suff);
+
     std::vector<art::FindManyP<recob::MCSFitResult>> fmMCSs;
     static const std::vector<std::string> PIDnames {"muon", "pion", "kaon", "proton"};
     for (std::string pid: PIDnames) {
@@ -1836,7 +1891,7 @@ void CAFMaker::produce(art::Event& evt) noexcept {
               fParams.TrackHitFillRRStartCut(), fParams.TrackHitFillRREndCut(),
               lar::providerFrom<geo::Geometry>(), dprop, trk);
         }
-        if (fmCRTHitMatch.isValid()) {
+        if (fmCRTHitMatch.isValid() && fDet == kICARUS) {
           art::FindManyP<sbn::crt::CRTHit> CRTT02Hit = FindManyPStrict<sbn::crt::CRTHit>
               (fmCRTHitMatch.at(iPart), evt, fParams.CRTHitMatchLabel() + slice_tag_suff);
          
@@ -1846,9 +1901,25 @@ void CAFMaker::produce(art::Event& evt) noexcept {
           FillTrackCRTHit(fmCRTHitMatch.at(iPart), crthitmatch, fParams.CRTUseTS0(), CRT_T0_reference_time, CRT_T1_reference_time, trk);
         }
         // NOTE: SEE TODO AT fmCRTTrackMatch
-        if (fmCRTTrackMatch.isValid()) {
+        if (fmCRTTrackMatch.isValid() && fDet == kICARUS) {
           FillTrackCRTTrack(fmCRTTrackMatch.at(iPart), trk);
         }
+
+        if(foCRTSpacePointMatch.isValid() && fDet == kSBND)
+          {
+            const art::Ptr<sbnd::crt::CRTSpacePoint> crtspacepoint = foCRTSpacePointMatch.at(iPart);
+
+            if(crtspacepoint.isNonnull())
+              FillTrackCRTSpacePoint(foCRTSpacePointMatch.data(iPart).ref(), crtspacepoint, trk);
+          }
+        if(foSBNDCRTTrackMatch.isValid() && fDet == kSBND)
+          {
+            const art::Ptr<sbnd::crt::CRTTrack> sbndcrttrack = foSBNDCRTTrackMatch.at(iPart);
+
+            if(sbndcrttrack.isNonnull())
+              FillTrackSBNDCRTTrack(foSBNDCRTTrackMatch.data(iPart).ref(), sbndcrttrack, trk);
+          }
+
         // Truth matching
         if (fmTrackHit.isValid()) {
           if ( !isRealData ) {
@@ -1912,17 +1983,21 @@ void CAFMaker::produce(art::Event& evt) noexcept {
   //#######################################################
   //  Fill rec Tree
   //#######################################################
-  rec.nslc            = rec.slc.size();
-  rec.mc              = srtruthbranch;
-  rec.fake_reco       = srfakereco;
-  rec.nfake_reco      = srfakereco.size();
-  rec.pass_flashtrig  = pass_flash_trig;  // trigger result
-  rec.crt_hits        = srcrthits;
-  rec.ncrt_hits       = srcrthits.size();
-  rec.crt_tracks        = srcrttracks;
-  rec.ncrt_tracks       = srcrttracks.size();
-  rec.opflashes       = srflashes;
-  rec.nopflashes      = srflashes.size();
+  rec.nslc             = rec.slc.size();
+  rec.mc               = srtruthbranch;
+  rec.fake_reco        = srfakereco;
+  rec.nfake_reco       = srfakereco.size();
+  rec.pass_flashtrig   = pass_flash_trig;  // trigger result
+  rec.crt_hits         = srcrthits;
+  rec.ncrt_hits        = srcrthits.size();
+  rec.crt_tracks       = srcrttracks;
+  rec.ncrt_tracks      = srcrttracks.size();
+  rec.crt_spacepoints  = srcrtspacepoints;
+  rec.ncrt_spacepoints = srcrtspacepoints.size();
+  rec.sbnd_crt_tracks  = srsbndcrttracks;
+  rec.nsbnd_crt_tracks = srsbndcrttracks.size();
+  rec.opflashes        = srflashes;
+  rec.nopflashes       = srflashes.size();
   if (fParams.FillTrueParticles()) {
     rec.true_particles  = true_particles;
   }
diff --git a/sbncode/CAFMaker/CMakeLists.txt b/sbncode/CAFMaker/CMakeLists.txt
index cd0283055..de8932790 100644
--- a/sbncode/CAFMaker/CMakeLists.txt
+++ b/sbncode/CAFMaker/CMakeLists.txt
@@ -34,6 +34,7 @@ art_make_library( LIBRARY_NAME sbncode_CAFMaker
                   sbnobj::Common_CRT
                   sbnobj::Common_Reco
                   sbnobj::Common_Analysis
+                  sbnobj::SBND_CRT
                   lardataalg::DetectorInfo
                   art::Framework_Services_System_TriggerNamesService_service
                   sbncode_Metadata_MetadataSBN_service
diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx
index 0655b1c02..1f8e0e8e9 100644
--- a/sbncode/CAFMaker/FillReco.cxx
+++ b/sbncode/CAFMaker/FillReco.cxx
@@ -112,6 +112,31 @@ namespace caf
     srtrack.hitb.plane = track.plane2;
   }
 
+  void FillCRTSpacePoint(const sbnd::crt::CRTSpacePoint &spacepoint,
+                         caf::SRCRTSpacePoint &srspacepoint,
+                         bool allowEmpty)
+  {
+    srspacepoint.position     = SRVector3D(spacepoint.X(), spacepoint.Y(), spacepoint.Z());
+    srspacepoint.position_err = SRVector3D(spacepoint.XErr(), spacepoint.YErr(), spacepoint.ZErr());
+    srspacepoint.pe           = spacepoint.PE();
+    srspacepoint.time         = spacepoint.Time();
+    srspacepoint.time_err     = spacepoint.TimeErr();
+    srspacepoint.complete     = spacepoint.Complete();
+  }
+
+  void FillSBNDCRTTrack(const sbnd::crt::CRTTrack &track,
+                        caf::SRSBNDCRTTrack &srsbndcrttrack,
+                        bool allowEmpty)
+  {
+    for(auto const& point : track.Points())
+      srsbndcrttrack.points.emplace_back(point.X(), point.Y(), point.Z());
+
+    srsbndcrttrack.time    = track.Time();
+    srsbndcrttrack.time_err = track.TimeErr();
+    srsbndcrttrack.pe       = track.PE();
+    srsbndcrttrack.tof      = track.ToF();
+  }
+
   void FillCRTPMTMatch(const sbn::crt::CRTPMTMatching &match,
 		       caf::SRCRTPMTMatch &srmatch,
 		       bool allowEmpty){
@@ -540,6 +565,24 @@ namespace caf
     }
   }
 
+  void FillTrackCRTSpacePoint(const anab::T0 &t0match,
+                              const art::Ptr<sbnd::crt::CRTSpacePoint> &spacepointmatch,
+                              caf::SRTrack &srtrack,
+                              bool allowEmpty)
+  {
+    srtrack.crtspacepoint.score = t0match.fTriggerConfidence;
+    FillCRTSpacePoint(*spacepointmatch, srtrack.crtspacepoint.spacepoint);
+  }
+
+  void FillTrackSBNDCRTTrack(const anab::T0 &t0match,
+                             const art::Ptr<sbnd::crt::CRTTrack> &trackmatch,
+                             caf::SRTrack &srtrack,
+                             bool allowEmpty)
+  {
+    srtrack.crtsbndtrack.score = t0match.fTriggerConfidence;
+    FillSBNDCRTTrack(*trackmatch, srtrack.crtsbndtrack.track);
+  }
+
   void FillTrackMCS(const recob::Track& track,
                     const std::array<std::vector<art::Ptr<recob::MCSFitResult>>, 4> &mcs_results,
                     caf::SRTrack& srtrack,
diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h
index ff68916a1..3049947b5 100644
--- a/sbncode/CAFMaker/FillReco.h
+++ b/sbncode/CAFMaker/FillReco.h
@@ -37,6 +37,8 @@
 #include "sbnobj/Common/Reco/TPCPMTBarycenterMatch.h"
 #include "sbnobj/Common/CRT/CRTHit.hh"
 #include "sbnobj/Common/CRT/CRTTrack.hh"
+#include "sbnobj/SBND/CRT/CRTSpacePoint.hh"
+#include "sbnobj/SBND/CRT/CRTTrack.hh"
 #include "sbnobj/Common/CRT/CRTPMTMatching.hh"
 #include "nusimdata/SimulationBase/MCParticle.h"
 #include "nusimdata/SimulationBase/MCTruth.h"
@@ -135,6 +137,16 @@ namespace caf
                        caf::SRTrack &srtrack,
                        bool allowEmpty = false);
 
+  void FillTrackCRTSpacePoint(const anab::T0 &t0match,
+                              const art::Ptr<sbnd::crt::CRTSpacePoint> &spacepointmatch,
+                              caf::SRTrack &srtrack,
+                              bool allowEmpty = false);
+
+  void FillTrackSBNDCRTTrack(const anab::T0 &t0match,
+                             const art::Ptr<sbnd::crt::CRTTrack> &trackmatch,
+                             caf::SRTrack &srtrack,
+                             bool allowEmpty = false);
+
   void FillTrackMCS(const recob::Track& track,
                     const std::array<std::vector<art::Ptr<recob::MCSFitResult>>, 4> &mcs_results,
                     caf::SRTrack& srtrack,
@@ -193,6 +205,14 @@ namespace caf
                   caf::SRCRTTrack &srtrack,
                   bool allowEmpty = false);
 
+  void FillCRTSpacePoint(const sbnd::crt::CRTSpacePoint &spacepoint,
+                         caf::SRCRTSpacePoint &srspacepoint,
+                         bool allowEmpty = false);
+
+  void FillSBNDCRTTrack(const sbnd::crt::CRTTrack &track,
+                        caf::SRSBNDCRTTrack &srsbndcrttrack,
+                        bool allowEmpty = false);
+
   void FillOpFlash(const recob::OpFlash &flash,
                   std::vector<recob::OpHit const*> const& hits,
                   int cryo,
diff --git a/sbncode/CosmicID/CMakeLists.txt b/sbncode/CosmicID/CMakeLists.txt
index 4ab97c17f..527721870 100644
--- a/sbncode/CosmicID/CMakeLists.txt
+++ b/sbncode/CosmicID/CMakeLists.txt
@@ -4,6 +4,7 @@ cet_build_plugin( CRUMBS art::module
           fhiclcpp::fhiclcpp
           art::Persistency_Provenance canvas::canvas
           sbnobj::Common_Reco
+          sbnobj::SBND_CRT
           sbncode_GeoWrappers
           sbncode_LArRecoProducer
           lardataobj::RecoBase_AssnsDicts_dict
diff --git a/sbncode/CosmicID/CRUMBS_module.cc b/sbncode/CosmicID/CRUMBS_module.cc
index 469787d6b..d4c583b34 100644
--- a/sbncode/CosmicID/CRUMBS_module.cc
+++ b/sbncode/CosmicID/CRUMBS_module.cc
@@ -40,6 +40,8 @@
 #include "sbnobj/Common/Reco/SimpleFlashMatchVars.h"
 #include "sbnobj/Common/Reco/StoppingChi2Fit.h"
 #include "sbncode/LArRecoProducer/TrackStoppingChi2Alg.h"
+#include "sbnobj/SBND/CRT/CRTTrack.hh"
+#include "sbnobj/SBND/CRT/CRTSpacePoint.hh"
 #include "sbnobj/Common/Reco/CRUMBSResult.h"
 
 #include "TTree.h"
@@ -70,31 +72,31 @@ namespace sbn {
     void GetMaps(art::Event const& e, std::map<int, int> &trackIDToGenMap, std::map<int, std::string> &genTypeMap,
 		 std::map<int, int> &genCCNCMap, std::map<int, int> &genNuTypeMap);
 
-    art::Ptr<recob::PFParticle> GetSlicePrimary(art::Event const& e, 
-                                                const art::Ptr<recob::Slice> &slice, 
+    art::Ptr<recob::PFParticle> GetSlicePrimary(art::Event const& e,
+                                                const art::Ptr<recob::Slice> &slice,
                                                 const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
 
-    std::vector<art::Ptr<anab::T0> > GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, 
-                                                    const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
-                                                    const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
+    std::vector<anab::T0> GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice,
+                                         const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
+                                         const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
 
-    std::vector<art::Ptr<anab::T0> > GetCRTHitT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, 
-                                                  const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
-                                                  const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
+    std::vector<anab::T0> GetCRTSPT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice,
+                                      const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
+                                      const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
 
-    float GetLongestTrackStoppingChi2Ratio(art::Event const& e, const art::Ptr<recob::Slice> &slice, 
+    float GetLongestTrackStoppingChi2Ratio(art::Event const& e, const art::Ptr<recob::Slice> &slice,
                                            const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
                                            const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
 
-    void FillCRTVars(const std::vector<art::Ptr<anab::T0> > &trackT0s, const std::vector<art::Ptr<anab::T0> > &hitT0s);
+    void FillCRTVars(const std::vector<anab::T0> &trackT0s, const std::vector<anab::T0> &hitT0s);
 
     void FillPandoraNuScoreVars(std::map<std::string, float> &propertiesMap);
 
-    std::vector<art::Ptr<recob::Hit> > GetAllSliceHits(art::Event const& e, 
-                                                       const art::Ptr<recob::Slice> &slice, 
+    std::vector<art::Ptr<recob::Hit> > GetAllSliceHits(art::Event const& e,
+                                                       const art::Ptr<recob::Slice> &slice,
                                                        const art::ValidHandle<std::vector<recob::Slice> > &handleSlices);
 
-    void GetTruthMatching(art::Event const& e, const std::vector<art::Ptr<recob::Hit> > &sliceHits, const std::vector<art::Ptr<recob::Hit> > &allHits, 
+    void GetTruthMatching(art::Event const& e, const std::vector<art::Ptr<recob::Hit> > &sliceHits, const std::vector<art::Ptr<recob::Hit> > &allHits,
                           std::map<int, int> &trackIDToGenMap, int &matchedID, double &purity, double &completeness);
 
     int SliceTruthId(std::map<int, float> &purities);
@@ -106,7 +108,7 @@ namespace sbn {
 
     // Module labels
     std::string fMCParticleModuleLabel, fGeneratorModuleLabel, fCosmicModuleLabel, fPFParticleModuleLabel, fHitModuleLabel, fTrackModuleLabel, fSliceModuleLabel, 
-      fFlashMatchModuleLabel, fCRTTrackMatchModuleLabel, fCRTHitMatchModuleLabel, fCalorimetryModuleLabel;
+      fFlashMatchModuleLabel, fCRTTrackMatchModuleLabel, fCRTSPMatchModuleLabel, fCalorimetryModuleLabel;
 
     // MVA location and type for loading
     std::string fMVAName, fMVAFileName, fCCNuMuMVAName, fCCNuMuMVAFileName, fCCNuEMVAName, fCCNuEMVAFileName, fNCMVAName, fNCMVAFileName;
@@ -159,9 +161,9 @@ namespace sbn {
 
     // CRT Track and Hit Matching Variables
     float crt_TrackScore;                // a combination of the DCA and angle between the best matched TPC & CRT tracks
-    float crt_HitScore;                  // the best distance from an extrapolated TPC track to a CRT hit [cm]
+    float crt_SPScore;                   // the best distance from an extrapolated TPC track to a CRT SP [cm]
     float crt_TrackTime;                 // the time associated with the matched CRT track [us]
-    float crt_HitTime;                   // the time associated with the matched CRT hit [us]
+    float crt_SPTime;                    // the time associated with the matched CRT SP [us]
   };
 
 
@@ -180,7 +182,7 @@ namespace sbn {
     fSliceModuleLabel             (p.get<std::string>("SliceModuleLabel")),
     fFlashMatchModuleLabel        (p.get<std::string>("FlashMatchModuleLabel")),
     fCRTTrackMatchModuleLabel     (p.get<std::string>("CRTTrackMatchModuleLabel")),
-    fCRTHitMatchModuleLabel       (p.get<std::string>("CRTHitMatchModuleLabel")),
+    fCRTSPMatchModuleLabel        (p.get<std::string>("CRTSPMatchModuleLabel")),
     fCalorimetryModuleLabel       (p.get<std::string>("CalorimetryModuleLabel")),
     fMVAName                      (p.get<std::string>("MVAName")),
     fMVAFileName                  (p.get<std::string>("MVAFileName")),
@@ -227,9 +229,9 @@ namespace sbn {
           fSliceTree->Branch("pds_FMTime",&pds_FMTime);
 
           fSliceTree->Branch("crt_TrackScore",&crt_TrackScore);
-          fSliceTree->Branch("crt_HitScore",&crt_HitScore);
+          fSliceTree->Branch("crt_SPScore",&crt_SPScore);
           fSliceTree->Branch("crt_TrackTime",&crt_TrackTime);
-          fSliceTree->Branch("crt_HitTime",&crt_HitTime);
+          fSliceTree->Branch("crt_SPTime",&crt_SPTime);
 
           fSliceTree->Branch("eventID",&eventID);
           fSliceTree->Branch("subRunID",&subRunID);
@@ -262,9 +264,9 @@ namespace sbn {
     mvaReader.AddVariable("pds_FMTime",&pds_FMTime);
 
     mvaReader.AddVariable("crt_TrackScore",&crt_TrackScore);
-    mvaReader.AddVariable("crt_HitScore",&crt_HitScore);
+    mvaReader.AddVariable("crt_HitScore",&crt_SPScore);
     mvaReader.AddVariable("crt_TrackTime",&crt_TrackTime);
-    mvaReader.AddVariable("crt_HitTime",&crt_HitTime);
+    mvaReader.AddVariable("crt_HitTime",&crt_SPTime);
 
     cet::search_path searchPath("FW_SEARCH_PATH");
     std::string weightFileFullPath;
@@ -282,7 +284,7 @@ namespace sbn {
 
     pds_FMTotalScore = -999999.; pds_FMPE = -999999.; pds_FMTime = -500.;
 
-    crt_TrackScore = -4.; crt_HitScore = -4.; crt_TrackTime = -3000; crt_HitTime = -3000;
+    crt_TrackScore = -4.; crt_SPScore = -4.; crt_TrackTime = -3000; crt_SPTime = -3000;
 
     slicePDG = 999999;
     matchedType = "";
@@ -396,14 +398,14 @@ namespace sbn {
 
         const std::vector<art::Ptr<larpandoraobj::PFParticleMetadata> > pfpMetaVec = pfpMetadataAssoc.at(primary.key());
         const std::vector<art::Ptr<sbn::SimpleFlashMatch> > pfpFMVec = pfpFMAssoc.at(primary.key());
-        const std::vector<art::Ptr<anab::T0> > sliceCRTTrackT0s = this->GetCRTTrackT0s(e, slice, handlePFPs, handleSlices);
-        const std::vector<art::Ptr<anab::T0> > sliceCRTHitT0s = this->GetCRTHitT0s(e, slice, handlePFPs, handleSlices);
+        const std::vector<anab::T0> sliceCRTTrackT0s = this->GetCRTTrackT0s(e, slice, handlePFPs, handleSlices);
+        const std::vector<anab::T0> sliceCRTSPT0s = this->GetCRTSPT0s(e, slice, handlePFPs, handleSlices);
 
-        this->FillCRTVars(sliceCRTTrackT0s, sliceCRTHitT0s);
+        this->FillCRTVars(sliceCRTTrackT0s, sliceCRTSPT0s);
 
         const art::Ptr<larpandoraobj::PFParticleMetadata> pfpMeta = pfpMetaVec.front();
         std::map<std::string, float> propertiesMap = pfpMeta->GetPropertiesMap();
-      
+
         this->FillPandoraNuScoreVars(propertiesMap);
 
         tpc_StoppingChi2CosmicRatio = this->GetLongestTrackStoppingChi2Ratio(e, slice, handlePFPs, handleSlices);
@@ -426,8 +428,8 @@ namespace sbn {
 	    resultsVec->emplace_back(score, ccnumuscore, ccnuescore, ncscore, bestscore, bestid, tpc_CRFracHitsInLongestTrack, tpc_CRLongestTrackDeflection, 
 				     tpc_CRLongestTrackDirY, std::round(tpc_CRNHitsMax), tpc_NuEigenRatioInSphere, std::round(tpc_NuNFinalStatePfos), 
 				     std::round(tpc_NuNHitsTotal), std::round(tpc_NuNSpacePointsInSphere), tpc_NuVertexY, tpc_NuWeightedDirZ, 
-				     tpc_StoppingChi2CosmicRatio, pds_FMTotalScore, pds_FMPE, pds_FMTime, crt_TrackScore, crt_HitScore, 
-				     crt_TrackTime, crt_HitTime);
+				     tpc_StoppingChi2CosmicRatio, pds_FMTotalScore, pds_FMPE, pds_FMTime, crt_TrackScore, crt_SPScore, 
+				     crt_TrackTime, crt_SPTime);
 	    
 	    util::CreateAssn(*this, e, *resultsVec, slice, *sliceAssns);
 	  }
@@ -456,28 +458,28 @@ namespace sbn {
       }
   }
 
-  void CRUMBS::FillCRTVars(const std::vector<art::Ptr<anab::T0> > &trackT0s, const std::vector<art::Ptr<anab::T0> > &hitT0s)
+  void CRUMBS::FillCRTVars(const std::vector<anab::T0> &trackT0s, const std::vector<anab::T0> &spT0s)
   {
     if (!trackT0s.empty()){
       crt_TrackScore = std::numeric_limits<float>::max();
       for(auto const crttrackmatcht0 : trackT0s)
         {
-          if(crttrackmatcht0->TriggerConfidence() < crt_TrackScore)
+          if(crttrackmatcht0.TriggerConfidence() < crt_TrackScore)
             {
-              crt_TrackScore = crttrackmatcht0->TriggerConfidence();
-              crt_TrackTime = crttrackmatcht0->Time() * 1e-3;
+              crt_TrackScore = crttrackmatcht0.TriggerConfidence();
+              crt_TrackTime  = crttrackmatcht0.Time() * 1e-3;
             }
         }
     }
   
-    if (!hitT0s.empty()){
-      crt_HitScore = std::numeric_limits<float>::max();
-      for(auto const crthitmatcht0 : hitT0s)
+    if (!spT0s.empty()){
+      crt_SPScore = std::numeric_limits<float>::max();
+      for(auto const crtspmatcht0 : spT0s)
         {
-          if(crthitmatcht0->TriggerConfidence() < crt_HitScore)
+          if(crtspmatcht0.TriggerConfidence() < crt_SPScore)
             {
-              crt_HitScore = crthitmatcht0->TriggerConfidence();
-              crt_HitTime = crthitmatcht0->Time() * 1e-3;
+              crt_SPScore = crtspmatcht0.TriggerConfidence();
+              crt_SPTime  = crtspmatcht0.Time() * 1e-3;
             }
         }
     }
@@ -625,17 +627,17 @@ namespace sbn {
       completeness = sliceHitMap[matchedID] / (float) totalTrueHits;
   }
 
-  std::vector<art::Ptr<anab::T0> > CRUMBS::GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
-                                                          const art::ValidHandle<std::vector<recob::Slice> > &handleSlices)
+  std::vector<anab::T0> CRUMBS::GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
+                                               const art::ValidHandle<std::vector<recob::Slice> > &handleSlices)
   {
-    std::vector<art::Ptr<anab::T0> > t0Vec;
+    std::vector<anab::T0> t0Vec;
 
     art::Handle<std::vector<recob::Track> > handleTracks;
     e.getByLabel(fTrackModuleLabel, handleTracks);
 
     art::FindManyP<recob::PFParticle> slicePFPAssn(handleSlices,e,fSliceModuleLabel);
     art::FindManyP<recob::Track> pfpTrackAssn(handlePFPs,e,fTrackModuleLabel);
-    art::FindManyP<anab::T0> trackT0Assn(handleTracks,e,fCRTTrackMatchModuleLabel);
+    art::FindOneP<sbnd::crt::CRTTrack, anab::T0> trackT0Assn(handleTracks,e,fCRTTrackMatchModuleLabel);
 
     const std::vector<art::Ptr<recob::PFParticle> > pfps = slicePFPAssn.at(slice.key());
   
@@ -651,24 +653,29 @@ namespace sbn {
 
         const art::Ptr<recob::Track> track = tracks.front();
 
-        const std::vector<art::Ptr<anab::T0> > t0s = trackT0Assn.at(track.key());
-        t0Vec.insert(t0Vec.end(), t0s.begin(), t0s.end());
+	const art::Ptr<sbnd::crt::CRTTrack> crttrack = trackT0Assn.at(track.key());
+
+	if(crttrack.isNonnull())
+	  {
+	    const anab::T0 t0 = trackT0Assn.data(track.key()).ref();
+	    t0Vec.push_back(t0);
+	  }
       }
   
     return t0Vec;
   }
 
-  std::vector<art::Ptr<anab::T0> > CRUMBS::GetCRTHitT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
-                                                        const art::ValidHandle<std::vector<recob::Slice> > &handleSlices)
+  std::vector<anab::T0> CRUMBS::GetCRTSPT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs,
+                                            const art::ValidHandle<std::vector<recob::Slice> > &handleSlices)
   {
-    std::vector<art::Ptr<anab::T0> > t0Vec;
+    std::vector<anab::T0> t0Vec;
 
     art::Handle<std::vector<recob::Track> > handleTracks;
     e.getByLabel(fTrackModuleLabel, handleTracks);
 
     art::FindManyP<recob::PFParticle> slicePFPAssn(handleSlices,e,fSliceModuleLabel);
     art::FindManyP<recob::Track> pfpTrackAssn(handlePFPs,e,fTrackModuleLabel);
-    art::FindManyP<anab::T0> trackT0Assn(handleTracks,e,fCRTHitMatchModuleLabel);
+    art::FindOneP<sbnd::crt::CRTSpacePoint, anab::T0> trackT0Assn(handleTracks,e,fCRTSPMatchModuleLabel);
 
     const std::vector<art::Ptr<recob::PFParticle> > pfps = slicePFPAssn.at(slice.key());
   
@@ -684,8 +691,13 @@ namespace sbn {
 
         const art::Ptr<recob::Track> track = tracks.front();
 
-        const std::vector<art::Ptr<anab::T0> > t0s = trackT0Assn.at(track.key());
-        t0Vec.insert(t0Vec.end(), t0s.begin(), t0s.end());
+	const art::Ptr<sbnd::crt::CRTSpacePoint> crtsp = trackT0Assn.at(track.key());
+
+	if(crtsp.isNonnull())
+	  {
+	    const anab::T0 t0 = trackT0Assn.data(track.key()).ref();
+	    t0Vec.push_back(t0);
+	  }
       }
   
     return t0Vec;
diff --git a/sbncode/CosmicID/sbn_crumbs_producer.fcl b/sbncode/CosmicID/sbn_crumbs_producer.fcl
index a71af130d..08600df57 100644
--- a/sbncode/CosmicID/sbn_crumbs_producer.fcl
+++ b/sbncode/CosmicID/sbn_crumbs_producer.fcl
@@ -13,8 +13,8 @@ crumbs_sbnd:
   TrackModuleLabel:			"pandoraTrack"
   SliceModuleLabel:			"pandora"
   FlashMatchModuleLabel:		"fmatch"
-  CRTTrackMatchModuleLabel:		"crttrackt0"
-  CRTHitMatchModuleLabel:		"crthitt0"
+  CRTTrackMatchModuleLabel:		"crttrackmatching"
+  CRTSPMatchModuleLabel:		"crtspacepointmatching"
   CalorimetryModuleLabel:		"pandoraCalo"
   
   MVAName:                              "BDT"
diff --git a/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C b/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C
index 6cc90416f..bc757d4a4 100644
--- a/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C
+++ b/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C
@@ -91,9 +91,9 @@ void TrainCRUMBSInstance(const TString outDirName, TTree *inputTree,
   dataloader->AddVariable("pds_FMTime","FM Time","#mu s",'F');
 
   dataloader->AddVariable("crt_TrackScore","CRT Track Match Score","",'F');
-  dataloader->AddVariable("crt_HitScore","CRT Hit Match Score","",'F');
+  dataloader->AddVariable("crt_SPScore","CRT SpacePoint Match Score","",'F');
   dataloader->AddVariable("crt_TrackTime","CRT Track Match Time","#mu s",'F');
-  dataloader->AddVariable("crt_HitTime","CRT Hit Match Time","#mu s",'F');
+  dataloader->AddVariable("crt_SPTime","CRT SpacePoint Match Time","#mu s",'F');
 
   dataloader->AddSignalTree    (inputTree, signalWeight);
   dataloader->AddBackgroundTree(inputTree, backgroundWeight);