diff --git a/Framework/Kernel/inc/MantidKernel/ConfigService.h b/Framework/Kernel/inc/MantidKernel/ConfigService.h
index 672050d00f85b4a6bf9a82762ecf345b73c6c75f..5befecc7d924bea159b9cf4fddd3e17f094eff03 100644
--- a/Framework/Kernel/inc/MantidKernel/ConfigService.h
+++ b/Framework/Kernel/inc/MantidKernel/ConfigService.h
@@ -224,6 +224,9 @@ public:
   /// Set the default facility
   void setFacility(const std::string &facilityName);
 
+  /// registers additional logging filter channels
+  void registerLoggingFilterChannel(const std::string &filterChannelName,
+                                    Poco::Channel *pChannel);
   /// Sets the log level priority for the File log channel
   void setFileLogLevel(int logLevel);
   /// Sets the log level priority for the Console log channel
@@ -270,6 +273,7 @@ private:
   void loadConfig(const std::string &filename, const bool append = false);
   /// Read a file and place its contents into the given string
   bool readFile(const std::string &filename, std::string &contents) const;
+
   /// Provides a string of a default configuration
   std::string defaultConfig() const;
   /// Writes out a fresh user properties file
@@ -298,6 +302,8 @@ private:
   /// Returns a list of all keys under a given root key
   void getKeysRecursive(const std::string &root,
                         std::vector<std::string> &allKeys) const;
+  ///Finds the lowest registered logging filter level
+  int ConfigServiceImpl::FindLowestFilterLevel() const;
 
   // Forward declaration of inner class
   template <class T> class WrappedObject;
@@ -341,6 +347,9 @@ private:
   Kernel::ProxyInfo m_proxyInfo;
   /// whether the proxy has been populated yet
   bool m_isProxySet;
+
+  /// store a list of logging FilterChannels
+  std::vector<std::string> m_filterChannels;
 };
 
 /// Forward declaration of a specialisation of SingletonHolder for
