diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setflaggingframe.h b/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setflaggingframe.h
index d50821954b66a8fd72d5cb02371c957c3f9cf5da..dc89902024b79a57b117c54c2c5a5dd98a293584 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setflaggingframe.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setflaggingframe.h
@@ -38,7 +38,8 @@ class SetFlaggingFrame : public Gtk::Frame {
 		_editStrategyWindow(editStrategyWindow), _action(action),
 		_setNoneButton("Set none"),
 		_setAllButton("Set all"),
-		_setOriginalButton("Set as original"),
+		_setFromOriginalButton("Restore original"),
+		_setToOriginalButton("Change original"),
 		_setInvertButton("Invert"),
 		_setPolarisationsEqualButton("Equal polarisations"),
 		_flagZerosButton("Flag zeros"),
@@ -53,8 +54,11 @@ class SetFlaggingFrame : public Gtk::Frame {
 			_box.pack_start(_setAllButton);
 			_setAllButton.set_group(group);
 
-			_box.pack_start(_setOriginalButton);
-			_setOriginalButton.set_group(group);
+			_box.pack_start(_setFromOriginalButton);
+			_setFromOriginalButton.set_group(group);
+
+			_box.pack_start(_setToOriginalButton);
+			_setToOriginalButton.set_group(group);
 
 			_box.pack_start(_setInvertButton);
 			_setInvertButton.set_group(group);
@@ -77,7 +81,10 @@ class SetFlaggingFrame : public Gtk::Frame {
 					_setAllButton.set_active(true);
 					break;
 				case rfiStrategy::SetFlaggingAction::FromOriginal:
-					_setOriginalButton.set_active(true);
+					_setFromOriginalButton.set_active(true);
+					break;
+				case rfiStrategy::SetFlaggingAction::ToOriginal:
+					_setToOriginalButton.set_active(true);
 					break;
 				case rfiStrategy::SetFlaggingAction::Invert:
 					_setInvertButton.set_active(true);
@@ -95,7 +102,8 @@ class SetFlaggingFrame : public Gtk::Frame {
 
 			_setNoneButton.show();
 			_setAllButton.show();
-			_setOriginalButton.show();
+			_setFromOriginalButton.show();
+			_setToOriginalButton.show();
 			_setInvertButton.show();
 			_setPolarisationsEqualButton.show();
 			_flagZerosButton.show();
@@ -119,7 +127,7 @@ class SetFlaggingFrame : public Gtk::Frame {
 		Gtk::HButtonBox _buttonBox;
 		Gtk::Label _baselinesLabel;
 		Gtk::RadioButton
-			_setNoneButton, _setAllButton, _setOriginalButton, _setInvertButton, _setPolarisationsEqualButton, _flagZerosButton, _orOriginalButton;
+			_setNoneButton, _setAllButton, _setFromOriginalButton, _setToOriginalButton, _setInvertButton, _setPolarisationsEqualButton, _flagZerosButton, _orOriginalButton;
 		Gtk::Button _applyButton;
 
 		void onApplyClicked()
@@ -128,8 +136,10 @@ class SetFlaggingFrame : public Gtk::Frame {
 				_action.SetNewFlagging(rfiStrategy::SetFlaggingAction::None);
 			else if(_setAllButton.get_active())
 				_action.SetNewFlagging(rfiStrategy::SetFlaggingAction::Everything);
-			else if(_setOriginalButton.get_active())
+			else if(_setFromOriginalButton.get_active())
 				_action.SetNewFlagging(rfiStrategy::SetFlaggingAction::FromOriginal);
+			else if(_setToOriginalButton.get_active())
+				_action.SetNewFlagging(rfiStrategy::SetFlaggingAction::ToOriginal);
 			else if(_setInvertButton.get_active())
 				_action.SetNewFlagging(rfiStrategy::SetFlaggingAction::Invert);
 			else if(_setPolarisationsEqualButton.get_active())
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachbaselineaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachbaselineaction.h
index dd4ac05a8c89f907319678dd6849c66fa8608ea4..5b1ba410e7b5647abc3f3b36b46afefc13eceede 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachbaselineaction.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachbaselineaction.h
@@ -72,6 +72,16 @@ namespace rfiStrategy {
 			void SetExceptionOccured();
 			void SetFinishedBaselines();
 			void SetProgress(ProgressListener &progress, int no, int count, std::string taskName, int threadId);
+			size_t mathThreadCount() const
+			{
+				// Since IO also takes some CPU, and IO should not be
+				// starved by math (because it is mostly IO limited),
+				// we reserve one of the threads for that.
+				if(_threadCount > 1)
+					return _threadCount - 1;
+				else
+					return _threadCount;
+			}
 
 			size_t BaselineProgress()
 			{
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setflaggingaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setflaggingaction.h
index 41a9125dd30d23ccf4e852843b3ada561b2e90d4..9ad47196a60d709e2aa583d7488c1db26da1dc03 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setflaggingaction.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setflaggingaction.h
@@ -31,7 +31,7 @@ namespace rfiStrategy {
 	class SetFlaggingAction : public Action
 	{
 		public:
-			enum NewFlagging { None, Everything, FromOriginal, Invert, PolarisationsEqual, FlagZeros, OrOriginal };
+			enum NewFlagging { None, Everything, FromOriginal, Invert, PolarisationsEqual, FlagZeros, OrOriginal, ToOriginal };
 
 			SetFlaggingAction() : _newFlagging(None) { }
 
@@ -45,7 +45,9 @@ namespace rfiStrategy {
 					case Everything:
 						return "Set everything flagged";
 					case FromOriginal:
-						return "Set original flags";
+						return "Restore original flags";
+					case ToOriginal:
+						return "Change original flags";
 					case Invert:
 						return "Set inverted flags";
 					case PolarisationsEqual:
@@ -70,6 +72,9 @@ namespace rfiStrategy {
 					case FromOriginal:
 						artifacts.ContaminatedData().SetGlobalMask(artifacts.OriginalData().GetSingleMask());
 						break;
+					case ToOriginal:
+						artifacts.OriginalData().SetGlobalMask(artifacts.ContaminatedData().GetSingleMask());
+						break;
 					case Invert: {
 						Mask2DPtr mask = Mask2D::CreateCopy(artifacts.ContaminatedData().GetSingleMask());
 						mask->Invert();
diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/foreachbaselineaction.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/foreachbaselineaction.cpp
index ba97ef22e315fc67bebc90a1513269ee83b9b5d0..0d0d6d162c9eea06d71c04ed55a455a3cb240a49 100644
--- a/CEP/DP3/AOFlagger/src/rfi/strategy/foreachbaselineaction.cpp
+++ b/CEP/DP3/AOFlagger/src/rfi/strategy/foreachbaselineaction.cpp
@@ -84,7 +84,8 @@ namespace rfiStrategy {
 			ReaderFunction reader(*this);
 			threadGroup.create_thread(reader);
 			
-			for(unsigned i=0;i<_threadCount;++i)
+			size_t mathThreads = mathThreadCount();
+			for(unsigned i=0;i<mathThreads;++i)
 			{
 				PerformFunction function(*this, progress, i);
 				threadGroup.create_thread(function);
@@ -244,7 +245,7 @@ namespace rfiStrategy {
 	{
 		Stopwatch watch(true);
 		bool finished = false;
-		size_t threadCount = _action._threadCount;
+		size_t threadCount = _action.mathThreadCount();
 		do {
 			watch.Pause();
 			_action.WaitForBufferAvailable(threadCount);