diff --git a/source/trunk/include/DataBank.hxx b/source/trunk/include/DataBank.hxx
index 551dea050b9c1e906df1e0b00111271188d7a1d8..8bd594eb06131324d869b0d975abe8bd467adb1b 100755
--- a/source/trunk/include/DataBank.hxx
+++ b/source/trunk/include/DataBank.hxx
@@ -83,6 +83,7 @@ public :
 	void LoadFPYield(string SponfaneusYield, string ReactionYield);				// Build Fision Yields maps;
 
 	void SetWeightedDistanceCalculation(bool val=true) { fWeightedDistance = val;}		// Set weighted Distance calculation
+	void SetEvolutionDataInterpolation(bool val=true) { fEvolutionDataInterpolation = val;}		// Set weighted Distance calculation
 
 //********* Modification Method *********//
 	
@@ -139,6 +140,7 @@ protected :
 	bool			fUseRK4EvolutionMethod; ///< if true use RK4 calculation, mtriciel unstead
 	bool			fOldReadMethod;		///< use old DB format
 	bool			fWeightedDistance;	///< USe XS weighted distance calculation
+	bool			fEvolutionDataInterpolation;	///< USe XS weighted distance calculation
 
 
  	string 			fFuelType;
diff --git a/source/trunk/include/EvolutionData.hxx b/source/trunk/include/EvolutionData.hxx
index 35c885eb4cb5ffbfd3e01cb677c85b5e228cf8e9..4fb36cb9b673812f6d5e038e1c975b526cd89175 100755
--- a/source/trunk/include/EvolutionData.hxx
+++ b/source/trunk/include/EvolutionData.hxx
@@ -31,8 +31,10 @@ typedef long long int cSecond;
 EvolutionData operator*(EvolutionData const& evol, double F);
 EvolutionData operator*(double F, EvolutionData const& evol);
 EvolutionData operator/(EvolutionData const& evol, double F);
+EvolutionData operator+(EvolutionData const& evol1, EvolutionData const& evol2);
 
-
+double 	Distance(IsotopicVector IV1, EvolutionData Evd1 );
+double 	Distance(EvolutionData Evd1, IsotopicVector IV1 );
 
 class EvolutionData : public CLSSObject
 {
@@ -57,6 +59,9 @@ public :
 	void	SetFuelType(string fueltype)		{ fFuelType = fueltype; }
 	void 	SetPower(double power)			{ fPower = power; }
 	void	SetFlux(TGraph* flux )			{ fFlux = flux; }
+
+
+	void	SetEvolutionData(map<ZAI, TGraph*> maptoinsert)	{ fEvolutionData = maptoinsert;}
 	void	SetFissionXS(map<ZAI, TGraph*> maptoinsert)	{ fFissionXS = maptoinsert;}
 	void	SetCaptureXS(map<ZAI, TGraph*> maptoinsert)	{ fCaptureXS = maptoinsert;}
 	void	Setn2nXS(map<ZAI, TGraph*> maptoinsert)	{ fn2nXS = maptoinsert;}
@@ -146,8 +151,7 @@ protected :
 	ClassDef(EvolutionData,0);
 };
 
-double 	Distance(IsotopicVector IV1, EvolutionData Evd1 );
-double 	Distance(EvolutionData Evd1, IsotopicVector IV1 );
+
 
 
 #endif
diff --git a/source/trunk/src/DataBank.cxx b/source/trunk/src/DataBank.cxx
index 8c416add4a2f17934e12ef013c7803df8e6e4b30..61009214f6b8e905d4ee2761464eb4914979c4dc 100755
--- a/source/trunk/src/DataBank.cxx
+++ b/source/trunk/src/DataBank.cxx
@@ -206,6 +206,9 @@ DataBank<IsotopicVector>::DataBank():DynamicalSystem()
 	fTheMatrix = 0;
 
 	fWeightedDistance = false;
+	fEvolutionDataInterpolation = false;
+
+
 
 	fOldReadMethod = true;
 	fUseRK4EvolutionMethod = true;