diff --git a/Framework/Kernel/inc/MantidKernel/FilterChannel.h b/Framework/Kernel/inc/MantidKernel/FilterChannel.h
index b75e9367acbba7b3536421aabf08216580f9a8f4..e6f9c6aced89ba4a725b6e1dd6308784594829b3 100644
--- a/Framework/Kernel/inc/MantidKernel/FilterChannel.h
+++ b/Framework/Kernel/inc/MantidKernel/FilterChannel.h
@@ -45,7 +45,7 @@ namespace Poco {
 /// channels simultaneously.
 class MANTID_KERNEL_DLL FilterChannel : public Channel {
 public:
-  /// Creates the SplitterChannel.
+  /// Creates the FilterChannel.
   FilterChannel();
 
   /// destructor
diff --git a/Framework/Kernel/src/ConfigService.cpp b/Framework/Kernel/src/ConfigService.cpp
index 06d7236cdeccad3d14570286f555bd45e8e3be3c..8ad0645ccdd06ba9dee3381bca982e41b23ab998 100644
--- a/Framework/Kernel/src/ConfigService.cpp
+++ b/Framework/Kernel/src/ConfigService.cpp
@@ -145,7 +145,8 @@ ConfigServiceImpl::ConfigServiceImpl()
       m_user_properties_file_name("Mantid.user.properties"),
 #endif
       m_DataSearchDirs(), m_UserSearchDirs(), m_InstrumentDirs(),
-      m_instr_prefixes(), m_proxyInfo(), m_isProxySet(false) {
+      m_instr_prefixes(), m_proxyInfo(), m_isProxySet(false),
+      m_filterChannels() {
   // getting at system details
   m_pSysConfig = new WrappedObject<Poco::Util::SystemConfiguration>;
   m_pConf = nullptr;
@@ -236,7 +237,8 @@ ConfigServiceImpl::ConfigServiceImpl()
                       << " revision " << MantidVersion::revision() << std::endl;
   g_log.information() << "running on " << getComputerName() << " starting "
                       << DateAndTime::getCurrentTime().toFormattedString(
-                             "%Y-%m-%dT%H:%MZ") << "\n";
+                             "%Y-%m-%dT%H:%MZ")
+                      << "\n";
   g_log.information() << "Properties file(s) loaded: " << propertiesFilesList
                       << std::endl;
 #ifndef MPI_BUILD // There is no logging to file by default in MPI build
@@ -362,6 +364,21 @@ bool ConfigServiceImpl::readFile(const std::string &filename,
   return good;
 }
 
+/** Registers additional logging filter channels
+* @param filterChannelName The name to refer to the filter channel, this should
+* be unique
+* @param pChannel a pointer to the channel to be registered, if blank, then the
+* channel must already be registered with the logging registry in Poco
+*/
+void ConfigServiceImpl::registerLoggingFilterChannel(
+    const std::string &filterChannelName, Poco::Channel *pChannel) {
+  m_filterChannels.push_back(filterChannelName);
+  if (pChannel) {
+    Poco::LoggingRegistry::defaultRegistry().registerChannel(filterChannelName,
+                                                             pChannel);
+  }
+}
+
 /** Configures the Poco logging and starts it up
  *
  */
@@ -457,6 +474,10 @@ void ConfigServiceImpl::configureLogging() {
     std::cerr << "Trouble configuring the logging framework " << e.what()
               << std::endl;
   }
+
+  // register the filter channels - the order here is important
+  registerLoggingFilterChannel("fileFilterChannel", nullptr);
+  registerLoggingFilterChannel("consoleFilterChannel", nullptr);
 }
 
 /**
@@ -624,18 +645,22 @@ void ConfigServiceImpl::createUserPropertiesFile() const {
         std::fstream::out);
 
     filestr << "# This file can be used to override any properties for this "
-               "installation." << std::endl;
+               "installation."
+            << std::endl;
     filestr << "# Any properties found in this file will override any that are "
-               "found in the Mantid.Properties file" << std::endl;
+               "found in the Mantid.Properties file"
+            << std::endl;
     filestr << "# As this file will not be replaced with futher installations "
-               "of Mantid it is a safe place to put " << std::endl;
+               "of Mantid it is a safe place to put "
+            << std::endl;
     filestr << "# properties that suit your particular installation."
             << std::endl;
     filestr << "#" << std::endl;
     filestr << "# See here for a list of possible options:" << std::endl;
     filestr << "# "
                "http://www.mantidproject.org/"
-               "Properties_File#Mantid.User.Properties" << std::endl;
+               "Properties_File#Mantid.User.Properties"
+            << std::endl;
     filestr << std::endl;
     filestr << "##" << std::endl;
     filestr << "## GENERAL" << std::endl;
@@ -668,18 +693,21 @@ void ConfigServiceImpl::createUserPropertiesFile() const {
     filestr << std::endl;
     filestr << "## Sets the Q.convention" << std::endl;
     filestr << "## Set to Crystallography for kf-ki instead of default "
-               "Inelastic which is ki-kf" << std::endl;
+               "Inelastic which is ki-kf"
+            << std::endl;
     filestr << "#Q.convention=Crystallography" << std::endl;
     filestr << "##" << std::endl;
     filestr << "## DIRECTORIES" << std::endl;
     filestr << "##" << std::endl;
     filestr << std::endl;
     filestr << "## Sets a list of directories (separated by semi colons) to "
-               "search for data" << std::endl;
+               "search for data"
+            << std::endl;
     filestr << "#datasearch.directories=../data;../isis/data" << std::endl;
     filestr << std::endl;
     filestr << "## Set a list (separated by semi colons) of directories to "
-               "look for additional Python scripts" << std::endl;
+               "look for additional Python scripts"
+            << std::endl;
     filestr << "#pythonscripts.directories=../scripts;../docs/MyScripts"
             << std::endl;
     filestr << std::endl;
@@ -720,7 +748,8 @@ void ConfigServiceImpl::createUserPropertiesFile() const {
     filestr << "#MantidOptions.ReusePlotInstances=Off" << std::endl;
     filestr << std::endl;
     filestr << "## Uncomment to disable use of OpenGL to render unwrapped "
-               "instrument views" << std::endl;
+               "instrument views"
+            << std::endl;
     filestr << "#MantidOptions.InstrumentView.UseOpenGL=Off" << std::endl;
 
     filestr.close();
@@ -1952,13 +1981,13 @@ Kernel::ProxyInfo &ConfigServiceImpl::getProxy(const std::string &url) {
 * @param logLevel the integer value of the log level to set, 1=Critical, 7=Debug
 */
 void ConfigServiceImpl::setFileLogLevel(int logLevel) {
-  setFilterChannelLogLevel("fileFilterChannel", logLevel);
+  setFilterChannelLogLevel(m_filterChannels[0], logLevel);
 }
 /** Sets the log level priority for the Console log channel
 * @param logLevel the integer value of the log level to set, 1=Critical, 7=Debug
 */
 void ConfigServiceImpl::setConsoleLogLevel(int logLevel) {
-  setFilterChannelLogLevel("consoleFilterChannel", logLevel);
+  setFilterChannelLogLevel(m_filterChannels[1], logLevel);
 }
 
 /** Sets the Log level for a filter channel
@@ -1981,10 +2010,11 @@ void ConfigServiceImpl::setFilterChannelLogLevel(
   auto *filterChannel = dynamic_cast<Poco::FilterChannel *>(channel);
   if (filterChannel) {
     filterChannel->setPriority(logLevel);
+    int lowestLogLevel = FindLowestFilterLevel();
     // set root level if required
     int rootLevel = Poco::Logger::root().getLevel();
-    if (rootLevel < logLevel) {
-      Mantid::Kernel::Logger::setLevelForAll(logLevel);
+    if (rootLevel != lowestLogLevel) {
+      Mantid::Kernel::Logger::setLevelForAll(lowestLogLevel);
     }
     g_log.log(filterChannelName + " log channel set to " +
                   Logger::PriorityNames[logLevel] + " priority",
@@ -1995,6 +2025,31 @@ void ConfigServiceImpl::setFilterChannelLogLevel(
   }
 }
 
+/** Finds the lowest Log level for all registered filter channels
+*/
+int ConfigServiceImpl::FindLowestFilterLevel() const {
+  int lowestPriority = Logger::Priority::PRIO_FATAL;
+  // Find the lowest level of all of the filter channels
+  for (const auto filterChannelName : m_filterChannels) {
+    Poco::Channel *channel = nullptr;
+    try {
+      channel = Poco::LoggingRegistry::defaultRegistry().channelForName(
+          filterChannelName);
+      auto *filterChannel = dynamic_cast<Poco::FilterChannel *>(channel);
+      if (filterChannel) {
+        int filterPriority = filterChannel->getPriority();
+        if (filterPriority > lowestPriority) {
+          lowestPriority = filterPriority;
+        }
+      }
+    } catch (Poco::NotFoundException &) {
+      g_log.warning(filterChannelName +
+                    " registered log filter channel not found");
+    }
+  }
+
+  return lowestPriority;
+}
 /// \cond TEMPLATE
 template DLLExport int ConfigServiceImpl::getValue(const std::string &,
                                                    double &);
diff --git a/Framework/Kernel/src/FilterChannel.cpp b/Framework/Kernel/src/FilterChannel.cpp
index b888ca2d4b10a1f57df8081f6317b1a80869847c..c141e377819083f0dfb3e632e3130a0ec5e6e99e 100644
--- a/Framework/Kernel/src/FilterChannel.cpp
+++ b/Framework/Kernel/src/FilterChannel.cpp
@@ -37,7 +37,7 @@ void FilterChannel::setProperty(const std::string &name,
 void FilterChannel::log(const Message &msg) {
   std::lock_guard<std::mutex> lock(_mutex);
 
-  if (msg.getPriority() <= _priority) {
+  if ((_channel) && (msg.getPriority() <= _priority)) {
     _channel->log(msg);
   }
 }
diff --git a/Framework/Kernel/src/Logger.cpp b/Framework/Kernel/src/Logger.cpp
index c535fbdcf6a767b5e4b04b6fed66dda878c49470..37fb60afa2d3ba1a2e157152af10b19acebaf912 100644
--- a/Framework/Kernel/src/Logger.cpp
+++ b/Framework/Kernel/src/Logger.cpp
@@ -25,8 +25,9 @@ Poco::NullOutputStream NULL_STREAM;
 }
 
 static const std::string PriorityNames_data[] = {
-    "PRIO_FATAL",  "PRIO_CRITICAL",    "PRIO_ERROR", "PRIO_WARNING",
-    "PRIO_NOTICE", "PRIO_INFORMATION", "PRIO_DEBUG", "PRIO_TRACE"};
+    "NOT_USED",         "PRIO_FATAL",   "PRIO_CRITICAL",
+    "PRIO_ERROR",       "PRIO_WARNING", "PRIO_NOTICE",
+    "PRIO_INFORMATION", "PRIO_DEBUG",   "PRIO_TRACE"};
 const std::string *Logger::PriorityNames = PriorityNames_data;
 
 /** Constructor
diff --git a/Framework/Kernel/test/ConfigServiceTest.h b/Framework/Kernel/test/ConfigServiceTest.h
index 09f980d53a13f406fe294bb76b5876d17baff84a..2448028630a48ffee6e41a0d428e2c1e18c94dc7 100644
--- a/Framework/Kernel/test/ConfigServiceTest.h
+++ b/Framework/Kernel/test/ConfigServiceTest.h
@@ -6,6 +6,7 @@
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/Logger.h"
 #include "MantidKernel/TestChannel.h"
+#include "MantidKernel/FilterChannel.h"
 #include "MantidKernel/InstrumentInfo.h"
 #include "MantidKernel/FacilityInfo.h"
 
@@ -16,6 +17,8 @@
 #include <fstream>
 
 #include <Poco/NObserver.h>
+#include <Poco/SplitterChannel.h>
+#include <Poco/Logger.h>
 #include <Poco/Environment.h>
 #include <Poco/File.h>
 
@@ -56,8 +59,7 @@ public:
 
         );
 
-    // checking the level - this should be set to debug in the config file
-    // therefore this should only return false for debug
+    // checking the level - this is set above
     TS_ASSERT(log1.is(Poco::Message::PRIO_DEBUG) == false);       // debug
     TS_ASSERT(log1.is(Poco::Message::PRIO_INFORMATION) == false); // information
     TS_ASSERT(log1.is(Poco::Message::PRIO_NOTICE));               // notice
@@ -131,6 +133,71 @@ public:
         std::invalid_argument);
   }
 
+  void testLogLevelChangesWithFilteringLevels() {
+    Logger log1("testLogLevelChangesWithFilteringLevels");
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setConsoleLogLevel(4));
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setFileLogLevel(4));
+    TSM_ASSERT("The log level should be 4 after both filters are set to 4",
+               log1.is(4));
+
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setFileLogLevel(3));
+    TSM_ASSERT("The log level remain at 4 if any filter is at 4", log1.is(4));
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setConsoleLogLevel(3));
+    TSM_ASSERT("The log level should be 3 after both filters are set to 3",
+               log1.is(3));
+
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setFileLogLevel(5));
+    TSM_ASSERT("The log level should be at 5 if any filter is at 5",
+               log1.is(5));
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setConsoleLogLevel(5));
+    TSM_ASSERT("The log level remain at 5 after both filters are set to 5",
+               log1.is(5));
+
+    // return back to previous values
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setConsoleLogLevel(4));
+    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().setFileLogLevel(4));
+  }
+
+  void testRegisteringaNewFilter() {
+    Logger log1("testRegisteringaNewFilter");
+    Poco::FilterChannel *testFilterChannel = new Poco::FilterChannel();
+    std::string m_FilterChannelName = "testRegisteringaNewFilter";
+
+    // Setup logging
+    auto &rootLogger = Poco::Logger::root();
+    auto *rootChannel = Poco::Logger::root().getChannel();
+    // The root channel might be a SplitterChannel
+    if (auto *splitChannel =
+            dynamic_cast<Poco::SplitterChannel *>(rootChannel)) {
+      splitChannel->addChannel(testFilterChannel);
+    } else {
+      Poco::Logger::setChannel(rootLogger.name(), testFilterChannel);
+    }
+
+    auto &configService = ConfigService::Instance();
+    configService.registerLoggingFilterChannel(m_FilterChannelName,
+                                               testFilterChannel);
+
+    int prevLogLevel = log1.getLevel();
+    TSM_ASSERT("The log level start above PRIO_TRACE",
+               log1.getLevel() < Logger::Priority::PRIO_TRACE);
+
+    configService.setFilterChannelLogLevel(m_FilterChannelName,
+                                           Logger::Priority::PRIO_TRACE);
+    TSM_ASSERT("The log level be PRIO_TRACE",
+               log1.getLevel() == Logger::Priority::PRIO_TRACE);
+    TSM_ASSERT("The log filter priority be PRIO_TRACE",
+               testFilterChannel->getPriority() ==
+                   Logger::Priority::PRIO_TRACE);
+
+    configService.setFilterChannelLogLevel(m_FilterChannelName, prevLogLevel);
+    TSM_ASSERT("The log level be " + prevLogLevel,
+               log1.getLevel() == prevLogLevel);
+    TSM_ASSERT("The log filter priority be " + prevLogLevel,
+               testFilterChannel->getPriority() ==
+                   static_cast<unsigned int>(prevLogLevel));
+  }
+
   void testDefaultFacility() {
     TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().getFacility());
     //
@@ -648,8 +715,9 @@ protected:
   std::string m_key;
   std::string m_preValue;
   std::string m_curValue;
-  void handleConfigChange(const Poco::AutoPtr<
-      Mantid::Kernel::ConfigServiceImpl::ValueChanged> &pNf) {
+  void handleConfigChange(
+      const Poco::AutoPtr<Mantid::Kernel::ConfigServiceImpl::ValueChanged>
+          &pNf) {
     m_valueChangedSent = true;
     m_key = pNf->key();
     m_preValue = pNf->preValue();
diff --git a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MessageDisplay.h b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MessageDisplay.h
index b1c62ce42e9f2ff80b64eb76c4c3c4e77f98c30f..738e87ff96447f24a3df015ed4d48b7b837bb17b 100644
--- a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MessageDisplay.h
+++ b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MessageDisplay.h
@@ -65,7 +65,7 @@ namespace MantidQt
       void setSource(const QString & source);
       /// Get the current source are emitted
       inline const QString & source() const { return m_logChannel->source(); }
-
+      
     signals:
       /// Indicate that a message of error or higher has been received.
       void errorReceived(const QString & text);
@@ -133,6 +133,9 @@ namespace MantidQt
       QSignalMapper *m_logLevelMapping;
       /// Log level actions
       QAction  *m_error,*m_warning,*m_notice, *m_information, *m_debug;
+
+      // the name of the fliter channel
+      const std::string m_FilterChannelName = "MessageDisplayPriority";
     };
 
   }
diff --git a/MantidQt/MantidWidgets/src/MessageDisplay.cpp b/MantidQt/MantidWidgets/src/MessageDisplay.cpp
index 5cde3b16089ba2dd2985f85afc718e62379afe0f..f8e34491474ed23ca48d7b20b140b1f0ab921b8c 100644
--- a/MantidQt/MantidWidgets/src/MessageDisplay.cpp
+++ b/MantidQt/MantidWidgets/src/MessageDisplay.cpp
@@ -3,6 +3,7 @@
 //-------------------------------------------
 #include "MantidQtMantidWidgets/MessageDisplay.h"
 
+#include "MantidKernel/ConfigService.h"
 #include "MantidKernel/Logger.h"
 
 #include <QAction>
@@ -19,379 +20,368 @@
 #include <Poco/Message.h>
 #include <Poco/SplitterChannel.h>
 
+namespace MantidQt {
+namespace MantidWidgets {
+using API::Message;
 
-namespace MantidQt
-{
-  namespace MantidWidgets
-  {
-    using API::Message;
-
-    //-------------------------------------------
-    // Public member functions
-    //-------------------------------------------
-    /**
-     * Constructs a widget that does not allow control over the global log level
-     * @param parent An optional parent widget
-     */
-    MessageDisplay::MessageDisplay(QWidget *parent)
-    : QWidget(parent), m_logLevelControl(DisableLogLevelControl), m_logChannel(new API::QtSignalChannel),m_filterChannel(new Poco::FilterChannel),
-      m_textDisplay(new QPlainTextEdit(this)), m_formats(), m_loglevels(new QActionGroup(this)), m_logLevelMapping(new QSignalMapper(this)),
-      m_error(new QAction(tr("&Error"), this)), m_warning(new QAction(tr("&Warning"), this)),
-      m_notice(new QAction(tr("&Notice"), this)), m_information(new QAction(tr("&Information"), this)),
-      m_debug(new QAction(tr("&Debug"), this))
-    {
-      initActions();
-      initFormats();
-      setupTextArea();
-    }
+//-------------------------------------------
+// Public member functions
+//-------------------------------------------
+/**
+ * Constructs a widget that does not allow control over the global log level
+ * @param parent An optional parent widget
+ */
+MessageDisplay::MessageDisplay(QWidget *parent)
+    : QWidget(parent), m_logLevelControl(DisableLogLevelControl),
+      m_logChannel(new API::QtSignalChannel),
+      m_filterChannel(new Poco::FilterChannel),
+      m_textDisplay(new QPlainTextEdit(this)), m_formats(),
+      m_loglevels(new QActionGroup(this)),
+      m_logLevelMapping(new QSignalMapper(this)),
+      m_error(new QAction(tr("&Error"), this)),
+      m_warning(new QAction(tr("&Warning"), this)),
+      m_notice(new QAction(tr("&Notice"), this)),
+      m_information(new QAction(tr("&Information"), this)),
+      m_debug(new QAction(tr("&Debug"), this)) {
+  initActions();
+  initFormats();
+  setupTextArea();
+}
 
-    /**
-     * @param logLevelControl Controls whether this display shows the right-click option to change
-     * the global log level
-     * @param parent An optional parent widget
-     */
-    MessageDisplay::MessageDisplay(LogLevelControl logLevelControl, QWidget *parent)
-    : QWidget(parent), m_logLevelControl(logLevelControl), m_logChannel(new API::QtSignalChannel),m_filterChannel(new Poco::FilterChannel),
-      m_textDisplay(new QPlainTextEdit(this)), m_loglevels(new QActionGroup(this)), m_logLevelMapping(new QSignalMapper(this)),
-      m_error(new QAction(tr("&Error"), this)), m_warning(new QAction(tr("&Warning"), this)),
-      m_notice(new QAction(tr("&Notice"), this)), m_information(new QAction(tr("&Information"), this)),
-      m_debug(new QAction(tr("&Debug"), this))
-    {
-      initActions();
-      initFormats();
-      setupTextArea();
-    }
+/**
+ * @param logLevelControl Controls whether this display shows the right-click
+ * option to change
+ * the global log level
+ * @param parent An optional parent widget
+ */
+MessageDisplay::MessageDisplay(LogLevelControl logLevelControl, QWidget *parent)
+    : QWidget(parent), m_logLevelControl(logLevelControl),
+      m_logChannel(new API::QtSignalChannel),
+      m_filterChannel(new Poco::FilterChannel),
+      m_textDisplay(new QPlainTextEdit(this)),
+      m_loglevels(new QActionGroup(this)),
+      m_logLevelMapping(new QSignalMapper(this)),
+      m_error(new QAction(tr("&Error"), this)),
+      m_warning(new QAction(tr("&Warning"), this)),
+      m_notice(new QAction(tr("&Notice"), this)),
+      m_information(new QAction(tr("&Information"), this)),
+      m_debug(new QAction(tr("&Debug"), this)) {
+  initActions();
+  initFormats();
+  setupTextArea();
+}
 
-    /**
-     */
-    MessageDisplay::~MessageDisplay()
-    {
-      QSettings settings;
-      settings.setValue("MessageDisplayPriority",
-                        static_cast<int>(m_filterChannel->getPriority()));
-      // The Channel class is ref counted and will
-      // delete itself when required
-      m_filterChannel->release();
-      m_logChannel->release();
-      delete m_textDisplay;
-    }
+/**
+ */
+MessageDisplay::~MessageDisplay() {
+  QSettings settings;
+  settings.setValue("MessageDisplayPriority",
+                    static_cast<int>(m_filterChannel->getPriority()));
+  // The Channel class is ref counted and will
+  // delete itself when required
+  m_filterChannel->release();
+  m_logChannel->release();
+  delete m_textDisplay;
+}
 
-    /**
-     * Attaches the Mantid logging framework
-     * (Note the ConfigService must have already been started)
-     */
-    void MessageDisplay::attachLoggingChannel()
-    {
-      // Setup logging
-      auto & rootLogger = Poco::Logger::root();
-      auto * rootChannel = Poco::Logger::root().getChannel();
-      // The root channel might be a SplitterChannel
-      if(auto *splitChannel = dynamic_cast<Poco::SplitterChannel*>(rootChannel))
-      {
-        splitChannel->addChannel(m_filterChannel);
-      }
-      else
-      {
-        Poco::Logger::setChannel(rootLogger.name(), m_filterChannel);
-      }
-      m_filterChannel->addChannel(m_logChannel);
-      
-      QSettings settings;
-      int priority =
-          settings
-              .value("MessageDisplayPriority", Message::Priority::PRIO_NOTICE)
-              .toInt();
-      m_filterChannel->setPriority(priority);
-
-      connect(m_logChannel, SIGNAL(messageReceived(const Message&)),
-          this, SLOT(append(const Message &)));
-    }
+/**
+ * Attaches the Mantid logging framework
+ * (Note the ConfigService must have already been started)
+ */
+void MessageDisplay::attachLoggingChannel() {
+  // Setup logging
+  auto &rootLogger = Poco::Logger::root();
+  auto *rootChannel = Poco::Logger::root().getChannel();
+  // The root channel might be a SplitterChannel
+  if (auto *splitChannel = dynamic_cast<Poco::SplitterChannel *>(rootChannel)) {
+    splitChannel->addChannel(m_filterChannel);
+  } else {
+    Poco::Logger::setChannel(rootLogger.name(), m_filterChannel);
+  }
+  m_filterChannel->addChannel(m_logChannel);
 
-    /**
-     * @param source A string specifying the required source for messages
-     * that will be emitted
-     */
-    void MessageDisplay::setSource(const QString & source)
-    {
-      m_logChannel->setSource(source);
-    }
+  QSettings settings;
+  int priority = settings.value(QString::fromStdString(m_FilterChannelName),
+                                Message::Priority::PRIO_NOTICE)
+                     .toInt();
 
-    //----------------------------------------------------------------------------------------
-    // Public slots
-    //----------------------------------------------------------------------------------------
-    /**
-     * @param text The text string to append at PRIO_FATAL level
-     */
-    void MessageDisplay::appendFatal(const QString & text)
-    {
-      this->append(Message(text, Message::Priority::PRIO_FATAL));
-    }
+  auto &configService = Mantid::Kernel::ConfigService::Instance();
+  configService.registerLoggingFilterChannel(m_FilterChannelName,
+                                             m_filterChannel);
+  configService.setFilterChannelLogLevel(m_FilterChannelName, priority);
 
-    /**
-     * @param text The text string to append at PRIO_ERROR level
-     */
-    void MessageDisplay::appendError(const QString & text)
-    {
-      this->append(Message(text, Message::Priority::PRIO_ERROR));
-    }
+  connect(m_logChannel, SIGNAL(messageReceived(const Message &)), this,
+          SLOT(append(const Message &)));
+}
 
-    /**
-     * @param text The text string to append at PRIO_WARNING level
-     */
-    void MessageDisplay::appendWarning(const QString & text)
-    {
-      this->append(Message(text, Message::Priority::PRIO_WARNING));
-    }
+/**
+ * @param source A string specifying the required source for messages
+ * that will be emitted
+ */
+void MessageDisplay::setSource(const QString &source) {
+  m_logChannel->setSource(source);
+}
 
-    /**
-     * @param text The text string to append at PRIO_NOTICE level
-     */
-    void MessageDisplay::appendNotice(const QString & text)
-    {
-      this->append(Message(text, Message::Priority::PRIO_NOTICE));
-    }
+//----------------------------------------------------------------------------------------
+// Public slots
+//----------------------------------------------------------------------------------------
+/**
+ * @param text The text string to append at PRIO_FATAL level
+ */
+void MessageDisplay::appendFatal(const QString &text) {
+  this->append(Message(text, Message::Priority::PRIO_FATAL));
+}
 
-    /**
-     * @param text The text string to append at PRIO_INFORMATION level
-     */
-    void MessageDisplay::appendInformation(const QString & text)
-    {
-      this->append(Message(text, Message::Priority::PRIO_INFORMATION));
-    }
+/**
+ * @param text The text string to append at PRIO_ERROR level
+ */
+void MessageDisplay::appendError(const QString &text) {
+  this->append(Message(text, Message::Priority::PRIO_ERROR));
+}
 
-    /**
-     * @param text The text string to append at PRIO_DEBUG level
-     */
-    void MessageDisplay::appendDebug(const QString & text)
-    {
-      this->append(Message(text, Message::Priority::PRIO_DEBUG));
-    }
+/**
+ * @param text The text string to append at PRIO_WARNING level
+ */
+void MessageDisplay::appendWarning(const QString &text) {
+  this->append(Message(text, Message::Priority::PRIO_WARNING));
+}
 
-    /**
-     * @param msg A message that is echoed to the display after the
-     * current text
-     */
-    void MessageDisplay::append(const Message & msg)
-    {
-      QTextCursor cursor = moveCursorToEnd();
-      cursor.insertText(msg.text(), format(msg.priority()));
-      moveCursorToEnd();
-
-      if(msg.priority() <= Message::Priority::PRIO_ERROR ) emit errorReceived(msg.text());
-      if(msg.priority() <= Message::Priority::PRIO_WARNING ) emit warningReceived(msg.text());
-    }
+/**
+ * @param text The text string to append at PRIO_NOTICE level
+ */
+void MessageDisplay::appendNotice(const QString &text) {
+  this->append(Message(text, Message::Priority::PRIO_NOTICE));
+}
 
-    /**
-     * @param msg Replace the current contents with this message
-     */
-    void MessageDisplay::replace(const Message & msg)
-    {
-      clear();
-      append(msg.text());
-    }
+/**
+ * @param text The text string to append at PRIO_INFORMATION level
+ */
+void MessageDisplay::appendInformation(const QString &text) {
+  this->append(Message(text, Message::Priority::PRIO_INFORMATION));
+}
 
-    /**
-     * Clear all of the text
-     */
-    void MessageDisplay::clear()
-    {
-      m_textDisplay->clear();
-    }
+/**
+ * @param text The text string to append at PRIO_DEBUG level
+ */
+void MessageDisplay::appendDebug(const QString &text) {
+  this->append(Message(text, Message::Priority::PRIO_DEBUG));
+}
 
-    /**
-     * @returns The cursor at the end of the text
-     */
-    QTextCursor MessageDisplay::moveCursorToEnd()
-    {
-      QTextCursor cursor( m_textDisplay->textCursor());
-      cursor.movePosition(QTextCursor::End);
-      m_textDisplay->setTextCursor(cursor);
-      return cursor;
-    }
+/**
+ * @param msg A message that is echoed to the display after the
+ * current text
+ */
+void MessageDisplay::append(const Message &msg) {
+  QTextCursor cursor = moveCursorToEnd();
+  cursor.insertText(msg.text(), format(msg.priority()));
+  moveCursorToEnd();
+
+  if (msg.priority() <= Message::Priority::PRIO_ERROR)
+    emit errorReceived(msg.text());
+  if (msg.priority() <= Message::Priority::PRIO_WARNING)
+    emit warningReceived(msg.text());
+}
 
-    /**
-     * @return True if scroll bar is at bottom, false otherwise
-     */
-    bool MessageDisplay::isScrollbarAtBottom() const
-    {
-      return m_textDisplay->verticalScrollBar()->value() == m_textDisplay->verticalScrollBar()->maximum();
-    }
+/**
+ * @param msg Replace the current contents with this message
+ */
+void MessageDisplay::replace(const Message &msg) {
+  clear();
+  append(msg.text());
+}
 
-    /**
-     * Moves the cursor to the top of the document
-     */
-    void MessageDisplay::scrollToTop()
-    {
-      // Code taken from QtCreator source
-      m_textDisplay->verticalScrollBar()->setValue(m_textDisplay->verticalScrollBar()->minimum());
-      // QPlainTextEdit destroys the first calls value in case of multiline
-      // text, so make sure that the scroll bar actually gets the value set.
-      // Is a noop if the first call succeeded.
-      m_textDisplay->verticalScrollBar()->setValue(m_textDisplay->verticalScrollBar()->minimum());
-    }
+/**
+ * Clear all of the text
+ */
+void MessageDisplay::clear() { m_textDisplay->clear(); }
+
+/**
+ * @returns The cursor at the end of the text
+ */
+QTextCursor MessageDisplay::moveCursorToEnd() {
+  QTextCursor cursor(m_textDisplay->textCursor());
+  cursor.movePosition(QTextCursor::End);
+  m_textDisplay->setTextCursor(cursor);
+  return cursor;
+}
 
-    /**
-     * Moves the cursor to the bottom of the document
-     */
-    void MessageDisplay::scrollToBottom()
-    {
-      // Code taken from QtCreator source
-      m_textDisplay->verticalScrollBar()->setValue(m_textDisplay->verticalScrollBar()->maximum());
-      // QPlainTextEdit destroys the first calls value in case of multiline
-      // text, so make sure that the scroll bar actually gets the value set.
-      // Is a noop if the first call succeeded.
-      m_textDisplay->verticalScrollBar()->setValue(m_textDisplay->verticalScrollBar()->maximum());
-    }
+/**
+ * @return True if scroll bar is at bottom, false otherwise
+ */
+bool MessageDisplay::isScrollbarAtBottom() const {
+  return m_textDisplay->verticalScrollBar()->value() ==
+         m_textDisplay->verticalScrollBar()->maximum();
+}
 
-    //----------------------------------------------------------------------------------------
-    // Protected members
-    //----------------------------------------------------------------------------------------
-
-    //-----------------------------------------------------------------------------
-    // Private slot member functions
-    //-----------------------------------------------------------------------------
-
-    void MessageDisplay::showContextMenu(const QPoint & mousePos)
-    {
-      QMenu * menu = m_textDisplay->createStandardContextMenu();
-      if(!m_textDisplay->document()->isEmpty()) menu->addAction("Clear",m_textDisplay, SLOT(clear()));
-
-      if(m_logLevelControl == MessageDisplay::EnableLogLevelControl)
-      {
-        menu->addSeparator();
-        QMenu *logLevelMenu = menu->addMenu("&Log Level");
-        logLevelMenu->addAction(m_error);
-        logLevelMenu->addAction(m_warning);
-        logLevelMenu->addAction(m_notice);
-        logLevelMenu->addAction(m_information);
-        logLevelMenu->addAction(m_debug);
-
-        //check the right level
-        int level = m_filterChannel->getPriority(); 
-        //get the root logger logging level
-        int rootLevel = Poco::Logger::root().getLevel();
-        if (rootLevel < level) {
-          level = rootLevel;
-        }
-
-        if (level == Poco::Message::PRIO_ERROR)
-          m_error->setChecked(true);
-        if (level == Poco::Message::PRIO_WARNING)
-          m_warning->setChecked(true);
-        if (level == Poco::Message::PRIO_NOTICE)
-          m_notice->setChecked(true);
-        if (level == Poco::Message::PRIO_INFORMATION)
-          m_information->setChecked(true);
-        if (level >= Poco::Message::PRIO_DEBUG)
-          m_debug->setChecked(true);
-      }
-
-      menu->exec(this->mapToGlobal(mousePos));
-      delete menu;
-    }
+/**
+ * Moves the cursor to the top of the document
+ */
+void MessageDisplay::scrollToTop() {
+  // Code taken from QtCreator source
+  m_textDisplay->verticalScrollBar()->setValue(
+      m_textDisplay->verticalScrollBar()->minimum());
+  // QPlainTextEdit destroys the first calls value in case of multiline
+  // text, so make sure that the scroll bar actually gets the value set.
+  // Is a noop if the first call succeeded.
+  m_textDisplay->verticalScrollBar()->setValue(
+      m_textDisplay->verticalScrollBar()->minimum());
+}
 
-    /*
-     * @param priority An integer that must match the Poco::Message priority
-     * enumeration
-     */
-    void MessageDisplay::setGlobalLogLevel(int priority)
-    {
-      //set Local filter level
-      m_filterChannel->setPriority(priority);
-      //if this is higher than the global level then that will have to be lowered to work
-      int rootLevel = Poco::Logger::root().getLevel();
-      if (rootLevel < priority)
-      {
-         Mantid::Kernel::Logger::setLevelForAll(priority);
-      }
-    }
+/**
+ * Moves the cursor to the bottom of the document
+ */
+void MessageDisplay::scrollToBottom() {
+  // Code taken from QtCreator source
+  m_textDisplay->verticalScrollBar()->setValue(
+      m_textDisplay->verticalScrollBar()->maximum());
+  // QPlainTextEdit destroys the first calls value in case of multiline
+  // text, so make sure that the scroll bar actually gets the value set.
+  // Is a noop if the first call succeeded.
+  m_textDisplay->verticalScrollBar()->setValue(
+      m_textDisplay->verticalScrollBar()->maximum());
+}
 
-    //-----------------------------------------------------------------------------
-    // Private non-slot member functions
-    //-----------------------------------------------------------------------------
-    /*
-     */
-    void MessageDisplay::initActions()
-    {
-      m_error->setCheckable(true);
-      m_warning->setCheckable(true);
-      m_notice->setCheckable(true);
-      m_information->setCheckable(true);
-      m_debug->setCheckable(true);
-
-      m_loglevels->addAction(m_error);
-      m_loglevels->addAction(m_warning);
-      m_loglevels->addAction(m_notice);
-      m_loglevels->addAction(m_information);
-      m_loglevels->addAction(m_debug);
-
-      m_logLevelMapping->setMapping(m_error, Poco::Message::PRIO_ERROR);
-      m_logLevelMapping->setMapping(m_warning, Poco::Message::PRIO_WARNING);
-      m_logLevelMapping->setMapping(m_notice, Poco::Message::PRIO_NOTICE);
-      m_logLevelMapping->setMapping(m_information, Poco::Message::PRIO_INFORMATION);
-      m_logLevelMapping->setMapping(m_debug, Poco::Message::PRIO_DEBUG);
-
-      connect(m_error, SIGNAL(activated()), m_logLevelMapping, SLOT (map()));
-      connect(m_warning, SIGNAL(activated()), m_logLevelMapping, SLOT (map()));
-      connect(m_notice, SIGNAL(activated()), m_logLevelMapping, SLOT (map()));
-      connect(m_information, SIGNAL(activated()), m_logLevelMapping, SLOT (map()));
-      connect(m_debug, SIGNAL(activated()), m_logLevelMapping, SLOT (map()));
-
-      connect(m_logLevelMapping, SIGNAL(mapped(int)), this, SLOT(setGlobalLogLevel(int)));
+//----------------------------------------------------------------------------------------
+// Protected members
+//----------------------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Private slot member functions
+//-----------------------------------------------------------------------------
+
+void MessageDisplay::showContextMenu(const QPoint &mousePos) {
+  QMenu *menu = m_textDisplay->createStandardContextMenu();
+  if (!m_textDisplay->document()->isEmpty())
+    menu->addAction("Clear", m_textDisplay, SLOT(clear()));
+
+  if (m_logLevelControl == MessageDisplay::EnableLogLevelControl) {
+    menu->addSeparator();
+    QMenu *logLevelMenu = menu->addMenu("&Log Level");
+    logLevelMenu->addAction(m_error);
+    logLevelMenu->addAction(m_warning);
+    logLevelMenu->addAction(m_notice);
+    logLevelMenu->addAction(m_information);
+    logLevelMenu->addAction(m_debug);
+
+    // check the right level
+    int level = m_filterChannel->getPriority();
+    // get the root logger logging level
+    int rootLevel = Poco::Logger::root().getLevel();
+    if (rootLevel < level) {
+      level = rootLevel;
     }
 
-    /**
-     * Sets up the internal map of text formatters for each log level
-     */
-    void MessageDisplay::initFormats()
-    {
-      m_formats.clear();
-      QTextCharFormat format;
+    if (level == Poco::Message::PRIO_ERROR)
+      m_error->setChecked(true);
+    if (level == Poco::Message::PRIO_WARNING)
+      m_warning->setChecked(true);
+    if (level == Poco::Message::PRIO_NOTICE)
+      m_notice->setChecked(true);
+    if (level == Poco::Message::PRIO_INFORMATION)
+      m_information->setChecked(true);
+    if (level >= Poco::Message::PRIO_DEBUG)
+      m_debug->setChecked(true);
+  }
+
+  menu->exec(this->mapToGlobal(mousePos));
+  delete menu;
+}
 
-      format.setForeground(Qt::red);
-      m_formats[Message::Priority::PRIO_ERROR] = format;
+/*
+ * @param priority An integer that must match the Poco::Message priority
+ * enumeration
+ */
+void MessageDisplay::setGlobalLogLevel(int priority) {
+  // set Local filter level
 
-      format.setForeground(QColor::fromRgb(255, 100, 0));
-      m_formats[Message::Priority::PRIO_WARNING] = format;
+  Mantid::Kernel::ConfigService::Instance().setFilterChannelLogLevel(
+      m_FilterChannelName, priority);
+  m_filterChannel->setPriority(priority);
+}
 
-      format.setForeground(Qt::gray);
-      m_formats[Message::Priority::PRIO_INFORMATION] = format;
+//-----------------------------------------------------------------------------
+// Private non-slot member functions
+//-----------------------------------------------------------------------------
+/*
+ */
+void MessageDisplay::initActions() {
+  m_error->setCheckable(true);
+  m_warning->setCheckable(true);
+  m_notice->setCheckable(true);
+  m_information->setCheckable(true);
+  m_debug->setCheckable(true);
+
+  m_loglevels->addAction(m_error);
+  m_loglevels->addAction(m_warning);
+  m_loglevels->addAction(m_notice);
+  m_loglevels->addAction(m_information);
+  m_loglevels->addAction(m_debug);
+
+  m_logLevelMapping->setMapping(m_error, Poco::Message::PRIO_ERROR);
+  m_logLevelMapping->setMapping(m_warning, Poco::Message::PRIO_WARNING);
+  m_logLevelMapping->setMapping(m_notice, Poco::Message::PRIO_NOTICE);
+  m_logLevelMapping->setMapping(m_information, Poco::Message::PRIO_INFORMATION);
+  m_logLevelMapping->setMapping(m_debug, Poco::Message::PRIO_DEBUG);
+
+  connect(m_error, SIGNAL(activated()), m_logLevelMapping, SLOT(map()));
+  connect(m_warning, SIGNAL(activated()), m_logLevelMapping, SLOT(map()));
+  connect(m_notice, SIGNAL(activated()), m_logLevelMapping, SLOT(map()));
+  connect(m_information, SIGNAL(activated()), m_logLevelMapping, SLOT(map()));
+  connect(m_debug, SIGNAL(activated()), m_logLevelMapping, SLOT(map()));
+
+  connect(m_logLevelMapping, SIGNAL(mapped(int)), this,
+          SLOT(setGlobalLogLevel(int)));
+}
 
-      format.setForeground(Qt::darkBlue);
-      m_formats[Message::Priority::PRIO_NOTICE] = format;
-    }
+/**
+ * Sets up the internal map of text formatters for each log level
+ */
+void MessageDisplay::initFormats() {
+  m_formats.clear();
+  QTextCharFormat format;
 
-    /**
-     * Set the properties of the text display, i.e read-only
-     * and make it occupy the whole widget
-     */
-    void MessageDisplay::setupTextArea()
-    {
-      m_textDisplay->setReadOnly(true);
-      m_textDisplay->ensureCursorVisible();
-      m_textDisplay->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
-      m_textDisplay->setMouseTracking(true);
-      m_textDisplay->setUndoRedoEnabled(false);
-
-      this->setLayout(new QHBoxLayout(this));
-      QLayout *layout = this->layout();
-      layout->setContentsMargins(0,0,0,0);
-      layout->addWidget(m_textDisplay);
-
-      this->setFocusProxy(m_textDisplay);
-      m_textDisplay->setContextMenuPolicy(Qt::CustomContextMenu);
-      connect(m_textDisplay, SIGNAL(customContextMenuRequested(const QPoint&)),
-          this, SLOT(showContextMenu(const QPoint&)));
-    }
+  format.setForeground(Qt::red);
+  m_formats[Message::Priority::PRIO_ERROR] = format;
 
-    /**
-     * @param priority An enumeration for the log level
-     * @return format for given log level
-     */
-    QTextCharFormat MessageDisplay::format(const API::Message::Priority priority) const
-    {
-      return m_formats.value(priority,QTextCharFormat());
-    }
+  format.setForeground(QColor::fromRgb(255, 100, 0));
+  m_formats[Message::Priority::PRIO_WARNING] = format;
 
-  }
+  format.setForeground(Qt::gray);
+  m_formats[Message::Priority::PRIO_INFORMATION] = format;
+
+  format.setForeground(Qt::darkBlue);
+  m_formats[Message::Priority::PRIO_NOTICE] = format;
+}
+
+/**
+ * Set the properties of the text display, i.e read-only
+ * and make it occupy the whole widget
+ */
+void MessageDisplay::setupTextArea() {
+  m_textDisplay->setReadOnly(true);
+  m_textDisplay->ensureCursorVisible();
+  m_textDisplay->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+  m_textDisplay->setMouseTracking(true);
+  m_textDisplay->setUndoRedoEnabled(false);
+
+  this->setLayout(new QHBoxLayout(this));
+  QLayout *layout = this->layout();
+  layout->setContentsMargins(0, 0, 0, 0);
+  layout->addWidget(m_textDisplay);
+
+  this->setFocusProxy(m_textDisplay);
+  m_textDisplay->setContextMenuPolicy(Qt::CustomContextMenu);
+  connect(m_textDisplay, SIGNAL(customContextMenuRequested(const QPoint &)),
+          this, SLOT(showContextMenu(const QPoint &)));
+}
+
+/**
+ * @param priority An enumeration for the log level
+ * @return format for given log level
+ */
+QTextCharFormat
+MessageDisplay::format(const API::Message::Priority priority) const {
+  return m_formats.value(priority, QTextCharFormat());
+}
+}
 }