diff --git a/include/spline/cubic_zero_vel_acc.h b/include/spline/cubic_zero_vel_acc.h
index 57026c940ece0e6f2ad134cf3d5321a23d667773..e35168d93ce221d71f5cb0a5b9d8de1c35c101da 100644
--- a/include/spline/cubic_zero_vel_acc.h
+++ b/include/spline/cubic_zero_vel_acc.h
@@ -78,8 +78,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)
 		{
diff --git a/include/spline/exact_cubic.h b/include/spline/exact_cubic.h
index 0376292991d246490a70b0e1634d85f6276992ec..bbe488b62ed392a2c252d9f0e4aea2e4505d94a6 100644
--- a/include/spline/exact_cubic.h
+++ b/include/spline/exact_cubic.h
@@ -45,9 +45,9 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 	typedef Time 	time_t;
 	typedef Numeric	num_t;
     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;
+    typedef typename std::vector<spline_t> t_spline_t;
+    typedef typename t_spline_t::iterator it_spline_t;
+    typedef typename t_spline_t::const_iterator cit_spline_t;
 
 	/* Constructors - destructors */
 	public:
@@ -56,89 +56,92 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 	///\param wayPointsEns   : an iterator pointing to the end           of a waypoint container
 	template<typename In>
 	exact_cubic(In wayPointsBegin, In wayPointsEnd)
-	{
-		std::size_t const size(std::distance(wayPointsBegin, wayPointsEnd));
-		if(Safe && size < 1)
-		{
-			throw; // TODO
-		}
-
-		// refer to the paper to understand all this.
-		MatrixX h1 = MatrixX::Zero(size, size);
-		MatrixX h2 = MatrixX::Zero(size, size);
-		MatrixX h3 = MatrixX::Zero(size, size);
-		MatrixX h4 = MatrixX::Zero(size, size);
-		MatrixX h5 = MatrixX::Zero(size, size);
-		MatrixX h6 = MatrixX::Zero(size, size);
-
-		MatrixX a =  MatrixX::Zero(size, Dim);
-		MatrixX b =  MatrixX::Zero(size, Dim);
-		MatrixX c =  MatrixX::Zero(size, Dim);
-		MatrixX d =  MatrixX::Zero(size, Dim);
-		MatrixX x =  MatrixX::Zero(size, Dim);
-
-	
-		In it(wayPointsBegin), next(wayPointsBegin);
-        ++next;
-
-		for(std::size_t i(0); next != wayPointsEnd; ++next, ++it, ++i)
-		{
-			num_t const dTi((*next).first  - (*it).first);
-			num_t const dTi_sqr(dTi * dTi);
-			num_t const dTi_cube(dTi_sqr * dTi);
-			// filling matrices values
-			h3(i,i)   = -3 / dTi_sqr;
-			h3(i,i+1) =  3 / dTi_sqr;
-			h4(i,i)   = -2 / dTi;
-			h4(i,i+1) = -1 / dTi;
-			h5(i,i)   =  2 / dTi_cube;
-			h5(i,i+1) = -2 / dTi_cube;
-			h6(i,i)   =  1 / dTi_sqr;
-			h6(i,i+1) =  1 / dTi_sqr;
-			if( i+2 < size)
-			{
-				In it2(next); ++ it2;
-				num_t const dTi_1((*it2).first - (*next).first);
-				num_t const dTi_1sqr(dTi_1 * dTi_1);
-				// this can be optimized but let's focus on clarity as long as not needed
-				h1(i+1, i)   =  2 / dTi;
-				h1(i+1, i+1) =  4 / dTi + 4 / dTi_1;
-				h1(i+1, i+2) =  2 / dTi_1;
-				h2(i+1, i)   = -6 / dTi_sqr;
-				h2(i+1, i+1) = (6 / dTi_1sqr) - (6 / dTi_sqr);
-				h2(i+1, i+2) =  6 / dTi_1sqr;
-			}
-			x.row(i)= (*it).second.transpose();
-	      	}
-		// adding last x
-		x.row(size-1)= (*it).second.transpose();
-		a= x;
-		PseudoInverse(h1);
-		b = h1 * h2 * x; //h1 * b = h2 * x => b = (h1)^-1 * h2 * x
-		c = h3 * x + h4 * b;
-		d = h5 * x + h6 * b;
-		it= wayPointsBegin, next=wayPointsBegin; ++ next;
-		for(int i=0; next != wayPointsEnd; ++i, ++it, ++next)
-		{
-            add_cubic(a.row(i), b.row(i), c.row(i), d.row(i),(*it).first, (*next).first);
-		}
-        add_cubic(a.row(size-1), b.row(size-1), c.row(size-1), d.row(size-1),(*it).first, (*it).first);
+        : subSplines_(computeWayPoints<In>(wayPointsBegin, wayPointsEnd))
+    {
 	}
 
 	///\brief Destructor
-	~exact_cubic()
+    ~exact_cubic(){}
+
+    protected:
+    template<typename In>
+    t_spline_t computeWayPoints(In wayPointsBegin, In wayPointsEnd) const
     {
-        for(IT_cubic it = subSplines_.begin(); it != subSplines_.end(); ++ it)
+        std::size_t const size(std::distance(wayPointsBegin, wayPointsEnd));
+        if(Safe && size < 1)
         {
-            delete(*it);
+            throw; // TODO
         }
-	}
+        t_spline_t subSplines; subSplines.reserve(size);
+
+        // refer to the paper to understand all this.
+        MatrixX h1 = MatrixX::Zero(size, size);
+        MatrixX h2 = MatrixX::Zero(size, size);
+        MatrixX h3 = MatrixX::Zero(size, size);
+        MatrixX h4 = MatrixX::Zero(size, size);
+        MatrixX h5 = MatrixX::Zero(size, size);
+        MatrixX h6 = MatrixX::Zero(size, size);
+
+        MatrixX a =  MatrixX::Zero(size, Dim);
+        MatrixX b =  MatrixX::Zero(size, Dim);
+        MatrixX c =  MatrixX::Zero(size, Dim);
+        MatrixX d =  MatrixX::Zero(size, Dim);
+        MatrixX x =  MatrixX::Zero(size, Dim);
+
 
-    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)
+        In it(wayPointsBegin), next(wayPointsBegin);
+        ++next;
+
+        for(std::size_t i(0); next != wayPointsEnd; ++next, ++it, ++i)
+        {
+            num_t const dTi((*next).first  - (*it).first);
+            num_t const dTi_sqr(dTi * dTi);
+            num_t const dTi_cube(dTi_sqr * dTi);
+            // filling matrices values
+            h3(i,i)   = -3 / dTi_sqr;
+            h3(i,i+1) =  3 / dTi_sqr;
+            h4(i,i)   = -2 / dTi;
+            h4(i,i+1) = -1 / dTi;
+            h5(i,i)   =  2 / dTi_cube;
+            h5(i,i+1) = -2 / dTi_cube;
+            h6(i,i)   =  1 / dTi_sqr;
+            h6(i,i+1) =  1 / dTi_sqr;
+            if( i+2 < size)
+            {
+                In it2(next); ++ it2;
+                num_t const dTi_1((*it2).first - (*next).first);
+                num_t const dTi_1sqr(dTi_1 * dTi_1);
+                // this can be optimized but let's focus on clarity as long as not needed
+                h1(i+1, i)   =  2 / dTi;
+                h1(i+1, i+1) =  4 / dTi + 4 / dTi_1;
+                h1(i+1, i+2) =  2 / dTi_1;
+                h2(i+1, i)   = -6 / dTi_sqr;
+                h2(i+1, i+1) = (6 / dTi_1sqr) - (6 / dTi_sqr);
+                h2(i+1, i+2) =  6 / dTi_1sqr;
+            }
+            x.row(i)= (*it).second.transpose();
+            }
+        // adding last x
+        x.row(size-1)= (*it).second.transpose();
+        a= x;
+        PseudoInverse(h1);
+        b = h1 * h2 * x; //h1 * b = h2 * x => b = (h1)^-1 * h2 * x
+        c = h3 * x + h4 * b;
+        d = h5 * x + h6 * b;
+        it= wayPointsBegin, next=wayPointsBegin; ++ next;
+        for(int i=0; next != wayPointsEnd; ++i, ++it, ++next)
+        {
+            add_cubic(a.row(i), b.row(i), c.row(i), d.row(i),(*it).first, (*next).first, subSplines);
+        }
+        add_cubic(a.row(size-1), b.row(size-1), c.row(size-1), d.row(size-1),(*it).first, (*it).first, subSplines);
+        return subSplines;
+    }
+
+    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_spline_t& subSplines) const
     {
         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));
