diff --git a/roofit/roofitcore/inc/RooHelpers.h b/roofit/roofitcore/inc/RooHelpers.h
index 47a4d34bbb5bb9e63dbfd993e6aae521083cf3d9..7aa994a074b808928c55eeab403ec29fcbf3bdaf 100644
--- a/roofit/roofitcore/inc/RooHelpers.h
+++ b/roofit/roofitcore/inc/RooHelpers.h
@@ -25,32 +25,25 @@
 
 namespace RooHelpers {
 
-/// Switches the message service to verbose while the instance alive.
+/// Switches the message service to verbose while the instance is alive.
 class LocalChangeMsgLevel {
   public:
     /// Change message level (and topics) while this object is alive, reset when it goes out of scope.
     /// \param[in] lvl The desired message level. Defaults to verbose.
-    /// \param[in] extraTopics Extra topics to be switched on.
+    /// \param[in] extraTopics Extra topics to be switched on. These will only switched on in the last stream to prevent all streams are printing.
+    /// \param[in] removeTopics Message topics to be switched off
+    /// \param[in] overrideExternalLevel Override the user message level.
     LocalChangeMsgLevel(RooFit::MsgLevel lvl = RooFit::DEBUG,
-        RooFit::MsgTopic extraTopics = static_cast<RooFit::MsgTopic>(0u)) {
-      auto& msg = RooMsgService::instance();
-      fOldKillBelow = msg.globalKillBelow();
-      msg.setGlobalKillBelow(lvl);
-      fOldConf = msg.getStream(0);
-      msg.getStream(0).minLevel = lvl;
-      msg.getStream(0).addTopic(extraTopics);
-      msg.setStreamStatus(0, true);
-    }
+        unsigned int extraTopics = 0u,
+        unsigned int removeTopics = 0u,
+        bool overrideExternalLevel = true);
 
-    ~LocalChangeMsgLevel() {
-      auto& msg = RooMsgService::instance();
-      msg.setGlobalKillBelow(fOldKillBelow);
-      msg.getStream(0) = fOldConf;
-    }
+    ~LocalChangeMsgLevel();
 
   private:
     RooFit::MsgLevel fOldKillBelow;
-    RooMsgService::StreamConfig fOldConf;
+    std::vector<RooMsgService::StreamConfig> fOldConf;
+    int fExtraStream{-1};
 };
 
 
diff --git a/roofit/roofitcore/inc/RooMsgService.h b/roofit/roofitcore/inc/RooMsgService.h
index 37bb50da5f9afc0ad2ed93c5dbe1c14efdacaa56..6476f151d1110d0d95b5efe506fe60a41b17b0b9 100644
--- a/roofit/roofitcore/inc/RooMsgService.h
+++ b/roofit/roofitcore/inc/RooMsgService.h
@@ -86,17 +86,17 @@ class RooWorkspace ;
 #define ccxcoutI(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE) 
 #define oocxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a) 
 #define ooccxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE) 
-#define cxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a) 
-#define ccxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE) 
-#define oocxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a) 
-#define ooccxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE) 
+#define cxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a)
+#define ccxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a,kTRUE)
+#define oocxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a)
+#define ooccxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a,kTRUE)
 #define cxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a) 
 #define ccxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a,kTRUE) 
 #define oocxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a) 
 #define ooccxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a,kTRUE) 
 #define cxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a) 
 #define ccxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a,kTRUE) 
-#define oocxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(to,RooFit::ERROR,RooFit::a) 
+#define oocxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a)
 #define ooccxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a,kTRUE) 
 #define cxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a) 
 #define ccxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a,kTRUE) 
diff --git a/roofit/roofitcore/src/RooHelpers.cxx b/roofit/roofitcore/src/RooHelpers.cxx
index 7907d7b62aa9e8a473ca2d9a63613039a7f7678f..5bdb7dc17fc91e6f335e4c1e14c87523600a305c 100644
--- a/roofit/roofitcore/src/RooHelpers.cxx
+++ b/roofit/roofitcore/src/RooHelpers.cxx
@@ -19,6 +19,38 @@
 
 namespace RooHelpers {
 
+LocalChangeMsgLevel::LocalChangeMsgLevel(RooFit::MsgLevel lvl,
+    unsigned int extraTopics, unsigned int removeTopics, bool overrideExternalLevel) {
+  auto& msg = RooMsgService::instance();
+  fOldKillBelow = msg.globalKillBelow();
+  if (overrideExternalLevel) msg.setGlobalKillBelow(lvl);
+
+  for (int i = 0; i < msg.numStreams(); ++i) {
+    fOldConf.push_back(msg.getStream(i));
+    if (overrideExternalLevel) msg.getStream(i).minLevel = lvl;
+    msg.getStream(i).removeTopic(static_cast<RooFit::MsgTopic>(removeTopics));
+    msg.setStreamStatus(i, true);
+  }
+
+  if (extraTopics != 0) {
+    fExtraStream = msg.addStream(lvl);
+    msg.getStream(fExtraStream).addTopic(static_cast<RooFit::MsgTopic>(extraTopics));
+  }
+}
+
+LocalChangeMsgLevel::~LocalChangeMsgLevel() {
+  auto& msg = RooMsgService::instance();
+  msg.setGlobalKillBelow(fOldKillBelow);
+  for (int i=0; i < msg.numStreams(); ++i) {
+    if (i < static_cast<int>(fOldConf.size()))
+      msg.getStream(i) = fOldConf[i];
+  }
+
+  if (fExtraStream > 0)
+    msg.deleteStream(fExtraStream);
+}
+
+
 /// Tokenise the string by splitting at the characters in delims.
 /// Consecutive delimiters are collapsed, so that no delimiters will appear in the
 /// tokenised strings, and no emtpy strings are returned.