diff --git a/src/main/java/org/orekit/rugged/errors/DumpReplayer.java b/src/main/java/org/orekit/rugged/errors/DumpReplayer.java
index e6d144add5bf026b7fd9c7340dfc5bf1bf4e7f40..813f84333704a127b2b31df558bf6cbfdf7cd7c1 100644
--- a/src/main/java/org/orekit/rugged/errors/DumpReplayer.java
+++ b/src/main/java/org/orekit/rugged/errors/DumpReplayer.java
@@ -17,9 +17,13 @@
 package org.orekit.rugged.errors;
 
 import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -38,6 +42,7 @@ import org.orekit.rugged.api.Rugged;
 import org.orekit.rugged.api.RuggedBuilder;
 import org.orekit.rugged.raster.TileUpdater;
 import org.orekit.rugged.raster.UpdatableTile;
+import org.orekit.rugged.utils.SpacecraftToObservedBody;
 import org.orekit.time.AbsoluteDate;
 import org.orekit.time.TimeScalesFactory;
 
@@ -172,10 +177,10 @@ public class DumpReplayer {
     private Frame inertialFrame;
 
     /** Transforms sample from observed body frame to inertial frame. */
-    private Transform[] bodyToInertial;
+    private List<Transform> bodyToInertial;
 
     /** Transforms sample from spacecraft frame to inertial frame. */
-    private Transform[] scToInertial;
+    private List<Transform> scToInertial;
 
     /** Flag for light time correction. */
     private boolean lightTimeCorrection;
@@ -216,25 +221,39 @@ public class DumpReplayer {
      * @exception RuggedException if some data are inconsistent or incomplete
      */
     public Rugged createRugged() throws RuggedException {
+        try {
+            final RuggedBuilder builder = new RuggedBuilder();
 
-        final RuggedBuilder builder = new RuggedBuilder();
-
-        builder.setAlgorithm(algorithmId);
-        if (algorithmId == AlgorithmId.CONSTANT_ELEVATION_OVER_ELLIPSOID) {
-            builder.setConstantElevation(constantElevation);
-        } else if (algorithmId != AlgorithmId.IGNORE_DEM_USE_ELLIPSOID) {
-            builder.setDigitalElevationModel(new ParsedTilesUpdater(), 8);
-        }
+            builder.setAlgorithm(algorithmId);
+            if (algorithmId == AlgorithmId.CONSTANT_ELEVATION_OVER_ELLIPSOID) {
+                builder.setConstantElevation(constantElevation);
+            } else if (algorithmId != AlgorithmId.IGNORE_DEM_USE_ELLIPSOID) {
+                builder.setDigitalElevationModel(new ParsedTilesUpdater(), 8);
+            }
 
-        builder.setLightTimeCorrection(lightTimeCorrection);
-        builder.setAberrationOfLightCorrection(aberrationOfLightCorrection);
+            builder.setLightTimeCorrection(lightTimeCorrection);
+            builder.setAberrationOfLightCorrection(aberrationOfLightCorrection);
 
-        builder.setEllipsoid(ellipsoid);
+            builder.setEllipsoid(ellipsoid);
 
-        // TODO: set up a SpacecraftToObservedBody instance, serialize it and load it back into the Rugged instance
+            // we use Rugged transforms reloading mechanism to ensure the spacecraft
+            // to body transforms will be the same as the ones dumped
+            final SpacecraftToObservedBody sc2Body =
+                    new SpacecraftToObservedBody(inertialFrame, ellipsoid.getBodyFrame(),
+                                                 minDate, maxDate, tStep, tolerance,
+                                                 bodyToInertial, scToInertial);
+            final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            final ObjectOutputStream    oos = new ObjectOutputStream(bos);
+            oos.writeObject(sc2Body);
+            final ByteArrayInputStream  bis = new ByteArrayInputStream(bos.toByteArray());
+            final ObjectInputStream     ois = new ObjectInputStream(bis);
+            builder.setTrajectoryAndTimeSpan(ois);
 
-        return builder.build();
+            return builder.build();
 
+        } catch (IOException ioe) {
+            throw new RuggedException(ioe, LocalizedFormats.SIMPLE_MESSAGE, ioe.getLocalizedMessage());
+        }
     }
 
     /** Execute all dumped calls.
@@ -375,8 +394,8 @@ public class DumpReplayer {
                     global.tStep          = Double.parseDouble(fields[5]);
                     global.tolerance      = Double.parseDouble(fields[7]);
                     final int n           = (int) FastMath.ceil(global.maxDate.durationFrom(global.minDate) / global.tStep);
-                    global.bodyToInertial = new Transform[n];
-                    global.scToInertial   = new Transform[n];
+                    global.bodyToInertial = new ArrayList<Transform>(n);
+                    global.scToInertial   = new ArrayList<Transform>(n);
                     try {
                         global.inertialFrame = FramesFactory.getFrame(Predefined.valueOf(fields[9]));
                     } catch (IllegalArgumentException iae) {
@@ -407,7 +426,7 @@ public class DumpReplayer {
                 }
                 final int i   = Integer.parseInt(fields[1]);
                 final AbsoluteDate date = global.minDate.shiftedBy(i * global.tStep);
-                global.bodyToInertial[i] =
+                global.bodyToInertial.add(
                         new Transform(date,
                                       new Rotation(Double.parseDouble(fields[4]),
                                                    Double.parseDouble(fields[5]),
@@ -419,8 +438,8 @@ public class DumpReplayer {
                                                    Double.parseDouble(fields[11])),
                                       new Vector3D(Double.parseDouble(fields[13]),
                                                    Double.parseDouble(fields[14]),
-                                                   Double.parseDouble(fields[15])));
-                global.scToInertial[i] =
+                                                   Double.parseDouble(fields[15]))));
+                global.scToInertial.add(
                         new Transform(date,
                                       new Transform(date,
                                                     new Vector3D(Double.parseDouble(fields[18]),
@@ -443,7 +462,7 @@ public class DumpReplayer {
                                                                  Double.parseDouble(fields[37])),
                                                     new Vector3D(Double.parseDouble(fields[39]),
                                                                  Double.parseDouble(fields[40]),
-                                                                 Double.parseDouble(fields[41]))));
+                                                                 Double.parseDouble(fields[41])))));
             }
 
         },
diff --git a/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java b/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java
index c303bb7c664fb6bda75535a9b1970dc27fb394c5..0dd8583ea2ba7a97a8af15ffe99282ef94863b63 100644
--- a/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java
+++ b/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java
@@ -183,6 +183,38 @@ public class SpacecraftToObservedBody implements Serializable {
         }
     }
 
+    /** Simple constructor.
+     * @param inertialFrame inertial frame
+     * @param bodyFrame observed body frame
+     * @param minDate start of search time span
+     * @param maxDate end of search time span
+     * @param tStep step to use for inertial frame to body frame transforms cache computations
+     * @param overshootTolerance tolerance in seconds allowed for {@code minDate} and {@code maxDate} overshooting
+     * slightly the position, velocity and quaternions ephemerides
+     * @param bodyToInertial transforms sample from observed body frame to inertial frame
+     * @param scToInertial transforms sample from spacecraft frame to inertial frame
+     */
+    public SpacecraftToObservedBody(final Frame inertialFrame, final Frame bodyFrame,
+                                    final AbsoluteDate minDate, final AbsoluteDate maxDate, final double tStep,
+                                    final double overshootTolerance,
+                                    final List<Transform> bodyToInertial, final List<Transform> scToInertial) {
+
+        this.inertialFrame      = inertialFrame;
+        this.bodyFrame          = bodyFrame;
+        this.minDate            = minDate;
+        this.maxDate            = maxDate;
+        this.tStep              = tStep;
+        this.overshootTolerance = overshootTolerance;
+        this.bodyToInertial     = bodyToInertial;
+        this.scToInertial       = scToInertial;
+
+        this.inertialToBody = new ArrayList<Transform>(bodyToInertial.size());
+        for (final Transform b2i : bodyToInertial) {
+            inertialToBody.add(b2i.getInverse());
+        }
+
+    }
+
     /** Get the inertial frame.
      * @return inertial frame
      */