+        subSplines.push_back(spline_t(coeffs.begin(),coeffs.end(), min, max));
     }
 
 	private:
@@ -153,13 +156,12 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 	///  \param return : the value x(t)
 	virtual point_t operator()(time_t t) const
 	{
-
-        if(Safe && (t < subSplines_.front()->t_min_ || t > subSplines_.back()->t_max_)){throw std::out_of_range("TODO");}
-		for(CIT_cubic it = subSplines_.begin(); it != subSplines_.end(); ++ it)
+        if(Safe && (t < subSplines_.front().t_min_ || t > subSplines_.back().t_max_)){throw std::out_of_range("TODO");}
+        for(cit_spline_t it = subSplines_.begin(); it != subSplines_.end(); ++ it)
 		{
-            if(t >= ((*it)->t_min_) && t <= ((*it)->t_max_))
+            if(t >= (it->t_min_) && t <= (it->t_max_))
 			{
-                return (*it)->operator()(t);
+                return it->operator()(t);
 			}
 		}
 	}
@@ -167,13 +169,13 @@ struct exact_cubic : public curve_abc<Time, Numeric, Dim, Safe, Point>
 
 	/*Helpers*/
 	public:
-    num_t virtual min() const{return subSplines_.front()->t_min_;}
-    num_t virtual max() const{return subSplines_.back()->t_max_;}
+    num_t virtual min() const{return subSplines_.front().t_min_;}
+    num_t virtual max() const{return subSplines_.back().t_max_;}
 	/*Helpers*/
 
 	/*Attributes*/
