diff --git a/src/main/java/org/orekit/rugged/atmosphericrefraction/ConstantRefractionLayer.java b/src/main/java/org/orekit/rugged/atmosphericrefraction/ConstantRefractionLayer.java
index 96739d3057c3dbd83f427d87ef2fa94ff1769027..6e9dd6a012782ae29c5f2877c44994b170d10e06 100644
--- a/src/main/java/org/orekit/rugged/atmosphericrefraction/ConstantRefractionLayer.java
+++ b/src/main/java/org/orekit/rugged/atmosphericrefraction/ConstantRefractionLayer.java
@@ -21,8 +21,8 @@ package org.orekit.rugged.atmosphericrefraction;
  *
  * @author Sergio Esteves
  */
-public class ConstantRefractionLayer {
-    private double lowestAltitude;
+public class ConstantRefractionLayer implements Comparable<ConstantRefractionLayer> {
+    private Double lowestAltitude;
     private double refractiveIndex;
 
     public ConstantRefractionLayer(double lowestAltitude, double refractiveIndex) {
@@ -37,4 +37,9 @@ public class ConstantRefractionLayer {
     public double getRefractiveIndex() {
         return refractiveIndex;
     }
+
+    @Override
+    public int compareTo(ConstantRefractionLayer o) {
+        return lowestAltitude.compareTo(o.lowestAltitude);
+    }
 }
diff --git a/src/main/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModel.java b/src/main/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModel.java
index 0a6dc5bc2896a0513df9e5eb0e0b255e9415a5f7..02cbf993ee8b189fa470b5803a5b1c6bca4d0ca2 100644
--- a/src/main/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModel.java
+++ b/src/main/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModel.java
@@ -21,11 +21,13 @@ import org.apache.commons.math3.util.FastMath;
 import org.orekit.bodies.GeodeticPoint;
 import org.orekit.errors.OrekitException;
 import org.orekit.rugged.errors.RuggedException;
+import org.orekit.rugged.errors.RuggedMessages;
 import org.orekit.rugged.intersection.IntersectionAlgorithm;
 import org.orekit.rugged.utils.ExtendedEllipsoid;
 import org.orekit.rugged.utils.NormalizedGeodeticPoint;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -40,6 +42,9 @@ public class MultiLayerModel implements AtmosphericRefraction {
     /** Constant refraction layers */
     private final List<ConstantRefractionLayer> refractionLayers;
 
+    /** Atmosphere lowest altitude */
+    private final double atmosphereLowestAltitude;
+
     public MultiLayerModel(final ExtendedEllipsoid ellipsoid)
             throws OrekitException {
         this.ellipsoid = ellipsoid;
@@ -60,14 +65,16 @@ public class MultiLayerModel implements AtmosphericRefraction {
         refractionLayers.add(new ConstantRefractionLayer(  1000.00, 1.000252));
         refractionLayers.add(new ConstantRefractionLayer(     0.00, 1.000278));
         refractionLayers.add(new ConstantRefractionLayer( -1000.00, 1.000306));
+
+        atmosphereLowestAltitude = refractionLayers.get(refractionLayers.size() - 1).getLowestAltitude();
     }
 
     public MultiLayerModel(final ExtendedEllipsoid ellipsoid, final List<ConstantRefractionLayer> refractionLayers)
             throws OrekitException {
         this.ellipsoid = ellipsoid;
-        // TODO guarantee that list is already ordered by altitude?
-        // TODO guarantee that a minimum altitude value exists?
         this.refractionLayers = refractionLayers;
+        atmosphereLowestAltitude = refractionLayers.get(refractionLayers.size() - 1).getLowestAltitude();
+        Collections.sort(this.refractionLayers, Collections.<ConstantRefractionLayer>reverseOrder());
     }
 
     @Override
@@ -77,6 +84,10 @@ public class MultiLayerModel implements AtmosphericRefraction {
             throws RuggedException {
 
         try {
+            if(rawIntersection.getAltitude() < atmosphereLowestAltitude) {
+                throw new RuggedException(RuggedMessages.NO_LAYER_DATA, rawIntersection.getAltitude(),
+                        atmosphereLowestAltitude);
+            }
 
             Vector3D pos = satPos;
             Vector3D los = satLos.normalize();
diff --git a/src/main/java/org/orekit/rugged/errors/RuggedMessages.java b/src/main/java/org/orekit/rugged/errors/RuggedMessages.java
index 0b021db95bac82b4fdfe75c2a5e9ae61d2a3e4b1..d01ff7c886007bcc38b18b0c2821c92c6fc7dbf9 100644
--- a/src/main/java/org/orekit/rugged/errors/RuggedMessages.java
+++ b/src/main/java/org/orekit/rugged/errors/RuggedMessages.java
@@ -27,6 +27,7 @@ import java.util.MissingResourceException;
 import java.util.PropertyResourceBundle;
 import java.util.ResourceBundle;
 
+import org.apache.commons.math3.exception.util.Localizable;
 
 /**
  * Enumeration for localized messages formats.
@@ -78,6 +79,7 @@ public enum RuggedMessages implements Localizable {
     NO_PARAMETERS_SELECTED("no parameters have been selected for estimation"),
     NO_REFERENCE_MAPPINGS("no reference mappings for parameters estimation"),
     DUPLICATED_PARAMETER_NAME("a different parameter with name {0} already exists");
+    NO_LAYER_DATA("no atmospheric layer data at altitude {0} (lowest altitude: {1})");
 
     // CHECKSTYLE: resume JavadocVariable check
 
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_de.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_de.utf8
index 3982b7c81c5e907f82a7e02ac6bcf531a29afa84..df6ea08cb90fbdfffca7b6a68038bc700b6a9370 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_de.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_de.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = <MISSING TRANSLATION>
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = <MISSING TRANSLATION>
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_en.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_en.utf8
index 75e9cab184c011ba22509e85755f2b3e8d259cd9..37ef4daf2f87b2df24588077beff39f6c64008ec 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_en.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_en.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = no reference mappings for parameters estimation
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = a different parameter with name {0} already exists
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = no atmospheric layer data at altitude {0} (lowest altitude: {1})
\ No newline at end of file
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_es.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_es.utf8
index 113d92b8786fb75794279a1573cd9c4d01a0f41d..f705a7740ec223fa04a9b58b89fd93c19de4b7c9 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_es.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_es.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = <MISSING TRANSLATION>
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = <MISSING TRANSLATION>
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
\ No newline at end of file
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_fr.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_fr.utf8
index 9854f68f8f2e0097ae438466f97025375cc40406..f73412b0fdcaa63654b98a50b13ec94caf6e7652 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_fr.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_fr.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = aucune projection de référence pour l''estimation des
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = il existe déjà un autre paramètre nommé {0}
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_gl.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_gl.utf8
index 434a10aa9dc551d036a7d0d040ad334c6f74830e..64196159d46c932ca7adb895dbe06320dcd28867 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_gl.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_gl.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = <MISSING TRANSLATION>
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = <MISSING TRANSLATION>
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
\ No newline at end of file
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_it.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_it.utf8
index 90dd36c0c710ac1a145bc7fac04a2f2e2d76ccd8..0b980381a7dc41449ea91975586d8925080b940a 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_it.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_it.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = <MISSING TRANSLATION>
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = <MISSING TRANSLATION>
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_no.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_no.utf8
index ccca6d63ce2d2964c8c9554ec9b6e011ff462ecf..ac6749485160004cf136f1c24c3c3248e038d834 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_no.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_no.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = <MISSING TRANSLATION>
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = <MISSING TRANSLATION>
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
\ No newline at end of file
diff --git a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_ro.utf8 b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_ro.utf8
index 7aa5bbb8f01de15484ebc31a9115d3099260da48..9ad508f2a1e289f9473bb8f56cd0cd40a59e01dd 100644
--- a/src/main/resources/assets/org/orekit/rugged/RuggedMessages_ro.utf8
+++ b/src/main/resources/assets/org/orekit/rugged/RuggedMessages_ro.utf8
@@ -81,3 +81,6 @@ NO_REFERENCE_MAPPINGS = <MISSING TRANSLATION>
 
 # a different parameter with name {0} already exists
 DUPLICATED_PARAMETER_NAME = <MISSING TRANSLATION>
+
+# no atmospheric layer data at altitude {0} (lowest altitude: {1})
+NO_LAYER_DATA = <MISSING TRANSLATION>
\ No newline at end of file
diff --git a/src/test/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModelTest.java b/src/test/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModelTest.java
index 87dbaf81bb92ce27a6189c348d67a5f773f4d161..5cc3a9c96d8ad603d039c54a863d2c14c8168532 100644
--- a/src/test/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModelTest.java
+++ b/src/test/java/org/orekit/rugged/atmosphericrefraction/MultiLayerModelTest.java
@@ -16,6 +16,7 @@
  */
 package org.orekit.rugged.atmosphericrefraction;
 
+import org.apache.commons.math3.geometry.Vector;
 import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
 import org.apache.commons.math3.util.FastMath;
 import org.junit.Assert;
@@ -30,6 +31,7 @@ import org.orekit.rugged.raster.TileUpdater;
 import org.orekit.rugged.utils.NormalizedGeodeticPoint;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class MultiLayerModelTest extends AbstractAlgorithmTest {
@@ -54,9 +56,9 @@ public class MultiLayerModelTest extends AbstractAlgorithmTest {
 
 
         // a test with indices all set to 1.0 - correction must be zero
-        final int numberOfLayers = 15;
+        final int numberOfLayers = 16;
         List<ConstantRefractionLayer> refractionLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
-        for(int i = numberOfLayers; i > 0; i--) {
+        for(int i = numberOfLayers - 1; i >= 0; i--) {
             refractionLayers.add(new ConstantRefractionLayer(i * 1.0e4, 1.0));
         }
         model = new MultiLayerModel(earth, refractionLayers);
@@ -68,42 +70,43 @@ public class MultiLayerModelTest extends AbstractAlgorithmTest {
         // an intentionally flawed atmosphere with refractive indices decreasing with altitude,
         // that should exhibit a LOS bending upwards
         refractionLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
-        for(int i = numberOfLayers; i > 0; i--) {
+        for(int i = numberOfLayers - 1; i >= 0; i--) {
             refractionLayers.add(new ConstantRefractionLayer(i * 1.0e4, 1.0 + i*i*1e-6));
         }
         model = new MultiLayerModel(earth, refractionLayers);
         correctedIntersection = model.applyCorrection(position, los, rawIntersection, algorithm);
-        distance = Vector3D.distance(earth.transform(rawIntersection), earth.transform(correctedIntersection));
-        Assert.assertEquals(0.0, distance, 0.5);
-
+        double anglePosRawIntersection = Vector3D.angle(position, earth.transform(rawIntersection));
+        double anglePosCorrectedIntersection = Vector3D.angle(position, earth.transform(correctedIntersection));
+        Assert.assertTrue(anglePosRawIntersection < anglePosCorrectedIntersection);
 
         // a comparison between two atmospheres, one more dense than the other and showing correction
         // is more important with high indices
-        List<ConstantRefractionLayer> lessDenseRefracLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
-        List<ConstantRefractionLayer> moreDenseRefracLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
-        for(int i = numberOfLayers; i > 0; i--) {
+        List<ConstantRefractionLayer> baseRefracLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
+        List<ConstantRefractionLayer> denserRefracLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
+        for(int i = numberOfLayers - 1; i >= 0; i--) {
             double baseRefractiveIndex = FastMath.pow(numberOfLayers - i + 1, 2) * 1e-6;
-            lessDenseRefracLayers.add(new ConstantRefractionLayer(i * 1.0e4, baseRefractiveIndex));
-            moreDenseRefracLayers.add(new ConstantRefractionLayer(i * 1.0e4, baseRefractiveIndex + 1e-3));
+            baseRefracLayers.add(new ConstantRefractionLayer(i * 1.0e4, baseRefractiveIndex));
+            denserRefracLayers.add(new ConstantRefractionLayer(i * 1.0e4, baseRefractiveIndex + 1e-3));
         }
-        MultiLayerModel lessDenseModel = new MultiLayerModel(earth, lessDenseRefracLayers);
-        MultiLayerModel moreDenseModel = new MultiLayerModel(earth, moreDenseRefracLayers);
-        GeodeticPoint lessDenseIntersection = lessDenseModel.applyCorrection(position, los, rawIntersection, algorithm);
-        GeodeticPoint moreDenseIntersection = moreDenseModel.applyCorrection(position, los, rawIntersection, algorithm);
-        double LDDistance = Vector3D.distance(earth.transform(rawIntersection), earth.transform(lessDenseIntersection));
-        double MDDistance = Vector3D.distance(earth.transform(rawIntersection), earth.transform(moreDenseIntersection));
-
-        // LDDistance: 2860.295484362817, MDDistance: 251.62683758334745
-        // Assert.assertTrue(MDDistance > LDDistance);
+        MultiLayerModel baseModel = new MultiLayerModel(earth, baseRefracLayers);
+        MultiLayerModel denserModel = new MultiLayerModel(earth, denserRefracLayers);
+        GeodeticPoint baseIntersection = baseModel.applyCorrection(position, los, rawIntersection, algorithm);
+        GeodeticPoint denserIntersection = denserModel.applyCorrection(position, los, rawIntersection, algorithm);
+        double baseDistance = Vector3D.distance(earth.transform(rawIntersection), earth.transform(baseIntersection));
+        double denserDistance = Vector3D.distance(earth.transform(rawIntersection),
+                earth.transform(denserIntersection));
+        // denserDistance: 291.6042252928431, baseDistance: 2710.1036961651967
+        Assert.assertTrue(denserDistance > baseDistance);
 
 
         // a test with a single refraction layer
         refractionLayers = new ArrayList<ConstantRefractionLayer>(numberOfLayers);
-        refractionLayers.add(new ConstantRefractionLayer(600000, 1.2));
+        refractionLayers.add(new ConstantRefractionLayer(0, 1.2));
         model = new MultiLayerModel(earth, refractionLayers);
         correctedIntersection = model.applyCorrection(position, los, rawIntersection, algorithm);
         distance = Vector3D.distance(earth.transform(rawIntersection), earth.transform(correctedIntersection));
         Assert.assertEquals(0.0, distance, 0.0);
+
     }
 
     @Override
diff --git a/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java b/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java
index ed059b2efad41c430482e7e8cd546b84b3e87eac..cd31703e69bd19a0efad68f7fb5b6c9827f4c3f7 100644
--- a/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java
+++ b/src/test/java/org/orekit/rugged/errors/RuggedMessagesTest.java
@@ -30,7 +30,7 @@ public class RuggedMessagesTest {
 
     @Test
     public void testMessageNumber() {
-        Assert.assertEquals(28, RuggedMessages.values().length);
+        Assert.assertEquals(29, RuggedMessages.values().length);
     }
 
     @Test