diff --git a/Code/Mantid/API/inc/MantidAPI/IInstrument.h b/Code/Mantid/API/inc/MantidAPI/IInstrument.h
index 38bf899e30575fe30c663ae741412edef625152d..f423e279211e2aa1f372564e7080ad702fa49060 100644
--- a/Code/Mantid/API/inc/MantidAPI/IInstrument.h
+++ b/Code/Mantid/API/inc/MantidAPI/IInstrument.h
@@ -8,6 +8,7 @@
 #include "MantidGeometry/ICompAssembly.h"
 #include "MantidGeometry/Detector.h"
 #include <boost/shared_ptr.hpp>
+#include <map>
 #include <string>
 #include <ostream>
 
diff --git a/Code/Mantid/API/inc/MantidAPI/Instrument.h b/Code/Mantid/API/inc/MantidAPI/Instrument.h
index 7e7f19b539cd3532295309bf496e7890f9b36214..18b3b6fd1e8bf922fe5234e21c8205b557151c75 100644
--- a/Code/Mantid/API/inc/MantidAPI/Instrument.h
+++ b/Code/Mantid/API/inc/MantidAPI/Instrument.h
@@ -9,7 +9,8 @@
 #include "MantidGeometry/CompAssembly.h"
 #include "MantidGeometry/ObjComponent.h"
 #include "MantidGeometry/Detector.h"
-#include <string>
+#include <string>
+#include <map>
 #include <ostream>
 
 namespace Mantid
diff --git a/Code/Mantid/Geometry/inc/MantidGeometry/DetectorGroup.h b/Code/Mantid/Geometry/inc/MantidGeometry/DetectorGroup.h
index 44115c683b2060489c68136d61e99c0116eb95c6..74e32e5d4fdb6b0ec9bba753e57bee9930db4324 100644
--- a/Code/Mantid/Geometry/inc/MantidGeometry/DetectorGroup.h
+++ b/Code/Mantid/Geometry/inc/MantidGeometry/DetectorGroup.h
@@ -8,6 +8,7 @@
 #include "MantidGeometry/Component.h"
 #include <boost/shared_ptr.hpp>
 #include <vector>
