diff --git a/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_2.h b/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_2.h
index a7d779586db..ca5f7c65f02 100644
--- a/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_2.h
+++ b/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_2.h
@@ -13,6 +13,8 @@ The tag `tag` identifies the dimension to be considered from the objects. For po
The class `K` is the kernel in which the value type of the `InputIterator` is defined. It can be omitted and deduced automatically from the value type.
+The class `Diagonalize_traits` is a model of `DiagonalizeTraits`. It can be omitted: if Eigen 3 (or greater) is available and `CGAL_EIGEN3_ENABLED` is defined then an overload using `Eigen_diagonalize_traits` is provided. Otherwise, the internal implementation `Internal_diagonalize_traits` is used.
+
\cgalHeading{Requirements}
@@ -35,7 +37,8 @@ InputIterator beyond,
typename K::Line_2 & line,
typename K::Point_2 & centroid,
const Tag & tag,
-const K & k);
+const K & k,
+const Diagonalize_traits& diagonalize_traits);
} /* namespace CGAL */
diff --git a/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_3.h b/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_3.h
index f3bb5e1313a..414aeb67cf1 100644
--- a/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_3.h
+++ b/Principal_component_analysis/doc/Principal_component_analysis/CGAL/linear_least_squares_fitting_3.h
@@ -64,6 +64,14 @@ The class `K` is the kernel in which the
value type of `InputIterator` is defined. It can be omitted and deduced
automatically from the value type.
+The class `Diagonalize_traits` is a model of `DiagonalizeTraits`. It
+can be omitted: if Eigen 3 (or greater) is available and
+`CGAL_EIGEN3_ENABLED` is defined then an overload using
+`Eigen_diagonalize_traits` is provided. Otherwise, the internal
+implementation `Internal_diagonalize_traits` is used.
+
+
+
\cgalHeading{Requirements}
@@ -84,7 +92,8 @@ InputIterator beyond,
typename K::Line_3& line,
typename K::Point_3& centroid,
const Tag& tag,
-const K& k);
+const K& k,
+const Diagonalize_traits& diagonalize_traits);
/*!
\brief computes the best fitting 3D plane of a 3D object set in the
@@ -100,6 +109,12 @@ of `InputIterator` is defined. It can be omitted and deduced
automatically from the value type. The tag `tag` identifies the
dimension to be considered from the objects (see above).
+The class `Diagonalize_traits` is a model of `DiagonalizeTraits`. It
+can be omitted: if Eigen 3 (or greater) is available and
+`CGAL_EIGEN3_ENABLED` is defined then an overload using
+`Eigen_diagonalize_traits` is provided. Otherwise, the internal
+implementation `Internal_diagonalize_traits` is used.
+
\cgalHeading{Requirements}
@@ -119,7 +134,8 @@ InputIterator beyond,
typename K::Plane_3& plane,
typename K::Point_3& centroid,
const Tag& tag,
-const K& k);
+const K& k,
+const Diagonalize_traits& diagonalize_traits);
/// @}
diff --git a/Principal_component_analysis/doc/Principal_component_analysis/dependencies b/Principal_component_analysis/doc/Principal_component_analysis/dependencies
index a4d5f76715e..5b5101754b5 100644
--- a/Principal_component_analysis/doc/Principal_component_analysis/dependencies
+++ b/Principal_component_analysis/doc/Principal_component_analysis/dependencies
@@ -4,3 +4,4 @@ STL_Extension
Algebraic_foundations
Circulator
Stream_support
+Solver_interface
diff --git a/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_2.h b/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_2.h
index 5d2bd42c6c8..a385da3e392 100644
--- a/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_2.h
+++ b/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_2.h
@@ -46,7 +46,7 @@ linear_least_squares_fitting_2(InputIterator first,
typename Kernel::Point_2& centroid,
const Tag& tag,
const Kernel& kernel,
- const Diagonalize_traits diagonalize_traits)
+ const Diagonalize_traits& diagonalize_traits)
{
typedef typename std::iterator_traits::value_type Value_type;
return internal::linear_least_squares_fitting_2(first, beyond, line,
diff --git a/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_3.h b/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_3.h
index 448bc024725..d0e6189965b 100644
--- a/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_3.h
+++ b/Principal_component_analysis/include/CGAL/linear_least_squares_fitting_3.h
@@ -52,7 +52,7 @@ linear_least_squares_fitting_3(InputIterator first,
typename Kernel::Point_3& centroid,
const Tag& tag, // dimension tag, ranges from 0 to 3
const Kernel& kernel,
- const Diagonalize_traits diagonalize_traits)
+ const Diagonalize_traits& diagonalize_traits)
{
typedef typename std::iterator_traits::value_type Value_type;
return internal::linear_least_squares_fitting_3(first, beyond, object,