diff --git a/include/spline/cubic_spline.h b/include/spline/cubic_spline.h
index a4ebb794691beb0671238b08d70092b7255f0d91..0e866a62339bcfd2052138b231eba22ab9a9d4fd 100644
--- a/include/spline/cubic_spline.h
+++ b/include/spline/cubic_spline.h
@@ -22,58 +22,17 @@
 
 namespace spline
 {
-/// \class CubicFunction
-/// \brief Represents a cubic spline defined on the interval 
+/// \brief Creates coefficient vector of a cubic spline defined on the interval
 /// [tBegin, tEnd]. It follows the equation
-/// x(t) = a + b(t - t_min_) + c(t - t_min_)^2 + d(t - t_min_)^3 
+/// x(t) = a + b(t - t_min_) + c(t - t_min_)^2 + d(t - t_min_)^3
 ///
-template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false
-, typename Point= Eigen::Matrix<Numeric, Dim, 1>, typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> > >
-struct cubic_spline : public spline_curve<Time, Numeric, Dim,3, Safe, Point, T_Point>
+template<typename Point, typename T_Point>
+T_Point make_cubic_vector(Point const& a, Point const& b, Point const& c, Point const &d)
 {
-    typedef Point 	point_t;
-    typedef T_Point t_point_t;
-    typedef Time 	time_t;
-    typedef Numeric	num_t;
-    typedef spline_curve<Time, Numeric, Dim,3, Safe, Point, T_Point> spline_curve_t;
-/* Constructors - destructors */
-    public:
-    ///\brief Constructor
-    cubic_spline(point_t const& a, point_t const& b, point_t const& c, point_t const &d, time_t min, time_t max)
-        :spline_curve_t(makeVector(a,b,c,d), min, max) {}
-
-
-    ///\brief Constructor
-    cubic_spline(const T_Point& coefficients, time_t min, time_t max)
-        :spline_curve_t(coefficients, min, max) {}
-
-
-    ///\brief Constructor
-    template<typename In>
-    cubic_spline(In zeroOrderCoefficient, In out, time_t min, time_t max)
-        :spline_curve_t(zeroOrderCoefficient, out, min, max) {}
-
-    ///\brief Destructor
-    ~cubic_spline()
-    {
-        // NOTHING
-    }
-
-    private:
-    //cubic_spline(const cubic_spline&);
-    //cubic_spline& operator=(const cubic_spline&);
-/* Constructors - destructors */
-
-    /*Operations*/
-    T_Point makeVector(point_t const& a, point_t const& b, point_t const& c, point_t const &d)
-    {
-        T_Point res;
-        res.push_back(a);res.push_back(b);res.push_back(c);res.push_back(d);
-        return res;
-    }
-
-    /*Operations*/
-    }; //class cubic_spline
+    T_Point res;
+    res.push_back(a);res.push_back(b);res.push_back(c);res.push_back(d);
+    return res;
+}
 }
 #endif //_STRUCT_CUBICSPLINE
 
diff --git a/include/spline/exact_cubic.h b/include/spline/exact_cubic.h
index 9d8701f32e9955927dbc8af9290a92e7c40eab1f..0376292991d246490a70b0e1634d85f6276992ec 100644
--- a/include/spline/exact_cubic.h
+++ b/include/spline/exact_cubic.h
@@ -22,6 +22,7 @@
 
 #include "curve_abc.h"
 #include "cubic_spline.h"
+#include "quintic_spline.h"
 
 #include "MathDefs.h"
 
@@ -35,15 +36,16 @@ namespace spline
 /// crossing each of the waypoint given in its initialization
 ///
 template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false
-, typename Point= Eigen::Matrix<Numeric, Dim, 1> >
+, typename Point= Eigen::Matrix<Numeric, Dim, 1>, typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> > >
 struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 {
 	typedef Point 	point_t;
+    typedef T_Point t_point_t;
 	typedef Eigen::Matrix<Numeric, Eigen::Dynamic, Eigen::Dynamic> MatrixX;
 	typedef Time 	time_t;
 	typedef Numeric	num_t;
-	typedef cubic_spline<time_t, Numeric, Dim, Safe, Point> cubic_spline_t;
-    typedef typename std::vector<cubic_spline_t*> T_cubic;
+    typedef spline_curve<time_t, Numeric, Dim, Safe, point_t, t_point_t> spline_t;
+    typedef typename std::vector<spline_t*> T_cubic;
 	typedef typename T_cubic::iterator IT_cubic;
 	typedef typename T_cubic::const_iterator CIT_cubic;
 
@@ -77,8 +79,7 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 
 	
 		In it(wayPointsBegin), next(wayPointsBegin);
-		++next;
-		Numeric t_previous((*it).first);
+        ++next;
 
 		for(std::size_t i(0); next != wayPointsEnd; ++next, ++it, ++i)
 		{
@@ -119,9 +120,9 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 		it= wayPointsBegin, next=wayPointsBegin; ++ next;
 		for(int i=0; next != wayPointsEnd; ++i, ++it, ++next)
 		{
-            subSplines_.push_back(new cubic_spline_t(a.row(i), b.row(i), c.row(i), d.row(i), (*it).first, (*next).first));
+            add_cubic(a.row(i), b.row(i), c.row(i), d.row(i),(*it).first, (*next).first);
 		}
-        subSplines_.push_back(new cubic_spline_t(a.row(size-1), b.row(size-1), c.row(size-1), d.row(size-1), (*it).first, (*it).first));
+        add_cubic(a.row(size-1), b.row(size-1), c.row(size-1), d.row(size-1),(*it).first, (*it).first);
 	}
 
 	///\brief Destructor
@@ -133,6 +134,13 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
         }
 	}
 
