diff --git a/rugged-api/src/main/java/org/orekit/rugged/api/TileUpdater.java b/rugged-api/src/main/java/org/orekit/rugged/api/TileUpdater.java
index 2adb19e140410e01553d30d591b1fc9d579db3f2..dd2253597e0e047f41b7dfa4d3b226ec8a2448b7 100644
--- a/rugged-api/src/main/java/org/orekit/rugged/api/TileUpdater.java
+++ b/rugged-api/src/main/java/org/orekit/rugged/api/TileUpdater.java
@@ -30,7 +30,9 @@ public interface TileUpdater {
      * @param latitude latitude that must be covered by the tile
      * @param longitude longitude that must be covered by the tile
      * @param tile to update
+     * @exception RuggedException if tile cannot be updated
      */
-    void updateTile(double latitude, double longitude, UpdatableTile tile);
+    void updateTile(double latitude, double longitude, UpdatableTile tile)
+        throws RuggedException;
 
 }
diff --git a/rugged-api/src/main/java/org/orekit/rugged/api/UpdatableTile.java b/rugged-api/src/main/java/org/orekit/rugged/api/UpdatableTile.java
index d337b724b3e0108866b04d1c777732a3b9407b06..9086a3e383fc35fa260adad7168c2cc0737c0d54 100644
--- a/rugged-api/src/main/java/org/orekit/rugged/api/UpdatableTile.java
+++ b/rugged-api/src/main/java/org/orekit/rugged/api/UpdatableTile.java
@@ -37,9 +37,9 @@ public interface UpdatableTile {
      * @param latitudeIndex index of latitude (row index)
      * @param longitudeIndex index of longitude (column index)
      * @param elevation elevation (m)
-     * @exception IllegalArgumentException if indices are out of bound
+     * @exception RuggedException if indices are out of bound
      */
     void setElevation(int latitudeIndex, int longitudeIndex, double elevation)
-        throws IllegalArgumentException;
+        throws RuggedException;
 
 }
diff --git a/rugged-core/src/main/java/org/orekit/rugged/core/dem/SimpleTile.java b/rugged-core/src/main/java/org/orekit/rugged/core/dem/SimpleTile.java
index 8aac9fa9b7b611bb86b73e873d2ae40c5c4c7a17..aa8407b34a6fadf5705aa96403b6b011fc355dd2 100644
--- a/rugged-core/src/main/java/org/orekit/rugged/core/dem/SimpleTile.java
+++ b/rugged-core/src/main/java/org/orekit/rugged/core/dem/SimpleTile.java
@@ -17,6 +17,8 @@
 package org.orekit.rugged.core.dem;
 
 import org.apache.commons.math3.util.FastMath;
+import org.orekit.rugged.api.RuggedException;
+import org.orekit.rugged.api.RuggedMessages;
 
 /** Simple implementation of a {@link Tile}.
  * @author Luc Maisonobe
@@ -69,7 +71,7 @@ public class SimpleTile implements Tile {
     /** {@inheritDoc} */
     @Override
     public void setElevation(final int latitudeIndex, final int longitudeIndex,
-                             final double elevation) throws IllegalArgumentException {
+                             final double elevation) throws RuggedException {
         checkIndices(latitudeIndex, longitudeIndex);
         elevations[latitudeIndex * longitudeColumns + longitudeIndex] = elevation;
     }
