diff --git a/README/ReleaseNotes/v628/index.md b/README/ReleaseNotes/v628/index.md
index 09fb81cd98eb43748e37653643794a6d01134c7b..c6530d28c83a96de5719589de044695ff2bef1f3 100644
--- a/README/ReleaseNotes/v628/index.md
+++ b/README/ReleaseNotes/v628/index.md
@@ -43,6 +43,8 @@ Please use their non-experimental counterparts `ROOT::TBufferMerger` and `ROOT::
 - `ROOT::RVec::emplace()` has now been removed after deprecation; please use `ROOT::RVec::insert()` instead.
 - The deprecated function `ROOT::Detail::RDF::RActionImpl<Helper>::GetDataBlockCallback()` is removed; please use `GetSampleCallback()` instead.
 - The deprecated RooFit containers `RooHashTable`, `RooNameSet`, `RooSetPair`, and `RooList` are removed. Please use STL container classes instead, like `std::unordered_map`, `std::set`, and `std::vector`.
+- The `RooFit::FitOptions(const char*)` command to steer [RooAbsPdf::fitTo()](https://root.cern.ch/doc/v628/classRooAbsPdf.html) with an option string was removed. This way of configuring the fit was deprecated since at least since ROOT 5.02.
+  Subsequently, the `RooMinimizer::fit(const char*)` function and the [RooMCStudy](https://root.cern.ch/doc/v628/classRooMCStudy.html) constructor that takes an option string was removed as well.
 
 ## Core Libraries
 
diff --git a/roofit/roofitcore/inc/RooAbsMCStudyModule.h b/roofit/roofitcore/inc/RooAbsMCStudyModule.h
index 665a760b980fe9e8c504f62263739ebf023de675..259b2b5c2bb50b5ff56f358d1b796aeb33804f13 100644
--- a/roofit/roofitcore/inc/RooAbsMCStudyModule.h
+++ b/roofit/roofitcore/inc/RooAbsMCStudyModule.h
@@ -150,11 +150,6 @@ protected:
 
    // Accessors for fit options, generator and MCstudy configuration flags
 
-   /// Return fit option string provided user
-   const char* fitOptions() {
-     return _mcs ? _mcs->_fitOptions.Data() : 0 ;
-   }
-
    /// Return list of fit options provided by user
    RooLinkedList* fitOptList() {
      return _mcs ? &_mcs->_fitOptList : 0 ;
diff --git a/roofit/roofitcore/inc/RooAbsPdf.h b/roofit/roofitcore/inc/RooAbsPdf.h
index f38146be68c5fb1ab084e6bf7b8c2dbf159c63af..4c134c2bd39708df587f36c856949abb08ee3606 100644
--- a/roofit/roofitcore/inc/RooAbsPdf.h
+++ b/roofit/roofitcore/inc/RooAbsPdf.h
@@ -165,7 +165,6 @@ public:
   //RooAbsPdf::fitTo.
   struct MinimizerConfig {
       double recoverFromNaN = 10.;
-      std::string fitOpt = "";
       int optConst = 2;
       int verbose = 0;
       int doSave = 0;
diff --git a/roofit/roofitcore/inc/RooGlobalFunc.h b/roofit/roofitcore/inc/RooGlobalFunc.h
index 09caa3e8f771f5aab1dd773d26516541df5ccade..b16dfc99c105aea4dc389c9bd2a7befc488dce06 100644
--- a/roofit/roofitcore/inc/RooGlobalFunc.h
+++ b/roofit/roofitcore/inc/RooGlobalFunc.h
@@ -47,12 +47,6 @@ class RooAbsCollection ;
 class TH1 ;
 class TTree ;
 
-namespace RooFitLegacy {
-
-RooCmdArg FitOptions(const char* opts);
-
-}
-
 /*! \namespace RooFit
 The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs
 (or other types of arguments).
@@ -228,10 +222,6 @@ RooCmdArg IntegrateBins(double precision);
 
 // RooAbsPdf::fitTo arguments
 RooCmdArg PrefitDataFraction(Double_t data_ratio = 0.0) ;
-RooCmdArg FitOptions(const char* opts)
-  R__DEPRECATED(6,28,"Please migrate to the RooCmdArg-based fit configuration"
-                     " (or use RooFitLegacy::FitOptions(const char*) to silence this warning,"
-                     " but be warned that the RooFitLegacy function also gets removed in ROOT v6.28).") ;
 RooCmdArg Optimize(Int_t flag=2) ;
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/roofit/roofitcore/inc/RooMCStudy.h b/roofit/roofitcore/inc/RooMCStudy.h
index 615ff8ffc9ca0471e3db8efd8c8bbb3b836efffe..bbff68c0cb41a0d8033a6c4c351b808c93864587 100644
--- a/roofit/roofitcore/inc/RooMCStudy.h
+++ b/roofit/roofitcore/inc/RooMCStudy.h
@@ -37,12 +37,6 @@ public:
              const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
              const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
 
-  RooMCStudy(const RooAbsPdf& genModel, const RooAbsPdf& fitModel,
-        const RooArgSet& dependents, const char* genOptions="",
-        const char* fitOptions="", const RooDataSet* genProtoData=0,
-        const RooArgSet& projDeps=RooArgSet()) R__DEPRECATED(6,28,
-  "please migrate to the other RooMCStudy constructor that doesn't use the deprecated string-based fit options.");
-
   ~RooMCStudy() override ;
 
   // Method to add study modules
@@ -133,7 +127,6 @@ protected:
   TList       _fitResList ;     // List of RooFitResult fit output objects
   RooDataSet* _genParData ;     // List of of generated parameters of each sample
   RooDataSet* _fitParData ;     // Data set of fit parameters of each sample
-  TString     _fitOptions ;     // Fit options string
   RooLinkedList _fitOptList ;   // Fit option command list
   Bool_t      _extendedGen ;    // Add poisson term to number of events to generate?
   Bool_t      _binGenData ;     // Bin data between generating and fitting
diff --git a/roofit/roofitcore/inc/RooMinimizer.h b/roofit/roofitcore/inc/RooMinimizer.h
index 3361f76128b3ed2685f6ce125f76936acbd2e720..f36f20bd6608586d37e1acfa71633abdfd045b17 100644
--- a/roofit/roofitcore/inc/RooMinimizer.h
+++ b/roofit/roofitcore/inc/RooMinimizer.h
@@ -74,9 +74,6 @@ public:
   void setMaxIterations(Int_t n) ;
   void setMaxFunctionCalls(Int_t n) ;
 
-  RooFitResult* fit(const char* options) R__DEPRECATED(6,28,
-  "using RooMinimizer::fit() with string-based options is deprecated. Please use RooAbsPdf::fitTo() instead.");
-
   Int_t migrad() ;
   Int_t hesse() ;
   Int_t minos() ;
diff --git a/roofit/roofitcore/src/RooAbsPdf.cxx b/roofit/roofitcore/src/RooAbsPdf.cxx
index 8d179018d1fdd77317ec5d143a627492b12f9cbf..c292089041a34e096d3963af5a68a1c6c9fd907c 100644
--- a/roofit/roofitcore/src/RooAbsPdf.cxx
+++ b/roofit/roofitcore/src/RooAbsPdf.cxx
@@ -1495,8 +1495,6 @@ int RooAbsPdf::calcSumW2CorrectedCovariance(RooMinimizer &minimizer, RooAbsReal
 ///                                                  this happens, try switching it off.
 /// <tr><td> `RecoverFromUndefinedRegions(double strength)` <td> When PDF is invalid (e.g. parameter in undefined region), try to direct minimiser away from that region.
 ///                                                              `strength` controls the magnitude of the penalty term. Leaving out this argument defaults to 10. Switch off with `strength = 0.`.
-/// <tr><td> `FitOptions(const char* optStr)`  <td>  \deprecated Steer fit with classic options string (for backward compatibility).
-///                                                \attention Use of this option excludes use of any of the new style steering options.
 ///
 /// <tr><td> `SumW2Error(Bool_t flag)`         <td>  Apply correction to errors and covariance matrix.
 ///       This uses two covariance matrices, one with the weights, the other with squared weights,
@@ -1607,35 +1605,6 @@ std::unique_ptr<RooFitResult> RooAbsPdf::minimizeNLL(RooAbsReal & nll,
   m.setPrintEvalErrors(cfg.numee);
   if (cfg.printLevel!=1) m.setPrintLevel(cfg.printLevel);
   if (cfg.optConst) m.optimizeConst(cfg.optConst); // Activate constant term optimization
-
-  if (!cfg.fitOpt.empty()) {
-
-    // Play fit options as historically defined
-    // (code copied from RooMinimizer::fit() instead of calling said function to avoid deprecation warning)
-    TString opts(cfg.fitOpt) ;
-    opts.ToLower() ;
-
-    // Initial configuration
-    if (opts.Contains("v")) m.setVerbose(1) ;
-    if (opts.Contains("t")) m.setProfile(1) ;
-    if (opts.Contains("l")) m.setLogFile(Form("%s.log",nll.GetName())) ;
-    if (opts.Contains("c")) m.optimizeConst(1) ;
-
-    // Fitting steps
-    if (opts.Contains("0")) m.setStrategy(0) ;
-    m.migrad() ;
-    if (opts.Contains("0")) m.setStrategy(1) ;
-    if (opts.Contains("h")||!opts.Contains("m")) m.hesse() ;
-    if (!opts.Contains("m")) m.minos() ;
-
-    auto ret = (opts.Contains("r")) ? m.save() : 0 ;
-
-    if (cfg.optConst) m.optimizeConst(0) ;
-
-    return std::unique_ptr<RooFitResult>(ret);
-
-  }
-
   if (cfg.verbose) m.setVerbose(1); // Activate verbose options
   if (cfg.doTimer) m.setProfile(1); // Activate timer options
   if (cfg.strat!=1) m.setStrategy(cfg.strat); // Modify fit strategy
@@ -1693,7 +1662,6 @@ RooFitResult* RooAbsPdf::fitTo(RooAbsData& data, const RooLinkedList& cmdList)
 
   pc.defineDouble("prefit", "Prefit",0,0);
   pc.defineDouble("RecoverFromUndefinedRegions", "RecoverFromUndefinedRegions",0,minimizerDefaults.recoverFromNaN);
-  pc.defineString("fitOpt","FitOptions",0,minimizerDefaults.fitOpt.c_str()) ;
   pc.defineInt("optConst","Optimize",0,minimizerDefaults.optConst) ;
   pc.defineInt("verbose","Verbose",0,minimizerDefaults.verbose) ;
   pc.defineInt("doSave","Save",0,minimizerDefaults.doSave) ;
@@ -1712,13 +1680,6 @@ RooFitResult* RooAbsPdf::fitTo(RooAbsData& data, const RooLinkedList& cmdList)
   pc.defineString("mintype","Minimizer",0,minimizerDefaults.minType.c_str()) ;
   pc.defineString("minalg","Minimizer",1,minimizerDefaults.minAlg.c_str()) ;
   pc.defineObject("minosSet","Minos",0,minimizerDefaults.minosSet) ;
-  pc.defineMutex("FitOptions","Verbose") ;
-  pc.defineMutex("FitOptions","Save") ;
-  pc.defineMutex("FitOptions","Timer") ;
-  pc.defineMutex("FitOptions","Strategy") ;
-  pc.defineMutex("FitOptions","InitialHesse") ;
-  pc.defineMutex("FitOptions","Hesse") ;
-  pc.defineMutex("FitOptions","Minos") ;
   pc.defineMutex("Range","RangeWithName") ;
   pc.defineMutex("InitialHesse","Minimizer") ;
 
@@ -1784,7 +1745,6 @@ RooFitResult* RooAbsPdf::fitTo(RooAbsData& data, const RooLinkedList& cmdList)
 
   MinimizerConfig cfg;
   cfg.recoverFromNaN = pc.getDouble("RecoverFromUndefinedRegions");
-  cfg.fitOpt = pc.getString("fitOpt",0,true) ? pc.getString("fitOpt",0,true) : "";
   cfg.optConst = optConst;
   cfg.verbose = pc.getInt("verbose");
   cfg.doSave = pc.getInt("doSave");
diff --git a/roofit/roofitcore/src/RooAbsReal.cxx b/roofit/roofitcore/src/RooAbsReal.cxx
index 5cf4d6285ca871cf836c13719c114b817156ee36..f97ff9d272d7b64c36c787c72daa6d1b561d8f84 100644
--- a/roofit/roofitcore/src/RooAbsReal.cxx
+++ b/roofit/roofitcore/src/RooAbsReal.cxx
@@ -4377,8 +4377,6 @@ RooMultiGenFunction* RooAbsReal::iGenFunction(const RooArgSet& observables, cons
 /// <tr><td> `Minos(const RooArgSet& set)`    <td> Only run MINOS on given subset of arguments
 /// <tr><td> `Save(Bool_t flag)`              <td> Flac controls if RooFitResult object is produced and returned, off by default
 /// <tr><td> `Strategy(Int_t flag)`           <td> Set Minuit strategy (0 through 2, default is 1)
-/// <tr><td> `FitOptions(const char* optStr)` <td> Steer fit with classic options string (for backward compatibility). Use of this option
-///                                              excludes use of any of the new style steering options.
 ///
 /// <tr><th> <th> Options to control informational output
 /// <tr><td> `Verbose(Bool_t flag)`           <td> Flag controls if verbose output is printed (NLL, parameter changes during fit
@@ -4503,8 +4501,6 @@ RooAbsReal* RooAbsReal::createChi2(RooDataHist& data, const RooLinkedList& cmdLi
 /// <tr><td> `Minos(const RooArgSet& set)`    <td>  Only run MINOS on given subset of arguments
 /// <tr><td> `Save(Bool_t flag)`              <td>  Flac controls if RooFitResult object is produced and returned, off by default
 /// <tr><td> `Strategy(Int_t flag)`           <td>  Set Minuit strategy (0 through 2, default is 1)
-/// <tr><td> `FitOptions(const char* optStr)` <td>  Steer fit with classic options string (for backward compatibility). Use of this option
-///                                   excludes use of any of the new style steering options.
 ///
 /// <tr><th><th> Options to control informational output
 /// <tr><td> `Verbose(Bool_t flag)`           <td>  Flag controls if verbose output is printed (NLL, parameter changes during fit
@@ -4626,8 +4622,6 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList)
   // Select the pdf-specific commands
   RooCmdConfig pc(Form("RooAbsPdf::chi2FitDriver(%s)",GetName())) ;
 
-  pc.defineString("fitOpt","FitOptions",0,"") ;
-
   pc.defineInt("optConst","Optimize",0,1) ;
   pc.defineInt("verbose","Verbose",0,0) ;
   pc.defineInt("doSave","Save",0,0) ;
@@ -4644,14 +4638,6 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList)
   pc.defineString("minalg","Minimizer",1,"minuit") ;
   pc.defineObject("minosSet","Minos",0,0) ;
 
-  pc.defineMutex("FitOptions","Verbose") ;
-  pc.defineMutex("FitOptions","Save") ;
-  pc.defineMutex("FitOptions","Timer") ;
-  pc.defineMutex("FitOptions","Strategy") ;
-  pc.defineMutex("FitOptions","InitialHesse") ;
-  pc.defineMutex("FitOptions","Hesse") ;
-  pc.defineMutex("FitOptions","Minos") ;
-
   // Process and check varargs
   pc.process(cmdList) ;
   if (!pc.ok(kTRUE)) {
@@ -4659,7 +4645,6 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList)
   }
 
   // Decode command line arguments
-  const char* fitOpt = pc.getString("fitOpt",0,kTRUE) ;
   const char* minType = pc.getString("mintype","Minuit") ;
   const char* minAlg = pc.getString("minalg","minuit") ;
   Int_t optConst = pc.getInt("optConst") ;
@@ -4695,72 +4680,47 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList)
     m.optimizeConst(optConst);
   }
 
-  if (fitOpt) {
-
-    // Play fit options as historically defined
-    // (code copied from RooMinimizer::fit() instead of calling said function to avoid deprecation warning)
-    TString opts(fitOpt) ;
-    opts.ToLower() ;
-
-    // Initial configuration
-    if (opts.Contains("v")) m.setVerbose(1) ;
-    if (opts.Contains("t")) m.setProfile(1) ;
-    if (opts.Contains("l")) m.setLogFile(Form("%s.log",fcn.GetName())) ;
-    if (opts.Contains("c")) m.optimizeConst(1) ;
-
-    // Fitting steps
-    if (opts.Contains("0")) m.setStrategy(0) ;
-    m.migrad() ;
-    if (opts.Contains("0")) m.setStrategy(1) ;
-    if (opts.Contains("h")||!opts.Contains("m")) m.hesse() ;
-    if (!opts.Contains("m")) m.minos() ;
-
-    ret = (opts.Contains("r")) ? m.save() : 0 ;
-
-  } else {
-
-    if (verbose) {
-      // Activate verbose options
-      m.setVerbose(1) ;
-    }
-    if (doTimer) {
-      // Activate timer options
-      m.setProfile(1) ;
-    }
+  if (verbose) {
+    // Activate verbose options
+    m.setVerbose(1) ;
+  }
+  if (doTimer) {
+    // Activate timer options
+    m.setProfile(1) ;
+  }
 
-    if (strat!=1) {
-      // Modify fit strategy
-      m.setStrategy(strat) ;
-    }
+  if (strat!=1) {
+    // Modify fit strategy
+    m.setStrategy(strat) ;
+  }
 
-    if (initHesse) {
-      // Initialize errors with hesse
-      m.hesse() ;
-    }
+  if (initHesse) {
+    // Initialize errors with hesse
+    m.hesse() ;
+  }
 
-    // Minimize using migrad
-    m.minimize(minType, minAlg) ;
+  // Minimize using migrad
+  m.minimize(minType, minAlg) ;
 
-    if (hesse) {
-      // Evaluate errors with Hesse
-      m.hesse() ;
-    }
+  if (hesse) {
+    // Evaluate errors with Hesse
+    m.hesse() ;
+  }
 
-    if (minos) {
-      // Evaluate errs with Minos
-      if (minosSet) {
-        m.minos(*minosSet) ;
-      } else {
-        m.minos() ;
-      }
+  if (minos) {
+    // Evaluate errs with Minos
+    if (minosSet) {
+      m.minos(*minosSet) ;
+    } else {
+      m.minos() ;
     }
+  }
 
-    // Optionally return fit result
-    if (doSave) {
-      string name = Form("fitresult_%s",fcn.GetName()) ;
-      string title = Form("Result of fit of %s ",GetName()) ;
-      ret = m.save(name.c_str(),title.c_str()) ;
-    }
+  // Optionally return fit result
+  if (doSave) {
+    string name = Form("fitresult_%s",fcn.GetName()) ;
+    string title = Form("Result of fit of %s ",GetName()) ;
+    ret = m.save(name.c_str(),title.c_str()) ;
   }
 
   // Cleanup
diff --git a/roofit/roofitcore/src/RooGlobalFunc.cxx b/roofit/roofitcore/src/RooGlobalFunc.cxx
index 263c9404f66f454de557e8752ba0b611a9967279..0f0582b7a75862af4e4fbe3c955ad584c6f79cde 100644
--- a/roofit/roofitcore/src/RooGlobalFunc.cxx
+++ b/roofit/roofitcore/src/RooGlobalFunc.cxx
@@ -217,22 +217,6 @@ namespace RooFit {
 
   // RooAbsPdf::fitTo arguments
   RooCmdArg PrefitDataFraction(Double_t data_ratio)  { return RooCmdArg("Prefit",0,0,data_ratio,0,nullptr,nullptr,nullptr,nullptr) ; }
-  RooCmdArg FitOptions(const char* opts) {
-    oocoutW(static_cast<TObject*>(nullptr), Fitting)
-      << "RooFit::FitOptions(const char* opts) will be removed in ROOT v628!\n"
-      << "Please migrate to the RooCmdArg-based fit configuration.\n"
-      << "The former character flags map to RooFit command arguments as follows:\n"
-      << "    'h' : RooFit::Hesse()\n"
-      << "    'm' : RooFit::Minos()\n"
-      << "    'o' : RooFit::Optimize(1)\n"
-      << "    'r' : RooFit::Save()\n"
-      << "    't' : RooFit::Timer()\n"
-      << "    'v' : RooFit::Verbose()\n"
-      << "    '0' : RooFit::Strategy(0)\n"
-      << "You can alternatively silence this warning by using RooFitLegacy::FitOptions(const char*),\n"
-      << "but this will get removed in ROOT v6.28 as well.\n";
-    return RooFitLegacy::FitOptions(opts);
-  }
   RooCmdArg Optimize(Int_t flag)         { return RooCmdArg("Optimize",flag,0,0,0,0,0,0,0) ; }
   RooCmdArg Verbose(Bool_t flag)         { return RooCmdArg("Verbose",flag,0,0,0,0,0,0,0) ; }
   RooCmdArg Save(Bool_t flag)            { return RooCmdArg("Save",flag,0,0,0,0,0,0,0) ; }
@@ -408,10 +392,6 @@ namespace RooFit {
 
 } // End namespace RooFit
 
-namespace RooFitLegacy {
-  RooCmdArg FitOptions(const char* opts) { return RooCmdArg("FitOptions",0,0,0,0,opts,0,0,0) ; }
-}
-
 namespace RooFitShortHand {
 
 RooConstVar& C(Double_t value) { return RooFit::RooConst(value) ; }
diff --git a/roofit/roofitcore/src/RooMCStudy.cxx b/roofit/roofitcore/src/RooMCStudy.cxx
index 1811f87fa353df7d8d9e4e47c79f35aa97658d50..0a9c28d710419b179091ce7678dbff1424bd167e 100644
--- a/roofit/roofitcore/src/RooMCStudy.cxx
+++ b/roofit/roofitcore/src/RooMCStudy.cxx
@@ -97,7 +97,6 @@ fitting the PDF to data and accumulating the fit statistics.
 <tr><td> FitModel(const RooAbsPdf&)        <td> The PDF for fitting if it is different from the PDF for generating.
 <tr><td> ConditionalObservables(const RooArgSet& set)  <td> The set of observables that the PDF should _not_ be normalized over
 <tr><td> Binned(Bool_t flag)               <td> Bin the dataset before fitting it. Speeds up fitting of large data samples
-<tr><td> FitOptions(const char*)           <td> Classic fit options, provided for backward compatibility
 <tr><td> FitOptions(....)                  <td> Options to be used for fitting. All named arguments inside FitOptions() are passed to RooAbsPdf::fitTo().
                                                 `Save()` is especially interesting to be able to retrieve fit results of each run using fitResult().
 <tr><td> Verbose(Bool_t flag)              <td> Activate informational messages in event generation phase
@@ -136,11 +135,7 @@ RooMCStudy::RooMCStudy(const RooAbsPdf& model, const RooArgSet& observables,
   pc.defineInt("verboseGen","Verbose",0,0) ;
   pc.defineInt("extendedGen","Extended",0,0) ;
   pc.defineInt("binGenData","Binned",0,0) ;
-  pc.defineString("fitOpts","FitOptions",0,"") ;
   pc.defineInt("dummy","FitOptArgs",0,0) ;
-  pc.defineMutex("FitOptions","FitOptArgs") ; // can have either classic or new-style fit options
-  pc.defineMutex("Constrain","FitOptions") ; // constraints only work with new-style fit options
-  pc.defineMutex("ExternalConstraints","FitOptions") ; // constraints only work with new-style fit options
 
   // Process and check varargs
   pc.process(cmdList) ;
@@ -236,7 +231,6 @@ RooMCStudy::RooMCStudy(const RooAbsPdf& model, const RooArgSet& observables,
   _dependents.add(observables) ;
 
   _allDependents.add(_dependents) ;
-  _fitOptions = pc.getString("fitOpts") ;
   _canAddFitResults = kTRUE ;
 
   if (_extendedGen && _genProtoData && !_randProto) {
@@ -311,112 +305,6 @@ RooMCStudy::RooMCStudy(const RooAbsPdf& model, const RooArgSet& observables,
 }
 
 
-////////////////////////////////////////////////////////////////////////////////
-/// \deprecated PLEASE USE CONSTRUCTOR WITH NAMED ARGUMENTS. RETAINED FOR BACKWARD COMPATIBILY.
-///
-/// Constructor with a generator and fit model. Both models may point
-/// to the same object. The 'dependents' set of variables is generated
-/// in the generator phase. The optional prototype dataset is passed to
-/// the generator
-///
-/// Available generator options
-///  v  - Verbose
-///  e  - Extended: use Poisson distribution for Nevts generated
-///
-/// Available fit options
-///  See RooAbsPdf::fitTo()
-///
-
-RooMCStudy::RooMCStudy(const RooAbsPdf& genModel, const RooAbsPdf& fitModel,
-                const RooArgSet& dependents, const char* genOptions,
-                const char* fitOptions, const RooDataSet* genProtoData,
-                const RooArgSet& projDeps) :
-  TNamed("mcstudy","mcstudy"),
-  _genModel((RooAbsPdf*)&genModel),
-  _genProtoData(genProtoData),
-  _projDeps(projDeps),
-  _constrPdf(0),
-  _constrGenContext(0),
-  _dependents(dependents),
-  _allDependents(dependents),
-  _fitModel((RooAbsPdf*)&fitModel),
-  _nllVar(0),
-  _ngenVar(0),
-  _genParData(0),
-  _fitOptions(fitOptions),
-  _canAddFitResults(kTRUE),
-  _perExptGenParams(0),
-  _silence(kFALSE)
-{
-  // Decode generator options
-  TString genOpt(genOptions) ;
-  genOpt.ToLower() ;
-  _verboseGen = genOpt.Contains("v") ;
-  _extendedGen = genOpt.Contains("e") ;
-  _binGenData = genOpt.Contains("b") ;
-  _randProto = genOpt.Contains("r") ;
-
-  if (_extendedGen && genProtoData && !_randProto) {
-    oocoutE(_fitModel,Generation) << "RooMCStudy::RooMCStudy: WARNING Using generator option 'e' (Poisson distribution of #events) together " << endl
-              << "                        with a prototype dataset implies incomplete sampling or oversampling of proto data." << endl
-              << "                        Use option \"r\" to randomize prototype dataset order and thus to randomize" << endl
-              << "                        the set of over/undersampled prototype events for each generation cycle." << endl ;
-  }
-
-  if (!_binGenData) {
-    _genContext = genModel.genContext(dependents,genProtoData,0,_verboseGen) ;
-  } else {
-    _genContext = 0 ;
-  }
-  _genParams = _genModel->getParameters(&_dependents) ;
-  _genSample = 0 ;
-  RooArgSet* tmp = genModel.getParameters(&dependents) ;
-  _genInitParams = (RooArgSet*) tmp->snapshot(kFALSE) ;
-  delete tmp ;
-
-  // Store list of parameters and save initial values separately
-  _fitParams = fitModel.getParameters(&dependents) ;
-  _fitInitParams = (RooArgSet*) _fitParams->snapshot(kTRUE) ;
-
-  _nExpGen = _extendedGen ? genModel.expectedEvents(&dependents) : 0 ;
-
-  // Place holder for NLL
-  _nllVar = new RooRealVar("NLL","-log(Likelihood)",0) ;
-
-  // Place holder for number of generated events
-  _ngenVar = new RooRealVar("ngen","number of generated events",0) ;
-
-  // Create data set containing parameter values, errors and pulls
-  RooArgSet tmp2(*_fitParams) ;
-  tmp2.add(*_nllVar) ;
-  tmp2.add(*_ngenVar) ;
-
-  // Mark all variable to store their errors in the dataset
-  tmp2.setAttribAll("StoreError",kTRUE) ;
-  tmp2.setAttribAll("StoreAsymError",kTRUE) ;
-  _fitParData = new RooDataSet("fitParData","Fit Parameters DataSet",tmp2) ;
-  tmp2.setAttribAll("StoreError",kFALSE) ;
-  tmp2.setAttribAll("StoreAsymError",kFALSE) ;
-
-  // Append proto variables to allDependents
-  if (genProtoData) {
-    _allDependents.add(*genProtoData->get(),kTRUE) ;
-  }
-
-  // Call module initializers
-  list<RooAbsMCStudyModule*>::iterator iter ;
-  for (iter=_modList.begin() ; iter!= _modList.end() ; ++iter) {
-    Bool_t ok = (*iter)->doInitializeInstance(*this) ;
-    if (!ok) {
-      oocoutE(_fitModel,Generation) << "RooMCStudy::ctor: removing study module " << (*iter)->GetName() << " from analysis chain because initialization failed" << endl ;
-      iter = _modList.erase(iter) ;
-    }
-  }
-
-}
-
-
-
 ////////////////////////////////////////////////////////////////////////////////
 
 RooMCStudy::~RooMCStudy()
@@ -747,12 +635,6 @@ void RooMCStudy::resetFitParams()
 
 RooFitResult* RooMCStudy::doFit(RooAbsData* genSample)
 {
-  // Fit model to data set
-  TString fitOpt2(_fitOptions) ; fitOpt2.Append("r") ;
-  if (_silence) {
-    fitOpt2.Append("b") ;
-  }
-
   // Optionally bin dataset before fitting
   RooAbsData* data ;
   if (_binGenData) {
@@ -763,27 +645,17 @@ RooFitResult* RooMCStudy::doFit(RooAbsData* genSample)
     data = genSample ;
   }
 
-  RooFitResult* fr ;
-  if (_fitOptList.GetSize()==0) {
-    if (_projDeps.getSize()>0) {
-      fr = (RooFitResult*) _fitModel->fitTo(*data,RooFit::ConditionalObservables(_projDeps),RooFitLegacy::FitOptions(fitOpt2)) ;
-    } else {
-      fr = (RooFitResult*) _fitModel->fitTo(*data,RooFitLegacy::FitOptions(fitOpt2)) ;
-    }
-  } else {
-    RooCmdArg save  = RooFit::Save() ;
-    RooCmdArg condo = RooFit::ConditionalObservables(_projDeps) ;
-    RooCmdArg plevel = RooFit::PrintLevel(-1) ;
-    RooLinkedList fitOptList(_fitOptList) ;
-    fitOptList.Add(&save) ;
-    if (_projDeps.getSize()>0) {
-      fitOptList.Add(&condo) ;
-    }
-    if (_silence) {
-      fitOptList.Add(&plevel) ;
-    }
-    fr = (RooFitResult*) _fitModel->fitTo(*data,fitOptList) ;
+  RooCmdArg save  = RooFit::Save() ;
+  RooCmdArg condo = RooFit::ConditionalObservables(_projDeps) ;
+  RooCmdArg plevel = RooFit::PrintLevel(_silence ? -1 : 1) ;
+
+  RooLinkedList fitOptList(_fitOptList) ;
+  fitOptList.Add(&save) ;
+  if (!_projDeps.empty()) {
+    fitOptList.Add(&condo) ;
   }
+  fitOptList.Add(&plevel) ;
+  RooFitResult* fr = _fitModel->fitTo(*data,fitOptList) ;
 
   if (_binGenData) delete data ;
 
@@ -852,8 +724,6 @@ Bool_t RooMCStudy::fitSample(RooAbsData* genSample)
   Bool_t userSaveRequest = kFALSE ;
   if (_fitOptList.GetSize()>0) {
     if (_fitOptList.FindObject("Save")) userSaveRequest = kTRUE ;
-  } else {
-    if (_fitOptions.Contains("r")) userSaveRequest = kTRUE ;
   }
 
   if (userSaveRequest) {
@@ -898,7 +768,7 @@ Bool_t RooMCStudy::addFitResult(const RooFitResult& fr)
   }
 
   // Store fit result if requested by user
-  if (_fitOptions.Contains("r")) {
+  if (_fitOptList.FindObject("Save")) {
     _fitResList.Add((TObject*)&fr) ;
   }
 
diff --git a/roofit/roofitcore/src/RooMinimizer.cxx b/roofit/roofitcore/src/RooMinimizer.cxx
index d5a5dc4b0b37350846d23188bc8aa21c6a302664..3e82c68202aa9f22636ece6dd76993bb3bf21b71 100644
--- a/roofit/roofitcore/src/RooMinimizer.cxx
+++ b/roofit/roofitcore/src/RooMinimizer.cxx
@@ -303,40 +303,6 @@ const ROOT::Fit::Fitter* RooMinimizer::fitter() const
 }
 
 
-
-////////////////////////////////////////////////////////////////////////////////
-/// Parse traditional RooAbsPdf::fitTo driver options
-///
-///  m - Run Migrad only
-///  h - Run Hesse to estimate errors
-///  v - Verbose mode
-///  l - Log parameters after each Minuit steps to file
-///  t - Activate profile timer
-///  r - Save fit result
-///  0 - Run Migrad with strategy 0
-
-RooFitResult* RooMinimizer::fit(const char* options)
-{
-  TString opts(options) ;
-  opts.ToLower() ;
-
-  // Initial configuration
-  if (opts.Contains("v")) setVerbose(1) ;
-  if (opts.Contains("t")) setProfile(1) ;
-  if (opts.Contains("l")) setLogFile(Form("%s.log",_fcn->getFunctionName().c_str())) ;
-  if (opts.Contains("c")) optimizeConst(1) ;
-
-  // Fitting steps
-  if (opts.Contains("0")) setStrategy(0) ;
-  migrad() ;
-  if (opts.Contains("0")) setStrategy(1) ;
-  if (opts.Contains("h")||!opts.Contains("m")) hesse() ;
-  if (!opts.Contains("m")) minos() ;
-
-  return (opts.Contains("r")) ? save() : 0 ;
-}
-
-
 bool RooMinimizer::fitFcn() const {
    bool ret;