diff --git a/eic_data.yaml b/eic_data.yaml
index f7bbbb12777c6c265590a132eb7ab54bb5d20b24..54b38e4cfea2cc01655d516ed6ec032eb44ae974 100644
--- a/eic_data.yaml
+++ b/eic_data.yaml
@@ -6,14 +6,11 @@ options :
   exposePODMembers: False
   includeSubfolder: True
 
-## right now we rigurously enforce:
-##  - No breaking of PODness:
-##        - No use of relations and vectors
-##     - Use special Relation structures where needed, indexing by ID (index)
-##        - IDs are stored as eic::Index, which is a thin layer of an signed integer
-##          where -1 relates to "no index".
-##        - For 1-to-many relations: Use many-to-1 IDs instead --> use forward links
-##          This puts the burden on the reconstruction algorithm and keeps the data 2D!
+## Some guidance:
+##  - Ensure data products usable without library dependencies (favor PODness where
+##    possible).
+##  - Move towards EDM4hep compatibility (to allow a transition to mainly use EDM4hep).
+##        - migrate away from custom indices in favor of podio relations
 ##  - Use float most of the time except for 4-vectors where ppm precision is important.
 ##  - Data alignment: 
 ##        - data should be aligned with a 64-bit structure where possible.
@@ -213,6 +210,34 @@ components:
         double operator()(unsigned i, unsigned j) const {return (i == j) ? *(&xx + i) : 0.;}\n
         "
 
+  eic::CovXY:
+    Members:
+      - float xx
+      - float yy
+      - float xy
+    ExtraCode:
+      declaration: "
+        CovXY() : xx{0}, yy{0}, xy{0} {}\n
+        CovXY(double vx, double vy, double vxy)\n
+          : xx{static_cast<float>(vx)}, yy{static_cast<float>(vy)}, xy{static_cast<float>(vxy)} {}\n
+        float operator()(unsigned i, unsigned j) const {\n
+          // diagonal\n
+          if (i == j) {\n
+            return *(&xx + i);\n
+          }\n
+          // off-diagonal\n
+          // we have as options (0, 1), and (1, 0)\n
+          // note that, starting from xy, we find the correct element at (i+j-1)\n
+          return *(&xy + i + j - 1);\n
+        }\n
+      "
+  ## ProtoCluster hit relation
+  eic::ProtoClusterHit:
+    Members:
+      - eic::Index  ID            // ID of the hit
+      - uint32_t    index         // Raw index of the hit in the relevant array
+      - eic::Weight weight        // weight of the hit
+
   eic::CovXYZ:
     Members:
       - float xx
@@ -245,14 +270,20 @@ components:
       - uint32_t    index         // Raw index of the hit in the relevant array
       - eic::Weight weight        // weight of the hit
 
-  ## A point along a trajectory
-  eic::TrajectoryPoint:
-    Members:
-      - eic::VectorXYZ    position      // Position of the trajectory point [mm]
-      - eic::VectorXYZ    p             // 3-momentum at the point [GeV]
-      - eic::Direction    direction     // (theta, phi) direction of track at the surface [mrad]
-      - float             momentum      // magnitude of 3-momentum [GeV]
-      - float             pathlength    // Pathlength from the origin to this point
+  ## A point along a track
+  eic::TrackPoint:
+    Members:
+      - eic::VectorXYZ    position        // Position of the trajectory point [mm]
+      - eic::CovXYZ       positionError   // Error on the position
+      - eic::VectorXYZ    momentum        // 3-momentum at the point [GeV]
+      - eic::CovXYZ       momentumError   // Error on the 3-momentum
+      - float             time            // Time at this point [ns]
+      - float             timeError       // Error on the time at this point
+      - float             theta           // polar direction of the track at the surface [rad]
+      - float             phi             // azimuthal direction of the track at the surface [rad]
+      - eic::CovXY        directionError  // Error on the polar and azimuthal angles
+      - float             pathlength      // Pathlength from the origin to this point
+      - float             pathlengthError // Error on the pathlenght
  
 datatypes:
 
@@ -301,7 +332,7 @@ datatypes:
       - int16_t           status            // Status code
       - int16_t           charge            // Particle charge (or sign)
       - eic::Weight       weight            // Particle weight, e.g. from PID algorithm [0-1]
-      - eic::Direction    direction         // Direction (theta/phi of this particle [mrad])
+      - eic::Direction    direction         // Direction (theta/phi of this particle [rad])
       - float             momentum          // particle 3-momentum magnitude [GeV]
       - float             energy            // Particle energy, consistent with PID assigment [GeV]
       - float             mass              // The mass of the particle in [GeV]
@@ -472,42 +503,67 @@ datatypes:
     ##     eic::Weight      weight            // prototrack weight, in case we share pixels [0-1]
     ##   VectorMembers:
     ##     int32_t          hits              // tracker hit indicies
