diff --git a/SConstruct b/SConstruct
index 6a98c7d5f1ed3f0b446041609b2be87f13af97af..50a148e4d5da3b2e182f262523562792504b9636 100644
--- a/SConstruct
+++ b/SConstruct
@@ -14,7 +14,7 @@ env = SENFSCons.MakeEnvironment()
 # Configure build
 env.Append(
    CPPPATH = [ '#' ],
-   LIBS = [ 'iberty' ],
+   LIBS = [ 'iberty', '$BOOSTREGEXLIB' ],
    DOXY_XREF_TYPES = [ 'bug', 'fixme', 'todo', 'idea' ],
    DOXY_HTML_XSL = '#/doclib/html-munge.xsl',
    ENV = { 'TODAY' : str(datetime.date.today()),
diff --git a/Socket/Protocols/DVB/DVBDemuxHandles.hh b/Socket/Protocols/DVB/DVBDemuxHandles.hh
index 4253abc4344986f5bdfd6d5fde59dd30a9ec4a4f..15093fc74478492a9e35b9c6b0d0f95e54753425 100644
--- a/Socket/Protocols/DVB/DVBDemuxHandles.hh
+++ b/Socket/Protocols/DVB/DVBDemuxHandles.hh
@@ -71,6 +71,7 @@ namespace senf {
 
         ///@}
         ///\name Abstract Interface Implementation
+        ///@{
         
         unsigned available() const;
 
@@ -105,6 +106,7 @@ namespace senf {
 
         ///@}
         ///\name Abstract Interface Implementation
+        ///@{
         
         unsigned available() const;
 
@@ -141,16 +143,18 @@ namespace senf {
 
         ///@}
         ///\name Abstract Interface Implementation
+        ///@{
         
         unsigned available() const;
 
         std::auto_ptr<SocketProtocol> clone() const;
-
+        
         ///@}
-   
      };
 
      typedef ProtocolClientSocketHandle<DVBDvrProtocol> DVBDvrHandle;
+
+    ///@}
     
 }
 
diff --git a/Socket/Protocols/DVB/DVBFrontendHandle.hh b/Socket/Protocols/DVB/DVBFrontendHandle.hh
index 219a6158c5ce0ab003fdb70645a4b2af9fbeeec4..c1f628c56a2a01e76b8c931c3168831fa40f141a 100644
--- a/Socket/Protocols/DVB/DVBFrontendHandle.hh
+++ b/Socket/Protocols/DVB/DVBFrontendHandle.hh
@@ -72,6 +72,7 @@ namespace senf {
 
         ///@}
         ///\name Abstract Interface Implementation
+        ///@{
         
         unsigned available() const;
         bool eof() const;
@@ -85,6 +86,7 @@ namespace senf {
 
     typedef ProtocolClientSocketHandle<DVBFrontendProtocol> DVBFrontendHandle;
 
+    ///@}
 }
 
 
diff --git a/Socket/Protocols/GenericSockAddr.hh b/Socket/Protocols/GenericSockAddr.hh
index 6cbc70686f8f0554e4d2271d80bc814ec4ced7ed..66d4fa9774636d58b27d057163ace131140c15e2 100644
--- a/Socket/Protocols/GenericSockAddr.hh
+++ b/Socket/Protocols/GenericSockAddr.hh
@@ -27,16 +27,13 @@
 
     To support the core socket functionality we need a collection of classing providing addressing
     for the different protocols.
+    
+    For all standard BSD socket protocols we base the address classes on the corresponding \c
+    sockaddr structures, wrapped into appropriate C++ adapters. These Address classes are based on
+    GenericSockAddr, the corresponding addressing policy is defined in GenericAddressingPolicy.
 
-    Every Address Implementation used with the standard policy classes Has to have a set of minimum
-    members. These members are documented in GenericSockAddr. However, these members are \e neither
-    abstract \e nor virtual and other address classes do \e not inherit from GenericSockAddr. The
-    address classes are not usable polymorphically for performance reasons.
-
-    The interface defined above forces the implementation to be directly based on the corresponding
-    sockaddr data structures provided by the BSD socket API. These structures however are wrapped
-    into more flexible and more easy to use classes. Using the sockaddr representation increases the
-    performance since any intermediarre conversions are skipped.
+    You are however not limit to BSD type socket address classes as long as you implement the
+    corresponding addressing policy.
  */
 
 #ifndef HH_GenericSockAddr_
diff --git a/Socket/Protocols/INet/INet4Address.hh b/Socket/Protocols/INet/INet4Address.hh
index d7b13a1ffae5aeed878fd3a10d0f8a47af4365e1..d00fb8667d11a34d8b671e615b7cf5d45f7edc96 100644
--- a/Socket/Protocols/INet/INet4Address.hh
+++ b/Socket/Protocols/INet/INet4Address.hh
@@ -43,6 +43,7 @@ namespace senf {
         container/sequence of 4 bytes.
 
         \todo Add additional classes for CIDR addresses and networks and network math.
+        \ingroup addr_group
       */
     class INet4Address
         : public boost::array<boost::uint8_t,4>, 
diff --git a/Socket/Protocols/INet/INet6Address.hh b/Socket/Protocols/INet/INet6Address.hh
index 48a2906d8bdc9fda1280a2534ff3bdc2b0fb958b..c40e7ccb375bcedae4d2b2f9a39b9850a3ae6059 100644
--- a/Socket/Protocols/INet/INet6Address.hh
+++ b/Socket/Protocols/INet/INet6Address.hh
@@ -78,6 +78,9 @@ namespace senf {
 
         The INet6Address class is based on \c boost::array and is built as a fixed-size sequence of
         16 bytes.
+
+        \see CheckINet6Network Helper to check address against an arbitrary fixed network prefix
+        \ingroup addr_group
      */
     class INet6Address
         : public boost::array<boost::uint8_t,16>,
diff --git a/Socket/Protocols/INet/INetAddressing.cc b/Socket/Protocols/INet/INetAddressing.cc
index 9ef8c39d8e7ec15e8a683ead5a67a91574f05641..41c0f923409d32ff0905e6c72f86415c691ad7d4 100644
--- a/Socket/Protocols/INet/INetAddressing.cc
+++ b/Socket/Protocols/INet/INetAddressing.cc
@@ -33,8 +33,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <boost/lexical_cast.hpp>
-#include <boost/tokenizer.hpp>
-#include <boost/range.hpp>
+#include <boost/regex.hpp>
 
 //#include "INetAddressing.mpp"
 #define prefix_
@@ -94,17 +93,6 @@ prefix_ void senf::INet6SocketAddress::clear()
     sockaddr_.sin6_family = AF_INET6;
 }
 
-prefix_ std::string senf::INet6SocketAddress::address()
-    const
-{
-    std::stringstream ss;
-    ss << '[' << host();
-    if (sockaddr_.sin6_scope_id != 0)
-        ss << '@' << iface()
-    << "]:" << port();
-    return ss.str();
-}
-
 prefix_ std::string senf::INet6SocketAddress::iface()
     const
 {
@@ -117,42 +105,28 @@ prefix_ std::string senf::INet6SocketAddress::iface()
 
 prefix_ void senf::INet6SocketAddress::assignAddr(std::string const & addr)
 {
-    // Format of addr: "[" address [ "@" interface ] "]" ":" port
-    typedef boost::char_separator<char> separator;
-    typedef boost::tokenizer<separator> tokenizer;
-    // we don't add ':' to the list of separators since that would give as the IPv6 address
-    // as a list of tokens. We just strip the : from the port number manually
-    separator sep ("", "@[]");
-    tokenizer tokens (addr, sep);
-    tokenizer::iterator token (tokens.begin());
-    if (token == tokens.end()
-        || *token != "["
-        || ++token == tokens.end()
-        || inet_pton(AF_INET6, std::string(boost::begin(*token),boost::end(*token)).c_str(),
-                     &sockaddr_.sin6_addr) <= 0
-        || ++token == tokens.end())
-        throw SyntaxException();
-    if (*token == "@") {
-        if (++token == tokens.end())
-            throw SyntaxException();
-        assignIface(std::string(boost::begin(*token),boost::end(*token)));
-        if (++token == tokens.end()
-            || *token != "]")
-            throw SyntaxException();
-    } else if (*token != "]")
-        throw SyntaxException();
-    if (++token == tokens.end()
-        || *boost::begin(*token) != ':')
-        throw SyntaxException();
-    try {
-        sockaddr_.sin6_port = htons(
-            boost::lexical_cast<unsigned>(std::string(boost::next(boost::begin(*token)),
-                                                      boost::end(*token))));
-    } catch(boost::bad_lexical_cast const &) {
-        throw SyntaxException();
-    }
-    if (++token != tokens.end())
+    // Format of addr: "[" address [ "%" interface ] "]" ":" port
+    //             or: host ":" port
+
+    static boost::regex const addressRx ("(?:\\[([a-f0-9A-F:]+)(?:%(.+))?\\]|(.+)):([0-9]+)");
+    // Subexpression numbers:
+    enum { NumericAddr = 1,
+           ZoneId      = 2,
+           Hostname    = 3,
+           Port        = 4 };
+    
+    boost::smatch match;
+    if (! regex_match(addr, match, addressRx))
         throw SyntaxException();
+
+    INet6Address a (INet6Address::from_string(
+                        match[NumericAddr].matched ? match[NumericAddr] : match[Hostname]));
+    std::copy(a.begin(), a.end(), &sockaddr_.sin6_addr.s6_addr[0]);
+
+    if (match[ZoneId].matched)
+        assignIface(match[ZoneId]);
+
+    sockaddr_.sin6_port = htons(boost::lexical_cast<boost::uint16_t>(match[Port]));
 }
 
 prefix_ void senf::INet6SocketAddress::assignIface(std::string const & iface)
diff --git a/Socket/Protocols/INet/INetAddressing.cci b/Socket/Protocols/INet/INetAddressing.cci
index f053e1db8b73b7ea6101ad8cc19cd6391a855f4d..320e8eeda3852fe46c7926865e3677b2d3e48f90 100644
--- a/Socket/Protocols/INet/INetAddressing.cci
+++ b/Socket/Protocols/INet/INetAddressing.cci
@@ -110,12 +110,6 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr)
     assignAddr(addr);
 }
 
-prefix_ senf::INet6SocketAddress::INet6SocketAddress(char const * addr)
-{
-    clear();
-    assignAddr(addr);
-}
-
 prefix_ senf::INet6SocketAddress::INet6SocketAddress(INet6Address const & addr, unsigned port)
 {
     clear();
@@ -140,13 +134,13 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr,
     assignIface(iface);
 }
 
-prefix_ senf::INet6Address senf::INet6SocketAddress::host()
+prefix_ senf::INet6Address senf::INet6SocketAddress::address()
     const
 {
     return INet6Address::from_data(&sockaddr_.sin6_addr.s6_addr[0]);
 }
 
-prefix_ void senf::INet6SocketAddress::host(INet6Address const & addr)
+prefix_ void senf::INet6SocketAddress::address(INet6Address const & addr)
 {
     std::copy(addr.begin(), addr.end(), &sockaddr_.sin6_addr.s6_addr[0]);
 }
@@ -186,7 +180,11 @@ prefix_ unsigned senf::INet6SocketAddress::sockaddr_len()
 
 prefix_ std::ostream & senf::operator<<(std::ostream & os, INet6SocketAddress const & addr)
 {
-    os << addr.address();
+    os << '[' << addr.address();
+    std::string iface (addr.iface());
+    if (! iface.empty())
+        os << '%' << iface;
+    os << "]:" << addr.port();
     return os;
 }
 
diff --git a/Socket/Protocols/INet/INetAddressing.hh b/Socket/Protocols/INet/INetAddressing.hh
index 7d01b0a87f80a75586ac3bcdb1cff79cef749e98..e3a95d337488171c156bc6a5ee1ced265f159d1b 100644
--- a/Socket/Protocols/INet/INetAddressing.hh
+++ b/Socket/Protocols/INet/INetAddressing.hh
@@ -44,9 +44,6 @@
 
 namespace senf {
 
-    /// \addtogroup addr_group
-    /// @{
-
     /** \brief IPv4 socket address
 
         INet4Address wraps the standard sockaddr_in datatype. It provides simple accessor methods
@@ -54,6 +51,8 @@ namespace senf {
         
         \implementation This implementation is based on sockaddr_in, which is needed since it needs
             to provide a non-const struct sockaddr * for legacy compatibility.
+
+        \ingroup addr_group
      */
     class INet4SocketAddress
         : public boost::equality_comparable<INet4SocketAddress>, 
@@ -117,37 +116,32 @@ namespace senf {
 
         This class wraps the standard \c sockaddr_in6 structure. INet6SocketAddress provides access
         to all members of the sockaddr_in6 structure. Additionally, INet6SocketAddress supports the
-        string representation
+        string representations
 
-        \par "" <tt>[</tt> <i>address</i> [ <tt>\@</tt> <i>interface</i> ] <tt>]:</tt> <i>port</i>
+        \par ""
+            <tt>[</tt> <i>address</i> [ <tt>%</tt> <i>zone-id</i> ] <tt>]:</tt> <i>port</i> \n
+            <i>hostname</i> <tt>:</tt> <i>port</i>
 
-        Where \e address is an arbitrary numeric IPv6 address, \e interface is an optional network
-        interface name and \e port is the port number. The interface specification is only valid if
-        \e address is link-local address. The URL representation of an IPv6 address is as above
-        without the optional interface spec.
-
-        INet6SocketAddress supports conversion constructors from it's string
-        representation. Therefore, wherever a INet6SocketAddress instance is expected, a string may
-        be used instead.
+        Where \e address is an arbitrary numeric IPv6 address, \e zone-id is an optional network
+        interface name and \e port is the port number. So some example addresses are
+        
+        \par ""
+            <tt>[2001:db8:1::1]:80</tt> \n
+            <tt>www.6bone.net:80</tt> \n
+            <tt>[fe80::1\%eth0]:443</tt>
 
         \implementation The sockaddr_in6 structure has an sin6_flowinfo member. However RFC3493 does
             not give the use of this field and specifies, that the field should be ignored ... so
             that's what we do. Furthermore, the GNU libc reference states, that this field is not
             implemented in the library.
 
-        \implementation We need to return the address in host() by value since we need to return a
-            INet6Address. However, sockaddr_in6 does not have one ...
-
-        \implementation The <tt>char const *</tt> constructor overload is needed to support
-            string-literals where an INet6SocketAddress is expected (the C++ standard does not allow
-            chaining conversion constructors like <tt>char const *</tt> -> \c std::string -> \c
-            INet6SocketAddress)
-
         \idea Implement a INet6Address_ref class which has an interface identical to INet6Address
-        and is convertible to INet6Address (the latter has a conversion constructor taking the
-        former as arg). This class however references an external in6_addr instead of containing one
-        itself. This can be used in INet6SocketAddress to increase the performance of some
-        operations.
+            and is convertible to INet6Address (the latter has a conversion constructor taking the
+            former as arg). This class however references an external in6_addr instead of containing
+            one itself. This can be used in INet6SocketAddress to increase the performance of some
+            operations.
+
+        \ingroup addr_group
      */
     class INet6SocketAddress
     {
@@ -160,9 +154,8 @@ namespace senf {
         ///@{
 
         INet6SocketAddress();           ///< Create empty instance
-        INet6SocketAddress(std::string const & addr);
+        explicit INet6SocketAddress(std::string const & addr);
                                         ///< Initialize/convert from string representation
-        INet6SocketAddress(char const * addr); ///< Same as above to support string literals
         INet6SocketAddress(INet6Address const & addr, unsigned port);
                                         ///< Initialize from address and port
         INet6SocketAddress(INet6Address const & addr, unsigned port, std::string const & iface);
@@ -178,10 +171,9 @@ namespace senf {
 
         void clear();                   ///< Clear socket address
 
-        std::string address() const;    ///< Get printable address representation
+        INet6Address address() const;    ///< Get printable address representation
 
-        INet6Address host() const;      ///< Get address
-        void host(INet6Address const & addr); ///< Change address
+        void address(INet6Address const & addr); ///< Change address
 
         unsigned port() const;          ///< Get port number
         void port(unsigned poirt);      ///< Change port number
@@ -212,11 +204,10 @@ namespace senf {
     };
 
     /** \brief Output INet6SocketAddress instance as it's string representation
+        \related INet6SocketAddress
      */
     std::ostream & operator<<(std::ostream & os, INet6SocketAddress const & addr);
 
-    /// @}
-
     /// \addtogroup policy_impl_group
     /// @{
 
diff --git a/Socket/Protocols/INet/INetAddressing.test.cc b/Socket/Protocols/INet/INetAddressing.test.cc
index 102b95d9c63d5cddd30f11a955085ac3c42282cb..e512761638e84be7bbe54a51f10f1502f9e4ffa0 100644
--- a/Socket/Protocols/INet/INetAddressing.test.cc
+++ b/Socket/Protocols/INet/INetAddressing.test.cc
@@ -85,41 +85,44 @@ BOOST_AUTO_UNIT_TEST(inet6SocketAddress)
 
     {
         INet6SocketAddress addr;
-        BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr.host()), "::" );
+        BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr.address()), "::" );
         BOOST_CHECK_EQUAL( addr.port(), 0u );
         BOOST_CHECK_EQUAL( addr.iface(), "" );
-        addr = "[12::21]:12345";
-        BOOST_CHECK_EQUAL( addr.host(), INet6Address::from_string("12::21") );
+        addr = senf::INet6SocketAddress("[12::21]:12345");
+        BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("12::21") );
         BOOST_CHECK_EQUAL( addr.port(), 12345u );
         BOOST_CHECK_EQUAL( addr.iface(), "" );
         BOOST_CHECK_EQUAL( addr, INet6SocketAddress("[12::21]:12345") );
+        BOOST_CHECK_NO_THROW( INet6SocketAddress("www.6bone.net:80") );
     }
 
     {
         INet6SocketAddress addr (INet6Address::from_string("::1"), 1);
-        BOOST_CHECK_EQUAL( addr, "[::1]:1" );
+        BOOST_CHECK_EQUAL( addr,senf::INet6SocketAddress("[::1]:1") );
         BOOST_CHECK_EQUAL( addr.iface(), "" );
     }
 
     {
         INet6SocketAddress addr (INet6Address::Loopback, 1, "lo");
-        BOOST_CHECK_EQUAL( addr, "[::1@lo]:1" );
+        BOOST_CHECK_EQUAL( addr, senf::INet6SocketAddress("[::1%lo]:1") );
         BOOST_CHECK_EQUAL( addr.iface(), "lo" );
         addr.iface("");
         BOOST_CHECK_EQUAL( addr.iface(), "" );
         addr.port(100u);
         BOOST_CHECK_EQUAL( addr.port(), 100u );
-        addr.host(INet6Address::from_string("::2"));
-        BOOST_CHECK_EQUAL( addr.host(), INet6Address::from_string("::2") );
-        BOOST_CHECK_THROW( addr = "", INet6SocketAddress::SyntaxException );
-        BOOST_CHECK_THROW( addr = "[::1]", INet6SocketAddress::SyntaxException );
-        BOOST_CHECK_THROW( addr = "[::1]1234", INet6SocketAddress::SyntaxException );
-        addr = "[12::21@lo]:12345";
-        BOOST_CHECK_EQUAL( addr.address(), "[12::21@lo]:12345" );
-        BOOST_CHECK_EQUAL( addr.host(), INet6Address::from_string("12::21") );
+        addr.address(INet6Address::from_string("::2"));
+        BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("::2") );
+        BOOST_CHECK_THROW( senf::INet6SocketAddress(""), INet6SocketAddress::SyntaxException );
+        BOOST_CHECK_THROW( senf::INet6SocketAddress("[::1]"), 
+                           INet6SocketAddress::SyntaxException );
+        BOOST_CHECK_THROW( senf::INet6SocketAddress("[::1]1234"), 
+                           INet6SocketAddress::SyntaxException );
+        addr = senf::INet6SocketAddress("[12::21%lo]:12345");
+        BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr), "[12::21%lo]:12345" );
+        BOOST_CHECK_EQUAL( addr.address(), INet6Address::from_string("12::21") );
         BOOST_CHECK_EQUAL( addr.port(), 12345u );
         BOOST_CHECK_EQUAL( addr.iface(), "lo" );
-        BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr), "[12::21@lo]:12345" );
+        BOOST_CHECK_EQUAL( boost::lexical_cast<std::string>(addr), "[12::21%lo]:12345" );
     }
 }
 