+    private:
+    void add_cubic(point_t const& a, point_t const& b, point_t const& c, point_t const &d, const time_t min, const time_t max)
+    {
+        t_point_t coeffs = make_cubic_vector<point_t, t_point_t>(a,b,c,d);
+        subSplines_.push_back(new spline_t(coeffs.begin(),coeffs.end(), min, max));
+    }
+
 	private:
 	exact_cubic(const exact_cubic&);
 	exact_cubic& operator=(const exact_cubic&);
diff --git a/include/spline/quintic_spline.h b/include/spline/quintic_spline.h
index cf2b22280c545254c2526c928ef8ec1a75fb56e1..c80a5e760edae8d85f79223d3e435439f84b23b6 100644
--- a/include/spline/quintic_spline.h
+++ b/include/spline/quintic_spline.h
@@ -22,60 +22,19 @@
 
 namespace spline
 {
-/// \class quintic_spline
-/// \brief Represents a quintic spline defined on the interval
+/// \brief Creates coefficient vector of a quintic spline defined on the interval
 /// [tBegin, tEnd]. It follows the equation
 /// x(t) = a + b(t - t_min_) + c(t - t_min_)^2 + d(t - t_min_)^3 + e(t - t_min_)^4  + f(t - t_min_)^5
 ///
-template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false
-, typename Point= Eigen::Matrix<Numeric, Dim, 1>, typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> > >
-struct quintic_spline : public spline_curve<Time, Numeric, Dim,5, Safe, Point, T_Point>
+template<typename Point, typename T_Point>
+T_Point make_quintic_vector(Point const& a, Point const& b, Point const& c,
+                   Point const &d, Point const& e, Point const& f)
 {
-    typedef Point 	point_t;
-    typedef T_Point t_point_t;
-    typedef Time 	time_t;
-    typedef Numeric	num_t;
-    typedef spline_curve<Time, Numeric, Dim,5, Safe, Point, T_Point> spline_curve_t;
-/* Constructors - destructors */
-    public:
-    ///\brief Constructor
-    quintic_spline(point_t const& a, point_t const& b, point_t const& c, point_t const &d, point_t const &e,  point_t const &f, time_t min, time_t max)
-        :spline_curve_t(makeVector(a,b,c,d,e,f), min, max) {}
-
-
-    ///\brief Constructor
-    quintic_spline(const T_Point& coefficients, time_t min, time_t max)
-        :spline_curve_t(coefficients, min, max) {}
-
-
-    ///\brief Constructor
-    template<typename In>
-    quintic_spline(In zeroOrderCoefficient, In out, time_t min, time_t max)
-        :spline_curve_t(zeroOrderCoefficient, out, min, max) {}
-
-    ///\brief Destructor
-    ~quintic_spline()
-    {
-        // NOTHING
-    }
-
-    private:
-    //quintic_spline(const quintic_spline&);
-    quintic_spline& operator=(const quintic_spline&);
-/* Constructors - destructors */
-
-    /*Operations*/
-    T_Point makeVector(point_t const& a, point_t const& b, point_t const& c,
-                       point_t const &d, point_t const& e, point_t const& f)
-    {
-        T_Point res;
-        res.push_back(a);res.push_back(b);res.push_back(c);
-        res.push_back(d);res.push_back(e);res.push_back(f);
-        return res;
-    }
-
-    /*Operations*/
-    }; //class quintic_spline
+    T_Point res;
+    res.push_back(a);res.push_back(b);res.push_back(c);
+    res.push_back(d);res.push_back(e);res.push_back(f);
+    return res;
+}
 }
 #endif //_STRUCT_QUINTIC_SPLINE
 