+    
+  eic::Trajectory:
+    Description: "Raw trajectory from the tracking algorithm"
+    Author: "S. Joosten, S. Li"
+    Members:
+      - uint32_t          type              // 0 (does not have good track fit), 1 (has good track fit)
+      - uint32_t          nStates           // Number of tracking steps
+      - uint32_t          nMeasurements     // Number of hits used 
+      - uint32_t          nOutliers         // Number of hits not considered 
+      - uint32_t          nHoles            // Number of missing hits
+      - float             chi2              // Total chi2
+      - uint32_t          ndf               // Number of degrees of freedom
+      - uint32_t          nSharedHits       // Number of shared hits with other trajectories
+    VectorMembers:
+      - float             measurementChi2   // Chi2 for each of the measurements
+      - float             outlierChi2       // Chi2 for each of the outliers
+    OneToManyRelations:
+      - eic::TrackerHit   measurementHits   // Measurement hits used in this trajectory
+      - eic::TrackerHit   outlierHits       // Outlier hits not used in this trajectory
   
   eic::TrackParameters:
     Description: "ACTS Bound Track parameters"
     Author: "W. Armstrong, S. Joosten"
     Members:
-      - eic::Index        ID                // Unique track ID.
-      - eic::FloatPair    loc               // Tracking location
-      - eic::FloatPair    locError          // Error on the location
-      - eic::Direction    direction         // Track direction (theta, phi) [rad, 0-pi and -pi->pi]
-      - eic::Direction    directionError    // Error on the direction [rad]
+      - int32_t           type              // Type of track parameters (0/head, ...)
+      - eic::VectorXY     loc               // 2D location on surface
+      - float             theta             // Track polar angle [rad]
+      - float             phi               // Track azimuthal angle [rad]
       - float             qOverP            // [e/GeV]
-      - float             qOverPError       // Error on qOverP
       - float             time              // Track time [ns]    
-      - float             timeError         // Error on the time
-      - float             charge            // Assumed track charge, units of [e]
-
-  eic::Trajectory:
-    Description: "Trajectory"
-    Author: "W. Armstrong, S. Joosten"
-    Members:
-      - eic::Index        ID                // Unique trajectory ID
-      - eic::Index        trackID           // Corresponding track ID
-      - eic::VectorXYZ    p                 // 3-momentum at the vertex for the trajectory
-      - float             charge            // Charge of the particle trajectory
-    VectorMembers:
-      - eic::TrajectoryPoint  points        // Points along this trajectory
+      - std::array<float, 15> covMatrix     // Lower triangle of the track parameter covariance matrix
+    OneToOneRelations:
+      - eic::Trajectory   trajectory        // Trajectory associated with these track parameters
 
   eic::Track:
-    Description: "Track information"
-    Author: "W. Armstrong, S. Joosten"
+    Description: "Track information at the vertex"
+    Author: "S. Joosten"
+    Members:
+      - int32_t           type              // Flag that defines the type of track
+      - float             chi2              // Total chi2 (sum) of the track fit
+      - int32_t           ndf               // Numbers of degrees of freedom of the track fit
+      - eic::VectorXYZ    momentum          // Track 3-momentum at the vertex [GeV]
+      - eic::CovXYZ       momentumError     // Covariance matrix on the momentum
+      - float             time              // Track time at the vertex [ns]
+      - float             timeError         // Error on the track vertex time
+      - float             charge            // Particle charge
+    OneToManyRelations:
+      - eic::TrackParameters parameters     // Track fit parameters, the first entry (if present) is evaluated at the track head
+      - eic::TrackerHit   trackerHits       // Hits that were used for this track
+      - eic::Track        tracks            // Tracks (segments) that have been combined to create this track
+
+  eic::TrackProjection:
+    Description: "The position of a particle track at a set of reference surfaces."
+    Author: "S. Joosten"
     Members:
-      - eic::Index        ID                // Unique track ID, same as the ID in the corresponding TrackParameters
-      - eic::VectorXYZ    p                 // Track momementum
-      - float             charge            // Charge of particle trajectory
-      - float             length            // Track length from first to last hit[mm]
-      - float             TOF               // Time of flight from first to last hit [ns]
+      - eic::VectorXYZ    momentum          // Track 3-momenutm
+      - float             charge            // Particle charge
+    OneToOneRelations:
+      - eic::Track        track             // Track used for this projection
+    VectorMembers:
+      - eic::TrackPoint   points            // Points where the track parameters were evaluated
 
   ## ==========================================================================
   ## Vertexing
diff --git a/source/include/eicd/helpers.h b/source/include/eicd/helpers.h
index 07df974d8628d56dd2625010313b4171461890bf..0fb2e9d6d31ed0760c029f6ccc5d4d9469b6ea1d 100644
--- a/source/include/eicd/helpers.h
+++ b/source/include/eicd/helpers.h
@@ -32,9 +32,9 @@ namespace eicd::helpers {
         return ROOT::Math::PxPyPzMVector{};
       }
       const double p  = fabs(1. / track.qOverP);
-      const double px = p * cos(track.direction.phi) * sin(track.direction.theta);
-      const double py = p * sin(track.direction.phi) * sin(track.direction.theta);
-      const double pz = p * cos(track.direction.theta);
+      const double px = p * cos(track.phi) * sin(track.theta);
+      const double py = p * sin(track.phi) * sin(track.theta);
+      const double pz = p * cos(track.theta);
       return ROOT::Math::PxPyPzMVector{px, py, pz, mass};
     });
     return momenta;