diff --git a/src/main/java/org/orekit/rugged/api/Rugged.java b/src/main/java/org/orekit/rugged/api/Rugged.java
index 4e4e85df61b45f02882723765aed60084c67822e..82063c611af68cb127dcc01812e543c8bd776b6c 100644
--- a/src/main/java/org/orekit/rugged/api/Rugged.java
+++ b/src/main/java/org/orekit/rugged/api/Rugged.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.hipparchus.analysis.differentiation.DerivativeStructure;
 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
@@ -738,12 +739,15 @@ public class Rugged {
      * @param maxEvaluations maximum number of evaluations
      * @param parametersConvergenceThreshold convergence threshold on
      * normalized parameters (dimensionless, related to parameters scales)
+     * @return a list of the estimated parameters (this return value is for convenience
+     * only, the viewing model is already aware of the estimated values, there is no need
+     * to do any updating)
      * @exception RuggedException if several parameters with the same name exist,
      * or if parameters cannot be estimated (too few measurements, ill-conditioned problem ...)
      */
-    public void estimateFreeParameters(final Collection<SensorToGroundMapping> references,
-                                       final int maxEvaluations,
-                                       final double parametersConvergenceThreshold)
+    public List<ExtendedParameterDriver> estimateFreeParameters(final Collection<SensorToGroundMapping> references,
+                                                                final int maxEvaluations,
+                                                                final double parametersConvergenceThreshold)
         throws RuggedException {
         try {
 
@@ -762,11 +766,11 @@ public class Rugged {
             // gather free parameters from all reference mappings
             final List<ExtendedParameterDriver> freeParameters = new ArrayList<>();
             for (final SensorToGroundMapping reference : references) {
-                reference.
-                    getSensor().
-                    getExtendedParametersDrivers().
-                    filter(driver -> driver.isSelected()).
-                    forEach(driver -> freeParameters.add(driver));
+                freeParameters.addAll(reference.
+                                      getSensor().
+                                      getExtendedParametersDrivers().
+                                      filter(driver -> driver.isSelected()).
+                                      collect(Collectors.toList()));
             }
 
             // set up the indices and number of estimated parameters,
@@ -801,8 +805,8 @@ public class Rugged {
                     max = FastMath.max(max, sp.getLineNumber());
                 }
             }
-            int minLine = (int) FastMath.floor(min - ESTIMATION_LINE_RANGE_MARGIN);
-            int maxLine = (int) FastMath.ceil(max - ESTIMATION_LINE_RANGE_MARGIN);
+            final int minLine = (int) FastMath.floor(min - ESTIMATION_LINE_RANGE_MARGIN);
+            final int maxLine = (int) FastMath.ceil(max - ESTIMATION_LINE_RANGE_MARGIN);
 
             // prevent parameters to exceed their prescribed bounds
             final ParameterValidator validator = params -> {
@@ -858,6 +862,8 @@ public class Rugged {
                                 orders[m] = 0;
                             }
 
+                            l += 2;
+
                         }
                     }
 
@@ -888,6 +894,8 @@ public class Rugged {
             // solve the least squares problem
             optimizer.optimize(problem);
 
+            return freeParameters;
+
         } catch (RuggedExceptionWrapper rew) {
             throw rew.getException();
         } catch (OrekitExceptionWrapper oew) {