+#include <map>
 
 namespace Mantid
 {
diff --git a/Code/Mantid/Geometry/inc/MantidGeometry/ParameterFactory.h b/Code/Mantid/Geometry/inc/MantidGeometry/ParameterFactory.h
index 61bbfa3a30ff02e0a0c5f45ba03969fdf4b1a6dd..c914a35ed0c3a30d69c0574a42a617962f6f2cee 100644
--- a/Code/Mantid/Geometry/inc/MantidGeometry/ParameterFactory.h
+++ b/Code/Mantid/Geometry/inc/MantidGeometry/ParameterFactory.h
@@ -5,8 +5,8 @@
 // Includes
 //----------------------------------------------------------------------
 #include <vector>
-#include "MantidKernel/System.h"
-//#include "MantidKernel/DynamicFactory.h"
+#include <map>
+#include "MantidKernel/System.h"
 #include "MantidKernel/Instantiator.h"
 #include "MantidKernel/SingletonHolder.h"
 #include "MantidKernel/Logger.h"
diff --git a/Code/Mantid/Geometry/inc/MantidGeometry/Rules.h b/Code/Mantid/Geometry/inc/MantidGeometry/Rules.h
index aabf2e44f758f6fd9857f421e737993b52c40460..ea15e4412a5fe4d0cea66006518dd53cb65f1338 100644
--- a/Code/Mantid/Geometry/inc/MantidGeometry/Rules.h
+++ b/Code/Mantid/Geometry/inc/MantidGeometry/Rules.h
@@ -1,6 +1,8 @@
 #ifndef Rules_h
 #define Rules_h
 
+#include <map>
+
 namespace Mantid
 {
 
diff --git a/Code/Mantid/Kernel/inc/MantidKernel/Logger.h b/Code/Mantid/Kernel/inc/MantidKernel/Logger.h
index bce92acce501911bd70e24c8502d06936cd2c472..9acd2bbcefdfddf938817214c67fb2f8bd15f800 100755
--- a/Code/Mantid/Kernel/inc/MantidKernel/Logger.h
+++ b/Code/Mantid/Kernel/inc/MantidKernel/Logger.h
@@ -6,8 +6,8 @@
 //----------------------------------------------------------------------
 #include "System.h"
 #include <string>
+#include <set>
 #include <exception>
-#include <map>
 #include <ostream>
 #include <streambuf>
 
@@ -19,6 +19,8 @@ namespace Poco
 {
 	class Logger;
 	class LogStream;
+	class NullChannel;
+	class Mutex;
 }
 /// @endcond
 
@@ -70,6 +72,7 @@ namespace Kernel
 			PRIO_FATAL = 1,		  ///< A fatal error. The application will most likely terminate. This is the highest priority.
 			PRIO_ERROR = 3,       ///< An error. An operation did not complete successfully, but the application as a whole is not affected.
 			PRIO_WARNING = 4,     ///< A warning. An operation completed with an unexpected result.
+			PRIO_NOTICE = 5,      ///< An informational message, usually denoting the successful completion of an Algorithm, These are the headlines of what we should be reporting to the user.
 			PRIO_INFORMATION = 6, ///< An informational message, usually denoting the successful completion of an operation.
 			PRIO_DEBUG = 7        ///< A debugging message.This is the lowest priority.
 		};
@@ -77,36 +80,67 @@ namespace Kernel
 		void fatal(const std::string& msg);
 		void error(const std::string& msg);
 		void warning(const std::string& msg);
+		void notice(const std::string& msg);
 		void information(const std::string& msg);
 		void debug(const std::string& msg);
 
 		std::ostream& fatal();
 		std::ostream& error();
 		std::ostream& warning();
+		std::ostream& notice();
 		std::ostream& information();
 		std::ostream& debug();
 
 		/// Logs the given message at debug level, followed by the data in buffer.
 		void dump(const std::string& msg, const void* buffer, std::size_t length);
 
+		/// Sets the Logger's log level.
+		void setLevel(int level);
+		
+		/// Returns the Logger's log level.
+		int getLevel() const;
+		
+		/// Sets the Logger's log level using a symbolic value.
+		///
+		/// Valid values are:
+		///   - fatal
+		///   - critical
+		///   - error
+		///   - warning
+		///   - notice
+		///   - information
+		///   - debug
+		void setLevel(const std::string& level);
+
+		///returns true if the log is enabled
+		bool getEnabled() const;
+
+		///set if the logging is enabled
+		void setEnabled(const bool enabled);
+		
 		/// Returns true if at least the given log level is set.
 		bool is(int level) const;
 
+		/// releases resources and deletes this object
+		void release();
+
 		/// Returns a reference to the Logger with the given name.
 		static Logger& get(const std::string& name);
 
+		//destroy the given logger and releases resources
+		static void Logger::destroy(Logger& logger);
+
 		/// Shuts down the logging framework and releases all Loggers.
 		static void shutdown();
 
-		~Logger();
 
 	protected:
 		/// Protected constructor called by static get method
 		Logger(const std::string& name);
 
-
+		/// Protected destructor - call release instead
+		~Logger();
 	private:
-
 		Logger();
 
 		/// Overload of = operator
@@ -114,11 +148,24 @@ namespace Kernel
 
 		/// Internal handle to third party logging objects
 		Poco::Logger& _log;
-		///This pointer is owned by this class, initialized in the constructor and deleted in the destructor
+		///A Log stream to allow streaming operations.  This pointer is owned by this class, initialized in the constructor and deleted in the destructor
 		Poco::LogStream* _logStream;
+		///A Null stream, used when the logger is disabled.  This pointer is owned by this class, initialized in the constructor and deleted in the destructor
+		Poco::LogStream* _nullStream;
+		/// a null channell used to create the null stream		
+		Poco::NullChannel*  _nullChannel;
+
+		///returns the correct stream depending on the enabled status
+		Poco::LogStream* getStream();
 
 		/// Name of this logging object
 		std::string _name;
+		/// The state of this logger, disabled loggers send no messages
+		bool _enabled;
+
+		typedef std::set<Logger*> LoggerList;
+		static LoggerList*        m_LoggerList;
+		static Poco::Mutex        m_ListMtx;
 };
 
 } // namespace Kernel
