diff --git a/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h b/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h
index 6feb6c897f029b309402514f69af60ac5e2c36f7..9b14cb0459158bfbf081e251696f4a22952d131a 100644
--- a/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h
+++ b/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h
@@ -45,6 +45,7 @@ private:
   API::ITableWorkspace_sptr performFit(const std::string &input,
                                        const std::string &output);
   void deleteTemporaryWorkspaces(const std::string &outputBaseName);
+  void addAdditionalLogs(API::WorkspaceGroup_sptr resultWorkspace);
   void addAdditionalLogs(API::Workspace_sptr result);
 
   virtual bool throwIfElasticQConversionFails() const;
@@ -75,10 +76,14 @@ private:
                             std::vector<std::string> const &spectra,
                             std::string const &outputBaseName,
                             std::string const &endOfSuffix);
-  void copyLogs(API::WorkspaceGroup_sptr resultWorkspace,
-                const std::vector<API::MatrixWorkspace_sptr> &workspaces);
+  void copyLogs(API::WorkspaceGroup_sptr resultWorkspaces,
+                std::vector<API::MatrixWorkspace_sptr> const &workspaces);
+  void copyLogs(API::Workspace_sptr resultWorkspace,
+                std::vector<API::MatrixWorkspace_sptr> const &workspaces);
   void copyLogs(API::MatrixWorkspace_sptr resultWorkspace,
                 API::WorkspaceGroup_sptr resultGroup);
+  void copyLogs(API::MatrixWorkspace_sptr resultWorkspace,
+                API::Workspace_sptr resultGroup);
   void extractMembers(API::WorkspaceGroup_sptr resultGroupWs,
                       const std::vector<API::MatrixWorkspace_sptr> &workspaces,
                       const std::string &outputWsName);
