diff --git a/PPI/SocketSink.cti b/PPI/SocketSink.cti
index b7482eb13f55e528213344e6f3c95fdf6dea8e76..07dba5b124992c356842b7fdee025802aa8e7317 100644
--- a/PPI/SocketSink.cti
+++ b/PPI/SocketSink.cti
@@ -30,6 +30,42 @@
 #define prefix_ inline
 ///////////////////////////////cti.p///////////////////////////////////////
 
+///////////////////////////////////////////////////////////////////////////
+// senf::ppi::TargetDgramWriter<HandleType>
+
+template <class HandleType>
+prefix_ senf::ppi::TargetDgramWriter<HandleType>::TargetDgramWriter()
+{}
+
+template <class HandleType>
+prefix_ senf::ppi::TargetDgramWriter<HandleType>::
+TargetDgramWriter(typename Handle::Address const & target)
+: target_ (target)
+{}
+
+template <class HandleType>
+prefix_ typename senf::ppi::TargetDgramWriter<HandleType>::Handle::Address
+senf::ppi::TargetDgramWriter<HandleType>::target()
+    const
+{
+    return target_;
+}
+
+template <class HandleType>
+prefix_ void
+senf::ppi::TargetDgramWriter<HandleType>::target(typename Handle::Address const & target)
+{
+    target_ = target;
+}
+
+template <class HandleType>
+prefix_ void senf::ppi::TargetDgramWriter<HandleType>::operator()(Handle handle,
+                                                                  Packet const & packet)
+{
+    if (target_)
+        handle.writeto(target_, packet.data());
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::ppi::module::ActiveSocketSink<Writer>
 
diff --git a/PPI/SocketSink.hh b/PPI/SocketSink.hh
index 83a1d5f196ae914759baefa806cc78222c002207..e87b66fe620d4db05aab914777a1d21505bfb005 100644
--- a/PPI/SocketSink.hh
+++ b/PPI/SocketSink.hh
@@ -65,6 +65,24 @@ namespace ppi {
                                              \param[in] packet Packet to write */
     };
 
+    template <class HandleType>
+    class TargetDgramWriter
+    {
+    public:
+        typedef HandleType Handle;
+
+        TargetDgramWriter();
+        TargetDgramWriter(typename Handle::Address const & target);
+
+        typename Handle::Address target() const;
+        void target(typename Handle::Address const & target);
+
+        void operator()(Handle handle, Packet const & packet);
+
+    private:
+        typename Handle::Address target_;
+    };
+
     class IPv4SourceForcingDgramWriter : ConnectedDgramWriter
     {
     public:
diff --git a/Scheduler/EventManager.cc b/Scheduler/EventManager.cc
index 30ac6d20875ed9a2f357dfeb894265f576cf2631..d267a1ee818515d206ed5b42d31fdee64e64f3de 100644
--- a/Scheduler/EventManager.cc
+++ b/Scheduler/EventManager.cc
@@ -39,7 +39,7 @@
 prefix_ senf::scheduler::detail::EventManager::EventManager()
 {
 #ifndef SENF_DISABLE_CONSOLE
-    consoleDir_().add("events", senf::membind(&EventManager::consoleEvents, this))
+    consoleDir_().add("events", senf::membind(&EventManager::listEvents, this))
         .doc("List all scheduler events sorted by priority\n"
              "\n"
              "Columns:\n"
@@ -61,7 +61,7 @@ prefix_ senf::scheduler::detail::EventManager::EventManager()
 #endif
 }
 
-prefix_ void senf::scheduler::detail::EventManager::consoleEvents(std::ostream & os)
+prefix_ void senf::scheduler::detail::EventManager::listEvents(std::ostream & os)
 {
     // On an 80 column display, this wraps nicely directly before the INFO column
     boost::format fmt  ("%s %-55.55s 0x%08x %8d %s %s\n");
diff --git a/Scheduler/EventManager.hh b/Scheduler/EventManager.hh
index 75865563998756fd5777ea131ca41b078b05570d..099ebae7d97d896c99575a3ca9736eb2055bdb57 100644
--- a/Scheduler/EventManager.hh
+++ b/Scheduler/EventManager.hh
@@ -105,6 +105,8 @@ namespace detail {
         iterator begin() const;
         iterator end() const;
 
+        void listEvents(std::ostream & os);
+
     protected:
 
     private:
@@ -115,8 +117,6 @@ namespace detail {
         friend class singleton<EventManager>;
 
 #ifndef SENF_DISABLE_CONSOLE
-        void consoleEvents(std::ostream & os);
-        
         console::LazyDirectory consoleDir_;
 #endif
     };
diff --git a/Socket/NetdeviceController.cc b/Socket/NetdeviceController.cc
index 345679b382bf6974cf6e3b32dc9ce109c3ea3dad..b514904ba5378ac49c8b624153a278839812eddd 100644
--- a/Socket/NetdeviceController.cc
+++ b/Socket/NetdeviceController.cc
@@ -136,6 +136,33 @@ prefix_ void senf::NetdeviceController::promisc(bool mode)
     doIoctl( ifr, SIOCSIFFLAGS);
 }
 
+prefix_ bool senf::NetdeviceController::isUp()
+    const
+{
+    struct ifreq ifr;
+    ifrName(ifr);
+    doIoctl(ifr, SIOCGIFFLAGS);
+    return ifr.ifr_flags & IFF_UP;
+}
+
+prefix_ void senf::NetdeviceController::up()
+{
+    struct ifreq ifr;
+    ifrName(ifr);
+    doIoctl(ifr, SIOCGIFFLAGS);
+    ifr.ifr_flags |= IFF_UP;
+    doIoctl(ifr, SIOCSIFFLAGS);
+}
+
+prefix_ void senf::NetdeviceController::down()
+{
+    struct ifreq ifr;
+    ifrName(ifr);
+    doIoctl(ifr, SIOCGIFFLAGS);
+    ifr.ifr_flags &= ~IFF_UP;
+    doIoctl(ifr, SIOCSIFFLAGS);
+}
+
 prefix_ int senf::NetdeviceController::interfaceIndex()
     const
 {
diff --git a/Socket/NetdeviceController.hh b/Socket/NetdeviceController.hh
index db7c5cf2a1bf945c145000502ce04475f12d9948..ed74c18f86bdb1ff0401844176b117913a5179b5 100644
--- a/Socket/NetdeviceController.hh
+++ b/Socket/NetdeviceController.hh
@@ -84,7 +84,11 @@ namespace senf {
         bool promisc() const;           ///< return \c true if interface is in promiscuous mode
         void promisc(bool mode);        ///< enable/disable promiscuous mode of the interface
                                         /**< Note, that this is a privileged operation. */
-                
+
+        bool isUp() const;              ///< return \c true if interface is up
+        void up();                      ///< ifconfig up interface
+        void down();                    ///< ifconfig down interface
+
     private:
         void openSocket();
         void doIoctl(ifreq& ifr, int request) const;
diff --git a/Utils/Daemon/Daemon.cc b/Utils/Daemon/Daemon.cc
index 8cbf98fbbfb6d72fdb0e0b597ae83bcd3ee7adea..1b6e8ae9a62817b28f81fc36a462ebb24c579745 100644
--- a/Utils/Daemon/Daemon.cc
+++ b/Utils/Daemon/Daemon.cc
@@ -132,17 +132,19 @@ prefix_ void senf::Daemon::openLog()
                   << " Could not open \"" << stdoutLog_ << "\" for redirecting stdout.";
         stdout_ = fd;
     }
-    if (stderrLog_ == stdoutLog_) {
-        stderr_ = ::dup(fd);
-        if (stderr_ < 0)
-            SENF_THROW_SYSTEM_EXCEPTION("::dup()");
-    } 
-    else if (! stderrLog_.empty()) {
-        fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
-        if (fd < 0)
-            SENF_THROW_SYSTEM_EXCEPTION("")
-                  << " Could not open \"" << stderrLog_ << "\" for redirecting stderr.";
-        stderr_ = fd;
+    if (! stderrLog_.empty()) {
+        if (stderrLog_ == stdoutLog_) {
+            stderr_ = ::dup(fd);
+            if (stderr_ < 0)
+                SENF_THROW_SYSTEM_EXCEPTION("::dup()");
+        } 
+        else {
+            fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
+            if (fd < 0)
+                SENF_THROW_SYSTEM_EXCEPTION("")
+                    << " Could not open \"" << stderrLog_ << "\" for redirecting stderr.";
+            stderr_ = fd;
+        }
     }
 }
 
@@ -369,14 +371,17 @@ prefix_ void senf::Daemon::fork()
     LIBC_CALL( ::sigaddset, (&cldsig, SIGCHLD) );
     LIBC_CALL( ::sigprocmask, (SIG_BLOCK, &cldsig, &oldsig) );
 
-    if (! senf::scheduler::empty() )
+    if (! senf::scheduler::empty() ) {
         std::cerr << 
             "\n"
             "*** WARNING ***\n"
             "Scheduler not empty before fork(). THIS MUST NOT HAPPEN.\n"
-            "The scheduler will be reinitialized by the fork() and lose all registrations.\n"
-            "*** WARNING ***\n"
+            "The scheduler will be reinitialized by the fork() and lose all registrations.\n\n";
+        senf::scheduler::detail::EventManager::instance().listEvents(std::cerr);
+        std::cerr <<
+            "\n*** WARNING ***\n"
             "\n";
+    }
     
     LIBC_CALL_RV( pid, ::fork, () );