diff --git a/Code/Mantid/Framework/Algorithms/CMakeLists.txt b/Code/Mantid/Framework/Algorithms/CMakeLists.txt
index 51b57165e7ed6c8731ee2b58a0c9064cc48e7bdc..0f6b14f4b8415bea1c0a8cc79ea056c630ded294 100644
--- a/Code/Mantid/Framework/Algorithms/CMakeLists.txt
+++ b/Code/Mantid/Framework/Algorithms/CMakeLists.txt
@@ -176,6 +176,7 @@ set ( SRC_FILES
 	src/Rebin2D.cpp
 	src/RebinByPulseTimes.cpp
 	src/RebinByTimeAtSample.cpp
+	src/RebinByTimeBase.cpp
 	src/RebinToWorkspace.cpp
 	src/Rebunch.cpp
 	src/RecordPythonScript.cpp
@@ -418,6 +419,7 @@ set ( INC_FILES
 	inc/MantidAlgorithms/Rebin2D.h
 	inc/MantidAlgorithms/RebinByPulseTimes.h
 	inc/MantidAlgorithms/RebinByTimeAtSample.h
+	inc/MantidAlgorithms/RebinByTimeBase.h
 	inc/MantidAlgorithms/RebinToWorkspace.h
 	inc/MantidAlgorithms/Rebunch.h
 	inc/MantidAlgorithms/RecordPythonScript.h
diff --git a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByPulseTimes.h b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByPulseTimes.h
index 4c927b099afd8a65378d5dafa0ab4becf927ec6b..a53c41ddd841a346c7cfe0367c13a84e57b46aca 100644
--- a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByPulseTimes.h
+++ b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByPulseTimes.h
@@ -2,7 +2,7 @@
 #define MANTID_ALGORITHMS_REBINBYPULSETIMES_H_
 
 #include "MantidKernel/System.h"
-#include "MantidAPI/Algorithm.h"
+#include "MantidAlgorithms/RebinByTimeBase.h"
 
 namespace Mantid
 {
@@ -31,7 +31,7 @@ namespace Algorithms
     File change history is stored at: <https://github.com/mantidproject/mantid>
     Code Documentation is available at: <http://doxygen.mantidproject.org>
   */
-  class DLLExport RebinByPulseTimes  : public API::Algorithm
+  class DLLExport RebinByPulseTimes  : public RebinByTimeBase
   {
   public:
     RebinByPulseTimes();
@@ -46,7 +46,6 @@ namespace Algorithms
 
   private:
 
-    void init();
     void exec();
   };
 
@@ -54,4 +53,4 @@ namespace Algorithms
 } // namespace Algorithms
 } // namespace Mantid
 
-#endif  /* MANTID_ALGORITHMS_REBINBYPULSETIMES_H_ */
\ No newline at end of file
+#endif  /* MANTID_ALGORITHMS_REBINBYPULSETIMES_H_ */
diff --git a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeAtSample.h b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeAtSample.h
index a1a2ec8f6c31ee30d81fc163a18db5dab645f6b0..d6e9da8e0d8d112ae1d5b6e6c8a2f9f16dff6bd4 100644
--- a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeAtSample.h
+++ b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeAtSample.h
@@ -2,7 +2,7 @@
 #define MANTID_ALGORITHMS_REBINBYTIMEATSAMPLE_H_
 
 #include "MantidKernel/System.h"
-#include "MantidAPI/Algorithm.h"
+#include "MantidAlgorithms/RebinByTimeBase.h"
 
 namespace Mantid
 {
@@ -31,7 +31,7 @@ namespace Algorithms
     File change history is stored at: <https://github.com/mantidproject/mantid>
     Code Documentation is available at: <http://doxygen.mantidproject.org>
   */
-  class DLLExport RebinByTimeAtSample  : public API::Algorithm
+  class DLLExport RebinByTimeAtSample  : public RebinByTimeBase
   {
   public:
     RebinByTimeAtSample();
@@ -43,7 +43,6 @@ namespace Algorithms
     virtual const std::string summary() const;
 
   private:
-    void init();
     void exec();
 
 
diff --git a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeBase.h b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeBase.h
new file mode 100644
index 0000000000000000000000000000000000000000..2bc6e749e5733c32be3e4311f704de0f171d1bad
--- /dev/null
+++ b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RebinByTimeBase.h
@@ -0,0 +1,53 @@
+#ifndef MANTID_ALGORITHMS_REBINBYTIMEBASE_H_
+#define MANTID_ALGORITHMS_REBINBYTIMEBASE_H_
+
+#include "MantidKernel/System.h"
+#include "MantidAPI/Algorithm.h"
+
+namespace Mantid
+{
+namespace Algorithms
+{
+
+  /** RebinByTimeBase : Algorithm base class for algorithms performing rebinning by an absolute time axis.
+    
+    Copyright &copy; 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory
+
+    This file is part of Mantid.
+
+    Mantid is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    Mantid is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+    File change history is stored at: <https://github.com/mantidproject/mantid>
+    Code Documentation is available at: <http://doxygen.mantidproject.org>
+  */
+  class DLLExport RebinByTimeBase  : public API::Algorithm
+  {
+  public:
+    /// Constructor
+    RebinByTimeBase();
+    /// Virtual destructor
+    virtual ~RebinByTimeBase() = 0;
+    
+  private:
+    /// Initialization method
+    void init();
+
+
+  };
+
+
+} // namespace Algorithms
+} // namespace Mantid
+
+#endif  /* MANTID_ALGORITHMS_REBINBYTIMEBASE_H_ */
diff --git a/Code/Mantid/Framework/Algorithms/src/RebinByPulseTimes.cpp b/Code/Mantid/Framework/Algorithms/src/RebinByPulseTimes.cpp
index 0fab219230bb75d095c33485cd20eb4e0e73ba34..0b98d5f527208e62f6ffeb65e2776455aafe73be 100644
--- a/Code/Mantid/Framework/Algorithms/src/RebinByPulseTimes.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/RebinByPulseTimes.cpp
@@ -1,11 +1,8 @@
 #include "MantidAlgorithms/RebinByPulseTimes.h"
 #include "MantidDataObjects/EventWorkspace.h"
-#include "MantidKernel/ArrayProperty.h"
-#include "MantidKernel/RebinParamsValidator.h"
 #include "MantidKernel/VectorHelper.h"
 #include "MantidKernel/Unit.h"
 #include <boost/make_shared.hpp>
-#include <boost/assign/list_of.hpp>
 #include <algorithm>
 
 using namespace Mantid::Kernel;
@@ -61,18 +58,6 @@ namespace Algorithms
 
   //----------------------------------------------------------------------------------------------
 
-  //----------------------------------------------------------------------------------------------
-  /** Initialize the algorithm's properties.
-  */
-  void RebinByPulseTimes::init()
-  {
-    declareProperty(new API::WorkspaceProperty<API::IEventWorkspace>("InputWorkspace","",Direction::Input), "An input workspace containing TOF events.");
-    declareProperty(
-      new ArrayProperty<double>("Params", boost::make_shared<RebinParamsValidator>()),
-      "A comma separated list of first bin boundary, width, last bin boundary. Optionally\n"
-      "this can be followed by a comma and more widths and last boundary pairs. Values are in seconds since run start.");
-    declareProperty(new API::WorkspaceProperty<API::MatrixWorkspace>("OutputWorkspace","",Direction::Output), "An output workspace.");
-  }
 
   //----------------------------------------------------------------------------------------------
   /** Execute the algorithm.
diff --git a/Code/Mantid/Framework/Algorithms/src/RebinByTimeAtSample.cpp b/Code/Mantid/Framework/Algorithms/src/RebinByTimeAtSample.cpp
index cc3bfb093b6cc6fd400436be073809bac3e23f0a..e417c3e9a3453704cd9d5a3cc186b4ffa9273e69 100644
--- a/Code/Mantid/Framework/Algorithms/src/RebinByTimeAtSample.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/RebinByTimeAtSample.cpp
@@ -1,11 +1,9 @@
 #include "MantidAlgorithms/RebinByTimeAtSample.h"
+
 #include "MantidDataObjects/EventWorkspace.h"
-#include "MantidKernel/ArrayProperty.h"
-#include "MantidKernel/RebinParamsValidator.h"
 #include "MantidKernel/VectorHelper.h"
 #include "MantidKernel/Unit.h"
 #include <boost/make_shared.hpp>
-#include <boost/assign/list_of.hpp>
 #include <algorithm>
 
 namespace Mantid
@@ -79,24 +77,6 @@ namespace Mantid
       return "RebinByTimeAtSample";
     }
 
-    //----------------------------------------------------------------------------------------------
-    /** Initialize the algorithm's properties.
-     */
-    void RebinByTimeAtSample::init()
-    {
-      declareProperty(
-          new API::WorkspaceProperty<API::IEventWorkspace>("InputWorkspace", "", Direction::Input),
-          "An input workspace containing TOF events.");
-
-      declareProperty(new ArrayProperty<double>("Params", boost::make_shared<RebinParamsValidator>()),
-          "A comma separated list of first bin boundary, width, last bin boundary. Optionally\n"
-              "this can be followed by a comma and more widths and last boundary pairs. Values are in seconds since run start.");
-
-      declareProperty(
-          new API::WorkspaceProperty<API::MatrixWorkspace>("OutputWorkspace", "", Direction::Output),
-          "An output workspace.");
-    }
-
     //----------------------------------------------------------------------------------------------
     /** Execute the algorithm.
      */
diff --git a/Code/Mantid/Framework/Algorithms/src/RebinByTimeBase.cpp b/Code/Mantid/Framework/Algorithms/src/RebinByTimeBase.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..80dd401c3a1f8e196d4df58f26153e3855412076
--- /dev/null
+++ b/Code/Mantid/Framework/Algorithms/src/RebinByTimeBase.cpp
@@ -0,0 +1,50 @@
+#include "MantidAlgorithms/RebinByTimeBase.h"
+#include "MantidDataObjects/EventWorkspace.h"
+#include "MantidKernel/ArrayProperty.h"
+#include "MantidKernel/RebinParamsValidator.h"
+#include "MantidKernel/VectorHelper.h"
+#include "MantidKernel/Unit.h"
+
+#include <boost/make_shared.hpp>
+
+namespace Mantid
+{
+namespace Algorithms
+{
+
+  using namespace Mantid::Kernel;
+  using namespace Mantid::API;
+
+  //----------------------------------------------------------------------------------------------
+  /** Constructor
+   */
+  RebinByTimeBase::RebinByTimeBase()
+  {
+  }
+    
+  //----------------------------------------------------------------------------------------------
+  /** Destructor
+   */
+  RebinByTimeBase::~RebinByTimeBase()
+  {
+  }
+  
+  //----------------------------------------------------------------------------------------------
+  /** Initialize the algorithm's properties.
+   */
+  void RebinByTimeBase::init()
+  {
+    declareProperty(new API::WorkspaceProperty<API::IEventWorkspace>("InputWorkspace","",Direction::Input), "An input workspace containing TOF events.");
+
+    declareProperty(new ArrayProperty<double>("Params", boost::make_shared<RebinParamsValidator>()),
+      "A comma separated list of first bin boundary, width, last bin boundary. Optionally\n"
+      "this can be followed by a comma and more widths and last boundary pairs. Values are in seconds since run start.");
+
+    declareProperty(new API::WorkspaceProperty<API::MatrixWorkspace>("OutputWorkspace","",Direction::Output), "An output workspace.");
+  }
+
+
+
+
+} // namespace Algorithms
+} // namespace Mantid
diff --git a/Code/Mantid/Framework/Algorithms/test/RebinByPulseTimesTest.h b/Code/Mantid/Framework/Algorithms/test/RebinByPulseTimesTest.h
index 631f86e7e5d644e36ba8326cbfe9ad2e25b186bc..5ef3f6c2f05d370930528ccf736d5332690a6fc8 100644
--- a/Code/Mantid/Framework/Algorithms/test/RebinByPulseTimesTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/RebinByPulseTimesTest.h
@@ -8,6 +8,7 @@
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidDataObjects/EventWorkspace.h"
 #include "MantidDataObjects/Events.h"
+#include "MantidTestHelpers/WorkspaceCreationHelper.h"
 #include <boost/make_shared.hpp>
 #include <boost/assign/list_of.hpp>
 #include <gmock/gmock.h>
@@ -22,34 +23,38 @@ namespace
 /**
 Helper method to create an event workspace with a set number of distributed events between pulseTimeMax and pulseTimeMin.
 */
-IEventWorkspace_sptr createEventWorkspace(const int numberspectra, const int nDistrubutedEvents, const int pulseTimeMinSecs, const int pulseTimeMaxSecs, const DateAndTime runStart=DateAndTime(int(1)))
-{
-  uint64_t pulseTimeMin = uint64_t(1e9) * pulseTimeMinSecs;
-  uint64_t pulseTimeMax = uint64_t(1e9) * pulseTimeMaxSecs;
+  IEventWorkspace_sptr createEventWorkspace(const int numberspectra, const int nDistrubutedEvents, const int pulseTimeMinSecs, const int pulseTimeMaxSecs, const DateAndTime runStart=DateAndTime(int(1)))
+  {
+    uint64_t pulseTimeMin = uint64_t(1e9) * pulseTimeMinSecs;
+    uint64_t pulseTimeMax = uint64_t(1e9) * pulseTimeMaxSecs;
 
-  EventWorkspace_sptr retVal(new EventWorkspace);
-  retVal->initialize(numberspectra,1,1);
-  double binWidth = std::abs(double(pulseTimeMax - pulseTimeMin)/nDistrubutedEvents);
+    EventWorkspace_sptr retVal(new EventWorkspace);
+    retVal->initialize(numberspectra,1,1);
+    double binWidth = std::abs(double(pulseTimeMax - pulseTimeMin)/nDistrubutedEvents);
 
-  //Make fake events
-  for (int pix=0; pix<numberspectra; pix++)
-  {
-    for (int i=0; i<nDistrubutedEvents; i++)
+    //Make fake events
+    for (int pix=0; pix<numberspectra; pix++)
     {
-      double tof = 0;
-      uint64_t pulseTime = uint64_t(((double)i+0.5)*binWidth); // Stick an event with a pulse_time in the middle of each pulse_time bin.
-      retVal->getEventList(pix) += TofEvent(tof, pulseTime);
+      for (int i=0; i<nDistrubutedEvents; i++)
+      {
+        double tof = 0;
+        uint64_t pulseTime = uint64_t(((double)i+0.5)*binWidth); // Stick an event with a pulse_time in the middle of each pulse_time bin.
+        retVal->getEventList(pix) += TofEvent(tof, pulseTime);
+      }
     }
-    retVal->getEventList(pix).addDetectorID(pix);
-    retVal->getEventList(pix).setSpectrumNo(pix);
-  }
 
-  // Add the required start time.
-  PropertyWithValue<std::string>* testProperty = new PropertyWithValue<std::string>("start_time", runStart.toSimpleString(), Direction::Input);
-  retVal->mutableRun().addLogData(testProperty);
+    // Add the required start time.
+    PropertyWithValue<std::string>* testProperty = new PropertyWithValue<std::string>("start_time", runStart.toSimpleString(), Direction::Input);
+    retVal->mutableRun().addLogData(testProperty);
 
-  return retVal;
-}
+    V3D samplePosition(10,0,0);
+    V3D sourcePosition(0,0,0);
+    std::vector<V3D> detectorPositions(numberspectra, V3D(20, 0, 0));
+
+    WorkspaceCreationHelper::createInstrumentForWorkspaceWithDistances(retVal, samplePosition, sourcePosition, detectorPositions );
+
+    return retVal;
+  }
 
 /*
 This type is an IEventWorkspace, but not an EventWorkspace.