[vdr-plugin-fritzbox] 04/10: Imported Upstream version 1.5.3

Tobias Grimm tiber-guest at moszumanska.debian.org
Sat Feb 14 15:24:09 UTC 2015


This is an automated email from the git hooks/post-receive script.

tiber-guest pushed a commit to branch master
in repository vdr-plugin-fritzbox.

commit f9294e89f415f6ba19487edc5adad047f9dcd20b
Author: etobi <git at e-tobi.net>
Date:   Sat Feb 14 16:10:21 2015 +0100

    Imported Upstream version 1.5.3
---
 HISTORY                                            |   7 +
 Makefile                                           | 121 +--
 README                                             |   4 +-
 README.de                                          |   4 +-
 README => README.md                                |  84 +-
 fritzbox.c => fritzbox.cpp                         |  46 +-
 fritzbox.h                                         |   7 +-
 fritzeventhandler.c => fritzeventhandler.cpp       |   9 +-
 fritzeventhandler.h                                |   8 +-
 libconv++/CharsetConverter.cpp                     | 100 +++
 .../FritzFonbook.h => libconv++/CharsetConverter.h |  32 +-
 libconv++/EntityConverter.cpp                      | 177 +++++
 .../Nummerzoeker.h => libconv++/EntityConverter.h  |  24 +-
 libconv++/Makefile                                 |  25 +
 libfritz++/CMakeLists.txt                          |  26 +-
 libfritz++/CallList.cpp                            |  60 +-
 libfritz++/CallList.h                              |  25 +-
 libfritz++/Config.cpp                              |  26 +-
 libfritz++/Config.h                                |  42 +-
 libfritz++/Fonbook.cpp                             | 259 ++----
 libfritz++/Fonbook.h                               |  78 +-
 libfritz++/FonbookManager.cpp                      | 109 +--
 libfritz++/FonbookManager.h                        |  44 +-
 libfritz++/Fonbooks.cpp                            |   9 +-
 libfritz++/FritzClient.cpp                         | 324 ++++----
 libfritz++/FritzClient.h                           |  30 +-
 libfritz++/FritzFonbook.cpp                        |  58 +-
 libfritz++/FritzFonbook.h                          |  14 +-
 libfritz++/HISTORY                                 |   9 +
 libfritz++/HttpClient.cpp                          |  92 ---
 libfritz++/HttpClient.h                            |  47 --
 libfritz++/Listener.cpp                            | 106 +--
 libfritz++/Listener.h                              |  29 +-
 libfritz++/LocalFonbook.cpp                        |  51 +-
 libfritz++/LocalFonbook.h                          |   8 +-
 libfritz++/LookupFonbook.cpp                       |  14 +-
 libfritz++/LookupFonbook.h                         |  12 +-
 libfritz++/Makefile                                |  34 +-
 libfritz++/Nummerzoeker.cpp                        |  28 +-
 libfritz++/Nummerzoeker.h                          |   2 +-
 libfritz++/OertlichesFonbook.cpp                   |  24 +-
 libfritz++/OertlichesFonbook.h                     |   2 +-
 libfritz++/TcpClient.cpp                           |  40 -
 libfritz++/TelLocalChFonbook.cpp                   |  47 +-
 libfritz++/TelLocalChFonbook.h                     |   2 +-
 libfritz++/Tools.cpp                               | 145 +---
 libfritz++/Tools.h                                 |  81 --
 libfritz++/XmlFonbook.cpp                          |  65 +-
 libfritz++/XmlFonbook.h                            |  10 +-
 libfritz++/cc++/mime.cpp                           | 170 ----
 libfritz++/cc++/mime.h                             | 239 ------
 libfritz++/cc++/readme.txt                         |   3 -
 libfritz++/cc++/soap.cpp                           |  66 --
 libfritz++/cc++/soap.h                             |  63 --
 libfritz++/cc++/url.cpp                            | 871 ---------------------
 libfritz++/cc++/url.h                              | 552 -------------
 libfritz++/cc++/urlstring.cpp                      | 317 --------
 log.c => liblog++/CustomLogStream.cpp              |  46 +-
 log.h => liblog++/CustomLogStream.h                |  44 +-
 liblog++/Log.cpp                                   |  83 ++
 liblog++/Log.h                                     |  62 ++
 liblog++/Makefile                                  |  25 +
 libnet++/HttpClient.cpp                            | 187 +++++
 libnet++/HttpClient.h                              |  58 ++
 libnet++/Makefile                                  |  25 +
 {libfritz++ => libnet++}/SoapClient.cpp            |  22 +-
 {libfritz++ => libnet++}/SoapClient.h              |  14 +-
 libnet++/TcpClient.cpp                             |  76 ++
 {libfritz++ => libnet++}/TcpClient.h               |  19 +-
 menu.c => menu.cpp                                 |  69 +-
 notifyosd.c => notifyosd.cpp                       |   1 +
 po/de_DE.po                                        | 319 ++++----
 po/fr_FR.po                                        | 329 ++++----
 po/it_IT.po                                        | 323 ++++----
 po/ru_RU.po                                        | 327 ++++----
 po/tr_TR.po                                        | 301 ++++---
 setup.c => setup.cpp                               |  34 +-
 setup.h                                            |  12 +-
 78 files changed, 2612 insertions(+), 4645 deletions(-)

diff --git a/HISTORY b/HISTORY
index 829f0df..10e111e 100644
--- a/HISTORY
+++ b/HISTORY
@@ -690,6 +690,13 @@ VDR Plugin 'fritzbox' Revision History
 - Show call information during complete ringing phase
   Fixes #1189 [VDR], reported by speed [55]
   
+2013-12-01: Version 1.5.3
+- New dependency boost::asio, dropped dependency to commoncpp
+- Fix resolve in TelLocalChFonbook
+- Add support for username authentication: new setup option
+  Fixes #1385 [VDR]
+- Fix some warning about unused parameters
+
   
 --- References ---
 
diff --git a/Makefile b/Makefile
index d2ba9ca..553e911 100644
--- a/Makefile
+++ b/Makefile
@@ -8,26 +8,33 @@
 # By default the main source file also carries this name.
 
 PLUGIN = fritzbox
-	
+
 ### The version number of this plugin (taken from the main source file):
 
-VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
+VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).cpp | awk '{ print $$6 }' | sed -e 's/[";]//g')
+
+### The directory environment:
 
 # Use package data if installed...otherwise assume we're under the VDR source directory:
 PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
-LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
-LOCDIR = $(DESTDIR)$(call PKGCFG,locdir)
-TMPDIR = /tmp
+LIBDIR = $(call PKGCFG,libdir)
+LOCDIR = $(call PKGCFG,locdir)
+PLGCFG = $(call PKGCFG,plgcfg)
+#
+TMPDIR ?= /tmp
 
 ### The compiler options:
+
 export CFLAGS   = $(call PKGCFG,cflags)
 export CXXFLAGS = $(call PKGCFG,cxxflags)
 
-### The version number of VDR's plugin API (taken from VDR's "config.h"):
+### The version number of VDR's plugin API:
 
 APIVERSION = $(call PKGCFG,apiversion)
-DOXYFILE = Doxyfile
-DOXYGEN  = doxygen
+
+### Allow user defined options to overwrite defaults:
+
+-include $(PLGCFG)
 
 ### The name of the distribution archive:
 
@@ -35,97 +42,113 @@ ARCHIVE = $(PLUGIN)-$(VERSION)
 PACKAGE = vdr-$(ARCHIVE)
 
 ### The name of the shared object file:
+
 SOFILE = libvdr-$(PLUGIN).so
 
 ### Includes and Defines (add further entries here):
 
-DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
+INCLUDES +=
 
-### libfritz++
-LIBFRITZ = libfritz++
-INCLUDES += -I$(LIBFRITZ)
-LIBS += $(LIBFRITZ)/$(LIBFRITZ).a -lgcrypt -lccgnu2
+DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
 ### The object files (add further files here):
 
-OBJS = $(PLUGIN).o fritzeventhandler.o log.o menu.o notifyosd.o setup.o	
+OBJS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+### Static libraries
+
+LIBS = libfritz++/libfritz++.a libnet++/libnet++.a liblog++/liblog++.a libconv++/libconv++.a
+
+STATIC_LIB_DIRS = $(dir $(LIBS))
+STATIC_LIBS     = $(LIBS:%=$(CURDIR)/%)
+CXXFLAGS       += -I$(CURDIR) -std=c++11
+LDFLAGS        += -lboost_system -lboost_thread -lboost_regex -lpthread -lgcrypt
+export STATIC_LIBS CXXFLAGS LDFLAGS
+
+### Tests
+
+TEST_DIRS       = $(wildcard $(addsuffix test,$(dir $(LIBS)))) $(wildcard test)
 
 ### Internationalization (I18N):
 
 PODIR     = po
 I18Npo    = $(wildcard $(PODIR)/*.po)
 I18Nmo    = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
-I18Nmsgs  = $(addprefix $(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
+I18Nmsgs  = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
 I18Npot   = $(PODIR)/$(PLUGIN).pot
 
+### Phony targets
+
+.PHONY: all install i18n clean test $(STATIC_LIB_DIRS) $(TEST_DIRS)
+
 ### Targets:
-all: $(SOFILE) i18n test $(LIBFRITZ)
 
-libvdr-$(PLUGIN).so: $(OBJS) $(LIBFRITZ) 
-	$(CXX) $(CXXFLAGS) -shared $(OBJS) $(LIBS) -o $@
-	ar ru libvdr-$(PLUGIN).a $(OBJS)
+all: $(SOFILE) i18n
+
+$(SOFILE): $(OBJS) $(LIBS)
+	$(CXX) $(CXXFLAGS) -shared $(OBJS) $(LIBS) $(LDFLAGS) -o $@
+
+%.a: $(STATIC_LIB_DIRS)
+	@
+
+$(STATIC_LIB_DIRS): 
+	@$(MAKE) -C $@ $(@:/=).a
+
+%.o: %.cpp
+	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
 
 install-lib: $(SOFILE)
-	install -D $^ $(LIBDIR)/$^.$(APIVERSION)
+	install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
 
 install: install-lib install-i18n
 
-$(LIBFRITZ):
-	@$(MAKE) -C $(LIBFRITZ)
-	
-%.o: %.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
+test: $(STATIC_LIB_DIRS) $(TEST_DIRS)
+
+$(TEST_DIRS): 
+	@$(MAKE) -C $@
 
-dist: clean
+dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
 	@mkdir $(TMPDIR)/$(ARCHIVE)
 	@cp -a * $(TMPDIR)/$(ARCHIVE)
+	@rm -rf $(TMPDIR)/$(ARCHIVE)/lib*/.git
+	@rm -rf $(TMPDIR)/$(ARCHIVE)/test
+	@rm -rf $(TMPDIR)/$(ARCHIVE)/lib*/test
 	@tar czf $(PACKAGE).tgz --exclude=.* --exclude=test --exclude=test.old --exclude=*.launch -C $(TMPDIR) $(ARCHIVE)
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
 	@echo Distribution package created as $(PACKAGE).tgz
 
 clean:
+	@$(foreach LIB,$(STATIC_LIB_DIRS),$(MAKE) -C $(LIB) clean;)
+	@$(foreach DIR,$(TEST_DIRS),$(MAKE) -C $(DIR) clean;)
 	@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
-	@-rm -f $(OBJS) $(DEPFILE) *.so *.a *.tgz core* *~
-	@-make -C $(LIBFRITZ) clean
-	@-make -C test clean
-	
+	@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
+
+### I18n targets
+
 %.mo: %.po
 	msgfmt -c -o $@ $<
 
-$(I18Npot): $(wildcard *.c) $(wildcard libfritz++/*.cpp)
-	xgettext -C -cTRANSLATORS --no-wrap -s --no-location -k -ktr -ktrNOOP -kI18N_NOOP \
-	         --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<vdr at joachim-wilke.de>' -o $@ `ls $^`
-	grep -v POT-Creation $(I18Npot) > $(I18Npot)~
-	mv $(I18Npot)~ $(I18Npot)
+$(I18Npot): $(wildcard *.cpp)
+	mkdir -p $(PODIR)
+	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
 
 %.po: $(I18Npot)
 	msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
 	@touch $@
 
-$(I18Nmsgs): $(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
 	install -D -m644 $< $@
 
 i18n: $(I18Nmo) $(I18Npot)
 
 install-i18n: $(I18Nmsgs)
 
-test:
-	@-make -C test
-
-srcdoc:
-	@cp $(DOXYFILE) $(DOXYFILE).tmp
-	@echo PROJECT_NUMBER = $(VERSION) >> $(DOXYFILE).tmp
-	$(DOXYGEN) $(DOXYFILE).tmp
-	@rm $(DOXYFILE).tmp
-
-.PHONY: i18n test $(LIBFRITZ)
-				
-# Dependencies:
+### Dependencies:
 
 MAKEDEP = $(CXX) -MM -MG
 DEPFILE = .dependencies
 $(DEPFILE): Makefile
-	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
+	@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.cpp) > $@
 
 -include $(DEPFILE)
diff --git a/README b/README
index b3b0a92..b6c4322 100644
--- a/README
+++ b/README
@@ -3,9 +3,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
 Written by:                  Joachim Wilke <vdr at joachim-wilke.de>
                              Matthias Becker <becker.matthias at gmail.com>
 
-Project's homepage:          http://www.joachim-wilke.de
+Project's homepage:          https://github.com/jowi24/vdr-fritz
 
-Latest version available at: http://www.joachim-wilke.de/vdr-fritz.htm
+Latest version available at: https://github.com/jowi24/vdr-fritz/releases
 
 See the file COPYING for license information.
 
diff --git a/README.de b/README.de
index 5447a76..e094f4e 100644
--- a/README.de
+++ b/README.de
@@ -3,9 +3,9 @@ Ein Plugin f
 Autoren:                     Joachim Wilke <vdr at joachim-wilke.de>
                              Matthias Becker <becker.matthias at gmail.com>
 
-Projektseite:                http://www.joachim-wilke.de
+Projektseite:                https://github.com/jowi24/vdr-fritz
 
-Download unter:              http://www.joachim-wilke.de/vdr-fritz.htm
+Download unter:              https://github.com/jowi24/vdr-fritz/releases
 
 Lizenzinformationen sind in der Datei COPYING enthalten.
 
diff --git a/README b/README.md
similarity index 56%
copy from README
copy to README.md
index b3b0a92..aa2db92 100644
--- a/README
+++ b/README.md
@@ -1,43 +1,43 @@
+# Overview
 This is a "plugin" for the Video Disk Recorder (VDR).
 
-Written by:                  Joachim Wilke <vdr at joachim-wilke.de>
-                             Matthias Becker <becker.matthias at gmail.com>
+Written by:
+* Joachim Wilke [vdr (at) joachim (minus) wilke (dot) de]
+* Matthias Becker [becker (dot) matthias (at) gmail (dot) com]
 
-Project's homepage:          http://www.joachim-wilke.de
+Project's homepage:          https://github.com/jowi24/vdr-fritz
 
-Latest version available at: http://www.joachim-wilke.de/vdr-fritz.htm
+Latest version available at: https://github.com/jowi24/vdr-fritz/releases
 
 See the file COPYING for license information.
 
 ** Note: The HISTORY file may contain information on new features, which are
-not yet documented in this READE. For up to date information also have a look 
+not yet documented in this README. For up to date information also have a look 
 in that file. **
 
---<----------------------------------------------------------------------------
+---
 
-Installation:
+# Installation
 
 The Fritz plugin is not very different from other plugins for VDR, most of the 
 common installation procedure for plugins, documented in VDR's core 
 documentation applies. However, the following build dependecies are required:
   - GCrypt library (libgcrypt)
-  - Gnu Common CPP library (libccgnu2, libccext2)
 
---<----------------------------------------------------------------------------
+---
 
-Description:
+# Description
 
-* Call notification
+## Call notification
 
 The Fritz!Box Plugin connects to the Fritz!Box to inform you about
 incoming and outgoing calls. As an option, the plugin can automatically mute
 VDR and pause replays when a call comes in or goes out.
 
-To enable this feature you have to dial "#96*5*" once with a telephone
-connected to the Fritz!Box. This works for all firmware versions 
->= xx.03.99
+To enable this feature you have to dial `#96*5*` once with a telephone
+connected to the Fritz!Box. This works for all firmware versions >= xx.03.99
 
-You may experience problems when trying to dial "#96*5*" with an ISDN 
+You may experience problems when trying to dial `#96*5*` with an ISDN 
 telephone. In such a case try to activate "auto keypad", "dial * and #" 
 or some similar setting in your ISDN telephone. If your ISDN telephone 
 contains no keypad support simply use an analogue telephone instead.
@@ -49,7 +49,7 @@ are supported.
 Configuration regarding call notification, muting and pausing is done
 in the plugin setup menu in VDR.
 
-* Phone book support
+## Phone book support
 
 The plugin supports multiple phonebooks. In the plugin's setup, you can 
 choose which phonebooks are used. The order matters with respect to number
@@ -64,59 +64,71 @@ menu you can browse this phone book and initiate calls out of it via the
 Fritz!Box web interface for this purpose. (In German the menu path is: 
 Telefonie > Anrufliste > W�hlhilfe) 
 
--> Fritz!Box phone book
+### Fritz!Box phone book
 
 This accesses the Fritz!Box phonebook stored on the box itself.
 
--> das-oertliche.de phone book
+### das-oertliche.de phone book
 
 This tries to resolve any number via the german website das-oertliche.de.
 As this is a lookup-only phonebook, it's entries cannot be displayed 
 in the main menu... ;-)
 
--> nummerzoeker phone book / tel.local.ch phone book
+### nummerzoeker phone book / tel.local.ch phone book
 
 Same as das-oertliche.de, but for numbers from the Netherlands and Switzerland.
 
-* Fritz!Box call list
+## Fritz!Box call list
 
 Via the colour buttons you can access three different call lists.
-Press [Green] to see the history of incoming calls. Use [Yellow] for the
-list of missed calls. Finally [Blue] gives you an overview on whom you 
+Press `[Green]` to see the history of incoming calls. Use `[Yellow]` for the
+list of missed calls. Finally `[Blue]` gives you an overview on whom you 
 called yourself.
 
-Pressing [OK] shows a separate page with details to the selected call.
+Pressing `[OK]` shows a separate page with details to the selected call.
 In this menu you can initiate calls, as in the phone book menu, by pressing
-[Red].
+`[Red]`.
 
---<----------------------------------------------------------------------------
+---
 
-Command line options:
+# Command line options
 
--> Privacy
+## Privacy
 
 This plugin logs status and debug information to system log (syslog). By default, 
 no sensitive information, like phone numbers or similar are logged. However, for
-debugging purposes, this can be enabled, by the '-p' parameter.
+debugging purposes, this can be enabled, by the `-p` parameter.
 
--> Running custom commands on call events
+### Running custom commands on call events
 
-Using the '-c cmd' parameter, a command or script 'cmd' can be specified, that
+Using the `-c cmd` parameter, a command or script 'cmd' can be specified, that
 is called when an incoming or outgoing call is initiated or finished. The plugin
 calls cmd with additional parameters depending on the type of event.
 * On incoming or outgoing calls:
-  - cmd CALL [OUT|IN] <connection_id> <remote_number> <remote_name> <local_party> <medium> <medium_name>
+  - `cmd CALL [OUT|IN] <connection_id> <remote_number> <remote_name> <local_party> <medium> <medium_name>`
 * On call connect:
-  - cmd CONNECT <connection_id>  
+  - `cmd CONNECT <connection_id>`
 * On call disconnect:
-  - cmd DISCONNECT <connection_id> <duration>
+  - `cmd DISCONNECT <connection_id> <duration>`
 * When all ongoing calls have been finished:
-  - cmd FINISHED
+  - `cmd FINISHED`
 A sample script is provided in template/on-call.sh.
 
---<----------------------------------------------------------------------------
+---
 
-Note: This Plugin has been tested with Fritz!Box Fon WLAN 7170 FW 29.04.29.
+# Screenshots
+
+[![Screenshot 1](https://jowi24.github.io/vdr-fritz/screenshot-fritz1.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz1.jpg)
+[![Screenshot 2](https://jowi24.github.io/vdr-fritz/screenshot-fritz2.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz2.jpg)
+[![Screenshot 1](https://jowi24.github.io/vdr-fritz/screenshot-fritz3.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz3.jpg)
+[![Screenshot 2](https://jowi24.github.io/vdr-fritz/screenshot-fritz4.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz4.jpg)
+[![Screenshot 1](https://jowi24.github.io/vdr-fritz/screenshot-fritz5.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz5.jpg)
+[![Screenshot 2](https://jowi24.github.io/vdr-fritz/screenshot-fritz6.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz6.jpg)
+[![Screenshot 1](https://jowi24.github.io/vdr-fritz/screenshot-fritz7.jpg)](https://jowi24.github.io/vdr-fritz/screenshot-fritz7.jpg)
+
+---
+
+Note: This Plugin has been tested with Fritz!Box Fon WLAN 7390 FW 06.20
 However it may also work for other models or firmware versions. For a detailed
 list see the plugin's homepage. If you have another model, either positive or 
 negative feedback is appreciated. 
diff --git a/fritzbox.c b/fritzbox.cpp
similarity index 89%
rename from fritzbox.c
rename to fritzbox.cpp
index 32bf4d8..15d1e27 100644
--- a/fritzbox.c
+++ b/fritzbox.cpp
@@ -23,15 +23,17 @@
 #include <unistd.h>
 #include <getopt.h>
 #include <vdr/remote.h>
-#include <FonbookManager.h>
-#include <Listener.h>
-#include <Config.h>
+#include <vdr/config.h>
+#include "libfritz++/FonbookManager.h"
+#include "libfritz++/Listener.h"
+#include "libfritz++/Config.h"
+#include "liblog++/Log.h"
 #include "fritzbox.h"
 #include "setup.h"
 #include "notifyosd.h"
 #include "menu.h"
 
-static const char *VERSION        = "1.5.2";
+static const char *VERSION        = "1.5.3";
 static const char *DESCRIPTION    = trNOOP("Fritz Plugin for AVM Fritz!Box");
 static const char *MAINMENUENTRY  = trNOOP("Fritz!Box");
 
@@ -44,6 +46,13 @@ cPluginFritzbox::cPluginFritzbox(void)
 	event = NULL;
 	logPersonalInfo = false;
 	migratePassword = false;
+
+	logger::Log::setPrefix("fritzbox");
+	logger::Log::setCustomLogger(
+		[](const std::string &message) { esyslog(message.c_str()); },
+		[](const std::string &message) { isyslog(message.c_str()); },
+		[](const std::string &message) { dsyslog(message.c_str()); }
+	);
 }
 
 cPluginFritzbox::~cPluginFritzbox()
@@ -107,13 +116,6 @@ bool cPluginFritzbox::Initialize(void)
 
 bool cPluginFritzbox::Start(void)
 {
-	// first enable logging to syslog
-	dlog = new cLogStream(LogBuf::DEBUG);
-	elog = new cLogStream(LogBuf::ERROR);
-	ilog = new cLogStream(LogBuf::INFO);
-	// use logging objects with libfritz++
-	fritz::Config::SetupLogging(dlog, ilog, elog);
-
 	event = new cFritzEventHandler(onCallCmd);
 	// start new thread for plugin initialization (may take some time)
 	cThread::Start();
@@ -136,12 +138,12 @@ void cPluginFritzbox::Stop(void)
 	fritz::Config::Shutdown();
 	if (event)
 		delete event;
-	if (dlog)
-		delete dlog;
-	if (ilog)
-		delete ilog;
-	if (elog)
-		delete elog;
+//	if (dlog)
+//		delete dlog;
+//	if (ilog)
+//		delete ilog;
+//	if (elog)
+//		delete elog;
 }
 
 void cPluginFritzbox::Housekeeping(void)
@@ -179,10 +181,10 @@ const char *cPluginFritzbox::MainMenuEntry(void)
 {
 	std::ostringstream ssMainMenuEntry;
 	ssMainMenuEntry << tr(MAINMENUENTRY);
-	fritz::CallList *callList = fritz::CallList::getCallList(false);
-	if (callList && callList->MissedCalls(fritzboxConfig.lastKnownMissedCall) > 0) {
-		std::string buffer = (callList->MissedCalls(fritzboxConfig.lastKnownMissedCall) > 1) ? tr("missed calls") : tr("missed call");
-		ssMainMenuEntry << " (" << callList->MissedCalls(fritzboxConfig.lastKnownMissedCall) << " " << buffer << ")";
+	fritz::CallList *callList = fritz::CallList::GetCallList(false);
+	if (callList && callList->missedCalls(fritzboxConfig.lastKnownMissedCall) > 0) {
+		std::string buffer = (callList->missedCalls(fritzboxConfig.lastKnownMissedCall) > 1) ? tr("missed calls") : tr("missed call");
+		ssMainMenuEntry << " (" << callList->missedCalls(fritzboxConfig.lastKnownMissedCall) << " " << buffer << ")";
 	}
 	mainMenuEntry = ssMainMenuEntry.str();
 	return fritzboxConfig.hideMainMenu ? NULL : mainMenuEntry.c_str();
@@ -246,7 +248,7 @@ cString cPluginFritzbox::SVDRPCommand(const char *Command, const char *Option, i
 void cPluginFritzbox::Action() {
 
 	// init libfritz++
-	fritz::Config::Setup(fritzboxConfig.url, fritzboxConfig.password, logPersonalInfo);
+	fritz::Config::Setup(fritzboxConfig.url, fritzboxConfig.username, fritzboxConfig.password, logPersonalInfo);
 	fritz::Config::Init(&fritzboxConfig.locationSettingsDetected, &fritzboxConfig.countryCode, &fritzboxConfig.regionCode);
 	fritz::Config::SetupConfigDir(fritzboxConfig.configDir);
 	fritz::Config::SetupMsnFilter(fritzboxConfig.msn);
diff --git a/fritzbox.h b/fritzbox.h
index c29ddee..b3ccd8a 100644
--- a/fritzbox.h
+++ b/fritzbox.h
@@ -24,11 +24,10 @@
 
 #include <vdr/plugin.h>
 #include <sstream>
-#include <Fonbook.h>
-#include <Listener.h>
-#include <CallList.h>
+#include "libfritz++/Fonbook.h"
+#include "libfritz++/Listener.h"
+#include "libfritz++/CallList.h"
 #include "fritzeventhandler.h"
-#include "log.h"
 
 class cPluginFritzbox : public cPlugin, cThread {
 	friend class cMenuSetupFritzbox;
diff --git a/fritzeventhandler.c b/fritzeventhandler.cpp
similarity index 97%
rename from fritzeventhandler.c
rename to fritzeventhandler.cpp
index d42c096..565c75d 100644
--- a/fritzeventhandler.c
+++ b/fritzeventhandler.cpp
@@ -25,7 +25,8 @@
 #include <vdr/shutdown.h>
 #include <vdr/thread.h>
 
-#include <Fonbook.h>
+#include "libfritz++/Fonbook.h"
+#include "liblog++/Log.h"
 #include "setup.h"
 #include "fritzeventhandler.h"
 #include "notifyosd.h"
@@ -135,7 +136,7 @@ bool cFritzEventHandler::CareForCall(bool outgoing) {
 	return true;
 }
 
-void cFritzEventHandler::HandleCall(bool outgoing, int connId,
+void cFritzEventHandler::handleCall(bool outgoing, int connId,
 		std::string remoteNumber, std::string remoteName,
 		fritz::FonbookEntry::eType remoteType, std::string localParty,
 		std::string medium, std::string mediumName) {
@@ -214,7 +215,7 @@ void cFritzEventHandler::HandleCall(bool outgoing, int connId,
 			                             << medium << " \"" << mediumName << "\"");
 }
 
-void cFritzEventHandler::HandleConnect(int connId) {
+void cFritzEventHandler::handleConnect(int connId) {
 	if (connections.find(connId) == connections.end())
 		return;
 	bool outgoing = connections[connId].callInfo->isOutgoing;
@@ -234,7 +235,7 @@ void cFritzEventHandler::HandleConnect(int connId) {
 		Exec(std::stringstream().flush() << onCallCmd << " CONNECT " << connId);
 }
 
-void cFritzEventHandler::HandleDisconnect(int connId, std::string duration) {
+void cFritzEventHandler::handleDisconnect(int connId, std::string duration) {
 	if (connections.find(connId) == connections.end())
 		return;
 	bool outgoing = connections[connId].callInfo->isOutgoing;
diff --git a/fritzeventhandler.h b/fritzeventhandler.h
index df709c9..5a918f2 100644
--- a/fritzeventhandler.h
+++ b/fritzeventhandler.h
@@ -26,7 +26,7 @@
 #include <map>
 #include <list>
 #include <vdr/thread.h>
-#include <Listener.h>
+#include "libfritz++/Listener.h"
 
 class cFritzEventHandler : public fritz::EventHandler {
 private:
@@ -60,9 +60,9 @@ public:
 	fritz::sCallInfo GetCallInfo(int connId);
 	void NotificationDone(int connId);
 	std::string ComposeCallMessage(int connId);
-	virtual void HandleCall(bool outgoing, int connId, std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType remoteType, std::string localParty, std::string medium, std::string mediumName);
-	virtual void HandleConnect(int connId);
-	virtual void HandleDisconnect(int connId, std::string duration);
+	virtual void handleCall(bool outgoing, int connId, std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType remoteType, std::string localParty, std::string medium, std::string mediumName) override;
+	virtual void handleConnect(int connId) override;
+	virtual void handleDisconnect(int connId, std::string duration) override;
 };
 
 #endif /* FRITZEVENTHANDLER_H_ */
diff --git a/libconv++/CharsetConverter.cpp b/libconv++/CharsetConverter.cpp
new file mode 100644
index 0000000..2e4a3aa
--- /dev/null
+++ b/libconv++/CharsetConverter.cpp
@@ -0,0 +1,100 @@
+/*
+ * libiconv++
+ *
+ * Copyright (C) 2012-2013 Joachim Wilke <libiconv at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include "CharsetConverter.h"
+
+#include <iconv.h>
+#include <langinfo.h>
+#include <sys/types.h>
+
+#include <vector>
+
+namespace convert {
+
+CharsetConverter::CharsetConverter(const std::string& fromEncoding, const std::string& toEncoding, bool ignoreError)
+: ignoreError{ignoreError} {
+	conv = iconv_open(toEncoding.length() ? toEncoding.c_str() : getDefaultCharset().c_str(), fromEncoding.c_str());
+	if (conv == (iconv_t)-1) {
+		if (errno == EINVAL)
+			throw std::runtime_error("Unsupported conversion from " + toEncoding + " to " + fromEncoding);
+		else
+			throw std::runtime_error("Unknown error initializing converter.");
+	}
+}
+
+CharsetConverter::~CharsetConverter() {
+	iconv_close(conv);
+}
+
+std::string CharsetConverter::convert(const std::string& input) const {
+	std::vector<char> inputBuffer(input.begin(), input.end());
+	char* srcPtr = &inputBuffer[0];
+	size_t srcSize = input.size();
+
+	std::vector<char> buf(2048);
+	std::string output;
+	while (0 < srcSize) {
+		char* dstPtr = &buf[0];
+		size_t dstSize = buf.size();
+		size_t res = iconv(conv, &srcPtr, &srcSize, &dstPtr, &dstSize);
+		if (res == (size_t)-1) {
+			if (errno == E2BIG)  {
+				// ignore this error
+			} else if (ignoreError) {
+				// skip character
+				++srcPtr;
+				--srcSize;
+			} else {
+				switch (errno) {
+				case EILSEQ:
+				case EINVAL:
+					throw std::runtime_error("Invalid multibyte chars.");
+				default:
+					throw std::runtime_error("Unknown error initializing converter.");
+				}
+			}
+		}
+		output.append(&buf[0], buf.size() - dstSize);
+	}
+	return output;
+}
+
+std::string CharsetConverter::ConvertToLocalEncoding(const std::string &input, const std::string &encoding)  {
+	CharsetConverter c(encoding);
+	return c.convert(input);
+}
+
+
+std::string CharsetConverter::getDefaultCharset() {
+	if (setlocale(LC_CTYPE, ""))
+		return nl_langinfo(CODESET);
+	char *langPtr = getenv("LANG");
+	if (langPtr) {
+		std::string lang(langPtr);
+		size_t pos = lang.find('.');
+		if (pos == std::string::npos)
+			return lang;
+		return lang.substr(pos+1);
+	}
+	return "UTF-8";
+}
+
+} /* namespace logger */
diff --git a/libfritz++/FritzFonbook.h b/libconv++/CharsetConverter.h
similarity index 59%
copy from libfritz++/FritzFonbook.h
copy to libconv++/CharsetConverter.h
index aa352d3..99d2b08 100644
--- a/libfritz++/FritzFonbook.h
+++ b/libconv++/CharsetConverter.h
@@ -1,7 +1,7 @@
 /*
- * libfritz++
+ * libiconv++
  *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
+ * Copyright (C) 2012-2013 Joachim Wilke <libiconv at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,28 +19,22 @@
  *
  */
 
-#ifndef FRITZFONBOOK_H
-#define FRITZFONBOOK_H
+#include <stdexcept>
 
-#include <cc++/thread.h>
+#include <iconv.h>
 
-#include "XmlFonbook.h"
+namespace convert {
 
-namespace fritz{
-
-class FritzFonbook : public ost::Thread, public XmlFonbook {
-			friend class FonbookManager;
+class CharsetConverter {
 private:
-	FritzFonbook();
-	void ParseHtmlFonbook(std::string *msg);
-	virtual void Write();
+	iconv_t conv;
+	bool ignoreError;
+	std::string getDefaultCharset();
 public:
-	virtual ~FritzFonbook();
-	bool Initialize();
-	void run();
-	void Reload();
+	CharsetConverter(const std::string& fromEncoding, const std::string& toEncoding = "", bool ignoreError = true);
+	~CharsetConverter();
+	std::string convert(const std::string& input) const;
+	static std::string ConvertToLocalEncoding(const std::string &input, const std::string &encoding);
 };
 
 }
-
-#endif /*FRITZFONBUCH_H_*/
diff --git a/libconv++/EntityConverter.cpp b/libconv++/EntityConverter.cpp
new file mode 100644
index 0000000..4c302bd
--- /dev/null
+++ b/libconv++/EntityConverter.cpp
@@ -0,0 +1,177 @@
+/*
+ * libiconv++
+ *
+ * Copyright (C) 2012-2013 Joachim Wilke <libiconv at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include "EntityConverter.h"
+
+#include <map>
+#include <sstream>
+#include <string.h>
+
+#include "CharsetConverter.h"
+
+namespace convert {
+
+const std::map<std::string, std::string> Entities = {
+	{" ",  " "},
+	{"¡", "¡"},
+	{"¢",  "¢"},
+	{"£", "£"},
+	{"¤","€"}, //krazy:exclude=spelling
+	{"¥",   "¥"},
+	{"¦","Š"},
+	{"§",  "§"},
+	{"¨",   "š"},
+	{"©",  "©"},
+	{"ª",  "ª"},
+	{"«", "«"},
+	{"¬",   "¬"},
+	{"­",   "­"},
+	{"®",   "®"},
+	{"¯",  "¯"},
+	{"°",   "°"},
+	{"±","±"},
+	{"&sup2;",  "²"},
+	{"&sup3;",  "³"},
+	{"´", "Ž"},
+	{"µ", "µ"},
+	{"¶",  "¶"},
+	{"·","·"},
+	{"¸", "ž"},
+	{"&sup1;",  "¹"},
+	{"º",  "º"},
+	{"»", "»"},
+	{"&frac14;","Œ"},
+	{"&frac12;","œ"},
+	{"&frac34;","Ÿ"},
+	{"¿","¿"},
+	{"À","À"},
+	{"Á","Á"},
+	{"Â", "Â"},
+	{"Ã","Ã"},
+	{"Ä",  "Ä"},
+	{"Å", "Å"},
+	{"Æ", "Æ"},
+	{"Ç","Ç"},
+	{"È","È"},
+	{"É","É"},
+	{"Ê", "Ê"},
+	{"Ë",  "Ë"},
+	{"Ì","Ì"},
+	{"Í","Í"},
+	{"Î", "Î"},
+	{"Ï",  "Ï"},
+	{"Ð",   "Ð"},
+	{"Ñ","Ñ"},
+	{"Ò","Ò"},
+	{"Ó","Ó"},
+	{"Ô", "Ô"},
+	{"Õ","Õ"},
+	{"Ö",  "Ö"},
+	{"×", "×"},
+	{"Ø","Ø"},
+	{"Ù","Ù"},
+	{"Ú","Ú"},
+	{"Û", "Û"},
+	{"Ü",  "Ü"},
+	{"Ý","Ý"},
+	{"Þ", "Þ"},
+	{"ß", "ß"},
+	{"à","à"},
+	{"á","á"},
+	{"â", "â"},
+	{"ã","ã"},
+	{"ä",  "ä"},
+	{"å", "å"},
+	{"æ", "æ"},
+	{"ç","ç"},
+	{"è","è"},
+	{"é","é"},
+	{"ê", "ê"},
+	{"ë",  "ë"},
+	{"ì","ì"},
+	{"í","í"},
+	{"î", "î"},
+	{"ï",  "ï"},
+	{"ð",   "ð"},
+	{"ñ","ñ"},
+	{"ò","ò"},
+	{"ó","ó"},
+	{"ô", "ô"},
+	{"õ","õ"},
+	{"ö",  "ö"},
+	{"÷","÷"},
+	{"ø","ø"},
+	{"ù","ù"},
+	{"ú","ú"},
+	{"û", "û"},
+	{"ü",  "ü"},
+	{"ý","ý"},
+	{"þ", "þ"},
+	{"ÿ",  "ÿ"},
+	{"&",   "&"},
+};
+
+std::string EntityConverter::DecodeEntities(const std::string &input) {
+	std::string output = input;
+	if (output.find("&") != std::string::npos) {
+		// convert the entities from UTF-8 to current system character table
+		CharsetConverter conv("UTF-8");
+
+		// convert entities of format &#xFF; (unicode)
+		while (output.find("&#x") != std::string::npos) {
+			size_t pos = output.find("&#x");
+			size_t end = output.find(";", pos);
+			// get hex code
+			std::string unicode = output.substr(pos+3, end - pos - 3);
+			// convert to int
+			std::stringstream ss;
+			ss << std::hex << unicode;
+			int codepoint;
+			ss >> codepoint;
+			// get corresponding char
+			char out_buffer[8];
+			memset(out_buffer, 0, 8);
+			char *out = &(out_buffer[0]);
+			wchar_t in_buffer = codepoint;
+			char *in = (char *)&(in_buffer);
+			size_t inlen = sizeof(in_buffer), outlen = sizeof(out_buffer);
+			iconv_t cd;
+			cd = iconv_open("utf-8", "ucs-2");
+			iconv(cd, &in, &inlen, &out, &outlen);
+			iconv_close(cd);
+			// replace it
+			output.replace(pos, end-pos+1, std::string(out_buffer));
+		}
+
+		// convert other entities with table
+		for (auto entity : Entities) {
+			std::string::size_type pos = output.find(entity.first);
+			while (pos != std::string::npos) {
+				output.replace(pos, entity.first.length(), conv.convert(entity.second));
+				pos = output.find(entity.first, pos-1);
+			}
+		}
+	}
+	return output;
+}
+
+
+} /* namespace convert */
diff --git a/libfritz++/Nummerzoeker.h b/libconv++/EntityConverter.h
similarity index 67%
copy from libfritz++/Nummerzoeker.h
copy to libconv++/EntityConverter.h
index 281d5ce..11d46a7 100644
--- a/libfritz++/Nummerzoeker.h
+++ b/libconv++/EntityConverter.h
@@ -1,7 +1,7 @@
 /*
- * libfritz++
+ * libiconv++
  *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
+ * Copyright (C) 2012-2013 Joachim Wilke <libiconv at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,22 +19,18 @@
  *
  */
 
-#ifndef NUMMERZOEKER_H
-#define NUMMERZOEKER_H
+#ifndef ENTITYCONVERTER_H_
+#define ENTITYCONVERTER_H_
 
-#include "LookupFonbook.h"
+#include <string>
 
-namespace fritz {
+namespace convert {
 
-class NummerzoekerFonbook : public LookupFonbook
-{
-	friend class FonbookManager;
-private:
-	NummerzoekerFonbook();
+class EntityConverter {
 public:
-	virtual sResolveResult Lookup(std::string number) const;
+	static std::string DecodeEntities(const std::string &s);
 };
 
-}
+} /* namespace convert */
 
-#endif /*NUMMERZOEKER_H_*/
+#endif /* ENTITYCONVERTER_H_ */
diff --git a/libconv++/Makefile b/libconv++/Makefile
new file mode 100644
index 0000000..d23b101
--- /dev/null
+++ b/libconv++/Makefile
@@ -0,0 +1,25 @@
+AFILE = $(notdir $(subst /.a,.a,$(addsuffix .a,$(CURDIR))))
+OBJS  = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+.PHONY: all clean
+
+all: $(AFILE) 
+
+%.o: %.cpp
+	$(CXX) $(CXXFLAGS) -o $@ -c $<
+	
+$(AFILE): $(OBJS)
+	@ar ru $(AFILE) $(OBJS)
+	
+clean:
+	@-rm -f $(AFILE) $(OBJS) $(DEPFILE)
+
+###
+# Dependencies:
+
+MAKEDEP = $(CXX) -MM -MG
+DEPFILE = .dependencies
+$(DEPFILE): Makefile
+	@$(MAKEDEP) $(DEFINES) $(CXXFLAGS) $(OBJS:%.o=%.cpp) > $@
+
+-include $(DEPFILE)
\ No newline at end of file
diff --git a/libfritz++/CMakeLists.txt b/libfritz++/CMakeLists.txt
index 0b6abb7..26193f4 100644
--- a/libfritz++/CMakeLists.txt
+++ b/libfritz++/CMakeLists.txt
@@ -12,20 +12,22 @@ find_package(Threads REQUIRED)
 include("FindGcryptConfig")
 gcrypt_check(GCRYPT REQUIRED gcrypt)
 
-# --- gnu common cpp library --------------------------------------------------
-pkg_check_modules(CC++ REQUIRED libccgnu2 libccext2)
-include_directories(${CC++_INCLUDE_DIRS})
-link_directories(${CC++_LIBRARY_DIRS})
+# --- boost -------------------------------------------------------------------
+find_package(Boost COMPONENTS system date_time thread regex REQUIRED)
+
+# --- threading ---------------------------------------------------------------
+find_package(Threads)
 
 # --- compile and link --------------------------------------------------------
 include_directories(${libfritz++_SOURCE_DIR})
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCRYPT_CFLAGS} ${CC++_CFLAGS_OTHER}")
+include_directories(${libfritz++_SOURCE_DIR}/..)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCRYPT_CFLAGS} -std=gnu++11")
 
-set(SRCS cc++/url.cpp cc++/urlstring.cpp cc++/mime.cpp cc++/soap.cpp
-         CallList.cpp Config.cpp 
+set(SRCS CallList.cpp Config.cpp 
          Fonbooks.cpp Fonbook.cpp FonbookManager.cpp FritzClient.cpp FritzFonbook.cpp 
-         HttpClient.cpp Listener.cpp LocalFonbook.cpp LookupFonbook.cpp Nummerzoeker.cpp OertlichesFonbook.cpp 
-         SoapClient.cpp TcpClient.cpp TelLocalChFonbook.cpp Tools.cpp XmlFonbook.cpp)
+         Listener.cpp LocalFonbook.cpp
+         LookupFonbook.cpp Nummerzoeker.cpp OertlichesFonbook.cpp 
+         TelLocalChFonbook.cpp Tools.cpp XmlFonbook.cpp)
 add_library(fritz++ STATIC ${SRCS})
 
 # --- tests -------------------------------------------------------------------
@@ -34,7 +36,9 @@ if (EXISTS ${libfritz++_SOURCE_DIR}/test)
   include_directories(${libfritz++_SOURCE_DIR}/test)
   AUX_SOURCE_DIRECTORY(test LIBTESTFILES)
   add_executable(libfritztest ${LIBTESTFILES} test/gtest/gtest-all.cc test/gtest/gtest_main.cc)
-  target_link_libraries(libfritztest fritz++ 
-                        ${GCRYPT_LIBRARIES} ${CC++_LDFLAGS})
+  target_link_libraries(libfritztest fritz++ log++ net++ conv++
+                        ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${Boost_REGEX_LIBRARY}
+                        ${GCRYPT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}
+                        )
 endif (EXISTS ${libfritz++_SOURCE_DIR}/test)
 
diff --git a/libfritz++/CallList.cpp b/libfritz++/CallList.cpp
index 61bdd6d..457c5b0 100644
--- a/libfritz++/CallList.cpp
+++ b/libfritz++/CallList.cpp
@@ -27,6 +27,7 @@
 
 #include "Tools.h"
 #include "Config.h"
+#include <liblog++/Log.h>
 #include "FritzClient.h"
 
 namespace fritz{
@@ -80,20 +81,14 @@ public:
 	}
 };
 
-CallList *CallList::me = NULL;
+CallList *CallList::me = nullptr;
 
 CallList::CallList()
-:Thread()
-{
-	setName("CallList");
-	setCancel(cancelDeferred);
-	lastMissedCall = 0;
-	lastCall = 0;
-	valid = false;
-	start();
+: thread{nullptr}, lastCall{0}, lastMissedCall{0}, valid{false} {
+	reload();
 }
 
-CallList *CallList::getCallList(bool create){
+CallList *CallList::GetCallList(bool create){
 	if(!me && create){
 		me = new CallList();
 	}
@@ -109,13 +104,14 @@ void CallList::DeleteCallList() {
 	if (me) {
 		DBG("deleting call list");
 		delete me;
-		me = NULL;
+		me = nullptr;
 	}
 }
 
 CallList::~CallList()
 {
-	terminate();
+	thread->join(); //TODO cancellation?
+	delete thread;
 	DBG("deleted call list");
 }
 
@@ -123,7 +119,7 @@ void CallList::run() {
 	DBG("CallList thread started");
 
 	FritzClient *fc = gConfig->fritzClientFactory->create();
-	std::string msg = fc->RequestCallList();
+	std::string msg = fc->requestCallList();
 	delete fc;
 
 	std::vector<CallEntry> callList;
@@ -196,9 +192,7 @@ void CallList::run() {
 	lastCall = 0;
 	lastMissedCall = 0;
 
-	for(std::vector<CallEntry>::iterator it = callListAll.begin(); it < callListAll.end(); ++it) {
-		CallEntry ce = *it;
-
+	for(auto ce : callListAll) {
 		if (lastCall < ce.timestamp)
 			lastCall = ce.timestamp;
 
@@ -223,7 +217,16 @@ void CallList::run() {
 	DBG("CallList thread ended");
 }
 
-CallEntry *CallList::RetrieveEntry(CallEntry::eCallType type, size_t id) {
+void CallList::reload() {
+	if (thread) {
+		thread->join();
+		delete thread;
+	}
+	// runs operator() in threaded context
+	thread = new std::thread(&CallList::run, this);
+}
+
+CallEntry *CallList::retrieveEntry(CallEntry::eCallType type, size_t id) {
 	switch (type) {
 	case CallEntry::ALL:
 		return &callListAll[id];
@@ -234,11 +237,11 @@ CallEntry *CallList::RetrieveEntry(CallEntry::eCallType type, size_t id) {
 	case CallEntry::MISSED:
 		return &callListMissed[id];
 	default:
-		return NULL;
+		return nullptr;
 	}
 }
 
-size_t CallList::GetSize(CallEntry::eCallType type) {
+size_t CallList::getSize(CallEntry::eCallType type) {
 	switch (type) {
 	case CallEntry::ALL:
 		return callListAll.size();
@@ -253,13 +256,12 @@ size_t CallList::GetSize(CallEntry::eCallType type) {
 	}
 }
 
-size_t CallList::MissedCalls(time_t since) {
+size_t CallList::missedCalls(time_t since) {
 	size_t missedCalls = 0;
-	for (unsigned int pos=0; pos < callListMissed.size(); pos++) {
-		CallEntry ce = callListMissed[pos];
+	for (auto ce : callListMissed) {
 		// track number of new missed calls
 		if (ce.timestamp > since) {
-			if (ce.MatchesFilter())
+			if (ce.matchesFilter())
 				missedCalls++;
 		} else {
 			break; // no older calls will match the missed-calls condition
@@ -268,12 +270,12 @@ size_t CallList::MissedCalls(time_t since) {
 	return missedCalls;
 }
 
-void CallList::Sort(CallEntry::eElements element, bool ascending) {
+void CallList::sort(CallEntry::eElements element, bool ascending) {
 	CallEntrySort ces(element, ascending);
-	std::sort(callListAll.begin(), callListAll.end(), ces); //TODO: other lists?
+	std::sort(begin(callListAll), end(callListAll), ces); //TODO: other lists?
 }
 
-bool CallEntry::MatchesFilter() {
+bool CallEntry::matchesFilter() {
 	// entries are filtered according to the MSN filter)
 	if ( Tools::MatchesMsnFilter(localNumber))
 		return true;
@@ -281,15 +283,15 @@ bool CallEntry::MatchesFilter() {
 		// if local number does not contain any of the MSNs in MSN filter, we test
 		// if it does contain any number (if POTS is used fritzbox reports "Festnetz"
 		// instead of the local number)
-		for (unsigned int pos=0; pos < localNumber.size(); pos++) {
-			if (localNumber[pos] >= '0' && localNumber[pos] <= '9')
+		for (auto ch : localNumber) {
+			if (ch >= '0' && ch <= '9')
 				return false;
 		}
 		return true;
 	}
 }
 
-bool CallEntry::MatchesRemoteNumber(std::string number) {
+bool CallEntry::matchesRemoteNumber(std::string number) {
 	return (Tools::NormalizeNumber(number).compare(Tools::NormalizeNumber(remoteNumber)) == 0);
 }
 
diff --git a/libfritz++/CallList.h b/libfritz++/CallList.h
index b4b5961..baafc62 100644
--- a/libfritz++/CallList.h
+++ b/libfritz++/CallList.h
@@ -24,7 +24,7 @@
 
 #include <string>
 #include <vector>
-#include <cc++/thread.h>
+#include <thread>
 
 namespace fritz{
 
@@ -56,13 +56,13 @@ public:
 	std::string localNumber;
 	std::string duration;
 	time_t      timestamp;
-	bool MatchesFilter();
-	bool MatchesRemoteNumber(std::string number);
+	bool matchesFilter();
+	bool matchesRemoteNumber(std::string number);
 };
 
-class CallList : public ost::Thread
-{
+class CallList {
 private:
+	std::thread *thread;
 	std::vector<CallEntry> callListIn;
 	std::vector<CallEntry> callListMissed;
 	std::vector<CallEntry> callListOut;
@@ -73,7 +73,7 @@ private:
 	static CallList *me;
     CallList();
 public:
-	static CallList *getCallList(bool create = true);
+	static CallList *GetCallList(bool create = true);
 	/**
 	 * Activate call list support.
 	 * This method fetches the call list from the fritz box. Following calls to
@@ -85,18 +85,19 @@ public:
 	static void DeleteCallList();
     virtual ~CallList();
 	void run();
+	void reload();
 	bool isValid() { return valid; }
-	CallEntry *RetrieveEntry(CallEntry::eCallType type, size_t id);
-	size_t GetSize(CallEntry::eCallType type);
-	size_t MissedCalls(time_t since);
-	time_t LastCall() { return lastCall; }
-	time_t LastMissedCall() { return lastMissedCall; }
+	CallEntry *retrieveEntry(CallEntry::eCallType type, size_t id);
+	size_t getSize(CallEntry::eCallType type);
+	size_t missedCalls(time_t since);
+	time_t getLastCall() { return lastCall; }
+	time_t getLastMissedCall() { return lastMissedCall; }
 	/**
 	 * Sorts the calllist's entries by the given element and in given order.
 	 * @param the element used for sorting
 	 * @param true if sort order is ascending, false otherwise
 	 */
-	void Sort(CallEntry::eElements element = CallEntry::ELEM_DATE, bool ascending = true);
+	void sort(CallEntry::eElements element = CallEntry::ELEM_DATE, bool ascending = true);
 
 };
 
diff --git a/libfritz++/Config.cpp b/libfritz++/Config.cpp
index ca2ca27..1d8372f 100644
--- a/libfritz++/Config.cpp
+++ b/libfritz++/Config.cpp
@@ -21,26 +21,21 @@
 
 #include "Config.h"
 
-#include <cc++/thread.h>
-
 #include "CallList.h"
 #include "FonbookManager.h"
 #include "Listener.h"
+#include <liblog++/Log.h>
 #include "Tools.h"
 
 namespace fritz {
 
-Config* gConfig = NULL;
-ost::Mutex *syslogMutex = new ost::Mutex();
-std::ostream *dsyslog = &std::clog;
-std::ostream *isyslog = &std::cout;
-std::ostream *esyslog = &std::cerr;
+Config* gConfig = nullptr;
 
-void Config::Setup(std::string hostname, std::string password, bool logPersonalInfo) {
+void Config::Setup(std::string hostname, std::string username, std::string password, bool logPersonalInfo) {
 
 	if (gConfig)
 		delete gConfig;
-	gConfig = new Config( hostname, password);
+    gConfig = new Config( hostname, username, password);
 	gConfig->mConfig.logPersonalInfo = logPersonalInfo;
 
 }
@@ -77,7 +72,7 @@ bool Config::Shutdown() {
 	fritz::CallList::DeleteCallList();
 	if (gConfig) {
 		delete gConfig;
-		gConfig = NULL;
+		gConfig = nullptr;
 	}
 	INF("Shutdown of libfritz++ completed.");
 	return true;
@@ -102,15 +97,9 @@ void Config::SetupConfigDir(std::string dir)
 	gConfig->mConfig.configDir = dir;
 }
 
-void Config::SetupLogging(std::ostream *d, std::ostream *i, std::ostream *e) {
-	// set own logging objects
-	dsyslog = d;
-	isyslog = i;
-	esyslog = e;
-}
-
-Config::Config( std::string url, std::string password) {
+Config::Config( std::string url, std::string username, std::string password) {
 	mConfig.url          	= url;
+    mConfig.username        = username;
 	mConfig.password     	= password;
 	mConfig.uiPort       	= 80;
 	mConfig.listenerPort    = 1012;
@@ -118,7 +107,6 @@ Config::Config( std::string url, std::string password) {
 	mConfig.loginType       = UNKNOWN;
 	mConfig.lastRequestTime = 0;
 	mConfig.logPersonalInfo = false;
-	CharSetConv::DetectCharset();
 	fritzClientFactory = new FritzClientFactory();
 }
 
diff --git a/libfritz++/Config.h b/libfritz++/Config.h
index b12f655..cd064cd 100644
--- a/libfritz++/Config.h
+++ b/libfritz++/Config.h
@@ -22,28 +22,18 @@
 #ifndef CONFIG_H
 #define CONFIG_H
 
-#include <cc++/thread.h>
+#include <mutex>
 #include <iostream>
 #include <string>
 #include <vector>
 
 #include "FritzClient.h"
 
-#define NAMESPACE "libfritz++"
-#define LOCATOR "[" << NAMESPACE << "/" <<  \
-                std::string(__FILE__, std::string(__FILE__).rfind('/') == std::string::npos ? \
-                		          0 : std::string(__FILE__).rfind('/')+1, std::string::npos ) \
-                << ":" << __LINE__ << "] "
-#define DBG(x) {fritz::syslogMutex->enterMutex(); *::fritz::dsyslog << LOCATOR << x << std::endl; fritz::syslogMutex->leaveMutex();}
-#define INF(x) {fritz::syslogMutex->enterMutex(); *::fritz::isyslog << LOCATOR << x << std::endl; fritz::syslogMutex->leaveMutex();}
-#define ERR(x) {fritz::syslogMutex->enterMutex(); *::fritz::esyslog << LOCATOR << x << std::endl; fritz::syslogMutex->leaveMutex();}
-
-#define HIDDEN "<hidden>"
-
-#define RETRY_DELAY 60
-
 namespace fritz {
 
+const std::string HIDDEN = "<hidden>";
+constexpr size_t RETRY_DELAY = 60;
+
 /**
  * Global config class for libfritz++.
  * This class maintains all configuration information needed by classes part of libfritz++.
@@ -65,6 +55,7 @@ private:
 		int uiPort;						                // the port of the fritz box web interface
 		int upnpPort;									// the port of the UPNP server of the fritz box
 		int listenerPort;					            // the port of the fritz box call monitor
+        std::string username;                           // fritz!box web interface username, if applicable
 		std::string password;               			// fritz!box web interface password
 		time_t lastRequestTime;                         // with eLoginType::SID: time of last request sent to fritz box
 		eLoginType loginType;                           // type of login procedure
@@ -79,7 +70,7 @@ private:
 		bool logPersonalInfo;							// log sensitive information like passwords, phone numbers, ...
 	} mConfig;
 
-	Config( std::string url, std::string password );
+    Config( std::string url, std::string username, std::string password );
 
 public:
 	/**
@@ -89,7 +80,7 @@ public:
 	 * @param the password of the Fritz!Box device, defaults to an empty one
 	 * @param allows personal information to be logged
 	 */
-	void static Setup( std::string hostname="fritz.box", std::string password="", bool logPersonalInfo = false );
+    void static Setup(std::string hostname="fritz.box", std::string username="", std::string password="", bool logPersonalInfo = false );
 	/**
 	 * Sets arbitrary ports for connections to the Fritz!Box's listener and webinterface.
 	 * @param the port to connect to the listener
@@ -106,16 +97,6 @@ public:
 	 */
 	void static SetupMsnFilter( std::vector <std::string> vMsn );
 	/**
-	 * Modifies logging channels.
-	 * As default, logging of libfritz++ actions is performed using default c++
-	 * cout, cerr and clog objects. This method enables the application to redirect
-	 * logging to arbitrary ostream objects.
-	 * @param the ostream for debbuging messages
-	 * @param the ostream for information messages
-	 * @param the ostream for error messages
-	 */
-	void static SetupLogging( std::ostream *dsyslog, std::ostream *isyslog, std::ostream *esyslog );
-	/**
 	 * Sets up a directory for arbitrary data storage.
 	 * This is currently used by local fonbook to persist the fonbook entries to a file.
 	 * @param full path to the writable directory
@@ -128,7 +109,7 @@ public:
 	 * @param Sets the default value for countryCode. If locationSettingsDetected == true, this returns the detected countryCode.
 	 * @param Sets the default value for regionCode. If locationSettingsDetected == true, this returns the detected regionCode.
 	 */
-	bool static Init( bool *locationSettingsDetected = NULL, std::string *countryCode = NULL, std::string *regionCode = NULL );
+	bool static Init( bool *locationSettingsDetected = nullptr, std::string *countryCode = nullptr, std::string *regionCode = nullptr );
 
 	/**
 	 * Closes all pending connections and objects held by libfritz++.
@@ -144,10 +125,11 @@ public:
 	int getListenerPort( )				              { return mConfig.listenerPort; }
 	int getUpnpPort( )                                { return mConfig.upnpPort; }
 	std::string &getPassword( )                       { return mConfig.password; }
+    std::string &getUsername( )                       { return mConfig.username; }
 	eLoginType getLoginType( )                        { return mConfig.loginType; }
 	void setLoginType(eLoginType type)                { mConfig.loginType = type; }
 	time_t getLastRequestTime()                       { return mConfig.lastRequestTime; }
-	void updateLastRequestTime()                      { mConfig.lastRequestTime = time(NULL); }
+	void updateLastRequestTime()                      { mConfig.lastRequestTime = time(nullptr); }
 	std::string &getSid( )                            { return mConfig.sid; }
 	void setSid(std::string sid)                      { mConfig.sid = sid; }
 	std::string &getCountryCode( )        	          { return mConfig.countryCode; }
@@ -170,10 +152,6 @@ public:
 };
 
 extern Config* gConfig;
-extern ost::Mutex *syslogMutex;
-extern std::ostream *dsyslog;
-extern std::ostream *isyslog;
-extern std::ostream *esyslog;
 
 }
 
diff --git a/libfritz++/Fonbook.cpp b/libfritz++/Fonbook.cpp
index b8efc28..9fe4943 100644
--- a/libfritz++/Fonbook.cpp
+++ b/libfritz++/Fonbook.cpp
@@ -25,159 +25,17 @@
 
 #include "Config.h"
 #include "Tools.h"
+#include <liblog++/Log.h>
+#include <libconv++/CharsetConverter.h>
 
 namespace fritz {
 
-const char *Entities[97][2] = {
-	{" ",  " "},
-	{"¡", "¡"},
-	{"¢",  "¢"},
-	{"£", "£"},
-	{"¤","€"}, //krazy:exclude=spelling
-	{"¥",   "¥"},
-	{"¦","Š"},
-	{"§",  "§"},
-	{"¨",   "š"},
-	{"©",  "©"},
-	{"ª",  "ª"},
-	{"«", "«"},
-	{"¬",   "¬"},
-	{"­",   "­"},
-	{"®",   "®"},
-	{"¯",  "¯"},
-	{"°",   "°"},
-	{"±","±"},
-	{"&sup2;",  "²"},
-	{"&sup3;",  "³"},
-	{"´", "Ž"},
-	{"µ", "µ"},
-	{"¶",  "¶"},
-	{"·","·"},
-	{"¸", "ž"},
-	{"&sup1;",  "¹"},
-	{"º",  "º"},
-	{"»", "»"},
-	{"&frac14;","Œ"},
-	{"&frac12;","œ"},
-	{"&frac34;","Ÿ"},
-	{"¿","¿"},
-	{"À","À"},
-	{"Á","Á"},
-	{"Â", "Â"},
-	{"Ã","Ã"},
-	{"Ä",  "Ä"},
-	{"Å", "Å"},
-	{"Æ", "Æ"},
-	{"Ç","Ç"},
-	{"È","È"},
-	{"É","É"},
-	{"Ê", "Ê"},
-	{"Ë",  "Ë"},
-	{"Ì","Ì"},
-	{"Í","Í"},
-	{"Î", "Î"},
-	{"Ï",  "Ï"},
-	{"Ð",   "Ð"},
-	{"Ñ","Ñ"},
-	{"Ò","Ò"},
-	{"Ó","Ó"},
-	{"Ô", "Ô"},
-	{"Õ","Õ"},
-	{"Ö",  "Ö"},
-	{"×", "×"},
-	{"Ø","Ø"},
-	{"Ù","Ù"},
-	{"Ú","Ú"},
-	{"Û", "Û"},
-	{"Ü",  "Ü"},
-	{"Ý","Ý"},
-	{"Þ", "Þ"},
-	{"ß", "ß"},
-	{"à","à"},
-	{"á","á"},
-	{"â", "â"},
-	{"ã","ã"},
-	{"ä",  "ä"},
-	{"å", "å"},
-	{"æ", "æ"},
-	{"ç","ç"},
-	{"è","è"},
-	{"é","é"},
-	{"ê", "ê"},
-	{"ë",  "ë"},
-	{"ì","ì"},
-	{"í","í"},
-	{"î", "î"},
-	{"ï",  "ï"},
-	{"ð",   "ð"},
-	{"ñ","ñ"},
-	{"ò","ò"},
-	{"ó","ó"},
-	{"ô", "ô"},
-	{"õ","õ"},
-	{"ö",  "ö"},
-	{"÷","÷"},
-	{"ø","ø"},
-	{"ù","ù"},
-	{"ú","ú"},
-	{"û", "û"},
-	{"ü",  "ü"},
-	{"ý","ý"},
-	{"þ", "þ"},
-	{"ÿ",  "ÿ"},
-	{"&",   "&"},
-};
-
-std::string Fonbook::convertEntities(std::string s) const {
-	if (s.find("&") != std::string::npos) {
-		// convert the entities from UTF-8 to current system character table
-		CharSetConv *conv = new CharSetConv("UTF-8", CharSetConv::SystemCharacterTable());
-
-		// convert entities of format &#xFF; (unicode)
-		while (s.find("&#x") != std::string::npos) {
-			size_t pos = s.find("&#x");
-			size_t end = s.find(";", pos);
-			// get hex code
-			std::string unicode = s.substr(pos+3, end - pos - 3);
-			// convert to int
-			std::stringstream ss;
-			ss << std::hex << unicode;
-			int codepoint;
-			ss >> codepoint;
-			// get corresponding char
-			char out_buffer[8];
-			memset(out_buffer, 0, 8);
-			char *out = &(out_buffer[0]);
-			wchar_t in_buffer = codepoint;
-			char *in = (char *)&(in_buffer);
-			size_t inlen = sizeof(in_buffer), outlen = sizeof(out_buffer);
-			iconv_t cd;
-			cd = iconv_open("utf-8", "ucs-2");
-			iconv(cd, &in, &inlen, &out, &outlen);
-			iconv_close(cd);
-			// replace it
-			s.replace(pos, end-pos+1, std::string(out_buffer));
-		}
-
-		// convert other entities with table
-		for (int i=0; i<97; i++) {
-			std::string::size_type pos = s.find(Entities[i][0]);
-			if (pos != std::string::npos) {
-				s.replace(pos, strlen(Entities[i][0]), conv->Convert(Entities[i][1]));
-				i--; //search for the same entity again
-			}
-		}
-		delete (conv);
-	}
-	return s;
-}
-
 FonbookEntry::FonbookEntry(std::string name, bool important) {
 	this->name      = name;
 	this->important = important;
 }
 
-void FonbookEntry::AddNumber(size_t pos, std::string number, eType type, std::string quickdial, std::string vanity, int priority) {
+void FonbookEntry::addNumber(std::string number, eType type, std::string quickdial, std::string vanity, int priority) {
 	sNumber sn;
 	sn.number = number;
 	sn.type = type;
@@ -187,60 +45,60 @@ void FonbookEntry::AddNumber(size_t pos, std::string number, eType type, std::st
 	numbers.push_back(sn);
 }
 
-size_t FonbookEntry::GetDefault() const {
+size_t FonbookEntry::getDefault() const {
 	size_t t = 0;
 	while (t < numbers.size()) {
-		if (GetPriority(t) == 1)
+		if (getPriority(t) == 1)
 			return t;
 		t++;
 	}
 	return 0;
 }
 
-void FonbookEntry::SetDefault(size_t pos) {
-	size_t oldPos = GetDefault();
+void FonbookEntry::setDefault(size_t pos) {
+	size_t oldPos = getDefault();
 	if (pos != oldPos) {
-		SetPrioriy(0, oldPos);
-		SetPrioriy(1, pos);
-		SetQuickdial(GetQuickdial(oldPos), pos);
-		SetVanity(GetVanity(oldPos), pos);
-		SetQuickdial("", oldPos);
-		SetVanity("", oldPos);
+		setPrioriy(0, oldPos);
+		setPrioriy(1, pos);
+		setQuickdial(getQuickdial(oldPos), pos);
+		setVanity(getVanity(oldPos), pos);
+		setQuickdial("", oldPos);
+		setVanity("", oldPos);
 	}
 }
 
-std::string FonbookEntry::GetQuickdialFormatted(size_t pos) const {
-	switch (GetQuickdial(pos).length()) {
+std::string FonbookEntry::getQuickdialFormatted(size_t pos) const {
+	switch (getQuickdial(pos).length()) {
 	case 1:
-		return "**70" + GetQuickdial(pos);
+		return "**70" + getQuickdial(pos);
 	case 2:
-		return "**7"  + GetQuickdial(pos);
+		return "**7"  + getQuickdial(pos);
 	default:
 		return "";
 	}
 }
 
-std::string FonbookEntry::GetQuickdial(size_t pos) const {
+std::string FonbookEntry::getQuickdial(size_t pos) const {
 	// if no special type is given, the default "TYPES_COUNT" indicates,
 	// that the correct type has to be determined first, i.e., priority == 1
 
-	return numbers[pos == std::string::npos ? GetDefault() : pos].quickdial;
+	return numbers[pos == std::string::npos ? getDefault() : pos].quickdial;
 }
 
-void FonbookEntry::SetQuickdial(std::string quickdial, size_t pos) { //TODO: sanity check
-	numbers[pos == std::string::npos ? GetDefault() : pos].quickdial = quickdial;
+void FonbookEntry::setQuickdial(std::string quickdial, size_t pos) { //TODO: sanity check
+	numbers[pos == std::string::npos ? getDefault() : pos].quickdial = quickdial;
 }
 
-std::string FonbookEntry::GetVanity(size_t pos) const {
-	return numbers[pos == std::string::npos ? GetDefault() : pos].vanity;
+std::string FonbookEntry::getVanity(size_t pos) const {
+	return numbers[pos == std::string::npos ? getDefault() : pos].vanity;
 }
 
-std::string FonbookEntry::GetVanityFormatted(size_t pos) const {
-	return GetVanity(pos).length() ? "**8"+GetVanity(pos) : "";
+std::string FonbookEntry::getVanityFormatted(size_t pos) const {
+	return getVanity(pos).length() ? "**8"+getVanity(pos) : "";
 }
 
-void FonbookEntry::SetVanity(std::string vanity, size_t pos) { //TODO: sanity check
-	numbers[pos == std::string::npos ? GetDefault() : pos].vanity = vanity;
+void FonbookEntry::setVanity(std::string vanity, size_t pos) { //TODO: sanity check
+	numbers[pos == std::string::npos ? getDefault() : pos].vanity = vanity;
 }
 
 bool FonbookEntry::operator<(const FonbookEntry &fe) const {
@@ -250,11 +108,11 @@ bool FonbookEntry::operator<(const FonbookEntry &fe) const {
 	return (cresult < 0);
 }
 
-size_t FonbookEntry::GetSize() const {
+size_t FonbookEntry::getSize() const {
 	size_t size = 0;
 	// ignore TYPE_NONE
-	for (size_t pos = 0; pos < numbers.size(); pos++)
-		if (numbers[pos].number.size())
+	for (sNumber n : numbers)
+		if (n.number.length())
 			size++;
 	return size;
 }
@@ -271,7 +129,7 @@ public:
 	bool operator() (FonbookEntry fe1, FonbookEntry fe2){
 		switch(element) {
 		case FonbookEntry::ELEM_NAME:
-			return (ascending ? (fe1.GetName() < fe2.GetName()) : (fe1.GetName() > fe2.GetName()));
+			return (ascending ? (fe1.getName() < fe2.getName()) : (fe1.getName() > fe2.getName()));
 			break;
 //		case FonbookEntry::ELEM_TYPE:
 //			return (ascending ? (fe1.getType() < fe2.getType()) : (fe1.getType() > fe2.getType()));
@@ -280,17 +138,17 @@ public:
 //			return (ascending ? (fe1.getNumber() < fe2.getNumber()) : (fe1.getNumber() > fe2.getNumber()));
 //			break;
 		case FonbookEntry::ELEM_IMPORTANT:
-			return (ascending ? (fe1.IsImportant() < fe2.IsImportant()) : (fe1.IsImportant() > fe2.IsImportant()));
+			return (ascending ? (fe1.isImportant() < fe2.isImportant()) : (fe1.isImportant() > fe2.isImportant()));
 			break;
 		case FonbookEntry::ELEM_QUICKDIAL: {
-			int qd1 = atoi(fe1.GetQuickdial().c_str());
-			int qd2 = atoi(fe2.GetQuickdial().c_str());
+			int qd1 = atoi(fe1.getQuickdial().c_str());
+			int qd2 = atoi(fe2.getQuickdial().c_str());
 			return (ascending ? (qd1 < qd2) : (qd1 > qd2));
 		}
 			break;
 		case FonbookEntry::ELEM_VANITY: {
-			int vt1 = atoi(fe1.GetVanity().c_str());
-			int vt2 = atoi(fe2.GetVanity().c_str());
+			int vt1 = atoi(fe1.getVanity().c_str());
+			int vt2 = atoi(fe2.getVanity().c_str());
 			return (ascending ? (vt1 < vt2) : (vt1 > vt2));
 		}
 //			break;
@@ -317,15 +175,14 @@ void Fonbook::SetDirty() {
 		dirty = true;
 }
 
-Fonbook::sResolveResult Fonbook::ResolveToName(std::string number) {
+Fonbook::sResolveResult Fonbook::resolveToName(std::string number) {
 	sResolveResult result(number);
 	if (number.length() > 0)
-		for (unsigned int pos=0; pos < fonbookList.size(); pos++)
-			for (size_t num=0; num < fonbookList[pos].GetSize(); num++) {
-				std::string fonbookNumber = fonbookList[pos].GetNumber(num);
-				if (fonbookNumber.length() > 0 && Tools::CompareNormalized(number, fonbookNumber) == 0) {
-					result.name = fonbookList[pos].GetName();
-					result.type = fonbookList[pos].GetType(num);
+		for (auto fbe : fonbookList)
+			for (auto fonbookNumber : fbe.getNumbers()) {
+				if (fonbookNumber.number.length() > 0 && Tools::CompareNormalized(number, fonbookNumber.number) == 0) {
+					result.name = fbe.getName();
+					result.type = fonbookNumber.type;
 					result.successful = true;
 					return result;
 				}
@@ -333,14 +190,14 @@ Fonbook::sResolveResult Fonbook::ResolveToName(std::string number) {
 	return result;
 }
 
-const FonbookEntry *Fonbook::RetrieveFonbookEntry(size_t id) const {
-	if (id >= GetFonbookSize())
-		return NULL;
+const FonbookEntry *Fonbook::retrieveFonbookEntry(size_t id) const {
+	if (id >= getFonbookSize())
+		return nullptr;
 	return &fonbookList[id];
 }
 
-bool Fonbook::ChangeFonbookEntry(size_t id, FonbookEntry &fe) {
-	if (id < GetFonbookSize()) {
+bool Fonbook::changeFonbookEntry(size_t id, FonbookEntry &fe) {
+	if (id < getFonbookSize()) {
 		fonbookList[id] = fe;
 		SetDirty();
 		return true;
@@ -349,9 +206,9 @@ bool Fonbook::ChangeFonbookEntry(size_t id, FonbookEntry &fe) {
 	}
 }
 
-bool Fonbook::SetDefault(size_t id, size_t pos) {
-	if (id < GetFonbookSize()) {
-		fonbookList[id].SetDefault(pos);
+bool Fonbook::setDefault(size_t id, size_t pos) {
+	if (id < getFonbookSize()) {
+		fonbookList[id].setDefault(pos);
 		SetDirty();
 		return true;
 	} else {
@@ -359,7 +216,7 @@ bool Fonbook::SetDefault(size_t id, size_t pos) {
 	}
 }
 
-void Fonbook::AddFonbookEntry(FonbookEntry &fe, size_t position) {
+void Fonbook::addFonbookEntry(FonbookEntry &fe, size_t position) {
 	if (position == std::string::npos || position > fonbookList.size())
 		fonbookList.push_back(fe);
 	else
@@ -367,8 +224,8 @@ void Fonbook::AddFonbookEntry(FonbookEntry &fe, size_t position) {
 	SetDirty();
 }
 
-bool Fonbook::DeleteFonbookEntry(size_t id) {
-	if (id < GetFonbookSize()) {
+bool Fonbook::deleteFonbookEntry(size_t id) {
+	if (id < getFonbookSize()) {
 		fonbookList.erase(fonbookList.begin() + id);
 		SetDirty();
 		return true;
@@ -377,9 +234,9 @@ bool Fonbook::DeleteFonbookEntry(size_t id) {
 	}
 }
 
-void Fonbook::Save() {
+void Fonbook::save() {
 	if (dirty && writeable) {
-		Write();
+		write();
 		dirty = false;
 	}
 }
@@ -387,17 +244,17 @@ void Fonbook::Save() {
 void Fonbook::setInitialized(bool isInitialized) {
 	initialized = isInitialized;
 	if (displayable && isInitialized)
-		INF(title << " initialized (" << GetFonbookSize() << " entries).");
+		INF(title << " initialized (" << getFonbookSize() << " entries).");
 }
 
-size_t Fonbook::GetFonbookSize() const {
+size_t Fonbook::getFonbookSize() const {
 	if (initialized)
 		return fonbookList.size();
 	else
 		return 0;
 }
 
-void Fonbook::Sort(FonbookEntry::eElements element, bool ascending) {
+void Fonbook::sort(FonbookEntry::eElements element, bool ascending) {
 	FonbookEntrySort fes(element, ascending);
 	std::sort(fonbookList.begin(), fonbookList.end(), fes);
 }
diff --git a/libfritz++/Fonbook.h b/libfritz++/Fonbook.h
index bdda45c..f579ae7 100644
--- a/libfritz++/Fonbook.h
+++ b/libfritz++/Fonbook.h
@@ -83,31 +83,35 @@ public:
 	 * @param vanity The vanity extension
 	 * @param prority '1' marks the default number of this contact, otherwise 0
 	 */
-	void AddNumber(size_t pos, std::string number, eType type = TYPE_NONE, std::string quickdial = "", std::string vanity = "", int priority = 0);
-	std::string GetName() const { return name; }
-	void SetName(std::string name) { this->name = name; }
-	std::string GetNumber(size_t pos) const { return numbers[pos].number; }
-	void SetNumber(std::string number,size_t pos) { numbers[pos].number = number; }
-	eType GetType(size_t pos) const { return numbers[pos].type; }
-	void SetType(eType type, size_t pos) { numbers[pos].type = type; }
-	bool IsImportant() const { return important; }
-	void SetImportant(bool important) { this->important = important; }
-	size_t GetDefault() const;
-	void SetDefault(size_t pos);
-	std::string GetQuickdialFormatted( size_t pos = std::string::npos) const;
-	std::string GetQuickdial(size_t pos = std::string::npos) const;
-	void SetQuickdial(std::string quickdial, size_t pos = std::string::npos);
-	std::string GetVanity(size_t pos = std::string::npos) const;
-	std::string GetVanityFormatted(size_t pos = std::string::npos) const;
-	void SetVanity(std::string vanity, size_t pos = std::string::npos);
-	int GetPriority(size_t pos) const { return numbers[pos].priority; }
-	void SetPrioriy(int priority, size_t pos) { numbers[pos].priority = priority; }
+	void addNumber(std::string number, eType type = TYPE_NONE, std::string quickdial = "", std::string vanity = "", int priority = 0);
+	std::string getName() const { return name; }
+	void setName(std::string name) { this->name = name; }
+
+    #define CHECK(x) if (numbers.size() <= pos) return x;
+
+    std::string getNumber(size_t pos) const { CHECK(""); return numbers[pos].number; }
+	const std::vector<sNumber> &getNumbers() const { return numbers; }
+    void setNumber(std::string number,size_t pos) { CHECK(); numbers[pos].number = number; }
+    eType getType(size_t pos) const { CHECK(FonbookEntry::TYPE_NONE); return numbers[pos].type; }
+	void setType(eType type, size_t pos) { numbers[pos].type = type; }
+	bool isImportant() const { return important; }
+	void setImportant(bool important) { this->important = important; }
+	size_t getDefault() const;
+	void setDefault(size_t pos);
+	std::string getQuickdialFormatted( size_t pos = std::string::npos) const;
+	std::string getQuickdial(size_t pos = std::string::npos) const;
+	void setQuickdial(std::string quickdial, size_t pos = std::string::npos);
+	std::string getVanity(size_t pos = std::string::npos) const;
+	std::string getVanityFormatted(size_t pos = std::string::npos) const;
+	void setVanity(std::string vanity, size_t pos = std::string::npos);
+    int getPriority(size_t pos) const { CHECK(0); return numbers[pos].priority; }
+	void setPrioriy(int priority, size_t pos) { numbers[pos].priority = priority; }
 	bool operator<(const FonbookEntry & fe) const;
 	/*
 	 * Get number of typed numbers (TYPE_NONE is ignored)
 	 * @return count of different numbers available
 	 */
-	size_t GetSize() const;
+	size_t getSize() const;
 };
 
 inline FonbookEntry::eType& operator++(FonbookEntry::eType& t) {
@@ -165,7 +169,7 @@ protected:
 	/**
 	 * Method to persist contents of the phone book (if writeable)
 	 */
-	virtual void Write() { }
+	virtual void write() { }
 	/**
 	 * True, if this phonebook has displayable entries.
 	 */
@@ -173,7 +177,7 @@ protected:
 	/**
 	 *
 	 */
-	std::string convertEntities(std::string s) const;
+	const std::vector<FonbookEntry> &getFonbookList() const { return fonbookList; }
 public:
 	struct sResolveResult {
 		sResolveResult(std::string name, FonbookEntry::eType type = FonbookEntry::TYPE_NONE, bool successful = false)
@@ -188,54 +192,54 @@ public:
 	 * Initialize() may be called more than once per session.
 	 * @return if initialization was successful
 	 */
-	virtual bool Initialize(void) { return true; }
+	virtual bool initialize(void) { return true; }
 	/**
 	 * Resolves the number given to the corresponding name.
 	 * @param number to resolve
 	 * @return resolved name and type or the number, if unsuccessful
 	 */
-	virtual sResolveResult ResolveToName(std::string number);
+	virtual sResolveResult resolveToName(std::string number);
 	/**
 	 * Returns a specific telephonebook entry.
 	 * @param id unique identifier of the requested entry
-	 * @return the entry with key id or NULL, if unsuccessful
+	 * @return the entry with key id or nullptr, if unsuccessful
 	 */
-	virtual const FonbookEntry *RetrieveFonbookEntry(size_t id) const;
+	virtual const FonbookEntry *retrieveFonbookEntry(size_t id) const;
 	/**
 	 * Changes the Fonbook entry with the given id
 	 * @param id unique identifier to the entry to be changed
 	 * @param fe FonbookEntry with the new content
 	 * @return true, if successful
 	 */
-	virtual bool ChangeFonbookEntry(size_t id, FonbookEntry &fe);
+	virtual bool changeFonbookEntry(size_t id, FonbookEntry &fe);
 	/**
 	 * Sets the default number for a Fonbook entry with the given id
 	 * @param id unique identifier to the entry to be changed
 	 * @param pos the new default number
 	 * @return true, if successful
 	 */
-	virtual bool SetDefault(size_t id, size_t pos);
+	virtual bool setDefault(size_t id, size_t pos);
 	/**
 	 * Adds a new entry to the phonebook.
 	 * @param fe a new phonebook entry
 	 * @param position position at which fe is added (at the end of the list per default)
 	 */
-	virtual void AddFonbookEntry(FonbookEntry &fe, size_t position = std::string::npos);
+	virtual void addFonbookEntry(FonbookEntry &fe, size_t position = std::string::npos);
 	/**
 	 * Adds a new entry to the phonebook.
 	 * @param id unique id to the entry to be deleted
 	 * @return true, if deletion was successful
 	 */
-	virtual bool DeleteFonbookEntry(size_t id);
+	virtual bool deleteFonbookEntry(size_t id);
 	/**
 	 * Clears all entries from phonebook.
 	 */
-	virtual void Clear() { SetDirty(); fonbookList.clear(); }
+	virtual void clear() { SetDirty(); fonbookList.clear(); }
 	/**
 	 * Save pending changes.
 	 * Can be called periodically to assert pending changes in a phone book are written.
 	 */
-	void Save();
+	virtual void save();
 	/**
 	 * Returns if it is possible to display the entries of this phonebook.
 	 * @return true, if this phonebook has displayable entries. "Reverse lookup only" phonebooks must return false here.
@@ -269,28 +273,28 @@ public:
 	 *  Returns the number of entries in the telephonebook.
 	 * @return the number of entries
 	 */
-	virtual size_t GetFonbookSize() const;
+	virtual size_t getFonbookSize() const;
 	/**
 	 *  Reloads the telephonebook's content
 	 */
-	virtual void Reload() { }
+	virtual void reload() { }
 	/**
 	 *  Returns a string that should be displayed as title in the menu when the telephonebook is displayed.
 	 * @return the long title of this phonebook
 	 */
-	virtual std::string GetTitle() const { return title; }
+	virtual std::string getTitle() const { return title; }
 	/**
 	 * Returns the technical id of this phonebook. This id has to be unique among all phonebooks and is used when storing
 	 * the plugin's setup.
 	 * @return the technical id
 	 */
-	virtual std::string GetTechId() const { return techId; }
+	virtual std::string getTechId() const { return techId; }
 	/**
 	 * Sorts the phonebook's entries by the given element and in given order.
 	 * @param the element used for sorting
 	 * @param true if sort order is ascending, false otherwise
 	 */
-	virtual void Sort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true);
+	virtual void sort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true);
 };
 
 }
diff --git a/libfritz++/FonbookManager.cpp b/libfritz++/FonbookManager.cpp
index dec8d7e..dd78739 100644
--- a/libfritz++/FonbookManager.cpp
+++ b/libfritz++/FonbookManager.cpp
@@ -30,10 +30,11 @@
 #include "Nummerzoeker.h"
 #include "OertlichesFonbook.h"
 #include "TelLocalChFonbook.h"
+#include <liblog++/Log.h>
 
 namespace fritz{
 
-FonbookManager* FonbookManager::me = NULL;
+FonbookManager* FonbookManager::me = nullptr;
 
 FonbookManager::FonbookManager(bool saveOnShutdown)
 :Fonbook("Manager", "MNGR")
@@ -49,7 +50,7 @@ FonbookManager::FonbookManager(bool saveOnShutdown)
 	for (int i=gConfig->getFonbookIDs().size()-1; i>=0; i--) {
 		Fonbook *fb = fonbooks[gConfig->getFonbookIDs()[i]];
 		if (fb)
-			fb->Initialize();
+			fb->initialize();
 		else
 			gConfig->getFonbookIDs().erase(gConfig->getFonbookIDs().begin()+i);
 	}
@@ -65,18 +66,18 @@ FonbookManager::FonbookManager(bool saveOnShutdown)
 			activeFonbookPos = pos;
 	}
 	// if no valid phone book is selected, advance to the next valid one
-	if (!GetActiveFonbook())
-		NextFonbook();
+	if (!getActiveFonbook())
+		nextFonbook();
 }
 
 FonbookManager::~FonbookManager()
 {
-	for (size_t i= 0; i < fonbooks.size(); i++) {
-		DBG("deleting fonbook with ID: " << fonbooks[i]->GetTechId());
+	for (auto fonbook : fonbooks) {
+		DBG("deleting fonbook with ID: " << fonbook->getTechId());
 		// save pending changes
 		if (saveOnShutdown)
-			fonbooks[i]->Save();
-		delete(fonbooks[i]);
+			fonbook->save();
+		delete(fonbook);
 	}
 }
 
@@ -89,8 +90,8 @@ void FonbookManager::CreateFonbookManager(std::vector <std::string> vFonbookID,
 		// check if activeFonbook is valid
 		if (activeFonbook.size() > 0) {
 			bool activeFonbookValid = false;
-			for (unsigned int pos = 0; pos < vFonbookID.size(); pos++)
-				if (vFonbookID[pos].compare(activeFonbook) == 0) {
+			for (auto id : vFonbookID)
+				if (id.compare(activeFonbook) == 0) {
 					activeFonbookValid = true;
 					break;
 				}
@@ -118,11 +119,11 @@ void FonbookManager::DeleteFonbookManager() {
 	if (me) {
 		DBG("deleting Fonbook Manager");
 		delete me;
-		me = NULL;
+		me = nullptr;
 	}
 }
 
-void FonbookManager::NextFonbook() {
+void FonbookManager::nextFonbook() {
 	size_t pos = activeFonbookPos + 1;
     // no phonebooks -> no switching
 	if ( gConfig->getFonbookIDs().size() == 0)
@@ -148,100 +149,100 @@ void FonbookManager::NextFonbook() {
 	}
 }
 
-Fonbook::sResolveResult FonbookManager::ResolveToName(std::string number) {
+Fonbook::sResolveResult FonbookManager::resolveToName(std::string number) {
 	sResolveResult result(number);
-	for (size_t i=0; i<gConfig->getFonbookIDs().size(); i++) {
-		result = fonbooks[gConfig->getFonbookIDs()[i]]->ResolveToName(number);
-		DBG("ResolveToName: " << gConfig->getFonbookIDs()[i] << " " << (gConfig->logPersonalInfo() ? result.name : HIDDEN));
+	for (auto id  : gConfig->getFonbookIDs()) {
+		result = fonbooks[id]->resolveToName(number);
+		DBG("ResolveToName: " << id << " " << (gConfig->logPersonalInfo() ? result.name : HIDDEN));
 		if (result.successful)
 			return result;
 	}
 	return result;
 }
 
-Fonbook *FonbookManager::GetActiveFonbook() const {
+Fonbook *FonbookManager::getActiveFonbook() const {
 	if (activeFonbookPos == std::string::npos) {
-		return NULL;
+		return nullptr;
 	}
 	return fonbooks[gConfig->getFonbookIDs()[activeFonbookPos]];
 }
 
-const FonbookEntry *FonbookManager::RetrieveFonbookEntry(size_t id) const {
-	return GetActiveFonbook() ? GetActiveFonbook()->RetrieveFonbookEntry(id) : NULL;
+const FonbookEntry *FonbookManager::retrieveFonbookEntry(size_t id) const {
+	return getActiveFonbook() ? getActiveFonbook()->retrieveFonbookEntry(id) : nullptr;
 }
 
-bool FonbookManager::ChangeFonbookEntry(size_t id, FonbookEntry &fe) {
-	return GetActiveFonbook() ? GetActiveFonbook()->ChangeFonbookEntry(id, fe) : false;
+bool FonbookManager::changeFonbookEntry(size_t id, FonbookEntry &fe) {
+	return getActiveFonbook() ? getActiveFonbook()->changeFonbookEntry(id, fe) : false;
 }
 
-bool FonbookManager::SetDefault(size_t id, size_t pos) {
-	return GetActiveFonbook() ? GetActiveFonbook()->SetDefault(id, pos) : false;
+bool FonbookManager::setDefault(size_t id, size_t pos) {
+	return getActiveFonbook() ? getActiveFonbook()->setDefault(id, pos) : false;
 }
 
-void FonbookManager::AddFonbookEntry(FonbookEntry &fe, size_t position) {
-	if (GetActiveFonbook())
-		GetActiveFonbook()->AddFonbookEntry(fe, position);
+void FonbookManager::addFonbookEntry(FonbookEntry &fe, size_t position) {
+	if (getActiveFonbook())
+		getActiveFonbook()->addFonbookEntry(fe, position);
 }
 
-bool FonbookManager::DeleteFonbookEntry(size_t id) {
-	return GetActiveFonbook() ? GetActiveFonbook()->DeleteFonbookEntry(id) : false;
+bool FonbookManager::deleteFonbookEntry(size_t id) {
+	return getActiveFonbook() ? getActiveFonbook()->deleteFonbookEntry(id) : false;
 }
 
-void FonbookManager::Clear() {
-	if (GetActiveFonbook())
-		GetActiveFonbook()->Clear();
+void FonbookManager::clear() {
+	if (getActiveFonbook())
+		getActiveFonbook()->clear();
 }
 
-void FonbookManager::Save() {
-	if (GetActiveFonbook())
-			GetActiveFonbook()->Save();
+void FonbookManager::save() {
+	if (getActiveFonbook())
+			getActiveFonbook()->save();
 }
 
 bool FonbookManager::isDisplayable() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->isDisplayable() : false;
+	return getActiveFonbook() ? getActiveFonbook()->isDisplayable() : false;
 }
 
 bool FonbookManager::isInitialized() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->isInitialized() : false;
+	return getActiveFonbook() ? getActiveFonbook()->isInitialized() : false;
 }
 
 bool FonbookManager::isWriteable() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->isWriteable() : false;
+	return getActiveFonbook() ? getActiveFonbook()->isWriteable() : false;
 }
 
 bool FonbookManager::isModified() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->isModified() : false;
+	return getActiveFonbook() ? getActiveFonbook()->isModified() : false;
 }
 
 void FonbookManager::setInitialized(bool isInitialized) {
-	if (GetActiveFonbook())
-		GetActiveFonbook()->setInitialized(isInitialized);
+	if (getActiveFonbook())
+		getActiveFonbook()->setInitialized(isInitialized);
 }
 
-void FonbookManager::Sort(FonbookEntry::eElements element, bool ascending){
-	if (GetActiveFonbook())
-		GetActiveFonbook()->Sort(element, ascending);
+void FonbookManager::sort(FonbookEntry::eElements element, bool ascending){
+	if (getActiveFonbook())
+		getActiveFonbook()->sort(element, ascending);
 }
 
-size_t FonbookManager::GetFonbookSize() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->GetFonbookSize() : 0;
+size_t FonbookManager::getFonbookSize() const {
+	return getActiveFonbook() ? getActiveFonbook()->getFonbookSize() : 0;
 }
 
-std::string FonbookManager::GetTitle() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->GetTitle() : "";
+std::string FonbookManager::getTitle() const {
+	return getActiveFonbook() ? getActiveFonbook()->getTitle() : "";
 }
 
-std::string FonbookManager::GetTechId() const {
-	return GetActiveFonbook() ? GetActiveFonbook()->GetTechId() : "";
+std::string FonbookManager::getTechId() const {
+	return getActiveFonbook() ? getActiveFonbook()->getTechId() : "";
 }
 
-void FonbookManager::Reload() {
-	for (size_t i=0; i<gConfig->getFonbookIDs().size(); i++) {
-		fonbooks[gConfig->getFonbookIDs()[i]]->Reload();
+void FonbookManager::reload() {
+	for (auto id : gConfig->getFonbookIDs()) {
+		fonbooks[id]->reload();
 	}
 }
 
-Fonbooks *FonbookManager::GetFonbooks() {
+Fonbooks *FonbookManager::getFonbooks() {
 	return &fonbooks;
 }
 
diff --git a/libfritz++/FonbookManager.h b/libfritz++/FonbookManager.h
index 23ccfad..6d06f4a 100644
--- a/libfritz++/FonbookManager.h
+++ b/libfritz++/FonbookManager.h
@@ -32,7 +32,7 @@ private:
 	static FonbookManager* me;
 	Fonbooks fonbooks;
 	FonbookManager(bool saveOnShutdown);
-	Fonbook *GetActiveFonbook() const;
+	Fonbook *getActiveFonbook() const;
 	size_t activeFonbookPos;
 	bool saveOnShutdown;
 public:
@@ -69,108 +69,108 @@ public:
 	 * Switch to next displayable phonebook.
 	 * @return void
 	 */
-	void NextFonbook();
+	void nextFonbook();
 	/**
 	 * Resolves the number given to the corresponding name.
 	 * @param number to resolve
 	 * @return resolved name and type or the number, if unsuccessful
 	 */
-	virtual sResolveResult ResolveToName(std::string number);
+	sResolveResult resolveToName(std::string number) override;
 	/**
 	 * Returns a specific telephonebook entry.
 	 * @param id unique identifier of the requested entry
-	 * @return the entry with key id or NULL, if unsuccessful
+	 * @return the entry with key id or nullptr, if unsuccessful
 	 */
-	const FonbookEntry *RetrieveFonbookEntry(size_t id) const;
+	const FonbookEntry *retrieveFonbookEntry(size_t id) const override;
 	/**
 	 * Changes the Fonbook entry with the given id
 	 * @param id unique identifier to the entry to be changed
 	 * @param fe FonbookEntry with the new content
 	 * @return true, if successful
 	 */
-	virtual bool ChangeFonbookEntry(size_t id, FonbookEntry &fe);
+	bool changeFonbookEntry(size_t id, FonbookEntry &fe) override;
 	/**
 	 * Sets the default number for a Fonbook entry with the given id
 	 * @param id unique identifier to the entry to be changed
 	 * @param type the new default
 	 * @return true, if successful
 	 */
-	virtual bool SetDefault(size_t id, size_t pos);
+	virtual bool setDefault(size_t id, size_t pos);
 	/**
 	 * Adds a new entry to the phonebook.
 	 * @param fe a new phonebook entry
 	 * @return true, if add was successful
 	 */
-	virtual void AddFonbookEntry(FonbookEntry &fe, size_t position = std::string::npos);
+	void addFonbookEntry(FonbookEntry &fe, size_t position = std::string::npos) override;
 	/**
 	 * Adds a new entry to the phonebook.
 	 * @param id unique id to the entry to be deleted
 	 * @return true, if deletion was successful
 	 */
-	virtual bool DeleteFonbookEntry(size_t id);
+	bool deleteFonbookEntry(size_t id) override;
 	/**
 	 * Clears all entries from phonebook.
 	 */
-	virtual void Clear();
+	void clear() override;
 	/**
 	 * Save pending changes.
 	 * Can be called periodically to assert pending changes in a phone book are written.
 	 */
-	void Save();
+	void save() override;
 	/**
 	 * Returns if it is possible to display the entries of this phonebook.
 	 * @return true, if this phonebook has displayable entries. "Reverse lookup only" phonebooks must return false here.
 	 */
-	virtual bool isDisplayable() const;
+	bool isDisplayable() const override;
 	/**
 	 * Returns if this phonebook is ready to use.
 	 * @return true, if this phonebook is ready to use
 	 */
-	virtual bool isInitialized() const;
+	bool isInitialized() const override;
 	/**
 	 * Returns if this phonebook is writeable, e.g. entries can be added or modified.
 	 * @return true, if this phonebook is writeable
 	 */
-	virtual bool isWriteable() const;
+	bool isWriteable() const override;
 	/**
 	 * Returns if this phonebook has changes that are not yet written.
 	 * @return true, if changes are pending
 	 */
-	virtual bool isModified() const;
+	bool isModified() const override;
 	/**
 	 * Sets the initialized-status.
 	 * @param isInititalized the value initialized is set to
 	 */
-	virtual void setInitialized(bool isInitialized);
+	void setInitialized(bool isInitialized) override;
 	/**
 	 * Sorts the phonebook's entries by the given element and in given order.
 	 * @param the element used for sorting
 	 * @param true if sort order is ascending, false otherwise
 	 */
-	virtual void Sort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true);
+	void sort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true) override;
 	/**
 	 *  Returns the number of entries in the telephonebook.
 	 * @return the number of entries or cFonbook::npos, if requesting specific telephonebook entries is not possible for this telephonebook
 	 */
-	size_t GetFonbookSize() const;
+	size_t getFonbookSize() const override;
 	/**
 	 *  Reloads the telephonebook's content
 	 */
-	void Reload();
+	void reload() override;
 	/**
 	 *  Returns a string that should be displayed as title in the menu when the telephonebook is displayed.
 	 */
-	std::string GetTitle() const;
+	std::string getTitle() const override;
 	/**
 	 * Returns the technical id of this phonebook. This id has to be unique among all phonebooks and is used when storing
 	 * the plugin's setup.
 	 * @return the technical id
 	 */
-	virtual std::string GetTechId() const;
+	virtual std::string getTechId() const override;
 	/**
 	 *
 	 */
-	Fonbooks *GetFonbooks();
+	Fonbooks *getFonbooks();
 };
 
 }
diff --git a/libfritz++/Fonbooks.cpp b/libfritz++/Fonbooks.cpp
index 271e0f4..7a1bf1e 100644
--- a/libfritz++/Fonbooks.cpp
+++ b/libfritz++/Fonbooks.cpp
@@ -33,12 +33,11 @@ Fonbooks::~Fonbooks()
 }
 
 Fonbook *Fonbooks::operator[](std::string key) const {
-	for (size_t i=0; i<this->size(); i++) {
-		if ((*this)[i]->GetTechId() == key) {
-			return ((*this)[i]);
-		}
+	for (auto fonbook : *this) {
+		if (fonbook->getTechId() == key)
+				return fonbook;
 	}
-	return NULL;
+	return nullptr;
 }
 
 Fonbook *Fonbooks::operator[](size_t i) const {
diff --git a/libfritz++/FritzClient.cpp b/libfritz++/FritzClient.cpp
index f045a7a..37d9dd0 100644
--- a/libfritz++/FritzClient.cpp
+++ b/libfritz++/FritzClient.cpp
@@ -21,27 +21,27 @@
 
 #include "FritzClient.h"
 
-#include <cc++/thread.h>
 #include <cstring>
 #include <iomanip>
 #include <gcrypt.h>
 
 #include "Config.h"
 #include "Tools.h"
+#include <liblog++/Log.h>
+#include <libconv++/CharsetConverter.h>
 
 #define RETRY_BEGIN                                  \
-	    ost::Thread::setException(ost::Thread::throwException); \
     	unsigned int retry_delay = RETRY_DELAY / 2;  \
 		bool dataRead = false;                       \
 		do {  				                         \
 			try {                                    \
-				validPassword = Login();                             \
+				validPassword = login();                             \
 				retry_delay = retry_delay > 1800 ? 3600 : retry_delay * 2;
 
 #define RETRY_END																							\
 			dataRead = true;                                                                                \
-		} catch (ost::SockException &se) {																\
-			ERR("Exception in connection to " << gConfig->getUrl() << " - " << se.what());								\
+		} catch (std::runtime_error &re) {																\
+			ERR("Exception in connection to " << gConfig->getUrl() << " - " << re.what());								\
 			ERR("waiting " << retry_delay << " seconds before retrying");	\
 			sleep(retry_delay); /* delay a possible retry */												\
 		}																									\
@@ -49,35 +49,34 @@
 
 namespace fritz {
 
-ost::Mutex* FritzClient::mutex = new ost::Mutex();
+std::mutex* FritzClient::mutex = new std::mutex();
 
-FritzClient::FritzClient() {
+FritzClient::FritzClient()
+: httpClient{gConfig->getUrl(), gConfig->getUiPort()} {
 	validPassword = false;
-	mutex->enterMutex();
+	mutex->lock();
 	// init libgcrypt
-	gcry_check_version (NULL);
+	gcry_check_version (nullptr);
     // disable secure memory
     gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
     gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
     // init HttpClient
-    httpClient = new HttpClient(gConfig->getUrl(), gConfig->getUiPort());
-    soapClient = new SoapClient(gConfig->getUrl(), gConfig->getUpnpPort());
+    soapClient = new network::SoapClient(gConfig->getUrl(), gConfig->getUpnpPort());
 }
 
 FritzClient::~FritzClient() {
-	delete httpClient;
-	mutex->leaveMutex();
+	mutex->unlock();
 }
 
-std::string FritzClient::CalculateLoginResponse(std::string challenge) {
+std::string FritzClient::calculateLoginResponse(std::string challenge) {
 	std::string challengePwd = challenge + '-' + gConfig->getPassword();
 	// the box needs an md5 sum of the string "challenge-password"
 	// to make things worse, it needs this in UTF-16LE character set
 	// last but not least, for "compatibility" reasons (*LOL*) we have to replace
 	// every char > "0xFF 0x00" with "0x2e 0x00"
-	CharSetConv conv(NULL, "UTF-16LE");
+	convert::CharsetConverter conv("", "UTF-16LE");
 	char challengePwdConv[challengePwd.length()*2];
-	memcpy(challengePwdConv, conv.Convert(challengePwd.c_str()), challengePwd.length()*2);
+	memcpy(challengePwdConv, conv.convert(challengePwd).c_str(), challengePwd.length()*2);
 	for (size_t pos=1; pos < challengePwd.length()*2; pos+= 2)
 		if (challengePwdConv[pos] != 0x00) {
 			challengePwdConv[pos] = 0x00;
@@ -92,13 +91,12 @@ std::string FritzClient::CalculateLoginResponse(std::string challenge) {
 	return response.str();
 }
 
-std::string FritzClient::UrlEncode(std::string &s_input) {
+std::string FritzClient::urlEncode(const std::string &s_input) {
 	std::string result;
 	std::string s;
 	std::string hex = "0123456789abcdef";
-	CharSetConv *conv = new CharSetConv(CharSetConv::SystemCharacterTable(), "ISO-8859-15");
-	s = conv->Convert(s_input.c_str());
-	delete(conv);
+	convert::CharsetConverter conv("", "ISO-8859-15");
+	s = conv.convert(s_input);
 	for (unsigned int i=0; i<s.length(); i++) {
 		if( ('a' <= s[i] && s[i] <= 'z')
 				|| ('A' <= s[i] && s[i] <= 'Z')
@@ -110,15 +108,12 @@ std::string FritzClient::UrlEncode(std::string &s_input) {
 			result += hex[(unsigned char) s[i] & 0x0f];
 		}
 	}
-//	TODO: With introduction of libccgnu2, this implementation could be replaced by
-//	char result[4*s_input.length()];
-//	ost::urlEncode(s_input.c_str(), result, sizeof(result));
 	return result;
 }
 
-bool FritzClient::Login() {
+bool FritzClient::login() {
 	// when using SIDs, a new login is only needed if the last request was more than 5 minutes ago
-	if ((gConfig->getLoginType() == Config::SID || gConfig->getLoginType() == Config::LUA) && (time(NULL) - gConfig->getLastRequestTime() < 300)) {
+	if ((gConfig->getLoginType() == Config::SID || gConfig->getLoginType() == Config::LUA) && (time(nullptr) - gConfig->getLastRequestTime() < 300)) {
 		return true;
 	}
 
@@ -129,15 +124,13 @@ bool FritzClient::Login() {
 		DBG("requesting login_sid.lua from Fritz!Box.");
 		// might return 404 with older fw-versions, our httpClient throws a SockeException for this, catched here
 		try {
-		  sXml = httpClient->Get(std::stringstream().flush()
-			     << "/login_sid.lua?sid=" << gConfig->getSid());
-		} catch (ost::SockException &se) {}
+		  sXml = httpClient.get("/login_sid.lua", {{"sid", gConfig->getSid()}});
+		} catch (std::runtime_error &re) {}
 		if (sXml.find("<Rights") != std::string::npos)
 			gConfig->setLoginType(Config::LUA);
 		else {
 			DBG("requesting login_sid.xml from Fritz!Box.");
-			sXml = httpClient->Get(std::stringstream().flush()
-					<< "/cgi-bin/webcm?getpage=../html/login_sid.xml");
+			sXml = httpClient.get("/cgi-bin/webcm", {{"getpage", "../html/login_sid.xml"}});
 			if (sXml.find("<iswriteaccess>") != std::string::npos)
 				gConfig->setLoginType(Config::SID);
 			else
@@ -147,21 +140,11 @@ bool FritzClient::Login() {
 
 	if (gConfig->getLoginType() == Config::SID || gConfig->getLoginType() == Config::LUA) {
 		std::stringstream loginPath;
-//		std::stringstream postdataLogout;
 		if (gConfig->getLoginType() == Config::LUA) {
 			loginPath << "/login_sid.lua";
-//			postdataLogout << "sid=" << gConfig->getSid() << "&logout=abc";
 		} else {
 			loginPath << "/cgi-bin/webcm";
-//			postdataLogout << "sid=" << gConfig->getSid() << "&security:command/logout=abc";
 		}
-//		DBG("logging into fritz box using SIDs.");
-//		if (gConfig->getSid().length() > 0) {
-//			// logout, drop old SID (if FB has not already dropped this SID because of a timeout)
-//			DBG("dropping old SID");
-//			std::string sDummy;
-//			sDummy = httpClient->Post(loginPath, postdataLogout);
-//		}
 		// check if no password is needed (SID is directly available)
 		size_t sidStart = sXml.find("<SID>");
 		if (sidStart == std::string::npos) {
@@ -187,18 +170,22 @@ bool FritzClient::Login() {
 			challengeStart += 11;
 			size_t challengeStop = sXml.find("<", challengeStart);
             std::string challenge = sXml.substr(challengeStart, challengeStop - challengeStart);
-            std::string response = CalculateLoginResponse(challenge);
+            std::string response = calculateLoginResponse(challenge);
             // send response to box
 			std::string sMsg;
 
-			std::stringstream postdata;
+			network::HttpClient::param_t postdata;
 			if (gConfig->getLoginType() == Config::SID)
-				postdata  << "login:command/response=" << response
-				          << "&getpage=../html/de/menus/menu2.html";
+				postdata = {{"login:command/response", response},
+				            {"getpage", "../html/de/menus/menu2.html"}};
 			else
-				postdata << "username=&response=" << response;
-			DBG("Sending login request...");
-			sMsg = httpClient->Post(loginPath, postdata);
+                postdata = {{"username", gConfig->getUsername()}, {"response", response }};
+
+            DBG("Sending login request "
+             << ( gConfig->getUsername().size() ? "for user " : "" )
+             << gConfig->getUsername() << "...");
+
+            sMsg = httpClient.post(loginPath.str(), postdata);
 			size_t sidStart, sidStop;
 			if (gConfig->getLoginType() == Config::SID) {
 				sidStart = sMsg.find("name=\"sid\"");
@@ -237,11 +224,8 @@ bool FritzClient::Login() {
 
 		std::string sMsg;
 
-		sMsg = httpClient->Post(std::stringstream().flush()
-			<< "/cgi-bin/webcm",
-			std::stringstream().flush()
-			<< "login:command/password="
-			<< UrlEncode(gConfig->getPassword()));
+		sMsg = httpClient.post("/cgi-bin/webcm",
+				               {{"login:command/password", urlEncode(gConfig->getPassword())}});
 
 		// determine if login was successful
 		if (sMsg.find("class=\"errorMessage\"") != std::string::npos) {
@@ -254,21 +238,21 @@ bool FritzClient::Login() {
 	return false;
 }
 
-std::string FritzClient::GetLang() {
+std::string FritzClient::getLang() {
 	if ( gConfig && gConfig->getLang().size() == 0) {
 		std::vector<std::string> langs;
 		langs.push_back("en");
 		langs.push_back("de");
 		langs.push_back("fr");
-		for (unsigned int p=0; p<langs.size(); p++) {
+		for (auto lang : langs) {
 			std::string sMsg;
-			sMsg = httpClient->Get(std::stringstream().flush()
-				<< "/cgi-bin/webcm?getpage=../html/"
-				<< langs[p]
-				<< "/menus/menu2.html"
-				<< (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
+			sMsg = httpClient.get("/cgi-bin/webcm",
+					{
+							{"getpage", "../html/" + lang + "/menus/menu2.html"},
+							{"sid", gConfig->getSid() }
+					});
 			if (sMsg.find("<html>") != std::string::npos) {
-				gConfig->setLang(langs[p]);
+				gConfig->setLang(lang);
 				DBG("interface language is " << gConfig->getLang().c_str());
 				return gConfig->getLang();
 			}
@@ -279,114 +263,112 @@ std::string FritzClient::GetLang() {
 	return gConfig->getLang();
 }
 
-bool FritzClient::InitCall(std::string &number) {
+bool FritzClient::initCall(std::string &number) {
 	std::string msg;
 	if (number.length() == 0)
 		return false;
-	if (!Login())
+	if (!login())
 		return false;
 	try {
 		INF("sending call init request " << (gConfig->logPersonalInfo() ? number.c_str() : HIDDEN));
-		msg = httpClient->Post(std::stringstream().flush()
-		   << "/cgi-bin/webcm",
-		   std::stringstream().flush()
-		   << "getpage=../html/"
-		   << GetLang()
-		   << "/menus/menu2.html&var%3Apagename=fonbuch&var%3Amenu=home&telcfg%3Acommand/Dial="
-		   << number
-  	       << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
+		network::HttpClient::param_t params =
+		{
+	      { "getpage", "../html/" + getLang() + "/menus/menu2.html" },
+		  { "var%3Apagename", "fonbuch" },
+		  { "var%3Amenu", "home" },
+		  { "telcfg%3Acommand/Dial", number },
+	      { "sid", gConfig->getSid() }
+		};
+		msg = httpClient.post("/cgi-bin/webcm", params);
 		INF("call initiated.");
-	} catch (ost::SockException &se) {
-		ERR("Exception - " << se.what());
+	} catch (std::runtime_error &re) {
+		ERR("Exception - " << re.what());
 		return false;
 	}
 	return true;
 }
 
-std::string FritzClient::RequestLocationSettings() {
+std::string FritzClient::requestLocationSettings() {
 	std::string msg;
 
 	RETRY_BEGIN {
 		if (gConfig->getSid().size()) {
 			DBG("Looking up Phone Settings (using lua)...");
 			try {
-				msg = httpClient->Get(std::stringstream().flush()
-					  << "/fon_num/sip_option.lua?sid=" << gConfig->getSid());
-			} catch (ost::SockException &se) {}
+				msg = httpClient.get("/fon_num/sip_option.lua", {{"sid", gConfig->getSid()}});
+			} catch (std::runtime_error &re) {}
 			if (msg.find("<!-- pagename:/fon_num/sip_option.lua-->") != std::string::npos)
 				return msg;
 			DBG("failed.");
 		}
 
 		DBG("Looking up Phone Settings (using webcm)...");
-		msg = httpClient->Get(std::stringstream().flush()
-			<< "/cgi-bin/webcm?getpage=../html/"
-			<<  GetLang()
-			<< "/menus/menu2.html&var%3Alang="
-			<<  GetLang()
-			<< "&var%3Apagename=sipoptionen&var%3Amenu=fon"
-			<< (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
+		msg = httpClient.get("/cgi-bin/webcm",
+				{
+						{ "getpage", "../html/" + getLang() + "/menus/menu2.html" },
+						{ "var%3Alang", getLang() },
+						{ "var%3Apagename", "sipoptionen" },
+						{ "var%3Amenu", "fon" },
+						{ "sid", gConfig->getSid() },
+				});
 	} RETRY_END
 	return msg;
 }
 
-std::string FritzClient::RequestSipSettings() {
+std::string FritzClient::requestSipSettings() {
 	std::string msg;
 
 	RETRY_BEGIN {
 		if (gConfig->getSid().size()) {
 			DBG("Looking up SIP Settings (using lua)...");
 			try {
-				msg = httpClient->Get(std::stringstream().flush()
-					  << "/fon_num/fon_num_list.lua?sid=" << gConfig->getSid());
-			} catch (ost::SockException &se) {}
+				msg = httpClient.get("/fon_num/fon_num_list.lua", {{"sid", gConfig->getSid()}});
+			} catch (std::runtime_error &re) {}
 			if (msg.find("<!-- pagename:/fon_num/fon_num_list.lua-->") != std::string::npos)
 				return msg;
 			DBG("failed.");
 		}
 
 		DBG("Looking up SIP Settings (using webcm)...");
-		msg = httpClient->Get(std::stringstream().flush()
-				<< "/cgi-bin/webcm?getpage=../html/"
-				<< GetLang()
-				<< "/menus/menu2.html&var%3Alang="
-				<< GetLang()
-				<< "&var%3Apagename=siplist&var%3Amenu=fon"
-				<< (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
+		msg = httpClient.get("/cgi-bin/webcm",
+				{
+						{ "getpage", "../html/" + getLang() + "/menus/menu2.html" },
+						{ "var%3Alang", getLang() },
+						{ "var%3Apagename", "siplist" },
+						{ "var%3Amenu", "fon" },
+						{ "sid", gConfig->getSid() },
+				});
 	} RETRY_END
 	return msg;
 }
 
-std::string FritzClient::RequestCallList () {
+std::string FritzClient::requestCallList () {
 	std::string msg = "";
 	std::string csv = "";
 	RETRY_BEGIN {
 		// now, process call list
 		DBG("sending callList update request.");
 		// force an update of the fritz!box csv list and wait until all data is received
-		msg = httpClient->Get(std::stringstream().flush()
-			<< "/cgi-bin/webcm?getpage=../html/"
-			<<  GetLang()
-			<< "/menus/menu2.html&var:lang="
-			<<  GetLang()
-			<< "&var:pagename=foncalls&var:menu=fon"
-			<< (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
-
+		msg = httpClient.get("/cgi-bin/webcm",
+				{
+						{ "getpage", "../html/" + getLang() + "/menus/menu2.html" },
+						{ "var%3Alang", getLang() },
+						{ "var%3Apagename", "foncall" },
+						{ "var%3Amenu", "fon" },
+						{ "sid", gConfig->getSid() },
+				});
 		// new method to request call list (FW >= xx.05.50?)
 		try {
 			DBG("sending callList request (using lua)...");
-			csv = httpClient->Get(std::stringstream().flush() << "/fon_num/foncalls_list.lua?"
-			  	                  << "csv=&sid=" << gConfig->getSid());
+			csv = httpClient.get("/fon_num/foncalls_list.lua",
+					{
+							{ "csv", "" },
+							{ "sid", gConfig->getSid() },
+					});
 			if (csv.find("Typ;Datum;Name;") != std::string::npos) {
-				// we assume utf8 as encoding
-				// the FB sends encoding in the response, however we do not parse it, yet
-				CharSetConv *conv = new CharSetConv("utf8", CharSetConv::SystemCharacterTable());
-				const char *csv_converted = conv->Convert(csv.c_str());
-				csv = csv_converted;
-				delete(conv);
 				return csv;
 			}
-		} catch (ost::SockException e) {}
+		} catch (std::runtime_error &re) {}
 
 		// old method, parsing url to csv from page above
 
@@ -397,36 +379,35 @@ std::string FritzClient::RequestCallList () {
 		std::string csvUrl    = msg.substr(urlStart, urlStop-urlStart);
 		// retrieve csv list
 		DBG("sending callList request (using webcm)...");
-		csv = httpClient->Get(std::stringstream().flush()
-				<< "/cgi-bin/webcm?getpage="
-				<<  csvUrl
-				<< (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
+		csv = httpClient.get("/cgi-bin/webcm",
+				{
+						{ "getpage", csvUrl },
+						{ "sid", gConfig->getSid() },
+				});
 
 		// convert answer to current SystemCodeSet (we assume, Fritz!Box sends its answer in latin15)
-		CharSetConv *conv = new CharSetConv("ISO-8859-15", CharSetConv::SystemCharacterTable());
-		const char *csv_converted = conv->Convert(csv.c_str());
-		csv = csv_converted;
-		delete(conv);
+		convert::CharsetConverter conv("ISO-8859-15");
+		csv = conv.convert(csv);
 	} RETRY_END
 	return csv;
 }
 
-std::string FritzClient::RequestFonbook () {
+std::string FritzClient::requestFonbook () {
 	std::string msg;
 	// new method, returns an XML
 	RETRY_BEGIN {
 		if (gConfig->getSid().length()) {
-			ost2::MIMEMultipartForm *mmpf = new ost2::MIMEMultipartForm();
-
-			new ost2::MIMEFormData( mmpf, "sid", gConfig->getSid().c_str());
-			new ost2::MIMEFormData( mmpf, "PhonebookId", "0");
-			new ost2::MIMEFormData( mmpf, "PhonebookExportName", "Telefonbuch");
-			new ost2::MIMEFormData( mmpf, "PhonebookExport", "");
+			network::HttpClient::param_t postdata =
+			{
+					{ "sid", gConfig->getSid() },
+					{ "PhonebookId", "0" },
+					{ "PhonebookExportName", "Telefonbuch" },
+					{ "PhonebookExport", "" }
+			};
 			DBG("sending fonbook XML request.");
 			try {
-				msg = httpClient->PostMIME(std::stringstream().flush()
-				  	  << "/cgi-bin/firmwarecfg", *mmpf);
-			} catch (ost::SockException &se) {}
+				msg = httpClient.postMIME("/cgi-bin/firmwarecfg", postdata);
+			} catch (std::runtime_error &re) {}
 			if (msg.find("<phonebooks>") != std::string::npos) {
 				return msg;
 			}
@@ -434,31 +415,30 @@ std::string FritzClient::RequestFonbook () {
 
 	// use old fashioned website (for old FW versions)
 		DBG("sending fonbook HTML request.");
-		msg = httpClient->Get(std::stringstream().flush()
-			<< "/cgi-bin/webcm?getpage=../html/"
-			<< GetLang()
-			<< "/menus/menu2.html"
-			<< "&var:lang="
-			<< GetLang()
-			<< "&var:pagename=fonbuch&var:menu=fon"
-			<< (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid());
+		msg = httpClient.get("/cgi-bin/webcm",
+				{
+						{ "getpage", "../html/" + getLang() + "/menus/menu2.html" },
+						{ "var%3Alang", getLang() },
+						{ "var%3Apagename", "fonbuch" },
+						{ "var%3Amenu", "fon" },
+						{ "sid", gConfig->getSid() },
+				});
 	} RETRY_END
 
 	return msg;
 }
 
-void FritzClient::WriteFonbook(std::string xmlData) {
+void FritzClient::writeFonbook(std::string xmlData) {
 	std::string msg;
 	DBG("Saving XML Fonbook to FB...");
 	RETRY_BEGIN {
-		ost2::MIMEMultipartForm *mmpf = new ost2::MIMEMultipartForm();
-
-		new ost2::MIMEFormData( mmpf, "sid", gConfig->getSid().c_str());
-		new ost2::MIMEFormData( mmpf, "PhonebookId", "0");
-		new ost2::MIMEFormData( mmpf, "PhonebookImportFile", "FRITZ.Box_Telefonbuch_01.01.10_0000.xml", "text/xml", xmlData.c_str());
-
-		msg = httpClient->PostMIME(std::stringstream().flush()
-				<< "/cgi-bin/firmwarecfg", *mmpf);
+		network::HttpClient::param_t postdata =
+		{
+				{ "sid", gConfig->getSid() },
+				{ "PhonebookId", "0" },
+				{ "PhonebookImportFile\"; filename=\"FRITZ.Box_Telefonbuch.xml", xmlData }
+		};
+		msg = httpClient.postMIME("/cgi-bin/firmwarecfg", postdata);
 	} RETRY_END
 }
 
@@ -467,20 +447,17 @@ bool FritzClient::reconnectISP() {
 	std::string msg;
 	DBG("Sending reconnect request to FB.");
 	try {
-		msg = soapClient->Post(
-				std::stringstream().flush()
-				<< "/upnp/control/WANIPConn1",
-				std::stringstream().flush()
-				<< "urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination",
-				std::stringstream().flush()
-				<< "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
-				   "<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"
-				   "<s:Body>"
-				   "<u:ForceTermination xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\" />"
-				   "</s:Body>"
-				   "</s:Envelope>");
-	} catch (ost::SockException &se) {
-		ERR("Exception in connection to " << gConfig->getUrl() << " - " << se.what());
+		msg = soapClient->post(
+				"/upnp/control/WANIPConn1",
+				"urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination",
+				"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+				"<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+				"<s:Body>"
+				"<u:ForceTermination xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\" />"
+				"</s:Body>"
+				"</s:Envelope>");
+	} catch (std::runtime_error &re) {
+		ERR("Exception in connection to " << gConfig->getUrl() << " - " << re.what());
 		return false;
 	}
 	if (msg.find("ForceTerminationResponse") == std::string::npos)
@@ -493,20 +470,17 @@ std::string FritzClient::getCurrentIP() {
 	std::string msg;
 	DBG("Sending reconnect request to FB.");
 	try {
-		msg = soapClient->Post(
-				std::stringstream().flush()
-				<< "/upnp/control/WANIPConn1",
-				std::stringstream().flush()
-				<< "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress",
-				std::stringstream().flush()
-				<< "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
-				   "<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"
-				   "<s:Body>"
-				   "<u:GetExternalIPAddress xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\" />"
-				   "</s:Body>"
-				   "</s:Envelope>");
-	} catch (ost::SockException &se) {
-		ERR("Exception in connection to " << gConfig->getUrl() << " - " << se.what());
+		msg = soapClient->post(
+				"/upnp/control/WANIPConn1",
+				"urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress",
+				"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+				"<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+				"<s:Body>"
+				"<u:GetExternalIPAddress xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\" />"
+				"</s:Body>"
+				"</s:Envelope>");
+	} catch (std::runtime_error &re) {
+		ERR("Exception in connection to " << gConfig->getUrl() << " - " << re.what());
 		return "";
 	}
 	DBG("Parsing reply...");
diff --git a/libfritz++/FritzClient.h b/libfritz++/FritzClient.h
index 484d8b2..e8cdff6 100644
--- a/libfritz++/FritzClient.h
+++ b/libfritz++/FritzClient.h
@@ -23,30 +23,32 @@
 #define FRITZCLIENT_H
 
 #include <cstdlib>
+#include <mutex>
 
-#include "SoapClient.h"
+#include <libnet++/SoapClient.h>
+#include <libnet++/HttpClient.h>
 
 namespace fritz {
 
 class FritzClient {
 private:
-	static ost::Mutex *mutex;
-    std::string CalculateLoginResponse(std::string challenge);
-	std::string UrlEncode(std::string &s);
-	bool Login();
-	std::string GetLang();
+	static std::mutex *mutex;
+    std::string calculateLoginResponse(std::string challenge);
+	std::string urlEncode(const std::string &s);
+	bool login();
+	std::string getLang();
 	bool validPassword;
-	HttpClient *httpClient;
-	SoapClient *soapClient;
+	network::HttpClient httpClient;
+	network::SoapClient *soapClient;
 public:
 	FritzClient ();
 	virtual ~FritzClient();
-	virtual bool InitCall(std::string &number);
-	virtual std::string RequestLocationSettings();
-	virtual std::string RequestSipSettings();
-	virtual std::string RequestCallList();
-	virtual std::string RequestFonbook();
-	virtual void WriteFonbook(std::string xmlData);
+	virtual bool initCall(std::string &number);
+	virtual std::string requestLocationSettings();
+	virtual std::string requestSipSettings();
+	virtual std::string requestCallList();
+	virtual std::string requestFonbook();
+	virtual void writeFonbook(std::string xmlData);
 	virtual bool hasValidPassword() { return validPassword; }
 	virtual bool reconnectISP();
 	virtual std::string getCurrentIP();
diff --git a/libfritz++/FritzFonbook.cpp b/libfritz++/FritzFonbook.cpp
index 2f8d303..bc8d035 100644
--- a/libfritz++/FritzFonbook.cpp
+++ b/libfritz++/FritzFonbook.cpp
@@ -27,47 +27,53 @@
 #include "Config.h"
 #include "FritzClient.h"
 #include "Tools.h"
+#include <liblog++/Log.h>
+#include <libconv++/CharsetConverter.h>
+#include <libconv++/EntityConverter.h>
 
 namespace fritz {
 
 FritzFonbook::FritzFonbook()
-:Thread(), XmlFonbook(I18N_NOOP("Fritz!Box phone book"), "FRITZ", true)
+:XmlFonbook(I18N_NOOP("Fritz!Box phone book"), "FRITZ", true), thread{nullptr}
 {
-	setCancel(cancelDeferred);
 	setInitialized(false);
 }
 
 FritzFonbook::~FritzFonbook() {
-	terminate();
+	if (thread) {
+		thread->join();
+		delete thread;
+	}
 }
 
-bool FritzFonbook::Initialize() {
-	return start();
+bool FritzFonbook::initialize() {
+	reload();
+	return true;
 }
 
 void FritzFonbook::run() {
 	DBG("FritzFonbook thread started");
 	setInitialized(false);
-	Clear();
+	clear();
 
 	FritzClient *fc = gConfig->fritzClientFactory->create();
-	std::string msg = fc->RequestFonbook();
+	std::string msg = fc->requestFonbook();
 	delete fc;
 
 	if (msg.find("<?xml") == std::string::npos)
-		ParseHtmlFonbook(&msg);
+		parseHtmlFonbook(&msg);
 	else {
-		ParseXmlFonbook(&msg);
+		parseXmlFonbook(&msg);
 		setWriteable(); // we can write xml back to the FB
 	}
 
 	setInitialized(true);
 
-	Sort(FonbookEntry::ELEM_NAME, true);
+	sort(FonbookEntry::ELEM_NAME, true);
 	DBG("FritzFonbook thread ended");
 }
 
-void FritzFonbook::ParseHtmlFonbook(std::string *msg) {
+void FritzFonbook::parseHtmlFonbook(std::string *msg) {
 	DBG("Parsing fonbook using html parser.")
 	// determine charset (default for old firmware versions is iso-8859-15)
 	size_t pos;
@@ -80,10 +86,7 @@ void FritzFonbook::ParseHtmlFonbook(std::string *msg) {
 	}
 	DBG("using charset " << charset);
 
-	CharSetConv *conv = new CharSetConv(charset.c_str(), CharSetConv::SystemCharacterTable());
-	const char *s_converted = conv->Convert(msg->c_str());
-	std::string msgConv = s_converted;
-	delete (conv);
+	std::string msgConv = convert::CharsetConverter::ConvertToLocalEncoding(*msg, charset);
 
 	// parse answer
 	pos = 0;
@@ -99,12 +102,12 @@ void FritzFonbook::ParseHtmlFonbook(std::string *msg) {
 		if (msgConv[nameStart] == '!') // skip '!' char, older firmware versions use to mark important
 			nameStart++;
 		std::string namePart = msgConv.substr(nameStart, nameStop - nameStart+1);
-		std::string namePart2 = convertEntities(namePart);
+		std::string namePart2 = convert::EntityConverter::DecodeEntities(namePart);
 		std::string numberPart = msgConv.substr(numberStart, numberStop - numberStart+1);
 		if (namePart2.length() && numberPart.length()) {
 			FonbookEntry fe(namePart2, false); // TODO: important is not parsed here
-			fe.AddNumber(0, numberPart, FonbookEntry::TYPE_NONE);
-			AddFonbookEntry(fe);
+			fe.addNumber(numberPart, FonbookEntry::TYPE_NONE);
+			addFonbookEntry(fe);
 			//DBG("(%s / %s)", fe.number.c_str(), fe.name.c_str());
 		}
 		pos += 10;
@@ -120,11 +123,10 @@ void FritzFonbook::ParseHtmlFonbook(std::string *msg) {
 		int nameStart     = msgConv.find(',', pos+7)          +3;
 		int nameStop      = msgConv.find('"', nameStart)   -1;
 		std::string namePart   = msgConv.substr(nameStart, nameStop - nameStart+1);
-		std::string namePartConv  = convertEntities(namePart);
+		std::string namePartConv  = convert::EntityConverter::DecodeEntities(namePart);
 		FonbookEntry fe(namePartConv, false); // TODO: important is not parsed here
 
 		size_t posInner = pos;
-		size_t numberCount = 0;
 		// iterate over all tagNumbers between two tagNames
 		while ((posInner = msgConv.find(tagNumber, ++posInner)) != std::string::npos && posInner < msgConv.find(tagName, pos+1)) {
 			int typeStart     = posInner + 9;
@@ -142,24 +144,28 @@ void FritzFonbook::ParseHtmlFonbook(std::string *msg) {
 				type = FonbookEntry::TYPE_WORK;
 
 			if (namePartConv.length() && numberPart.length()) {
-				fe.AddNumber(numberCount++, numberPart, type); // TODO: quickdial, vanity and priority not parsed here
+				fe.addNumber(numberPart, type); // TODO: quickdial, vanity and priority not parsed here
 				//DBG("(%s / %s / %i)", fe.number.c_str(), fe.name.c_str(), fe.type);
 			}
 			count++;
 		}
-		AddFonbookEntry(fe);
+		addFonbookEntry(fe);
 	}
 }
 
-void FritzFonbook::Reload() {
-	start();
+void FritzFonbook::reload() {
+	if (thread) {
+		thread->join();
+		delete thread;
+	}
+	thread = new std::thread(&FritzFonbook::run, this);
 }
 
-void FritzFonbook::Write() {
+void FritzFonbook::write() {
 	if (isWriteable()) {
 		INF("Uploading phonebook to Fritz!Box.");
 		FritzClient *fc = gConfig->fritzClientFactory->create();
-		fc->WriteFonbook(SerializeToXml());
+		fc->writeFonbook(serializeToXml());
 		delete fc;
 	}
 }
diff --git a/libfritz++/FritzFonbook.h b/libfritz++/FritzFonbook.h
index aa352d3..a7bb044 100644
--- a/libfritz++/FritzFonbook.h
+++ b/libfritz++/FritzFonbook.h
@@ -22,23 +22,25 @@
 #ifndef FRITZFONBOOK_H
 #define FRITZFONBOOK_H
 
-#include <cc++/thread.h>
+#include <string>
+#include <thread>
 
 #include "XmlFonbook.h"
 
 namespace fritz{
 
-class FritzFonbook : public ost::Thread, public XmlFonbook {
+class FritzFonbook : public XmlFonbook {
 			friend class FonbookManager;
 private:
+	std::thread *thread;
 	FritzFonbook();
-	void ParseHtmlFonbook(std::string *msg);
-	virtual void Write();
+	void parseHtmlFonbook(std::string *msg);
+	void write() override;
 public:
 	virtual ~FritzFonbook();
-	bool Initialize();
+	bool initialize() override;
 	void run();
-	void Reload();
+	void reload() override;
 };
 
 }
diff --git a/libfritz++/HISTORY b/libfritz++/HISTORY
index 41852a1..edf79be 100644
--- a/libfritz++/HISTORY
+++ b/libfritz++/HISTORY
@@ -283,5 +283,14 @@
 - Fix resolving test in tel.local.ch phonebook
 - Add support for FB phonebooks with >3 numbers per entry, fixes a sigsev 
   on startup using such phonebooks
+- Various refactoring to split loggin, networking and char conversion in
+  separate libraries
+- New dependency boost::asio, dropped dependency to commoncpp 
  
+ 2013-05:
+ - Fix resolve in TelLocalChFonbook
+ 
+ 2013-06:
+ - Add support for username authentication
+ - Fix some warning about unused parameters
 
diff --git a/libfritz++/HttpClient.cpp b/libfritz++/HttpClient.cpp
deleted file mode 100644
index 5bb2d4a..0000000
--- a/libfritz++/HttpClient.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * libfritz++
- *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#include "HttpClient.h"
-
-#include <cc++/socket.h>
-
-#include "Config.h"
-
-namespace fritz {
-
-HttpClient::HttpClient(std::string &host, int port) :
-	TcpClient(host, port, new ost2::URLStream()) {
-	urlStream = static_cast<ost2::URLStream *>(stream);
-}
-
-HttpClient::HttpClient(std::string &host, int port, ost2::URLStream *stream) :
-	TcpClient(host, port, stream) {
-	urlStream = static_cast<ost2::URLStream *>(stream);
-}
-
-HttpClient::~HttpClient() {
-}
-
-std::string HttpClient::BuildUrl(const std::ostream & url){
-	std::stringstream request;
-	request << "http://" <<  host << ":" << port << url.rdbuf(); //todo: url must start with '/'
-	return request.str();
-}
-std::string HttpClient::Result() {
-    std::string response;
-	while (!urlStream->eof())  {
-	  char buffer[1024];
-	  urlStream->read(buffer, sizeof(buffer)-1);
-	  buffer[urlStream->gcount()] = 0;
-	  response += buffer;
-	}
-	urlStream->close();
-	return response;
-}
-
-std::string HttpClient::Get(const std::ostream& url) {
-	urlStream->setAgent("Lynx/2.8.5");
-
-	ost2::URLStream::Error returnCode = urlStream->get(BuildUrl(url).c_str());
-	if (returnCode != ost2::URLStream::errSuccess)
-		THROW(ost::SockException("Arbitrary error occured", ost::Socket::errNotConnected));
-	return Result();
-}
-
-std::string HttpClient::Post(const std::ostream &url, const std::ostream &postdata) {
-	const std::stringstream &payload = static_cast<const std::stringstream&>(postdata);
-	char param0[payload.str().size()+1];
-	strcpy(param0, payload.str().c_str());
-	const char * params[2];
-	params[0] = param0;
-	params[1] = 0;
-
-	ost2::URLStream::Error returnCode = urlStream->post(BuildUrl(url).c_str(), params);
-	if (returnCode != ost2::URLStream::errSuccess)
-		THROW(ost::SockException("Arbitrary error occured", ost::Socket::errNotConnected));
-	return Result();
-
-}
-
-std::string HttpClient::PostMIME(const std::ostream &url, ost2::MIMEMultipartForm &form) {
-	ost2::URLStream::Error returnCode = urlStream->post(BuildUrl(url).c_str(), form);
-	if (returnCode != ost2::URLStream::errSuccess)
-		THROW(ost::SockException("Arbitrary error occured", ost::Socket::errNotConnected));
-	return Result();
-}
-
-
-}
diff --git a/libfritz++/HttpClient.h b/libfritz++/HttpClient.h
deleted file mode 100644
index e7d70d3..0000000
--- a/libfritz++/HttpClient.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * libfritz++
- *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#ifndef HTTPCLIENT_H
-#define HTTPCLIENT_H
-
-#include "cc++/url.h"
-#include "TcpClient.h"
-
-namespace fritz {
-
-class HttpClient : public TcpClient {
-private:
-	ost2::URLStream *urlStream;
-protected:
-	HttpClient(std::string &host, int port, ost2::URLStream *stream);
-	std::string Result();
-    std::string BuildUrl(const std::ostream & url);
-public:
-	explicit HttpClient(std::string &host, int port = 80);
-	virtual ~HttpClient();
-	std::string Get(const std::ostream& os);
-	std::string Post(const std::ostream &url, const std::ostream &postdata);
-	std::string PostMIME(const std::ostream &url, ost2::MIMEMultipartForm &form);
-};
-
-}
-
-#endif /* HTTPCLIENT_H_ */
diff --git a/libfritz++/Listener.cpp b/libfritz++/Listener.cpp
index 6a006a9..c050b2c 100644
--- a/libfritz++/Listener.cpp
+++ b/libfritz++/Listener.cpp
@@ -21,37 +21,45 @@
 
 #include "Listener.h"
 
-#include <cc++/socket.h>
-#include <string>
 #include <cstdlib>
 #include <sstream>
-#include <vector>
+#include <future>
+#include <chrono>
 
 #include "CallList.h"
 #include "Config.h"
 #include "FonbookManager.h"
 #include "Tools.h"
+#include <libnet++/TcpClient.h>
+#include <liblog++/Log.h>
 
 namespace fritz{
 
-Listener *Listener::me = NULL;
+Listener *Listener::me = nullptr;
 
 Listener::Listener(EventHandler *event)
-:Thread()
 {
-	setName("Listener");
-	setCancel(cancelDeferred);
 	this->event = event;
-	start();
+	thread = new std::thread(&Listener::run, this);
 }
 
 Listener::~Listener()
 {
-	terminate();
+	if (thread) {
+		cancelThread();
+		thread->join();
+		delete thread;
+	}
+}
+
+void Listener::cancelThread() {
+	cancelRequested = true;
+	if (tcpClientPtr)
+		tcpClientPtr->expireStreamNow();
 }
 
 void Listener::CreateListener(EventHandler *event) {
-	EventHandler *oldEvent = me ? me->event : NULL;
+	EventHandler *oldEvent = me ? me->event : nullptr;
 	DeleteListener();
 	if (event || oldEvent)
 		me = new Listener(event ? event : oldEvent);
@@ -63,14 +71,14 @@ void Listener::DeleteListener() {
 	if (me) {
 		DBG("deleting listener");
 		delete me;
-		me = NULL;
+		me = nullptr;
 	}
 }
 
-void Listener::HandleNewCall(bool outgoing, int connId, std::string remoteNumber, std::string localParty, std::string medium) {
+void Listener::handleNewCall(bool outgoing, int connId, std::string remoteNumber, std::string localParty, std::string medium) {
 	if ( Tools::MatchesMsnFilter(localParty) ) {
 		// do reverse lookup
-		Fonbook::sResolveResult result = FonbookManager::GetFonbook()->ResolveToName(remoteNumber);
+		Fonbook::sResolveResult result = FonbookManager::GetFonbook()->resolveToName(remoteNumber);
 		// resolve SIP names
 		std::string mediumName;
 		if (medium.find("SIP")           != std::string::npos &&
@@ -79,12 +87,12 @@ void Listener::HandleNewCall(bool outgoing, int connId, std::string remoteNumber
 		else
 			mediumName = medium;
 		// notify application
-		if (event) event->HandleCall(outgoing, connId, remoteNumber, result.name, result.type, localParty, medium, mediumName);
+		if (event) event->handleCall(outgoing, connId, remoteNumber, result.name, result.type, localParty, medium, mediumName);
 		activeConnections.push_back(connId);
 	}
 }
 
-void Listener::HandleConnect(int connId) {
+void Listener::handleConnect(int connId) {
 	// only notify application if this connection is part of activeConnections
 	bool notify = false;
 	for (std::vector<int>::iterator it = activeConnections.begin(); it < activeConnections.end(); ++it) {
@@ -94,10 +102,10 @@ void Listener::HandleConnect(int connId) {
 		}
 	}
 	if (notify)
-		if (event) event->HandleConnect(connId);
+		if (event) event->handleConnect(connId);
 }
 
-void Listener::HandleDisconnect(int connId, std::string duration) {
+void Listener::handleDisconnect(int connId, std::string duration) {
 	// only notify application if this connection is part of activeConnections
 	bool notify = false;
 	for (std::vector<int>::iterator it = activeConnections.begin(); it < activeConnections.end(); ++it) {
@@ -108,37 +116,40 @@ void Listener::HandleDisconnect(int connId, std::string duration) {
 		}
 	}
 	if (notify) {
-		if (event) event->HandleDisconnect(connId, duration);
+		if (event) event->handleDisconnect(connId, duration);
 		// force reload of callList
-		CallList *callList = CallList::getCallList(false);
+		CallList *callList = CallList::GetCallList(false);
 		if (callList)
-			callList->start();
+			callList->reload();
 	}
 }
 
 void Listener::run() {
 	DBG("Listener thread started");
-	Thread::setException(Thread::throwException);
 	unsigned int retry_delay = RETRY_DELAY / 2;
-	while (true) {
+	while (!cancelRequested) {
 		try {
 			retry_delay = retry_delay > 1800 ? 3600 : retry_delay * 2;
-			ost::TCPStream tcpStream(ost::IPV4Host(gConfig->getUrl().c_str()), gConfig->getListenerPort());
-			while (true) {
+			network::TcpClient tcpClient(gConfig->getUrl(), gConfig->getListenerPort());
+			tcpClientPtr = &tcpClient;
+			while (!cancelRequested) {
 				DBG("Waiting for a message.");
-				char data[1024];
-				tcpStream.getline(data, sizeof(data));
+
+				std::string line = tcpClient.readLine();
+				if (cancelRequested)
+					break;
+
 				if (gConfig->logPersonalInfo())
-					DBG("Got message " << data);
+					DBG("Got message " << line);
 
 				// split line into tokens
-				std::string date  = Tools::Tokenize(data, ';', 0);
-				std::string type  = Tools::Tokenize(data, ';', 1);
-				int connId        = atoi(Tools::Tokenize(data, ';', 2).c_str());
-				std::string partA = Tools::Tokenize(data, ';', 3);
-				std::string partB = Tools::Tokenize(data, ';', 4);
-				std::string partC = Tools::Tokenize(data, ';', 5);
-				std::string partD = Tools::Tokenize(data, ';', 6);
+				std::string date  = Tools::Tokenize(line, ';', 0);
+				std::string type  = Tools::Tokenize(line, ';', 1);
+				int connId        = atoi(Tools::Tokenize(line, ';', 2).c_str());
+				std::string partA = Tools::Tokenize(line, ';', 3);
+				std::string partB = Tools::Tokenize(line, ';', 4);
+				std::string partC = Tools::Tokenize(line, ';', 5);
+				std::string partD = Tools::Tokenize(line, ';', 6);
 
 #if 0 // some strings sent from the FB, made available to xgettext
 					I18N_NOOP("POTS");
@@ -159,7 +170,7 @@ void Listener::run() {
 					if (partC[partC.length()-1] == '#')
 						partC = partC.substr(0, partC.length()-1);
 
-					HandleNewCall(true, connId, partC, partB, partD);
+					handleNewCall(true, connId, partC, partB, partD);
 
 				} else if (type.compare("RING") == 0) {
 					// partA => caller Id (remote)
@@ -169,7 +180,7 @@ void Listener::run() {
 							    << ", " << (gConfig->logPersonalInfo() ? partB : HIDDEN)
 		                        << ", " << partC);
 
-					HandleNewCall(false, connId, partA, partB, partC);
+					handleNewCall(false, connId, partA, partB, partC);
 
 				} else if (type.compare("CONNECT") == 0) {
 					// partA => box port
@@ -177,30 +188,35 @@ void Listener::run() {
 					DBG("CONNECT " << ", " << partA
 							       << ", " << (gConfig->logPersonalInfo() ? partB : HIDDEN));
 
-					HandleConnect(connId);
+					handleConnect(connId);
 
 				} else if (type.compare("DISCONNECT") == 0) {
 					// partA => call duration
 					DBG("DISCONNECT " << ", " << partA );
 
-					HandleDisconnect(connId, partA);
+					handleDisconnect(connId, partA);
 
 				} else {
-					DBG("Got unknown message " << data);
+					DBG("Got unknown message " << line);
 					throw this;
 				}
 				retry_delay = RETRY_DELAY;
 			}
-		} catch(ost::SockException& se) {
-			ERR("Exception - " << se.what());
-			if (se.getSocketError() == ost::Socket::errConnectRefused)
-				ERR("Make sure to enable the Fritz!Box call monitor by dialing #96*5* once.");
+		} catch(std::runtime_error &re) {
+			ERR("Exception - " << re.what());
+			// TODO: Detect reason for exception
+			//if (se.getSocketError() == ost::Socket::errConnectRefused)
+			ERR("Make sure to enable the Fritz!Box call monitor by dialing #96*5* once.");
 		} catch (Listener *listener) {
 			ERR("Exception unknown data received.");
 		}
-
+		tcpClientPtr = nullptr;
+		if (cancelRequested)
+			break;
 		ERR("waiting " << retry_delay << " seconds before retrying");
-		ost::Thread::sleep(retry_delay*1000); // delay the retry
+		unsigned int retry_delay_counter = retry_delay;
+		while (--retry_delay_counter && !cancelRequested) // delay the retry
+			std::this_thread::sleep_for(std::chrono::seconds(1));
 	}
 	DBG("Listener thread ended");
 }
diff --git a/libfritz++/Listener.h b/libfritz++/Listener.h
index 58e9cb4..31b2ed1 100644
--- a/libfritz++/Listener.h
+++ b/libfritz++/Listener.h
@@ -22,7 +22,11 @@
 #ifndef FRITZLISTENER_H
 #define FRITZLISTENER_H
 
-#include <cc++/thread.h>
+#include <string>
+#include <thread>
+#include <vector>
+#include <libnet++/TcpClient.h>
+
 
 #include "Fonbook.h"
 
@@ -43,21 +47,24 @@ public:
 	EventHandler() { }
 	virtual ~EventHandler() { }
 
-	virtual void HandleCall(bool outgoing, int connId, std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType remoteType, std::string localParty, std::string medium, std::string mediumName) = 0;
-	virtual void HandleConnect(int connId) = 0;
-	virtual void HandleDisconnect(int connId, std::string duration) = 0;
+	virtual void handleCall(bool outgoing, int connId, std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType remoteType, std::string localParty, std::string medium, std::string mediumName) = 0;
+	virtual void handleConnect(int connId) = 0;
+	virtual void handleDisconnect(int connId, std::string duration) = 0;
 };
 
-class Listener : public ost::Thread
-{
+class Listener {
 private:
+	bool cancelRequested = false;
 	static Listener *me;
 	EventHandler *event;
 	std::vector<int> activeConnections;
+	std::thread *thread;
+	network::TcpClient *tcpClientPtr = nullptr;
 	Listener(EventHandler *event);
-	void HandleNewCall(bool outgoing, int connId, std::string remoteNumber, std::string localParty, std::string medium);
-	void HandleConnect(int connId);
-	void HandleDisconnect(int connId, std::string duration);
+	void handleNewCall(bool outgoing, int connId, std::string remoteNumber, std::string localParty, std::string medium);
+	void handleConnect(int connId);
+	void handleDisconnect(int connId, std::string duration);
+	void cancelThread();
 public:
 	/**
 	 * Activate listener support.
@@ -67,10 +74,10 @@ public:
 	 * @param A pointer to the eventHandler. Subsequent calls to CreateListener, e.g., in case of
 	 * configuration changes, can omit this parameter. Then, the existing EventHandler is used.
 	 */
-	static void CreateListener(EventHandler *event = NULL);
+	static void CreateListener(EventHandler *event = nullptr);
 	static void DeleteListener();
 	virtual ~Listener();
-	virtual void run();
+	void run();
 };
 
 }
diff --git a/libfritz++/LocalFonbook.cpp b/libfritz++/LocalFonbook.cpp
index db870f6..19d32d5 100644
--- a/libfritz++/LocalFonbook.cpp
+++ b/libfritz++/LocalFonbook.cpp
@@ -28,6 +28,7 @@
 
 #include "Config.h"
 #include "Tools.h"
+#include <liblog++/Log.h>
 
 namespace fritz {
 
@@ -44,7 +45,7 @@ public:
 ReadLine::ReadLine(void)
 {
   size = 0;
-  buffer = NULL;
+  buffer = nullptr;
 }
 
 ReadLine::~ReadLine()
@@ -67,18 +68,18 @@ char *ReadLine::Read(FILE *f)
         }
      return buffer;
      }
-  return NULL;
+  return nullptr;
 }
 
 
 LocalFonbook::LocalFonbook()
 : XmlFonbook(I18N_NOOP("Local phone book"), "LOCL", true) {
-	filePath    = NULL;
+	filePath    = nullptr;
 }
 
-bool LocalFonbook::Initialize() {
+bool LocalFonbook::initialize() {
 	setInitialized(false);
-	Clear();
+	clear();
 
 	// first, try xml phonebook
 	int ret = asprintf(&filePath, "%s/localphonebook.xml", gConfig->getConfigDir().c_str());
@@ -90,7 +91,7 @@ bool LocalFonbook::Initialize() {
 		if (!file.good())
 			return false;
 		std::string xmlData((std::istreambuf_iterator<char>(file)),std::istreambuf_iterator<char>());
-		ParseXmlFonbook(&xmlData);
+		parseXmlFonbook(&xmlData);
 		setInitialized(true);
 		return true;
 	} else
@@ -98,7 +99,7 @@ bool LocalFonbook::Initialize() {
 
 	// try deprecated filenames
 	free(filePath);
-	filePath = NULL;
+	filePath = nullptr;
 
 	char fileNames[3][20] = {"localphonebook.csv", "localfonbook.csv", "localfonbuch.csv"};
 	for (size_t pos = 0; pos < 3; pos++) {
@@ -111,10 +112,10 @@ bool LocalFonbook::Initialize() {
 			break;
 		}
 		free(filePath);
-		filePath = NULL;
+		filePath = nullptr;
 	}
 	if (filePath) {
-		ParseCsvFonbook(filePath);
+		parseCsvFonbook(filePath);
 		free(filePath);
 		setInitialized(true);
 		// convert to xml when saving
@@ -136,51 +137,51 @@ bool LocalFonbook::Initialize() {
 	return false;
 }
 
-void LocalFonbook::Reload() {
-	Initialize();
+void LocalFonbook::reload() {
+	initialize();
 }
 
-void LocalFonbook::ParseCsvFonbook(std::string filePath) {
+void LocalFonbook::parseCsvFonbook(std::string filePath) {
 	INF("loading " << filePath);
 	FILE *f = fopen(filePath.c_str(), "r");
 	if (f) {
 		char *s;
 		ReadLine ReadLine;
-		while ((s = ReadLine.Read(f)) != NULL) {
+		while ((s = ReadLine.Read(f)) != nullptr) {
 			if (s[0] == '#') continue;
 			char* name_buffer 	= strtok(s, ",;");
-			char* type_buffer 	= strtok(NULL, ",;");
-			char* number_buffer = strtok(NULL, ",;");
+			char* type_buffer 	= strtok(nullptr, ",;");
+			char* number_buffer = strtok(nullptr, ",;");
 			if (name_buffer && type_buffer && number_buffer) {
 				std::string name   		 	= name_buffer;
 				FonbookEntry::eType type   = (FonbookEntry::eType) atoi(type_buffer);
 				std::string number 			= number_buffer;
 				// search for existing fe
 				bool feExists = false;
-				for (size_t feNr = 0; feNr < GetFonbookSize(); feNr++)
-					if (RetrieveFonbookEntry(feNr)->GetName() == name) {
-						FonbookEntry fe(RetrieveFonbookEntry(feNr));
-						fe.AddNumber(type, number, type); //TODO: quickdial, vanity and priority not supported here
-						ChangeFonbookEntry(feNr, fe);
+				for (size_t feNr = 0; feNr < getFonbookSize(); feNr++)
+					if (retrieveFonbookEntry(feNr)->getName() == name) {
+						FonbookEntry fe(retrieveFonbookEntry(feNr));
+						fe.addNumber(number, type); //TODO: quickdial, vanity and priority not supported here
+						changeFonbookEntry(feNr, fe);
 						feExists = true;
 					}
 				// add to new fe
 				if (!feExists) {
 					FonbookEntry fe(name, false); //TODO: important not supported here
-					fe.AddNumber(type, number, type);
-					AddFonbookEntry(fe);
+					fe.addNumber(number, type);
+					addFonbookEntry(fe);
 				}
 			}
 			else {
 				ERR("parse error at " << s);
 			}
 		}
-		Sort(FonbookEntry::ELEM_NAME, true);
+		sort(FonbookEntry::ELEM_NAME, true);
 		fclose(f);
 	}
 }
 
-void LocalFonbook::Write() {
+void LocalFonbook::write() {
 	DBG("Saving to " << filePath << ".");
 	// filePath should always contain a valid content, this is just to be sure
 	if (!filePath)
@@ -190,7 +191,7 @@ void LocalFonbook::Write() {
 	if (file.fail())
 		return;
 	// write all entries to the file
-	file << SerializeToXml();
+	file << serializeToXml();
 	// close file
 	file.close();
 	DBG("Saving successful.");
diff --git a/libfritz++/LocalFonbook.h b/libfritz++/LocalFonbook.h
index fbb9c7d..b9c0994 100644
--- a/libfritz++/LocalFonbook.h
+++ b/libfritz++/LocalFonbook.h
@@ -31,11 +31,11 @@ class LocalFonbook : public XmlFonbook {
 private:
 	char* filePath;
 	LocalFonbook();
-	void ParseCsvFonbook(std::string filePath);
-	virtual void Write();
+	void parseCsvFonbook(std::string filePath);
+	void write() override;
 public:
-	bool Initialize();
-	void Reload();
+	bool initialize() override;
+	void reload() override;
 };
 
 }
diff --git a/libfritz++/LookupFonbook.cpp b/libfritz++/LookupFonbook.cpp
index edf7acb..6407346 100644
--- a/libfritz++/LookupFonbook.cpp
+++ b/libfritz++/LookupFonbook.cpp
@@ -32,26 +32,26 @@ LookupFonbook::LookupFonbook(std::string title, std::string techId, bool writeab
 
 LookupFonbook::~LookupFonbook() {}
 
-bool LookupFonbook::Initialize() {
+bool LookupFonbook::initialize() {
 	setInitialized(true);
 	return true;
 }
 
-Fonbook::sResolveResult LookupFonbook::ResolveToName(std::string number) {
+Fonbook::sResolveResult LookupFonbook::resolveToName(std::string number) {
 	// First, try to get a cached result
-	sResolveResult resolve = Fonbook::ResolveToName(number);
+	sResolveResult resolve = Fonbook::resolveToName(number);
 	// Second, to lookup (e.g., via HTTP)
 	if (! resolve.successful) {
-		resolve = Lookup(number);
+		resolve = lookup(number);
 		// cache result despite it was successful
 		FonbookEntry fe(resolve.name, false);
-		fe.AddNumber(0, number, resolve.type, "", "", 0);
-		AddFonbookEntry(fe);
+		fe.addNumber(number, resolve.type, "", "", 0);
+		addFonbookEntry(fe);
 	}
 	return resolve;
 }
 
-Fonbook::sResolveResult LookupFonbook::Lookup(std::string number) const {
+Fonbook::sResolveResult LookupFonbook::lookup(std::string number) const {
 	sResolveResult result(number);
 	return result;
 }
diff --git a/libfritz++/LookupFonbook.h b/libfritz++/LookupFonbook.h
index 6a6d450..8b8a4e0 100644
--- a/libfritz++/LookupFonbook.h
+++ b/libfritz++/LookupFonbook.h
@@ -35,30 +35,30 @@ public:
 	 * Initialize() may be called more than once per session.
 	 * @return if initialization was successful
 	 */
-	virtual bool Initialize();
+	bool initialize() override;
 	/**
 	 * Resolves the number given to the corresponding name.
 	 * @param number to resolve
 	 * @return resolved name and type or the number, if unsuccessful
 	 */
-	virtual sResolveResult ResolveToName(std::string number);
+	sResolveResult resolveToName(std::string number) override;
 	/**
 	 * Resolves number doing a (costly) lookup
 	 * @param number to resolve
 	 * @return resolved name and type or number, if not successful
 	 */
-	virtual sResolveResult Lookup(std::string number) const;
+	virtual sResolveResult lookup(std::string number) const;
 	/**
 	 *  Returns the number of entries in the telephonebook.
 	 * @return the number of entries
 	 */
-	virtual size_t GetFonbookSize() const { return 0; }
+	size_t getFonbookSize() const override { return 0; }
 	/**
 	 * Returns a specific telephonebook entry.
 	 * @param id unique identifier of the requested entry
-	 * @return the entry with key id or NULL, if unsuccessful
+	 * @return the entry with key id or nullptr, if unsuccessful
 	 */
-	virtual const FonbookEntry *RetrieveFonbookEntry(size_t id __attribute__((unused))) const { return NULL; }
+	const FonbookEntry *retrieveFonbookEntry(size_t id __attribute__((unused))) const override { return nullptr; }
 };
 
 } /* namespace fritz */
diff --git a/libfritz++/Makefile b/libfritz++/Makefile
index b6f2de6..d23b101 100644
--- a/libfritz++/Makefile
+++ b/libfritz++/Makefile
@@ -1,30 +1,18 @@
-LIB = libfritz++.a
-OBJS = cc++/url.o cc++/mime.o cc++/urlstring.o cc++/soap.o CallList.o Config.o Fonbooks.o Fonbook.o FonbookManager.o FritzClient.o FritzFonbook.o HttpClient.o Listener.o LookupFonbook.o Tools.o LocalFonbook.o Nummerzoeker.o OertlichesFonbook.o SoapClient.o TcpClient.o TelLocalChFonbook.o XmlFonbook.o
+AFILE = $(notdir $(subst /.a,.a,$(addsuffix .a,$(CURDIR))))
+OBJS  = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
 
-CXXFLAGS ?= -g -O2 -Wall -fPIC
+.PHONY: all clean
 
-.PHONY: all test clean
-
-### for cc++ dir
-INCLUDES += -I.
-
-all: $(LIB) test
+all: $(AFILE) 
 
 %.o: %.cpp
-	$(CXX) $(CXXFLAGS) -o $@ -c $(DEFINES) $(INCLUDES) $<
-
-$(LIB): $(OBJS)
-	ar ru $(LIB) $(OBJS)
-	@-echo Built $(LIB).
-
+	$(CXX) $(CXXFLAGS) -o $@ -c $<
+	
+$(AFILE): $(OBJS)
+	@ar ru $(AFILE) $(OBJS)
+	
 clean:
-	@-make -C test clean
-	@-rm $(LIB) $(OBJS) $(DEPFILE) $(TEST_OBJS) $(TEST_EXEC)
-
-###
-# Tests
-test: 
-	@-make -C test
+	@-rm -f $(AFILE) $(OBJS) $(DEPFILE)
 
 ###
 # Dependencies:
@@ -32,6 +20,6 @@ test:
 MAKEDEP = $(CXX) -MM -MG
 DEPFILE = .dependencies
 $(DEPFILE): Makefile
-	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.cpp) > $@
+	@$(MAKEDEP) $(DEFINES) $(CXXFLAGS) $(OBJS:%.o=%.cpp) > $@
 
 -include $(DEPFILE)
\ No newline at end of file
diff --git a/libfritz++/Nummerzoeker.cpp b/libfritz++/Nummerzoeker.cpp
index e93f369..edb4546 100644
--- a/libfritz++/Nummerzoeker.cpp
+++ b/libfritz++/Nummerzoeker.cpp
@@ -24,8 +24,9 @@
 #include <unistd.h>
 
 #include "Config.h"
-#include "HttpClient.h"
+#include <libnet++/HttpClient.h>
 #include "Tools.h"
+#include <liblog++/Log.h>
 
 namespace fritz{
 
@@ -33,7 +34,7 @@ NummerzoekerFonbook::NummerzoekerFonbook()
 : LookupFonbook(I18N_NOOP("nummerzoeker.com"), "ZOEK")
 {}
 
-Fonbook::sResolveResult NummerzoekerFonbook::Lookup(std::string number) const {
+Fonbook::sResolveResult NummerzoekerFonbook::lookup(std::string number) const {
 	Fonbook::sResolveResult result(number);
 
 	// resolve only NL phone numbers
@@ -47,14 +48,15 @@ Fonbook::sResolveResult NummerzoekerFonbook::Lookup(std::string number) const {
 	std::string msg;
 	try {
 		DBG("sending reverse lookup request for " << (gConfig->logPersonalInfo() ? normNumber : HIDDEN) << " to www.nummerzoeker.com");
-		std::string host = "www.nummerzoeker.com";
-		HttpClient tc(host);
-		msg = tc.Get(std::stringstream().flush()
-		   << "/index.php?search=Zoeken&phonenumber="
-		   << normNumber
-		   << "&export=csv");
-	} catch (ost::SockException &se) {
-		ERR("Exception - " << se.what());
+		network::HttpClient tc("www.nummerzoeker.com");
+		network::HttpClient::param_t params = {
+				{ "search", "Zoeken" },
+				{ "phonenumber", normNumber },
+				{ "export", "csv" },
+		};
+		msg = tc.get("/index.php", params);
+	} catch (std::runtime_error &re) {
+		ERR("Exception - " << re.what());
 		return result;
 	}
 
@@ -78,12 +80,6 @@ Fonbook::sResolveResult NummerzoekerFonbook::Lookup(std::string number) const {
 			break;
 	  }
 	}
-	// convert the string from latin1 to current system character table
-	// Q: is this really ISO-8859-1, the webservers' response is unclear (html pages are UTF8)
-	CharSetConv *conv = new CharSetConv("ISO-8859-1", CharSetConv::SystemCharacterTable());
-	const char *s_converted = conv->Convert(name.c_str());
-	name = s_converted;
-	delete (conv);
 	INF("resolves to " << (gConfig->logPersonalInfo() ? name.c_str() : HIDDEN));
 	result.name = name;
 	result.successful = true;
diff --git a/libfritz++/Nummerzoeker.h b/libfritz++/Nummerzoeker.h
index 281d5ce..062cc49 100644
--- a/libfritz++/Nummerzoeker.h
+++ b/libfritz++/Nummerzoeker.h
@@ -32,7 +32,7 @@ class NummerzoekerFonbook : public LookupFonbook
 private:
 	NummerzoekerFonbook();
 public:
-	virtual sResolveResult Lookup(std::string number) const;
+	sResolveResult lookup(std::string number) const override;
 };
 
 }
diff --git a/libfritz++/OertlichesFonbook.cpp b/libfritz++/OertlichesFonbook.cpp
index 4d0f594..81c88a3 100644
--- a/libfritz++/OertlichesFonbook.cpp
+++ b/libfritz++/OertlichesFonbook.cpp
@@ -24,8 +24,9 @@
 #include <unistd.h>
 
 #include "Config.h"
-#include "HttpClient.h"
+#include <libnet++/HttpClient.h>
 #include "Tools.h"
+#include <liblog++/Log.h>
 
 namespace fritz{
 
@@ -33,7 +34,7 @@ OertlichesFonbook::OertlichesFonbook()
 :LookupFonbook(I18N_NOOP("das-oertliche.de"), "OERT")
 {}
 
-Fonbook::sResolveResult OertlichesFonbook::Lookup(std::string number) const {
+Fonbook::sResolveResult OertlichesFonbook::lookup(std::string number) const {
 	Fonbook::sResolveResult result(number);
 
 	// resolve only (german) phone numbers
@@ -44,12 +45,14 @@ Fonbook::sResolveResult OertlichesFonbook::Lookup(std::string number) const {
 	std::string name;
 	try {
 		DBG("sending reverse lookup request for " << (gConfig->logPersonalInfo()? Tools::NormalizeNumber(number) : HIDDEN) << " to www.dasoertliche.de");
-		std::string host = "www.dasoertliche.de";
-		HttpClient tc(host);
-		msg = tc.Get(std::stringstream().flush()
-		   << "/Controller?form_name=search_inv&ph=" << Tools::NormalizeNumber(number));
-	} catch (ost::SockException &se) {
-		ERR("Exception - " << se.what());
+		network::HttpClient::param_t params = {
+				{ "form_name", "search_inv"},
+				{ "ph", Tools::NormalizeNumber(number)},
+		};
+		network::HttpClient tc("www.dasoertliche.de");
+		msg = tc.get("/Controller", params);
+	} catch (std::runtime_error &re) {
+		ERR("Exception - " << re.what());
 		return result;
 	}
 	// check that at most one result is returned
@@ -71,11 +74,6 @@ Fonbook::sResolveResult OertlichesFonbook::Lookup(std::string number) const {
 	std::string dataset = msg.substr(start, stop - start);
 	name = Tools::Tokenize(dataset, ',', 5);
 	name = name.substr(2, name.length()-3);
-	// convert the string from latin1 to current system character table
-	CharSetConv *conv = new CharSetConv("ISO-8859-1", CharSetConv::SystemCharacterTable());
-	const char *s_converted = conv->Convert(name.c_str());
-	name = s_converted;
-	delete (conv);
 	INF("resolves to " << (gConfig->logPersonalInfo() ? name.c_str() : HIDDEN));
 	result.name = name;
 	result.successful = true;
diff --git a/libfritz++/OertlichesFonbook.h b/libfritz++/OertlichesFonbook.h
index 370b1f9..5be3011 100644
--- a/libfritz++/OertlichesFonbook.h
+++ b/libfritz++/OertlichesFonbook.h
@@ -32,7 +32,7 @@ class OertlichesFonbook : public LookupFonbook
 private:
 	OertlichesFonbook();
 public:
-	virtual sResolveResult Lookup(std::string number) const;
+	sResolveResult lookup(std::string number) const override;
 };
 
 }
diff --git a/libfritz++/TcpClient.cpp b/libfritz++/TcpClient.cpp
deleted file mode 100644
index c1b2843..0000000
--- a/libfritz++/TcpClient.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * libfritz++
- *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#include "TcpClient.h"
-
-namespace fritz {
-
-TcpClient::TcpClient(std::string &host, int port) {
-	TcpClient(host, port, new ost::TCPStream());
-}
-
-TcpClient::TcpClient(std::string &host, int port, ost::TCPStream *stream) {
-	this->host = host;
-	this->port = port;
-    this->stream = stream;
-}
-
-TcpClient::~TcpClient() {
-	delete stream;
-}
-
-}
diff --git a/libfritz++/TelLocalChFonbook.cpp b/libfritz++/TelLocalChFonbook.cpp
index 33dd38c..68257f4 100644
--- a/libfritz++/TelLocalChFonbook.cpp
+++ b/libfritz++/TelLocalChFonbook.cpp
@@ -25,8 +25,11 @@
 #include <unistd.h>
 
 #include "Config.h"
-#include "HttpClient.h"
+#include <libnet++/HttpClient.h>
 #include "Tools.h"
+#include <liblog++/Log.h>
+#include <libconv++/EntityConverter.h>
+#include <boost/regex.hpp>
 
 namespace fritz{
 
@@ -34,7 +37,7 @@ TelLocalChFonbook::TelLocalChFonbook()
 : LookupFonbook(I18N_NOOP("tel.local.ch"), "LOCCH")
 {}
 
-TelLocalChFonbook::sResolveResult TelLocalChFonbook::Lookup(std::string number) const {
+TelLocalChFonbook::sResolveResult TelLocalChFonbook::lookup(std::string number) const {
 	TelLocalChFonbook::sResolveResult result(number);
 
 	// resolve only (swiss) phone numbers
@@ -45,39 +48,27 @@ TelLocalChFonbook::sResolveResult TelLocalChFonbook::Lookup(std::string number)
 	std::string name;
 	try {
 		DBG("sending reverse lookup request for " << Tools::NormalizeNumber(number) << " to tel.local.ch");
-		std::string host = "tel.local.ch";
-		HttpClient tc(host);
-		msg = tc.Get(std::stringstream().flush()
-		   << "/de/q/" <<  Tools::NormalizeNumber(number)
-		   << ".html");
-	} catch (ost::SockException &se) {
+		network::HttpClient tc("mobile.tel.local.ch");
+		std::stringstream ss;
+		ss << "/de/q/" <<  Tools::NormalizeNumber(number) << ".html";
+		msg = tc.get(ss.str());
+	} catch (std::runtime_error &se) {
 		ERR("Exception - " << se.what());
 		return result;
 	}
 	// parse answer
-	size_t start = msg.find("<h2 class");
+	boost::regex expression("<h2 class[^>]+><a [^>]+>(.+)</a></h2>");
+	boost::smatch what;
+	if (boost::regex_search(msg, what, expression)) {
+		name = what[1];
+		name = convert::EntityConverter::DecodeEntities(name);
 
-	if (start == std::string::npos) {
+		INF("resolves to " << name.c_str());
+		result.name = name;
+		result.successful = true;
+	} else
 		INF("no entry found.");
-		return result;
-	}
-	// add the length of search pattern
-	start += 15;
-
-	size_t stop  = msg.find("</h2>", start);
-	name = msg.substr(start, stop - start);
 	
-	// convert the string from latin1 to current system character table
-	CharSetConv *conv = new CharSetConv("UTF-8", CharSetConv::SystemCharacterTable());
-	const char *s_converted = conv->Convert(name.c_str());
-	name = s_converted;
-	delete (conv);
-
-	name = convertEntities(name);
-
-	INF("resolves to " << name.c_str());
-	result.name = name;
-	result.successful = true;
 	return result;
 }
 
diff --git a/libfritz++/TelLocalChFonbook.h b/libfritz++/TelLocalChFonbook.h
index fc3a6d7..e58ef15 100644
--- a/libfritz++/TelLocalChFonbook.h
+++ b/libfritz++/TelLocalChFonbook.h
@@ -33,7 +33,7 @@ class TelLocalChFonbook : public LookupFonbook
 private:
 	TelLocalChFonbook();
 public:
-	virtual sResolveResult Lookup(std::string number) const;
+	sResolveResult lookup(std::string number) const override;
 };
 
 }
diff --git a/libfritz++/Tools.cpp b/libfritz++/Tools.cpp
index de8c08f..778bdf6 100644
--- a/libfritz++/Tools.cpp
+++ b/libfritz++/Tools.cpp
@@ -31,148 +31,9 @@
 
 #include "Config.h"
 #include "FritzClient.h"
+#include <liblog++/Log.h>
 
 namespace fritz{
-
-// --- UTF-8 support ---------------------------------------------------------
-
-static uint SystemToUtf8[128] = { 0 };
-
-int Utf8CharLen(const char *s)
-{
-	if (CharSetConv::SystemCharacterTable())
-		return 1;
-#define MT(s, m, v) ((*(s) & (m)) == (v)) // Mask Test
-	if (MT(s, 0xE0, 0xC0) && MT(s + 1, 0xC0, 0x80))
-		return 2;
-	if (MT(s, 0xF0, 0xE0) && MT(s + 1, 0xC0, 0x80) && MT(s + 2, 0xC0, 0x80))
-		return 3;
-	if (MT(s, 0xF8, 0xF0) && MT(s + 1, 0xC0, 0x80) && MT(s + 2, 0xC0, 0x80) && MT(s + 3, 0xC0, 0x80))
-		return 4;
-	return 1;
-}
-
-uint Utf8CharGet(const char *s, int Length)
-{
-	if (CharSetConv::SystemCharacterTable())
-		return (uchar)*s < 128 ? *s : SystemToUtf8[(uchar)*s - 128];
-	if (!Length)
-		Length = Utf8CharLen(s);
-	switch (Length) {
-	case 2: return ((*s & 0x1F) <<  6) |  (*(s + 1) & 0x3F);
-	case 3: return ((*s & 0x0F) << 12) | ((*(s + 1) & 0x3F) <<  6) |  (*(s + 2) & 0x3F);
-	case 4: return ((*s & 0x07) << 18) | ((*(s + 1) & 0x3F) << 12) | ((*(s + 2) & 0x3F) << 6) | (*(s + 3) & 0x3F);
-	}
-	return *s;
-}
-
-char *CharSetConv::systemCharacterTable = NULL;
-
-CharSetConv::CharSetConv(const char *FromCode, const char *ToCode)
-{
-	if (!FromCode)
-		FromCode = systemCharacterTable ? systemCharacterTable : "UTF-8";
-	if (!ToCode)
-		ToCode = "UTF-8";
-	cd = iconv_open(ToCode, FromCode);
-	result = NULL;
-	length = 0;
-}
-
-CharSetConv::~CharSetConv()
-{
-	free(result);
-	iconv_close(cd);
-}
-
-void CharSetConv::DetectCharset() {
-	char *CodeSet = NULL;
-	if (setlocale(LC_CTYPE, ""))
-		CodeSet = nl_langinfo(CODESET);
-	else {
-		char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed
-		if (LangEnv) {
-			CodeSet = strchr(LangEnv, '.');
-			if (CodeSet)
-				CodeSet++; // skip the dot
-		}
-	}
-	if (CodeSet) {
-		INF("detected codeset is '" << CodeSet << "'");
-		SetSystemCharacterTable(CodeSet);
-	}
-}
-
-void CharSetConv::SetSystemCharacterTable(const char *CharacterTable)
-{
-	free(systemCharacterTable);
-	systemCharacterTable = NULL;
-	if (!strcasestr(CharacterTable, "UTF-8")) {
-		// Set up a map for the character values 128...255:
-		char buf[129];
-		for (int i = 0; i < 128; i++)
-			buf[i] = i + 128;
-		buf[128] = 0;
-		CharSetConv csc(CharacterTable);
-		const char *s = csc.Convert(buf);
-		int i = 0;
-		while (*s) {
-			int sl = Utf8CharLen(s);
-			SystemToUtf8[i] = Utf8CharGet(s, sl);
-			s += sl;
-			i++;
-		}
-		systemCharacterTable = strdup(CharacterTable);
-	}
-}
-
-const char *CharSetConv::Convert(const char *From, char *To, size_t ToLength)
-{
-	if (From && *From) {
-		char *FromPtr = (char *)From;
-		size_t FromLength = strlen(From);
-		char *ToPtr = To;
-		if (!ToPtr) {
-			if (length < (FromLength * 2)) // some reserve to avoid later reallocations
-				length = FromLength * 2;
-			result = (char *)realloc(result, length);
-			ToPtr = result;
-			ToLength = length;
-		}
-		else if (!ToLength)
-			return From; // can't convert into a zero sized buffer
-		ToLength--; // save space for terminating 0
-		char *Converted = ToPtr;
-		while (FromLength > 0) {
-			if (iconv(cd, &FromPtr, &FromLength, &ToPtr, &ToLength) == size_t(-1)) {
-				if (errno == E2BIG || (errno == EILSEQ && ToLength < 1)) {
-					if (To)
-						break; // caller provided a fixed size buffer, but it was too small
-					// The result buffer is too small, so increase it:
-					size_t d = ToPtr - result;
-					size_t r = length / 2;
-					length += r;
-					Converted = result = (char *)realloc(result, length);
-					ToLength += r;
-					ToPtr = result + d;
-				}
-				if (errno == EILSEQ) {
-					// A character can't be converted, so mark it with '?' and proceed:
-					FromPtr++;
-					FromLength--;
-					*ToPtr++ = '?';
-					ToLength--;
-				}
-				else if (errno != E2BIG)
-					return From; // unknown error, return original string
-			}
-		}
-		*ToPtr = 0;
-		return Converted;
-	}
-	return From;
-}
-
 Tools::Tools()
 {
 }
@@ -237,7 +98,7 @@ int Tools::CompareNormalized(std::string number1, std::string number2) {
 bool Tools::GetLocationSettings() {
 	//	get settings from Fritz!Box.
 	FritzClient *fc = gConfig->fritzClientFactory->create();
-	std::string msg = fc->RequestLocationSettings();
+	std::string msg = fc->requestLocationSettings();
 
 	size_t lkzStart = msg.find("telcfg:settings/Location/LKZ");
 	if (lkzStart == std::string::npos) {
@@ -284,7 +145,7 @@ void Tools::GetSipSettings() {
 		return;
 	// ...otherwise get settings from Fritz!Box.
 	FritzClient *fc = gConfig->fritzClientFactory->create();
-	std::string msg = fc->RequestSipSettings();
+	std::string msg = fc->requestSipSettings();
 	delete fc;
 
 	std::vector<std::string> sipNames;
diff --git a/libfritz++/Tools.h b/libfritz++/Tools.h
index b2e7302..4414bab 100644
--- a/libfritz++/Tools.h
+++ b/libfritz++/Tools.h
@@ -22,94 +22,13 @@
 #ifndef FRITZTOOLS_H
 #define FRITZTOOLS_H
 
-#include <iconv.h>
 #include <stdexcept>
 #include <string>
-#include <sys/types.h>
-
 
 #define I18N_NOOP(x) x
 
 namespace fritz{
 
-typedef unsigned char uchar;
-
-// When handling strings that might contain UTF-8 characters, it may be necessary
-// to process a "symbol" that consists of several actual character bytes. The
-// following functions allow transparently accessing a "char *" string without
-// having to worry about what character set is actually used.
-
-int Utf8CharLen(const char *s);
-    ///< Returns the number of character bytes at the beginning of the given
-    ///< string that form a UTF-8 symbol.
-uint Utf8CharGet(const char *s, int Length = 0);
-    ///< Returns the UTF-8 symbol at the beginning of the given string.
-    ///< Length can be given from a previous call to Utf8CharLen() to avoid calculating
-    ///< it again. If no Length is given, Utf8CharLen() will be called.
-int Utf8CharSet(uint c, char *s = NULL);
-    ///< Converts the given UTF-8 symbol to a sequence of character bytes and copies
-    ///< them to the given string. Returns the number of bytes written. If no string
-    ///< is given, only the number of bytes is returned and nothing is copied.
-int Utf8SymChars(const char *s, int Symbols);
-    ///< Returns the number of character bytes at the beginning of the given
-    ///< string that form at most the given number of UTF-8 symbols.
-int Utf8StrLen(const char *s);
-    ///< Returns the number of UTF-8 symbols formed by the given string of
-    ///< character bytes.
-char *Utf8Strn0Cpy(char *Dest, const char *Src, int n);
-    ///< Copies at most n character bytes from Src to Dst, making sure that the
-    ///< resulting copy ends with a complete UTF-8 symbol. The copy is guaranteed
-    ///< to be zero terminated.
-    ///< Returns a pointer to Dest.
-int Utf8ToArray(const char *s, uint *a, int Size);
-    ///< Converts the given character bytes (including the terminating 0) into an
-    ///< array of UTF-8 symbols of the given Size. Returns the number of symbols
-    ///< in the array (without the terminating 0).
-int Utf8FromArray(const uint *a, char *s, int Size, int Max = -1);
-    ///< Converts the given array of UTF-8 symbols (including the terminating 0)
-    ///< into a sequence of character bytes of at most Size length. Returns the
-    ///< number of character bytes written (without the terminating 0).
-    ///< If Max is given, only that many symbols will be converted.
-    ///< The resulting string is always zero-terminated if Size is big enough.
-
-// When allocating buffer space, make sure we reserve enough space to hold
-// a string in UTF-8 representation:
-
-#define Utf8BufSize(s) ((s) * 4)
-
-// The following macros automatically use the correct versions of the character
-// class functions:
-
-#define Utf8to(conv, c) (cCharSetConv::SystemCharacterTable() ? to##conv(c) : tow##conv(c))
-#define Utf8is(ccls, c) (cCharSetConv::SystemCharacterTable() ? is##ccls(c) : isw##ccls(c))
-
-class CharSetConv {
-private:
-  iconv_t cd;
-  char *result;
-  size_t length;
-  static char *systemCharacterTable;
-public:
-  explicit CharSetConv(const char *FromCode = NULL, const char *ToCode = NULL);
-     ///< Sets up a character set converter to convert from FromCode to ToCode.
-     ///< If FromCode is NULL, the previously set systemCharacterTable is used.
-     ///< If ToCode is NULL, "UTF-8" is used.
-  ~CharSetConv();
-  const char *Convert(const char *From, char *To = NULL, size_t ToLength = 0);
-     ///< Converts the given Text from FromCode to ToCode (as set in the constructor).
-     ///< If To is given, it is used to copy at most ToLength bytes of the result
-     ///< (including the terminating 0) into that buffer. If To is not given,
-     ///< the result is copied into a dynamically allocated buffer and is valid as
-     ///< long as this object lives, or until the next call to Convert(). The
-     ///< return value always points to the result if the conversion was successful
-     ///< (even if a fixed size To buffer was given and the result didn't fit into
-     ///< it). If the string could not be converted, the result points to the
-     ///< original From string.
-  static void DetectCharset();
-  static const char *SystemCharacterTable(void) { return systemCharacterTable; }
-  static void SetSystemCharacterTable(const char *CharacterTable);
-  };
-
 class Tools
 {
 public:
diff --git a/libfritz++/XmlFonbook.cpp b/libfritz++/XmlFonbook.cpp
index b9061cd..89d8abb 100644
--- a/libfritz++/XmlFonbook.cpp
+++ b/libfritz++/XmlFonbook.cpp
@@ -27,19 +27,21 @@
 
 #include "Config.h"
 #include "Tools.h"
+#include <liblog++/Log.h>
+#include <libconv++/CharsetConverter.h>
+#include <libconv++/EntityConverter.h>
 
 namespace fritz {
 
 XmlFonbook::XmlFonbook(std::string title, std::string techId, bool writeable)
-: Fonbook(title, techId, writeable) {
-	charset = CharSetConv::SystemCharacterTable() ? CharSetConv::SystemCharacterTable() : "UTF-8";
+: Fonbook{title, techId, writeable} {
 }
 
 XmlFonbook::~XmlFonbook() {
 }
 
 
-std::string XmlFonbook::ExtractXmlAttributeValue(std::string element, std::string attribute, std::string xml) {
+std::string XmlFonbook::extractXmlAttributeValue(std::string element, std::string attribute, std::string xml) {
 	size_t posStart = xml.find('<'+element);
 	if (posStart != std::string::npos) {
 		posStart = xml.find(attribute+"=\"", posStart);
@@ -52,7 +54,7 @@ std::string XmlFonbook::ExtractXmlAttributeValue(std::string element, std::strin
 	return "";
 }
 
-std::string XmlFonbook::ExtractXmlElementValue(std::string element, std::string xml) {
+std::string XmlFonbook::extractXmlElementValue(std::string element, std::string xml) {
 	size_t posStart = xml.find('<'+element);
 	if (posStart != std::string::npos) {
 		posStart = xml.find(">", posStart);
@@ -65,7 +67,7 @@ std::string XmlFonbook::ExtractXmlElementValue(std::string element, std::string
 	return "";
 }
 
-void XmlFonbook::ParseXmlFonbook(std::string *msg) {
+void XmlFonbook::parseXmlFonbook(std::string *msg) {
 	DBG("Parsing fonbook using xml parser.")
 	// determine charset
 	size_t pos, posStart, posEnd;
@@ -77,26 +79,22 @@ void XmlFonbook::ParseXmlFonbook(std::string *msg) {
 	}
 	DBG("using charset " << charset);
 
-	CharSetConv *conv = new CharSetConv(charset.c_str(), CharSetConv::SystemCharacterTable());
-	const char *s_converted = conv->Convert(msg->c_str());
-	std::string msgConv = s_converted;
-	delete (conv);
+	std::string msgConv = convert::CharsetConverter::ConvertToLocalEncoding(*msg, charset);
 
 	pos = msgConv.find("<contact>");
 	while (pos != std::string::npos) {
 		std::string msgPart = msgConv.substr(pos, msgConv.find("</contact>", pos) - pos + 10);
-		std::string category = ExtractXmlElementValue("category", msgPart);
-		std::string name     = convertEntities(ExtractXmlElementValue("realName", msgPart));
+		std::string category = extractXmlElementValue("category", msgPart);
+		std::string name     = convert::EntityConverter::DecodeEntities(extractXmlElementValue("realName", msgPart));
 		FonbookEntry fe(name, category == "1");
 		size_t posNumber = msgPart.find("<number");
-		size_t numberCount = 0;
 		while (posNumber != std::string::npos) {
 			std::string msgPartofPart = msgPart.substr(posNumber, msgPart.find("</number>", posNumber) - posNumber + 9);
-			std::string number    = ExtractXmlElementValue  ("number",              msgPartofPart);
-			std::string typeStr   = ExtractXmlAttributeValue("number", "type",      msgPartofPart);
-			std::string quickdial = ExtractXmlAttributeValue("number", "quickdial", msgPartofPart);
-			std::string vanity    = ExtractXmlAttributeValue("number", "vanity",    msgPartofPart);
-			std::string prio      = ExtractXmlAttributeValue("number", "prio",      msgPartofPart);
+			std::string number    = extractXmlElementValue  ("number",              msgPartofPart);
+			std::string typeStr   = extractXmlAttributeValue("number", "type",      msgPartofPart);
+			std::string quickdial = extractXmlAttributeValue("number", "quickdial", msgPartofPart);
+			std::string vanity    = extractXmlAttributeValue("number", "vanity",    msgPartofPart);
+			std::string prio      = extractXmlAttributeValue("number", "prio",      msgPartofPart);
 
 			if (number.size()) { // the xml may contain entries without a number!
 				FonbookEntry::eType type = FonbookEntry::TYPE_NONE;
@@ -107,33 +105,32 @@ void XmlFonbook::ParseXmlFonbook(std::string *msg) {
 				if (typeStr == "work")
 					type = FonbookEntry::TYPE_WORK;
 
-				fe.AddNumber(numberCount++, number, type, quickdial, vanity, atoi(prio.c_str()));
+				fe.addNumber(number, type, quickdial, vanity, atoi(prio.c_str()));
 			}
 			posNumber = msgPart.find("<number", posNumber+1);
 		}
-		AddFonbookEntry(fe);
+		addFonbookEntry(fe);
 		pos = msgConv.find("<contact>", pos+1);
 	}
 }
 
-std::string XmlFonbook::SerializeToXml() {
+std::string XmlFonbook::serializeToXml() {
 
 	std::stringstream result;
 	result << "<?xml version=\"1.0\" encoding=\"" << charset << "\"?>"
 			  "<phonebooks>"
 			  "<phonebook>";
-	for (size_t i = 0; i < GetFonbookSize(); i++) {
-		const FonbookEntry *fe = RetrieveFonbookEntry(i);
+	for (auto fe : getFonbookList()) {
 		result << "<contact>"
-			   << "<category>" << (fe->IsImportant() ? "1" : "0") << "</category>"
+			   << "<category>" << (fe.isImportant() ? "1" : "0") << "</category>"
 			   << "<person>"
-		       << "<realName>" << fe->GetName() << "</realName>"
+		       << "<realName>" << fe.getName() << "</realName>"
 		       << "</person>"
 		       << "<telephony>";
-		for (size_t numberPos = 0; numberPos < fe->GetSize(); numberPos++)
-			if (fe->GetNumber(numberPos).length() > 0) {  //just iterate over all numbers
+		for (size_t numberPos = 0; numberPos < fe.getSize(); numberPos++)
+			if (fe.getNumber(numberPos).length() > 0) {  //just iterate over all numbers
 				std::string typeName = "";
-				switch (fe->GetType(numberPos)) {
+				switch (fe.getType(numberPos)) {
 				case FonbookEntry::TYPE_NONE:
 				case FonbookEntry::TYPE_HOME:
 					typeName="home";
@@ -149,10 +146,10 @@ std::string XmlFonbook::SerializeToXml() {
 					break;
 				}
 				result << "<number type=\"" << typeName << "\" "
-						          "quickdial=\"" << fe->GetQuickdial(numberPos) << "\" "
-						          "vanity=\""    << fe->GetVanity(numberPos)    << "\" "
-						          "prio=\""      << fe->GetPriority(numberPos)  << "\">"
-				       << fe->GetNumber(numberPos)
+						          "quickdial=\"" << fe.getQuickdial(numberPos) << "\" "
+						          "vanity=\""    << fe.getVanity(numberPos)    << "\" "
+						          "prio=\""      << fe.getPriority(numberPos)  << "\">"
+				       << fe.getNumber(numberPos)
 				       << "</number>";
 			}
         //TODO: add <mod_time>1306951031</mod_time>
@@ -164,10 +161,8 @@ std::string XmlFonbook::SerializeToXml() {
 	result << "</phonebook>"
 			  "</phonebooks>";
 
-	CharSetConv *conv = new CharSetConv(CharSetConv::SystemCharacterTable(), charset.c_str());
-	const char *result_converted = conv->Convert(result.str().c_str());
-	std::string xmlData = result_converted;
-	delete (conv);
+	convert::CharsetConverter conv("", charset);
+	std::string xmlData = conv.convert(result.str());
 
 	// replace '&' with '&'
 	std::string::size_type pos = 0;
diff --git a/libfritz++/XmlFonbook.h b/libfritz++/XmlFonbook.h
index 536c492..a817611 100644
--- a/libfritz++/XmlFonbook.h
+++ b/libfritz++/XmlFonbook.h
@@ -28,12 +28,12 @@ namespace fritz {
 
 class XmlFonbook: public Fonbook {
 private:
-	std::string ExtractXmlAttributeValue(std::string element, std::string attribute, std::string xml);
-	std::string ExtractXmlElementValue(std::string element, std::string xml);
-	std::string charset;
+	std::string extractXmlAttributeValue(std::string element, std::string attribute, std::string xml);
+	std::string extractXmlElementValue(std::string element, std::string xml);
+	std::string charset = "UTF-8";
 protected:
-	void ParseXmlFonbook(std::string *msg);
-	std::string SerializeToXml();
+	void parseXmlFonbook(std::string *msg);
+	std::string serializeToXml();
 public:
 	XmlFonbook(std::string title, std::string techId, bool writeable);
 	virtual ~XmlFonbook();
diff --git a/libfritz++/cc++/mime.cpp b/libfritz++/cc++/mime.cpp
deleted file mode 100644
index 3f45cd1..0000000
--- a/libfritz++/cc++/mime.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (C) 2001-2005 Open Source Telecom Corporation.
-// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-#include <cc++/config.h>
-#ifdef  CCXX_WITHOUT_EXTRAS
-#include <cc++/export.h>
-#endif
-#include <cc++/file.h>
-#include <cc++/thread.h>
-#include <cc++/socket.h>
-#include <cc++/exception.h>
-#ifndef CCXX_WITHOUT_EXTRAS
-#include <cc++/export.h>
-#endif
-#include "mime.h"
-
-#ifdef  CCXX_NAMESPACES
-namespace ost2 {
-using namespace std;
-  using ost::setString;
-#endif
-
-MIMEMultipart::MIMEMultipart(const char *mt)
-{
-    const char *cp = strchr(mt, '/');
-    if(cp)
-        mt = ++cp;
-
-    first = last = NULL;
-    header[1] = NULL;
-    header[0] = mtype;
-    setString(boundry, sizeof(boundry), "xyzzy");
-    snprintf(mtype, sizeof(mtype), "Content-Type: multipart/%s, boundary=%s", mt, boundry);
-}
-
-MIMEMultipart::~MIMEMultipart()
-{}
-
-void MIMEMultipart::head(std::ostream *out)
-{
-    char **list = header;
-
-    while(**list)
-        *out << *(list++) << "\r\n";
-
-    out->flush();
-}
-
-void MIMEMultipart::body(std::ostream *out)
-{
-    MIMEItemPart *item = first;
-
-    while(item) {
-        *out << "--" << boundry << "\r\n";
-        item->head(out);
-        *out << "\r\n";
-        item->body(out);
-        item = item->next;
-    }
-    *out << "--" << boundry << "--\r\n";
-    out->flush();
-}
-
-MIMEItemPart::MIMEItemPart(MIMEMultipart *m, const char *ct)
-{
-    if(m->last) {
-        m->last->next = this;
-        m->last = this;
-    }
-    else
-        m->first = m->last = this;
-    next = NULL;
-    ctype = ct;
-}
-
-MIMEItemPart::~MIMEItemPart()
-{}
-
-MIMEMultipartForm::MIMEMultipartForm() :
-MIMEMultipart("form-data")
-{}
-
-MIMEMultipartForm::~MIMEMultipartForm()
-{}
-
-void MIMEItemPart::head(std::ostream *out)
-{
-	if (ctype && strlen(ctype))
-		*out << "Content-Type: " << ctype << "\r" << endl;
-}
-
-MIMEFormData::MIMEFormData(MIMEMultipartForm *m, const char *n, const char *v) :
-MIMEItemPart(m, "")
-{
-    name = n;
-    content = v;
-    filename = NULL;
-}
-
-MIMEFormData::MIMEFormData(MIMEMultipartForm *m, const char *n, const char *f, const char *t, const char *c) :
-MIMEItemPart(m, t)
-{
-	name = n;
-	filename = f;
-	content = c;
-}
-
-MIMEFormData::~MIMEFormData()
-{}
-
-void MIMEFormData::head(std::ostream *out)
-{
-	if (filename) {
-		*out << "Content-Disposition: form-data; name=\"" << name << "\"; filename=\"" << filename << "\"\r\n";
-	} else {
-		*out << "Content-Disposition: form-data; name=\"" << name << "\"\r\n";
-	}
-	MIMEItemPart::head(out);
-}
-
-void MIMEFormData::body(std::ostream *out)
-{
-    *out << content << "\r\n";
-}
-
-#ifdef  CCXX_NAMESPACES
-}
-#endif
-
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-basic-offset: 4
- * End:
- */
diff --git a/libfritz++/cc++/mime.h b/libfritz++/cc++/mime.h
deleted file mode 100644
index 58c5d6b..0000000
--- a/libfritz++/cc++/mime.h
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (C) 2001-2005 Open Source Telecom Corporation.
-// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-/**
- * @file mime.h
- * @short MIME document abstractions.
- **/
-
-#ifndef CCXX_MIME_H_
-#define CCXX_MIME_H_
-
-#ifndef CCXX_CONFIG_H_
-#include <cc++/config.h>
-#endif
-
-#ifndef CCXX_SOCKET_H_
-#include <cc++/socket.h>
-#endif
-
-#ifdef  CCXX_NAMESPACES
-namespace ost2 {
-#endif
-
-class __EXPORT MIMEMultipart;
-class __EXPORT MIMEItemPart;
-
-/**
- * A container class for multi-part MIME document objects which can
- * be streamed to a std::ostream destination.
- *
- * @author David Sugar <dyfet at ostel.com>
- * @short container for streamable multi-part MIME documents.
- */
-class __EXPORT MIMEMultipart
-{
-protected:
-    friend class __EXPORT MIMEItemPart;
-    char boundry[8];
-    char mtype[80];
-    char *header[16];
-    MIMEItemPart *first, *last;
-
-    virtual ~MIMEMultipart();
-
-public:
-    /**
-     * Contruct a multi-part document, and describe it's type.
-     *
-     * @param document (content) type.
-     */
-    MIMEMultipart(const char *document);
-
-    /**
-     * Stream the headers of the multi-part document.  The headers
-     * of individual entities are streamed as part of the body.
-     *
-     * @param output to stream document header into.
-     */
-    virtual void head(std::ostream *output);
-
-    /**
-     * Stream the "body" of the multi-part document.  This involves
-     * streaming the headers and body of each document part.
-     *
-     * @param output to stream document body into.
-     */
-    virtual void body(std::ostream *output);
-
-    /**
-     * Get a string array of the headers to use.  This is used to
-     * assist URLStream::post.
-     *
-     * @return array of headers.
-     */
-    char **getHeaders(void)
-        {return header;};
-};
-
-/**
- * The Multipart form is a MIME multipart document specific for the
- * construction and delivery of form data to a web server through a
- * post method.
- *
- * @author David Sugar <dyfet at ostel.com>
- * @short deliver form results as multipart document.
- */
-class __EXPORT MIMEMultipartForm : public MIMEMultipart
-{
-protected:
-    virtual ~MIMEMultipartForm();
-
-public:
-    /**
-     * Construct a form result.  This is a MIMEMultipart of type
-     * multipart/form-data.
-     */
-    MIMEMultipartForm();
-};
-
-/**
- * This is used to attach an item part to a MIME multipart document
- * that is being streamed.  The base item part class is used by all
- * derived items.
- *
- * @author David Sugar <dyfet at ostel.com>
- * @short item or part of a multi-part object.
- */
-class __EXPORT MIMEItemPart
-{
-protected:
-    friend class __EXPORT MIMEMultipart;
-
-    MIMEMultipart *base;
-    MIMEItemPart *next;
-    const char *ctype;
-
-    /**
-     * Stream the header(s) for the current document part.
-     *
-     * @param output to stream header into.
-     */
-    virtual void head(std::ostream *output);
-
-    /**
-     * Stream the content of this document part.
-     *
-     * @param output to stream document body into.
-     */
-    virtual void body(std::ostream *output) = 0;
-
-    /**
-     * Construct and attach a document part to a multipart document.
-     *
-     * @param top multipart document to attach to.
-     * @param ct Content-Type to use.
-     */
-    MIMEItemPart(MIMEMultipart *top, const char *ct);
-
-    virtual ~MIMEItemPart();
-};
-
-/**
- * This is a document part type for use in submitting multipart form
- * data to a web server.
- *
- * @author David Sugar <dyfet at ostel.com>
- * @short multipart document part for web form data field.
- */
-class __EXPORT MIMEFormData : public MIMEItemPart
-{
-protected:
-    const char *content;
-    const char *name;
-    const char *filename;
-
-    virtual ~MIMEFormData();
-
-public:
-    /**
-     * Stream header, Content-Disposition form-data.
-     *
-     * @param output stream to send header to.
-     */
-    void head(std::ostream *output);
-
-    /**
-     * Stream content (value) of this form data field.
-     *
-     * @param output stream to send body to.
-     */
-    void body(std::ostream *output);
-
-    /**
-     * Construct form data field part of multipart form.
-     *
-     * @param top multipart form this is part of
-     * @param name of form data field
-     * @param content of form data field
-     */
-    MIMEFormData(MIMEMultipartForm *top, const char *name, const char *content);
-
-    /**
-     * Construct form data field part of multipart form.
-     *
-     * @param top multipart form this is part of
-     * @param name of form data field
-     * @param filename
-     * @param type
-     * @param content of form data field
-     */
-    MIMEFormData(MIMEMultipartForm *top, const char *name, const char *filename, const char *type, const char *content);
-};
-
-#ifdef  CCXX_NAMESPACES
-}
-#endif
-
-#endif
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-basic-offset: 4
- * End:
- */
diff --git a/libfritz++/cc++/readme.txt b/libfritz++/cc++/readme.txt
deleted file mode 100644
index 2ad5d5c..0000000
--- a/libfritz++/cc++/readme.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-These are modified copies of libcommoncpp2-1.8.1
-
-Bcause of bugs/restrictions of the original libcommoncpp2, these files are currently necessary for libfritz++.
\ No newline at end of file
diff --git a/libfritz++/cc++/soap.cpp b/libfritz++/cc++/soap.cpp
deleted file mode 100644
index e212a50..0000000
--- a/libfritz++/cc++/soap.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2011 Joachim Wilke <libfritz at joachim-wilke.de>
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-#include "soap.h"
-
-namespace ost2 {
-
-SOAPStream::SOAPStream(Family family, timeout_t timer):
-	URLStream(family, timer) {
-	contentType = "text/xml";
-	setAction("");
-}
-
-void SOAPStream::setAction(const char *soapAction) {
-	soapActionFieldName = "SoapAction";
-	this->soapAction = soapAction;
-	header[0] = soapActionFieldName.c_str();
-	header[1] = this->soapAction;
-	header[2] = NULL;
-}
-
-SOAPStream::~SOAPStream() {
-	// TODO Auto-generated destructor stub
-}
-
-char **SOAPStream::extraHeader(){
-
-	return header;
-
- }
-
-}
diff --git a/libfritz++/cc++/soap.h b/libfritz++/cc++/soap.h
deleted file mode 100644
index c96e2e4..0000000
--- a/libfritz++/cc++/soap.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2011 Joachim Wilke <libfritz at joachim-wilke.de>
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-#ifndef SOAPSTREAM_H_
-#define SOAPSTREAM_H_
-
-#include "url.h"
-
-namespace ost2 {
-
-class SOAPStream: public ost2::URLStream {
-public:
-	SOAPStream(Family family = IPV4, timeout_t timer = 0);
-	virtual ~SOAPStream();
-	void setAction(const char *soapAction);
-protected:
-	virtual char **extraHeader(void);
-
-private:
-	ost::String soapActionFieldName;
-	ost::String soapAction;
-	char *header[3];
-
-};
-
-
-}
-
-#endif /* SOAPSTREAM_H_ */
diff --git a/libfritz++/cc++/url.cpp b/libfritz++/cc++/url.cpp
deleted file mode 100644
index a483a45..0000000
--- a/libfritz++/cc++/url.cpp
+++ /dev/null
@@ -1,871 +0,0 @@
-// Copyright (C) 2001-2005 Open Source Telecom Corporation.
-// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-#include <cc++/config.h>
-#ifdef  CCXX_WITHOUT_EXTRAS
-#include <cc++/export.h>
-#endif
-#include <cc++/file.h>
-#include <cc++/thread.h>
-#include <cc++/exception.h>
-#include <cc++/address.h>
-#include <cc++/socket.h>
-#ifndef CCXX_WITHOUT_EXTRAS
-#include <cc++/export.h>
-#endif
-#include "url.h"
-
-#include <string>
-#include <cstdio>
-#include <cstdlib>
-#include <fcntl.h>
-#include <cerrno>
-#include <iostream>
-
-#ifdef  WIN32
-#include <io.h>
-#endif
-
-#ifdef HAVE_SSTREAM
-#include <sstream>
-#else
-#include <strstream>
-#endif
-
-#include <cctype>
-
-#ifndef WIN32
-// cause problem on Solaris
-#if !defined(__sun) && !defined(__SUN__)
-#ifdef  HAVE_NET_IF_H
-#include <net/if.h>
-#endif
-#endif
-#include <sys/ioctl.h>
-#endif
-
-#ifdef  CCXX_NAMESPACES
-namespace ost2 {
-using namespace std;
-using ost::setString;
-#endif
-
-URLStream::URLStream(Family fam, timeout_t to) :
-TCPStream(fam)
-{
-    persistent = false;
-    proxyPort = 0;
-    timeout = to;
-    protocol = protocolHttp1_0;
-    follow = true;
-    proxyAuth = authAnonymous;
-    encoding = encodingBinary;
-    proxyUser = proxyPasswd = NULL;
-    auth = authAnonymous;
-    cookie = agent = pragma = referer = user = password = NULL;
-    localif = NULL;
-    setError(false);
-    contentType = "application/x-www-form-urlencoded";
-}
-
-int URLStream::aRead(char *buffer, size_t len, timeout_t timer)
-{
-    return readData(buffer, len, 0, timer);
-}
-
-int URLStream::aWrite(char *buffer, size_t len, timeout_t timer)
-{
-    return writeData(buffer, len, timer);
-}
-
-void URLStream::httpHeader(const char *header, const char *value)
-{
-}
-
-char **URLStream::extraHeader(void)
-{
-    return NULL;
-}
-
-int URLStream::underflow(void)
-{
-    ssize_t len = 0, rlen;
-    char *buf;
-
-    if(bufsize == 1)
-        return TCPStream::underflow();
-
-    if(!gptr())
-        return EOF;
-
-    if(gptr() < egptr())
-        return (unsigned char)*gptr();
-
-    rlen = (ssize_t)((gbuf + bufsize) - eback());
-    if(encoding == encodingChunked) {
-        buf = (char *)eback();
-        *buf = '\n';
-        while(!chunk && (*buf == '\n' || *buf == '\r')) {
-            *buf = 0;
-            len = readLine(buf, rlen, timeout);
-        }
-        if(len) {
-            if(!chunk)
-                chunk = strtol(buf, NULL, 16);
-
-            if(rlen > (int)chunk)
-                rlen = chunk;
-        }
-        else
-            rlen = -1;
-    }
-
-    if(rlen > 0) {
-        if(Socket::state == STREAM)
-            rlen = aRead((char *)eback(), rlen, timeout);
-        else if(timeout) {
-            if(Socket::isPending(pendingInput, timeout))
-                rlen = readData(eback(), rlen);
-            else
-                rlen = -1;
-        }
-        else
-            rlen = readData(eback(), rlen);
-    }
-    if(encoding == encodingChunked && rlen > 0)
-        chunk -= rlen;
-
-    if(rlen < 1) {
-        if(rlen < 0)
-            clear(ios::failbit | rdstate());
-        return EOF;
-    }
-    setg(eback(), eback(), eback() + rlen);
-    return (unsigned char)*gptr();
-}
-
-void URLStream::setProxy(const char *host, tpport_t port)
-{
-    switch(family) {
-#ifdef  CCXX_IPV6
-    case IPV6:
-        v6proxyHost = host;
-        break;
-#endif
-    case IPV4:
-        proxyHost = host;
-        break;
-    default:
-        proxyPort = 0;
-        return;
-    }
-    proxyPort = port;
-}
-
-URLStream::Error URLStream::submit(const char *path, const char **vars, size_t buf)
-{
-    Error status = errInvalid, saved;
-
-    if(!strnicmp(path, "http:", 5)) {
-        urlmethod = methodHttpGet;
-        path = strchr(path + 5, '/');
-        status = sendHTTPHeader(path, vars, buf);
-    }
-    if((status == errInvalid || status == errTimeout)) {
-        if(Socket::state != AVAILABLE)
-            close();
-        return status;
-    }
-    else {
-        saved = status;
-        status = getHTTPHeaders();
-        if(status == errSuccess)
-            return saved;
-        else if(status == errTimeout) {
-            if(Socket::state != AVAILABLE)
-                close();
-        }
-        return status;
-    }
-}
-
-URLStream::Error URLStream::post(const char *path, MIMEMultipartForm &form, size_t buf)
-{
-    Error status = errInvalid, saved;
-    if(!strnicmp(path, "http:", 5)) {
-        urlmethod = methodHttpPostMultipart;
-        path = strchr(path + 5, '/');
-        std::stringstream ss;
-        form.body(dynamic_cast<std::ostream *>(&ss));
-        status = sendHTTPHeader(path, (const char **)form.getHeaders(), buf, ss.str().c_str());
-    }
-
-    if(status == errInvalid || status == errTimeout) {
-        if(Socket::state != AVAILABLE)
-            close();
-        return status;
-    }
-    saved = status;
-    status = getHTTPHeaders();
-    if(status == errSuccess) {
-        return saved;
-    }
-    if(status == errTimeout) {
-        if(Socket::state != AVAILABLE)
-            close();
-    }
-    return status;
-}
-
-URLStream::Error URLStream::post(const char *path, const char **vars, size_t buf)
-{
-    Error status = errInvalid, saved;
-
-    if(!strnicmp(path, "http:", 5)) {
-        urlmethod = methodHttpPost;
-        path = strchr(path + 5, '/');
-        status = sendHTTPHeader(path, vars, buf);
-    }
-
-    if((status == errInvalid || status == errTimeout)) {
-        if(Socket::state != AVAILABLE)
-            close();
-        return status;
-    }
-    saved = status;
-    status = getHTTPHeaders();
-    if(status == errSuccess)
-        return saved;
-    if(status == errTimeout) {
-        if(Socket::state != AVAILABLE)
-            close();
-    }
-    return status;
-}
-
-
-URLStream::Error URLStream::head(const char *path, size_t buf)
-{
-    Error status = errInvalid, saved;
-
-    if(!strnicmp(path, "http:", 5)) {
-        urlmethod = methodHttpGet;
-        path = strchr(path + 5, '/');
-        status = sendHTTPHeader(path, NULL, buf);
-    }
-
-    if((status == errInvalid || status == errTimeout)) {
-        if(Socket::state != AVAILABLE)
-            close();
-        return status;
-    }
-    else {
-        saved = status;
-        status = getHTTPHeaders();
-        if(status == errSuccess)
-            return saved;
-        else if(status == errTimeout) {
-            if(Socket::state != AVAILABLE)
-                close();
-        }
-        return status;
-    }
-}
-
-URLStream &URLStream::getline(char *buffer, size_t size)
-{
-    size_t len;
-
-    *buffer = 0;
-    // TODO: check, we mix use of streambuf with Socket::readLine...
-    iostream::getline(buffer, (unsigned long)size);
-    len = strlen(buffer);
-
-    while(len) {
-        if(buffer[len - 1] == '\r' || buffer[len - 1] == '\n')
-            buffer[len - 1] = 0;
-        else
-            break;
-        --len;
-    }
-    return *this;
-}
-
-URLStream::Error URLStream::get(size_t buffer)
-{
-    String path = String("http://") + m_host;
-
-    if ( m_address.operator[](0) != '/' )
-        path += "/";
-
-    path += m_address;
-
-    return get(path.c_str(), buffer);
-}
-
-URLStream::Error URLStream::get(const char *urlpath, size_t buf)
-{
-    const char *path = urlpath;
-    Error status = errInvalid, saved;
-
-    urlmethod = methodFileGet;
-
-    if(Socket::state != AVAILABLE)
-        close();
-
-
-    if(!strnicmp(path, "file:", 5)) {
-        urlmethod = methodFileGet;
-        path += 5;
-    }
-    else if(!strnicmp(path, "http:", 5)) {
-        urlmethod = methodHttpGet;
-        path = strchr(path + 5, '/');
-    }
-    switch(urlmethod) {
-    case methodHttpGet:
-        status = sendHTTPHeader(path, NULL, buf);
-        break;
-    case methodFileGet:
-        if(so != INVALID_SOCKET)
-            ::close((int)so);
-        so = ::open(path, O_RDWR);
-        if(so == INVALID_SOCKET)
-            so = ::open(path, O_RDONLY);
-        // FIXME: open return the same handle type as socket call ??
-        if(so == INVALID_SOCKET)
-            return errInvalid;
-        Socket::state = STREAM;
-        allocate(buf);
-        return errSuccess;
-    default:
-                break;
-    }
-
-
-    if((status == errInvalid || status == errTimeout)) {
-        if(Socket::state != AVAILABLE)
-            close();
-        return status;
-    }
-    else {
-        saved = status;
-        status = getHTTPHeaders();
-        if(status == errSuccess)
-            return saved;
-        else if(status == errTimeout) {
-            if(Socket::state != AVAILABLE)
-                close();
-        }
-        return status;
-    }
-}
-
-URLStream::Error URLStream::getHTTPHeaders()
-{
-    char buffer[512];
-    size_t buf = sizeof(buffer);
-    Error status = errSuccess;
-    char *cp, *ep;
-    ssize_t len = 1;
-    char nc = 0;
-
-    chunk = ((unsigned)-1) / 2;
-    encoding = encodingBinary;
-    while(len > 0) {
-        len = readLine(buffer, buf, timeout);
-        if(len < 1)
-            return errTimeout;
-
-        // FIXME: for multiline syntax ??
-        if(buffer[0] == ' ' || buffer[0] == '\r' || buffer[0] == '\n')
-            break;
-        cp = strchr(buffer, ':');
-        if(!cp)
-            continue;
-        *(cp++) = 0;
-        while(*cp == ' ' || *cp == '\t')
-            ++cp;
-        ep = strchr(cp, '\n');
-        if(!ep)
-            ep = &nc;
-        while(*ep == '\n' || *ep == '\r' || *ep == ' ') {
-            *ep = 0;
-            if((--ep) < cp)
-                break;
-        }
-        if(!stricmp(buffer, "Transfer-Encoding")) {
-            if(!stricmp(cp, "chunked")) {
-                chunk = 0;
-                encoding = encodingChunked;
-            }
-        }
-        httpHeader(buffer, cp);
-    }
-    return status;
-}
-
-
-void URLStream::close(void)
-{
-    if(Socket::state == AVAILABLE)
-        return;
-
-    endStream();
-    so = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-    if(so != INVALID_SOCKET)
-        Socket::state = AVAILABLE;
-}
-
-URLStream::Error URLStream::sendHTTPHeader(const char *url, const char **vars, size_t buf, const char *form_body)
-{
-    // TODO: implement authentication
-    char reloc[4096];
-    // "//" host ":" port == max 2 + 128 + 1 + 5 + 1(\0) = 137, rounded 140
-    char host[140];
-    // TODO: add support for //user:pass at host:port/ syntax
-#ifdef HAVE_SSTREAM
-    ostringstream str;
-#else
-    char buffer[4096];
-    strstream str(buffer, sizeof(buffer), ios::out);
-#endif
-    char *ref, *cp, *ep;
-    char *hp;
-    const char *uri = "/";
-    int count = 0;
-    size_t len = 0;
-    tpport_t port = 80;
-    const char **args = vars;
-    const char *var;
-    bool lasteq = true;
-
-    struct servent *svc;
-
-retry:
-#ifdef HAVE_SSTREAM
-    str.str("");
-#else
-    buffer[0] = 0;
-    str.seekp(0);
-#endif
-
-    setString(host, sizeof(host), url);
-reformat:
-    hp = strchr(host, '/');
-    if(!hp) {
-        host[0] = '/';
-        setString(host + 1, sizeof(host) - 1, url);
-        goto reformat;
-    }
-    while(*hp == '/')
-        ++hp;
-    cp = strchr(hp, '/');
-    if (cp) *cp = 0;
-    ep = strrchr(hp, ':');
-    if(ep) {
-        *ep = 0;
-        ++ep;
-        if(isdigit(*ep))
-            port = atoi(ep);
-        else {
-            Socket::mutex.enter();
-            svc = getservbyname(ep, "tcp");
-            if(svc)
-                port = ntohs(svc->s_port);
-            Socket::mutex.leave();
-        }
-    }
-
-    if(!proxyPort) {
-        const char* ep1 = url;
-        while(*ep1 == '/')
-            ++ep1;
-        ep1 = strchr(ep1, '/');
-        if(ep1)
-                uri = ep1;
-    }
-
-    switch(urlmethod) {
-    case methodHttpGet:
-        str << "GET ";
-        if(proxyPort) {
-            str << "http:" << url;
-            if(!cp) str << '/';
-        }
-        else
-            str << uri;
-        break;
-    case methodHttpPost:
-    case methodHttpPostMultipart:
-        str << "POST ";
-        if(proxyPort) {
-            str << "http:" << url;
-            if(!cp) str << '/';
-        }
-        else
-            str << uri;
-        break;
-    default:
-        return errInvalid;
-    }
-
-    if(vars && urlmethod == methodHttpGet) {
-        str << "?";
-        while(*vars) {
-            if(count++ && lasteq)
-                str << "&";
-            str << *vars;
-            if(!lasteq)
-                lasteq = true;
-            else if(strchr(*vars, '='))
-                lasteq = true;
-            else {
-                lasteq = false;
-                str << "=";
-            }
-            ++vars;
-        }
-    }
-
-    switch(protocol) {
-    case protocolHttp1_1:
-        str << " HTTP/1.1" << "\r\n";
-        break;
-    case protocolHttp1_0:
-        str << " HTTP/1.0" << "\r\n";
-        break;
-    }
-
-    if ( m_host.empty() )
-        m_host = hp;
-
-    str << "Host: " << hp << "\r\n";
-    if(agent)
-        str << "User-Agent: " << agent << "\r\n";
-
-    if(cookie)
-        str << "Cookie: " << cookie << "\r\n";
-
-    if(pragma)
-        str << "Pragma: " << pragma << "\r\n";
-
-    if(referer)
-        str << "Referer: " << referer << "\r\n";
-
-    switch(auth) {
-    case authBasic:
-        str << "Authorization: Basic ";
-        snprintf(reloc, 64, "%s:%s", user, password);
-        b64Encode(reloc, reloc + 64, 128);
-        str << reloc + 64 << "\r\n";
-    case authAnonymous:
-        break;
-    }
-
-    switch(proxyAuth) {
-    case authBasic:
-        str << "Proxy-Authorization: Basic ";
-        snprintf(reloc, 64, "%s:%s", proxyUser, proxyPasswd);
-        b64Encode(reloc, reloc + 64, 128);
-        str << reloc + 64 << "\r\n";
-        str << "Proxy-Connection: close" << "\r\n";
-    case authAnonymous:
-        break;
-    }
-
-
-    str << "Connection: close\r\n";
-    char **add = extraHeader();
-    if(add) {
-        while(*add) {
-            str << *(add++) << ": ";
-            str << *(add++) << "\r\n";
-        }
-    }
-    if(vars)
-        switch(urlmethod) {
-        case methodHttpPost:
-            while(*args) {
-                var = *args;
-                if(count++ || !strchr(var, '='))
-                    len += strlen(var) + 1;
-                else
-                    len = strlen(var);
-                ++args;
-            }
-            count = 0;
-            str << "Content-Type: " << contentType << "\r\n";
-            str << "Content-Length: " << (unsigned)len << "\r\n";
-            break;
-        case methodHttpPostMultipart:
-        	str << "Content-Length: " << strlen(form_body) << "\r\n";
-            while(*args)
-                str << *(args++) << "\r\n";
-        default:
-            break;
-        }
-
-    str << "\r\n";
-#ifdef HAVE_SSTREAM
-    // sstream does not want ends
-#else
-    str << ends;
-#endif
-
-    if(Socket::state != AVAILABLE)
-            close();
-#ifndef WIN32
-#ifdef  SOICGIFINDEX
-    if (localif != NULL) {
-        struct ifreq ifr;
-
-        switch(family) {
-#ifdef  CCXX_IPV6
-        case IPV6:
-            sockaddr_in6 source;
-            int alen = sizeof(source);
-
-            memset(&ifr, 0, sizeof(ifr));
-            setString(ifr.ifr_name, sizeof(ifr.ifr_name), localif);
-            if (ioctl(so, SIOCGIFINDEX, &ifr) < 0)
-                return errInterface;
-            else {
-                if (setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1)
-                    return errInterface;
-                else if(getsockname(so, (struct sockaddr*)&source,(socklen_t *) &alen) == -1)
-                    return errInterface;
-                else if (bind(so, (struct sockaddr*)&source, sizeof(source)) == -1)
-                    return errInterface;
-                else
-                    source.sin6_port = 0;
-            }
-
-            break;
-#endif
-        case IPV4:
-            sockaddr_in source;
-            int alen = sizeof(source);
-
-            memset(&ifr, 0, sizeof(ifr));
-            setString(ifr.ifr_name, sizeof(ifr.ifr_name), localif);
-            if (ioctl(so, SIOCGIFINDEX, &ifr) < 0)
-                return errInterface;
-            else {
-                if (setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1)
-                    return errInterface;
-                else if(getsockname(so, (struct sockaddr*)&source,(socklen_t *) &alen) == -1)
-                    return errInterface;
-                else if (bind(so, (struct sockaddr*)&source, sizeof(source)) == -1)
-                    return errInterface;
-                else
-                    source.sin_port = 0;
-            }
-        }
-
-    }
-#endif
-#endif
-
-    if(proxyPort) {
-        switch(family) {
-#ifdef  CCXX_IPV6
-        case IPV6:
-            connect(v6proxyHost, proxyPort, (unsigned)buf);
-            break;
-#endif
-        case IPV4:
-                connect(proxyHost, proxyPort, (unsigned)buf);
-            break;
-        }
-    }
-    else {
-        switch(family) {
-#ifdef  CCXX_IPV6
-        case IPV6:
-            connect(IPV6Host(hp), port, (unsigned)buf);
-            break;
-#endif
-        case IPV4:
-            connect(IPV4Host(hp), port, (unsigned)buf);
-        }
-    }
-
-    if(!isConnected())
-        return errUnreachable;
-
-    // FIXME: send (or write) can send less than len bytes
-    // use stream funcion ??
-#ifdef HAVE_SSTREAM
-    writeData(str.str().c_str(), _IOLEN64 str.str().length());
-#else
-    writeData(str.str().c_str(), _IOLEN64 str.str().length());
-#endif
-
-    if(urlmethod == methodHttpPost && vars) {
-#ifdef HAVE_SSTREAM
-            str.str() = "";
-#else
-        str.seekp(0);
-#endif
-        bool sep = false;
-        while(*vars) {
-            if(sep)
-                writeData("&", 1);
-            else
-                sep = true;
-            var = *vars;
-            if(!strchr(var, '=')) {
-                snprintf(reloc, sizeof(reloc), "%s=%s", var, *(++vars));
-                writeData(reloc, strlen(reloc));
-            }
-            else
-                writeData(var, strlen(var));
-            ++vars;
-        }
-    }
-    if(urlmethod == methodHttpPostMultipart && form_body) {
-    	writeData(form_body, strlen(form_body));
-    }
-
-cont:
-#ifdef HAVE_SSTREAM
-    char buffer[4096];
-#else
-    // nothing here
-#endif
-
-    len = readLine(buffer, sizeof(buffer) - 1, timeout);
-    if(len < 1)
-        return errTimeout;
-
-    if(strnicmp(buffer, "HTTP/", 5))
-        return errInvalid;
-
-    ref = strchr(buffer, ' ');
-    while(*ref == ' ')
-        ++ref;
-
-    switch(atoi(ref)) {
-        default:
-        return errInvalid;
-    case 100:
-        goto cont;
-        case 200:
-        return errSuccess;
-        case 401:
-        return errUnauthorized;
-        case 403:
-        return errForbidden;
-        case 404:
-        return errMissing;
-        case 405:
-        return errDenied;
-        case 500:
-        case 501:
-        case 502:
-        case 503:
-        case 504:
-        case 505:
-        return errFailure;
-        case 300:
-        case 301:
-        case 302:
-        break;
-    }
-    if(!follow)
-        return errRelocated;
-    for(;;) {
-        len = readLine(reloc, sizeof(reloc), timeout);
-        if(len < 1)
-            return errTimeout;
-        if(!strnicmp(reloc, "Location: ", 10))
-            break;
-    }
-    if(!strnicmp(reloc + 10, "http:", 5)) {
-        url = strchr(reloc + 15, '/');
-        ep = (char *)(url + strlen(url) - 1);
-        while(*ep == '\r' || *ep == '\n')
-            *(ep--) = 0;
-    }
-    else
-        url = reloc + 10;
-    close();
-    goto retry;
-}
-
-void URLStream::setAuthentication(Authentication a, const char *value)
-{
-    auth = a;
-    if (auth != authAnonymous) {
-        if(!user)
-            user = "anonymous";
-        if(!password)
-            password = "";
-    }
-}
-
-void URLStream::setProxyAuthentication(Authentication a, const char *value)
-{
-    proxyAuth = a;
-    if (proxyAuth != authAnonymous) {
-        if(!proxyUser)
-            proxyUser = "anonymous";
-
-        if(!proxyPasswd)
-            proxyPasswd = "";
-    }
-}
-
-void URLStream::setReferer(const char *str)
-{
-    if(!str)
-        return;
-    referer = str;
-}
-
-#ifdef  CCXX_NAMESPACES
-}
-#endif
-
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-basic-offset: 4
- * End:
- */
diff --git a/libfritz++/cc++/url.h b/libfritz++/cc++/url.h
deleted file mode 100644
index bcf09a4..0000000
--- a/libfritz++/cc++/url.h
+++ /dev/null
@@ -1,552 +0,0 @@
-// Copyright (C) 2001-2005 Open Source Telecom Corporation.
-// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-/**
- * @file url.h
- * @short URL streams abstraction.
- **/
-
-#ifndef CCXX_URL_H_
-#define CCXX_URL_H_
-
-#ifndef CCXX_CONFIG_H_
-#include <cc++/config.h>
-#endif
-
-#ifndef CCXX_SOCKET_H_
-#include <cc++/socket.h>
-#endif
-
-#ifndef CCXX_MIME_H_
-#include "mime.h"
-#endif
-
-#ifdef  CCXX_NAMESPACES
-namespace ost2 {
-	using ost::TCPStream;
-	using ost::IPV4Host;
-#ifdef  CCXX_IPV6
-	using ost::IPV6Host;
-#endif
-	using ost::tpport_t;
-	using ost::String;
-#endif
-
-/**
- * A URL processing version of TCPStream.
- *
- * @author David Sugar <dyfet at ostel.com>
- * @short C++ url processing stream class.
- */
-class __EXPORT URLStream : public TCPStream
-{
-public:
-    /**
-     * Return error for url fetch
-     */
-    typedef enum {
-        errSuccess = 0,
-        errUnreachable,
-        errMissing,
-        errDenied,
-        errInvalid,
-        errForbidden,
-        errUnauthorized,
-        errRelocated,
-        errFailure,
-        errTimeout,
-        errInterface
-    } Error;
-
-    /**
-     * Type of authentication
-     */
-    typedef enum {
-        authAnonymous = 0,
-        authBasic
-    } Authentication;
-
-    /**
-     * Encoding used in transfer
-     */
-    typedef enum {
-        encodingBinary = 0,
-        encodingChunked
-    } Encoding;
-
-    /**
-     * Type of fetch
-     */
-    typedef enum {
-        methodHttpGet,
-        methodHttpPut,
-        methodHttpPost,
-        methodHttpPostMultipart,
-        methodFtpGet,
-        methodFtpPut,
-        methodFileGet,
-        methodFilePut
-    } Method;
-
-    /**
-     * http protocol version
-     */
-    typedef enum {
-        protocolHttp1_0,
-        protocolHttp1_1
-    } Protocol;
-
-private:
-    const char *agent, *referer, *cookie, *pragma, *user, *password;
-    const char *proxyUser, *proxyPasswd;
-    const char *localif;
-    IPV4Host proxyHost;
-#ifdef  CCXX_IPV6
-    IPV6Host v6proxyHost;
-#endif
-    tpport_t proxyPort;
-    Method urlmethod;
-    Encoding encoding;
-    Protocol protocol;
-    Authentication auth;
-    Authentication proxyAuth;
-    timeout_t timeout;
-    bool persistent;
-    bool follow;
-    unsigned chunk;
-
-    Error getHTTPHeaders();
-    URLStream(const URLStream& rhs);
-
-protected:
-    ost::String m_host, m_address;
-    ost::String contentType;
-
-    /**
-     * Send http header to server.
-     *
-     * @param url base to send header to
-     * @param vars to post or use in get method
-     * @param bufsize of stream buffering to use
-     * @return success or class error
-     */
-    Error sendHTTPHeader(const char *url, const char **vars, size_t bufsize, const char *form_body = NULL);
-
-    /**
-     * Called if stream buffer needs refilling.
-     *
-     * @return number of bytes refilled or error if < 0
-     */
-    int underflow(void);
-
-    /**
-     * Derived method for async or timed I/O function on url stream.
-     *
-     * @return number of bytes read or < 0 for error.
-     * @param buffer to read stream data into.
-     * @param len of bytes to read from stream.
-     * @param timer to wait for data in milliseconds.
-     */
-    virtual int aRead(char *buffer, size_t len, timeout_t timer);
-
-    /**
-     * Derived method for async or timed I/O function on url stream.
-     *
-     * @return number of bytes written or < 0 for error.
-     * @param buffer to write stream data from.
-     * @param len of bytes to write to stream.
-     * @param timer to wait for data in milliseconds.
-     */
-    virtual int aWrite(char *buffer, size_t len, timeout_t timer);
-
-    /**
-     * Derived method to receive and parse http "headers".
-     *
-     * @param header keyword.
-     * @param value header keyword value.
-     */
-    virtual void httpHeader(const char *header, const char *value);
-
-    /**
-     * A virtual to insert additional header info into the request.
-     *
-     * @return array of header attributes to add.
-     */
-    virtual char **extraHeader(void);
-
-public:
-    /**
-     * Construct an instance of URL stream.
-     *
-     * @param family protocol to use.
-     * @param timer for default timeout on I/O operations.
-     */
-    URLStream(Family family = IPV4, timeout_t timer = 0);
-
-    /**
-     * Line parsing with conversion.
-     *
-     * @return URLStream object reference.
-     * @param buffer to store.
-     * @param len maximum buffer size.
-     */
-    URLStream &getline(char *buffer, size_t len);
-
-    /**
-     * Get URL data from a named stream of a known buffer size.
-     *
-     * @return url error code.
-     * @param url name of resource.
-     * @param buffer size of buffer.
-     */
-    Error get(const char *url, size_t buffer = 512);
-
-    /**
-    * Get URL data from a named stream of a known buffer size.
-    * Requesting URL defined in previous calls of setAddress() and
-    * setHost() functions.
-    *
-    * @return url error code.
-    * @param buffer size of buffer.
-    */
-    Error get(size_t buffer = 512);
-
-    /**
-     * Submit URL with vars passed as argument array.  This submit
-     * assumes "GET" method.  Use "post" member to perform post.
-     *
-     * @return url error code.
-     * @param url name of resource.
-     * @param vars to set.
-     * @param buffer size of buffer.
-     */
-    Error submit(const char *url, const char **vars, size_t buffer = 512);
-
-    /**
-     * Post URL vars with post method.
-     *
-     * @return success or error code.
-     * @param url name of resource being posted.
-     * @param vars to set in post.
-     * @param buffer size of buffer.
-     */
-    Error post(const char *url, const char **vars, size_t buffer = 512);
-
-    /**
-     * Post URL with MIME multipart form.
-     *
-     * @return success or error code.
-     * @param url name of resource being posted.
-     * @param form multi-part resource.
-     * @param buffer size to use.
-     */
-    Error post(const char *url, MIMEMultipartForm &form, size_t buffer = 512);
-
-    /**
-     * Used to fetch header information for a resource.
-     *
-     * @return url error code.
-     * @param url name of resource.
-     * @param buffer size of buffer.
-     */
-    Error head(const char *url, size_t buffer = 512);
-
-    /**
-     * Close the URL stream for a new connection.
-     */
-    void close();
-
-    /**
-     * Set the referer url.
-     *
-     * @param str referer string.
-     */
-    void setReferer(const char *str);
-
-    /**
-    * Set the host for the url
-    *
-    * @param str host address.
-    */
-    inline void setHost(const char *str)
-        {m_host = str;};
-
-    /**
-    * Set the address for the url
-    *
-    * @param str address in the URL.
-    */
-    inline void setAddress(const char *str)
-        {m_address = str;};
-
-    /**
-     * Set the cookie to pass.
-     *
-     * @param str cookie string.
-     */
-    inline void setCookie(const char *str)
-        {cookie = str;};
-
-    /**
-     * Set user id for the url.
-     *
-     * @param str user id.
-     */
-    inline void setUser(const char *str)
-        {user = str;};
-
-    /**
-     * Set password for the url.
-     *
-     * @param str password.
-     */
-    inline void setPassword(const char *str)
-        {password = str;};
-
-    /**
-     * Set authentication type for the url.
-     *
-     * @param a authentication.
-     * @param str string.
-     */
-    void setAuthentication(Authentication a, const char *str = NULL);
-
-    /**
-     * Set proxy user id for the url.
-     *
-     * @param str user id.
-     */
-    inline void setProxyUser(const char *str)
-        {proxyUser = str;};
-
-    /**
-     * Set proxy password for the url.
-     *
-     * @param str password.
-     */
-    inline void setProxyPassword(const char *str)
-        {proxyPasswd = str;};
-
-    /**
-     * Set proxy authentication type for the url.
-     *
-     * @param a authentication.
-     * @param str string.
-     */
-    void setProxyAuthentication(Authentication a, const char *str = NULL);
-
-    /**
-     * Set the pragmas.
-     *
-     * @param str pragma setting.
-     */
-    inline void setPragma(const char *str)
-        {pragma = str;};
-
-    /**
-     * Set the proxy server used.
-     *
-     * @param host proxy host.
-     * @param port proxy port.
-     */
-    void setProxy(const char *host, tpport_t port);
-
-    /**
-     * Set the agent.
-     *
-     * @param str agent value.
-     */
-    inline void setAgent(const char *str)
-        {agent = str;};
-
-    /**
-     * Get url method (and protocol) employed.
-     *
-     * @return url method in effect.
-     */
-    inline Method getMethod(void)
-        {return urlmethod;};
-
-    /**
-     * Set socket timeout characteristics for processing URL
-     * requests.  Set to 0 for no default timeouts.
-     *
-     * @param to timeout to set.
-     */
-    inline void setTimeout(timeout_t to)
-        {timeout = to;};
-
-    /**
-     * Specify url following.  Set to false to disable following
-     * of relocation requests.
-     *
-     * @param enable true to enable following.
-     */
-    inline void setFollow(bool enable)
-        {follow = enable;};
-
-    /**
-     * Specify http protocol level being used.
-     *
-     * @param pro protocol level.
-     */
-    inline void setProtocol(Protocol pro)
-        {protocol = pro;};
-    /**
-     * Specify local interface to use
-     *
-     * @param intf Local interface name
-     */
-    inline void setLocalInterface(const char *intf)
-    {localif=intf;}
-};
-
-/** @relates URLStream
- * Decode an url parameter (ie "\%20" -> " ")
- * @param source string
- * @param dest destination buffer. If NULL source is used
- */
-__EXPORT char* urlDecode(char *source, char *dest = NULL);
-
-/** @relates URLStream
- * Encode an url parameter (ie " " -> "+")
- * @param source string
- * @param dest destination buffer. Do not overlap with source
- * @param size destination buffer size.
- */
-__EXPORT char* urlEncode(const char *source, char *dest, size_t size);
-
-/** @relates URLStream
- * Decode a string using base64 coding.
- * Destination size should be at least strlen(src)+1.
- * Destination will be a string, so is always terminated .
- * This function is deprecated, base64 can use binary source, not only string
- * use overloaded b64Decode.
- * @return string coded
- * @param src  source buffer
- * @param dest destination buffer. If NULL src is used
- */
-__EXPORT char* b64Decode(char *src, char *dest = NULL);
-
-/** @relates URLStream
- * Encode a string using base64 coding.
- * Destination size should be at least strlen(src)/4*3+1.
- * Destination is string terminated.
- * This function is deprecated, coded stream can contain terminator character
- * use overloaded b64Encode instead.
- * @return destination buffer
- * @param source source string
- * @param dest   destination octet buffer
- * @param size   destination buffer size
- */
-__EXPORT char* b64Encode(const char *source, char *dest, size_t size);
-
-/** @relates URLStream
- * Encode a octet stream using base64 coding.
- * Destination size should be at least (srcsize+2)/3*4+1.
- * Destination will be a string, so is always terminated
- * (unless you pass dstsize == 0).
- * @return size of string written not counting terminator
- * @param src     source buffer
- * @param srcsize source buffer size
- * @param dst     destination buffer
- * @param dstsize destination buffer size
- */
-__EXPORT size_t b64Encode(const unsigned char *src, size_t srcsize,
-           char *dst, size_t dstsize);
-
-/** @relates URLStream
- * Decode a string using base64 coding.
- * Destination size should be at least strlen(src)/4*3.
- * Destination are not string terminated (It's just a octet stream).
- * @return number of octets written into destination buffer
- * @param src     source string
- * @param dst     destination octet buffer
- * @param dstsize destination buffer size
- */
-__EXPORT size_t b64Decode(const char *src,
-        unsigned char *dst, size_t dstsize);
-
-/** @relates URLStream
- * Encode a STL string using base64 coding into a STL string
- * @return base 64 encoded string
- * @param src source string
- */
-__EXPORT String b64Encode(const String& src);
-
-/** @relates URLStream
- * Decode a STL string using base64 coding into an STL String.
- * Destination size should be at least strlen(src)/4*3.
- * Destination are not string terminated (It's just a octet stream).
- * @return decoded string
- * @param src     source string
- */
-__EXPORT String b64Decode(const String& src);
-
-/** @relates URLStream
- * Encode a octet stream using base64 coding into a STL string
- * @return base 64 encoded string
- * @param src     source buffer
- * @param srcsize source buffer size
- */
-__EXPORT String b64Encode(const unsigned char *src, size_t srcsize);
-
-/** @relates URLStream
- * Decode a string using base64 coding.
- * Destination size should be at least strlen(src)/4*3.
- * Destination are not string terminated (It's just a octet stream).
- * @return number of octets written into destination buffer
- * @param src     source string
- * @param dst     destination octet buffer
- * @param dstsize destination buffer size
- */
-__EXPORT size_t b64Decode(const String& src,
-        unsigned char *dst, size_t dstsize);
-
-
-#ifdef  CCXX_NAMESPACES
-}
-#endif
-
-#endif
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-basic-offset: 4
- * End:
- */
diff --git a/libfritz++/cc++/urlstring.cpp b/libfritz++/cc++/urlstring.cpp
deleted file mode 100644
index 581129e..0000000
--- a/libfritz++/cc++/urlstring.cpp
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright (C) 2001-2005 Open Source Telecom Corporation.
-// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// This exception applies only to the code released under the name GNU
-// Common C++.  If you copy code from other releases into a copy of GNU
-// Common C++, as the General Public License permits, the exception does
-// not apply to the code that you add in this way.  To avoid misleading
-// anyone as to the status of such modified files, you must delete
-// this exception notice from them.
-//
-// If you write modifications of your own for GNU Common C++, it is your choice
-// whether to permit this exception to apply to your modifications.
-// If you do not wish that, delete this exception notice.
-//
-
-#include <cc++/config.h>
-#ifdef  CCXX_WITHOUT_EXTRAS
-#include <cc++/export.h>
-#endif
-#include <cc++/exception.h>
-#include <cc++/thread.h>
-#include <cc++/address.h>
-#include <cc++/socket.h>
-#ifndef CCXX_WITHOUT_EXTRAS
-#include <cc++/export.h>
-#endif
-#include <cc++/url.h>
-
-#include <string>
-#include <cstdio>
-#include <cstdlib>
-#include <fcntl.h>
-#include <cerrno>
-#include <iostream>
-#ifdef  WIN32
-#include <io.h>
-#endif
-#include <cctype>
-
-#ifdef  CCXX_NAMESPACES
-namespace ost2 {
-using namespace std;
-#endif
-
-static const unsigned char alphabet[65] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-char* b64Encode(const char *source, char *dest, size_t limit)
-{
-    b64Encode((const unsigned char*)source,strlen(source),
-            dest,limit);
-    return dest;
-}
-
-char* b64Decode(char *source, char *dest)
-{
-    size_t srcsize = strlen(source);
-    char* dst = dest?dest:source;
-    size_t dstsize =
-        b64Decode(source,(unsigned char*)dst,srcsize+1);
-    dst[dstsize] = 0;
-    return dst;
-}
-
-size_t b64Encode(const unsigned char *src, size_t srcsize,
-                       char *dst, size_t dstsize)
-{
-    if (!dstsize) return 0;
-
-    char* pdst = dst;
-    unsigned bits;
-
-    while(srcsize >= 3 && dstsize > 4) {
-        bits = (((unsigned)src[0])<<16) | (((unsigned)src[1])<<8)
-            | ((unsigned)src[2]);
-        src += 3;
-        srcsize -= 3;
-        *(pdst++) = alphabet[bits >> 18];
-            *(pdst++) = alphabet[(bits >> 12) & 0x3f];
-            *(pdst++) = alphabet[(bits >> 6) & 0x3f];
-            *(pdst++) = alphabet[bits & 0x3f];
-        dstsize -= 4;
-    }
-    if (srcsize && dstsize > 4) {
-        bits = ((unsigned)src[0])<<16;
-        *(pdst++) = alphabet[bits >> 18];
-        if (srcsize == 1) {
-            *(pdst++) = alphabet[(bits >> 12) & 0x3f];
-                *(pdst++) = '=';
-        }
-        else {
-            bits |= ((unsigned)src[1])<<8;
-            *(pdst++) = alphabet[(bits >> 12) & 0x3f];
-                *(pdst++) = alphabet[(bits >> 6) & 0x3f];
-        }
-            *(pdst++) = '=';
-    }
-    *pdst = 0;
-    return pdst-dst;
-}
-
-size_t b64Decode(const char *src,
-        unsigned char *dst, size_t dstsize)
-{
-    char decoder[256];
-        int i, bits, c;
-
-    unsigned char *pdst = dst;
-
-    for (i = 0; i < 256; ++i)
-        decoder[i] = 64;
-        for (i = 0; i < 64 ; ++i)
-        decoder[alphabet[i]] = i;
-
-        bits = 1;
-
-    while(*src) {
-        c = (unsigned char)(*(src++));
-        if (c == '=') {
-            if (bits & 0x40000) {
-                if (dstsize < 2) break;
-                *(pdst++) = (bits >> 10);
-                *(pdst++) = (bits >> 2) & 0xff;
-                break;
-            }
-            if (bits & 0x1000 && dstsize)
-                *(pdst++) = (bits >> 4);
-            break;
-        }
-        // skip invalid chars
-        if (decoder[c] == 64)
-            continue;
-        bits = (bits << 6) + decoder[c];
-        if (bits & 0x1000000) {
-            if (dstsize < 3) break;
-            *(pdst++) = (bits >> 16);
-            *(pdst++) = (bits >> 8) & 0xff;
-            *(pdst++) = (bits & 0xff);
-                bits = 1;
-            dstsize -= 3;
-        }
-    }
-    return pdst-dst;
-}
-
-
-char* urlDecode(char *source, char *dest)
-{
-    char *ret;
-    char hex[3];
-
-    if(!dest)
-        dest = source;
-    else
-        *dest = 0;
-
-    ret = dest;
-
-    if(!source)
-        return dest;
-
-    while(*source) {
-        switch(*source) {
-        case '+':
-            *(dest++) = ' ';
-            break;
-        case '%':
-            // NOTE: wrong input can finish with "...%" giving
-            // buffer overflow, cut string here
-            if(source[1]) {
-                hex[0] = source[1];
-                ++source;
-                if(source[1]) {
-                    hex[1] = source[1];
-                    ++source;
-                }
-                else
-                    hex[1] = 0;
-            }
-            else
-                hex[0] = hex[1] = 0;
-            hex[2] = 0;
-            *(dest++) = (char)strtol(hex, NULL, 16);
-            break;
-        default:
-            *(dest++) = *source;
-        }
-        ++source;
-    }
-    *dest = 0;
-    return ret;
-}
-
-char* urlEncode(const char *source, char *dest, size_t max)
-{
-    static const char *hex = "0123456789abcdef";
-    size_t len = 0;
-    unsigned char ch;
-    char *ret = dest;
-
-    *dest = 0;
-    if(!source)
-        return dest;
-
-    while(len < max - 4 && *source) {
-        ch = (unsigned char)*source;
-        if(*source == ' ')
-            *(dest++) = '+';
-        else if(isalnum(*source) || strchr("/.-:;,", *source))
-            *(dest++) = *source;
-        else {
-            *(dest++) = '%';
-            // char in C++ can be more than 8bit
-            *(dest++) = hex[(ch >> 4)&0xF];
-            *(dest++) = hex[ch % 16];
-        }
-        ++source;
-    }
-    *dest = 0;
-    return ret;
-}
-
-#if defined(DYNAMIC_LOCAL_ARRAYS)
-
-/** @relates URLStream
- * Encode a STL string using base64 coding into a STL string
- * @return base 64 encoded string
- * @param src source string
- */
-String b64Encode(const String& src)
-{
-    size_t limit = (src.length()+2)/3*4+1;  // size + null must be included
-    char buffer[limit];
-
-    unsigned size = b64Encode((const unsigned char *)src.c_str(), src.length(), buffer, limit);
-    buffer[size] = '\0';
-
-    return String(buffer);
-}
-
-/** @relates URLStream
- * Decode a STL string using base64 coding into an STL String.
- * Destination size should be at least strlen(src)/4*3.
- * Destination are not string terminated (It's just a octet stream).
- * @return decoded string
- * @param src     source string
- */
-String b64Decode(const String& src)
-{
-    size_t limit = src.length()/4*3;
-    unsigned char buffer[limit+1];
-
-    unsigned size = b64Decode(src.c_str(), buffer, limit);
-    buffer[size] = '\0';
-
-    return String((char *)buffer);
-}
-
-/** @relates URLStream
- * Encode a octet stream using base64 coding into a STL string
- * @return base 64 encoded string
- * @param src     source buffer
- * @param srcsize source buffer size
- */
-String b64Encode(const unsigned char *src, size_t srcsize)
-{
-    size_t limit = (srcsize+2)/3*4+1;
-    char buffer[limit];
-
-    unsigned size = b64Encode(src, srcsize, buffer, limit);
-    buffer[size] = '\0';
-
-    return String(buffer);
-}
-
-/** @relates URLStream
- * Decode an STL string encoded using base64.
- * Destination size should be at least strlen(src)/4*3.
- * Destination are not string terminated (It's just a octet stream).
- * @return number of octets written into destination buffer
- * @param src     source string
- * @param dst     destination octet buffer
- * @param dstsize destination buffer size
- */
-size_t b64Decode(const String& src,
-  unsigned char *dst, size_t dstsize)
-{
-    return b64Decode(src.c_str(), dst, dstsize);
-}
-#endif
-
-#ifdef  CCXX_NAMESPACES
-}
-#endif
diff --git a/log.c b/liblog++/CustomLogStream.cpp
similarity index 67%
rename from log.c
rename to liblog++/CustomLogStream.cpp
index 282582b..7050aed 100644
--- a/log.c
+++ b/liblog++/CustomLogStream.cpp
@@ -1,7 +1,7 @@
 /*
- * Fritz!Box plugin for VDR
+ * liblog++
  *
- * Copyright (C) 2008-2012Joachim Wilke <vdr at joachim-wilke.de>
+ * Copyright (C) 2007-2013 Joachim Wilke <liblog at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,19 +19,21 @@
  *
  */
 
+#include "CustomLogStream.h"
 
-#include "log.h"
-#include <vdr/tools.h>
+#include <string.h>
 
-LogBuf::LogBuf(eLogType type) {
+namespace logger {
+
+CustomLogBuf::CustomLogBuf(customLogFunction loggerFunction)
+: loggerFunction{loggerFunction} {
 	const unsigned int BUFFER_SIZE = 1024;
 	char	*ptr = new char[BUFFER_SIZE];
 	setp(ptr, ptr + BUFFER_SIZE);
 	setg(0, 0, 0);
-	this->type = type;
 }
 
-void LogBuf::PutBuffer(void)
+void CustomLogBuf::putBuffer(void)
 {
 	if (pbase() != pptr())
 	{
@@ -41,26 +43,16 @@ void LogBuf::PutBuffer(void)
 		strncpy(buffer, pbase(), len);
 		buffer[len] = 0;
 
-		switch (type) {
-		case INFO:
-			isyslog("%s", buffer);
-			break;
-		case ERROR:
-			esyslog("%s", buffer);
-			break;
-		case DEBUG:
-			dsyslog("%s", buffer);
-			break;
-		}
+		loggerFunction(buffer);
 
 		setp(pbase(), epptr());
 		delete [] buffer;
 	}
 }
 
-int LogBuf::overflow(int c)
+int CustomLogBuf::overflow(int c)
 {
-	PutBuffer();
+	putBuffer();
 
 	if (c != EOF) {
 		sputc(c);
@@ -69,20 +61,18 @@ int LogBuf::overflow(int c)
 
 }
 
-int LogBuf::sync()
+int CustomLogBuf::sync()
 {
-	PutBuffer();
+	putBuffer();
 	return 0;
 }
 
-LogBuf::~LogBuf() {
+CustomLogBuf::~CustomLogBuf() {
 	sync();
 	delete[] pbase();
 }
 
-cLogStream::cLogStream(LogBuf::eLogType type)
-:std::ostream(new LogBuf(type))
-{
-}
-
+CustomLogStream::CustomLogStream(customLogFunction loggerFunction)
+:std::ostream(new CustomLogBuf(loggerFunction)) {}
 
+} /* namespace logger */
diff --git a/log.h b/liblog++/CustomLogStream.h
similarity index 55%
rename from log.h
rename to liblog++/CustomLogStream.h
index a882266..3a79799 100644
--- a/log.h
+++ b/liblog++/CustomLogStream.h
@@ -1,7 +1,7 @@
 /*
- * Fritz!Box plugin for VDR
+ * liblog++
  *
- * Copyright (C) 2008-2012Joachim Wilke <vdr at joachim-wilke.de>
+ * Copyright (C) 2007-2013 Joachim Wilke <liblog at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,34 +19,34 @@
  *
  */
 
+#ifndef CUSTOMLOGSTREAM_H_
+#define CUSTOMLOGSTREAM_H_
+
 #include <iostream>
+#include <functional>
 
-#ifndef LOG_H_
-#define LOG_H_
+namespace logger {
 
-class LogBuf : public std::streambuf { //TODO: inherit from stringbuf?
-public:
-	enum eLogType {
-		DEBUG,
-		INFO,
-		ERROR,
-	};
+typedef std::function<void(const std::string &)> customLogFunction;
+
+
+class CustomLogBuf : public std::streambuf {
 private:
-	void	PutBuffer(void);
-	void	PutChar(char c);
-	eLogType type;
+	void	putBuffer(void);
+	void	putChar(char c);
+	customLogFunction loggerFunction;
 protected:
-	int	overflow(int);
-	int	sync();
+	int	overflow(int) override;
+	int	sync() override;
 public:
-	LogBuf(eLogType type);
-	virtual ~LogBuf();
+	CustomLogBuf(customLogFunction loggerFunction);
+	virtual ~CustomLogBuf();
 };
 
-class cLogStream: public std::ostream {
+class CustomLogStream : public std::ostream {
 public:
-	cLogStream(LogBuf::eLogType type);
-	//virtual ~LogStream();
+	CustomLogStream(customLogFunction loggerFunction);
 };
 
-#endif /* LOG_H_ */
+} /* namespace logger */
+#endif /* CUSTOMLOGSTREAM_H_ */
diff --git a/liblog++/Log.cpp b/liblog++/Log.cpp
new file mode 100644
index 0000000..cce2331
--- /dev/null
+++ b/liblog++/Log.cpp
@@ -0,0 +1,83 @@
+/*
+ * liblog++
+ *
+ * Copyright (C) 2007-2013 Joachim Wilke <liblog at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include "Log.h"
+
+#include "CustomLogStream.h"
+
+#include <sstream>
+
+namespace logger {
+
+std::mutex    Log::mutex;
+std::string   Log::prefix;
+Log::ostreamPtr Log::dstream = nullptr;
+Log::ostreamPtr Log::estream = nullptr;
+Log::ostreamPtr Log::istream = nullptr;
+
+std::string Log::getLocator(std::string file, int line) {
+	std::stringstream ss;
+	size_t start = file.rfind('/') == std::string::npos ? 0 : file.rfind('/') + 1;
+	ss << "[" << prefix << std::string(file, start, std::string::npos)
+	   << ":" << line << "] ";
+	return ss.str();
+}
+
+void Log::putLogMessage(const std::ostream &message, std::ostream &stream, std::string file, int line) {
+	mutex.lock();
+	stream << getLocator(file, line) << message.rdbuf() << std::endl;
+	mutex.unlock();
+}
+
+void Log::debug(const std::ostream &message, std::string file, int line) {
+	if (dstream)
+		putLogMessage(message, *dstream, file, line);
+	else
+		putLogMessage(message, std::clog, file, line);
+}
+
+void Log::error(const std::ostream &message, std::string file, int line) {
+	if (estream)
+		putLogMessage(message, *estream, file, line);
+	else
+		putLogMessage(message, std::cerr, file, line);
+}
+
+void Log::info(const std::ostream &message, std::string file, int line) {
+	if (istream)
+		putLogMessage(message, *istream, file, line);
+	else
+		putLogMessage(message, std::cout, file, line);
+}
+
+void Log::setLogStreams(Log::ostreamPtr &&elog, Log::ostreamPtr &&dlog, Log::ostreamPtr &&ilog) {
+	estream = std::move(elog);
+	istream = std::move(ilog);
+	dstream = std::move(dlog);
+}
+
+void Log::setCustomLogger(customLogFunction logError, customLogFunction logInfo, customLogFunction logDebug) {
+	setLogStreams(std::unique_ptr<CustomLogStream>(new CustomLogStream(logError)),
+			      std::unique_ptr<CustomLogStream>(new CustomLogStream(logInfo)),
+				  std::unique_ptr<CustomLogStream>(new CustomLogStream(logDebug)));
+}
+
+} /* namespace fritz */
diff --git a/liblog++/Log.h b/liblog++/Log.h
new file mode 100644
index 0000000..a74cc94
--- /dev/null
+++ b/liblog++/Log.h
@@ -0,0 +1,62 @@
+/*
+ * liblog++
+ *
+ * Copyright (C) 2007-2013 Joachim Wilke <liblog at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#ifndef LOG_H_
+#define LOG_H_
+
+#include <iostream>
+#include <mutex>
+#include <memory>
+#include <sstream>
+
+#include "CustomLogStream.h"
+
+namespace logger {
+
+class Log {
+private:
+	typedef std::unique_ptr<std::ostream> ostreamPtr;
+
+	static std::mutex  mutex;
+	static std::string prefix;
+	static ostreamPtr  dstream;
+	static ostreamPtr  estream;
+	static ostreamPtr  istream;
+
+	static std::string getLocator(std::string file, int line);
+	static void        putLogMessage(const std::ostream &message, std::ostream &stream, std::string file, int line);
+
+public:
+	static void debug(const std::ostream &message, std::string file, int line);
+	static void error(const std::ostream &message, std::string file, int line);
+	static void info(const std::ostream &message, std::string file, int line);
+
+	static void setLogStreams(ostreamPtr &&elog, ostreamPtr &&ilog, ostreamPtr &&dlog);
+	static void setPrefix(const std::string &prefix) { Log::prefix = prefix + " - "; }
+	static void setCustomLogger(customLogFunction logError, customLogFunction logInfo, customLogFunction logDebug);
+};
+
+#define DBG(x) {logger::Log::debug(std::stringstream().flush() << x, std::string(__FILE__), __LINE__);}
+#define INF(x) {logger::Log::info (std::stringstream().flush() << x, std::string(__FILE__), __LINE__);}
+#define ERR(x) {logger::Log::error(std::stringstream().flush() << x, std::string(__FILE__), __LINE__);}
+
+}
+#endif /* LOG_H_ */
diff --git a/liblog++/Makefile b/liblog++/Makefile
new file mode 100644
index 0000000..d23b101
--- /dev/null
+++ b/liblog++/Makefile
@@ -0,0 +1,25 @@
+AFILE = $(notdir $(subst /.a,.a,$(addsuffix .a,$(CURDIR))))
+OBJS  = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+.PHONY: all clean
+
+all: $(AFILE) 
+
+%.o: %.cpp
+	$(CXX) $(CXXFLAGS) -o $@ -c $<
+	
+$(AFILE): $(OBJS)
+	@ar ru $(AFILE) $(OBJS)
+	
+clean:
+	@-rm -f $(AFILE) $(OBJS) $(DEPFILE)
+
+###
+# Dependencies:
+
+MAKEDEP = $(CXX) -MM -MG
+DEPFILE = .dependencies
+$(DEPFILE): Makefile
+	@$(MAKEDEP) $(DEFINES) $(CXXFLAGS) $(OBJS:%.o=%.cpp) > $@
+
+-include $(DEPFILE)
\ No newline at end of file
diff --git a/libnet++/HttpClient.cpp b/libnet++/HttpClient.cpp
new file mode 100644
index 0000000..3b2c52f
--- /dev/null
+++ b/libnet++/HttpClient.cpp
@@ -0,0 +1,187 @@
+/*
+ * libnet++
+ *
+ * Copyright (C) 2007-2013 Joachim Wilke <libnet at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include "HttpClient.h"
+
+#include <boost/asio.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <liblog++/Log.h>
+#include <libconv++/CharsetConverter.h>
+
+namespace network {
+
+HttpClient::HttpClient(const std::string &host, int port)
+: TcpClient{host, port} {
+}
+
+HttpClient::~HttpClient() {
+}
+
+HttpClient::response_t HttpClient::parseResponse() {
+	header_t header;
+	body_t body;
+
+    std::string http_version;
+    *stream >> http_version;
+    unsigned int status_code;
+    *stream >> status_code;
+    std::string status_message;
+    std::getline(*stream, status_message);
+    if (!(*stream) || http_version.substr(0, 5) != "HTTP/")
+      throw std::runtime_error("Invalid response");
+    DBG("HTTP status code " << status_code);
+
+    // Process the response headers, which are terminated by a blank line
+    std::string headerline;
+    while (std::getline(*stream, headerline) && headerline != "\r") {
+    	size_t separator = headerline.find(':');
+    	if (separator == std::string::npos)
+    		throw std::runtime_error("Invalid header format detected in HTTP response.");
+    	std::string key = headerline.substr(0, separator);
+    	std::string value = headerline.substr(separator+2);
+    	header.insert(std::pair<std::string, std::string>(key, value));
+    	DBG("Found header: " << key << ": " << value);
+    }
+
+    // The remaining data is the body
+    std::stringstream bodystream;
+    bodystream << stream->rdbuf();
+    body = bodystream.str();
+	DBG("Body size " << body.length() << " Bytes.");
+
+	// check encoding and convert
+	const std::string charsetToken = "charset=";
+	const std::string& contentType = header["Content-Type"];
+	if (contentType.length()) {
+		size_t start = contentType.find(charsetToken);
+		if (start != std::string::npos) {
+			start += charsetToken.length();
+			size_t stop = contentType.find('\r', start);
+			if (stop == std::string::npos)
+				stop = contentType.find('\n', start);
+			std::string charset = std::string(contentType, start, stop-start);
+			DBG("Converting response from charset " << charset << " to local encoding.");
+			body = convert::CharsetConverter::ConvertToLocalEncoding(body, charset);
+		}
+	}
+
+	return response_t(header, body);
+}
+
+std::string HttpClient::sendRequest(const std::string &request, const std::ostream &postdata, const header_t &header) {
+	if (!connected)
+		connectStream();
+	std::stringstream post;
+	post << postdata.rdbuf();
+	int postContentLength = post.str().length();
+	std::string method = postContentLength ? "POST" : "GET";
+
+	DBG("Requesting HTTP " << method << " on " << request);
+	*stream << method << " " << request << " HTTP/1.0\r\n";
+	for (auto entry : defaultHeader) {
+		*stream << entry.first << ": " << entry.second << "\r\n";
+	}
+	for (auto entry : header) {
+		*stream << entry.first << ": " << entry.second << "\r\n";
+	}
+	if (postContentLength)
+		*stream << "Content-Length: " << postContentLength << "\r\n"
+		       << "\r\n" << post.str() << "\r\n" << std::flush;
+	else
+		*stream << "\r\n" << std::flush;
+
+	response_t response = parseResponse();
+	disconnectStream();
+
+	// check for redirection
+	header_t responseHeader = response.first;
+	if (responseHeader["Location"].length() > 0) {
+		DBG("Redirect requested to " << responseHeader["Location"]);
+		return getURL(responseHeader["Location"]);
+	}
+	return response.second;
+}
+
+std::string HttpClient::get(const std::string& url, const param_t &params, const header_t &header) {
+	std::stringstream ss;
+	if (url.find('?') == std::string::npos)
+		ss << url << "?";
+	else
+		ss << url << "&";
+	for (auto parameter: params)
+		ss << parameter.first << "=" << parameter.second << "&";
+	return sendRequest(ss.str(), std::ostringstream(), header);
+}
+
+std::string HttpClient::post(const std::string &request, const param_t &postdata, const header_t &header) {
+	header_t fullheader = {
+			{ "Content-Type", "application/x-www-form-urlencoded" }
+	};
+	fullheader.insert(begin(header), end(header));
+
+	std::stringstream ss;
+	for (auto parameter : postdata)
+			ss << parameter.first << "=" << parameter.second << "&";
+
+	return sendRequest(request, ss, fullheader);
+}
+
+std::string HttpClient::getURL(const std::string &url, const header_t &header) {
+	//TODO support other port
+	//TODO support HTTPS
+
+	size_t protoMarker = url.find("://");
+	size_t hostMarker  = url.find("/", protoMarker+4);
+	if (protoMarker == std::string::npos || hostMarker == std::string::npos)
+		throw std::runtime_error("Invalid url.");
+
+	std::string proto = url.substr(0, protoMarker);
+	std::string host  = url.substr(protoMarker+3, hostMarker-protoMarker-3);
+	std::string request = url.substr(hostMarker);
+	if (proto.compare("http") != 0)
+		throw std::runtime_error("Invalid protocol in url.");
+
+	HttpClient client(host);
+	return client.get(request, param_t(), header);
+}
+
+std::string HttpClient::postMIME(const std::string &request, const param_t &postdata, const header_t &header) {
+
+	const std::string boundary = "----FormBoundaryZMsGfL5JxTz5LuAW";
+	header_t fullheader = {
+			{ "Content-Type", "multipart/form-data; boundary=" + boundary }
+	};
+	fullheader.insert(begin(header), end(header));
+
+	std::stringstream ss;
+	for (auto parameter : postdata) {
+		ss << "--" << boundary << "\r\n"
+		   << "Content-Disposition: form-data; name=\""+parameter.first+"\"\r\n"
+		   << "\r\n"
+		   << parameter.second
+		   << "\r\n";
+	}
+	ss << "--" << boundary << "--\r\n";
+	return sendRequest(request, ss, fullheader);
+}
+
+}
diff --git a/libnet++/HttpClient.h b/libnet++/HttpClient.h
new file mode 100644
index 0000000..a745e78
--- /dev/null
+++ b/libnet++/HttpClient.h
@@ -0,0 +1,58 @@
+/*
+ * libnet++
+ *
+ * Copyright (C) 2007-2013 Joachim Wilke <libnet at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#ifndef HTTPCLIENT_H
+#define HTTPCLIENT_H
+
+#include <string>
+
+#include "TcpClient.h"
+
+namespace network {
+
+class HttpClient : public TcpClient {
+public:
+	typedef std::vector<std::pair<std::string, std::string>> param_t;
+	typedef std::map<std::string, std::string> header_t;
+	typedef std::string body_t;
+	typedef std::pair<header_t, body_t> response_t;
+private:
+	const header_t defaultHeader =
+	  {
+	    {"User-Agent", "Lynx/2.8.6" },
+	    {"Connection", "Close" },
+	    {"Host", host },
+	  };
+protected:
+	std::string sendRequest(const std::string &request, const std::ostream &postdata = std::ostringstream(), const header_t &header = header_t());
+	response_t parseResponse();
+public:
+	HttpClient(const std::string &host, int port = 80);
+	virtual ~HttpClient();
+	static std::string getURL(const std::string &url, const header_t &header = header_t());
+	std::string get     (const std::string &request, const param_t &params = param_t(), const header_t &header = header_t());
+	std::string post    (const std::string &request, const param_t &postdata,           const header_t &header = header_t());
+	std::string postMIME(const std::string &request, const param_t &postdata,           const header_t &header = header_t());
+};
+
+}
+
+#endif /* HTTPCLIENT_H_ */
diff --git a/libnet++/Makefile b/libnet++/Makefile
new file mode 100644
index 0000000..d23b101
--- /dev/null
+++ b/libnet++/Makefile
@@ -0,0 +1,25 @@
+AFILE = $(notdir $(subst /.a,.a,$(addsuffix .a,$(CURDIR))))
+OBJS  = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+.PHONY: all clean
+
+all: $(AFILE) 
+
+%.o: %.cpp
+	$(CXX) $(CXXFLAGS) -o $@ -c $<
+	
+$(AFILE): $(OBJS)
+	@ar ru $(AFILE) $(OBJS)
+	
+clean:
+	@-rm -f $(AFILE) $(OBJS) $(DEPFILE)
+
+###
+# Dependencies:
+
+MAKEDEP = $(CXX) -MM -MG
+DEPFILE = .dependencies
+$(DEPFILE): Makefile
+	@$(MAKEDEP) $(DEFINES) $(CXXFLAGS) $(OBJS:%.o=%.cpp) > $@
+
+-include $(DEPFILE)
\ No newline at end of file
diff --git a/libfritz++/SoapClient.cpp b/libnet++/SoapClient.cpp
similarity index 59%
rename from libfritz++/SoapClient.cpp
rename to libnet++/SoapClient.cpp
index 5cf5e0d..0a17658 100644
--- a/libfritz++/SoapClient.cpp
+++ b/libnet++/SoapClient.cpp
@@ -1,7 +1,7 @@
 /*
- * libfritz++
+ * libnet++
  *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
+ * Copyright (C) 2007-2013 Joachim Wilke <libnet at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -21,21 +21,21 @@
 
 #include "SoapClient.h"
 
-namespace fritz {
+namespace network {
 
-SoapClient::SoapClient(std::string &host, int port):
-	HttpClient(host, port, new ost2::SOAPStream()) {
-	soapStream = static_cast<ost2::SOAPStream *>(stream);
+SoapClient::SoapClient(const std::string &host, int port)
+: HttpClient{host, port} {
 }
 
 SoapClient::~SoapClient() {
 }
 
-std::string SoapClient::Post(const std::ostream &url, const std::ostream &action, const std::ostream &postdata) {
-	const std::stringstream &_action = static_cast<const std::stringstream&>(action);
-	soapStream->setAction(_action.str().c_str());
-
-	return HttpClient::Post(url, postdata);
+std::string SoapClient::post(const std::string &request, const std::string &action, const std::string &body) {
+	header_t header = {
+			{ "Content-Type", "text/xml; charset=utf-8" },
+			{ "SOAPAction", action },
+	};
+	return sendRequest(request, std::stringstream().flush() << body, header);
 }
 
 }
diff --git a/libfritz++/SoapClient.h b/libnet++/SoapClient.h
similarity index 71%
rename from libfritz++/SoapClient.h
rename to libnet++/SoapClient.h
index 92c5262..213e2e7 100644
--- a/libfritz++/SoapClient.h
+++ b/libnet++/SoapClient.h
@@ -1,7 +1,7 @@
 /*
- * libfritz++
+ * libnet++
  *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
+ * Copyright (C) 2007-2013 Joachim Wilke <libnet at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -22,19 +22,17 @@
 #ifndef SOAPCLIENT_H
 #define SOAPCLIENT_H
 
-#include "cc++/soap.h"
 #include "HttpClient.h"
 
-namespace fritz {
+namespace network {
 
-class SoapClient : protected HttpClient {
+class SoapClient : public HttpClient {
 private:
-	ost2::SOAPStream *soapStream;
 	std::string soapAction;
 public:
-	explicit SoapClient(std::string &host, int port = 80);
+	explicit SoapClient(const std::string &host, int port = 80);
 	virtual ~SoapClient();
-	std::string Post(const std::ostream &url, const std::ostream &action, const std::ostream &postdata);
+	std::string post(const std::string &request, const std::string &action, const std::string &body);
 
 };
 
diff --git a/libnet++/TcpClient.cpp b/libnet++/TcpClient.cpp
new file mode 100644
index 0000000..b9b38e9
--- /dev/null
+++ b/libnet++/TcpClient.cpp
@@ -0,0 +1,76 @@
+/*
+ * libnet++
+ *
+ * Copyright (C) 2007-2013 Joachim Wilke <libnet at joachim-wilke.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include "TcpClient.h"
+
+#include <liblog++/Log.h>
+
+namespace network {
+
+void TcpClient::connectStream() {
+	DBG("Connecting to " << host << ":" << port);
+	std::string sPort = static_cast<std::stringstream&>(std::stringstream().flush() << port).str();
+	stream = new boost::asio::ip::tcp::iostream(host, sPort);
+	if (!(*stream))
+		throw std::runtime_error(stream->error().message());
+	connected = true;
+}
+
+TcpClient::TcpClient(const std::string &host, int port)
+: host{host}, port{port}, connected{false}, stream{nullptr} {
+}
+
+
+TcpClient::~TcpClient() {
+	disconnectStream();
+}
+
+std::string TcpClient::readLine(bool removeNewline) {
+	if (!connected)
+		connectStream();
+	std::string line;
+	std::getline(*stream, line);
+	if (line.length() > 0 && removeNewline)
+		line.erase(line.end()-1, line.end());
+	return line;
+}
+
+void TcpClient::expireStreamNow() {
+	if (stream)
+		stream->expires_from_now(boost::posix_time::seconds(0));
+}
+
+void TcpClient::disconnectStream() {
+	if (stream && connected) {
+		DBG("Disconnecting from " << host << ":" << port);
+		stream->close();
+		delete stream;
+	}
+	connected = false;
+}
+
+void TcpClient::write(const std::string &data) {
+	if (!connected)
+		connectStream();
+	*stream << data;
+}
+
+}
diff --git a/libfritz++/TcpClient.h b/libnet++/TcpClient.h
similarity index 69%
rename from libfritz++/TcpClient.h
rename to libnet++/TcpClient.h
index cac38dc..c1e783c 100644
--- a/libfritz++/TcpClient.h
+++ b/libnet++/TcpClient.h
@@ -1,7 +1,7 @@
 /*
- * libfritz++
+ * libnet++
  *
- * Copyright (C) 2007-2012 Joachim Wilke <libfritz at joachim-wilke.de>
+ * Copyright (C) 2007-2013 Joachim Wilke <libnet at joachim-wilke.de>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -22,19 +22,24 @@
 #ifndef TCPCLIENT_H
 #define TCPCLIENT_H
 
-#include <cc++/socket.h>
+#include <boost/asio.hpp>
 
-namespace fritz {
+namespace network {
 
 class TcpClient {
 protected:
-	TcpClient(std::string &host, int port, ost::TCPStream *stream);
 	std::string host;
 	int port;
-	ost::TCPStream *stream;
+	bool connected;
+	boost::asio::ip::tcp::iostream *stream;
+	void connectStream();
 public:
-	TcpClient(std::string &host, int port);
+	void disconnectStream();
+	TcpClient(const std::string &host, int port);
 	virtual ~TcpClient();
+	std::string readLine(bool removeNewline = true);
+	void expireStreamNow();
+	void write(const std::string &data);
 };
 
 }
diff --git a/menu.c b/menu.cpp
similarity index 84%
rename from menu.c
rename to menu.cpp
index 0290822..eba8a87 100644
--- a/menu.c
+++ b/menu.cpp
@@ -23,8 +23,9 @@
 #include <vector>
 #include <vdr/menu.h>
 #include <vdr/status.h>
-#include "FonbookManager.h"
-#include "FritzClient.h"
+#include "liblog++/Log.h"
+#include "libfritz++/FonbookManager.h"
+#include "libfritz++/FritzClient.h"
 #include "menu.h"
 #include "setup.h"
 
@@ -50,7 +51,7 @@ cMenuFritzbox::~cMenuFritzbox()
 
 eOSState cMenuFritzbox::ProcessKey (eKeys Key) {
 	fritz::Fonbook  *fonbook  = fritz::FonbookManager::GetFonbook();
-	fritz::CallList *callList = fritz::CallList::getCallList();
+	fritz::CallList *callList = fritz::CallList::GetCallList();
 
 	eOSState state = cOsdMenu::ProcessKey(Key);
 	fritz::CallEntry *ce = NULL;
@@ -61,23 +62,23 @@ eOSState cMenuFritzbox::ProcessKey (eKeys Key) {
 			switch (currentMode) {
 			case FONBUCH:
 				if (currentKeyItem && fonbook->isDisplayable() && fonbook->isInitialized())
-					state = AddSubMenu(new cMenuFonbuchDetail(fonbook->RetrieveFonbookEntry(currentKeyItem->key)));
+					state = AddSubMenu(new cMenuFonbuchDetail(fonbook->retrieveFonbookEntry(currentKeyItem->key)));
 				break;
 			case IN:
 				if (currentKeyItem)
-					ce = callList->RetrieveEntry(fritz::CallEntry::INCOMING, currentKeyItem->key);
+					ce = callList->retrieveEntry(fritz::CallEntry::INCOMING, currentKeyItem->key);
 				if (ce)
 					state = AddSubMenu(new cMenuCallDetail(ce, currentMode, fonbook));
 				break;
 			case OUT:
 				if (currentKeyItem)
-					ce = callList->RetrieveEntry(fritz::CallEntry::OUTGOING, currentKeyItem->key);
+					ce = callList->retrieveEntry(fritz::CallEntry::OUTGOING, currentKeyItem->key);
 				if (ce)
 					state = AddSubMenu(new cMenuCallDetail(ce, currentMode, fonbook));
 				break;
 			case MISSED:
 				if (currentKeyItem)
-					ce = callList->RetrieveEntry(fritz::CallEntry::MISSED, currentKeyItem->key);
+					ce = callList->retrieveEntry(fritz::CallEntry::MISSED, currentKeyItem->key);
 				if (ce)
 					state = AddSubMenu(new cMenuCallDetail(ce, currentMode, fonbook));
 				break;
@@ -85,7 +86,7 @@ eOSState cMenuFritzbox::ProcessKey (eKeys Key) {
 			break;
 		case kRed:
 			if (currentMode == FONBUCH) {
-				fritz::FonbookManager::GetFonbookManager()->NextFonbook();
+				fritz::FonbookManager::GetFonbookManager()->nextFonbook();
 			}
 			DisplayFonbuch();
 			state = osContinue;
@@ -107,7 +108,7 @@ void cMenuFritzbox::DisplayFonbuch() {
 	unsigned int nameWidth = 0;
 	fritz::Fonbook  *fonbook  = fritz::FonbookManager::GetFonbook();
 	currentMode = FONBUCH;
-	SetTitle(tr(fonbook->GetTitle().c_str()));
+	SetTitle(tr(fonbook->getTitle().c_str()));
 	Clear();
 	if (fonbook->isInitialized() == false) {
 		Add(new cOsdItem(tr("This phonebook is not yet available."), osUnknown, false));
@@ -118,22 +119,22 @@ void cMenuFritzbox::DisplayFonbuch() {
 		Add(new cOsdItem(tr("This phonebook is not displayable"), osUnknown, false));
 	}
 	else {
-		for (size_t pos=0; pos < fonbook->GetFonbookSize(); pos++) {
-			const fritz::FonbookEntry *fe = fonbook->RetrieveFonbookEntry(pos);
+		for (size_t pos=0; pos < fonbook->getFonbookSize(); pos++) {
+			const fritz::FonbookEntry *fe = fonbook->retrieveFonbookEntry(pos);
 			if (fe) {
 				bool firstEntry = true;
-				for (size_t numberPos = 0; numberPos < fe->GetSize(); numberPos++) {
-					if (fe->GetNumber(numberPos).empty())
+				for (size_t numberPos = 0; numberPos < fe->getSize(); numberPos++) {
+					if (fe->getNumber(numberPos).empty())
 						continue;
 					// build the menu entries
 					char *line;
-					int ret = asprintf(&line,"%s\t%s\t%s", !firstEntry ? "" : fe->GetName().c_str(), cPluginFritzbox::FonbookEntryTypeToName(fe->GetType(numberPos)).c_str(), fe->GetNumber(numberPos).c_str());
+					int ret = asprintf(&line,"%s\t%s\t%s", !firstEntry ? "" : fe->getName().c_str(), cPluginFritzbox::FonbookEntryTypeToName(fe->getType(numberPos)).c_str(), fe->getNumber(numberPos).c_str());
 					if (ret <= 0) {
 						ERR("Error allocating line buffer for cOsdItem.");
 						continue;
 					}
-					if (fe->GetName().length() > nameWidth)
-						nameWidth = fe->GetName().length();
+					if (fe->getName().length() > nameWidth)
+						nameWidth = fe->getName().length();
 					Add(new cKeyOsdItem(line, osUnknown, true, pos));
 					firstEntry = false;
 				}
@@ -148,7 +149,7 @@ void cMenuFritzbox::DisplayFonbuch() {
 void cMenuFritzbox::DisplayCalls(fritz::CallEntry::eCallType ct) {
 	currentMode = (mode) ct;
 	std::string title=tr("Fritz!Box call list");
-	fritz::CallList *callList = fritz::CallList::getCallList();
+	fritz::CallList *callList = fritz::CallList::GetCallList();
 	Clear();
 	title += " (";
 	switch(ct) {
@@ -157,8 +158,8 @@ void cMenuFritzbox::DisplayCalls(fritz::CallEntry::eCallType ct) {
 		break;
 	case fritz::CallEntry::MISSED:
 		title += tr("missed");
-		if (fritzboxConfig.lastKnownMissedCall != callList->LastMissedCall()) {
-			fritzboxConfig.lastKnownMissedCall = callList->LastMissedCall();
+		if (fritzboxConfig.lastKnownMissedCall != callList->getLastMissedCall()) {
+			fritzboxConfig.lastKnownMissedCall = callList->getLastMissedCall();
 			// save this change as soon as possible, that it is not lost if VDR crashes later on
 			plugin->SetupStore("LastKnownMissedCall", fritzboxConfig.lastKnownMissedCall);
 			Setup.Save();
@@ -175,11 +176,11 @@ void cMenuFritzbox::DisplayCalls(fritz::CallEntry::eCallType ct) {
 	unsigned int destWidth = 0;
 	std::string oldDate;
 	if (callList->isValid()) {
-		for (unsigned int pos=0; pos < callList->GetSize(ct); pos++) {
-			fritz::CallEntry *ce = callList->RetrieveEntry(ct, pos);
+		for (unsigned int pos=0; pos < callList->getSize(ct); pos++) {
+			fritz::CallEntry *ce = callList->retrieveEntry(ct, pos);
 			// build the menu entries
 
-			if ( !ce->MatchesFilter())
+			if ( !ce->matchesFilter())
 				continue;
 
 			// show remote name, remote number or "unknown"
@@ -232,7 +233,7 @@ cMenuCallDetail::cMenuCallDetail(fritz::CallEntry *ce, cMenuFritzbox::mode mode,
 	this->ce = ce;
 
 	if (ce->remoteNumber.size() > 0 && ce->remoteName.compare(ce->remoteNumber) == 0) {
-		fritz::Fonbook::sResolveResult rr = fonbook->ResolveToName(ce->remoteNumber);
+		fritz::Fonbook::sResolveResult rr = fonbook->resolveToName(ce->remoteNumber);
 		ce->remoteName = rr.name;
 		if (cPluginFritzbox::FonbookEntryTypeToName(rr.type).size() > 0) {
 			ce->remoteName += " ";
@@ -282,7 +283,7 @@ eOSState cMenuCallDetail::ProcessKey (eKeys Key) {
 				Skins.Message(mtError, tr("No number to call"));
 			} else {
 				fritz::FritzClient fc;
-				if (fc.InitCall(ce->remoteNumber))
+				if (fc.initCall(ce->remoteNumber))
 					Skins.Message(mtInfo, tr("Pick up your phone now"));
 				else
 					Skins.Message(mtError, tr("Error while initiating call"));
@@ -322,15 +323,15 @@ cMenuFonbuchDetail::cMenuFonbuchDetail(const fritz::FonbookEntry *fe)
 	std::ostringstream sText;
 	// if a number of TYPE_NONE is given, a simple version of the details screen is shown
 	// this type is set, e.g., with old Fritz!Boxes
-	if (fe->GetType(0) == fritz::FonbookEntry::TYPE_NONE) {
-	  sText << tr("Name")          << "\t" << fe->GetName()      				   << "\n"
+	if (fe->getType(0) == fritz::FonbookEntry::TYPE_NONE) {
+	  sText << tr("Name")          << "\t" << fe->getName()      				   << "\n"
 	        << tr("Numbers")       << "\t\n"
-		    << tr("Default")       << "\t" << fe->GetNumber(0) << "\n";
+		    << tr("Default")       << "\t" << fe->getNumber(0) << "\n";
 	} else {
-	  sText << tr("Name")          << "\t" << fe->GetName()      				   << "\n"
+	  sText << tr("Name")          << "\t" << fe->getName()      				   << "\n"
 	        << tr("Numbers")       << "\t\n";
-	  for (size_t pos = 0; pos < fe->GetSize(); pos++)
-		  sText << cPluginFritzbox::FonbookEntryTypeToName(fe->GetType(pos), true) << "\t" << fe->GetNumber(pos) << "\n";
+	  for (size_t pos = 0; pos < fe->getSize(); pos++)
+		  sText << cPluginFritzbox::FonbookEntryTypeToName(fe->getType(pos), true) << "\t" << fe->getNumber(pos) << "\n";
 	}
 	std::string text = sText.str();
 	std::string::size_type pos = 0;
@@ -358,18 +359,18 @@ eOSState cMenuFonbuchDetail::ProcessKey (eKeys Key) {
 		switch (Key) {
 		case kRed:
 			// determine which number to call
-			if (fe->GetType(0) == fritz::FonbookEntry::TYPE_NONE){
-				numberToCall = fe->GetNumber(0);
+			if (fe->getType(0) == fritz::FonbookEntry::TYPE_NONE){
+				numberToCall = fe->getNumber(0);
 			}
 			else {
-				numberToCall = fe->GetNumber(Current() - 2);
+				numberToCall = fe->getNumber(Current() - 2);
 			}
 			// initiate a call
 			if (numberToCall.empty()) {
 				Skins.Message(mtError, tr("No number to call"));
 			} else {
 				fritz::FritzClient fc;
-				if (fc.InitCall(numberToCall))
+				if (fc.initCall(numberToCall))
 					Skins.Message(mtInfo, tr("Pick up your phone now"));
 				else
 					Skins.Message(mtError, tr("Error while initiating call"));
diff --git a/notifyosd.c b/notifyosd.cpp
similarity index 99%
rename from notifyosd.c
rename to notifyosd.cpp
index 08bfda0..d7f6b1e 100644
--- a/notifyosd.c
+++ b/notifyosd.cpp
@@ -21,6 +21,7 @@
 
 #include <vdr/osd.h>
 #include <vdr/status.h>
+#include "liblog++/Log.h"
 #include "notifyosd.h"
 #include "setup.h"
 
diff --git a/po/de_DE.po b/po/de_DE.po
index b843799..1dba06d 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -5,7 +5,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
-"Report-Msgid-Bugs-To: <vdr at joachim-wilke.de>\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2013-12-01 20:07+0100\n"
 "PO-Revision-Date: 2007-08-12 21:40+0200\n"
 "Last-Translator: Matthias Becker <becker.matthias at gmail.com>\n"
 "Language-Team: <vdr at linuxtv.org>\n"
@@ -14,183 +15,199 @@ msgstr ""
 "Content-Type: text/plain; charset=ISO-8859-15\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-msgid "> PB"
-msgstr "> TB"
+msgid "Fritz Plugin for AVM Fritz!Box"
+msgstr "Fritz Plugin f�r die AVM Fritz!Box"
 
-msgid "Business"
-msgstr "Gesch�ftlich"
+msgid "Fritz!Box"
+msgstr "Fritz!Box"
 
-#. TRANSLATORS: these are labels for color keys in the CallDetails menu
-#. TRANSLATORS: this is the label for the button to initiate a call
-msgid "Button$Call"
-msgstr "Anrufen"
+msgid "missed calls"
+msgstr "verpasste Anrufe"
 
-msgid "Call"
-msgstr "Anruf"
+msgid "missed call"
+msgstr "verpasster Anruf"
 
-msgid "Call details"
-msgstr "Anrufdetails"
+msgid "Data not yet available."
+msgstr "Daten noch nicht verf�gbar."
 
-msgid "Call from"
-msgstr "Anruf von"
+msgid "Private"
+msgstr "Privat"
 
-msgid "Callee"
-msgstr "Ziel"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
+msgid "H"
+msgstr "T"
 
-msgid "Caller"
-msgstr "Anrufer"
+msgid "Mobile"
+msgstr "Mobil"
+
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
+msgid "M"
+msgstr "H"
+
+msgid "Business"
+msgstr "Gesch�ftlich"
+
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
+msgid "W"
+msgstr "F"
 
 # c-format
 #, c-format
 msgid "Calling %s [%s]"
 msgstr "Rufe %s an [%s]"
 
-msgid "Country code"
-msgstr "Internationale Vorwahl"
-
-msgid "Data not yet available."
-msgstr "Daten noch nicht verf�gbar."
-
-msgid "Date"
-msgstr "Datum"
-
-msgid "Decrease volume by [1..100%]"
-msgstr "Lautst�rke nur absenken [1..100%]"
+msgid "Call"
+msgstr "Anruf"
 
-msgid "Default"
-msgstr "Standard"
+msgid "Call from"
+msgstr "Anruf von"
 
-msgid "Default menu"
-msgstr "Standardansicht"
+msgid "POTS"
+msgstr "analog"
 
-msgid "Detailed call lists"
-msgstr "Ausf�hrliche Gespr�chslisten"
+msgid "ISDN"
+msgstr "ISDN"
 
-msgid "Duration"
-msgstr "Dauer"
+msgid "VoIP"
+msgstr "VoIP"
 
-msgid "Error while initiating call"
-msgstr "Fehler beim Verbindungsaufbau"
+msgid "This phonebook is not yet available."
+msgstr "Telefonbuch noch nicht verf�gbar."
 
-msgid "Extension"
-msgstr "MSN"
+msgid "You may need to wait some minutes,"
+msgstr "Der Abruf ben�tigt entweder noch Zeit"
 
-msgid "Fritz Plugin for AVM Fritz!Box"
-msgstr "Fritz Plugin f�r die AVM Fritz!Box"
+msgid "otherwise there may be a network problem."
+msgstr "oder es besteht ein Netzwerkproblem."
 
-msgid "Fritz!Box"
-msgstr "Fritz!Box"
+msgid "This phonebook is not displayable"
+msgstr "Keine anzeigbaren Eintr�ge"
 
-msgid "Fritz!Box URL"
-msgstr "Fritz!Box URL"
+msgid "> PB"
+msgstr "> TB"
 
 msgid "Fritz!Box call list"
 msgstr "Fritz!Box Gespr�chsliste"
 
-msgid "Fritz!Box phone book"
-msgstr "Fritz!Box Telefonbuch"
+msgid "incoming"
+msgstr "eingehend"
 
-msgid "Group call lists by date"
-msgstr "Anruflisten nach Datum gruppieren"
+msgid "missed"
+msgstr "verpasst"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
-msgid "H"
-msgstr "T"
+msgid "outgoing"
+msgstr "ausgehend"
 
-msgid "Hide main menu entry"
-msgstr "Hauptmen�eintrag verstecken"
+msgid "unknown"
+msgstr "unbekannt"
 
-msgid "ISDN"
-msgstr "ISDN"
+msgid "The call list is not yet available."
+msgstr "Gespr�chsliste noch nicht verf�gbar."
 
-msgid "Incoming call"
-msgstr "Eingehender Anruf"
+#. TRANSLATORS: this is the short form of "phone book"
+msgid "PB"
+msgstr "TB"
 
-msgid "Less"
-msgstr "Weniger"
+msgid "Call details"
+msgstr "Anrufdetails"
 
-msgid "Local phone book"
-msgstr "Lokales Telefonbuch"
+msgid "Date"
+msgstr "Datum"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
-msgid "M"
-msgstr "H"
+msgid "Time"
+msgstr "Uhrzeit"
 
-msgid "Mobile"
-msgstr "Mobil"
+msgid "Duration"
+msgstr "Dauer"
 
-msgid "More"
-msgstr "Mehr"
+msgid "call was not accepted"
+msgstr "Anruf nicht angenommen"
 
-msgid "Mute on call"
-msgstr "Bei Anruf stummschalten"
+msgid "Extension"
+msgstr "MSN"
 
-msgid "Mute only after connect"
-msgstr "Nur bei Verbindung stummschalten"
+msgid "Callee"
+msgstr "Ziel"
 
-msgid "Name"
-msgstr "Name"
+msgid "Caller"
+msgstr "Anrufer"
+
+#. TRANSLATORS: these are labels for color keys in the CallDetails menu
+#. TRANSLATORS: this is the label for the button to initiate a call
+msgid "Button$Call"
+msgstr "Anrufen"
 
 msgid "No number to call"
 msgstr "Ohne Nummer kein Anruf m�glich"
 
-msgid "Number of monitored extensions"
-msgstr "Zahl der �berwachten MSNs"
+msgid "Pick up your phone now"
+msgstr "Telefon jetzt abnehmen"
+
+msgid "Error while initiating call"
+msgstr "Fehler beim Verbindungsaufbau"
+
+msgid "Phone book details"
+msgstr "Telefonbuchdetails"
+
+msgid "Name"
+msgstr "Name"
 
 msgid "Numbers"
 msgstr "Rufnummern"
 
+msgid "Default"
+msgstr "Standard"
+
 msgid "Outgoing call"
 msgstr "Ausgehender Anruf"
 
-#. TRANSLATORS: this is the short form of "phone book"
-msgid "PB"
-msgstr "TB"
-
-msgid "POTS"
-msgstr "analog"
+msgid "Incoming call"
+msgstr "Eingehender Anruf"
 
-msgid "Password"
-msgstr "Passwort"
+msgid "any"
+msgstr "alle"
 
-msgid "Pause live tv"
-msgstr "Auch Live TV anhalten"
+msgid "only incoming"
+msgstr "nur eingehend"
 
-msgid "Pause on call"
-msgstr "Bei Anruf Wiedergabe pausieren"
+msgid "only outgoing"
+msgstr "nur ausgehend"
 
-msgid "Phone book details"
-msgstr "Telefonbuchdetails"
+msgid "Fritz!Box URL"
+msgstr "Fritz!Box URL"
 
-msgid "Pick up your phone now"
-msgstr "Telefon jetzt abnehmen"
+msgid "Username"
+msgstr "Benutzername"
 
-msgid "Private"
-msgstr "Privat"
+msgid "Password"
+msgstr "Passwort"
 
-msgid "React on calls"
-msgstr "Auf Anruf reagieren"
+msgid "Country code"
+msgstr "Internationale Vorwahl"
 
 msgid "Region code"
 msgstr "Ortsvorwahl"
 
-msgid "Reload"
-msgstr "Neu laden"
+msgid "React on calls"
+msgstr "Auf Anruf reagieren"
 
-msgid "Restrict monitor to certain extensions"
-msgstr "�berwachte MSNs einschr�nken"
+msgid "Mute on call"
+msgstr "Bei Anruf stummschalten"
 
-msgid "Resume after call"
-msgstr "Nach Anruf Wiedergabe fortsetzen"
+msgid "Mute only after connect"
+msgstr "Nur bei Verbindung stummschalten"
 
-msgid "Retrieving phone book"
-msgstr "Rufe Telefonbuch ab"
+msgid "Decrease volume by [1..100%]"
+msgstr "Lautst�rke nur absenken [1..100%]"
 
-msgid "Setup phonebooks to use"
-msgstr "Telefonb�cher ausw�hlen"
+msgid "Pause on call"
+msgstr "Bei Anruf Wiedergabe pausieren"
 
-msgid "Setup phonebooks to use..."
-msgstr "Telefonb�cher ausw�hlen..."
+msgid "Pause live tv"
+msgstr "Auch Live TV anhalten"
+
+msgid "Resume after call"
+msgstr "Nach Anruf Wiedergabe fortsetzen"
 
 msgid "Show calls"
 msgstr "Anrufe anzeigen"
@@ -198,69 +215,47 @@ msgstr "Anrufe anzeigen"
 msgid "Show detailed call information"
 msgstr "Ausf�hrliche Anrufinformation"
 
-msgid "The call list is not yet available."
-msgstr "Gespr�chsliste noch nicht verf�gbar."
-
-msgid "This phonebook is not displayable"
-msgstr "Keine anzeigbaren Eintr�ge"
-
-msgid "This phonebook is not yet available."
-msgstr "Telefonbuch noch nicht verf�gbar."
-
-msgid "Time"
-msgstr "Uhrzeit"
-
-msgid "VoIP"
-msgstr "VoIP"
-
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
-msgid "W"
-msgstr "F"
-
-msgid "You may need to wait some minutes,"
-msgstr "Der Abruf ben�tigt entweder noch Zeit"
-
-msgid "any"
-msgstr "alle"
+msgid "Detailed call lists"
+msgstr "Ausf�hrliche Gespr�chslisten"
 
-msgid "call was not accepted"
-msgstr "Anruf nicht angenommen"
+msgid "Group call lists by date"
+msgstr "Anruflisten nach Datum gruppieren"
 
-msgid "das-oertliche.de"
-msgstr ""
+msgid "Hide main menu entry"
+msgstr "Hauptmen�eintrag verstecken"
 
-msgid "incoming"
-msgstr "eingehend"
+msgid "Default menu"
+msgstr "Standardansicht"
 
-msgid "missed"
-msgstr "verpasst"
+msgid "Setup phonebooks to use..."
+msgstr "Telefonb�cher ausw�hlen..."
 
-msgid "missed call"
-msgstr "verpasster Anruf"
+msgid "Restrict monitor to certain extensions"
+msgstr "�berwachte MSNs einschr�nken"
 
-msgid "missed calls"
-msgstr "verpasste Anrufe"
+msgid "Number of monitored extensions"
+msgstr "Zahl der �berwachten MSNs"
 
-msgid "nummerzoeker.com"
-msgstr ""
+msgid "Reload"
+msgstr "Neu laden"
 
-msgid "only incoming"
-msgstr "nur eingehend"
+msgid "Retrieving phone book"
+msgstr "Rufe Telefonbuch ab"
 
-msgid "only outgoing"
-msgstr "nur ausgehend"
+msgid "Setup phonebooks to use"
+msgstr "Telefonb�cher ausw�hlen"
 
-msgid "otherwise there may be a network problem."
-msgstr "oder es besteht ein Netzwerkproblem."
+msgid "More"
+msgstr "Mehr"
 
-msgid "outgoing"
-msgstr "ausgehend"
+msgid "Less"
+msgstr "Weniger"
 
-msgid "tel.local.ch"
-msgstr ""
+#~ msgid "Fritz!Box phone book"
+#~ msgstr "Fritz!Box Telefonbuch"
 
-msgid "unknown"
-msgstr "unbekannt"
+#~ msgid "Local phone book"
+#~ msgstr "Lokales Telefonbuch"
 
 #~ msgid " "
 #~ msgstr " "
diff --git a/po/fr_FR.po b/po/fr_FR.po
index a2d3d74..f64da5f 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -5,7 +5,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
-"Report-Msgid-Bugs-To: <vdr at joachim-wilke.de>\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2013-12-01 20:07+0100\n"
 "PO-Revision-Date: 2007-08-12 21:40+0200\n"
 "Last-Translator: Patrice Staudt\n"
 "Language-Team: <vdr at linuxtv.org>\n"
@@ -14,193 +15,215 @@ msgstr ""
 "Content-Type: text/plain; charset=ISO-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#, fuzzy
-msgid "> PB"
-msgstr "CdA"
-
-msgid "Business"
+msgid "Fritz Plugin for AVM Fritz!Box"
 msgstr ""
 
-#. TRANSLATORS: these are labels for color keys in the CallDetails menu
-#. TRANSLATORS: this is the label for the button to initiate a call
 #, fuzzy
-msgid "Button$Call"
-msgstr "Muet lors d'un appel"
+msgid "Fritz!Box"
+msgstr "Url de la Fritz!Box"
 
 #, fuzzy
-msgid "Call"
-msgstr "Appelle de"
+msgid "missed calls"
+msgstr "manqu�"
 
-msgid "Call details"
-msgstr "D�tails des appels"
+#, fuzzy
+msgid "missed call"
+msgstr "manqu�"
 
-msgid "Call from"
-msgstr "Appelle de"
+#, fuzzy
+msgid "Data not yet available."
+msgstr "Carnet d'adresse n'est pas encore disponible"
 
-msgid "Callee"
+msgid "Private"
 msgstr ""
 
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
+msgid "H"
+msgstr "H"
+
 #, fuzzy
-msgid "Caller"
-msgstr "Appelle de"
+msgid "Mobile"
+msgstr "Plus"
 
-#, fuzzy, c-format
-msgid "Calling %s [%s]"
-msgstr "Appelle de"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
+msgid "M"
+msgstr "M"
 
-msgid "Country code"
+msgid "Business"
 msgstr ""
 
-#, fuzzy
-msgid "Data not yet available."
-msgstr "Carnet d'adresse n'est pas encore disponible"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
+msgid "W"
+msgstr "W"
 
-msgid "Date"
-msgstr "Date"
+#, fuzzy, c-format
+msgid "Calling %s [%s]"
+msgstr "Appelle de"
 
-msgid "Decrease volume by [1..100%]"
-msgstr ""
+#, fuzzy
+msgid "Call"
+msgstr "Appelle de"
 
-msgid "Default"
-msgstr ""
+msgid "Call from"
+msgstr "Appelle de"
 
-msgid "Default menu"
-msgstr ""
+msgid "POTS"
+msgstr "analogue"
 
-msgid "Detailed call lists"
-msgstr "Listes d�taill�es d'appel"
+msgid "ISDN"
+msgstr "Num�ris"
 
-msgid "Duration"
-msgstr "Dur�e"
+msgid "VoIP"
+msgstr "Voix sur IP"
 
-msgid "Error while initiating call"
-msgstr "Erreur au lancement de l'appel"
+#, fuzzy
+msgid "This phonebook is not yet available."
+msgstr "Carnet d'adresse n'est pas encore disponible"
 
-msgid "Extension"
-msgstr "Extension MSN"
+msgid "You may need to wait some minutes,"
+msgstr "Vous devrez peut-�tre attendre quelques minutes,"
 
-msgid "Fritz Plugin for AVM Fritz!Box"
-msgstr ""
+msgid "otherwise there may be a network problem."
+msgstr "Sinon il peut y avoir un probl�me de r�seau"
 
 #, fuzzy
-msgid "Fritz!Box"
-msgstr "Url de la Fritz!Box"
+msgid "This phonebook is not displayable"
+msgstr "Carnet d'adresse n'est pas encore disponible"
 
-msgid "Fritz!Box URL"
-msgstr "Url de la Fritz!Box"
+#, fuzzy
+msgid "> PB"
+msgstr "CdA"
 
 msgid "Fritz!Box call list"
 msgstr "Liste d'appelle de la Fritz!Box"
 
-msgid "Fritz!Box phone book"
-msgstr "Carnet d'adresse de la Fritz!Box"
-
-msgid "Group call lists by date"
-msgstr "Groupe appels par jour"
+msgid "incoming"
+msgstr "entrant"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
-msgid "H"
-msgstr "H"
+msgid "missed"
+msgstr "manqu�"
 
-msgid "Hide main menu entry"
-msgstr "Cach� dans le menu principale"
+msgid "outgoing"
+msgstr "sortant"
 
-msgid "ISDN"
-msgstr "Num�ris"
+msgid "unknown"
+msgstr "inconnu"
 
 #, fuzzy
-msgid "Incoming call"
-msgstr "Afficher les appels entrants"
+msgid "The call list is not yet available."
+msgstr "Carnet d'adresse n'est pas encore disponible"
 
-msgid "Less"
-msgstr "Moins"
+#. TRANSLATORS: this is the short form of "phone book"
+msgid "PB"
+msgstr "CdA"
 
-#, fuzzy
-msgid "Local phone book"
-msgstr "Carnet d'adresse de la Fritz!Box"
+msgid "Call details"
+msgstr "D�tails des appels"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
-msgid "M"
-msgstr "M"
+msgid "Date"
+msgstr "Date"
 
-#, fuzzy
-msgid "Mobile"
-msgstr "Plus"
+msgid "Time"
+msgstr "Temps"
 
-msgid "More"
-msgstr "Plus"
+msgid "Duration"
+msgstr "Dur�e"
 
-msgid "Mute on call"
-msgstr "Muet lors d'un appel"
+msgid "call was not accepted"
+msgstr "Appel n'a pas �t� accept�"
 
-msgid "Mute only after connect"
-msgstr ""
+msgid "Extension"
+msgstr "Extension MSN"
 
-msgid "Name"
+msgid "Callee"
 msgstr ""
 
+#, fuzzy
+msgid "Caller"
+msgstr "Appelle de"
+
+#. TRANSLATORS: these are labels for color keys in the CallDetails menu
+#. TRANSLATORS: this is the label for the button to initiate a call
+#, fuzzy
+msgid "Button$Call"
+msgstr "Muet lors d'un appel"
+
 msgid "No number to call"
 msgstr "Aucun num�ro � appeler"
 
-msgid "Number of monitored extensions"
-msgstr "Nombre d'extensions MSNs a surveillier"
+msgid "Pick up your phone now"
+msgstr "D�crocher votre t�l�phone maintenant"
+
+msgid "Error while initiating call"
+msgstr "Erreur au lancement de l'appel"
+
+msgid "Phone book details"
+msgstr ""
+
+msgid "Name"
+msgstr ""
 
 msgid "Numbers"
 msgstr ""
 
+msgid "Default"
+msgstr ""
+
 #, fuzzy
 msgid "Outgoing call"
 msgstr "Muet lors d'un appel"
 
-#. TRANSLATORS: this is the short form of "phone book"
-msgid "PB"
-msgstr "CdA"
+#, fuzzy
+msgid "Incoming call"
+msgstr "Afficher les appels entrants"
 
-msgid "POTS"
-msgstr "analogue"
+msgid "any"
+msgstr ""
 
-msgid "Password"
-msgstr "Mot de passe"
+#, fuzzy
+msgid "only incoming"
+msgstr "entrant"
 
-msgid "Pause live tv"
-msgstr ""
+#, fuzzy
+msgid "only outgoing"
+msgstr "sortant"
 
-msgid "Pause on call"
-msgstr "Pause pour appel"
+msgid "Fritz!Box URL"
+msgstr "Url de la Fritz!Box"
 
-msgid "Phone book details"
+msgid "Username"
 msgstr ""
 
-msgid "Pick up your phone now"
-msgstr "D�crocher votre t�l�phone maintenant"
+msgid "Password"
+msgstr "Mot de passe"
 
-msgid "Private"
+msgid "Country code"
+msgstr ""
+
+msgid "Region code"
 msgstr ""
 
 #, fuzzy
 msgid "React on calls"
 msgstr "Muet lors d'un appel"
 
-msgid "Region code"
-msgstr ""
-
-msgid "Reload"
-msgstr "Recharger"
+msgid "Mute on call"
+msgstr "Muet lors d'un appel"
 
-msgid "Restrict monitor to certain extensions"
-msgstr "Limiter le moniteur � certaines extensions MSNs"
+msgid "Mute only after connect"
+msgstr ""
 
-msgid "Resume after call"
+msgid "Decrease volume by [1..100%]"
 msgstr ""
 
-msgid "Retrieving phone book"
-msgstr "Recherche du carnet d'adresse"
+msgid "Pause on call"
+msgstr "Pause pour appel"
 
-msgid "Setup phonebooks to use"
-msgstr "Configuration de r�pertoires t�l�phoniques � utiliser"
+msgid "Pause live tv"
+msgstr ""
 
-msgid "Setup phonebooks to use..."
-msgstr "Configuration de r�pertoires t�l�phoniques � utiliser..."
+msgid "Resume after call"
+msgstr ""
 
 #, fuzzy
 msgid "Show calls"
@@ -210,76 +233,48 @@ msgstr "Afficher les appels entrants"
 msgid "Show detailed call information"
 msgstr "Listes d�taill�es d'appel"
 
-#, fuzzy
-msgid "The call list is not yet available."
-msgstr "Carnet d'adresse n'est pas encore disponible"
-
-#, fuzzy
-msgid "This phonebook is not displayable"
-msgstr "Carnet d'adresse n'est pas encore disponible"
-
-#, fuzzy
-msgid "This phonebook is not yet available."
-msgstr "Carnet d'adresse n'est pas encore disponible"
-
-msgid "Time"
-msgstr "Temps"
-
-msgid "VoIP"
-msgstr "Voix sur IP"
-
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
-msgid "W"
-msgstr "W"
-
-msgid "You may need to wait some minutes,"
-msgstr "Vous devrez peut-�tre attendre quelques minutes,"
+msgid "Detailed call lists"
+msgstr "Listes d�taill�es d'appel"
 
-msgid "any"
-msgstr ""
+msgid "Group call lists by date"
+msgstr "Groupe appels par jour"
 
-msgid "call was not accepted"
-msgstr "Appel n'a pas �t� accept�"
+msgid "Hide main menu entry"
+msgstr "Cach� dans le menu principale"
 
-msgid "das-oertliche.de"
+msgid "Default menu"
 msgstr ""
 
-msgid "incoming"
-msgstr "entrant"
-
-msgid "missed"
-msgstr "manqu�"
+msgid "Setup phonebooks to use..."
+msgstr "Configuration de r�pertoires t�l�phoniques � utiliser..."
 
-#, fuzzy
-msgid "missed call"
-msgstr "manqu�"
+msgid "Restrict monitor to certain extensions"
+msgstr "Limiter le moniteur � certaines extensions MSNs"
 
-#, fuzzy
-msgid "missed calls"
-msgstr "manqu�"
+msgid "Number of monitored extensions"
+msgstr "Nombre d'extensions MSNs a surveillier"
 
-msgid "nummerzoeker.com"
-msgstr ""
+msgid "Reload"
+msgstr "Recharger"
 
-#, fuzzy
-msgid "only incoming"
-msgstr "entrant"
+msgid "Retrieving phone book"
+msgstr "Recherche du carnet d'adresse"
 
-#, fuzzy
-msgid "only outgoing"
-msgstr "sortant"
+msgid "Setup phonebooks to use"
+msgstr "Configuration de r�pertoires t�l�phoniques � utiliser"
 
-msgid "otherwise there may be a network problem."
-msgstr "Sinon il peut y avoir un probl�me de r�seau"
+msgid "More"
+msgstr "Plus"
 
-msgid "outgoing"
-msgstr "sortant"
+msgid "Less"
+msgstr "Moins"
 
-msgid "tel.local.ch"
-msgstr ""
+#~ msgid "Fritz!Box phone book"
+#~ msgstr "Carnet d'adresse de la Fritz!Box"
 
-msgid "unknown"
-msgstr "inconnu"
+#, fuzzy
+#~ msgid "Local phone book"
+#~ msgstr "Carnet d'adresse de la Fritz!Box"
 
 #, fuzzy
 #~ msgid "Button$To PB"
diff --git a/po/it_IT.po b/po/it_IT.po
index b96ccc5..2d33cde 100755
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -5,8 +5,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
-"Report-Msgid-Bugs-To: <vdr at joachim-wilke.de>\n"
-"POT-Creation-Date: \n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2013-12-01 20:07+0100\n"
 "PO-Revision-Date: 2011-03-05 16:29+0100\n"
 "Last-Translator: Diego Pierotto <vdr-italian at tiscali.it>\n"
 "Language-Team:  <vdr at linuxtv.org>\n"
@@ -18,182 +18,198 @@ msgstr ""
 "X-Poedit-Country: ITALY\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-msgid "> PB"
-msgstr "> RU"
+msgid "Fritz Plugin for AVM Fritz!Box"
+msgstr "Plugin Fritz per AVM Fritz!Box"
 
-msgid "Business"
-msgstr "Affari"
+msgid "Fritz!Box"
+msgstr "Fritz!Box"
 
-#. TRANSLATORS: these are labels for color keys in the CallDetails menu
-#. TRANSLATORS: this is the label for the button to initiate a call
-msgid "Button$Call"
-msgstr "Chiama"
+msgid "missed calls"
+msgstr "chiamate perse"
 
-msgid "Call"
-msgstr "Chiama"
+msgid "missed call"
+msgstr "chiamata persa"
 
-msgid "Call details"
-msgstr "Dettagli chiamate"
+msgid "Data not yet available."
+msgstr "Dati non ancora disponibili."
 
-msgid "Call from"
-msgstr "Chiamata da"
+msgid "Private"
+msgstr "Privato"
 
-msgid "Callee"
-msgstr "Chiamato"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
+msgid "H"
+msgstr "C"
 
-msgid "Caller"
-msgstr "Chiamante"
+msgid "Mobile"
+msgstr "Cellulare"
 
-#, c-format
-msgid "Calling %s [%s]"
-msgstr "Chiamata %s [%s]"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
+msgid "M"
+msgstr "T"
 
-msgid "Country code"
-msgstr "Codice internazionale"
+msgid "Business"
+msgstr "Affari"
 
-msgid "Data not yet available."
-msgstr "Dati non ancora disponibili."
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
+msgid "W"
+msgstr "L"
 
-msgid "Date"
-msgstr "Data"
+#, c-format
+msgid "Calling %s [%s]"
+msgstr "Chiamata %s [%s]"
 
-msgid "Decrease volume by [1..100%]"
-msgstr ""
+msgid "Call"
+msgstr "Chiama"
 
-msgid "Default"
-msgstr "Predefinito"
+msgid "Call from"
+msgstr "Chiamata da"
 
-msgid "Default menu"
-msgstr "Menu predefinito"
+msgid "POTS"
+msgstr "analogico"
 
-msgid "Detailed call lists"
-msgstr "Dettagli elenco chiamate"
+msgid "ISDN"
+msgstr "ISDN"
 
-msgid "Duration"
-msgstr "Durata"
+msgid "VoIP"
+msgstr "VoIP"
 
-msgid "Error while initiating call"
-msgstr "Errore avvio chiamata"
+msgid "This phonebook is not yet available."
+msgstr "Questa rubrica non è ancora disponibile."
 
-msgid "Extension"
-msgstr "Estensione MSN"
+msgid "You may need to wait some minutes,"
+msgstr "Potresti dover aspettare alcuni minuti,"
 
-msgid "Fritz Plugin for AVM Fritz!Box"
-msgstr "Plugin Fritz per AVM Fritz!Box"
+msgid "otherwise there may be a network problem."
+msgstr "altrimenti ci potrebbe essere un problema di rete."
 
-msgid "Fritz!Box"
-msgstr "Fritz!Box"
+msgid "This phonebook is not displayable"
+msgstr "Questa rubrica non è disponibile"
 
-msgid "Fritz!Box URL"
-msgstr "Indirizzo Fritz!Box"
+msgid "> PB"
+msgstr "> RU"
 
 msgid "Fritz!Box call list"
 msgstr "Elenco chiamate Fritz!Box"
 
-msgid "Fritz!Box phone book"
-msgstr "Rubrica Fritz!Box"
+msgid "incoming"
+msgstr "in arrivo"
 
-msgid "Group call lists by date"
-msgstr "Raggruppa chiamate per data"
+msgid "missed"
+msgstr "perse"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
-msgid "H"
-msgstr "C"
+msgid "outgoing"
+msgstr "in uscita"
 
-msgid "Hide main menu entry"
-msgstr "Nascondi voce menu principale"
+msgid "unknown"
+msgstr "sconosciuta"
 
-msgid "ISDN"
-msgstr "ISDN"
+msgid "The call list is not yet available."
+msgstr "Elenco chiamate non ancora disponibile."
 
-msgid "Incoming call"
-msgstr "Chiamata in arrivo"
+#. TRANSLATORS: this is the short form of "phone book"
+msgid "PB"
+msgstr "RU"
 
-msgid "Less"
-msgstr "Elimina"
+msgid "Call details"
+msgstr "Dettagli chiamate"
 
-msgid "Local phone book"
-msgstr "Rubrica locale"
+msgid "Date"
+msgstr "Data"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
-msgid "M"
-msgstr "T"
+msgid "Time"
+msgstr "Ora"
 
-msgid "Mobile"
-msgstr "Cellulare"
+msgid "Duration"
+msgstr "Durata"
 
-msgid "More"
-msgstr "Aggiungi"
+msgid "call was not accepted"
+msgstr "chiamata non accettata"
 
-msgid "Mute on call"
-msgstr "Metti in muto la chiamata"
+msgid "Extension"
+msgstr "Estensione MSN"
 
-msgid "Mute only after connect"
-msgstr ""
+msgid "Callee"
+msgstr "Chiamato"
 
-msgid "Name"
-msgstr "Nome"
+msgid "Caller"
+msgstr "Chiamante"
+
+#. TRANSLATORS: these are labels for color keys in the CallDetails menu
+#. TRANSLATORS: this is the label for the button to initiate a call
+msgid "Button$Call"
+msgstr "Chiama"
 
 msgid "No number to call"
 msgstr "Nessun numero da chiamare"
 
-msgid "Number of monitored extensions"
-msgstr "Num. estens. MSN controllate"
+msgid "Pick up your phone now"
+msgstr "Prendi ora la telefonata"
+
+msgid "Error while initiating call"
+msgstr "Errore avvio chiamata"
+
+msgid "Phone book details"
+msgstr "Dettagli rubrica"
+
+msgid "Name"
+msgstr "Nome"
 
 msgid "Numbers"
 msgstr "Numeri"
 
+msgid "Default"
+msgstr "Predefinito"
+
 msgid "Outgoing call"
 msgstr "Chiamata in uscita"
 
-#. TRANSLATORS: this is the short form of "phone book"
-msgid "PB"
-msgstr "RU"
-
-msgid "POTS"
-msgstr "analogico"
+msgid "Incoming call"
+msgstr "Chiamata in arrivo"
 
-msgid "Password"
-msgstr "Password"
+msgid "any"
+msgstr "qualsiasi"
 
-msgid "Pause live tv"
-msgstr ""
+msgid "only incoming"
+msgstr "solo in arrivo"
 
-msgid "Pause on call"
-msgstr "Metti in pausa la chiamata"
+msgid "only outgoing"
+msgstr "solo in uscita"
 
-msgid "Phone book details"
-msgstr "Dettagli rubrica"
+msgid "Fritz!Box URL"
+msgstr "Indirizzo Fritz!Box"
 
-msgid "Pick up your phone now"
-msgstr "Prendi ora la telefonata"
+msgid "Username"
+msgstr ""
 
-msgid "Private"
-msgstr "Privato"
+msgid "Password"
+msgstr "Password"
 
-msgid "React on calls"
-msgstr "Azione alla chiamata"
+msgid "Country code"
+msgstr "Codice internazionale"
 
 msgid "Region code"
 msgstr "Codice area"
 
-msgid "Reload"
-msgstr "Ricarica"
+msgid "React on calls"
+msgstr "Azione alla chiamata"
 
-msgid "Restrict monitor to certain extensions"
-msgstr "Restringi controllo estensioni MSN"
+msgid "Mute on call"
+msgstr "Metti in muto la chiamata"
 
-msgid "Resume after call"
-msgstr "Riprendi dopo chiamata"
+msgid "Mute only after connect"
+msgstr ""
 
-msgid "Retrieving phone book"
-msgstr "Recupero rubrica"
+msgid "Decrease volume by [1..100%]"
+msgstr ""
 
-msgid "Setup phonebooks to use"
-msgstr "Imposta rubriche da utilizzare"
+msgid "Pause on call"
+msgstr "Metti in pausa la chiamata"
 
-msgid "Setup phonebooks to use..."
-msgstr "Imposta rubriche da utilizzare..."
+msgid "Pause live tv"
+msgstr ""
+
+msgid "Resume after call"
+msgstr "Riprendi dopo chiamata"
 
 msgid "Show calls"
 msgstr "Mostra chiamate"
@@ -201,69 +217,56 @@ msgstr "Mostra chiamate"
 msgid "Show detailed call information"
 msgstr "Mostra info dettagliate chiamata"
 
-msgid "The call list is not yet available."
-msgstr "Elenco chiamate non ancora disponibile."
-
-msgid "This phonebook is not displayable"
-msgstr "Questa rubrica non è disponibile"
-
-msgid "This phonebook is not yet available."
-msgstr "Questa rubrica non è ancora disponibile."
-
-msgid "Time"
-msgstr "Ora"
-
-msgid "VoIP"
-msgstr "VoIP"
+msgid "Detailed call lists"
+msgstr "Dettagli elenco chiamate"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
-msgid "W"
-msgstr "L"
+msgid "Group call lists by date"
+msgstr "Raggruppa chiamate per data"
 
-msgid "You may need to wait some minutes,"
-msgstr "Potresti dover aspettare alcuni minuti,"
+msgid "Hide main menu entry"
+msgstr "Nascondi voce menu principale"
 
-msgid "any"
-msgstr "qualsiasi"
+msgid "Default menu"
+msgstr "Menu predefinito"
 
-msgid "call was not accepted"
-msgstr "chiamata non accettata"
+msgid "Setup phonebooks to use..."
+msgstr "Imposta rubriche da utilizzare..."
 
-msgid "das-oertliche.de"
-msgstr "das-oertliche.de"
+msgid "Restrict monitor to certain extensions"
+msgstr "Restringi controllo estensioni MSN"
 
-msgid "incoming"
-msgstr "in arrivo"
+msgid "Number of monitored extensions"
+msgstr "Num. estens. MSN controllate"
 
-msgid "missed"
-msgstr "perse"
+msgid "Reload"
+msgstr "Ricarica"
 
-msgid "missed call"
-msgstr "chiamata persa"
+msgid "Retrieving phone book"
+msgstr "Recupero rubrica"
 
-msgid "missed calls"
-msgstr "chiamate perse"
+msgid "Setup phonebooks to use"
+msgstr "Imposta rubriche da utilizzare"
 
-msgid "nummerzoeker.com"
-msgstr "nummerzoeker.com"
+msgid "More"
+msgstr "Aggiungi"
 
-msgid "only incoming"
-msgstr "solo in arrivo"
+msgid "Less"
+msgstr "Elimina"
 
-msgid "only outgoing"
-msgstr "solo in uscita"
+#~ msgid "Fritz!Box phone book"
+#~ msgstr "Rubrica Fritz!Box"
 
-msgid "otherwise there may be a network problem."
-msgstr "altrimenti ci potrebbe essere un problema di rete."
+#~ msgid "Local phone book"
+#~ msgstr "Rubrica locale"
 
-msgid "outgoing"
-msgstr "in uscita"
+#~ msgid "das-oertliche.de"
+#~ msgstr "das-oertliche.de"
 
-msgid "tel.local.ch"
-msgstr "tel.local.ch"
+#~ msgid "nummerzoeker.com"
+#~ msgstr "nummerzoeker.com"
 
-msgid "unknown"
-msgstr "sconosciuta"
+#~ msgid "tel.local.ch"
+#~ msgstr "tel.local.ch"
 
 #~ msgid " "
 #~ msgstr " "
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 8592814..5b0e2d2 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -7,7 +7,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ru_RU-UTF8\n"
-"Report-Msgid-Bugs-To: <vdr at joachim-wilke.de>\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2013-12-01 20:07+0100\n"
 "PO-Revision-Date: 2008-09-09 01:48+0200\n"
 "Last-Translator: Alexander Gross\n"
 "Language-Team: russian\n"
@@ -17,184 +18,202 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
 
-msgid "> PB"
-msgstr "> PB"
+msgid "Fritz Plugin for AVM Fritz!Box"
+msgstr "Fritz модуль для AVM Fritz!Box"
 
-msgid "Business"
-msgstr "Рабочий"
+msgid "Fritz!Box"
+msgstr "Fritz!Box"
 
-#. TRANSLATORS: these are labels for color keys in the CallDetails menu
-#. TRANSLATORS: this is the label for the button to initiate a call
-msgid "Button$Call"
-msgstr "Позвонить"
+msgid "missed calls"
+msgstr "пропущенные звонки"
 
-msgid "Call"
-msgstr "Звонок"
+msgid "missed call"
+msgstr "пропущенный звонок"
 
-msgid "Call details"
-msgstr "Подробности звонка"
+#, fuzzy
+msgid "Data not yet available."
+msgstr "Телефонный справочник пока не доступен."
 
-msgid "Call from"
-msgstr "Вам звонит"
+msgid "Private"
+msgstr "Частный"
 
-msgid "Callee"
-msgstr "Цель"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
+msgid "H"
+msgstr "Д"
 
-msgid "Caller"
-msgstr "Вам звонит  "
+msgid "Mobile"
+msgstr "Мобильный"
 
-#, c-format
-msgid "Calling %s [%s]"
-msgstr "Звонит %s [%s]"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
+msgid "M"
+msgstr "М"
 
-msgid "Country code"
-msgstr ""
+msgid "Business"
+msgstr "Рабочий"
 
-#, fuzzy
-msgid "Data not yet available."
-msgstr "Телефонный справочник пока не доступен."
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
+msgid "W"
+msgstr "Р"
 
-msgid "Date"
-msgstr "Дата"
+#, c-format
+msgid "Calling %s [%s]"
+msgstr "Звонит %s [%s]"
 
-msgid "Decrease volume by [1..100%]"
-msgstr ""
+msgid "Call"
+msgstr "Звонок"
 
-msgid "Default"
-msgstr "По умолчанию"
+msgid "Call from"
+msgstr "Вам звонит"
 
-#, fuzzy
-msgid "Default menu"
-msgstr "По умолчанию"
+msgid "POTS"
+msgstr "аналог"
 
-msgid "Detailed call lists"
-msgstr "Подробный список звонков"
+msgid "ISDN"
+msgstr "ISDN"
 
-msgid "Duration"
-msgstr "Продолжительность"
+msgid "VoIP"
+msgstr "VoIP"
 
-msgid "Error while initiating call"
-msgstr "Ошибка при соединении"
+msgid "This phonebook is not yet available."
+msgstr "Телефонный справочник пока не доступен."
 
-msgid "Extension"
-msgstr "MSN"
+msgid "You may need to wait some minutes,"
+msgstr "Вам возможно придеться подождать несколько минут"
 
-msgid "Fritz Plugin for AVM Fritz!Box"
-msgstr "Fritz модуль для AVM Fritz!Box"
+msgid "otherwise there may be a network problem."
+msgstr "или возникла проблема сети"
 
-msgid "Fritz!Box"
-msgstr "Fritz!Box"
+msgid "This phonebook is not displayable"
+msgstr "Телефонный справочник пока не доступен "
 
-msgid "Fritz!Box URL"
-msgstr "Адрес Fritz!Box "
+msgid "> PB"
+msgstr "> PB"
 
 msgid "Fritz!Box call list"
 msgstr "Список звонков Fritz!Box"
 
-msgid "Fritz!Box phone book"
-msgstr "Телефонный справочник Fritz!Box"
+msgid "incoming"
+msgstr "входящие"
 
-msgid "Group call lists by date"
-msgstr "Группировать списки звонков по дате"
+msgid "missed"
+msgstr "пропущенные"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
-msgid "H"
-msgstr "Д"
+msgid "outgoing"
+msgstr "выходящие"
 
-msgid "Hide main menu entry"
-msgstr "Скрыть в главном меню"
+msgid "unknown"
+msgstr "неизвестный"
 
-msgid "ISDN"
-msgstr "ISDN"
+#, fuzzy
+msgid "The call list is not yet available."
+msgstr "Телефонный справочник пока не доступен."
 
-msgid "Incoming call"
-msgstr "Входящий звонок"
+#. TRANSLATORS: this is the short form of "phone book"
+msgid "PB"
+msgstr "PB"
 
-msgid "Less"
-msgstr "Меньше"
+msgid "Call details"
+msgstr "Подробности звонка"
 
-msgid "Local phone book"
-msgstr "Локальный справочник"
+msgid "Date"
+msgstr "Дата"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
-msgid "M"
-msgstr "М"
+msgid "Time"
+msgstr "Время"
 
-msgid "Mobile"
-msgstr "Мобильный"
+msgid "Duration"
+msgstr "Продолжительность"
 
-msgid "More"
-msgstr "Больше"
+msgid "call was not accepted"
+msgstr "непринятый звонок"
 
-msgid "Mute on call"
-msgstr "Выключить звук при звонке"
+msgid "Extension"
+msgstr "MSN"
 
-msgid "Mute only after connect"
-msgstr ""
+msgid "Callee"
+msgstr "Цель"
 
-msgid "Name"
-msgstr "Имя"
+msgid "Caller"
+msgstr "Вам звонит  "
+
+#. TRANSLATORS: these are labels for color keys in the CallDetails menu
+#. TRANSLATORS: this is the label for the button to initiate a call
+msgid "Button$Call"
+msgstr "Позвонить"
 
 msgid "No number to call"
 msgstr "Без номера звонок не возможен"
 
-msgid "Number of monitored extensions"
-msgstr "Количество контролируемыx MSNs"
+msgid "Pick up your phone now"
+msgstr "Снять телефон сейчас"
+
+msgid "Error while initiating call"
+msgstr "Ошибка при соединении"
+
+msgid "Phone book details"
+msgstr "Подробности справочника"
+
+msgid "Name"
+msgstr "Имя"
 
 msgid "Numbers"
 msgstr "Номера"
 
+msgid "Default"
+msgstr "По умолчанию"
+
 msgid "Outgoing call"
 msgstr "Выходящий звонок"
 
-#. TRANSLATORS: this is the short form of "phone book"
-msgid "PB"
-msgstr "PB"
-
-msgid "POTS"
-msgstr "аналог"
+msgid "Incoming call"
+msgstr "Входящий звонок"
 
-msgid "Password"
-msgstr "Пароль"
+msgid "any"
+msgstr "все"
 
-msgid "Pause live tv"
-msgstr ""
+#, fuzzy
+msgid "only incoming"
+msgstr "входящие"
 
-msgid "Pause on call"
-msgstr "Активировать паузу при звонке"
+#, fuzzy
+msgid "only outgoing"
+msgstr "выходящие"
 
-msgid "Phone book details"
-msgstr "Подробности справочника"
+msgid "Fritz!Box URL"
+msgstr "Адрес Fritz!Box "
 
-msgid "Pick up your phone now"
-msgstr "Снять телефон сейчас"
+msgid "Username"
+msgstr ""
 
-msgid "Private"
-msgstr "Частный"
+msgid "Password"
+msgstr "Пароль"
 
-msgid "React on calls"
-msgstr "Реагировать при звонке"
+msgid "Country code"
+msgstr ""
 
 msgid "Region code"
 msgstr ""
 
-msgid "Reload"
-msgstr "Перезагрузить"
+msgid "React on calls"
+msgstr "Реагировать при звонке"
 
-msgid "Restrict monitor to certain extensions"
-msgstr "Ограничить контролируемые MSNs"
+msgid "Mute on call"
+msgstr "Выключить звук при звонке"
 
-msgid "Resume after call"
+msgid "Mute only after connect"
 msgstr ""
 
-msgid "Retrieving phone book"
-msgstr "Запросить телефонный справочник"
+msgid "Decrease volume by [1..100%]"
+msgstr ""
 
-msgid "Setup phonebooks to use"
-msgstr "Выбрать телефонные справочники"
+msgid "Pause on call"
+msgstr "Активировать паузу при звонке"
 
-msgid "Setup phonebooks to use..."
-msgstr "Выбрать телефонные справочники ..."
+msgid "Pause live tv"
+msgstr ""
+
+msgid "Resume after call"
+msgstr ""
 
 msgid "Show calls"
 msgstr "Показывать звонки"
@@ -202,72 +221,48 @@ msgstr "Показывать звонки"
 msgid "Show detailed call information"
 msgstr "Подробности звонка"
 
-#, fuzzy
-msgid "The call list is not yet available."
-msgstr "Телефонный справочник пока не доступен."
-
-msgid "This phonebook is not displayable"
-msgstr "Телефонный справочник пока не доступен "
-
-msgid "This phonebook is not yet available."
-msgstr "Телефонный справочник пока не доступен."
-
-msgid "Time"
-msgstr "Время"
-
-msgid "VoIP"
-msgstr "VoIP"
-
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
-msgid "W"
-msgstr "Р"
-
-msgid "You may need to wait some minutes,"
-msgstr "Вам возможно придеться подождать несколько минут"
-
-msgid "any"
-msgstr "все"
+msgid "Detailed call lists"
+msgstr "Подробный список звонков"
 
-msgid "call was not accepted"
-msgstr "непринятый звонок"
+msgid "Group call lists by date"
+msgstr "Группировать списки звонков по дате"
 
-msgid "das-oertliche.de"
-msgstr ""
+msgid "Hide main menu entry"
+msgstr "Скрыть в главном меню"
 
-msgid "incoming"
-msgstr "входящие"
+#, fuzzy
+msgid "Default menu"
+msgstr "По умолчанию"
 
-msgid "missed"
-msgstr "пропущенные"
+msgid "Setup phonebooks to use..."
+msgstr "Выбрать телефонные справочники ..."
 
-msgid "missed call"
-msgstr "пропущенный звонок"
+msgid "Restrict monitor to certain extensions"
+msgstr "Ограничить контролируемые MSNs"
 
-msgid "missed calls"
-msgstr "пропущенные звонки"
+msgid "Number of monitored extensions"
+msgstr "Количество контролируемыx MSNs"
 
-msgid "nummerzoeker.com"
-msgstr ""
+msgid "Reload"
+msgstr "Перезагрузить"
 
-#, fuzzy
-msgid "only incoming"
-msgstr "входящие"
+msgid "Retrieving phone book"
+msgstr "Запросить телефонный справочник"
 
-#, fuzzy
-msgid "only outgoing"
-msgstr "выходящие"
+msgid "Setup phonebooks to use"
+msgstr "Выбрать телефонные справочники"
 
-msgid "otherwise there may be a network problem."
-msgstr "или возникла проблема сети"
+msgid "More"
+msgstr "Больше"
 
-msgid "outgoing"
-msgstr "выходящие"
+msgid "Less"
+msgstr "Меньше"
 
-msgid "tel.local.ch"
-msgstr ""
+#~ msgid "Fritz!Box phone book"
+#~ msgstr "Телефонный справочник Fritz!Box"
 
-msgid "unknown"
-msgstr "неизвестный"
+#~ msgid "Local phone book"
+#~ msgstr "Локальный справочник"
 
 #, fuzzy
 #~ msgid "Button$To PB"
diff --git a/po/tr_TR.po b/po/tr_TR.po
index 2a4ca3a..de33579 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -6,7 +6,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
-"Report-Msgid-Bugs-To: <vdr at joachim-wilke.de>\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2013-12-01 20:07+0100\n"
 "PO-Revision-Date: 2007-08-12 21:40+0200\n"
 "Last-Translator: Oktay Yolge�en <oktay_73 at yahoo.de>\n"
 "Language-Team: <vdr at linuxtv.org>\n"
@@ -15,191 +16,213 @@ msgstr ""
 "Content-Type: text/plain; charset=ISO-8859-9\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+msgid "Fritz Plugin for AVM Fritz!Box"
+msgstr ""
+
 #, fuzzy
-msgid "> PB"
-msgstr "TD"
+msgid "Fritz!Box"
+msgstr "Fritz!Box URL"
 
-msgid "Business"
-msgstr ""
+#, fuzzy
+msgid "missed calls"
+msgstr "ka��r�lan"
 
-#. TRANSLATORS: these are labels for color keys in the CallDetails menu
-#. TRANSLATORS: this is the label for the button to initiate a call
 #, fuzzy
-msgid "Button$Call"
-msgstr "Telefon gelince sesi kes"
+msgid "missed call"
+msgstr "ka��r�lan"
 
 #, fuzzy
-msgid "Call"
-msgstr "Arayan numara"
+msgid "Data not yet available."
+msgstr "Telefon defteri mevcut de�il"
 
-msgid "Call details"
+msgid "Private"
 msgstr ""
 
-msgid "Call from"
-msgstr "Arayan numara"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
+msgid "H"
+msgstr ""
 
-msgid "Callee"
+msgid "Mobile"
 msgstr ""
 
-#, fuzzy
-msgid "Caller"
-msgstr "Arayan numara"
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
+msgid "M"
+msgstr ""
+
+msgid "Business"
+msgstr ""
+
+#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
+msgid "W"
+msgstr ""
 
 #, fuzzy, c-format
 msgid "Calling %s [%s]"
 msgstr "Arayan numara"
 
-msgid "Country code"
-msgstr ""
-
 #, fuzzy
-msgid "Data not yet available."
-msgstr "Telefon defteri mevcut de�il"
+msgid "Call"
+msgstr "Arayan numara"
 
-msgid "Date"
-msgstr ""
+msgid "Call from"
+msgstr "Arayan numara"
 
-msgid "Decrease volume by [1..100%]"
-msgstr ""
+msgid "POTS"
+msgstr "analog"
 
-msgid "Default"
-msgstr ""
+msgid "ISDN"
+msgstr "ISDN"
 
-msgid "Default menu"
-msgstr ""
+msgid "VoIP"
+msgstr "VoIP"
 
-msgid "Detailed call lists"
-msgstr "Detayl� konu�ma listesi"
+#, fuzzy
+msgid "This phonebook is not yet available."
+msgstr "Telefon defteri mevcut de�il"
 
-msgid "Duration"
+msgid "You may need to wait some minutes,"
 msgstr ""
 
-msgid "Error while initiating call"
-msgstr "Baglant� hatas�"
-
-msgid "Extension"
-msgstr "MSN"
-
-msgid "Fritz Plugin for AVM Fritz!Box"
+msgid "otherwise there may be a network problem."
 msgstr ""
 
 #, fuzzy
-msgid "Fritz!Box"
-msgstr "Fritz!Box URL"
+msgid "This phonebook is not displayable"
+msgstr "Telefon defteri mevcut de�il"
 
-msgid "Fritz!Box URL"
-msgstr "Fritz!Box URL"
+#, fuzzy
+msgid "> PB"
+msgstr "TD"
 
 msgid "Fritz!Box call list"
 msgstr "Fritz!Box konu�ma listesi"
 
-msgid "Fritz!Box phone book"
-msgstr "Fritz!Box telefon defteri"
-
-msgid "Group call lists by date"
-msgstr ""
+msgid "incoming"
+msgstr "gelen"
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "home"
-msgid "H"
-msgstr ""
+msgid "missed"
+msgstr "ka��r�lan"
 
-msgid "Hide main menu entry"
-msgstr "Ana men�de sakla"
+msgid "outgoing"
+msgstr "giden"
 
-msgid "ISDN"
-msgstr "ISDN"
+msgid "unknown"
+msgstr "mechul"
 
 #, fuzzy
-msgid "Incoming call"
-msgstr "Gelen aramalar� g�ster"
+msgid "The call list is not yet available."
+msgstr "Telefon defteri mevcut de�il"
 
-msgid "Less"
+#. TRANSLATORS: this is the short form of "phone book"
+msgid "PB"
+msgstr "TD"
+
+msgid "Call details"
 msgstr ""
 
-#, fuzzy
-msgid "Local phone book"
-msgstr "Fritz!Box telefon defteri"
+msgid "Date"
+msgstr ""
 
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "mobile"
-msgid "M"
+msgid "Time"
 msgstr ""
 
-msgid "Mobile"
+msgid "Duration"
 msgstr ""
 
-msgid "More"
+msgid "call was not accepted"
 msgstr ""
 
-msgid "Mute on call"
-msgstr "Telefon gelince sesi kes"
+msgid "Extension"
+msgstr "MSN"
 
-msgid "Mute only after connect"
+msgid "Callee"
 msgstr ""
 
-msgid "Name"
-msgstr ""
+#, fuzzy
+msgid "Caller"
+msgstr "Arayan numara"
+
+#. TRANSLATORS: these are labels for color keys in the CallDetails menu
+#. TRANSLATORS: this is the label for the button to initiate a call
+#, fuzzy
+msgid "Button$Call"
+msgstr "Telefon gelince sesi kes"
 
 msgid "No number to call"
 msgstr "Numaras�z arama imkans�z"
 
-msgid "Number of monitored extensions"
-msgstr "G�zlenen MSN'lerinin say�s�"
+msgid "Pick up your phone now"
+msgstr "Telefonu �imdi kald�r�n"
+
+msgid "Error while initiating call"
+msgstr "Baglant� hatas�"
+
+msgid "Phone book details"
+msgstr ""
+
+msgid "Name"
+msgstr ""
 
 msgid "Numbers"
 msgstr ""
 
+msgid "Default"
+msgstr ""
+
 #, fuzzy
 msgid "Outgoing call"
 msgstr "Telefon gelince sesi kes"
 
-#. TRANSLATORS: this is the short form of "phone book"
-msgid "PB"
-msgstr "TD"
+#, fuzzy
+msgid "Incoming call"
+msgstr "Gelen aramalar� g�ster"
 
-msgid "POTS"
-msgstr "analog"
+msgid "any"
+msgstr ""
 
-msgid "Password"
-msgstr "�ifre"
+#, fuzzy
+msgid "only incoming"
+msgstr "gelen"
 
-msgid "Pause live tv"
-msgstr ""
+#, fuzzy
+msgid "only outgoing"
+msgstr "giden"
 
-msgid "Pause on call"
-msgstr "Telefon gelince durakla"
+msgid "Fritz!Box URL"
+msgstr "Fritz!Box URL"
 
-msgid "Phone book details"
+msgid "Username"
 msgstr ""
 
-msgid "Pick up your phone now"
-msgstr "Telefonu �imdi kald�r�n"
+msgid "Password"
+msgstr "�ifre"
 
-msgid "Private"
+msgid "Country code"
+msgstr ""
+
+msgid "Region code"
 msgstr ""
 
 #, fuzzy
 msgid "React on calls"
 msgstr "Telefon gelince sesi kes"
 
-msgid "Region code"
-msgstr ""
-
-msgid "Reload"
-msgstr "Tekrar y�kle"
+msgid "Mute on call"
+msgstr "Telefon gelince sesi kes"
 
-msgid "Restrict monitor to certain extensions"
-msgstr "G�zlenen MSN'leri s�n�rla"
+msgid "Mute only after connect"
+msgstr ""
 
-msgid "Resume after call"
+msgid "Decrease volume by [1..100%]"
 msgstr ""
 
-msgid "Retrieving phone book"
-msgstr "Telefon defteri y�kleniyor"
+msgid "Pause on call"
+msgstr "Telefon gelince durakla"
 
-msgid "Setup phonebooks to use"
+msgid "Pause live tv"
 msgstr ""
 
-msgid "Setup phonebooks to use..."
+msgid "Resume after call"
 msgstr ""
 
 #, fuzzy
@@ -210,76 +233,48 @@ msgstr "Gelen aramalar
 msgid "Show detailed call information"
 msgstr "Detayl� konu�ma listesi"
 
-#, fuzzy
-msgid "The call list is not yet available."
-msgstr "Telefon defteri mevcut de�il"
-
-#, fuzzy
-msgid "This phonebook is not displayable"
-msgstr "Telefon defteri mevcut de�il"
-
-#, fuzzy
-msgid "This phonebook is not yet available."
-msgstr "Telefon defteri mevcut de�il"
-
-msgid "Time"
-msgstr ""
-
-msgid "VoIP"
-msgstr "VoIP"
-
-#. TRANSLATORS: telephonebook number type: this is a one char abbreviation for "work"
-msgid "W"
-msgstr ""
+msgid "Detailed call lists"
+msgstr "Detayl� konu�ma listesi"
 
-msgid "You may need to wait some minutes,"
+msgid "Group call lists by date"
 msgstr ""
 
-msgid "any"
-msgstr ""
+msgid "Hide main menu entry"
+msgstr "Ana men�de sakla"
 
-msgid "call was not accepted"
+msgid "Default menu"
 msgstr ""
 
-msgid "das-oertliche.de"
+msgid "Setup phonebooks to use..."
 msgstr ""
 
-msgid "incoming"
-msgstr "gelen"
+msgid "Restrict monitor to certain extensions"
+msgstr "G�zlenen MSN'leri s�n�rla"
 
-msgid "missed"
-msgstr "ka��r�lan"
+msgid "Number of monitored extensions"
+msgstr "G�zlenen MSN'lerinin say�s�"
 
-#, fuzzy
-msgid "missed call"
-msgstr "ka��r�lan"
+msgid "Reload"
+msgstr "Tekrar y�kle"
 
-#, fuzzy
-msgid "missed calls"
-msgstr "ka��r�lan"
+msgid "Retrieving phone book"
+msgstr "Telefon defteri y�kleniyor"
 
-msgid "nummerzoeker.com"
+msgid "Setup phonebooks to use"
 msgstr ""
 
-#, fuzzy
-msgid "only incoming"
-msgstr "gelen"
-
-#, fuzzy
-msgid "only outgoing"
-msgstr "giden"
-
-msgid "otherwise there may be a network problem."
+msgid "More"
 msgstr ""
 
-msgid "outgoing"
-msgstr "giden"
-
-msgid "tel.local.ch"
+msgid "Less"
 msgstr ""
 
-msgid "unknown"
-msgstr "mechul"
+#~ msgid "Fritz!Box phone book"
+#~ msgstr "Fritz!Box telefon defteri"
+
+#, fuzzy
+#~ msgid "Local phone book"
+#~ msgstr "Fritz!Box telefon defteri"
 
 #, fuzzy
 #~ msgid "Button$To PB"
diff --git a/setup.c b/setup.cpp
similarity index 95%
rename from setup.c
rename to setup.cpp
index 9b10bbd..3910f2d 100644
--- a/setup.c
+++ b/setup.cpp
@@ -21,11 +21,13 @@
 
 #include "setup.h"
 #include "menu.h"
-#include <FonbookManager.h>
-#include <CallList.h>
-#include <Listener.h>
-#include <Config.h>
+#include "libfritz++/FonbookManager.h"
+#include "libfritz++/CallList.h"
+#include "libfritz++/Listener.h"
+#include "libfritz++/Config.h"
+#include "liblog++/Log.h"
 #include <vdr/menuitems.h>
+#include <vdr/i18n.h>
 
 #if VDRVERSNUM < 10509
 #define trVDR(s) tr(s)
@@ -36,11 +38,6 @@ sFritzboxConfig fritzboxConfig;
 // possible characters for Fritz!Box password, according to web interface
 const char *PasswordChars = "abcdefghijklmnopqrstuvwxyz0123456789 !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
 
-// set logging objects
-std::ostream *dlog = &std::clog;
-std::ostream *ilog = &std::cout;
-std::ostream *elog = &std::cerr;
-
 std::string cMenuSetupFritzbox::StoreMsn(){
 	std::vector<std::string>::iterator it;
 	std::string msnLine;
@@ -109,6 +106,7 @@ void cMenuSetupFritzbox::Setup(void) {
 	}
 	// build up setup menu
 	Add(new cMenuEditStrItem (tr("Fritz!Box URL"),                  		url,           			MaxFileName, tr(FileNameChars)));
+	Add(new cMenuEditStrItem (tr("Username"),                  				username,           	MaxFileName, tr(FileNameChars)));
 	Add(new cMenuEditStrItem (tr("Password"),                       		password, 	   			MaxFileName, PasswordChars));
 	Add(new cMenuEditStrItem (tr("Country code"),                           countryCode,            5,           "0123456789"));
 	Add(new cMenuEditStrItem (tr("Region code"),                            regionCode,             10,          "0123456789"));
@@ -190,7 +188,7 @@ eOSState cMenuSetupFritzbox::ProcessKey(eKeys Key) {
 	if (state == osUnknown) {
 		switch (Key) {
 		case kRed:
-			fritz::FonbookManager::GetFonbook()->Reload();
+			fritz::FonbookManager::GetFonbook()->reload();
 			Skins.QueueMessage(mtInfo, tr("Retrieving phone book"));
 			state = osContinue;
 			break;
@@ -207,6 +205,7 @@ void cMenuSetupFritzbox::Store(void) {
 	fritz::Config::Shutdown(); // clean up before changing the configuration
 
 	fritzboxConfig.url            		= url;
+	fritzboxConfig.username        		= username;
 	int i = 0;
 	// only store the password if it was changed
 	while (password[i]) {
@@ -250,6 +249,7 @@ void cMenuSetupFritzbox::Store(void) {
 	((cThread *)fritzbox)->Start(); // re-read configuration, notify libfritz++ about changes
 
 	SetupStore("Url",          			url);
+	SetupStore("Username",    			username);
 	SetupStore("Password",     			""); // has been migrated to EncodedPassword
 	SetupStore("EncodedPassword",       fritzboxConfig.string2hex(fritzboxConfig.password).c_str());
 	SetupStore("ReactOnDirection",      reactOnDirection);
@@ -277,6 +277,7 @@ cMenuSetupFritzbox::cMenuSetupFritzbox(cPluginFritzbox *fritzbox)
 	// copy setup to temporary parameters
 	msn = (char **) malloc(MAX_MSN_COUNT * sizeof(char *));
 	url             	 = strdup(fritzboxConfig.url.c_str());
+	username          	 = strdup(fritzboxConfig.username.c_str());
 	password        	 = strdup(fritzboxConfig.password.c_str());
 	// the original password is not visible in the setup page
 	// every single character of the password is displayed as "*"
@@ -320,6 +321,7 @@ cMenuSetupFritzbox::~cMenuSetupFritzbox()
 {
 	// free up malloced space from constructor
 	free(url);
+	free(username);
 	free(password);
 	for (int i=0; i<msnCount; i++)
 		free(msn[i]);
@@ -335,14 +337,14 @@ cMenuSetupFritzbox::~cMenuSetupFritzbox()
 cMenuSetupFritzboxFonbooks::cMenuSetupFritzboxFonbooks(std::vector<std::string> *selectedFonbookIDs)
 :cOsdMenu(tr("Setup phonebooks to use"), 4)
 {
-	fonbooks = fritz::FonbookManager::GetFonbookManager()->GetFonbooks();
+	fonbooks = fritz::FonbookManager::GetFonbookManager()->getFonbooks();
 	this->selectedFonbookIDs = selectedFonbookIDs;
 	// copy setup to temporary parameters
 	numberOfSelectedFonbooks = selectedFonbookIDs->size();
 	selectedFonbookPos = (int **)  malloc(fonbooks->size() * sizeof(int *));
 	fonbookTitles      = (char **) malloc(fonbooks->size() * sizeof(char *));
 	for (size_t i=0; i<fonbooks->size(); i++) {
-		int ret = asprintf(&fonbookTitles[i], "%s", tr((*fonbooks)[i]->GetTitle().c_str()));
+		int ret = asprintf(&fonbookTitles[i], "%s", tr((*fonbooks)[i]->getTitle().c_str()));
 		if (ret <= 0) {
 			ERR("Error allocating linebuffer for cOsdItem.");
 		}
@@ -366,7 +368,7 @@ cMenuSetupFritzboxFonbooks::~cMenuSetupFritzboxFonbooks()
 
 void cMenuSetupFritzboxFonbooks::Setup(void) {
 	size_t fbCount = fonbooks->size();
-	// save current postion
+	// save current position
 	int current = Current();
 	// clear entries, if any
 	Clear();
@@ -381,7 +383,7 @@ void cMenuSetupFritzboxFonbooks::Setup(void) {
 		size_t pos = 0;
 		if (i < selectedFonbookIDs->size())
 			while (pos < fbCount &&
-					(*fonbooks)[pos]->GetTechId().compare((*selectedFonbookIDs)[i]) != 0)
+					(*fonbooks)[pos]->getTechId().compare((*selectedFonbookIDs)[i]) != 0)
 				pos++;
 		*(selectedFonbookPos[i]) = (int) pos;
 		Add(new cMenuEditStraItem(numberStr, selectedFonbookPos[i], fbCount, fonbookTitles));
@@ -415,7 +417,7 @@ eOSState cMenuSetupFritzboxFonbooks::ProcessKey(eKeys Key) {
 		case kOk:
 			selectedFonbookIDs->clear();
 			for (size_t i=0; i<numberOfSelectedFonbooks; i++) {
-				std::string s = (*fonbooks)[*selectedFonbookPos[i]]->GetTechId();
+				std::string s = (*fonbooks)[*selectedFonbookPos[i]]->getTechId();
 				selectedFonbookIDs->push_back(s);
 			}
 			state = osBack;
@@ -431,6 +433,7 @@ sFritzboxConfig::sFritzboxConfig() {
 	pluginName              = "";
 	lang                    = "";
 	url             		= "fritz.box";
+	username                = "";
 	password        		= "";
 	countryCode             = "49";
 	regionCode              = "";
@@ -493,6 +496,7 @@ bool sFritzboxConfig::SetupParseFonbooks(const char *value){
 
 bool sFritzboxConfig::SetupParse(const char *name, const char *value) {
 	if      (!strcasecmp(name, "Url"))          		url          		 = value;
+	else if (!strcasecmp(name, "Username"))	            username         = value;
 	else if (!strcasecmp(name, "Password"))	            password             = value;
 	else if (!strcasecmp(name, "EncodedPassword"))      password             = hex2string(value);
 	else if (!strcasecmp(name, "ReactOnDirection"))     reactOnDirection     = atoi(value);
diff --git a/setup.h b/setup.h
index 5234b6b..39cc0ea 100644
--- a/setup.h
+++ b/setup.h
@@ -25,26 +25,19 @@
 #include <string>
 #include <vector>
 #include <vdr/menuitems.h>
-#include <Fonbooks.h>
+#include "libfritz++/Fonbooks.h"
 #include <iostream>
 #include "fritzeventhandler.h"
 #include "fritzbox.h"
 
-#include <Config.h> // import logging macros DBG, INF, ERR
-#undef NAMESPACE
-#define NAMESPACE "vdr-fritz"
-
 #define MAX_MSN_COUNT 22
 
-extern std::ostream *dlog;
-extern std::ostream *ilog;
-extern std::ostream *elog;
-
 class cMenuSetupFritzbox : public cMenuSetupPage
 {
 private:
 	cPluginFritzbox	 *fritzbox;
 	char *url;
+	char *username;
 	char *password;
 	char *directions[3];
 	char *menus[4];
@@ -115,6 +108,7 @@ public:
 	std::string pluginName;             // name of this plugin (e.g., for cRemote::CallPlugin)
 	std::string lang;                   // webinterface language
 	std::string url;                    // fritz!box url
+	std::string username;               // fritz!box web interface username
 	std::string password;               // fritz!box web interface password
 	bool locationSettingsDetected;      // if true, location settings were autodetected by libfritz
 	std::string countryCode;            // fritz!box country-code

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-vdr-dvb/vdr-plugin-fritzbox.git



More information about the pkg-vdr-dvb-changes mailing list