diff --git a/src/main/java/org/orekit/rugged/errors/Dump.java b/src/main/java/org/orekit/rugged/errors/Dump.java
new file mode 100644
index 0000000000000000000000000000000000000000..10b11f1db8eb4f54f23052cff75424cbdca67948
--- /dev/null
+++ b/src/main/java/org/orekit/rugged/errors/Dump.java
@@ -0,0 +1,157 @@
+/* Copyright 2013-2015 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.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.commons.math3.util.OpenIntToDoubleHashMap;
+import org.orekit.rugged.raster.Tile;
+
+/**
+ * Dump data class.
+ * @author Luc Maisonobe
+ */
+class Dump {
+
+    /** Dump file. */
+    private final PrintWriter writer;
+
+    /** Tiles map. */
+    private final List<DumpedTileData> tiles;
+
+    /** Simple constructor.
+     * @param writer writer to the dump file
+     */
+    public Dump(final PrintWriter writer) {
+        this.writer = writer;
+        this.tiles  = new ArrayList<DumpedTileData>();
+        dumpHeader();
+    }
+
+    /** Dump header.
+     */
+    private void dumpHeader() {
+        writer.format(Locale.US,
+                      "# Rugged library dump file, created on %1$tFT%1$tTZ%n",
+                      Calendar.getInstance(TimeZone.getTimeZone("Etc/UTC"), Locale.US));
+        writer.format(Locale.US,
+                      "# all units are SI units (m, m/s, rad ...)%n");
+    }
+
+    /** Dump some context data.
+     * @param tile tile to which the cell belongs
+     * @param latitudeIndex latitude index of the South neighbors of the cell
+     * @param longitudeIndex longitude index of the West neighbors of the cell
+     * @param e00 elevation of the South-West neighbor of the cell
+     * @param e10 elevation of the South-East neighbor of the cell
+     * @param e01 elevation of the North-West neighbor of the cell
+     * @param e11 elevation of the North-East neighbor of the cell
+     */
+    public void dumpTileCell(final Tile tile,
+                             final int latitudeIndex, final int longitudeIndex,
+                             final double e00, final double e10, final double e01, final double e11) {
+        final DumpedTileData dumpedTileData = getTileData(tile);
+        dumpedTileData.setElevation(latitudeIndex,     longitudeIndex,     e00);
+        dumpedTileData.setElevation(latitudeIndex,     longitudeIndex + 1, e10);
+        dumpedTileData.setElevation(latitudeIndex + 1, longitudeIndex,     e01);
+        dumpedTileData.setElevation(latitudeIndex + 1, longitudeIndex + 1, e11);
+    }
+
+    /** Get tile data.
+     * @param tile tile to which the cell belongs
+     * @return index of the tile
+     */
+    private DumpedTileData getTileData(final Tile tile) {
+
+        for (final DumpedTileData dumpedTileData : tiles) {
+            if (tile == dumpedTileData.getTile()) {
+                // the tile is already known
+                return dumpedTileData;
+            }
+        }
+
+        // it is the first time we encounter this tile, we need to dump its data
+        final DumpedTileData dumpedTileData = new DumpedTileData("t" + tiles.size(), tile);
+        tiles.add(dumpedTileData);
+        return dumpedTileData;
+
+    }
+
+    /** Deactivate dump.
+     */
+    public void deactivate() {
+        writer.close();
+    }
+
+    /** Local class for handling already dumped tile data. */
+    private class DumpedTileData {
+
+        /** Name of the tile. */
+        private final String name;
+
+        /** Tile associated with this dump. */
+        private final Tile tile;
+
+        /** Dumped elevations. */
+        private final OpenIntToDoubleHashMap elevations;
+
+        /** Simple constructor.
+         * @param name of the tile
+         * @param tile tile associated with this dump
+         */
+        public DumpedTileData(final String name, final Tile tile) {
+            this.name       = name;
+            this.tile       = tile;
+            this.elevations = new OpenIntToDoubleHashMap();
+            writer.format(Locale.US,
+                          "DEM tile: %s latMin = %22.15e latStep = %22.15e lonMin = %22.15e lonStep = %22.15e%n",
+                          name,
+                          tile.getMinimumLatitude(), tile.getLatitudeStep(),
+                          tile.getMinimumLongitude(), tile.getLongitudeStep());
+        }
+
+        /** Get tile associated with this dump.
+         * @return tile associated with this dump
+         */
+        public Tile getTile() {
+            return tile;
+        }
+
+        /** Set an elevation.
+         * @param latitudeIndex latitude index of the cell
+         * @param longitudeIndex longitude index of the cell
+         * @param elevation elevation of the cell
+         */
+        public void setElevation(final int latitudeIndex, final int longitudeIndex, final double elevation) {
+            final int key = latitudeIndex * tile.getLongitudeColumns() + longitudeIndex;
+            if (!elevations.containsKey(key)) {
+                // new cell
+                elevations.put(key, elevation);
+                writer.format(Locale.US,
+                              "DEM cell: %s latIndex = %d lonIndex = %d elevation = %22.15e%n",
+                              name, latitudeIndex, longitudeIndex, elevation);
+            }
+        }
+
+    }
+
+}
diff --git a/src/main/java/org/orekit/rugged/errors/DumpManager.java b/src/main/java/org/orekit/rugged/errors/DumpManager.java
index 6ce1aa712294dcb382537ddb4249fc5e59ec465e..24c2c8acebd39956ee834beaf992618a1403d8c9 100644
--- a/src/main/java/org/orekit/rugged/errors/DumpManager.java
+++ b/src/main/java/org/orekit/rugged/errors/DumpManager.java
@@ -19,7 +19,8 @@ package org.orekit.rugged.errors;
 import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.Locale;
