diff --git a/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.cxx b/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.cxx
index 0789f4b92fe02511eb5651566b52640e2069cb91..5c14b6e6094d8295963563d0fe184c2a15a83d09 100644
--- a/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.cxx
+++ b/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.cxx
@@ -18,6 +18,7 @@
 
 #include "otbRPCSolverAdapter.h"
 #include "otbImageKeywordlist.h"
+#include "otbMacro.h"
 
 #include "ossim/projection/ossimRpcSolver.h"
 #include "ossim/projection/ossimProjection.h"
@@ -68,13 +69,25 @@ RPCSolverAdapter::Solve(const GCPsContainerType& gcpContainer,
     }
 
   // Check for enough points
-  if(sensorPoints.size() < 40)
+  if(sensorPoints.size() < 20)
     {
-    itkGenericExceptionMacro(<<"At least 40 points are required to estimate the 80 parameters of the RPC model, but only "<<sensorPoints.size()<<" were given.");
+    itkGenericExceptionMacro(<<"At least 20 points are required to estimate the 40 parameters of a RPC model without elevation support, and 40 are required to estimate the 80 parameters of a RPC model with elevation support. Only "<<sensorPoints.size()<<" points were given.");
+    }
+
+  // By default, use elevation provided with ground control points
+  bool useElevation = true;
+
+  // If not enough points are given for a proper estimation of RPC
+  // with elevation support, disable elevation. This will result in
+  // all coefficients related to elevation set to zero.
+  if(sensorPoints.size()<40)
+    {
+    otbGenericWarningMacro("Only "<<sensorPoints.size()<<" ground control points are provided, can not estimate a RPC model with elevation support (at least 40 points required). Elevation support will be disabled for RPC estimation. All coefficients related to elevation will be set to zero, and elevation will have no effect on the resulting transform.");
+    useElevation = false; 
     }
   
   // Build the ossim rpc solver
-  ossimRefPtr<ossimRpcSolver> rpcSolver = new ossimRpcSolver(true, false);
+  ossimRefPtr<ossimRpcSolver> rpcSolver = new ossimRpcSolver(useElevation, false);
 
   // Call the solve method
   rpcSolver->solveCoefficients(sensorPoints, geoPoints);
diff --git a/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.h b/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.h
index 3a67d8796455c57ed6d646b7263ef55c9eebe0b4..ac4b9113583ae16ed3da06aa35e18711599e0e5b 100644
--- a/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.h
+++ b/Code/UtilitiesAdapters/OssimAdapters/otbRPCSolverAdapter.h
@@ -54,13 +54,18 @@ public:
   /** Solve RPC modelling from a set of GCPs and image bounds.
    *  The estimated RPC model is written in a keywordlist understood
    *  by other OTB and classes (like GenericRSTransform for instance).
+   *  Please note that at least 20 points are required to estimate the
+   *  RPC model. Between 20 and 40 points, the estimated model will
+   *  not provide elevation support, since there are not enough points
+   *  to estimate all the coefficients. Starting at 40 points, a full
+   *  RPC model is estimated.
    */
   static void Solve(const GCPsContainerType& gcpContainer,
                     double& rmsError,
                     ImageKeywordlist& otb_kwl);
 
   /** Solve RPC modelling from a set of GCPs and image bounds. The
-   * estimated RPC model is written to a geom file
+   * estimated RPC model is written to a geom file.
    */
   static bool Solve(const GCPsContainerType& gcpContainer,
                     double& rmsError,