diff --git a/Code/Mantid/Framework/WorkflowAlgorithms/src/AlignAndFocusPowder.cpp b/Code/Mantid/Framework/WorkflowAlgorithms/src/AlignAndFocusPowder.cpp
index cceb59e53cef795fa6a87e6c437e43cbef6ae5a6..8fc8ae407b4f595a49734e4970c1ace32ba28f32 100644
--- a/Code/Mantid/Framework/WorkflowAlgorithms/src/AlignAndFocusPowder.cpp
+++ b/Code/Mantid/Framework/WorkflowAlgorithms/src/AlignAndFocusPowder.cpp
@@ -11,6 +11,8 @@
 #include "MantidDataObjects/MaskWorkspace.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
 #include "MantidDataObjects/Workspace2D.h"
+#include "MantidKernel/ArrayProperty.h"
+#include "MantidKernel/RebinParamsValidator.h"
 #include "MantidKernel/System.h"
 
 using Mantid::Geometry::Instrument_const_sptr;
@@ -59,7 +61,10 @@ void AlignAndFocusPowder::init()
     "Optional: An OffsetsWorkspace workspace giving the detector calibration values.");
   declareProperty(new WorkspaceProperty<MatrixWorkspace>("MaskWorkspace","",Direction::Input, PropertyMode::Optional),
     "Optional: An Workspace workspace giving which detectors are masked.");
-  declareProperty("Params","-0.004","The binning parameters: Positive is linear bins, negative is logarithmic (Default:-0.004)");
+  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.\n"
+        "Negative width values indicate logarithmic binning.");
   declareProperty("Dspacing", true,"Bin in Dspace. (Default true)");
   declareProperty("CropMin", 0.0, "Minimum for Cropping TOF or dspace axis. (Default 0.) ");
   declareProperty("CropMax", 0.0, "Maximum for Croping TOF or dspace axis. (Default 0.) ");
@@ -96,7 +101,7 @@ void AlignAndFocusPowder::exec()
   // retrieve the properties
   m_inputW = getProperty("InputWorkspace");
   m_eventW = boost::dynamic_pointer_cast<EventWorkspace>( m_inputW );