diff --git a/Socket/Protocols/INet/TCPSocketHandle.test.cc b/Socket/Protocols/INet/TCPSocketHandle.test.cc
index 25a476d7bd9cb8db272c388424b34cdca710b12a..6a120ee282f16c00c405fe61d72aa2f6f8cfa90f 100644
--- a/Socket/Protocols/INet/TCPSocketHandle.test.cc
+++ b/Socket/Protocols/INet/TCPSocketHandle.test.cc
@@ -229,18 +229,18 @@ BOOST_AUTO_UNIT_TEST(tcpv6ClientSocketHandle)
     {
         senf::TCPv6ClientSocketHandle sock;
 
-        BOOST_CHECK_THROW( sock.connect(senf::INet6SocketAddress("[::1]:12345")), senf::SystemException );
-        BOOST_CHECK_THROW( sock.protocol().connect("[::1]:12345"), senf::SystemException );
+        BOOST_CHECK_THROW( sock.connect(senf::INet6SocketAddress("[::1]:12345")), 
+                           senf::SystemException );
     }
 
     try {
         alarm(10);
         start(server_v6);
         senf::TCPv6ClientSocketHandle sock;
-        BOOST_CHECK_NO_THROW( sock.bind("[::1]:23456") );
-        BOOST_CHECK_NO_THROW( sock.connect("[::1]:12345") );
-        BOOST_CHECK( sock.peer() == "[::1]:12345" );
-        BOOST_CHECK( sock.local() == "[::1]:23456" );
+        BOOST_CHECK_NO_THROW( sock.bind(senf::INet6SocketAddress("[::1]:23456")) );
+        BOOST_CHECK_NO_THROW( sock.connect(senf::INet6SocketAddress("[::1]:12345")) );
+        BOOST_CHECK( sock.peer() == senf::INet6SocketAddress("[::1]:12345") );
+        BOOST_CHECK( sock.local() == senf::INet6SocketAddress("[::1]:23456") );
         BOOST_CHECK( sock.blocking() );
         BOOST_CHECK_NO_THROW( sock.rcvbuf(2048) );
         BOOST_CHECK_EQUAL( sock.rcvbuf(), 2048u );
@@ -368,7 +368,7 @@ BOOST_AUTO_UNIT_TEST(tcpv6ServerSocketHandle)
     try {
         alarm(10);
         BOOST_CHECKPOINT("Opening server socket");
-        senf::TCPv6ServerSocketHandle server ("[::1]:12347");
+        senf::TCPv6ServerSocketHandle server (senf::INet6SocketAddress("[::1]:12347"));
         BOOST_CHECKPOINT("Starting client");
         start(client_v6);
 
diff --git a/senfscons/SENFSCons.py b/senfscons/SENFSCons.py
index a4a3620cc1ed7a77fb1742542600fb0e045184c6..f111a7f1c9ddcd13b6ad461b44ab754de118c984 100644
--- a/senfscons/SENFSCons.py
+++ b/senfscons/SENFSCons.py
@@ -138,6 +138,7 @@ def FinalizeBoost(env):
         env['BOOST_VARIANT'] = "-" + env['BOOST_TOOLSET'] + runtime
 
     env['BOOSTTESTLIB'] = 'libboost_unit_test_framework' + env['BOOST_VARIANT']
+    env['BOOSTREGEXLIB'] = 'libboost_regex' + env['BOOST_VARIANT']
 
     env.Append(LIBPATH = [ '$BOOST_LIBDIR' ],
                CPPPATH = [ '$BOOST_INCLUDES' ])