diff --git a/Code/Mantid/Framework/Algorithms/src/CorelliCrossCorrelate.cpp b/Code/Mantid/Framework/Algorithms/src/CorelliCrossCorrelate.cpp
index d7e0608ee64fc1560a8ee8e6cf33fea0c25eb4e0..77fe3911a9ea07e0cbe6a038ed02e4c30f1458bd 100644
--- a/Code/Mantid/Framework/Algorithms/src/CorelliCrossCorrelate.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/CorelliCrossCorrelate.cpp
@@ -4,6 +4,7 @@
 #include "MantidGeometry/IComponent.h"
 #include "MantidKernel/MandatoryValidator.h"
 #include "MantidKernel/TimeSeriesProperty.h"
+#include "MantidGeometry/muParser_Silent.h"
 
 namespace Mantid
 {
@@ -147,7 +148,15 @@ namespace Algorithms
     //Get the sample and source, calculate distances.
     IComponent_const_sptr sample = inputWS->getInstrument()->getSample();
     const double distanceChopperToSource = inputWS->getInstrument()->getSource()->getDistance(*chopper);
-    const double distanceChopperToSample = sample->getDistance(*chopper);
+    const double distanceSourceToSample = inputWS->getInstrument()->getSource()->getDistance(*sample);
+
+    // extract formula from instrument parameters
+    std::vector<std::string> t0_formula = inputWS->getInstrument()->getStringParameter("t0_formula");
+    if(t0_formula.empty()) throw Exception::InstrumentDefinitionError("Unable to retrieve t0_formula among instrument parameters");
+    std::string formula = t0_formula[0];
+    g_log.debug() << formula << "\n";
+
+    const double m_convfactor = 0.5e+12*Mantid::PhysicalConstants::NeutronMass/Mantid::PhysicalConstants::meV;
 
     //Do the cross correlation.
     int64_t numHistograms = static_cast<int64_t>(inputWS->getNumberHistograms());
@@ -187,19 +196,29 @@ namespace Algorithms
 	  throw std::runtime_error("Missing pulse times on events. This will not work.");
 
 	//Scale for elastic scattering.
-	double tofScale = distanceChopperToSource/(distanceChopperToSource+distanceChopperToSample+detector->getDistance(*sample));
+	double distanceSourceToDetector = distanceSourceToSample+detector->getDistance(*sample);
+	double tofScale = distanceChopperToSource/distanceSourceToDetector;
+
+	double E1;
+	mu::Parser parser;
+	parser.DefineVar("incidentEnergy", &E1); // associate variable E1 to this parser
+	parser.SetExpr(formula);
 
 	uint64_t tdc_i = 0;
 	std::vector<WeightedEvent>::iterator it;
 	for (it = events.begin(); it != events.end(); ++it)
 	  {
-	    DateAndTime tofTime = it->pulseTime() + static_cast<int64_t>(it->tof()*1000.*tofScale);
+	    double tof = it->tof();
+	    E1 = m_convfactor*(distanceSourceToDetector/tof)*(distanceSourceToDetector/tof);
+	    double t0=parser.Eval();
+
+	    DateAndTime tofTime = it->pulseTime() + static_cast<int64_t>( ( (tof-t0)*tofScale + t0 )*1000. );
 	    while (tofTime>tdc[tdc_i])
 	      {
 		//Make sure the tdc index is not out of bounds.
 		if (tdc_i == tdc.size())
 		  {
-		    if (tofTime>(tdc[tdc_i-1]+static_cast<int64_t>(period)))
+		    if (tofTime>(tdc[tdc_i-1]+static_cast<int64_t>(period*2)))
 			g_log.warning("Event occurred long after last TDC.");
 		    break;
 		  }
diff --git a/Code/Mantid/instrument/CORELLI_Parameters.xml b/Code/Mantid/instrument/CORELLI_Parameters.xml
new file mode 100644
index 0000000000000000000000000000000000000000..028a5ebc83ac19a460f31e51ae81232294d4455d
--- /dev/null
+++ b/Code/Mantid/instrument/CORELLI_Parameters.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<parameter-file instrument="CORELLI" valid-from="2014-02-25T00:00:00">
+	<component-link name="CORELLI">
+		<!--   formula for t0 calculation. See http://muparser.sourceforge.net/mup_features.html#idDef2 for available operators-->
+		<parameter name="t0_formula" type="string">
+		        <!-- This formula was taken from ARCS and needs to be updated for CORELLI -->
+			<value val="(101.9 * incidentEnergy^(-0.41) * exp(-incidentEnergy/282.0))" />
+		</parameter>
+	</component-link>
+</parameter-file>