@@ -113,7 +115,7 @@ public class SimpleTile implements Tile {
     /** {@inheritDoc} */
     @Override
     public double getElevationAtIndices(int latitudeIndex, int longitudeIndex)
-        throws IllegalArgumentException {
+        throws RuggedException {
         checkIndices(latitudeIndex, longitudeIndex);
         return elevations[latitudeIndex * longitudeColumns + longitudeIndex];
     }
@@ -133,10 +135,12 @@ public class SimpleTile implements Tile {
      * @exception IllegalArgumentException if indices are out of bound
      */
     private void checkIndices(int latitudeIndex, int longitudeIndex)
-        throws IllegalArgumentException {
+        throws RuggedException {
         if (latitudeIndex  < 0 || latitudeIndex  >= latitudeRows ||
             longitudeIndex < 0 || longitudeIndex >= longitudeColumns) {
-            throw new IllegalArgumentException();
+            throw new RuggedException(RuggedMessages.OUT_OF_TILE_INDICES,
+                                      latitudeIndex, longitudeIndex,
+                                      latitudeRows - 1, longitudeColumns - 1);
         }        
     }
 
diff --git a/rugged-core/src/main/java/org/orekit/rugged/core/dem/Tile.java b/rugged-core/src/main/java/org/orekit/rugged/core/dem/Tile.java
index 82e53d5f4325139b19b4d2a5208f2a0b87ee30f4..554af99c3e0d3529ca361bf554077ecdaa0f5bd6 100644
--- a/rugged-core/src/main/java/org/orekit/rugged/core/dem/Tile.java
+++ b/rugged-core/src/main/java/org/orekit/rugged/core/dem/Tile.java
@@ -16,6 +16,7 @@
  */
 package org.orekit.rugged.core.dem;
 
+import org.orekit.rugged.api.RuggedException;
 import org.orekit.rugged.api.UpdatableTile;
 
 /** Interface representing a raster tile.
@@ -57,10 +58,10 @@ public interface Tile extends UpdatableTile {
      * @param latitudeIndex
      * @param longitudeIndex
      * @return elevation
-     * @exception IllegalArgumentException if indices are out of bound
+     * @exception RuggedException if indices are out of bound
      */
     double getElevationAtIndices(int latitudeIndex, int longitudeIndex)
-        throws IllegalArgumentException;
+        throws RuggedException;
 
     /** Check if a tile covers a ground point.
      * @param latitude ground point latitude
diff --git a/rugged-core/src/main/java/org/orekit/rugged/core/dem/TilesCache.java b/rugged-core/src/main/java/org/orekit/rugged/core/dem/TilesCache.java
index c8c5c1cbe0cea33ead5b16b18f8b9efb5e2d4d66..a840c6524bea86f197034cd83e2896f5ec226e6c 100644
--- a/rugged-core/src/main/java/org/orekit/rugged/core/dem/TilesCache.java
+++ b/rugged-core/src/main/java/org/orekit/rugged/core/dem/TilesCache.java
@@ -23,6 +23,7 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
+import org.orekit.rugged.api.RuggedException;
 import org.orekit.rugged.api.TileUpdater;
 
 /** Cache for Digital Elevation Model {@link Tile tiles}.
@@ -68,8 +69,10 @@ public class TilesCache<T extends Tile> {
      * @param latitude ground point latitude
      * @param longitude ground point longitude
      * @return tile covering the ground point
+     * @exception RuggedException if newly created tile cannot be updated
      */
-    public T getTile(final double latitude, final double longitude) {
+    public T getTile(final double latitude, final double longitude)
+        throws RuggedException {
         return getStrip(latitude, longitude).getTile(latitude, longitude);
     }
 
@@ -77,8 +80,10 @@ public class TilesCache<T extends Tile> {
      * @param latitude latitude of the point
      * @param longitude longitude of the point
      * @return new tile covering the point
+     * @exception RuggedException if tile cannot be updated
      */
-    private T createTile(final double latitude, final double longitude) {
+    private T createTile(final double latitude, final double longitude)
+        throws RuggedException {
 
         if (evictionCache[next] != null) {
             // the tile we are creating will evict this older tile
@@ -106,8 +111,10 @@ public class TilesCache<T extends Tile> {
      * @param latitude ground point latitude
      * @param longitude ground point longitude
      * @return strip covering the ground point
+     * @exception RuggedException if tile cannot be updated
      */
-    private TilesStrip getStrip(final double latitude, final double longitude) {
+    private TilesStrip getStrip(final double latitude, final double longitude)
+        throws RuggedException {
 
         // look for a strip at the specified latitude
         final int index = Collections.binarySearch(searchCache, new BasicLatitudeProvider(latitude),
@@ -238,8 +245,10 @@ public class TilesCache<T extends Tile> {
          * @param latitude ground point latitude
          * @param longitude ground point longitude
          * @return strip covering the ground point
+         * @exception RuggedException if tile cannot be updated
          */
-        public T getTile(final double latitude, final double longitude) {
+        public T getTile(final double latitude, final double longitude)
+            throws RuggedException {
 
             // look for a tile at the specified longitude
             final int index = Collections.binarySearch(tiles, new BasicLongitudeProvider(longitude),
diff --git a/rugged-core/src/test/java/orekit/rugged/core/dem/ConstantElevationUpdater.java b/rugged-core/src/test/java/orekit/rugged/core/dem/ConstantElevationUpdater.java
index 44777d7ef357dfd67e9095851c773ca2e262fd0d..00adab3ed2a4b19900740a272eb752984384e88d 100644
--- a/rugged-core/src/test/java/orekit/rugged/core/dem/ConstantElevationUpdater.java
+++ b/rugged-core/src/test/java/orekit/rugged/core/dem/ConstantElevationUpdater.java
@@ -17,6 +17,7 @@
 package orekit.rugged.core.dem;
 
 import org.apache.commons.math3.util.FastMath;
+import org.orekit.rugged.api.RuggedException;
 import org.orekit.rugged.api.TileUpdater;
 import org.orekit.rugged.api.UpdatableTile;
 
@@ -32,7 +33,8 @@ public class ConstantElevationUpdater implements TileUpdater {
         this.elevation = elevation;
     }
 
-    public void updateTile(double latitude, double longitude, UpdatableTile tile) {
+    public void updateTile(double latitude, double longitude, UpdatableTile tile)
+        throws RuggedException {
         tile.setGeometry(size * FastMath.floor(latitude / size),
                          size * FastMath.floor(longitude / size),
                          size / n, size / n, n, n);
diff --git a/rugged-core/src/test/java/orekit/rugged/core/dem/SimpleTileTest.java b/rugged-core/src/test/java/orekit/rugged/core/dem/SimpleTileTest.java
index 9faae3454335ca18220021735937c4fc718c4c7d..a793af7dafa1c7bcec5cb6929e330bcab2624d11 100644
--- a/rugged-core/src/test/java/orekit/rugged/core/dem/SimpleTileTest.java
+++ b/rugged-core/src/test/java/orekit/rugged/core/dem/SimpleTileTest.java
@@ -18,7 +18,10 @@ package orekit.rugged.core.dem;
 
 import org.junit.Assert;
 import org.junit.Test;
+import org.orekit.rugged.api.RuggedException;
+import org.orekit.rugged.api.RuggedMessages;
 import org.orekit.rugged.core.dem.SimpleTile;
+import org.orekit.rugged.core.dem.Tile;
 
 public class SimpleTileTest {
 
@@ -34,7 +37,7 @@ public class SimpleTileTest {
     }
 
     @Test
-    public void testUpdate() {
+    public void testUpdate() throws RuggedException {
 
         SimpleTile tile = new SimpleTile();
         tile.setGeometry(1.0, 2.0, 0.1, 0.2, 100, 200);
@@ -65,4 +68,28 @@ public class SimpleTileTest {
 
     }
 
+    @Test
+    public void testOutOfBounds() throws RuggedException {
+
+        SimpleTile tile = new SimpleTile();
+        tile.setGeometry(1.0, 2.0, 0.1, 0.2, 100, 200);
+        tile.setElevation(50, 100, 1000.0);
+        checkOutOfBound( -1, 100, tile);
+        checkOutOfBound(100, 100, tile);
+        checkOutOfBound( 50,  -1, tile);
+        checkOutOfBound( 50, 200, tile);
+    }
+
+    private void checkOutOfBound(int i, int j, Tile tile) {
+        try {
+            tile.setElevation(i, j, 1000.0);
+        } catch (RuggedException re) {
+            Assert.assertEquals(RuggedMessages.OUT_OF_TILE_INDICES, re.getSpecifier());
+            Assert.assertEquals(i,                              ((Integer) re.getParts()[0]).intValue());
+            Assert.assertEquals(j,                              ((Integer) re.getParts()[1]).intValue());
+            Assert.assertEquals(tile.getLatitudeRows() - 1,     ((Integer) re.getParts()[2]).intValue());
+            Assert.assertEquals(tile.getLongitudeColumns() - 1, ((Integer) re.getParts()[3]).intValue());
+        }
+    }
+
 }
diff --git a/rugged-core/src/test/java/orekit/rugged/core/dem/TilesCacheTest.java b/rugged-core/src/test/java/orekit/rugged/core/dem/TilesCacheTest.java
index 4a7a8907f17f00a077fd26ffb200b2611065f8ec..f17275f0f1feec17b134c191c5d57d18bc9abe52 100644
--- a/rugged-core/src/test/java/orekit/rugged/core/dem/TilesCacheTest.java
+++ b/rugged-core/src/test/java/orekit/rugged/core/dem/TilesCacheTest.java
@@ -21,13 +21,14 @@ import org.apache.commons.math3.random.Well19937a;
 import org.apache.commons.math3.util.FastMath;
 import org.junit.Assert;
 import org.junit.Test;
+import org.orekit.rugged.api.RuggedException;
 import org.orekit.rugged.core.dem.SimpleTile;
 import org.orekit.rugged.core.dem.TilesCache;
 
 public class TilesCacheTest {
 
     @Test
-    public void testSingleTile() {
+    public void testSingleTile() throws RuggedException {
         CountingFactory factory = new CountingFactory();
         TilesCache<SimpleTile> cache = new TilesCache<SimpleTile>(factory,
                 new ConstantElevationUpdater(FastMath.toRadians(3.0), 10, 10.0), 1000);
@@ -40,7 +41,7 @@ public class TilesCacheTest {
     }
 
     @Test
-    public void testEviction() {
+    public void testEviction() throws RuggedException {
         CountingFactory factory = new CountingFactory();
         TilesCache<SimpleTile> cache = new TilesCache<SimpleTile>(factory,
                 new ConstantElevationUpdater(FastMath.toRadians(1.0), 10, 10.0), 12);
@@ -85,7 +86,7 @@ public class TilesCacheTest {
     }
 
     @Test
-    public void testExactEnd() {
+    public void testExactEnd() throws RuggedException {
         CountingFactory factory = new CountingFactory();
         TilesCache<SimpleTile> cache =
                 new TilesCache<SimpleTile>(factory,
@@ -109,7 +110,7 @@ public class TilesCacheTest {
     }
 
     @Test
-    public void testNonContiguousFill() {
+    public void testNonContiguousFill() throws RuggedException {
         CountingFactory factory = new CountingFactory();
         TilesCache<SimpleTile> cache =
                 new TilesCache<SimpleTile>(factory,