diff --git a/Console/Doxyfile b/Console/Doxyfile
index 0a359ce2f07d082e0ddd8b99cb261f389c556384..1fd99b49da9ea51fc33dc22f9cdccd8c69ff362a 100644
--- a/Console/Doxyfile
+++ b/Console/Doxyfile
@@ -7,4 +7,5 @@ ALPHABETICAL_INDEX = NO
 TAGFILES = \
     "$(TOPDIR)/Socket/doc/Socket.tag" \
     "$(TOPDIR)/Scheduler/doc/Scheduler.tag" \
-    "$(TOPDIR)/Utils/doc/Utils.tag"
+    "$(TOPDIR)/Utils/doc/Utils.tag" \
+    "$(TOPDIR)/Utils/Logger/doc/Logger.tag"
diff --git a/Console/Executor.hh b/Console/Executor.hh
index 93071acbeb2c0ddd61443022cee52ab86006098c..d089083113176b545e54b723f1d97ea88ea801e1 100644
--- a/Console/Executor.hh
+++ b/Console/Executor.hh
@@ -65,7 +65,8 @@ namespace console {
 
         typedef boost::iterator_range< ParseCommandInfo::argument_iterator> Arguments;
 
-        struct ExitException {};        ///< Thrown by built-in 'exit' command
+        /// Thrown by built-in 'exit' command
+        struct ExitException {};        
 
         ///////////////////////////////////////////////////////////////////////////
         //\/name Structors and default members
diff --git a/Console/Node.hh b/Console/Node.hh
index cf484036d4a675f5e552abbf45661a8b9f58bb22..c3911ffa8808986b30853e69f9fc6b5ca4c2ba54 100644
--- a/Console/Node.hh
+++ b/Console/Node.hh
@@ -143,6 +143,7 @@ namespace console {
 
         typedef typename boost::remove_reference<result_type>::type NodeType;
 
+        /// Internal
         struct Creator {
             static NodeType & create(DirectoryNode & node, std::string const & name, 
                                      Object const & ob);
diff --git a/Console/ObjectDirectory.hh b/Console/ObjectDirectory.hh
index 1f26bef732db364dffd23cf9a8ad9ec1ed9d3fa8..bb8008f10167f3b07212dc429c4452554f6b9164 100644
--- a/Console/ObjectDirectory.hh
+++ b/Console/ObjectDirectory.hh
@@ -53,6 +53,7 @@ namespace console {
 
         typedef typename boost::remove_reference<result_type>::type NodeType;
 
+        /// Internal
         struct Creator {
             static NodeType & create(DirectoryNode & node, Owner & owner, 
                                      std::string const & name, Object const & ob);
diff --git a/Console/Parse.cc b/Console/Parse.cc
index bf49f31aed9347be78ca60f6a7bd21b6eb7c39e9..c06a2bc9b9f42a9b0f1cd47844dc765e5c2f27bf 100644
--- a/Console/Parse.cc
+++ b/Console/Parse.cc
@@ -41,6 +41,8 @@ namespace senf {
 namespace console {
 namespace detail {
 
+#ifndef DOXYGEN
+
     struct ParserAccess
     {
         static void init(ParseCommandInfo & info)
@@ -149,11 +151,15 @@ namespace detail {
             }
     };
 
+#endif
+
 }}}
 
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::ParseCommandInfo
 
+#ifndef DOXYGEN
+
 struct senf::console::ParseCommandInfo::MakeRange
 {
     typedef ParseCommandInfo::argument_value_type result_type;
@@ -168,6 +174,8 @@ struct senf::console::ParseCommandInfo::MakeRange
     }
 };
 
+#endif
+
 prefix_ void senf::console::ParseCommandInfo::finalize()
 {
     arguments_.resize( tempArguments_.size() );
@@ -211,6 +219,8 @@ prefix_ std::ostream & senf::console::operator<<(std::ostream & stream,
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::CommandParser
 
+#ifndef DOXYGEN
+
 struct senf::console::CommandParser::Impl
 {
     typedef detail::CommandGrammar<detail::ParseDispatcher> Grammar;
@@ -222,6 +232,8 @@ struct senf::console::CommandParser::Impl
     Impl() : dispatcher(), context(), grammar(dispatcher, context) {}
 };
 
+#endif
+
 prefix_ senf::console::CommandParser::CommandParser()
     : impl_ (new Impl())
 {}
diff --git a/Console/Server.cc b/Console/Server.cc
index 4e37e68c403709ed6e4bbbf92b53716ccfeba385..eb1fac130c6eccb52b2392c1d356c42f979405c7 100644
--- a/Console/Server.cc
+++ b/Console/Server.cc
@@ -102,11 +102,13 @@ prefix_ void senf::console::Server::removeClient(Client & client)
 // senf::console::Client
 
 prefix_ senf::console::Client::Client(ClientHandle handle, std::string const & name)
-    : handle_ (handle), name_ (name), out_(::dup(handle.fd()))
+    : out_t(::dup(handle.fd())), senf::log::IOStreamTarget(out_t::member),
+      handle_ (handle), name_ (name), promptLen_(0)
 {
     showPrompt();
     ReadHelper<ClientHandle>::dispatch( handle_, 16384u, ReadUntil("\n"),
                                         senf::membind(&Client::clientData, this) );
+    route< senf::SenfLog, senf::log::NOTICE >();
 }
 
 prefix_ senf::console::Client::~Client()
@@ -120,6 +122,7 @@ prefix_ void senf::console::Client::stopClient()
 
 prefix_ void senf::console::Client::clientData(ReadHelper<ClientHandle>::ptr helper)
 {
+    promptLen_ = 0;
     if (helper->error() || handle_.eof()) {
         // THIS COMMITS SUICIDE. THE INSTANCE IS GONE AFTER stopClient RETURNS
         stopClient();
@@ -131,8 +134,9 @@ prefix_ void senf::console::Client::clientData(ReadHelper<ClientHandle>::ptr hel
     boost::trim(data); // Gets rid of superfluous  \r or \n characters
 
     try {
-        if (! parser_.parse(data, boost::bind<void>(boost::ref(executor_), _1, boost::ref(out_))))
-            out_ << "syntax error" << std::endl;
+        if (! parser_.parse(data, boost::bind<void>(boost::ref(executor_), _1, 
+                                                    boost::ref(out_t::member))))
+            out_t::member << "syntax error" << std::endl;
     }
     catch (Executor::ExitException &) {
         // THIS COMMITS SUICIDE. THE INSTANCE IS GONE AFTER stopClient RETURNS
@@ -140,10 +144,10 @@ prefix_ void senf::console::Client::clientData(ReadHelper<ClientHandle>::ptr hel
         return;
     }
     catch (std::exception & ex) {
-        out_ << ex.what() << std::endl;
+        out_t::member << ex.what() << std::endl;
     }
     catch (...) {
-        out_ << "unidentified error (unknown exception thrown)" << std::endl;
+        out_t::member << "unidentified error (unknown exception thrown)" << std::endl;
     }
 
     showPrompt();
@@ -153,7 +157,21 @@ prefix_ void senf::console::Client::clientData(ReadHelper<ClientHandle>::ptr hel
 
 prefix_ void senf::console::Client::showPrompt()
 {
-    out_ << name_ << ":" << executor_.cwd().path() << "# " << std::flush;
+    std::string path (executor_.cwd().path());
+    out_t::member << name_ << ":" << path << "# " << std::flush;
+    promptLen_ = name_.size() + 1 + path.size() + 1;
+}
+
+prefix_ void senf::console::Client::v_write(boost::posix_time::ptime timestamp,
+                                            std::string const & stream,
+                                            std::string const & area, unsigned level,
+                                            std::string const & message)
+{
+    if (promptLen_)
+        out_t::member << '\r' << std::string(' ', promptLen_) << '\r';
+    IOStreamTarget::v_write(timestamp, stream, area, level, message);
+    if (promptLen_)
+        showPrompt();
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
diff --git a/Console/Server.hh b/Console/Server.hh
index 685eae2a4a8ef9ea2648ec98bc47ba1a277d9e6e..26092fa4d65c431cf24fc677c7f8c10ae16a72ef 100644
--- a/Console/Server.hh
+++ b/Console/Server.hh
@@ -41,6 +41,7 @@
 #include "Parse.hh"
 #include "Executor.hh"
 #include "../Socket/Protocols/INet/INetAddressing.hh"
+#include "../Utils/Logger.hh"
 
 //#include "Server.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
@@ -113,10 +114,17 @@ namespace console {
         \fixme Make output non-blocking (use a non-blocking/discarding streambuf) and possibly set
             socket send buffer size
         \fixme Don't register a new ReadHelper every round
+        \fixme Ensure, that output errors (or any errors) in the console don't terminate the
+            application
      */
     class Client
-        : public senf::intrusive_refcount
+        : public senf::intrusive_refcount, 
+          private boost::base_from_member< boost::iostreams::stream<boost::iostreams::file_descriptor_sink> >,
+          public senf::log::IOStreamTarget
     {
+        typedef boost::base_from_member< 
+            boost::iostreams::stream<boost::iostreams::file_descriptor_sink> > out_t;
+
         SENF_LOG_CLASS_AREA();
         SENF_LOG_DEFAULT_LEVEL( senf::log::NOTICE );
     public:
@@ -134,15 +142,17 @@ namespace console {
 
         void clientData(ReadHelper<ClientHandle>::ptr helper);
         void showPrompt();
+
+        virtual void v_write(boost::posix_time::ptime timestamp, std::string const & stream, 
+                             std::string const & area, unsigned level, 
+                             std::string const & message);
         
         ClientHandle handle_;
         std::string tail_;
         CommandParser parser_;
         Executor executor_;
         std::string name_;
-
-        typedef boost::iostreams::stream<boost::iostreams::file_descriptor_sink> fdostream;
-        fdostream out_;
+        unsigned promptLen_;
 
         friend class Server;
     };
diff --git a/Utils/Logger/IOStreamTarget.cc b/Utils/Logger/IOStreamTarget.cc
index dbf4454fcfa6e77e512295ec39342fb6d29ecfc6..0d798bbb56a2621757a35decb859e37d34ccc2e8 100644
--- a/Utils/Logger/IOStreamTarget.cc
+++ b/Utils/Logger/IOStreamTarget.cc
@@ -73,8 +73,8 @@ prefix_ void senf::log::IOStreamTarget::v_write(boost::posix_time::ptime timesta
         stream_ << timestamp << sep;
         stream_ << "[" << LEVELNAMES_[level] << "]";
         if (area != "senf::log::DefaultArea")
-            stream_ << "[" << area << "] ";
-        stream_ << *i << "\n";
+            stream_ << "[" << area << "]";
+        stream_ << " " << *i << "\n";
         sep = '-';
     }
     stream_ << std::flush;
diff --git a/Utils/Logger/IOStreamTarget.hh b/Utils/Logger/IOStreamTarget.hh
index 7e4900bae9d373c63e73463392bf9d1ce6e5a6e9..2a2763a266ebb4a8033b2ee5f6741db0de54640b 100644
--- a/Utils/Logger/IOStreamTarget.hh
+++ b/Utils/Logger/IOStreamTarget.hh
@@ -73,12 +73,11 @@ namespace log {
         ///////////////////////////////////////////////////////////////////////////
 
     protected:
-
-    private:
         void v_write(boost::posix_time::ptime timestamp, std::string const & stream, 
                      std::string const & area, unsigned level, 
                      std::string const & message);
 
+    private:
         std::ostream & stream_;
         static char const * const LEVELNAMES_[8];
     };
diff --git a/Utils/Logger/Target.cc b/Utils/Logger/Target.cc
index 9740cec659e51942b1446dacfef410fd7a71920a..91d231e98ed78fb25c0b9357e541cc8e57b0ac1e 100644
--- a/Utils/Logger/Target.cc
+++ b/Utils/Logger/Target.cc
@@ -45,8 +45,8 @@ prefix_ senf::log::Target::Target()
 prefix_ senf::log::Target::~Target()
 {
     while( ! rib_.empty()) {
-        // This is terribly slow but simplifies the area cache handling and removing a target should
-        // be quite seldom
+        // This is slow but simplifies the area cache handling and removing a target should be
+        // relatively seldom
         RIB::reverse_iterator i (rib_.rbegin());
         unroute(i->stream_, i->area_, i->level_, i->action_);
     }