diff --git a/include/spline/spline_curve.h b/include/spline/spline_curve.h
index a4a6ef38e5df11064cffb51df114e6d53982a11b..38fe60fda57bbf7c334b56eac957f47021db73a4 100644
--- a/include/spline/spline_curve.h
+++ b/include/spline/spline_curve.h
@@ -30,7 +30,7 @@ namespace spline
 /// [tBegin, tEnd]. It follows the equation
 /// x(t) = a + b(t - t_min_) + ... + d(t - t_min_)^N, where N is the order
 ///
-template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, std::size_t Order=3, bool Safe=false,
+template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false,
          typename Point= Eigen::Matrix<Numeric, Dim, 1>, typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> > >
 struct spline_curve : public curve_abc<Time, Numeric, Dim, Safe, Point>
 {
@@ -43,11 +43,12 @@ struct spline_curve : public curve_abc<Time, Numeric, Dim, Safe, Point>
     public:
     ///\brief Constructor
     ///\param coefficients : a container containing all coefficients of the spline, starting
-    /// with the zero order coefficient, up to the highest order
+    /// with the zero order coefficient, up to the highest order. Spline order is given
+    /// by the size of the coefficients
     ///\param min: LOWER bound on interval definition of the spline
     ///\param max: UPPER bound on interval definition of the spline
     spline_curve(const T_Point& coefficients, const time_t min, const time_t max)
-        :coefficients_(coefficients), t_min_(min), t_max_(max), dim_(Dim), order_(Order)
+        :coefficients_(coefficients), t_min_(min), t_max_(max), dim_(Dim), order_(coefficients_.size()+1)
     {
         if(Safe)
         {
@@ -70,7 +71,7 @@ struct spline_curve : public curve_abc<Time, Numeric, Dim, Safe, Point>
     ///\param max: UPPER bound on interval definition of the spline
     template<typename In>
     spline_curve(In zeroOrderCoefficient, In out, const time_t min, const time_t max)
-        :coefficients_(init_coeffs(zeroOrderCoefficient, out)), t_min_(min), t_max_(max), dim_(Dim), order_(Order)
+        :coefficients_(init_coeffs(zeroOrderCoefficient, out)), t_min_(min), t_max_(max), dim_(Dim), order_(coefficients_.size()+1)
     {
         if(Safe)
         {
@@ -145,7 +146,7 @@ struct spline_curve : public curve_abc<Time, Numeric, Dim, Safe, Point>
     template<typename In>
     t_point_t init_coeffs(In zeroOrderCoefficient, In highestOrderCoefficient)
     {
-        t_point_t res(Order+1);
+        t_point_t res(std::distance(zeroOrderCoefficient, highestOrderCoefficient));
         std::copy(zeroOrderCoefficient, highestOrderCoefficient, res.begin());
         return res;
     }
diff --git a/src/tests/spline_test/Main.cpp b/src/tests/spline_test/Main.cpp
index 4263938a8c0ae21a754c7ddc0d051691ad83e2fd..276b03b77fe742e60565e068cb512e1f68cd69ca 100644
--- a/src/tests/spline_test/Main.cpp
+++ b/src/tests/spline_test/Main.cpp
@@ -2,8 +2,6 @@
 #include "spline/exact_cubic.h"
 #include "spline/bezier_curve.h"
 #include "spline/spline_curve.h"
-#include "spline/cubic_spline.h"
-#include "spline/quintic_spline.h"
 
 #include <string>
 #include <iostream>
@@ -15,7 +13,7 @@ namespace spline
 {
 typedef Eigen::Vector3d point_t;
 typedef std::vector<point_t,Eigen::aligned_allocator<point_t> >  t_point_t;
-typedef cubic_spline  <double, double, 3, true, point_t, t_point_t> cubic_function_t;
+typedef spline_curve  <double, double, 3, true, point_t, t_point_t> cubic_function_t;
 typedef exact_cubic   <double, double, 3, true, point_t> exact_cubic_t;
 typedef bezier_curve  <double, double, 3, true, point_t> bezier_curve_t;
 typedef std::pair<double, point_t> Waypoint;
@@ -23,7 +21,7 @@ typedef std::vector<Waypoint> T_Waypoint;
 
 
 typedef Eigen::Matrix<double,1,1> point_one;
-typedef spline_curve<double, double, 1, 3, true, point_one> cubic_function_one;
+typedef spline_curve<double, double, 1, true, point_one> cubic_function_one;
 typedef exact_cubic   <double, double, 1, true, point_one> exact_cubic_one;
 typedef std::pair<double, point_one> WaypointOne;
 typedef std::vector<WaypointOne> T_WaypointOne;