diff --git a/Code/Mantid/Kernel/src/ConfigService.cpp b/Code/Mantid/Kernel/src/ConfigService.cpp
index 352fc2da7d8c7ab9d9b0b434ae8b1a3f4a8cbe56..832003ada9315d3b8c96e92b12488a25c8d61d36 100644
--- a/Code/Mantid/Kernel/src/ConfigService.cpp
+++ b/Code/Mantid/Kernel/src/ConfigService.cpp
@@ -81,9 +81,9 @@ namespace Mantid
 		*/
 		ConfigServiceImpl::~ConfigServiceImpl()
 		{
+			Kernel::Logger::shutdown();
 			delete m_pSysConfig;
 			delete m_pConf;                // potential double delete???
-			//		g_log.debug() << "ConfigService destroyed." << std::endl;
 		}
 
 		/**
diff --git a/Code/Mantid/Kernel/src/Logger.cpp b/Code/Mantid/Kernel/src/Logger.cpp
index 6a40795720fa440991619b335057aab2978183cf..32ed74108c76259d60a9a24eeffa9e8e58d63a8e 100755
--- a/Code/Mantid/Kernel/src/Logger.cpp
+++ b/Code/Mantid/Kernel/src/Logger.cpp
@@ -1,253 +1,410 @@
 #include "MantidKernel/Logger.h"
 #include <Poco/Logger.h>
 #include <Poco/LogStream.h>
-#include <Poco/Message.h>
+#include <Poco/Message.h>
+#include <Poco/Mutex.h>
+#include <Poco/NullChannel.h>
 #include <iostream>
 #include <sstream>
 
 namespace Mantid
 {
-namespace Kernel
-{
-	
-	/** Constructor
-  * @param name The class name invoking this logger
-  */
-	Logger::Logger(const std::string& name): _log(Poco::Logger::get(name))
-	{  
-		_name = name;
-		_logStream = new Poco::LogStream(_log);
-	}
-
-  ///destructor
-	Logger::~Logger()
-	{
-		delete (_logStream);
-	}
-
-  /** If the Logger's log level is at least PRIO_FATAL, creates a Message with 
-   *  priority PRIO_FATAL and the given message text and sends it to the attached channel.
-   * 
-   *  @param msg The message to log.
-   */
-	void Logger::fatal(const std::string& msg)
-	{
-		try
-		{
-			_log.fatal(msg); 
-		} 
-		catch (std::exception& e)
-		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
-		}
-	}
-		
-  /** If the Logger's log level is at least PRIO_ERROR, creates a Message with priority
-   *  PRIO_ERROR and the given message text and sends it to the attached channel.
-   * 
-   *  @param msg The message to log.
-   */
-	void Logger::error(const std::string& msg)
+	namespace Kernel
 	{
-		try
+		Logger::LoggerList* Logger::m_LoggerList = 0;
+		Poco::Mutex Logger::m_ListMtx;
+
+		/** Constructor
+		* @param name The class name invoking this logger
+		*/
+		Logger::Logger(const std::string& name): _log(Poco::Logger::get(name)),_enabled(true)
+		{  
+			_name = name;
+			_logStream = new Poco::LogStream(_log);
+			_nullChannel = new Poco::NullChannel;
+			Poco::Logger& nullLogger = Poco::Logger::get("NULL");
+			nullLogger.setChannel(_nullChannel);
+			_nullStream = new Poco::LogStream(nullLogger,Poco::Message::PRIO_FATAL);
+
+		}
+
+		///destructor
+		Logger::~Logger()
 		{
-			_log.error(msg);
-		} 
-		catch (std::exception& e)
+			delete (_logStream);
+			delete (_nullStream);
+			delete (_nullChannel);
+		}
+
+		/** Returns true if the log is enabled
+		* 
+		*  @retval true - logging is enabled
+		*  @retval false - all messages are ignored.
+		*/
+		bool Logger::getEnabled() const
 		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
+			return _enabled;
 		}
-		
-	}
 
-  /** If the Logger's log level is at least PRIO_WARNING, creates a Message with 
-   *  priority PRIO_WARNING and the given message text and sends it to the attached channel.
-   * 
-   *  @param msg The message to log.
-   */
-	void Logger::warning(const std::string& msg)
-	{
-		try
+		/** set if the logging is enabled
+		* 
+		*  @param enabled  true - logging is enabled, false - all messages are ignored.
+		*/
+		void Logger::setEnabled(const bool enabled)
 		{
-			_log.warning(msg);
-		} 
-		catch (std::exception& e)
+			_enabled = enabled;
+		}
+
+		/** If the Logger's log level is at least PRIO_FATAL, creates a Message with 
+		*  priority PRIO_FATAL and the given message text and sends it to the attached channel.
+		* 
+		*  @param msg The message to log.
+		*/
+		void Logger::fatal(const std::string& msg)
 		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