diff --git a/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp b/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp
index 7ae364b380dcbac91d31a2ab8455841b5767c400..a45856b9eb0834ed88c2a76e380dd048b0987b79 100644
--- a/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp
+++ b/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp
@@ -220,9 +220,9 @@ void PlotPeakByLogValue::exec() {
 
   setProperty("OutputWorkspace", result);
 
-  std::vector<std::string> covariance_workspaces;
-  std::vector<std::string> fit_workspaces;
-  std::vector<std::string> parameter_workspaces;
+  std::vector<MatrixWorkspace_sptr> fitWorkspaces;
+  std::vector<ITableWorkspace_sptr> parameterWorkspaces;
+  std::vector<ITableWorkspace_sptr> covarianceWorkspaces;
 
   double dProg = 1. / static_cast<double>(wsNames.size());
   double Prog = 0.;
@@ -250,9 +250,9 @@ void PlotPeakByLogValue::exec() {
     }
 
     if (createFitOutput) {
-      covariance_workspaces.reserve(covariance_workspaces.size() + jend);
-      fit_workspaces.reserve(fit_workspaces.size() + jend);
-      parameter_workspaces.reserve(parameter_workspaces.size() + jend);
+      covarianceWorkspaces.reserve(covarianceWorkspaces.size() + jend);
+      fitWorkspaces.reserve(fitWorkspaces.size() + jend);
+      parameterWorkspaces.reserve(parameterWorkspaces.size() + jend);
     }
 
     dProg /= abs(jend - j);
@@ -305,8 +305,7 @@ void PlotPeakByLogValue::exec() {
         bool ignoreInvalidData = getProperty("IgnoreInvalidData");
 
         // Fit the function
-        API::IAlgorithm_sptr fit =
-            AlgorithmManager::Instance().createUnmanaged("Fit");
+        auto fit = this->createChildAlgorithm("Fit");
         fit->initialize();
         fit->setPropertyValue("EvaluationType",
                               getPropertyValue("EvaluationType"));
@@ -341,15 +340,18 @@ void PlotPeakByLogValue::exec() {
         chi2 = fit->getProperty("OutputChi2overDoF");
 
         if (createFitOutput) {
-          covariance_workspaces.push_back(wsBaseName +
-                                          "_NormalisedCovarianceMatrix");
-          parameter_workspaces.push_back(wsBaseName + "_Parameters");
-          fit_workspaces.push_back(wsBaseName + "_Workspace");
+          MatrixWorkspace_sptr outputFitWorkspace =
+              fit->getProperty("OutputWorkspace");
+          ITableWorkspace_sptr outputParamWorkspace =
+              fit->getProperty("OutputParameters");
+          ITableWorkspace_sptr outputCovarianceWorkspace =
+              fit->getProperty("OutputNormalisedCovarianceMatrix");
+          fitWorkspaces.emplace_back(outputFitWorkspace);
+          parameterWorkspaces.emplace_back(outputParamWorkspace);
+          covarianceWorkspaces.emplace_back(outputCovarianceWorkspace);
         }
-
         g_log.debug() << "Fit result " << fit->getPropertyValue("OutputStatus")
                       << ' ' << chi2 << '\n';
-
       } catch (...) {
         g_log.error("Error in Fit ChildAlgorithm");
         throw;
@@ -378,37 +380,33 @@ void PlotPeakByLogValue::exec() {
           ifun->setParameter(i, initialParams[i]);
         }
       }
-
     } // for(;j < jend;++j)
   }
 
   if (createFitOutput) {
     // collect output of fit for each spectrum into workspace groups
-    API::IAlgorithm_sptr groupAlg =
-        AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces");
-    groupAlg->initialize();
-    groupAlg->setProperty("InputWorkspaces", covariance_workspaces);
-    groupAlg->setProperty("OutputWorkspace",
-                          m_baseName + "_NormalisedCovarianceMatrices");
-    groupAlg->execute();
-
-    groupAlg = AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces");
-    groupAlg->initialize();
-    groupAlg->setProperty("InputWorkspaces", parameter_workspaces);
-    groupAlg->setProperty("OutputWorkspace", m_baseName + "_Parameters");
-    groupAlg->execute();
-
-    groupAlg = AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces");
-    groupAlg->initialize();
-    groupAlg->setProperty("InputWorkspaces", fit_workspaces);
-    groupAlg->setProperty("OutputWorkspace", m_baseName + "_Workspaces");
-    groupAlg->execute();
+    WorkspaceGroup_sptr covarianceGroup = boost::make_shared<WorkspaceGroup>();
+    for (auto const &workspace : covarianceWorkspaces)
+      covarianceGroup->addWorkspace(workspace);
+    AnalysisDataService::Instance().addOrReplace(
+        m_baseName + "_NormalisedCovarianceMatrices", covarianceGroup);
+
+    WorkspaceGroup_sptr parameterGroup = boost::make_shared<WorkspaceGroup>();
+    for (auto const &workspace : parameterWorkspaces)
+      parameterGroup->addWorkspace(workspace);
+    AnalysisDataService::Instance().addOrReplace(m_baseName + "_Parameters",
+                                                 parameterGroup);
+
+    WorkspaceGroup_sptr fitGroup = boost::make_shared<WorkspaceGroup>();
+    for (auto const &workspace : fitWorkspaces)
+      fitGroup->addWorkspace(workspace);
+    AnalysisDataService::Instance().addOrReplace(m_baseName + "_Workspaces",
+                                                 fitGroup);
   }
 
   for (auto &minimizerWorkspace : m_minimizerWorkspaces) {
     const std::string paramName = minimizerWorkspace.first;
-    API::IAlgorithm_sptr groupAlg =
-        AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces");
+    auto groupAlg = this->createChildAlgorithm("GroupWorkspaces");
     groupAlg->initialize();
     groupAlg->setProperty("InputWorkspaces", minimizerWorkspace.second);
     groupAlg->setProperty("OutputWorkspace", m_baseName + "_" + paramName);
diff --git a/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp b/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp
index 73bc15b98fe2be28bf1163bf05b07d5c0f5aa486..90165ffd3af82be1294b61294b1f32e7c5caf0af 100644
--- a/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp
+++ b/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp
@@ -563,6 +563,11 @@ QENSFitSequential::getAdditionalLogNumbers() const {
   return logs;
 }
 
+void QENSFitSequential::addAdditionalLogs(WorkspaceGroup_sptr resultWorkspace) {
+  for (const auto &workspace : *resultWorkspace)
+    addAdditionalLogs(workspace);
+}
+
 void QENSFitSequential::addAdditionalLogs(Workspace_sptr resultWorkspace) {
   auto logAdder = createChildAlgorithm("AddSampleLog", -1.0, -1.0, false);
   logAdder->setProperty("Workspace", resultWorkspace);
@@ -759,12 +764,19 @@ void QENSFitSequential::extractMembers(
 }
 
 void QENSFitSequential::copyLogs(
-    WorkspaceGroup_sptr resultWorkspace,
-    const std::vector<MatrixWorkspace_sptr> &workspaces) {
+    WorkspaceGroup_sptr resultWorkspaces,
+    std::vector<MatrixWorkspace_sptr> const &workspaces) {
+  for (auto const &resultWorkspace : *resultWorkspaces)
+    copyLogs(resultWorkspace, workspaces);
+}
+
+void QENSFitSequential::copyLogs(
+    Workspace_sptr resultWorkspace,
+    std::vector<MatrixWorkspace_sptr> const &workspaces) {
   auto logCopier = createChildAlgorithm("CopyLogs", -1.0, -1.0, false);
   logCopier->setProperty("OutputWorkspace", resultWorkspace->getName());
 
-  for (const auto &workspace : workspaces) {
+  for (auto const &workspace : workspaces) {
     logCopier->setProperty("InputWorkspace", workspace);
     logCopier->executeAsChildAlg();
   }
@@ -772,6 +784,12 @@ void QENSFitSequential::copyLogs(
 
 void QENSFitSequential::copyLogs(MatrixWorkspace_sptr resultWorkspace,
                                  WorkspaceGroup_sptr resultGroup) {
+  for (auto const &workspace : *resultGroup)
+    copyLogs(resultWorkspace, workspace);
+}
+
+void QENSFitSequential::copyLogs(MatrixWorkspace_sptr resultWorkspace,
+                                 Workspace_sptr resultGroup) {
   auto logCopier = createChildAlgorithm("CopyLogs", -1.0, -1.0, false);
   logCopier->setProperty("InputWorkspace", resultWorkspace);
   logCopier->setProperty("OutputWorkspace", resultGroup->getName());
diff --git a/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h b/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h
index 87afe3c32e1d582f8c6708b44aac9880bd6ff9d6..2cf1a3d7415a0b03d087244c67dcba4aa19d3602 100644
--- a/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h
+++ b/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h
@@ -539,34 +539,20 @@ public:
     TS_ASSERT(fits);
 
     if (fits->size() > 0) {
-      // Get the Fit algorithm history
       auto fit = fits->getItem(0);
-      const auto &wsHistory = fit->getHistory();
-      const auto &child = wsHistory.getAlgorithmHistory(0);
-      TS_ASSERT_EQUALS(child->name(), "Fit");
-      const auto &properties = child->getProperties();
-
-      // Check max iterations property
-      PropertyNameIs maxIterationsCheck("MaxIterations");
-      auto prop = std::find_if(properties.begin(), properties.end(),
-                               maxIterationsCheck);
-      TS_ASSERT_EQUALS((*prop)->value(), "50");
-
-      // Check minimizer property
-      PropertyNameIs minimizerCheck("Minimizer");
-      prop = std::find_if(properties.begin(), properties.end(), minimizerCheck);
-      TS_ASSERT_EQUALS((*prop)->value(),
-                       "Levenberg-Marquardt,AbsError=0.01,RelError=1");
+      TS_ASSERT_EQUALS(fit->history().size(), 0);
+      TS_ASSERT_EQUALS(fit->getName(), "PlotPeakResult_Workspaces_1");
     }
 
     AnalysisDataService::Instance().clear();
   }
 
-  void test_histogram_fit() {
+  void test_parameters_are_correct_for_a_histogram_fit() {
     createHistogramWorkspace("InputWS", 10, -10.0, 10.0);
 
     PlotPeakByLogValue alg;
     alg.initialize();
+    alg.setAlwaysStoreInADS(false);
     alg.setProperty("EvaluationType", "Histogram");
     alg.setPropertyValue("Input", "InputWS,v1:3");
     alg.setPropertyValue("OutputWorkspace", "out");
@@ -574,23 +560,10 @@ public:
     alg.setPropertyValue("Function", "name=FlatBackground,A0=2");
     alg.execute();
 
-    {
-      auto params = AnalysisDataService::Instance().retrieveWS<ITableWorkspace>(
-          "InputWS_0_Parameters");
-      TS_ASSERT_DELTA(params->Double(0, 1), 1.0, 1e-15);
-    }
-
-    {
-      auto params = AnalysisDataService::Instance().retrieveWS<ITableWorkspace>(
-          "InputWS_1_Parameters");
-      TS_ASSERT_DELTA(params->Double(0, 1), 1.1, 1e-15);
-    }
-
-    {
-      auto params = AnalysisDataService::Instance().retrieveWS<ITableWorkspace>(
-          "InputWS_2_Parameters");
-      TS_ASSERT_DELTA(params->Double(0, 1), 0.6, 1e-15);
-    }
+    ITableWorkspace_sptr params = alg.getProperty("OutputWorkspace");
+    TS_ASSERT_DELTA(params->Double(0, 1), 1.0, 1e-15);
+    TS_ASSERT_DELTA(params->Double(1, 1), 1.1, 1e-15);
+    TS_ASSERT_DELTA(params->Double(2, 1), 0.6, 1e-15);
 
     AnalysisDataService::Instance().clear();
   }
diff --git a/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py b/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py
index 5bcf829c098f6fcea4ab149d79880410d291dafb..469f00cdfb2892b9fca96552dce51b169dd2f5bd 100644
--- a/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py
+++ b/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py
@@ -26,15 +26,17 @@ class EnergyWindowScanTest(unittest.TestCase):
                          InelasticRange='0, 1.5', GroupingMethod='All')
 
         self.assertEqual(round(mtd['Scan_el_eq1'].readY(0)[0], 7), 0)
-        self.assertEqual(round(mtd['Scan_inel_eq2'].readY(0)[0], 7), -6.8454638)
+        self.assertEqual(
+            round(
+                mtd['Scan_inel_eq2'].readY(0)[0], 7), -6.8454638)
 
     def test_MSDFit(self):
         EnergyWindowScan(InputFiles="IRS26176.RAW", Instrument='IRIS', Analyser='graphite',
                          Reflection='002', SpectraRange='3, 50', ElasticRange='-0.5, 0',
                          InelasticRange='0, 0.5', GroupingMethod='Individual', MSDFit=True)
-        scan_ws = mtd['Scan_el_eq1_Gauss_0_Workspace']
-        self.assertEqual(round(scan_ws.readY(0)[0], 7), 0.0844171)
-        self.assertEqual(round(scan_ws.readY(0)[1], 7), 0.0963181)
+        scan_ws = mtd['Scan_msd_fit']
+        self.assertEqual(round(scan_ws[0].readY(0)[0], 7), 0.0844171)
+        self.assertEqual(round(scan_ws[0].readY(0)[1], 7), 0.0963181)
 
 
 if __name__ == '__main__':
diff --git a/qt/scientific_interfaces/Indirect/ConvFitModel.cpp b/qt/scientific_interfaces/Indirect/ConvFitModel.cpp
index 3cbdc9996f5d07df3e26617d2496580d3af9ce4c..0b73a54635633b0efb74c652aadde16dd3415281 100644
--- a/qt/scientific_interfaces/Indirect/ConvFitModel.cpp
+++ b/qt/scientific_interfaces/Indirect/ConvFitModel.cpp
@@ -19,6 +19,11 @@ using namespace Mantid::API;
 
 namespace {
 
+MatrixWorkspace_sptr getADSMatrixWorkspace(std::string const &workspaceName) {
+  return AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(
+      workspaceName);
+}
+
 boost::optional<std::size_t>
 getFirstInCategory(CompositeFunction_const_sptr composite,
                    const std::string &category) {
@@ -110,13 +115,11 @@ CompositeFunction_sptr addTemperatureCorrection(IFunction_sptr model,
   return applyTemperatureCorrection(model, correction, value);
 }
 
-IAlgorithm_sptr loadParameterFileAlgorithm(MatrixWorkspace_sptr workspace,
-                                           const std::string &filename) {
-  IAlgorithm_sptr loadParamFile =
-      AlgorithmManager::Instance().create("LoadParameterFile");
-  loadParamFile->setChild(true);
+IAlgorithm_sptr loadParameterFileAlgorithm(std::string const &workspaceName,
+                                           std::string const &filename) {
+  auto loadParamFile = AlgorithmManager::Instance().create("LoadParameterFile");
   loadParamFile->initialize();
-  loadParamFile->setProperty("Workspace", workspace);
+  loadParamFile->setProperty("Workspace", workspaceName);
   loadParamFile->setProperty("Filename", filename);
   return loadParamFile;
 }
@@ -130,8 +133,8 @@ void readAnalyserFromFile(const std::string &analyser,
   auto const parameterFile = idfDirectory + instrument->getName() + "_" +
                              analyser + "_" + reflection + "_Parameters.xml";
 
-  IAlgorithm_sptr loadParamFile =
-      loadParameterFileAlgorithm(workspace, parameterFile);
+  auto loadParamFile =
+      loadParameterFileAlgorithm(workspace->getName(), parameterFile);
   loadParamFile->execute();
 
   if (!loadParamFile->isExecuted())
@@ -170,37 +173,50 @@ boost::optional<double> instrumentResolution(MatrixWorkspace_sptr workspace) {
   }
 }
 
-MatrixWorkspace_sptr cloneWorkspace(MatrixWorkspace_sptr inputWS) {
-  IAlgorithm_sptr cloneAlg =
-      AlgorithmManager::Instance().create("CloneWorkspace");
+MatrixWorkspace_sptr cloneWorkspace(MatrixWorkspace_sptr inputWS,
+                                    std::string const &outputName) {
+  auto cloneAlg = AlgorithmManager::Instance().create("CloneWorkspace");
   cloneAlg->setLogging(false);
-  cloneAlg->setChild(true);
   cloneAlg->initialize();
   cloneAlg->setProperty("InputWorkspace", inputWS);
-  cloneAlg->setProperty("OutputWorkspace", "__cloned");
+  cloneAlg->setProperty("OutputWorkspace", outputName);
   cloneAlg->execute();
-  Workspace_sptr workspace = cloneAlg->getProperty("OutputWorkspace");
-  return boost::dynamic_pointer_cast<MatrixWorkspace>(workspace);
+  return getADSMatrixWorkspace(outputName);
 }
 
 MatrixWorkspace_sptr appendWorkspace(MatrixWorkspace_sptr leftWS,
                                      MatrixWorkspace_sptr rightWS,
-                                     int numHistograms) {
-  IAlgorithm_sptr appendAlg =
-      AlgorithmManager::Instance().create("AppendSpectra");
+                                     int numHistograms,
+                                     std::string const &outputName) {
+  auto appendAlg = AlgorithmManager::Instance().create("AppendSpectra");
   appendAlg->setLogging(false);
-  appendAlg->setChild(true);
   appendAlg->initialize();
   appendAlg->setProperty("InputWorkspace1", leftWS);
   appendAlg->setProperty("InputWorkspace2", rightWS);
   appendAlg->setProperty("Number", numHistograms);
-  appendAlg->setProperty("OutputWorkspace", "__appended");
+  appendAlg->setProperty("OutputWorkspace", outputName);
   appendAlg->execute();
-  return appendAlg->getProperty("OutputWorkspace");
+  return getADSMatrixWorkspace(outputName);
+}
+
+void renameWorkspace(std::string const &name, std::string const &newName) {
+  auto renamer = AlgorithmManager::Instance().create("RenameWorkspace");
+  renamer->setLogging(false);
+  renamer->setProperty("InputWorkspace", name);
+  renamer->setProperty("OutputWorkspace", newName);
+  renamer->execute();
 }
 
-MatrixWorkspace_sptr extendResolutionWorkspace(MatrixWorkspace_sptr resolution,
-                                               std::size_t numberOfHistograms) {
+void deleteWorkspace(std::string const &workspaceName) {
+  auto deleter = AlgorithmManager::Instance().create("DeleteWorkspace");
+  deleter->setLogging(false);
+  deleter->setProperty("Workspace", workspaceName);
+  deleter->execute();
+}
+
+void extendResolutionWorkspace(MatrixWorkspace_sptr resolution,
+                               std::size_t numberOfHistograms,
+                               std::string const &outputName) {
   const auto resolutionNumHist = resolution->getNumberHistograms();
   if (resolutionNumHist != 1 && resolutionNumHist != numberOfHistograms) {
     std::string msg(
@@ -208,13 +224,15 @@ MatrixWorkspace_sptr extendResolutionWorkspace(MatrixWorkspace_sptr resolution,
     throw std::runtime_error(msg);
   }
 
-  auto resolutionWS = cloneWorkspace(resolution);
+  auto resolutionWS = cloneWorkspace(resolution, "__cloned");
 
   // Append to cloned workspace if necessary
-  if (resolutionNumHist == 1 && numberOfHistograms > 1)
-    return appendWorkspace(resolutionWS, resolution,
-                           static_cast<int>(numberOfHistograms - 1));
-  return resolutionWS;
+  if (resolutionNumHist == 1 && numberOfHistograms > 1) {
+    appendWorkspace(resolutionWS, resolution,
+                    static_cast<int>(numberOfHistograms - 1), outputName);
+    deleteWorkspace("__cloned");
+  } else
+    renameWorkspace("__cloned", outputName);
 }
 
 void getParameterNameChanges(
@@ -535,8 +553,7 @@ void ConvFitModel::removeWorkspace(std::size_t index) {
 }
 
 void ConvFitModel::setResolution(const std::string &name, std::size_t index) {
-  setResolution(
-      AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(name), index);
+  setResolution(getADSMatrixWorkspace(name), index);
 }
 
 void ConvFitModel::setResolution(MatrixWorkspace_sptr resolution,
@@ -555,9 +572,9 @@ void ConvFitModel::setResolution(MatrixWorkspace_sptr resolution,
 
 void ConvFitModel::addExtendedResolution(std::size_t index) {
   const std::string name = "__ConvFitResolution" + std::to_string(index);
-  AnalysisDataService::Instance().addOrReplace(
-      name, extendResolutionWorkspace(m_resolution[index].lock(),
-                                      getNumberHistograms(index)));
+
+  extendResolutionWorkspace(m_resolution[index].lock(),
+                            getNumberHistograms(index), name);
 
   if (m_extendedResolution.size() > index)
     m_extendedResolution[index] = name;
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp
index e5e1909e15c11d95d7718017c7783399d9ef9ce0..b951e21d383883748b16ec59805aa6fda0301adf 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp
@@ -6,6 +6,7 @@
 // SPDX - License - Identifier: GPL - 3.0 +
 #include "IndirectFitOutput.h"
 
+#include "MantidAPI/AlgorithmManager.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidAPI/TableRow.h"
 #include "MantidAPI/TextAxis.h"
@@ -135,17 +136,23 @@ std::vector<std::string> getAxisLabels(MatrixWorkspace_sptr workspace,
   return std::vector<std::string>();
 }
 
+void renameWorkspace(std::string const &name, std::string const &newName) {
+  auto renamer = AlgorithmManager::Instance().create("RenameWorkspace");
+  renamer->setProperty("InputWorkspace", name);
+  renamer->setProperty("OutputWorkspace", newName);
+  renamer->execute();
+}
+
 void renameResult(Workspace_sptr resultWorkspace,
                   const std::string &workspaceName) {
-  AnalysisDataService::Instance().rename(resultWorkspace->getName(),
-                                         workspaceName + "_Result");
+  renameWorkspace(resultWorkspace->getName(), workspaceName + "_Result");
 }
 
 void renameResult(Workspace_sptr resultWorkspace,
                   IndirectFitData const *fitData) {
   const auto name = resultWorkspace->getName();
   const auto newName = fitData->displayName("%1%_s%2%_Result", "_to_");
-  AnalysisDataService::Instance().rename(name, newName);
+  renameWorkspace(name, newName);
 }
 
 void renameResultWithoutSpectra(WorkspaceGroup_sptr resultWorkspace,
diff --git a/qt/scientific_interfaces/Indirect/JumpFitModel.cpp b/qt/scientific_interfaces/Indirect/JumpFitModel.cpp
index 22e3cba12161f4b333db7d437af880cfc0c41c7a..d55b93d8cd6d00b7db3044f9efd3483490f58a31 100644
--- a/qt/scientific_interfaces/Indirect/JumpFitModel.cpp
+++ b/qt/scientific_interfaces/Indirect/JumpFitModel.cpp
@@ -80,89 +80,101 @@ JumpFitParameters createJumpFitParameters(MatrixWorkspace *workspace) {
   return parameters;
 }
 
-MatrixWorkspace_sptr scaleWorkspace(MatrixWorkspace_sptr workspace,
-                                    double factor) {
+void deleteTemporaryWorkspaces(std::vector<std::string> const &workspaceNames) {
+  auto deleter = AlgorithmManager::Instance().create("DeleteWorkspace");
+  deleter->setLogging(false);
+  for (auto const &name : workspaceNames) {
+    deleter->setProperty("Workspace", name);
+    deleter->execute();
+  }
+}
+
+std::string scaleWorkspace(std::string const &inputName,
+                           std::string const &outputName, double factor) {
   auto scaleAlg = AlgorithmManager::Instance().create("Scale");
   scaleAlg->initialize();
   scaleAlg->setLogging(false);
-  scaleAlg->setChild(true);
-  scaleAlg->setProperty("InputWorkspace", workspace);
-  scaleAlg->setProperty("OutputWorkspace", "__scaled");
+  scaleAlg->setProperty("InputWorkspace", inputName);
+  scaleAlg->setProperty("OutputWorkspace", outputName);
   scaleAlg->setProperty("Factor", factor);
   scaleAlg->execute();
-  return scaleAlg->getProperty("OutputWorkspace");
+  return outputName;
 }
 
-MatrixWorkspace_sptr extractSpectra(MatrixWorkspace_sptr workspace,
-                                    int startIndex, int endIndex) {
+std::string extractSpectra(std::string const &inputName, int startIndex,
+                           int endIndex, std::string const &outputName) {
   auto extractAlg = AlgorithmManager::Instance().create("ExtractSpectra");
   extractAlg->initialize();
-  extractAlg->setChild(true);
   extractAlg->setLogging(false);
-  extractAlg->setProperty("InputWorkspace", workspace);
+  extractAlg->setProperty("InputWorkspace", inputName);
   extractAlg->setProperty("StartWorkspaceIndex", startIndex);
   extractAlg->setProperty("EndWorkspaceIndex", endIndex);
-  extractAlg->setProperty("OutputWorkspace", "__extracted");
+  extractAlg->setProperty("OutputWorkspace", outputName);
   extractAlg->execute();
-  return extractAlg->getProperty("OutputWorkspace");
+  return outputName;
 }
 
-MatrixWorkspace_sptr extractSpectrum(MatrixWorkspace_sptr workspace,
-                                     int index) {
-  return extractSpectra(workspace, index, index);
+std::string extractSpectrum(MatrixWorkspace_sptr workspace, int index,
+                            std::string const &outputName) {
+  return extractSpectra(workspace->getName(), index, index, outputName);
 }
 
-MatrixWorkspace_sptr extractHWHMSpectrum(MatrixWorkspace_sptr workspace,
-                                         int index) {
-  return scaleWorkspace(extractSpectrum(workspace, index), 0.5);
+std::string extractHWHMSpectrum(MatrixWorkspace_sptr workspace, int index) {
+  auto const scaledName = "__scaled_" + std::to_string(index);
+  auto const extractedName = "__extracted_" + std::to_string(index);
+  auto const outputName = scaleWorkspace(
+      extractSpectrum(workspace, index, extractedName), scaledName, 0.5);
+  deleteTemporaryWorkspaces({extractedName});
+  return outputName;
 }
 
-MatrixWorkspace_sptr appendWorkspace(MatrixWorkspace_sptr lhs,
-                                     MatrixWorkspace_sptr rhs) {
+std::string appendWorkspace(std::string const &lhsName,
+                            std::string const &rhsName,
+                            std::string const &outputName) {
   auto appendAlg = AlgorithmManager::Instance().create("AppendSpectra");
   appendAlg->initialize();
-  appendAlg->setChild(true);
   appendAlg->setLogging(false);
-  appendAlg->setProperty("InputWorkspace1", lhs);
-  appendAlg->setProperty("InputWorkspace2", rhs);
-  appendAlg->setProperty("OutputWorkspace", "__appended");
+  appendAlg->setProperty("InputWorkspace1", lhsName);
+  appendAlg->setProperty("InputWorkspace2", rhsName);
+  appendAlg->setProperty("OutputWorkspace", outputName);
   appendAlg->execute();
-  return appendAlg->getProperty("OutputWorkspace");
+  return outputName;
 }
 
-MatrixWorkspace_sptr
-appendAll(const std::vector<MatrixWorkspace_sptr> &workspaces) {
-  auto appended = workspaces.front();
+MatrixWorkspace_sptr appendAll(std::vector<std::string> const &workspaces,
+                               std::string const &outputName) {
+  auto appended = workspaces[0];
   for (auto i = 1u; i < workspaces.size(); ++i)
-    appended = appendWorkspace(appended, workspaces[i]);
-  return appended;
-}
-
-MatrixWorkspace_sptr addToADS(MatrixWorkspace_sptr workspace,
-                              const std::string &name) {
-  AnalysisDataService::Instance().addOrReplace(name, workspace);
-  return workspace;
+    appended = appendWorkspace(appended, workspaces[i], outputName);
+  return AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(appended);
 }
 
-std::vector<MatrixWorkspace_sptr>
+std::vector<std::string>
 subdivideWidthWorkspace(MatrixWorkspace_sptr workspace,
                         const std::vector<std::size_t> &widthSpectra) {
-  std::vector<MatrixWorkspace_sptr> subworkspaces;
+  std::vector<std::string> subworkspaces;
   subworkspaces.reserve(1 + 2 * widthSpectra.size());
 
   int start = 0;
   for (auto i = 0u; i < widthSpectra.size(); ++i) {
     const auto spectrum = static_cast<int>(widthSpectra[i]);
-    if (spectrum > start)
-      subworkspaces.emplace_back(
-          extractSpectra(workspace, start, spectrum - 1));
+    if (spectrum > start) {
+      auto const outputName = "__extracted_" + std::to_string(start) + "_to_" +
+                              std::to_string(spectrum);
+      subworkspaces.emplace_back(extractSpectra(workspace->getName(), start,
+                                                spectrum - 1, outputName));
+    }
     subworkspaces.emplace_back(extractHWHMSpectrum(workspace, spectrum));
     start = spectrum + 1;
   }
 
   const int end = static_cast<int>(workspace->getNumberHistograms());
-  if (start < end)
-    subworkspaces.emplace_back(extractSpectra(workspace, start, end - 1));
+  if (start < end) {
+    auto const outputName =
+        "__extracted_" + std::to_string(start) + "_to_" + std::to_string(end);
+    subworkspaces.emplace_back(
+        extractSpectra(workspace->getName(), start, end - 1, outputName));
+  }
   return subworkspaces;
 }
 
@@ -176,10 +188,13 @@ createHWHMWorkspace(MatrixWorkspace_sptr workspace, const std::string &hwhmName,
         hwhmName);
 
   const auto subworkspaces = subdivideWidthWorkspace(workspace, widthSpectra);
-  const auto hwhmWorkspace = appendAll(subworkspaces);
+  const auto hwhmWorkspace = appendAll(subworkspaces, hwhmName);
   const auto axis = workspace->getAxis(1)->clone(hwhmWorkspace.get());
   hwhmWorkspace->replaceAxis(1, dynamic_cast<TextAxis *>(axis));
-  return addToADS(hwhmWorkspace, hwhmName);
+
+  deleteTemporaryWorkspaces(subworkspaces);
+
+  return hwhmWorkspace;
 }
 
 boost::optional<std::size_t>