+
+import org.orekit.rugged.raster.Tile;
 
 /**
  * Class managing debug dumps.
@@ -35,7 +36,7 @@ import java.util.Locale;
 public class DumpManager {
 
     /** Dump file (default initial value is null, i.e. nothing is dumped). */
-    private static final ThreadLocal<PrintWriter> DUMP = new ThreadLocal<PrintWriter>();
+    private static final ThreadLocal<Dump> DUMP = new ThreadLocal<Dump>();
 
     /** Private constructor for utility class.
      */
@@ -53,7 +54,7 @@ public class DumpManager {
             throw new RuggedException(RuggedMessages.DEBUG_DUMP_ALREADY_ACTIVE);
         } else {
             try {
-                DUMP.set(new PrintWriter(file));
+                DUMP.set(new Dump(new PrintWriter(file)));
             } catch (IOException ioe) {
                 throw new RuggedException(ioe, RuggedMessages.DEBUG_DUMP_ACTIVATION_ERROR,
                                           file.getAbsolutePath(), ioe.getLocalizedMessage());
@@ -66,7 +67,7 @@ public class DumpManager {
      */
     public static void deactivate() throws RuggedException {
         if (isActive()) {
-            DUMP.get().close();
+            DUMP.get().deactivate();
             DUMP.set(null);
         } else {
             throw new RuggedException(RuggedMessages.DEBUG_DUMP_ALREADY_ACTIVE);
@@ -81,12 +82,19 @@ public class DumpManager {
     }
 
     /** Dump some context data.
-     * @param msgPattern message pattern
-     * @param args message arguments
+     * @param tile tile to which the cell belongs
+     * @param latitudeIndex latitude index of the South neighbors of the cell
+     * @param longitudeIndex longitude index of the West neighbors of the cell
+     * @param e00 elevation of the South-West neighbor of the cell
+     * @param e10 elevation of the South-East neighbor of the cell
+     * @param e01 elevation of the North-West neighbor of the cell
+     * @param e11 elevation of the North-East neighbor of the cell
      */
-    public static void dump(final String msgPattern, final Object... args) {
+    public static void dumpTileCell(final Tile tile,
+                                    final int latitudeIndex, final int longitudeIndex,
+                                    final double e00, final double e10, final double e01, final double e11) {
         if (isActive()) {
-            DUMP.get().format(Locale.US, msgPattern, args);
+            DUMP.get().dumpTileCell(tile, latitudeIndex, longitudeIndex, e00, e10, e01, e11);
         }
     }
 
diff --git a/src/main/java/org/orekit/rugged/raster/SimpleTile.java b/src/main/java/org/orekit/rugged/raster/SimpleTile.java
index a6643041cfab7d83835237a8b2a8286963a3773a..9f944cff697a09c2bea82c806ab10a36504f4cb7 100644
--- a/src/main/java/org/orekit/rugged/raster/SimpleTile.java
+++ b/src/main/java/org/orekit/rugged/raster/SimpleTile.java
@@ -241,11 +241,7 @@ public class SimpleTile implements Tile {
         final double e01  = getElevationAtIndices(latitudeIndex + 1, longitudeIndex);
         final double e11  = getElevationAtIndices(latitudeIndex + 1, longitudeIndex + 1);
 
-        DumpManager.dump("DEM cell: latMin = %22.15e latStep = %22.15e lonMin = %22.15e lonStep = %22.15e latIndex = %d lonIndex = %d e00 = %22.15e e10 = %22.15e e01 = %22.15e e11 = %22.15e%n",
-                         getMinimumLatitude(), getLatitudeStep(),
-                         getMinimumLongitude(), getLongitudeStep(),
-                         latitudeIndex, longitudeIndex,
-                         e00, e10, e01, e11);
+        DumpManager.dumpTileCell(this, latitudeIndex, longitudeIndex, e00, e10, e01, e11);
 
         return (e00 * (1.0 - dLon) + dLon * e10) * (1.0 - dLat) +
                (e01 * (1.0 - dLon) + dLon * e11) * dLat;