+			if(_enabled)
+			{
+				try
+				{
+					_log.fatal(msg); 
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
 		}
-	}
 
-  /** If the Logger's log level is at least PRIO_INFORMATION, creates a Message with 
-   *  priority PRIO_INFORMATION and the given message text and sends it to the 
-   *  attached channel.
-   * 
-   *  @param msg The message to log.
-   */
-	void Logger::information(const std::string& msg)
-	{
-		try
+		/** If the Logger's log level is at least PRIO_ERROR, creates a Message with priority
+		*  PRIO_ERROR and the given message text and sends it to the attached channel.
+		* 
+		*  @param msg The message to log.
+		*/
+		void Logger::error(const std::string& msg)
 		{
-			_log.information(msg);
-		} 
-		catch (std::exception& e)
+			if(_enabled)
+			{
+				try
+				{
+					_log.error(msg);
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
+		}
+
+		/** If the Logger's log level is at least PRIO_WARNING, creates a Message with 
+		*  priority PRIO_WARNING and the given message text and sends it to the attached channel.
+		* 
+		*  @param msg The message to log.
+		*/
+		void Logger::warning(const std::string& msg)
 		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
+			if(_enabled)
+			{
+				try
+				{
+					_log.warning(msg);
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
 		}
-	}
 
-  /** If the Logger's log level is at least PRIO_DEBUG, creates a Message with priority
-   *  PRIO_DEBUG and the given message text and sends it to the attached channel.
-   * 
-   *  @param msg The message to log.
-   */
-	void Logger::debug(const std::string& msg)
-	{
-		try
-		{
-			_log.debug(msg);
-		} 
-		catch (std::exception& e)
-		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
-		}
-	}
-
-  /** Logs the given message at debug level, followed by the data in buffer.
-   * 
-   *  The data in buffer is written in canonical hex+ASCII form:
-   *  Offset (4 bytes) in hexadecimal, followed by sixteen space-separated, 
-   *  two column, hexadecimal bytes, followed by the same sixteen bytes as 
-   *  ASCII characters.
-   *  For bytes outside the range 32 .. 127, a dot is printed.  
-   *  Note all Dump messages go out at Debug message level
-   * 
-   *  @param msg The message to log
-   *  @param buffer the binary data to log
-   *  @param length The length of the binaary data to log
-   */
-	void Logger::dump(const std::string& msg, const void* buffer, std::size_t length)
-	{
-		try
+		/** If the Logger's log level is at least PRIO_NOTICE, creates a Message with 
+		*  priority PRIO_NOTICE and the given message text and sends it to the attached channel.
+		* 
+		*  @param msg The message to log.
+		*/
+		void Logger::notice(const std::string& msg)
 		{
-			_log.dump(msg,buffer,length);
-		} 
-		catch (std::exception& e)
+			if(_enabled)
+			{
+				try
+				{
+					_log.notice(msg);
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
+		}
+		/** If the Logger's log level is at least PRIO_INFORMATION, creates a Message with 
+		*  priority PRIO_INFORMATION and the given message text and sends it to the 
+		*  attached channel.
+		* 
+		*  @param msg The message to log.
+		*/
+		void Logger::information(const std::string& msg)
 		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
+			if(_enabled)
+			{
+				try
+				{
+					_log.information(msg);
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
 		}
-	}
-		
-  /** Returns true if at least the given log level is set.
-   *  @param level The logging level it is best to use the Logger::Priority enum (7=debug, 6=information, 4=warning, 3=error, 2=critical, 1=fatal)
-   */
-	bool Logger::is(int level) const
-	{
-		bool retVal = false;
-		try
-		{
-			retVal = _log.is(level);
-		} 
-		catch (std::exception& e)
-		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
-		}
-		return retVal;
-	}
-
-  /** This class implements an ostream interface to the Logger for fatal messages.
-	*
-	* The stream's buffer appends all characters written to it
-	* to a string. As soon as a CR or LF (std::endl) is written,
-	* the string is sent to the Logger.
-	* @returns an std::ostream reference.
-	*/
-	std::ostream& Logger::fatal()
-	{
-		return _logStream->fatal();
-	}
-
-	/** This class implements an ostream interface to the Logger for error messages.
-	*
-	* The stream's buffer appends all characters written to it
-	* to a string. As soon as a CR or LF (std::endl) is written,
-	* the string is sent to the Logger.
-	* @returns an std::ostream reference.
-	*/
-	std::ostream& Logger::error()
-	{
-		return _logStream->error();
-	}
-
-	/** This class implements an ostream interface to the Logger for warning messages.
-	*
-	* The stream's buffer appends all characters written to it
-	* to a string. As soon as a CR or LF (std::endl) is written,
-	* the string is sent to the Logger.
-	* @returns an std::ostream reference.
-	*/
-	std::ostream& Logger::warning()
-	{
-		return _logStream->warning();
-	}
-
-	/** This class implements an ostream interface to the Logger for information messages.
-	*
-	* The stream's buffer appends all characters written to it
-	* to a string. As soon as a CR or LF (std::endl) is written,
-	* the string is sent to the Logger.
-	* @returns an std::ostream reference.
-	*/
-	std::ostream& Logger::information()
-	{
-		return _logStream->information();
-	}
-
-	/** This class implements an ostream interface to the Logger for debug messages.
-	*
-	* The stream's buffer appends all characters written to it
-	* to a string. As soon as a CR or LF (std::endl) is written,
-	* the string is sent to the Logger.
-	* @returns an std::ostream reference.
-	*/
-	std::ostream& Logger::debug()
-	{
-		return _logStream->debug();
-	}
 
+		/** If the Logger's log level is at least PRIO_DEBUG, creates a Message with priority
+		*  PRIO_DEBUG and the given message text and sends it to the attached channel.
+		* 
+		*  @param msg The message to log.
+		*/
+		void Logger::debug(const std::string& msg)
+		{
+			if(_enabled)
+			{
+				try
+				{
+					_log.debug(msg);
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
+		}
 
-  /// Shuts down the logging framework and releases all Loggers.  
-	void Logger::shutdown()
-	{
-		try
+		/** Logs the given message at debug level, followed by the data in buffer.
+		* 
+		*  The data in buffer is written in canonical hex+ASCII form:
+		*  Offset (4 bytes) in hexadecimal, followed by sixteen space-separated, 
+		*  two column, hexadecimal bytes, followed by the same sixteen bytes as 
+		*  ASCII characters.
+		*  For bytes outside the range 32 .. 127, a dot is printed.  
+		*  Note all Dump messages go out at Debug message level
+		* 
+		*  @param msg The message to log
+		*  @param buffer the binary data to log
+		*  @param length The length of the binaary data to log
+		*/
+		void Logger::dump(const std::string& msg, const void* buffer, std::size_t length)
+		{
+			if(_enabled)
+			{
+				try
+				{
+					_log.dump(msg,buffer,length);
+				} 
+				catch (std::exception& e)
+				{
+					//failures in logging are not allowed to throw exceptions out of the logging class
+					std::cerr << e.what();
+				}
+			}
+		}
+
+		/** Returns true if at least the given log level is set.
+		*  @param level The logging level it is best to use the Logger::Priority enum (7=debug, 6=information, 4=warning, 3=error, 2=critical, 1=fatal)
+		*/
+		bool Logger::is(int level) const
 		{
-			Poco::Logger::shutdown();
-		} 
-		catch (std::exception& e)
+			bool retVal = false;
+			try
+			{
+				retVal = _log.is(level);
+			} 
+			catch (std::exception& e)
+			{
+				//failures in logging are not allowed to throw exceptions out of the logging class
+				std::cerr << e.what();
+			}
+			return retVal;
+		}
+
+		void Logger::setLevel(int level)
 		{
-			//failures in logging are not allowed to throw exceptions out of the logging class
-			std::cerr << e.what();
+			try
+			{
+				_log.setLevel(level);
+			} 
+			catch (std::exception& e)
+			{
+				//failures in logging are not allowed to throw exceptions out of the logging class
+				std::cerr << e.what();
+			}
 		}
-	}
 
-  /** Returns a reference to the Logger with the given name.
-   *  If the Logger does not yet exist, it is created, based on its parent logger.
-   * 
-   *  @param name The name of the logger to use - this is usually the class name. 
-   */
-	Logger& Logger::get(const std::string& name)
-	{
-		Logger* pLogger = new Logger(name);
-		return *pLogger;
-	}
+		void Logger::setLevel(const std::string& level)
+		{
+			try
+			{
+				_log.setLevel(level);
+			} 
+			catch (std::exception& e)
+			{
+				//failures in logging are not allowed to throw exceptions out of the logging class
+				std::cerr << e.what();
+			}
+		}
+
+		int Logger::getLevel() const
+		{
+			return _log.getLevel();
+		}
+
+		Poco::LogStream* Logger::getStream()
+		{
+			return _enabled?_logStream:_nullStream;
+		}
+
+		/** This class implements an ostream interface to the Logger for fatal messages.
+		*
+		* The stream's buffer appends all characters written to it
+		* to a string. As soon as a CR or LF (std::endl) is written,
+		* the string is sent to the Logger.
+		* @returns an std::ostream reference.
+		*/
+		std::ostream& Logger::fatal()
+		{
+			return getStream()->fatal();
+		}
+
+		/** This class implements an ostream interface to the Logger for error messages.
+		*
+		* The stream's buffer appends all characters written to it
+		* to a string. As soon as a CR or LF (std::endl) is written,
+		* the string is sent to the Logger.
+		* @returns an std::ostream reference.
+		*/
+		std::ostream& Logger::error()
+		{
+			return getStream()->error();
+		}
+
+		/** This class implements an ostream interface to the Logger for warning messages.
+		*
+		* The stream's buffer appends all characters written to it
+		* to a string. As soon as a CR or LF (std::endl) is written,
+		* the string is sent to the Logger.
+		* @returns an std::ostream reference.
+		*/
+		std::ostream& Logger::warning()
+		{
+			return getStream()->warning();
+		}
+
+		/** This class implements an ostream interface to the Logger for notice messages.
+		*
+		* The stream's buffer appends all characters written to it
+		* to a string. As soon as a CR or LF (std::endl) is written,
+		* the string is sent to the Logger.
+		* @returns an std::ostream reference.
+		*/
+		std::ostream& Logger::notice()
+		{
+			return getStream()->notice();
+		}
+
+		/** This class implements an ostream interface to the Logger for information messages.
+		*
+		* The stream's buffer appends all characters written to it
+		* to a string. As soon as a CR or LF (std::endl) is written,
+		* the string is sent to the Logger.
+		* @returns an std::ostream reference.
+		*/
+		std::ostream& Logger::information()
+		{
+			return getStream()->information();
+		}
+
+		/** This class implements an ostream interface to the Logger for debug messages.
+		*
+		* The stream's buffer appends all characters written to it
+		* to a string. As soon as a CR or LF (std::endl) is written,
+		* the string is sent to the Logger.
+		* @returns an std::ostream reference.
+		*/
+		std::ostream& Logger::debug()
+		{
+			return getStream()->debug();
+		}
+
+		/** releases resources and deletes this object.
+		*/
+		void Logger::release()
+		{
+			delete(this);
+		}
+
+		/** Deletes the logger and clears it from the cache.
+		* 
+		*  @param name The logger to destroy. 
+		*/
+		void Logger::destroy(Logger& logger)
+		{
+			Poco::Mutex::ScopedLock lock(m_ListMtx);
+
+			if (m_LoggerList)
+			{
+				LoggerList::iterator it = m_LoggerList->find(&logger);
+				if (it != m_LoggerList->end())
+				{
+					delete(*it);
+					m_LoggerList->erase(it);
+				}
+			}
+		}
+
+		/// Shuts down the logging framework and releases all Loggers.  
+		void Logger::shutdown()
+		{
+			Poco::Mutex::ScopedLock lock(m_ListMtx);
+			try
+			{
+				//first release the POCO loggers
+				Poco::Logger::shutdown();
+
+				//now delete our static cache of loggers
+				if (m_LoggerList)
+				{
+					for (LoggerList::iterator it = m_LoggerList->begin(); it != m_LoggerList->end(); ++it)
+					{
+						delete(*it);
+					}
+					delete m_LoggerList;
+					m_LoggerList = 0;
+				}
+			} 
+			catch (std::exception& e)
+			{
+				//failures in logging are not allowed to throw exceptions out of the logging class
+				std::cerr << e.what();
+			}
+		}
+
+		/** Returns a reference to the Logger with the given name.
+		*  This logger is stored until in a static list until it is destroyed, released or Logger::shutdown is called.
+		* 
+		*  @param name The name of the logger to use - this is usually the class name. 
+		*/
+		Logger& Logger::get(const std::string& name)
+		{
+			Logger* pLogger = new Logger(name);
+			if (!m_LoggerList)
+				m_LoggerList = new LoggerList;
+			m_LoggerList->insert(pLogger);
+
+			return *pLogger;
+		}
 
 
-} // namespace Kernel
+	} // namespace Kernel
 } // Namespace Mantid
 
diff --git a/Code/Mantid/Kernel/test/ConfigServiceTest.h b/Code/Mantid/Kernel/test/ConfigServiceTest.h
index 6d7279a666129b2cb823671db2d7369a2a3fd009..61c800066a9362f787e3ec9cc25be3ebd33c22c3 100644
--- a/Code/Mantid/Kernel/test/ConfigServiceTest.h
+++ b/Code/Mantid/Kernel/test/ConfigServiceTest.h
@@ -6,6 +6,8 @@
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/Logger.h"
 #include "Poco/Path.h"
+#include "boost/shared_ptr.hpp"
+#include "TestChannel.hh"
 #include <string>
 
 using namespace Mantid::Kernel;
@@ -26,6 +28,7 @@ public:
 
 	  TS_ASSERT_THROWS_NOTHING(log1.debug("a debug string"));
 	  TS_ASSERT_THROWS_NOTHING(log1.information("an information string"));
+	  TS_ASSERT_THROWS_NOTHING(log1.information("a notice string"));
 	  TS_ASSERT_THROWS_NOTHING(log1.warning("a warning string"));
 	  TS_ASSERT_THROWS_NOTHING(log1.error("an error string"));
 	  TS_ASSERT_THROWS_NOTHING(log1.fatal("a fatal string"));