-	private:
-	T_cubic subSplines_;
+    public:
+    const t_spline_t subSplines_;
 	/*Attributes*/
 };
 }
diff --git a/include/spline/spline_curve.h b/include/spline/spline_curve.h
index 88b1544ce41ea0fdd383defc1a7c57c66ae7bf05..d3807ae25cceef3d00394057829548bb7f3acafc 100644
--- a/include/spline/spline_curve.h
+++ b/include/spline/spline_curve.h
@@ -98,7 +98,7 @@ struct spline_curve : public curve_abc<Time, Numeric, Dim, Safe, Point>
         , coefficients_(other.coefficients_) {}
 
     private:
-    spline_curve& operator=(const spline_curve& other);
+    //spline_curve& operator=(const spline_curve& other);
 
 /* Constructors - destructors */
 
@@ -130,10 +130,10 @@ struct spline_curve : public curve_abc<Time, Numeric, Dim, Safe, Point>
 
 /*Attributes*/
     public:
-    const t_point_t coefficients_;
-    const time_t t_min_, t_max_;
-    const std::size_t dim_;
-    const std::size_t order_;
+    t_point_t coefficients_;
+    time_t t_min_, t_max_;
+    std::size_t dim_;
+    std::size_t order_;
 /*Attributes*/
 
     private: