diff --git a/src/main/java/org/orekit/rugged/api/RuggedBuilder.java b/src/main/java/org/orekit/rugged/api/RuggedBuilder.java
index af969352bbce1eab13819e6c3ac346c7d9a0c5a1..74578feb190b3cd2479b09de628088c93c87c284 100644
--- a/src/main/java/org/orekit/rugged/api/RuggedBuilder.java
+++ b/src/main/java/org/orekit/rugged/api/RuggedBuilder.java
@@ -405,7 +405,7 @@ public class RuggedBuilder {
      * @see #setTrajectory(double, int, CartesianDerivativesFilter, AngularDerivativesFilter, Propagator)
      * @see #setTrajectoryAndTimeSpan(InputStream)
      * @see #getInertialFrame()
-     * @see #getpositionsVelocities()
+     * @see #getPositionsVelocities()
      * @see #getPVInterpolationNumber()
      * @see #getPVInterpolationNumber()
      * @see #getQuaternions()
@@ -440,7 +440,7 @@ public class RuggedBuilder {
      * @see #setTrajectory(InertialFrameId, List, int, CartesianDerivativesFilter, List, int, AngularDerivativesFilter)
      * @see #setTrajectory(double, int, CartesianDerivativesFilter, AngularDerivativesFilter, Propagator)
      * @see #setTrajectoryAndTimeSpan(InputStream)
-     * @see #getpositionsVelocities()
+     * @see #getPositionsVelocities()
      * @see #getPVInterpolationNumber()
      * @see #getPVInterpolationNumber()
      * @see #getQuaternions()
@@ -510,7 +510,7 @@ public class RuggedBuilder {
      * @return satellite position and velocity (m and m/s in inertial frame)
      * @see #setTrajectory(double, int, CartesianDerivativesFilter, AngularDerivativesFilter, Propagator)
      */
-    public List<TimeStampedPVCoordinates> getpositionsVelocities() {
+    public List<TimeStampedPVCoordinates> getPositionsVelocities() {
         return pvSample;
     }
 
diff --git a/src/main/java/org/orekit/rugged/errors/DumpReplayer.java b/src/main/java/org/orekit/rugged/errors/DumpReplayer.java
index 57dc751644dfb3dc04a46034d3930a02eb218a0d..6075cf7fd10075b3fb825de69b07141ed769d701 100644
--- a/src/main/java/org/orekit/rugged/errors/DumpReplayer.java
+++ b/src/main/java/org/orekit/rugged/errors/DumpReplayer.java
@@ -927,7 +927,7 @@ public class DumpReplayer {
             public void parse(final int l, final File file, final String line, final String[] fields, final DumpReplayer global)
                 throws RuggedException {
                 try {
-                    if (fields.length < 5 || !fields[0].equals(SENSOR_NAME) ||
+                    if (fields.length < 6 || !fields[0].equals(SENSOR_NAME) ||
                         !fields[2].equals(LINE_NUMBER) || !fields[4].equals(DATE)) {
                         throw new RuggedException(RuggedMessages.CANNOT_PARSE_LINE, l, file, line);
                     }
@@ -951,7 +951,7 @@ public class DumpReplayer {
             @Override
             public void parse(final int l, final File file, final String line, final String[] fields, final DumpReplayer global)
                 throws RuggedException {
-                if (fields.length < 5 || !fields[0].equals(SENSOR_NAME) ||
+                if (fields.length < 6 || !fields[0].equals(SENSOR_NAME) ||
                     !fields[2].equals(LINE_NUMBER) || !fields[4].equals(RATE)) {
                     throw new RuggedException(RuggedMessages.CANNOT_PARSE_LINE, l, file, line);
                 }
@@ -984,11 +984,19 @@ public class DumpReplayer {
                 final String parsedKey = line.substring(0, colon).trim().replaceAll(" ", "_").toUpperCase();
                 try {
                     final LineParser parser = LineParser.valueOf(parsedKey);
-                    parser.parse(l, file, line, line.substring(colon + 1).trim().split("\\s+"), global);
+                    final String[] fields;
+                    if (colon + 1 >= line.length()) {
+                        fields = new String[0];
+                    } else {
+                        fields = line.substring(colon + 1).trim().split("\\s+");
+                    }
+                    parser.parse(l, file, line, fields, global);
                 } catch (IllegalArgumentException iae) {
                     throw new RuggedException(RuggedMessages.CANNOT_PARSE_LINE, l, file, line);
                 }
 
+            } else {
+                throw new RuggedException(RuggedMessages.CANNOT_PARSE_LINE, l, file, line);
             }
 
         }
@@ -1260,33 +1268,6 @@ public class DumpReplayer {
 
         }
 
-        /** {@inheritDoc} */
-        @Override
-        public double getLine(final AbsoluteDate date) {
-
-            if (datation.size() < 2) {
-                return datation.get(0).getFirst();
-            }
-
-            // find entries bracketing the date
-            int sup = 0;
-            while (sup < datation.size() - 1) {
-                if (datation.get(sup).getSecond().compareTo(date) >= 0) {
-                    break;
-                }
-                ++sup;
-            }
-            final int inf = (sup == 0) ? sup++ : (sup - 1);
-
-            final double       lInf  = datation.get(inf).getFirst();
-            final AbsoluteDate dInf  = datation.get(inf).getSecond();
-            final double       lSup  = datation.get(sup).getFirst();
-            final AbsoluteDate dSup  = datation.get(sup).getSecond();
-            final double       alpha = date.durationFrom(dInf) / dSup.durationFrom(dInf);
-            return alpha * lSup + (1 - alpha) * lInf;
-
-        }
-
         /** Set a rate.
          * @param lineNumber line number
          * @param rate lines rate
diff --git a/src/main/java/org/orekit/rugged/errors/RuggedException.java b/src/main/java/org/orekit/rugged/errors/RuggedException.java
index dadc358e76064e0bdd6db96f11df7afba3954ee9..7bb5d728cfc6d5226990640010a2188b46ef047e 100644
--- a/src/main/java/org/orekit/rugged/errors/RuggedException.java
+++ b/src/main/java/org/orekit/rugged/errors/RuggedException.java
@@ -16,13 +16,12 @@
  */
 package org.orekit.rugged.errors;
 
-import org.hipparchus.exception.Localizable;
-import org.hipparchus.exception.LocalizedException;
-import org.hipparchus.exception.MathRuntimeException;
-
 import java.text.MessageFormat;
 import java.util.Locale;
 
+import org.hipparchus.exception.Localizable;
+import org.hipparchus.exception.LocalizedException;
+
 
 /** This class is the base class for all specific exceptions thrown by
  * the rugged library classes.
@@ -57,26 +56,6 @@ public class RuggedException extends Exception implements LocalizedException {
         this.parts     = (parts == null) ? new Object[0] : parts.clone();
     }
 
-    /** Copy constructor.
-     * @param exception exception to copy from
-     */
-    public RuggedException(final RuggedException exception) {
-        super(exception);
-        this.specifier = exception.specifier;
-        this.parts     = exception.parts.clone();
-    }
-
-    /** Simple constructor.
-     * Build an exception from a cause and with a specified message
-     * @param message descriptive message
-     * @param cause underlying cause
-     */
-    public RuggedException(final Localizable message, final Throwable cause) {
-        super(cause);
-        this.specifier = message;
-        this.parts     = new Object[0];
-    }
-
     /** Simple constructor.
      * Build an exception from a cause and with a translated and formatted message
      * @param cause underlying cause
@@ -90,16 +69,6 @@ public class RuggedException extends Exception implements LocalizedException {
         this.parts     = (parts == null) ? new Object[0] : parts.clone();
     }
 
-    /** Simple constructor.
-     * Build an exception from an Hipparchus exception
-     * @param exception underlying Hipparchus exception
-     */
-    public RuggedException(final MathRuntimeException exception) {
-        super(exception);
-        this.specifier = exception.getSpecifier();
-        this.parts     = exception.getParts();
-    }
-
     /** {@inheritDoc} */
     @Override
     public String getMessage(final Locale locale) {
diff --git a/src/test/java/org/orekit/rugged/api/RuggedBuilderTest.java b/src/test/java/org/orekit/rugged/api/RuggedBuilderTest.java
index 758987401d2bcf1e0972c2342a2692a1cc4cb5dd..3f0e9bebdf1032cfa7b65e90bf8b1c052ace7af5 100644
--- a/src/test/java/org/orekit/rugged/api/RuggedBuilderTest.java
+++ b/src/test/java/org/orekit/rugged/api/RuggedBuilderTest.java
@@ -154,26 +154,126 @@ public class RuggedBuilderTest {
         RuggedBuilder builder = new RuggedBuilder().
                                 setDigitalElevationModel(updater, 8).
                                 setAlgorithm(AlgorithmId.DUVENHAGE).
-                                setEllipsoid(EllipsoidId.GRS80, BodyRotatingFrameId.ITRF).
-                                setTimeSpan(pv.get(0).getDate(), pv.get(pv.size() - 1).getDate(), 0.001, 5.0).
-                                setTrajectory(InertialFrameId.EME2000,
-                                              pv, 8, CartesianDerivativesFilter.USE_PV,
-                                              q, 8, AngularDerivativesFilter.USE_R);
+                                setTimeSpan(pv.get(0).getDate(), pv.get(pv.size() - 1).getDate(), 0.001, 5.0);
+        try {
+            builder.build();
+            Assert.fail("an exception should have been thrown");
+        } catch (RuggedException re) {
+            Assert.assertEquals(RuggedMessages.UNINITIALIZED_CONTEXT, re.getSpecifier());
+            Assert.assertEquals("RuggedBuilder.setEllipsoid()", re.getParts()[0]);
+        }
+        builder.setEllipsoid(EllipsoidId.GRS80, BodyRotatingFrameId.ITRF);
+        try {
+            builder.build();
+            Assert.fail("an exception should have been thrown");
+        } catch (RuggedException re) {
+            Assert.assertEquals(RuggedMessages.UNINITIALIZED_CONTEXT, re.getSpecifier());
+            Assert.assertEquals("RuggedBuilder.setTrajectory()", re.getParts()[0]);
+        }
+        builder.setTrajectory(InertialFrameId.EME2000,
+                              pv, 8, CartesianDerivativesFilter.USE_PV,
+                              q, 8, AngularDerivativesFilter.USE_R);
+        Assert.assertSame(FramesFactory.getEME2000(), builder.getInertialFrame());
 
         // light time correction and aberration of light correction are enabled by default
         Rugged rugged = builder.build();
         Assert.assertTrue(rugged.isLightTimeCorrected());
         Assert.assertTrue(rugged.isAberrationOfLightCorrected());
+        Assert.assertTrue(builder.getLightTimeCorrection());
+        Assert.assertTrue(builder.getAberrationOfLightCorrection());
 
         builder.setLightTimeCorrection(false);
         rugged = builder.build();
         Assert.assertFalse(rugged.isLightTimeCorrected());
         Assert.assertTrue(rugged.isAberrationOfLightCorrected());
+        Assert.assertFalse(builder.getLightTimeCorrection());
+        Assert.assertTrue(builder.getAberrationOfLightCorrection());
 
         builder.setAberrationOfLightCorrection(false);
         rugged = builder.build();
         Assert.assertFalse(rugged.isLightTimeCorrected());
         Assert.assertFalse(rugged.isAberrationOfLightCorrected());
+        Assert.assertFalse(builder.getLightTimeCorrection());
+        Assert.assertFalse(builder.getAberrationOfLightCorrection());
+
+        Assert.assertEquals(AlgorithmId.DUVENHAGE, builder.getAlgorithm());
+        Assert.assertEquals(6378137.0, builder.getEllipsoid().getEquatorialRadius(), 1.0e-9);
+        Assert.assertEquals(1.0 / 298.257222101, builder.getEllipsoid().getFlattening(), 1.0e-10);
+        Assert.assertSame(updater, builder.getTileUpdater());
+        Assert.assertEquals(8, builder.getMaxCachedTiles());
+        Assert.assertTrue(Double.isNaN(builder.getConstantElevation()));
+        Assert.assertEquals(pv.get(0).getDate(), builder.getMinDate());
+        Assert.assertEquals(pv.get(pv.size() - 1).getDate(), builder.getMaxDate());
+        Assert.assertEquals(0.001, builder.getTStep(), 1.0e-10);
+        Assert.assertEquals(5.0, builder.getOvershootTolerance(), 1.0e-10);
+        Assert.assertSame(FramesFactory.getEME2000(), builder.getInertialFrame());
+        Assert.assertSame(pv, builder.getPositionsVelocities());
+        Assert.assertEquals(8, builder.getPVInterpolationNumber());
+        Assert.assertEquals(CartesianDerivativesFilter.USE_PV, builder.getPVFilter());
+        Assert.assertSame(q,  builder.getQuaternions());
+        Assert.assertEquals(8, builder.getAInterpolationNumber());
+        Assert.assertEquals(AngularDerivativesFilter.USE_R, builder.getAFilter());
+
+        Assert.assertTrue(builder.getLineSensors().isEmpty());
+        LineSensor lineSensor = new LineSensor("line", new LinearLineDatation(t0, 2000 / 2, 1.0 / 1.5e-3),
+                                               Vector3D.ZERO,
+                                               createLOSPerfectLine(Vector3D.PLUS_K,
+                                                                    Vector3D.PLUS_I, FastMath.toRadians(1.0), 2000));
+        builder.addLineSensor(lineSensor);
+        Assert.assertEquals(1, builder.getLineSensors().size());
+        Assert.assertSame(lineSensor, builder.getLineSensors().get(0));
+        builder.clearLineSensors();
+        Assert.assertTrue(builder.getLineSensors().isEmpty());
+
+        builder.setTrajectory(InertialFrameId.GCRF,
+                              pv, 8, CartesianDerivativesFilter.USE_PV,
+                              q, 8, AngularDerivativesFilter.USE_R);
+        Assert.assertSame(FramesFactory.getGCRF(), builder.getInertialFrame());
+        builder.setTrajectory(InertialFrameId.MOD,
+                              pv, 8, CartesianDerivativesFilter.USE_PV,
+                              q, 8, AngularDerivativesFilter.USE_R);
+        Assert.assertSame(FramesFactory.getMOD(IERSConventions.IERS_1996), builder.getInertialFrame());
+        builder.setTrajectory(InertialFrameId.TOD,
+                              pv, 8, CartesianDerivativesFilter.USE_PV,
+                              q, 8, AngularDerivativesFilter.USE_R);
+        Assert.assertSame(FramesFactory.getTOD(IERSConventions.IERS_1996, true), builder.getInertialFrame());
+        builder.setTrajectory(InertialFrameId.VEIS1950,
+                              pv, 8, CartesianDerivativesFilter.USE_PV,
+                              q, 8, AngularDerivativesFilter.USE_R);
+        Assert.assertSame(FramesFactory.getVeis1950(), builder.getInertialFrame());
+
+        builder.setAlgorithm(null);
+        try {
+            builder.build();
+            Assert.fail("an exception should have been thrown");
+        } catch (RuggedException re) {
+            Assert.assertEquals(RuggedMessages.UNINITIALIZED_CONTEXT, re.getSpecifier());
+            Assert.assertEquals("RuggedBuilder.setAlgorithmID()", re.getParts()[0]);
+        }
+
+        builder.setAlgorithm(AlgorithmId.CONSTANT_ELEVATION_OVER_ELLIPSOID);
+        builder.setConstantElevation(Double.NaN);
+        try {
+            builder.build();
+            Assert.fail("an exception should have been thrown");
+        } catch (RuggedException re) {
+            Assert.assertEquals(RuggedMessages.UNINITIALIZED_CONTEXT, re.getSpecifier());
+            Assert.assertEquals("RuggedBuilder.setConstantElevation()", re.getParts()[0]);
+        }
+        builder.setConstantElevation(100.0);
+        Assert.assertNotNull(builder.build());
+
+        builder.setAlgorithm(AlgorithmId.BASIC_SLOW_EXHAUSTIVE_SCAN_FOR_TESTS_ONLY);
+        builder.setDigitalElevationModel(null, 8);
+        try {
+            builder.build();
+            Assert.fail("an exception should have been thrown");
+        } catch (RuggedException re) {
+            Assert.assertEquals(RuggedMessages.UNINITIALIZED_CONTEXT, re.getSpecifier());
+            Assert.assertEquals("RuggedBuilder.setDigitalElevationModel()", re.getParts()[0]);
+        }
+        builder.setDigitalElevationModel(updater, 8);
+        Assert.assertNotNull(builder.build());
 
     }
 
diff --git a/src/test/java/org/orekit/rugged/errors/DumpManagerTest.java b/src/test/java/org/orekit/rugged/errors/DumpManagerTest.java
index 98774339b1fd3d61a8fc371238103633a7dae9ff..f431a7483812de1822098b9ec92bca1414411ea6 100644
--- a/src/test/java/org/orekit/rugged/errors/DumpManagerTest.java
+++ b/src/test/java/org/orekit/rugged/errors/DumpManagerTest.java
@@ -17,16 +17,16 @@
 package org.orekit.rugged.errors;
 
 
-import org.hipparchus.geometry.euclidean.threed.Rotation;
-import org.hipparchus.geometry.euclidean.threed.RotationConvention;
-import org.hipparchus.geometry.euclidean.threed.Vector3D;
-import org.hipparchus.util.FastMath;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.net.URISyntaxException;
 
+import org.hipparchus.geometry.euclidean.threed.Rotation;
+import org.hipparchus.geometry.euclidean.threed.RotationConvention;
+import org.hipparchus.geometry.euclidean.threed.Vector3D;
+import org.hipparchus.util.FastMath;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
@@ -47,6 +47,7 @@ import org.orekit.rugged.api.RuggedBuilder;
 import org.orekit.rugged.linesensor.LineDatation;
 import org.orekit.rugged.linesensor.LineSensor;
 import org.orekit.rugged.linesensor.LinearLineDatation;
+import org.orekit.rugged.linesensor.SensorPixel;
 import org.orekit.rugged.los.TimeDependentLOS;
 import org.orekit.rugged.raster.RandomLandscapeUpdater;
 import org.orekit.rugged.raster.TileUpdater;
@@ -66,71 +67,85 @@ public class DumpManagerTest {
 
         File dump = tempFolder.newFile();
         DumpManager.activate(dump);
-        locationsinglePoint();
+        variousRuggedCalls();
         DumpManager.deactivate();
 
-        int countAlgorithm       = 0;
-        int countEllipsoid       = 0;
-        int countSpan            = 0;
-        int countTransform       = 0;
-        int countDEMTile         = 0;
-        int countDEMCell         = 0;
-        int countDirectLoc       = 0;
-        int countDirectLocResult = 0;
-        int countSensor          = 0;
-        int countSensorLOS       = 0;
-        int countSensorDatation      = 0;
-        int countSensorRate      = 0;
-        BufferedReader br = new BufferedReader(new FileReader(dump));
-        for (String line = br.readLine(); line != null; line = br.readLine()) {
-            String trimmed = line.trim();
-            if (trimmed.length() > 0 && !trimmed.startsWith("#")){
-                if (trimmed.startsWith("algorithm:")) {
-                    ++countAlgorithm;
-                } else if (trimmed.startsWith("ellipsoid:")) {
-                    ++countEllipsoid;
-                } else if (trimmed.startsWith("span:")) {
-                    ++countSpan;
-                } else if (trimmed.startsWith("transform:")) {
-                    ++countTransform;
-                } else if (trimmed.startsWith("DEM tile:")) {
-                    ++countDEMTile;
-                } else if (trimmed.startsWith("DEM cell:")) {
-                    ++countDEMCell;
-                } else if (trimmed.startsWith("direct location:")) {
-                    ++countDirectLoc;
-                } else if (trimmed.startsWith("direct location result:")) {
-                    ++countDirectLocResult;
-                } else if (trimmed.startsWith("sensor:")) {
-                    ++countSensor;
-                } else if (trimmed.startsWith("sensor datation:")) {
-                    ++countSensorDatation;
-                } else if (trimmed.startsWith("sensor LOS:")) {
-                    ++countSensorLOS;
-                } else if (trimmed.startsWith("sensor rate:")) {
-                    ++countSensorRate;
-                } else {
-                   Assert.fail(line);
+        int countAlgorithm        = 0;
+        int countEllipsoid        = 0;
+        int countDirectLoc        = 0;
+        int countDirectLocResult  = 0;
+        int countSpan             = 0;
+        int countTransform        = 0;
+        int countDEMTile          = 0;
+        int countDEMCell          = 0;
+        int countInverseLoc       = 0;
+        int countInverseLocResult = 0;
+        int countSensor           = 0;
+        int countSensorMeanPlane  = 0;
+        int countSensorLOS        = 0;
+        int countSensorDatation   = 0;
+        int countSensorRate       = 0;
+        try (final FileReader     fr = new FileReader(dump);
+             final BufferedReader br = new BufferedReader(fr)) {
+            for (String line = br.readLine(); line != null; line = br.readLine()) {
+                String trimmed = line.trim();
+                if (trimmed.length() > 0 && !trimmed.startsWith("#")){
+                    if (trimmed.startsWith("algorithm:")) {
+                        ++countAlgorithm;
+                    } else if (trimmed.startsWith("ellipsoid:")) {
+                        ++countEllipsoid;
+                    } else if (trimmed.startsWith("direct location:")) {
+                        ++countDirectLoc;
+                    } else if (trimmed.startsWith("direct location result:")) {
+                        ++countDirectLocResult;
+                    } else if (trimmed.startsWith("span:")) {
+                        ++countSpan;
+                    } else if (trimmed.startsWith("transform:")) {
+                        ++countTransform;
+                    } else if (trimmed.startsWith("DEM tile:")) {
+                        ++countDEMTile;
+                    } else if (trimmed.startsWith("DEM cell:")) {
+                        ++countDEMCell;
+                    } else if (trimmed.startsWith("inverse location:")) {
+                        ++countInverseLoc;
+                    } else if (trimmed.startsWith("inverse location result:")) {
+                        ++countInverseLocResult;
+                    } else if (trimmed.startsWith("sensor:")) {
+                        ++countSensor;
+                    } else if (trimmed.startsWith("sensor mean plane:")) {
+                        ++countSensorMeanPlane;
+                    } else if (trimmed.startsWith("sensor LOS:")) {
+                        ++countSensorLOS;
+                    } else if (trimmed.startsWith("sensor datation:")) {
+                        ++countSensorDatation;
+                    } else if (trimmed.startsWith("sensor rate:")) {
+                        ++countSensorRate;
+                    } else {
+                        Assert.fail(line);
+                    }
                 }
             }
         }
-        br.close();
+
         Assert.assertEquals(1,   countAlgorithm);
         Assert.assertEquals(1,   countEllipsoid);
+        Assert.assertEquals(400, countDirectLoc);
+        Assert.assertEquals(400, countDirectLocResult);
         Assert.assertEquals(1,   countSpan);
-        Assert.assertEquals(1,   countTransform);
+        Assert.assertEquals(2,   countTransform);
         Assert.assertEquals(2,   countDEMTile);
         Assert.assertEquals(812, countDEMCell);
-        Assert.assertEquals(400, countDirectLoc);
-        Assert.assertEquals(400, countDirectLocResult);
+        Assert.assertEquals(5,   countInverseLoc);
+        Assert.assertEquals(5,   countInverseLocResult);
         Assert.assertEquals(1,   countSensor);
-        Assert.assertEquals(200, countSensorLOS);
-        Assert.assertEquals(3,   countSensorDatation);
-        Assert.assertEquals(0,   countSensorRate);
+        Assert.assertEquals(1,   countSensorMeanPlane);
+        Assert.assertEquals(422, countSensorLOS);
+        Assert.assertEquals(19,  countSensorDatation);
+        Assert.assertEquals(6,   countSensorRate);
 
     }
 
-   public void locationsinglePoint()
+   public void variousRuggedCalls()
         throws RuggedException, OrekitException, URISyntaxException {
 
        int dimension = 200;
@@ -183,8 +198,50 @@ public class DumpManagerTest {
            Assert.assertEquals(gpLine[i].getLatitude(),  gpPixel.getLatitude(),  1.0e-10);
            Assert.assertEquals(gpLine[i].getLongitude(), gpPixel.getLongitude(), 1.0e-10);
            Assert.assertEquals(gpLine[i].getAltitude(),  gpPixel.getAltitude(),  1.0e-10);
+
+           if (i % 45 == 0) {
+               SensorPixel sp = rugged.inverseLocation(lineSensor.getName(), gpPixel, 0, 179);
+               Assert.assertEquals(100, sp.getLineNumber(), 1.0e-5);
+               Assert.assertEquals(i, sp.getPixelNumber(), 6.0e-9);
+           }
        }
 
     }
 
+   @Test
+   public void testAlreadyActive() throws URISyntaxException, IOException, OrekitException, RuggedException {
+
+       DumpManager.activate(tempFolder.newFile());
+       try {
+           DumpManager.activate(tempFolder.newFile());
+           Assert.fail("an exception should have been thrown");
+       } catch (RuggedException re) {
+           Assert.assertEquals(RuggedMessages.DEBUG_DUMP_ALREADY_ACTIVE, re.getSpecifier());
+       } finally {
+           DumpManager.deactivate();
+       }
+   }
+
+   @Test
+   public void testNotActive() throws URISyntaxException, IOException, OrekitException, RuggedException {
+       try {
+           DumpManager.deactivate();
+           Assert.fail("an exception should have been thrown");
+       } catch (RuggedException re) {
+           Assert.assertEquals(RuggedMessages.DEBUG_DUMP_NOT_ACTIVE, re.getSpecifier());
+       }
+   }
+
+   @Test
+   public void testWriteError() throws URISyntaxException, IOException, OrekitException, RuggedException {
+       try {
+           File dump = tempFolder.newFile();
+           dump.setReadOnly();
+           DumpManager.activate(dump);
+           Assert.fail("an exception should have been thrown");
+       } catch (RuggedException re) {
+           Assert.assertEquals(RuggedMessages.DEBUG_DUMP_ACTIVATION_ERROR, re.getSpecifier());
+       }
+   }
+
 }
diff --git a/src/test/java/org/orekit/rugged/errors/DumpReplayerTest.java b/src/test/java/org/orekit/rugged/errors/DumpReplayerTest.java
index 5258ed15c7b00b9245a9a5e64fc4cb07fe4485a5..426e84b9fa558bbf4db49bc20e4c7622a3d070f8 100644
--- a/src/test/java/org/orekit/rugged/errors/DumpReplayerTest.java
+++ b/src/test/java/org/orekit/rugged/errors/DumpReplayerTest.java
@@ -17,13 +17,20 @@
 package org.orekit.rugged.errors;
 
 
-import org.hipparchus.geometry.euclidean.threed.Vector3D;
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
 
+import org.hipparchus.geometry.euclidean.threed.Vector3D;
 import org.junit.Assert;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.orekit.bodies.GeodeticPoint;
 import org.orekit.data.DataProvidersManager;
 import org.orekit.data.DirectoryCrawler;
@@ -33,6 +40,9 @@ import org.orekit.rugged.linesensor.SensorPixel;
 
 public class DumpReplayerTest {
 
+    @Rule
+    public TemporaryFolder tempFolder = new TemporaryFolder();
+
     @Test
     public void testDirectLoc01() throws URISyntaxException, IOException, OrekitException, RuggedException {
 
@@ -102,6 +112,37 @@ public class DumpReplayerTest {
 
     }
 
+    @Test
+    public void testDirectLoc04() throws URISyntaxException, IOException, OrekitException, RuggedException {
+
+        String orekitPath = getClass().getClassLoader().getResource("orekit-data").toURI().getPath();
+        DataProvidersManager.getInstance().addProvider(new DirectoryCrawler(new File(orekitPath)));
+
+        String dumpPath = getClass().getClassLoader().getResource("replay/replay-direct-loc-04.txt").toURI().getPath();
+        File dump = tempFolder.newFile();
+        DumpManager.activate(dump);
+        DumpReplayer replayer = new DumpReplayer();
+        replayer.parse(new File(dumpPath));
+        Rugged rugged = replayer.createRugged();
+        DumpReplayer.Result[] results = replayer.execute(rugged);
+        DumpManager.deactivate();
+
+        Assert.assertEquals(3, results.length);
+        for (final DumpReplayer.Result result : results) {
+            GeodeticPoint expectedGP = (GeodeticPoint) result.getExpected();
+            GeodeticPoint replayedGP = (GeodeticPoint) result.getReplayed();
+            double distance = Vector3D.distance(rugged.getEllipsoid().transform(expectedGP),
+                                                rugged.getEllipsoid().transform(replayedGP));
+            Assert.assertEquals(0.0, distance, 1.0e-8);
+        }
+
+        try (FileReader fr = new FileReader(dump);
+             BufferedReader br = new BufferedReader(fr)) {
+            Assert.assertEquals(12, br.lines().count());
+        }
+
+    }
+
     @Test
     public void testInverseLoc01() throws URISyntaxException, IOException, OrekitException, RuggedException {
 
@@ -168,4 +209,54 @@ public class DumpReplayerTest {
 
     }
 
+    @Test
+    public void testCorruptedFiles() throws URISyntaxException, IOException, OrekitException, RuggedException {
+
+        String orekitPath = getClass().getClassLoader().getResource("orekit-data").toURI().getPath();
+        DataProvidersManager.getInstance().addProvider(new DirectoryCrawler(new File(orekitPath)));
+
+        File folder = new File(getClass().getClassLoader().getResource("replay/replay-direct-loc-01.txt").toURI().getPath()).getParentFile();
+        for (final File file : folder.listFiles()) {
+
+            // split all data lines into fields
+            final List<String[]> lines = new ArrayList<>();
+            try (FileReader fr = new FileReader(file);
+                 BufferedReader br = new BufferedReader(fr)) {
+                br.lines().
+                   filter(line -> {
+                       String trimmed = line.trim();
+                       return trimmed.length() > 0 && !trimmed.startsWith("#");
+                   }).
+                   forEach(line -> lines.add(line.split("\\s+")));
+            }
+
+            // for each field of each line, delete the field and check parsing fails
+            for (int i = 0; i < lines.size(); ++i) {
+                for (int j = 0; j < lines.get(i).length; ++j) {
+                    File corrupted = tempFolder.newFile();
+                    try (PrintWriter pw = new PrintWriter(corrupted)) {
+                        for (int k = 0; k < lines.size(); ++k) {
+                            for (int l = 0; l < lines.get(k).length; ++l) {
+                                if (k != i || l != j) {
+                                    pw.print(' ');
+                                    pw.print(lines.get(k)[l]);
+                                }
+                            }
+                            pw.println();
+                        }
+                    }
+                    try {
+                        new DumpReplayer().parse(corrupted);
+                        Assert.fail("an exception should have been thrown");
+                    } catch (RuggedException re) {
+                        Assert.assertEquals(RuggedMessages.CANNOT_PARSE_LINE, re.getSpecifier());
+                        Assert.assertEquals(i + 1, ((Integer) re.getParts()[0]).intValue());
+                        Assert.assertEquals(corrupted, re.getParts()[1]);
+                    }
+                }
+            }
+        }
+        
+    }
+
 }
diff --git a/src/test/java/org/orekit/rugged/errors/RuggedExceptionTest.java b/src/test/java/org/orekit/rugged/errors/RuggedExceptionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4bfc24cadc5e9c0b73ec15f2f324a32dc2585949
--- /dev/null
+++ b/src/test/java/org/orekit/rugged/errors/RuggedExceptionTest.java
@@ -0,0 +1,72 @@
+/* Copyright 2013-2016 CS Systèmes d'Information
+ * Licensed to CS Systèmes d'Information (CS) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * CS licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.orekit.rugged.errors;
+
+
+import java.util.Locale;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RuggedExceptionTest {
+
+    @Test
+    public void testTranslation() {
+        RuggedException re = new RuggedException(RuggedMessages.DUPLICATED_PARAMETER_NAME, "dummy");
+        Assert.assertFalse(re.getMessage(Locale.FRENCH).contains("parameter"));
+        Assert.assertTrue(re.getMessage(Locale.FRENCH).contains("paramètre"));
+        Assert.assertTrue(re.getMessage(Locale.FRENCH).contains("dummy"));
+        Assert.assertTrue(re.getMessage(Locale.US).contains("parameter"));
+        Assert.assertFalse(re.getMessage(Locale.US).contains("paramètre"));
+        Assert.assertTrue(re.getMessage(Locale.US).contains("dummy"));
+        Assert.assertEquals(re.getMessage(), re.getMessage(Locale.US));
+    }
+
+    @Test
+    public void testParameters() {
+        RuggedException re = new RuggedException(RuggedMessages.DUPLICATED_PARAMETER_NAME, "dummy");
+        Assert.assertEquals(RuggedMessages.DUPLICATED_PARAMETER_NAME, re.getSpecifier());
+        Assert.assertEquals("dummy", re.getParts()[0]);
+    }
+
+    @Test
+    public void testNullSpecifier() {
+        RuggedException re = new RuggedException(null, (Object[]) null);
+        Assert.assertEquals("", re.getMessage());
+    }
+
+    @Test
+    public void testNullParts() {
+        RuggedException re1 = new RuggedException(RuggedMessages.NO_PARAMETERS_SELECTED, (Object[]) null);
+        Assert.assertEquals(RuggedMessages.NO_PARAMETERS_SELECTED, re1.getSpecifier());
+        Assert.assertEquals(0, re1.getParts().length);
+        RuggedException re2 = new RuggedException(new RuntimeException(),
+                                                  RuggedMessages.NO_PARAMETERS_SELECTED, (Object[]) null);
+        Assert.assertEquals(RuggedMessages.NO_PARAMETERS_SELECTED, re2.getSpecifier());
+        Assert.assertEquals(0, re2.getParts().length);
+    }
+
+    @Test
+    public void testInternalError() {
+        RuggedException re = new RuggedException(RuggedMessages.DUPLICATED_PARAMETER_NAME, "dummy");
+        RuntimeException rte = RuggedException.createInternalError(re);
+        Assert.assertFalse(re.getLocalizedMessage().contains("rugged-developers@orekit.org"));
+        Assert.assertTrue(rte.getLocalizedMessage().contains("rugged-developers@orekit.org"));
+        Assert.assertTrue(rte.getMessage().contains("rugged-developers@orekit.org"));
+    }
+
+}
diff --git a/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java b/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java
index 0dd7a08111f024d3f8f68b945cef6c343ec742fb..ed059b2efad41c430482e7e8cd546b84b3e87eac 100644
--- a/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java
+++ b/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java
@@ -88,6 +88,14 @@ public class RuggedMessagesTest {
         }
     }
 
+    @Test
+    public void testMissingLanguageFallback() {
+        for (RuggedMessages message : RuggedMessages.values()) {
+            String translated = message.getLocalizedString(Locale.TRADITIONAL_CHINESE);
+            Assert.assertEquals(message.getSourceString(), translated);
+        }
+    }
+
     @Test
     public void testVariablePartsConsistency() {
         for (final String language : new String[] { "de", "en", "es", "fr", "gl", "it", "no", "ro" } ) {
diff --git a/src/test/resources/replay/replay-direct-loc-04.txt b/src/test/resources/replay/replay-direct-loc-04.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c0f72295b154107887802b1190c2c0558d78df94
--- /dev/null
+++ b/src/test/resources/replay/replay-direct-loc-04.txt
@@ -0,0 +1,17 @@
+# Rugged library dump file, created on 2016-08-25T11:36:58Z
+# all units are SI units (m, m/s, rad ...)
+sensor: sensorName s0 nbPixels 200 position  1.500000000000000e+00  0.000000000000000e+00 -2.000000000000000e-01
+sensor datation: sensorName s0 lineNumber  1.000000000000000e+02 date 2012-01-01T12:30:00.00000000000000Z
+sensor LOS: sensorName s0 date 2012-01-01T12:30:00.00000000000000Z pixelNumber 0 los  0.000000000000000e+00 -7.547095802227720e-01  6.560590289905073e-01
+direct location: date 2012-01-01T12:30:00.00000000000000Z position  1.500000000000000e+00  0.000000000000000e+00 -2.000000000000000e-01 los  0.000000000000000e+00 -7.547095802227720e-01  6.560590289905073e-01 lightTime true aberration true
+span: minDate 2012-01-01T12:29:59.85000000000000Z maxDate 2012-01-01T12:30:00.15000000000000Z tStep  1.000000000000000e-03 tolerance  5.000000000000000e+00 inertialFrame EME2000
+transform: index 150 body r -8.085963389171905e-01 -3.465415132634738e-04  4.896468952577882e-04 -5.883634938068593e-01 Ω -8.740475539607400e-08  1.215132816692757e-09 -7.292109805268452e-05 ΩDot -1.641702845856317e-16  8.967282378770661e-17  1.982686818602039e-19 spacecraft p  1.384771423699730e+04  3.157872644810937e+03 -7.179504513218164e+06 v -3.193269795630194e+01 -8.025701643721955e+00  8.276060585691415e+00 a -9.306383564355984e-01 -8.320024052654388e+00  1.352798609222994e-03 r -6.828948932119083e-01  4.142451147050121e-01 -3.878489669751732e-01  4.600312256623658e-01 Ω -1.009835943938631e-03  1.982939067387613e-04  1.645926841490188e-04 ΩDot -3.647402648477413e-07  2.008713174452711e-07 -1.257148546282535e-06
+ellipsoid: ae  6.378137000000000e+06 f  3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
+algorithm: CONSTANT_ELEVATION_OVER_ELLIPSOID elevation  1.000000000000000e+02
+direct location result: latitude -3.947439031048142e-01 longitude  2.499247813392400e+00 elevation  1.000000008142965e+02
+sensor LOS: sensorName s0 date 2012-01-01T12:30:00.00000000000000Z pixelNumber 1 los  0.000000000000000e+00 -7.548246479094037e-01  6.559266353095021e-01
+direct location: date 2012-01-01T12:30:00.00000000000000Z position  1.500000000000000e+00  0.000000000000000e+00 -2.000000000000000e-01 los  0.000000000000000e+00 -7.548246479094037e-01  6.559266353095021e-01 lightTime true aberration true
+direct location result: latitude -3.947552846081879e-01 longitude  2.499172490136166e+00 elevation  1.000000008170387e+02
+sensor LOS: sensorName s0 date 2012-01-01T12:30:00.00000000000000Z pixelNumber 2 los  0.000000000000000e+00 -7.549396923710934e-01  6.557942214465139e-01
+direct location: date 2012-01-01T12:30:00.00000000000000Z position  1.500000000000000e+00  0.000000000000000e+00 -2.000000000000000e-01 los  0.000000000000000e+00 -7.549396923710934e-01  6.557942214465139e-01 lightTime true aberration true
+direct location result: latitude -3.947666718219440e-01 longitude  2.499097114958829e+00 elevation  1.000000008196107e+02