@@ -34,17 +37,40 @@ public:
 		log1.fatal()<<"A fatal message from the stream operators " << 4.5 << std::endl;
 		log1.error()<<"A error message from the stream operators " << -0.2 << std::endl;
 		log1.warning()<<"A warning message from the stream operators " << 999.99 << std::endl;
+		log1.notice()<<"A notice message from the stream operators " << 0.0 << std::endl;
 		log1.information()<<"A information message from the stream operators " << -999.99 << std::endl;
 		log1.debug()<<"A debug message from the stream operators " << 5684568 << std::endl;
+
+
 	  );
 
 	  //checking the level - this should be set to debug in the config file
 	  //therefore this should only return false for debug
 	  TS_ASSERT(log1.is(Logger::PRIO_DEBUG) == false); //debug
 	  TS_ASSERT(log1.is(Logger::PRIO_INFORMATION)); //information
+	  TS_ASSERT(log1.is(Logger::PRIO_NOTICE)); //information
 	  TS_ASSERT(log1.is(Logger::PRIO_WARNING)); //warning
 	  TS_ASSERT(log1.is(Logger::PRIO_ERROR)); //error
 	  TS_ASSERT(log1.is(Logger::PRIO_FATAL)); //fatal
+  }
+
+	void testEnabled()
+  {
+	  //attempt some logging
+	  Logger& log1 = Logger::get("logTestEnabled");
+		TS_ASSERT(log1.getEnabled());
+	  TS_ASSERT_THROWS_NOTHING(log1.fatal("a fatal string with enabled=true"));
+		TS_ASSERT_THROWS_NOTHING(log1.fatal()<<"A fatal message from the stream operators with enabled=true " << 4.5 << std::endl;);
+		
+		TS_ASSERT_THROWS_NOTHING(log1.setEnabled(false));
+		TS_ASSERT(!log1.getEnabled());
+		TS_ASSERT_THROWS_NOTHING(log1.fatal("YOU SHOULD NEVER SEE THIS"));
+		TS_ASSERT_THROWS_NOTHING(log1.fatal()<<"YOU SHOULD NEVER SEE THIS VIA A STREAM" << std::endl;);
+		
+		TS_ASSERT_THROWS_NOTHING(log1.setEnabled(true));
+		TS_ASSERT(log1.getEnabled());
+		TS_ASSERT_THROWS_NOTHING(log1.fatal("you are allowed to see this"));
+		TS_ASSERT_THROWS_NOTHING(log1.fatal()<<"you are allowed to see this via a stream" << std::endl;);
 
   }