@@ -230,6 +233,9 @@ DataBank<IsotopicVector>::DataBank(LogFile* Log, string DB_index_file, bool setl
 	IsLog(setlog);
 
 	fWeightedDistance = false;
+	fEvolutionDataInterpolation = false;
+
+
 	fTheNucleiVector = 0;
 	fTheMatrix = 0;
 
@@ -1297,12 +1303,59 @@ EvolutionData DataBank<IsotopicVector>::GetClosest(IsotopicVector isotopicvector
 	map<IsotopicVector, EvolutionData > evolutiondb = fDataBank;
 	double distance = 0;
 
+	map<IsotopicVector, EvolutionData >::iterator it_close = evolutiondb.begin();
+
+
+	map<IsotopicVector, EvolutionData >::iterator it;
+
+
 	if(fWeightedDistance)
 	{
 		Distance(isotopicvector.GetActinidesComposition()
 			 * evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition().GetSumOfAll()
 			 / isotopicvector.GetActinidesComposition().GetSumOfAll(),
 			 evolutiondb.begin()->second);
+
+
+		for( it = evolutiondb.begin(); it != evolutiondb.end(); it++ )
+		{
+			double D = 0;
+			D = Distance(isotopicvector.GetActinidesComposition()
+				     * evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition().GetSumOfAll()
+				     / isotopicvector.GetActinidesComposition().GetSumOfAll(),
+				     evolutiondb.begin()->second);
+
+
+			if (D< distance)
+			{
+				distance = D;
+				it_close = it;
+			}
+		}
+
+		return (*it_close).second;
+	}
+	else if (fEvolutionDataInterpolation)
+	{
+		map<double, EvolutionData> distance_map;
+		map<double, EvolutionData>::iterator it_distance;
+		int NClose = 64;
+		int Nstep = 0;
+		EvolutionData EvolInterpolate;
+		double SumOfDistance = 0;
+		for( it_distance = distance_map.begin(); Nstep < NClose; it_distance++)
+		{
+			if(Nstep == 0)
+				EvolInterpolate = 1./(*it_distance).first * (*it_distance).second;
+			else
+				EvolInterpolate = EvolInterpolate + 1./(*it_distance).first * (*it_distance).second;
+
+			SumOfDistance += 1./(*it_distance).first;
+			Nstep++;
+
+		}
+		return 1/SumOfDistance * EvolInterpolate;
+
 	}
 	else
 	{
@@ -1311,39 +1364,26 @@ EvolutionData DataBank<IsotopicVector>::GetClosest(IsotopicVector isotopicvector
 				   / evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition().GetSumOfAll()
 				   * isotopicvector.GetActinidesComposition().GetSumOfAll(),
 				   fDistanceType, fDistanceParameter);
-	}
-
-	map<IsotopicVector, EvolutionData >::iterator it_close = evolutiondb.begin();
 
 
-	map<IsotopicVector, EvolutionData >::iterator it;
-	for( it = evolutiondb.begin(); it != evolutiondb.end(); it++ )
-	{
 		double D = 0;
 
 
-		if(fWeightedDistance)
-		{
-			D = Distance(isotopicvector.GetActinidesComposition()
-					* evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition().GetSumOfAll()
-					/ isotopicvector.GetActinidesComposition().GetSumOfAll(),
-				     evolutiondb.begin()->second);
-		}
-		else
-		{
-			D = Distance(isotopicvector.GetActinidesComposition(),
-					    evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition()
-					    / evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition().GetSumOfAll()
-					    * isotopicvector.GetActinidesComposition().GetSumOfAll(),
-					    fDistanceType, fDistanceParameter);
-		}
+		D = Distance(isotopicvector.GetActinidesComposition(),
+			     evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition()
+			     / evolutiondb.begin()->second.GetIsotopicVectorAt(t).GetActinidesComposition().GetSumOfAll()
+			     * isotopicvector.GetActinidesComposition().GetSumOfAll(),
+			     fDistanceType, fDistanceParameter);
+
 		if (D< distance)
 		{
 			distance = D;
 			it_close = it;
 		}
+		return (*it_close).second;
+
 	}
-	return (*it_close).second;
+
 
 }
 
@@ -1366,24 +1406,26 @@ void DataBank<IsotopicVector>::CalculateDistanceParameter()
 	//We calculate the weight for the distance calculation.
 	map<IsotopicVector ,EvolutionData >::iterator it;
 	map<IsotopicVector ,EvolutionData > databank = (*this).GetDataBank();
-	int NevolutionDatainDataBank=0;
+	int NevolutionDatainDataBank = 0;
 
-	for( it = databank.begin(); it != databank.end(); it++ ){
+	for( it = databank.begin(); it != databank.end(); it++ )
+	{
 		NevolutionDatainDataBank++;
 		map<ZAI ,double>::iterator itit;
 		map<ZAI ,double> isovector=(*it).first.GetIsotopicQuantity();
-		for(itit=isovector.begin(); itit != isovector.end(); itit++){//Boucle sur ZAI
-			ZAI TmpZAI=(*itit).first;
+		for(itit=isovector.begin(); itit != isovector.end(); itit++) //Boucle sur ZAI
+		{
 			double TmpXS=0;
-			for(int i=1;i<4;i++){		//Loop on Reactions 1==fission, 2==capture, 3==n2n
-				TmpXS+=	(*it).second.GetXSForAt(0,TmpZAI,i);
-			}
-			fDistanceParameter.Add(TmpZAI,TmpXS);
+
+			for( int i=1; i<4; i++ ) //Loop on Reactions 1==fission, 2==capture, 3==n2n
+				TmpXS+=	(*it).second.GetXSForAt(0, (*itit).first, i);
+
+			fDistanceParameter.Add((*itit).first,TmpXS);
 		}
 
 
 	}
-	fDistanceParameter.Multiply((double)1.0/NevolutionDatainDataBank);
+	fDistanceParameter.Multiply( (double)1.0/NevolutionDatainDataBank );
 
 
 	GetLog()->fLog <<"!!INFO!! Distance Parameters "<<endl;
diff --git a/source/trunk/src/EvolutionData.cxx b/source/trunk/src/EvolutionData.cxx
index 4e1a82878f34bc84771803388972d9e58a717588..52f893a3e015e26f607da29793bfb53bf1634cae 100755
--- a/source/trunk/src/EvolutionData.cxx
+++ b/source/trunk/src/EvolutionData.cxx
@@ -110,6 +110,130 @@ EvolutionData operator*(EvolutionData const& evol, double F)
 	return evoltmp;
 	
 }
+EvolutionData operator+(EvolutionData const& evol1, EvolutionData const& evol2)
+{
+
+
+	EvolutionData EvolSum = evol1;
+	map<ZAI ,TGraph* > EvolutionData1 = evol1.GetEvolutionData();
+	map<ZAI ,TGraph* > EvolutionData2 = evol2.GetEvolutionData();
+	map<ZAI ,TGraph* >::iterator it;
+
+	for(it = EvolutionData2.begin(); it != EvolutionData2.end(); it++)
+	{
+		pair<map<ZAI, TGraph*>::iterator, bool> IResult;
+
+		IResult  = EvolutionData1.insert( pair<ZAI, TGraph*> ( *it ) );
+
+		if(!(IResult.second) )
+		{
+			double X[(*it).second->GetN()];
+			double Y[(*it).second->GetN()];
+			map<ZAI ,TGraph* >::iterator it2 = EvolutionData1.find( (*it).first );
+
+
+			for(int i = 0; i < (*it).second->GetN(); i++)
+			{
+				double y;
+				(*it).second->GetPoint( i, X[i], y );
+				Y[i] = y + (*it2).second->Eval(X[i]);
+			}
+			(*it).second = new TGraph((*it).second->GetN(), X, Y);
+		}
+	}
+
+	EvolSum.SetEvolutionData(EvolutionData1);
+
+
+	EvolutionData1 = evol1.GetFissionXS();
+	EvolutionData2 = evol2.GetFissionXS();
+
+	for(it = EvolutionData2.begin(); it != EvolutionData2.end(); it++)
+	{
+		pair<map<ZAI, TGraph*>::iterator, bool> IResult;
+
+		IResult  = EvolutionData1.insert( pair<ZAI, TGraph*> ( *it ) );
+
+		if(!(IResult.second) )
+		{
+			double X[(*it).second->GetN()];
+			double Y[(*it).second->GetN()];
+			map<ZAI ,TGraph* >::iterator it2 = EvolutionData1.find( (*it).first );
+
+
+			for(int i = 0; i < (*it).second->GetN(); i++)
+			{
+				double y;
+				(*it).second->GetPoint( i, X[i], y );
+				Y[i] = y + (*it2).second->Eval(X[i]);
+			}
+			(*it).second = new TGraph((*it).second->GetN(), X, Y);
+		}
+	}
+	EvolSum.SetFissionXS(EvolutionData1);
+
+
+
+	EvolutionData1 = evol1.GetCaptureXS();
+	EvolutionData2 = evol2.GetCaptureXS();
+
+	for(it = EvolutionData2.begin(); it != EvolutionData2.end(); it++)
+	{
+		pair<map<ZAI, TGraph*>::iterator, bool> IResult;
+
+		IResult  = EvolutionData1.insert( pair<ZAI, TGraph*> ( *it ) );
+
+		if(!(IResult.second) )
+		{
+			double X[(*it).second->GetN()];
+			double Y[(*it).second->GetN()];
+			map<ZAI ,TGraph* >::iterator it2 = EvolutionData1.find( (*it).first );
+
+
+			for(int i = 0; i < (*it).second->GetN(); i++)
+			{
+				double y;
+				(*it).second->GetPoint( i, X[i], y );
+				Y[i] = y + (*it2).second->Eval(X[i]);
+			}
+			(*it).second = new TGraph((*it).second->GetN(), X, Y);
+		}
+	}
+	EvolSum.SetCaptureXS(EvolutionData1);
+
+
+
+	EvolutionData1 = evol1.Getn2nXS();
+	EvolutionData2 = evol2.Getn2nXS();
+
+	for(it = EvolutionData2.begin(); it != EvolutionData2.end(); it++)
+	{
+		pair<map<ZAI, TGraph*>::iterator, bool> IResult;
+
+		IResult  = EvolutionData1.insert( pair<ZAI, TGraph*> ( *it ) );
+
+		if(!(IResult.second) )
+		{
+			double X[(*it).second->GetN()];
+			double Y[(*it).second->GetN()];
+			map<ZAI ,TGraph* >::iterator it2 = EvolutionData1.find( (*it).first );
+
+
+			for(int i = 0; i < (*it).second->GetN(); i++)
+			{
+				double y;
+				(*it).second->GetPoint( i, X[i], y );
+				Y[i] = y + (*it2).second->Eval(X[i]);
+			}
+			(*it).second = new TGraph((*it).second->GetN(), X, Y);
+		}
+	}
+	EvolSum.Setn2nXS(EvolutionData1);
+
+
+	return EvolSum;
+}
+
 
 	//________________________________________________________________________
 EvolutionData operator*(double F, EvolutionData const& evol)