-  if (m_eventW != NULL)
+  if ((m_eventW != NULL))
   {
     if (getProperty("PreserveEvents"))
     {
@@ -110,7 +115,7 @@ void AlignAndFocusPowder::exec()
   OffsetsWorkspace_sptr offsetsWS = getProperty("OffsetsWorkspace");
   MatrixWorkspace_sptr maskWS = getProperty("MaskWorkspace");
   GroupingWorkspace_sptr groupWS = getProperty("GroupingWorkspace");
-  std::string params = getProperty("Params");
+  std::vector<double> params=getProperty("Params");
   bool dspace = getProperty("DSpacing");
   double xmin = getProperty("CropMin");
   double xmax = getProperty("CropMax");
@@ -120,7 +125,6 @@ void AlignAndFocusPowder::exec()
   double tmin = getProperty("TMin");
   double tmax = getProperty("TMax");
 
-
   // Get the input workspace
   if ((!offsetsWS || !maskWS || !groupWS) && !calFileName.empty())
   {
@@ -137,19 +141,25 @@ void AlignAndFocusPowder::exec()
     AnalysisDataService::Instance().addOrReplace(instName+"_offsets", offsetsWS);
     AnalysisDataService::Instance().addOrReplace(instName+"_mask", maskWS);
   }
+  // Now create the output workspace
+  m_outputW = getProperty("OutputWorkspace");
+  if ( m_outputW != m_inputW )
+  {
+     m_outputW = WorkspaceFactory::Instance().create(m_inputW);
+  }
 
   if (xmin > 0. || xmax > 0.)
   {
 	  API::IAlgorithm_sptr cropAlg = createSubAlgorithm("CropWorkspace");
-	  cropAlg->setProperty("InputWorkspace", m_inputW);
+	  cropAlg->setProperty("InputWorkspace", m_outputW);
 	  if (xmin > 0.)cropAlg->setProperty("Xmin", xmin);
 	  if (xmax > 0.)cropAlg->setProperty("Xmax", xmax);
 	  cropAlg->executeAsSubAlg();
-	  m_inputW = cropAlg->getProperty("OutputWorkspace");
+	  m_outputW = cropAlg->getProperty("OutputWorkspace");
   }
 
   API::IAlgorithm_sptr maskAlg = createSubAlgorithm("MaskDetectors");
-  maskAlg->setProperty("Workspace", m_inputW);
+  maskAlg->setProperty("Workspace", m_outputW);
   maskAlg->setProperty("MaskedWorkspace", instName+"_mask");
   maskAlg->executeAsSubAlg();
   m_outputW = maskAlg->getProperty("Workspace");
@@ -161,7 +171,6 @@ void AlignAndFocusPowder::exec()
 	  rebinAlg->setProperty("Params",params);
 	  rebinAlg->executeAsSubAlg();
 	  m_outputW = rebinAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   API::IAlgorithm_sptr alignAlg = createSubAlgorithm("AlignDetectors");
@@ -172,23 +181,22 @@ void AlignAndFocusPowder::exec()
 
   if(LRef > 0. || minwl > 0. || DIFCref > 0.)
   {
-          API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
-          convertAlg->setProperty("InputWorkspace", m_outputW);
-          convertAlg->setProperty("Target","TOF");
-          convertAlg->executeAsSubAlg();
-          m_outputW = convertAlg->getProperty("OutputWorkspace");
+	  API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
+	  convertAlg->setProperty("InputWorkspace", m_outputW);
+	  convertAlg->setProperty("Target","TOF");
+	  convertAlg->executeAsSubAlg();
+	  m_outputW = convertAlg->getProperty("OutputWorkspace");
   }
 
   if(LRef > 0.)
   {
-	  API::IAlgorithm_sptr removeAlg = createSubAlgorithm("RemoveLowResTOF");
+	  API::IAlgorithm_sptr removeAlg = createSubAlgorithm("UnwrapSNS");
 	  removeAlg->setProperty("InputWorkspace", m_outputW);
 	  removeAlg->setProperty("LRef",LRef);
 	  removeAlg->setProperty("Tmin",tmin);
 	  removeAlg->setProperty("Tmax",tmax);
 	  removeAlg->executeAsSubAlg();
 	  m_outputW = removeAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   if(minwl > 0.)
@@ -199,7 +207,6 @@ void AlignAndFocusPowder::exec()
 	  removeAlg->setProperty("Tmin",tmin);
 	  removeAlg->executeAsSubAlg();
 	  m_outputW = removeAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
   else if(DIFCref > 0.)
   {
@@ -210,16 +217,15 @@ void AlignAndFocusPowder::exec()
 	  removeAlg->setProperty("Tmin",tmin);
 	  removeAlg->executeAsSubAlg();
 	  m_outputW = removeAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   if(LRef > 0. || minwl > 0. || DIFCref > 0.)
   {
-          API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
-          convertAlg->setProperty("InputWorkspace", m_outputW);
-          convertAlg->setProperty("Target","dSpacing");
-          convertAlg->executeAsSubAlg();
-          m_outputW = convertAlg->getProperty("OutputWorkspace");
+	  API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
+	  convertAlg->setProperty("InputWorkspace", m_outputW);
+	  convertAlg->setProperty("Target","dSpacing");
+	  convertAlg->executeAsSubAlg();
+	  m_outputW = convertAlg->getProperty("OutputWorkspace");
   }
 
   if(dspace)
@@ -229,7 +235,6 @@ void AlignAndFocusPowder::exec()
 	  rebinAlg->setProperty("Params",params);
 	  rebinAlg->executeAsSubAlg();
 	  m_outputW = rebinAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   API::IAlgorithm_sptr focusAlg = createSubAlgorithm("DiffractionFocussing");
@@ -245,6 +250,8 @@ void AlignAndFocusPowder::exec()
   convertAlg->executeAsSubAlg();
   m_outputW = convertAlg->getProperty("OutputWorkspace");
 
+  params.erase(params.begin());
+  params.pop_back();
   API::IAlgorithm_sptr rebinAlg = createSubAlgorithm("Rebin");
   rebinAlg->setProperty("InputWorkspace", m_outputW);
   rebinAlg->setProperty("Params",params);
@@ -267,7 +274,7 @@ void AlignAndFocusPowder::execEvent()
   OffsetsWorkspace_sptr offsetsWS = getProperty("OffsetsWorkspace");
   MatrixWorkspace_sptr maskWS = getProperty("MaskWorkspace");
   GroupingWorkspace_sptr groupWS = getProperty("GroupingWorkspace");
-  std::string params = getProperty("Params");
+  std::vector<double> params=getProperty("Params");
   bool dspace = getProperty("DSpacing");
   double xmin = getProperty("CropMin");
   double xmax = getProperty("CropMax");
@@ -299,47 +306,67 @@ void AlignAndFocusPowder::execEvent()
     AnalysisDataService::Instance().addOrReplace(instName+"_offsets", offsetsWS);
     AnalysisDataService::Instance().addOrReplace(instName+"_mask", maskWS);
   }
+  Progress progress(this,0.0,1.0,m_eventW->getNumberHistograms());
+
+  // generate the output workspace pointer
+  m_outputW = this->getProperty("OutputWorkspace");
+  EventWorkspace_sptr m_outputEventW;
+  if (m_outputW == m_inputW)
+    m_outputEventW = boost::dynamic_pointer_cast<EventWorkspace>(m_outputW);
+  else
+  {
+    //Make a brand new EventWorkspace
+    m_outputEventW = boost::dynamic_pointer_cast<EventWorkspace>(
+    WorkspaceFactory::Instance().create("EventWorkspace", m_eventW->getNumberHistograms(), 2, 1));
+    //Copy geometry over.
+    WorkspaceFactory::Instance().initializeFromParent(m_eventW, m_outputEventW, false);
+    //You need to copy over the data as well.
+    m_outputEventW->copyDataFrom( (*m_eventW) );
+
+    //Cast to the matrixOutputWS and save it
+    m_outputW = boost::dynamic_pointer_cast<MatrixWorkspace>(m_outputEventW);
+  }
 
   if (filterBadPulses)
   {
     API::IAlgorithm_sptr filterAlg = createSubAlgorithm("FilterBadPulses");
-    filterAlg->setProperty("InputWorkspace", m_eventW);
+    filterAlg->setProperty("InputWorkspace", m_outputEventW);
     filterAlg->executeAsSubAlg();
-    m_eventW = filterAlg->getProperty("OutputWorkspace");
+    m_outputEventW = filterAlg->getProperty("OutputWorkspace");
   }
 
   if (removePromptPulseWidth > 0.)
   {
     API::IAlgorithm_sptr filterAlg = createSubAlgorithm("RemovePromptPulse");
-    filterAlg->setProperty("InputWorkspace", m_eventW);
+    filterAlg->setProperty("InputWorkspace", m_outputEventW);
     filterAlg->setProperty("Width", removePromptPulseWidth);
     filterAlg->executeAsSubAlg();
-    m_eventW = filterAlg->getProperty("OutputWorkspace");
+    m_outputEventW = filterAlg->getProperty("OutputWorkspace");
   }
 
   if (!filterName.empty())
   {
     API::IAlgorithm_sptr filterLogsAlg = createSubAlgorithm("FilterByLogValue");
-    filterLogsAlg->setProperty("InputWorkspace", m_eventW);
+    filterLogsAlg->setProperty("InputWorkspace", m_outputEventW);
     filterLogsAlg->setProperty("LogName", filterName);
     filterLogsAlg->setProperty("MinimumValue", filterMin);
     filterLogsAlg->setProperty("MaximumValue", filterMax);
     filterLogsAlg->executeAsSubAlg();
-    m_eventW = filterLogsAlg->getProperty("OutputWorkspace");
+    m_outputEventW = filterLogsAlg->getProperty("OutputWorkspace");
   }
 
   API::IAlgorithm_sptr compressAlg = createSubAlgorithm("CompressEvents");
-  compressAlg->setProperty("InputWorkspace", m_eventW);
+  compressAlg->setProperty("InputWorkspace", m_outputEventW);
   compressAlg->setProperty("Tolerance",tolerance);
   compressAlg->executeAsSubAlg();
-  m_eventW = compressAlg->getProperty("OutputWorkspace");
+  m_outputEventW = compressAlg->getProperty("OutputWorkspace");
 
-  m_eventW->sortAll(TOF_SORT, NULL);
+  m_outputEventW->sortAll(TOF_SORT, NULL);
 
   if (xmin > 0. || xmax > 0.)
   {
 	  API::IAlgorithm_sptr cropAlg = createSubAlgorithm("CropWorkspace");
-	  cropAlg->setProperty("InputWorkspace", m_inputW);
+	  cropAlg->setProperty("InputWorkspace", m_outputW);
 	  if (xmin > 0.)cropAlg->setProperty("Xmin", xmin);
 	  if (xmax > 0.)cropAlg->setProperty("Xmax", xmax);
 	  cropAlg->executeAsSubAlg();
@@ -347,7 +374,7 @@ void AlignAndFocusPowder::execEvent()
   }
 
   API::IAlgorithm_sptr maskAlg = createSubAlgorithm("MaskDetectors");
-  maskAlg->setProperty("Workspace", m_inputW);
+  maskAlg->setProperty("Workspace", m_outputW);
   maskAlg->setProperty("MaskedWorkspace", instName+"_mask");
   maskAlg->executeAsSubAlg();
   m_outputW = maskAlg->getProperty("Workspace");
@@ -359,7 +386,6 @@ void AlignAndFocusPowder::execEvent()
 	  rebinAlg->setProperty("Params",params);
 	  rebinAlg->executeAsSubAlg();
 	  m_outputW = rebinAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   API::IAlgorithm_sptr alignAlg = createSubAlgorithm("AlignDetectors");
@@ -370,23 +396,22 @@ void AlignAndFocusPowder::execEvent()
 
   if(LRef > 0. || minwl > 0. || DIFCref > 0.)
   {
-          API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
-          convertAlg->setProperty("InputWorkspace", m_outputW);
-          convertAlg->setProperty("Target","TOF");
-          convertAlg->executeAsSubAlg();
-          m_outputW = convertAlg->getProperty("OutputWorkspace");
+	  API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
+	  convertAlg->setProperty("InputWorkspace", m_outputW);
+	  convertAlg->setProperty("Target","TOF");
+	  convertAlg->executeAsSubAlg();
+	  m_outputW = convertAlg->getProperty("OutputWorkspace");
   }
 
   if(LRef > 0.)
   {
-	  API::IAlgorithm_sptr removeAlg = createSubAlgorithm("RemoveLowResTOF");
+	  API::IAlgorithm_sptr removeAlg = createSubAlgorithm("UnwrapSNS");
 	  removeAlg->setProperty("InputWorkspace", m_outputW);
 	  removeAlg->setProperty("LRef",LRef);
 	  removeAlg->setProperty("Tmin",tmin);
 	  removeAlg->setProperty("Tmax",tmax);
 	  removeAlg->executeAsSubAlg();
 	  m_outputW = removeAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   if(minwl > 0.)
@@ -397,7 +422,6 @@ void AlignAndFocusPowder::execEvent()
 	  removeAlg->setProperty("Tmin",tmin);
 	  removeAlg->executeAsSubAlg();
 	  m_outputW = removeAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
   else if(DIFCref > 0.)
   {
@@ -408,16 +432,15 @@ void AlignAndFocusPowder::execEvent()
 	  removeAlg->setProperty("Tmin",tmin);
 	  removeAlg->executeAsSubAlg();
 	  m_outputW = removeAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
   if(LRef > 0. || minwl > 0. || DIFCref > 0.)
   {
-          API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
-          convertAlg->setProperty("InputWorkspace", m_outputW);
-          convertAlg->setProperty("Target","dSpacing");
-          convertAlg->executeAsSubAlg();
-          m_outputW = convertAlg->getProperty("OutputWorkspace");
+	  API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
+	  convertAlg->setProperty("InputWorkspace", m_outputW);
+	  convertAlg->setProperty("Target","dSpacing");
+	  convertAlg->executeAsSubAlg();
+	  m_outputW = convertAlg->getProperty("OutputWorkspace");
   }
 
   if(dspace)
@@ -427,10 +450,9 @@ void AlignAndFocusPowder::execEvent()
 	  rebinAlg->setProperty("Params",params);
 	  rebinAlg->executeAsSubAlg();
 	  m_outputW = rebinAlg->getProperty("OutputWorkspace");
-	  setProperty("OutputWorkspace",m_outputW);
   }
 
-  m_eventW->sortAll(TOF_SORT, NULL);
+  m_outputEventW->sortAll(TOF_SORT, NULL);
 
   API::IAlgorithm_sptr focusAlg = createSubAlgorithm("DiffractionFocussing");
   focusAlg->setProperty("InputWorkspace", m_outputW);
@@ -439,7 +461,7 @@ void AlignAndFocusPowder::execEvent()
   focusAlg->executeAsSubAlg();
   m_outputW = focusAlg->getProperty("OutputWorkspace");
 
-  m_eventW->sortAll(TOF_SORT, NULL);
+  m_outputEventW->sortAll(TOF_SORT, NULL);
 
   API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
   convertAlg->setProperty("InputWorkspace", m_outputW);
@@ -447,6 +469,8 @@ void AlignAndFocusPowder::execEvent()
   convertAlg->executeAsSubAlg();
   m_outputW = convertAlg->getProperty("OutputWorkspace");
 
+  params.erase(params.begin());
+  params.pop_back();
   API::IAlgorithm_sptr rebinAlg = createSubAlgorithm("Rebin");
   rebinAlg->setProperty("InputWorkspace", m_outputW);
   rebinAlg->setProperty("Params",params);