[vdr-plugin-epgsearch] 06/16: New upstream version 2.2.0+git20170625

Tobias Grimm tiber-guest at moszumanska.debian.org
Wed Dec 27 13:51:27 UTC 2017


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

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

commit f722cd35320a3ce281e4706f430518acf05672c3
Author: Tobias Grimm <etobi at debian.org>
Date:   Sun Jun 25 12:29:17 2017 +0200

    New upstream version 2.2.0+git20170625
---
 HISTORY                                            |  32 +++
 HISTORY.DE                                         |  32 +++
 MANUAL                                             |   1 -
 Makefile                                           |  76 +++++--
 README                                             |   2 +-
 README.DE                                          |   1 -
 blacklist.c                                        |  74 ++----
 blacklist.h                                        |   1 -
 changrp.c                                          |  57 ++---
 conflictcheck.c                                    |  61 ++---
 conflictcheck.h                                    |  22 +-
 conflictcheck_thread.c                             |  11 +-
 doc-src/de/epgsearch.1.txt                         |   1 +
 doc-src/de/epgsearch.conf.5.txt                    |   1 +
 doc-src/de/epgsearchblacklists.conf.5.txt          |   1 +
 doc-src/de/epgsearchcats.conf.5.txt                |   1 +
 doc-src/de/epgsearchchangrps.conf.5.txt            |   1 +
 doc-src/de/epgsearchcmds.conf.5.txt                |   1 +
 doc-src/de/epgsearchdirs.conf.5.txt                |   1 +
 doc-src/de/epgsearchmenu.conf.5.txt                |   1 +
 doc-src/de/epgsearchswitchtimers.conf.5.txt        |   1 +
 doc-src/de/epgsearchtemplates.conf.5.txt           |   1 +
 doc-src/de/epgsearchuservars.conf.5.txt            |   1 +
 doc-src/de/noannounce.conf.5.txt                   |   1 +
 doc-src/de/timersdone.conf.5.txt                   |   1 +
 doc-src/en/epgsearch.conf.5.txt                    |   1 +
 doc-src/en/epgsearchcats.conf.5.txt                |   1 +
 docsrc2html.sh                                     |   2 +-
 docsrc2man.sh                                      |  84 ++++---
 epgsearch.c                                        |  42 ++--
 epgsearchcfg.c                                     |  14 +-
 epgsearchcfg.h                                     |   1 +
 epgsearchext.c                                     | 120 +++-------
 epgsearchext.h                                     |   5 +-
 epgsearchsetup.c                                   |   4 +-
 epgsearchsvdrp.c                                   |  42 +---
 epgsearchtools.c                                   |  25 +-
 epgsearchtools.h                                   |   8 +-
 mail.c                                             |  35 +--
 menu_announcelist.c                                |   4 +-
 menu_blacklistedit.c                               |  11 +-
 menu_blacklists.c                                  |   2 -
 menu_commands.c                                    |  51 ++---
 menu_conflictcheck.c                               |  88 ++-----
 menu_conflictcheck.h                               |   4 +-
 menu_deftimercheckmethod.c                         |  20 +-
 menu_dirselect.c                                   |  32 +--
 menu_dirselect.h                                   |   2 -
 menu_event.c                                       |  37 +--
 menu_favorites.c                                   |   7 +-
 menu_main.c                                        | 152 +++++--------
 menu_main.h                                        |   4 +-
 menu_myedittimer.c                                 | 168 +++++++-------
 menu_myedittimer.h                                 |   4 +
 menu_quicksearch.c                                 |   9 +-
 menu_recsdone.c                                    |   4 +-
 menu_search.c                                      |   2 -
 menu_searchactions.c                               |   2 -
 menu_searchedit.c                                  |  46 +---
 menu_searchedit.h                                  |   2 +-
 menu_searchresults.c                               | 109 +++------
 menu_searchresults.h                               |   4 +-
 menu_searchtemplate.c                              |   2 -
 menu_switchtimers.c                                |  13 +-
 menu_templateedit.c                                |   9 +-
 menu_timersdone.c                                  |  11 +-
 menu_whatson.c                                     | 136 ++++-------
 menu_whatson.h                                     |  13 +-
 patches/README.patches                             |   7 +-
 patches/timercmd-0.1_1.6.0.diff                    | 160 -------------
 patches/timercmd-0.1_1.7.17.diff                   | 109 ---------
 patches/vdr-1.5.17-progressbar-support-0.0.1.diff  | 106 ---------
 patches/vdr.epgsearch-exttimeredit-0.0.2.diff      | 110 ---------
 ....diff => vdr.epgsearch-exttimeredit-2.3.6.diff} |  60 ++---
 pending_notifications.c                            |   7 +-
 po/ca_ES.po                                        |  14 +-
 po/cs_CZ.po                                        |  14 +-
 po/da_DK.po                                        |  14 +-
 po/de_DE.po                                        |  20 +-
 po/el_GR.po                                        |  14 +-
 po/es_ES.po                                        |  14 +-
 po/et_EE.po                                        |  14 +-
 po/fi_FI.po                                        |  14 +-
 po/fr_FR.po                                        |  14 +-
 po/hr_HR.po                                        |  14 +-
 po/hu_HU.po                                        |  14 +-
 po/it_IT.po                                        |  14 +-
 po/lt_LT.po                                        |  14 +-
 po/nl_NL.po                                        |  14 +-
 po/nn_NO.po                                        |  14 +-
 po/pl_PL.po                                        |  14 +-
 po/pt_PT.po                                        |  14 +-
 po/ro_RO.po                                        |  14 +-
 po/ru_RU.po                                        |  14 +-
 po/sk_SK.po                                        |  14 +-
 po/sl_SI.po                                        |  14 +-
 po/sv_SE.po                                        |  14 +-
 po/tr_TR.po                                        |  14 +-
 recdone.c                                          |  14 +-
 recstatus.c                                        |  55 +----
 recstatus.h                                        |   2 -
 searchtimer_thread.c                               | 156 ++++---------
 searchtimer_thread.h                               |   4 +-
 services.c                                         |  18 +-
 status_thread.c                                    | 253 ---------------------
 status_thread.h                                    |  65 ------
 switchtimer.c                                      |  28 +--
 switchtimer.h                                      |   1 +
 switchtimer_thread.c                               |   7 +-
 templatefile.c                                     |   9 +-
 timer_thread.c                                     |  15 +-
 timerdone.c                                        |  17 +-
 timerstatus.c                                      |   3 -
 timerstatus.h                                      |   4 -
 uservars.h                                         |  41 +---
 115 files changed, 1098 insertions(+), 2196 deletions(-)

diff --git a/HISTORY b/HISTORY
index 3097a9a..7248d70 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,38 @@
 VDR Plugin 'epgsearch' Revision History
 ---------------------------------------
 
+2017-05-xx; Version 2.3.1 - development release
+new:
+- Commit vdr-2.3.2-epgsearch-1.0.1.beta5~git20150715_v2.diff by fnu at vdr-portal.de
+  based on inputs from kamel5, mini73 & TomJoad @ vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board97-vdr-core/p1284612-produktive-problem-und-pluginl%C3%B6sungen-f%C3%BCr-vdr-2-3-2-und-h%C3%B6her/#post1284612
+- Commit 0004-Added-patches-vdr.epgsearch-exttimeredit-2.3.3.diff.diff by jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289938-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289938
+- Commit 0005-epgsearch-inactive-records-v2.diff by jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289983-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289983
+- Commit 0001-Fix-warning-in-pending_notifications.c.diff by jasminj at vdr-portal.de
+- Commit 0002-Fixed-warnings-in-man-page-generation.diff by jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289704-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289704
+- Commit 0003-Use-HandleRemoteTimerModifications-instead-of-Handle.diff by jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289764-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289764
+- Commit menu_category_recsdone.diff by tomas & louis @vdr-portal.de
+  http://www.vdr-portal.de/board1-news/board2-vdr-news/p1271995-skindesigner-1-0-0-neuer-default-skin-estuary4vdr/#post1271995
+- Commit 0001-revert-seperate-status-thread.diff by TomJoad at vdr-portal.de
+- Commit 0002-fix-incorrect-lock-sequences.diff by TomJoad at vdr-portal.de
+- Commit 0003-revert-now-obsolete-pointer-params.diff by TomJoad at vdr-portal.de
+- Commit 0004-some-small-fixes.diff by TomJoad at vdr-portal.de
+  http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1291452-epgsearch-f%C3%BCr-vdr-2-3-x/#post1291452
+- Drop legacy code prior VDR 2.3.x
+- Commit 0001-fixed-unresponsive-vdr.diff by TomJoad at vdr-portal.de
+- Commit 0002-removed-variableduplications.diff by TomJoad at vdr-portal.de
+- Commit 0003-more-cleanups.diff by TomJoad at vdr-portal.de
+- Commit 0004-Remote-timers-in-menu-myedittimer.diff by TomJoad at vdr-portal.de
+  http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1291771-epgsearch-f%C3%BCr-vdr-2-3-x/#post1291771
+- Commit fixblacklist_handling.diff by TomJoad at vdr-portal.de
+  http://www.vdr-portal.de/board16-video-disk-recorder/board99-distributionen/board107-mld/p1292085-epgsearch-in-verbindung-mit-epgd-epg2vdr-live-absturz-unter-vdr-2-3-4/#post1292085
+- Commit epgsearch_min_max_from_stl.diff  by jasminj at vdr-portal.de
+  http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1292145-epgsearch-f%C3%BCr-vdr-2-3-x/#post1292145
+
 2013-03-xx; Version 1.0.1 - maintenance release
 new:
 - new Makefile style as introduced in vdr-1.7.36, the old Makefile still exists as 
diff --git a/HISTORY.DE b/HISTORY.DE
index 03aaeab..a5044ae 100644
--- a/HISTORY.DE
+++ b/HISTORY.DE
@@ -1,6 +1,38 @@
 VDR Plugin 'epgsearch' Revision History
 ---------------------------------------
 
+2017-05-xx; Version 2.3.1 - development release
+neu:
+- Anwenden vdr-2.3.2-epgsearch-1.0.1.beta5~git20150715_v2.diff von fnu at vdr-portal.de
+  basierend auf Eingaben von kamel5, mini73 & TomJoad @ vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board97-vdr-core/p1284612-produktive-problem-und-pluginl%C3%B6sungen-f%C3%BCr-vdr-2-3-2-und-h%C3%B6her/#post1284612
+- Anwenden 0004-Added-patches-vdr.epgsearch-exttimeredit-2.3.3.diff.diff von jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289938-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289938
+- Anwenden 0005-epgsearch-inactive-records-v2.diff von jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289983-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289983
+- Anwenden 0001-Fix-warning-in-pending_notifications.c.diff von jasminj at vdr-portal.de
+- Anwenden 0002-Fixed-warnings-in-man-page-generation.diff von jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289704-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289704
+- Anwenden 0003-Use-HandleRemoteTimerModifications-instead-of-Handle.diff von jasminj at vdr-portal.de
+  => http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1289764-epgsearch-f%C3%BCr-vdr-2-3-x/#post1289764
+- Anwenden menu_category_recsdone.diff von tomas & louis @vdr-portal.de
+  http://www.vdr-portal.de/board1-news/board2-vdr-news/p1271995-skindesigner-1-0-0-neuer-default-skin-estuary4vdr/#post1271995
+- Anwenden 0001-revert-seperate-status-thread.diff von TomJoad at vdr-portal.de
+- Anwenden 0002-fix-incorrect-lock-sequences.diff von TomJoad at vdr-portal.de
+- Anwenden 0003-revert-now-obsolete-pointer-params.diff von TomJoad at vdr-portal.de
+- Anwenden 0004-some-small-fixes.diff von TomJoad at vdr-portal.de
+  http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1291452-epgsearch-f%C3%BCr-vdr-2-3-x/#post1291452
+- Löschen Alt-Code vor VDR 2.3.x
+- Anwenden 0001-fixed-unresponsive-vdr.diff von TomJoad at vdr-portal.de
+- Anwenden 0002-removed-variableduplications.diff von TomJoad at vdr-portal.de
+- Anwenden 0003-more-cleanups.diff von TomJoad at vdr-portal.de
+- Anwenden 0004-Remote-timers-in-menu-myedittimer.diff von TomJoad at vdr-portal.de
+  http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1291771-epgsearch-f%C3%BCr-vdr-2-3-x/#post1291771
+- Anwenden fixblacklist_handling.diff von TomJoad at vdr-portal.de
+  http://www.vdr-portal.de/board16-video-disk-recorder/board99-distributionen/board107-mld/p1292085-epgsearch-in-verbindung-mit-epgd-epg2vdr-live-absturz-unter-vdr-2-3-4/#post1292085
+- Anwenden epgsearch_min_max_from_stl.diff von jasminj at vdr-portal.de
+  http://www.vdr-portal.de/board17-developer/board21-vdr-plugins/p1292145-epgsearch-f%C3%BCr-vdr-2-3-x/#post1292145
+
 2013-03-xx: Version 1.0.1 - Maintenance Release
 neu:
 - neuer Stil für das Makefile wie in vdr-1.7.36 eingeführt. Das alte Makefile gibt es noch
diff --git a/MANUAL b/MANUAL
deleted file mode 120000
index 3631c85..0000000
--- a/MANUAL
+++ /dev/null
@@ -1 +0,0 @@
-./doc/en/epgsearch.4.txt
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 908fbdb..857fbd7 100644
--- a/Makefile
+++ b/Makefile
@@ -132,7 +132,7 @@ ifeq ($(WITHOUT_QUICKSEARCH), 0)
   ALL += libvdr-$(PLUGIN4).so
 endif
 
-OBJS = afuzzy.o blacklist.o changrp.o confdloader.o conflictcheck.o conflictcheck_thread.o distance.o $(PLUGIN).o epgsearchcats.o epgsearchcfg.o epgsearchext.o epgsearchsetup.o  epgsearchsvdrp.o epgsearchtools.o mail.o md5.o menu_announcelist.o menu_blacklistedit.o menu_blacklists.o menu_commands.o menu_conflictcheck.o menu_deftimercheckmethod.o menu_dirselect.o menu_event.o menu_favorites.o menu_main.o menu_myedittimer.o menu_quicksearch.o menu_recsdone.o menu_search.o menu_searchaction [...]
+OBJS = afuzzy.o blacklist.o changrp.o confdloader.o conflictcheck.o conflictcheck_thread.o distance.o $(PLUGIN).o epgsearchcats.o epgsearchcfg.o epgsearchext.o epgsearchsetup.o  epgsearchsvdrp.o epgsearchtools.o mail.o md5.o menu_announcelist.o menu_blacklistedit.o menu_blacklists.o menu_commands.o menu_conflictcheck.o menu_deftimercheckmethod.o menu_dirselect.o menu_event.o menu_favorites.o menu_main.o menu_myedittimer.o menu_quicksearch.o menu_recsdone.o menu_search.o menu_searchaction [...]
 
 ifeq ($(REGEXLIB), pcre)
 LIBS += $(shell pcre-config --libs-posix)
@@ -190,15 +190,20 @@ all: $(ALL) i18n docs
 ### Implicit rules:
 
 %.o: %.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN)"' $(INCLUDES) -o $@ $<
+	@echo CC $@
+	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN)"' $(INCLUDES) -o $@ $<
 mainmenushortcut.o: mainmenushortcut.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(MAINMENUSHORTCUT)"' $(INCLUDES) -o $@ $<
+	@echo CC $@
+	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(MAINMENUSHORTCUT)"' $(INCLUDES) -o $@ $<
 epgsearchonly.o: epgsearchonly.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN2)"' $(INCLUDES) -o $@ $<
+	@echo CC $@
+	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN2)"' $(INCLUDES) -o $@ $<
 conflictcheckonly.o: conflictcheckonly.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN3)"' $(INCLUDES) -o $@ $<
+	@echo CC $@
+	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN3)"' $(INCLUDES) -o $@ $<
 quickepgsearch.o: quickepgsearch.c
-	$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN4)"' $(INCLUDES) -o $@ $<
+	@echo CC $@
+	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN4)"' $(INCLUDES) -o $@ $<
 
 # Dependencies:
 
@@ -207,7 +212,19 @@ DEPFILE = .dependencies
 $(DEPFILE): Makefile
 	@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) $(OBJS2:%.o=%.c) $(OBJS3:%.o=%.c) $(OBJS4:%.o=%.c)> $@
 
+ifneq ($(MAKECMDGOALS),clean)
 -include $(DEPFILE)
+endif
+
+DEPFILE_DOC = .dependencies_doc
+DEPFILE_stmp = .doc_stmp
+$(DEPFILE_DOC): Makefile
+	@rm -f $(DEPFILE_DOC)
+	@./docsrc2man.sh --depend $(DEPFILE_stmp) > $(DEPFILE_DOC)
+
+ifneq ($(MAKECMDGOALS),clean)
+-include $(DEPFILE_DOC)
+endif
 
 ### Internationalization (I18N):
 
@@ -218,17 +235,21 @@ I18Nmsgs  = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
 I18Npot   = $(PODIR)/$(PLUGIN).pot
 
 %.mo: %.po
-	msgfmt -c -o $@ $<
+	@echo MO $@
+	$(Q)msgfmt -c -o $@ $<
 
 $(I18Npot): $(wildcard *.c)
-	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
+	@echo GT$@
+	$(Q)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 $@ $<
+	@echo PO $@
+	$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
 	@touch $@
 
 $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
-	install -D -m644 $< $@
+	@echo IN $@
+	$(Q)install -D -m644 $< $@
 
 .PHONY: i18n
 i18n: $(I18Nmo) $(I18Npot)
@@ -238,38 +259,51 @@ install-i18n: $(I18Nmsgs)
 ### Targets:
 
 libvdr-$(PLUGIN).so: $(OBJS)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@
+	@echo LD $@
+	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@
 
 libvdr-$(PLUGIN2).so: $(OBJS2)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS2) $(LIBS2) -o $@
+	@echo LD $@
+	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS2) $(LIBS2) -o $@
 
 libvdr-$(PLUGIN3).so: $(OBJS3)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS3) $(LIBS3) -o $@
+	@echo LD $@
+	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS3) $(LIBS3) -o $@
 
 libvdr-$(PLUGIN4).so: $(OBJS4)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS4) $(LIBS4) -o $@
+	@echo LD $@
+	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS4) $(LIBS4) -o $@
 
 createcats: createcats.o Makefile
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) createcats.o -o $@
+	@echo LD $@
+	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) createcats.o -o $@
 
-docs:
+$(DEPFILE_stmp):
 	./docsrc2man.sh
 	./docsrc2html.sh
 	ln -sf ./doc/en/epgsearch.4.txt MANUAL
 	ln -sf ./doc/en/epgsearch.1.txt README
 	ln -sf ./doc/de/epgsearch.1.txt README.DE
+	@rm -f $(DEPFILE_stmp)
+	@date > $(DEPFILE_stmp)
+
+docs: $(DEPFILE_stmp)
 
 install-$(PLUGIN): libvdr-$(PLUGIN).so
-	install -D libvdr-$(PLUGIN).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION)
+	@echo IN $@
+	$(Q)install -D libvdr-$(PLUGIN).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION)
 
 install-$(PLUGIN2): libvdr-$(PLUGIN2).so
-	install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
+	@echo IN $@
+	$(Q)install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
 
 install-$(PLUGIN3): libvdr-$(PLUGIN3).so
-	install -D libvdr-$(PLUGIN3).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN3).so.$(APIVERSION)
+	@echo IN $@
+	$(Q)install -D libvdr-$(PLUGIN3).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN3).so.$(APIVERSION)
 
 install-$(PLUGIN4): libvdr-$(PLUGIN4).so
-	install -D libvdr-$(PLUGIN4).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN4).so.$(APIVERSION)
+	@echo IN $@
+	$(Q)install -D libvdr-$(PLUGIN4).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN4).so.$(APIVERSION)
 
 install-conf:
 	mkdir -p $(DESTDIR)$(CONFDIR)/plugins/$(PLUGIN)/conf.d
@@ -322,3 +356,5 @@ clean:
 	@-rm -f $(OBJS) $(OBJS2) $(OBJS3) $(OBJS4) $(DEPFILE) *.so *.tgz core* createcats createcats.o pod2*.tmp
 	@-find . \( -name "*~" -o -name "#*#" \) -print0 | xargs -0r rm -f
 	@-rm -rf doc html man
+	@-rm -f MANUAL README README.DE
+	@-rm -f $(DEPFILE_stmp) $(DEPFILE_DOC)
diff --git a/README b/README
index b18b191..b16bb82 120000
--- a/README
+++ b/README
@@ -1 +1 @@
-README.git
\ No newline at end of file
+./doc/en/epgsearch.1.txt
\ No newline at end of file
diff --git a/README.DE b/README.DE
deleted file mode 120000
index f25d9bf..0000000
--- a/README.DE
+++ /dev/null
@@ -1 +0,0 @@
-./doc/de/epgsearch.1.txt
\ No newline at end of file
diff --git a/blacklist.c b/blacklist.c
index 9f77155..4ea3583 100644
--- a/blacklist.c
+++ b/blacklist.c
@@ -47,14 +47,11 @@ cBlacklist::cBlacklist(void)
     startTime = 0000;
     stopTime = 2359;
     useChannel = false;
-#if VDRVERSNUM > 20300
-    LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    channelMin = vdrchannels->GetByNumber(cDevice::CurrentChannel());
-    channelMax = vdrchannels->GetByNumber(cDevice::CurrentChannel());
+	{
+        LOCK_CHANNELS_READ;
+        channelMin = Channels->GetByNumber(cDevice::CurrentChannel());
+        channelMax = channelMin;
+	}
     channelGroup = NULL;
     useCase = false;
     mode = 0;
@@ -337,13 +334,8 @@ bool cBlacklist::Parse(const char *s)
 			char *channelMaxbuffer = NULL;
 			int channels = sscanf(value, "%m[^|]|%m[^|]", &channelMinbuffer, &channelMaxbuffer);
 #endif
-#if VDRVERSNUM > 20300
 			LOCK_CHANNELS_READ;
-			const cChannels *vdrchannels = Channels;
-#else
-			cChannels *vdrchannels = &Channels;
-#endif
-			channelMin = vdrchannels->GetByChannelID(tChannelID::FromString(channelMinbuffer), true, true);
+			channelMin = Channels->GetByChannelID(tChannelID::FromString(channelMinbuffer), true, true);
 			if (!channelMin)
 			{
 			    LogFile.eSysLog("ERROR: channel %s not defined", channelMinbuffer);
@@ -354,7 +346,7 @@ bool cBlacklist::Parse(const char *s)
 			    channelMax = channelMin;
 			else
 			{
-			    channelMax = vdrchannels->GetByChannelID(tChannelID::FromString(channelMaxbuffer), true, true);
+			    channelMax = Channels->GetByChannelID(tChannelID::FromString(channelMaxbuffer), true, true);
 			    if (!channelMax)
 			    {
 				LogFile.eSysLog("ERROR: channel %s not defined", channelMaxbuffer);
@@ -524,15 +516,15 @@ bool cBlacklist::Save(FILE *f)
   return fprintf(f, "%s\n", ToText()) > 0;
 }
 
-const cEvent * cBlacklist::GetEventByBlacklist(const cSchedule *schedules, const cEvent *Start, int MarginStop)
+const cEvent * cBlacklist::GetEventByBlacklist(const cSchedule *schedule, const cEvent *Start, int MarginStop)
 {
   const cEvent *pe = NULL;
   const cEvent *p1 = NULL;
 
   if (Start)
-      p1 = schedules->Events()->Next(Start);
+      p1 = schedule->Events()->Next(Start);
   else
-      p1 = schedules->Events()->First();
+      p1 = schedule->Events()->First();
 
   time_t tNow=time(NULL);
   char* szTest = NULL;
@@ -557,7 +549,7 @@ const cEvent * cBlacklist::GetEventByBlacklist(const cSchedule *schedules, const
       maxSearchDuration = maxDuration/100*60 + maxDuration%100;
   }
 
-  for (const cEvent *p = p1; p; p = schedules->Events()->Next(p))
+  for (const cEvent *p = p1; p; p = schedule->Events()->Next(p))
   {
      if(!p)
      {
@@ -644,33 +636,15 @@ const cEvent * cBlacklist::GetEventByBlacklist(const cSchedule *schedules, const
 cSearchResults* cBlacklist::Run(cSearchResults* pSearchResults, int MarginStop)
 {
     LogFile.Log(3,"start search for blacklist '%s'", search);
-
-    const cSchedules *schedules;
-#if VDRVERSNUM > 20300
+    LOCK_CHANNELS_READ;
     LOCK_SCHEDULES_READ;
-    schedules = Schedules;
-#else
-    cSchedulesLock schedulesLock;
-    schedules = cSchedules::Schedules(schedulesLock);
-#endif
-    if(!schedules) {
-	LogFile.Log(1,"schedules are currently locked! try again later.");
-	return NULL;
-    }
-
-    const cSchedule *Schedule = schedules->First();
+    const cSchedule *Schedule = Schedules->First();
 
     while (Schedule) {
-#if VDRVERSNUM > 20300
-	LOCK_CHANNELS_READ;
-	const cChannels *vdrchannels = Channels;
-#else
-	cChannels *vdrchannels = &Channels;
-#endif
-	const cChannel* channel = vdrchannels->GetByChannelID(Schedule->ChannelID(),true,true);
+	const cChannel* channel = Channels->GetByChannelID(Schedule->ChannelID(),true,true);
 	if (!channel)
 	{
-	    Schedule = (const cSchedule *)schedules->Next(Schedule);
+	    Schedule = (const cSchedule *)Schedules->Next(Schedule);
 	    continue;
 	}
 
@@ -678,7 +652,7 @@ cSearchResults* cBlacklist::Run(cSearchResults* pSearchResults, int MarginStop)
 	{
 	    if (channelMin->Number() > channel->Number() || channelMax->Number() < channel->Number())
 	    {
-		Schedule = (const cSchedule *)schedules->Next(Schedule);
+		Schedule = (const cSchedule *)Schedules->Next(Schedule);
 		continue;
 	    }
 	}
@@ -687,7 +661,7 @@ cSearchResults* cBlacklist::Run(cSearchResults* pSearchResults, int MarginStop)
 	    cChannelGroup* group = ChannelGroups.GetGroupByName(channelGroup);
 	    if (!group || !group->ChannelInGroup(channel))
 	    {
-		Schedule = (const cSchedule *)schedules->Next(Schedule);
+		Schedule = (const cSchedule *)Schedules->Next(Schedule);
 		continue;
 	    }
 	}
@@ -696,7 +670,7 @@ cSearchResults* cBlacklist::Run(cSearchResults* pSearchResults, int MarginStop)
 	{
 	    if (channel->Ca() >= CA_ENCRYPTED_MIN)
 	    {
-		Schedule = (const cSchedule *)schedules->Next(Schedule);
+		Schedule = (const cSchedule *)Schedules->Next(Schedule);
 		continue;
 	    }
 	}
@@ -705,19 +679,13 @@ cSearchResults* cBlacklist::Run(cSearchResults* pSearchResults, int MarginStop)
         do {
 	    const cEvent* event = GetEventByBlacklist(Schedule, pPrevEvent, MarginStop);
 	    pPrevEvent = event;
-#if VDRVERSNUM > 20300
-	    LOCK_CHANNELS_READ;
-	    const cChannels *vdrchannels = Channels;
-#else
-	    cChannels *vdrchannels = &Channels;
-#endif
-	    if (event && vdrchannels->GetByChannelID(event->ChannelID(),true,true))
+	    if (event && Channels->GetByChannelID(event->ChannelID(),true,true))
 	    {
 		if (!pSearchResults) pSearchResults = new cSearchResults;
 		pSearchResults->Add(new cSearchResult(event, this));
 	    }
         } while(pPrevEvent);
-        Schedule = (const cSchedule *)schedules->Next(Schedule);
+        Schedule = (const cSchedule *)Schedules->Next(Schedule);
     }
     LogFile.Log(3,"found %d event(s) for blacklist '%s'", pSearchResults?pSearchResults->Count():0, search);
 
@@ -766,7 +734,7 @@ int cBlacklists::GetNewID()
     cMutexLock BlacklistLock(this);
     cBlacklist *l = (cBlacklist *)First();
     while (l) {
-	newID = max(newID, l->ID);
+	newID = std::max(newID, l->ID);
 	l = (cBlacklist *)l->Next();
     }
     return newID+1;
diff --git a/blacklist.h b/blacklist.h
index 183b940..494f08c 100644
--- a/blacklist.h
+++ b/blacklist.h
@@ -52,7 +52,6 @@ public:
   int      maxDuration;
   int      useDayOfWeek;
   int      DayOfWeek;
-  int      useEpisode;
   int      useExtEPGInfo;
   int      ignoreMissingEPGCats;
   char**   catvalues;
diff --git a/changrp.c b/changrp.c
index 223273f..7d74a8b 100644
--- a/changrp.c
+++ b/changrp.c
@@ -82,13 +82,8 @@ bool cChannelGroup::Parse(const char *s)
 #endif
 		if (numChannels == 1)
 		{
-#if VDRVERSNUM > 20300
 		    LOCK_CHANNELS_READ;
-		    const cChannels *vdrchannels = Channels;
-#else
-		    cChannels *vdrchannels = &Channels;
-#endif
-		    const cChannel* channel = vdrchannels->GetByChannelID(tChannelID::FromString(channelbuffer), true, true);
+		    const cChannel* channel = Channels->GetByChannelID(tChannelID::FromString(channelbuffer), true, true);
 		    if (channel)
 		    {
 			cChannelGroupItem* channelitem = new cChannelGroupItem(channel);
@@ -135,20 +130,15 @@ const char *cChannelGroup::ToText(void)
 
 int* cChannelGroup::CreateChannelSel()
 {
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    int* channelSel = (int*) malloc(vdrchannels->Count() * sizeof(int));
-    const cChannel* channel = vdrchannels->First();
+    int* channelSel = (int*) malloc(Channels->Count() * sizeof(int));
+    const cChannel* channel = Channels->First();
     int index = 0;
     while (channel)
     {
 	if (channel->GroupSep())
 	{
-	    channel = vdrchannels->Next(channel);
+	    channel = Channels->Next(channel);
 	    continue;
 	}
 	channelSel[index] = 0;
@@ -163,7 +153,7 @@ int* cChannelGroup::CreateChannelSel()
 	    channelInGroup = channels.Next(channelInGroup);
 	}
 	index++;
-	channel = vdrchannels->Next(channel);
+	channel = Channels->Next(channel);
     }
     return channelSel;
 }
@@ -171,13 +161,8 @@ int* cChannelGroup::CreateChannelSel()
 void cChannelGroup::CreateChannelList(int* channelSel)
 {
     channels.Clear();
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel* channel = vdrchannels->First();
+    const cChannel* channel = Channels->First();
     int index = 0;
     while (channel)
     {
@@ -187,7 +172,7 @@ void cChannelGroup::CreateChannelList(int* channelSel)
 		channels.Add(new cChannelGroupItem(channel));
 	    index++;
 	}
-	channel = vdrchannels->Next(channel);
+	channel = Channels->Next(channel);
     }
 }
 
@@ -323,9 +308,7 @@ void cMenuChannelGroupItem::Set(void)
 cMenuChannelGroups::cMenuChannelGroups(char** GroupName)
 :cOsdMenu(tr("Channel groups"),20)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSetupPlugins);
-#endif
     groupSel = -1;
     groupName = GroupName;
     if (groupName && *groupName)
@@ -428,9 +411,7 @@ eOSState cMenuChannelGroups::ProcessKey(eKeys Key)
 cMenuEditChannelGroup::cMenuEditChannelGroup(cChannelGroup *Group, bool New)
 :cOsdMenu(tr("Edit channel group"),30)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSetupPlugins);
-#endif
     group = Group;
     channelSel = group->CreateChannelSel();
     strcpy(name, group->name);
@@ -450,23 +431,18 @@ void cMenuEditChannelGroup::Set()
     Clear();
 
     Add(new cMenuEditStrItem( tr("Group name"), name, sizeof(group->name), trVDR(FileNameChars)));
-#if VDRVERSNUM > 20300
-    LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel* channel = vdrchannels->First();
+    LOCK_CHANNELS_READ; // TODO THIS MAY LOCK Channels A LONG TIME!
+    const cChannel* channel = Channels->First();
     int index = 0;
     while (channel)
     {
 	if (channel->GroupSep())
 	{
-	    channel = vdrchannels->Next(channel);
+	    channel = Channels->Next(channel);
 	    continue;
 	}
 	Add(new cMenuEditBoolItem( CHANNELNAME(channel), &channelSel[index++], trVDR("no"), trVDR("yes")));
-	channel = vdrchannels->Next(channel);
+	channel = Channels->Next(channel);
     }
 
     SetCurrent(Get(current));
@@ -531,25 +507,20 @@ eOSState cMenuEditChannelGroup::ProcessKey(eKeys Key)
 	  case kGreen:
 	  case kYellow:
 	  {
-#if VDRVERSNUM > 20300
 	      LOCK_CHANNELS_READ;
-	      const cChannels *vdrchannels = Channels;
-#else
-	      cChannels *vdrchannels = &Channels;
-#endif
-	      const cChannel* channel = vdrchannels->First();
+	      const cChannel* channel = Channels->First();
 	      int index = 0;
 	      while (channel)
 	      {
 		  if (channel->GroupSep())
 		  {
-		      channel = vdrchannels->Next(channel);
+		      channel = Channels->Next(channel);
 		      continue;
 		  }
 
 		  channelSel[index] = (Key == kGreen?1:(Key == kRed?1-channelSel[index]:0));
 		  index++;
-		  channel = vdrchannels->Next(channel);
+		  channel = Channels->Next(channel);
 	      }
 	      Set();
 	      Display();
diff --git a/conflictcheck.c b/conflictcheck.c
index 4e9e2d3..7b30ccd 100644
--- a/conflictcheck.c
+++ b/conflictcheck.c
@@ -73,17 +73,11 @@ const cEvent* cConflictCheckTimerObj::Event()
 
 const cEvent* cConflictCheckTimerObj::SetEventFromSchedule()
 {
-#if VDRVERSNUM > 20300
     LOCK_SCHEDULES_READ;
-    const cSchedules *schedules = Schedules;
-#else
-    cSchedulesLock SchedulesLock;
-    const cSchedules* schedules = cSchedules::Schedules(SchedulesLock);
-#endif
-    if (!schedules)
+    if (!Schedules)
 	return NULL;
 
-    const cSchedule *Schedule = schedules->GetSchedule(timer->Channel());
+    const cSchedule *Schedule = Schedules->GetSchedule(timer->Channel());
     if (Schedule && Schedule->Events()->First())
     {
 	const cEvent *Event = NULL;
@@ -152,7 +146,7 @@ int cConflictCheckTimerObj::Matches(const cEvent *Event, int *Overlap) const
         else if (stop <= Event->StartTime() || Event->EndTime() <= start)
            overlap = 0;
         else
-           overlap = (min(stop, Event->EndTime()) - max(start, Event->StartTime())) * FULLMATCH / max(Event->Duration(), 1);
+           overlap = (std::min(stop, Event->EndTime()) - std::max(start, Event->StartTime())) * FULLMATCH / std::max(Event->Duration(), 1);
         }
      if (Overlap)
         *Overlap = overlap;
@@ -210,14 +204,11 @@ void cConflictCheck::InitDevicesInfo()
 	devices[i].device = cDevice::GetDevice(i);
 #endif
 
-#if APIVERSNUM > 10721
     BondDevices(Setup.DeviceBondings);
-#endif
 }
 
 void cConflictCheck::BondDevices(const char *Bondings)
 {
-#if APIVERSNUM > 10721
   LogFile.Log(3, "Bond Devices");
   if (Bondings) {
     cSatCableNumbers SatCableNumbers(MAXDEVICES, Bondings);
@@ -232,10 +223,8 @@ void cConflictCheck::BondDevices(const char *Bondings)
     }
   }
   LogFile.Log(3, "Bond Devices done.");
-#endif
 }
 
-
 void cConflictCheck::Check()
 {
     if (evaltimeList)
@@ -267,16 +256,12 @@ cList<cConflictCheckTimerObj>* cConflictCheck::CreateCurrentTimerList()
 
     // collect single event timers
     time_t tMax = 0;
-#if VDRVERSNUM > 20300
     LOCK_TIMERS_READ;
-    const cTimers *vdrtimers = Timers;
-#else
-    const cTimers *vdrtimers = &Timers;
-#endif
     const cTimer* ti = NULL;
-    for (ti = vdrtimers->First(); ti; ti = vdrtimers->Next(ti))
+    for (ti = Timers->First(); ti; ti = Timers->Next(ti))
     {
-	tMax = max(tMax, ti->StartTime());
+	tMax = std::max(tMax, ti->StartTime());
+	if (ti->Remote()) continue; // TO BE DONE: remote service request CC
 	if (!ti->IsSingleEvent()) continue;
         // already recording?
 	int deviceNr = gl_recStatusMonitor->TimerRecDevice(ti)-1;
@@ -285,7 +270,7 @@ cList<cConflictCheckTimerObj>* cConflictCheck::CreateCurrentTimerList()
         cTimer* clone = new cTimer(*ti);
         clone->SetEvent(ti->Event());
 
-	cConflictCheckTimerObj* timerObj = new cConflictCheckTimerObj(clone, ti->StartTime(), ti->StopTime(), deviceNr, ti->Index());
+	cConflictCheckTimerObj* timerObj = new cConflictCheckTimerObj(clone, ti->StartTime(), ti->StopTime(), deviceNr, ti->Id());
 	if (deviceNr >= 0)
 	{
 	    devices[deviceNr].recTimers.insert(timerObj);
@@ -300,9 +285,9 @@ cList<cConflictCheckTimerObj>* cConflictCheck::CreateCurrentTimerList()
     }
 
     // collect repeating timers from now until the date of the timer with tMax
-    time_t maxCheck = time(NULL) + min(14,EPGSearchConfig.checkMaxDays) * SECSINDAY;
-    tMax = max(tMax, maxCheck);
-    for (ti = vdrtimers->First(); ti; ti = vdrtimers->Next(ti))
+    time_t maxCheck = time(NULL) + std::min(14,EPGSearchConfig.checkMaxDays) * SECSINDAY;
+    tMax = std::max(tMax, maxCheck);
+    for (ti = Timers->First(); ti; ti = Timers->Next(ti))
     {
 	if (ti->IsSingleEvent()) continue;
 	time_t day = time(NULL);
@@ -337,7 +322,7 @@ cList<cConflictCheckTimerObj>* cConflictCheck::CreateCurrentTimerList()
 		cTimer* clone = new cTimer(*ti);
 		clone->SetEvent(ti->Event());
 
-		cConflictCheckTimerObj* timerObj = new cConflictCheckTimerObj(clone, Start, Start + ti->StopTime() - ti->StartTime(), deviceNr, ti->Index());
+		cConflictCheckTimerObj* timerObj = new cConflictCheckTimerObj(clone, Start, Start + ti->StopTime() - ti->StartTime(), deviceNr, ti->Id());
 		LogFile.Log(3,"add timer '%s' (%s, channel %s) for conflict check", ti->File(), DAYDATETIME(Start), CHANNELNAME(ti->Channel()));
 		if (deviceNr >= 0)
 		{
@@ -417,7 +402,7 @@ cList<cConflictCheckTime>* cConflictCheck::CreateConflictList(cList<cConflictChe
     LogFile.Log(3,"create conflict list");
     relevantConflicts = 0;
     numConflicts = 0;
-    maxCheck = time(NULL) + min(14, EPGSearchConfig.checkMaxDays) * SECSINDAY;
+    maxCheck = time(NULL) + std::min(14, EPGSearchConfig.checkMaxDays) * SECSINDAY;
 
     // check each time
     for(cConflictCheckTime* checkTime = EvalTimeList->First(); checkTime; checkTime = EvalTimeList->Next(checkTime))
@@ -454,7 +439,7 @@ cList<cConflictCheckTime>* cConflictCheck::CreateConflictList(cList<cConflictChe
 		    if (!nextRelevantConflictDate)
 			nextRelevantConflictDate = checkTime->evaltime;
 		    else
-			nextRelevantConflictDate = min(nextRelevantConflictDate, checkTime->evaltime);
+			nextRelevantConflictDate = std::min(nextRelevantConflictDate, checkTime->evaltime);
 
 		    relevantConflicts++;
 		    allTimersIgnored = false;
@@ -620,9 +605,9 @@ int cConflictCheck::GetDevice(cConflictCheckTimerObj* TimerObj, bool* NeedsDetac
 	     // avoid devices that are receiving
              imp <<= 1; imp |= devices[i].Receiving();
 	     // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
-             imp <<= 8; imp |= min(max(devices[i].Priority() + MAXPRIORITY, 0), 0xFF);
+             imp <<= 8; imp |= std::min(std::max(devices[i].Priority() + MAXPRIORITY, 0), 0xFF);
 	     // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
-             imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF);
+             imp <<= 8; imp |= std::min(std::max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF);
 	     // avoid devices if we need to detach existing receivers
              imp <<= 1; imp |= ndr;
 	     // avoid the primary device
@@ -692,15 +677,10 @@ bool cConflictCheck::TimerInConflict(const cTimer* timer)
 		std::set<cConflictCheckTimerObj*,TimerObjSort>::iterator it2;
 		if ((*it)->concurrentTimers)
 		{
+        LOCK_TIMERS_READ;
 		    for (it2 = (*it)->concurrentTimers->begin(); it2 != (*it)->concurrentTimers->end(); ++it2)
 		    {
-#if VDRVERSNUM > 20300
-			LOCK_TIMERS_READ;
-			const cTimers *vdrtimers = Timers;
-#else
-			cTimers *vdrtimers = &Timers;
-#endif
-			if ((*it2)->OrigTimer(vdrtimers) == timer)
+			if ((*it2)->OrigTimer(Timers) == timer)
 			    return true;
 		    }
 		}
@@ -723,13 +703,8 @@ void cConflictCheck::EvaluateConflCheckCmd()
 	    if ((*it) && !(*it)->ignore)
 	      {
 		string result = EPGSearchConfig.conflCheckCmd;
-#if VDRVERSNUM > 20300
 		LOCK_TIMERS_READ;
-		const cTimers *vdrtimers = Timers;
-#else
-		cTimers *vdrtimers = &Timers;
-#endif
-		if (!(*it)->OrigTimer(vdrtimers))
+		if (!(*it)->OrigTimer(Timers))
 		  {
 		    LogFile.Log(3,"timer has disappeared meanwhile");
 		    continue;
diff --git a/conflictcheck.h b/conflictcheck.h
index 940f864..049243c 100644
--- a/conflictcheck.h
+++ b/conflictcheck.h
@@ -61,17 +61,11 @@ class cConflictCheckTimerObj : public cTimerObj
     int Matches(const cEvent *Event, int *Overlap) const;
     const cTimer* OrigTimer(const cTimers* timers) const
     {
-      // http://www.vdr-portal.de/board1-news/board2-vdr-news/p1255344-/#post1255344
-      // if patch is accepted, change to
-      //return timers->GetTimer(timer);
-      return ((cTimers*)timers)->GetTimer((cTimer*)timer);
+      return timers->GetById(timer->Id(),timer->Remote());
     }
     cTimer* OrigTimer(cTimers* timers)
     {
-      // http://www.vdr-portal.de/board1-news/board2-vdr-news/p1255344-/#post1255344
-      // if patch is accepted, change to
-      //return timers->GetTimer(timer);
-      return timers->GetTimer((cTimer*)timer);
+      return timers->GetById(timer->Id(),timer->Remote());
     }
 };
 
@@ -120,7 +114,7 @@ class cConflictCheckDevice
 	{
 	    int prio = -1;
 	    for(std::set<cConflictCheckTimerObj*,TimerObjSort>::iterator it = recTimers.begin(); it != recTimers.end(); ++it)
-		prio = max(prio, (*it)->timer->Priority());
+		prio = std::max(prio, (*it)->timer->Priority());
 	    return prio;
 	};
     int CardIndex(void) const { if (device) return device->CardIndex(); else return devicenr;}
@@ -178,20 +172,12 @@ class cConflictCheckDevice
 				result = true;
 #ifdef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE
 			    else
-#if APIVERSNUM < 10725
-				result = Priority >= Setup.PrimaryLimit;
-#else
 				result = Priority >= 0;
 #endif
 #endif
-#endif
 			}
 			else
-#if APIVERSNUM < 10725
-			    result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit;
-#else
 			    result = !IsPrimaryDevice() || Priority >= 0;
-#endif
 		    }
 		    else
 			needsDetachReceivers = true;
@@ -247,7 +233,6 @@ class cConflictCheckDevice
 
   cString GetBondingParams(const cChannel *Channel) const //copied from cDVBTuner
   {
-#if APIVERSNUM > 10721
     cDvbTransponderParameters dtp(Channel->Parameters());
     if (Setup.DiSEqC) {
       if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, Channel->Source(), Channel->Frequency(), dtp.Polarization(), NULL))
@@ -258,7 +243,6 @@ class cConflictCheckDevice
       bool VoltOff = dtp.Polarization() == 'V' || dtp.Polarization() == 'R';
       return cString::sprintf("%c %c", ToneOff ? 't' : 'T', VoltOff ? 'v' : 'V');
     }
-#endif
     return "";
   }
 };
diff --git a/conflictcheck_thread.c b/conflictcheck_thread.c
index a81bd8b..8c58a22 100644
--- a/conflictcheck_thread.c
+++ b/conflictcheck_thread.c
@@ -102,13 +102,10 @@ void cConflictCheckThread::Action(void)
 	if (now >= nextUpdate || m_forceUpdate)
 	{
 	    m_forceUpdate = false;
-#if VDRVERSNUM < 20300
-	    if (Timers.BeingEdited())
-	    {
-		Wait.Wait(1000);
-		continue;
-	    }
-#endif
+            {
+                LOCK_TIMERS_WRITE;
+                Timers->SetExplicitModify();
+            }
 	    LogFile.iSysLog("timer conflict check started");
 
 	    cConflictCheck conflictCheck;
diff --git a/doc-src/de/epgsearch.1.txt b/doc-src/de/epgsearch.1.txt
index 5f725a7..57e2301 100644
--- a/doc-src/de/epgsearch.1.txt
+++ b/doc-src/de/epgsearch.1.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearch> - Suchtimer und Ersatz f�r VDR's Standard-Programm-Men�
diff --git a/doc-src/de/epgsearch.conf.5.txt b/doc-src/de/epgsearch.conf.5.txt
index a9e40f9..a17ee3e 100644
--- a/doc-src/de/epgsearch.conf.5.txt
+++ b/doc-src/de/epgsearch.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearch.conf> - Die gespeicherten Suchtimer
diff --git a/doc-src/de/epgsearchblacklists.conf.5.txt b/doc-src/de/epgsearchblacklists.conf.5.txt
index 05c03ba..c7fa6cb 100644
--- a/doc-src/de/epgsearchblacklists.conf.5.txt
+++ b/doc-src/de/epgsearchblacklists.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchblacklists.conf> - Die gespeicherten Auschlusslisten-Suchtimer
diff --git a/doc-src/de/epgsearchcats.conf.5.txt b/doc-src/de/epgsearchcats.conf.5.txt
index 93e5bce..054f028 100644
--- a/doc-src/de/epgsearchcats.conf.5.txt
+++ b/doc-src/de/epgsearchcats.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchcats.conf> - Die Kategorien des erweiterten EPGs, sofern vorhanden.
diff --git a/doc-src/de/epgsearchchangrps.conf.5.txt b/doc-src/de/epgsearchchangrps.conf.5.txt
index 8254277..37d1e30 100644
--- a/doc-src/de/epgsearchchangrps.conf.5.txt
+++ b/doc-src/de/epgsearchchangrps.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchchangrps.conf> - Liste der Kanalgruppen
diff --git a/doc-src/de/epgsearchcmds.conf.5.txt b/doc-src/de/epgsearchcmds.conf.5.txt
index 4802790..5c8dd3c 100644
--- a/doc-src/de/epgsearchcmds.conf.5.txt
+++ b/doc-src/de/epgsearchcmds.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchcmds.conf> - EPG-Befehle
diff --git a/doc-src/de/epgsearchdirs.conf.5.txt b/doc-src/de/epgsearchdirs.conf.5.txt
index 012663f..d495927 100644
--- a/doc-src/de/epgsearchdirs.conf.5.txt
+++ b/doc-src/de/epgsearchdirs.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchdirs.conf> - Liste von Aufnahmepfaden zur einfachen Auswahl
diff --git a/doc-src/de/epgsearchmenu.conf.5.txt b/doc-src/de/epgsearchmenu.conf.5.txt
index b23e42a..6abc7a5 100644
--- a/doc-src/de/epgsearchmenu.conf.5.txt
+++ b/doc-src/de/epgsearchmenu.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchmenu.conf> - Konfiguration der Men�darstellung
diff --git a/doc-src/de/epgsearchswitchtimers.conf.5.txt b/doc-src/de/epgsearchswitchtimers.conf.5.txt
index d39c734..df6d85e 100644
--- a/doc-src/de/epgsearchswitchtimers.conf.5.txt
+++ b/doc-src/de/epgsearchswitchtimers.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchswitchtimer.conf> - Die gespeicherten Umschalttimer
diff --git a/doc-src/de/epgsearchtemplates.conf.5.txt b/doc-src/de/epgsearchtemplates.conf.5.txt
index 503db76..e5c1ad7 100644
--- a/doc-src/de/epgsearchtemplates.conf.5.txt
+++ b/doc-src/de/epgsearchtemplates.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchtemplates.conf> - Die gespeicherten Suchtimer-Vorlagen
diff --git a/doc-src/de/epgsearchuservars.conf.5.txt b/doc-src/de/epgsearchuservars.conf.5.txt
index dd4c7b8..3c4dde8 100644
--- a/doc-src/de/epgsearchuservars.conf.5.txt
+++ b/doc-src/de/epgsearchuservars.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchuservars.conf> - Die Uservariablen
diff --git a/doc-src/de/noannounce.conf.5.txt b/doc-src/de/noannounce.conf.5.txt
index 4098630..0a69ca2 100644
--- a/doc-src/de/noannounce.conf.5.txt
+++ b/doc-src/de/noannounce.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<noannounce.conf> - Liste von Sendungen, die nicht mehr per OSD angek�ndigt
diff --git a/doc-src/de/timersdone.conf.5.txt b/doc-src/de/timersdone.conf.5.txt
index 8d444f3..61292d3 100644
--- a/doc-src/de/timersdone.conf.5.txt
+++ b/doc-src/de/timersdone.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<timersdone.conf> - Liste von anstehenden Timern, die von Suchtimern erzeugt
diff --git a/doc-src/en/epgsearch.conf.5.txt b/doc-src/en/epgsearch.conf.5.txt
index e359399..b040823 100644
--- a/doc-src/en/epgsearch.conf.5.txt
+++ b/doc-src/en/epgsearch.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearch.conf> - The searchtimers
diff --git a/doc-src/en/epgsearchcats.conf.5.txt b/doc-src/en/epgsearchcats.conf.5.txt
index 2aae3a5..155423b 100644
--- a/doc-src/en/epgsearchcats.conf.5.txt
+++ b/doc-src/en/epgsearchcats.conf.5.txt
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 F<epgsearchcats.conf> - Configuration of the additional EPG information
diff --git a/docsrc2html.sh b/docsrc2html.sh
index 6de31cd..7163a75 100755
--- a/docsrc2html.sh
+++ b/docsrc2html.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Creates the html pages
 #
diff --git a/docsrc2man.sh b/docsrc2man.sh
index cf6b041..e5e06df 100755
--- a/docsrc2man.sh
+++ b/docsrc2man.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Creates the man pages
 #
@@ -7,6 +7,8 @@
 # Mike Constabel
 #
 # Version 0.1 - 31.07.2006
+# jasmin.j 24. May 2017:
+#   Added dependency generation by "--depend <tag>"
 #
 
 DOCSRC="doc-src"
@@ -16,47 +18,75 @@ if [ ! -s "epgsearch.c" ]; then
 	exit
 fi
 
+PRINT_DEPS=0
+if [ "$1" = "--depend" ]; then
+	PRINT_DEPS=1
+	PRINT_DEPS_STMP=$2
+	echo "$PRINT_DEPS_STMP: \\"
+fi
+
 VERSION="$(awk -F\" '/VERSION/ {print $2; exit;}' epgsearch.c)"
 
-for LANGUAGE in $(ls "$DOCSRC"/); do
+function man_dir () {
+    if [ $PRINT_DEPS -eq 0 ]; then
+		mkdir -p man/$1
+		rm man/$1/* 2>/dev/null
+    fi
+}
 
-	[ ! -d ""$DOCSRC"/$LANGUAGE" ] && continue
-	mkdir -p man/$LANGUAGE
-	rm man/$LANGUAGE/* 2>/dev/null
-
-	for i in "$DOCSRC"/$LANGUAGE/*.txt; do
-		echo -ne "create man page: ($LANGUAGE) $(basename "$i" ".txt")..."
-		name=$(echo "$(basename "$i")" | sed -e 's/\.[0-9]\..*$//')
-		sect=$(echo "$i" | sed -e 's/.*\.\([0-9]\)\.txt/\1/')
-		pod2man -c "Epgsearch Version $VERSION" -n "$name" --section="$sect" "$i" >"man/$LANGUAGE/$(basename "$i" ".txt")"
-		if [ $? -eq 0 ]; then
-			echo " done."
+function man_gen () {
+	for i in "$DOCSRC"/$1/*.txt; do
+		if [ $PRINT_DEPS -eq 0 ]; then
+			echo -ne "create man page: ($1) $(basename "$i" ".txt")..."
+			name=$(echo "$(basename "$i")" | sed -e 's/\.[0-9]\..*$//')
+			sect=$(echo "$i" | sed -e 's/.*\.\([0-9]\)\.txt/\1/')
+			pod2man -c "Epgsearch Version $VERSION" -n "$name" --section="$sect" "$i" >"man/$1/$(basename "$i" ".txt")"
+			if [ $? -eq 0 ]; then
+				echo " done."
+			else
+				echo " failed."
+			fi
 		else
-			echo " failed."
+			echo -e "\t$i \\"
 		fi
 	done
+}
 
-	rm "$DOCSRC"/$LANGUAGE/*~ 2>/dev/null
-	gzip -f man/$LANGUAGE/*.[0-9]
+function man_gz () {
+	if [ $PRINT_DEPS -eq 0 ]; then
+		rm "$DOCSRC"/$1/*~ 2>/dev/null
+		gzip -f man/$1/*.[0-9]
+	fi
+}
+
+for LANGUAGE in $(ls "$DOCSRC"/); do
+
+	[ ! -d ""$DOCSRC"/$LANGUAGE" ] && continue
+
+	man_dir $LANGUAGE
+	man_gen $LANGUAGE
+	man_gz  $LANGUAGE
 
 done
 
 echo
 
-for LANGUAGE in $(ls "$DOCSRC"/); do
+if [ $PRINT_DEPS -eq 0 ]; then
+	for LANGUAGE in $(ls "$DOCSRC"/); do
 
-	[ ! -d "$DOCSRC/$LANGUAGE" ] && continue
-	mkdir -p doc/$LANGUAGE
-	rm doc/$LANGUAGE/* 2>/dev/null
+		[ ! -d "$DOCSRC/$LANGUAGE" ] && continue
+		mkdir -p doc/$LANGUAGE
+		rm doc/$LANGUAGE/* 2>/dev/null
 
-	for i in man/$LANGUAGE/*.gz; do
-		echo -ne "create doc file from man page: ($LANGUAGE) $(basename "$i")..."
-		zcat "$i" | nroff -man - | col -xbp > "doc/$LANGUAGE/$(basename "$i" ".gz").txt"
-		echo " done"
-	done
+		for i in man/$LANGUAGE/*.gz; do
+			echo -ne "create doc file from man page: ($LANGUAGE) $(basename "$i")..."
+			zcat "$i" | nroff -man - | col -xbp > "doc/$LANGUAGE/$(basename "$i" ".gz").txt"
+			echo " done"
+		done
 
-done
+	done
 
-echo
+	echo
+fi
 
 #EOF
diff --git a/epgsearch.c b/epgsearch.c
index 08c5d1f..7f368c3 100644
--- a/epgsearch.c
+++ b/epgsearch.c
@@ -69,7 +69,11 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 #include "confdloader.h"
 #include "pending_notifications.h"
 
-static const char VERSION[]        = "1.0.1.beta5";
+#if defined(APIVERSNUM) && APIVERSNUM < 20306
+#error "VDR-2.3.6 API version or greater is required!"
+#endif
+
+static const char VERSION[]        = "2.3.1";
 static const char DESCRIPTION[]    =  trNOOP("search the EPG for repeats and more");
 
 // globals
@@ -156,15 +160,10 @@ bool cPluginEpgsearch::ProcessArgs(int argc, char *argv[])
       strn0cpy(SearchExt->search,argv[2], sizeof(SearchExt->search));
       if (atoi(argv[3]) > 0)
       {
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
          SearchExt->useChannel = true;
-         SearchExt->channelMin = vdrchannels->GetByNumber(atoi(argv[3]));
-         SearchExt->channelMax = vdrchannels->GetByNumber(atoi(argv[3]));
+         SearchExt->channelMin = Channels->GetByNumber(atoi(argv[3]));
+         SearchExt->channelMax = Channels->GetByNumber(atoi(argv[3]));
       }
       SearchExt->mode = atoi(argv[4]);
       SearchExt->useTitle = atoi(argv[5]);
@@ -243,15 +242,10 @@ bool cPluginEpgsearch::Service(const char *Id, void *Data)
       strn0cpy(SearchExt->search,searchData->query, sizeof(SearchExt->search)); 
       if (searchData->channelNr > 0)
       {
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
          SearchExt->useChannel = true;
-         SearchExt->channelMin = vdrchannels->GetByNumber(searchData->channelNr);
-         SearchExt->channelMax = vdrchannels->GetByNumber(searchData->channelNr);
+         SearchExt->channelMin = Channels->GetByNumber(searchData->channelNr);
+         SearchExt->channelMax = Channels->GetByNumber(searchData->channelNr);
       }
       SearchExt->mode = searchData->mode;
       SearchExt->useTitle = searchData->useTitle;
@@ -344,15 +338,10 @@ bool cPluginEpgsearch::Service(const char *Id, void *Data)
       strn0cpy(SearchExt->search,searchData->query, sizeof(SearchExt->search));
       if (searchData->channelNr > 0)
       {
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
          SearchExt->useChannel = true;
-         SearchExt->channelMin = vdrchannels->GetByNumber(searchData->channelNr);
-         SearchExt->channelMax = vdrchannels->GetByNumber(searchData->channelNr);
+         SearchExt->channelMin = Channels->GetByNumber(searchData->channelNr);
+         SearchExt->channelMax = Channels->GetByNumber(searchData->channelNr);
       }
       SearchExt->mode = searchData->mode;
       SearchExt->useTitle = searchData->useTitle;
@@ -528,15 +517,10 @@ cOsdObject *cPluginEpgsearch::DoInitialSearch(char* rcFilename)
       strn0cpy(SearchExt->search,rcFile.Search, sizeof(SearchExt->search));
       if (rcFile.ChannelNr != -1)
       {
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
          SearchExt->useChannel = true;
-         SearchExt->channelMin = vdrchannels->GetByNumber(rcFile.ChannelNr);
-         SearchExt->channelMax = vdrchannels->GetByNumber(rcFile.ChannelNr);
+         SearchExt->channelMin = Channels->GetByNumber(rcFile.ChannelNr);
+         SearchExt->channelMax = Channels->GetByNumber(rcFile.ChannelNr);
       }
       SearchExt->mode = rcFile.SearchMode;
       SearchExt->useTitle = rcFile.UseTitle;
diff --git a/epgsearchcfg.c b/epgsearchcfg.c
index f09f957..7124271 100644
--- a/epgsearchcfg.c
+++ b/epgsearchcfg.c
@@ -35,11 +35,7 @@ cEPGSearchConfig::cEPGSearchConfig(void)
   showChannelNr     = 0;
   useSearchTimers   = 0;
   UpdateIntervall   = 30;
-#if APIVERSNUM >= 10715
   SVDRPPort         = 6419;
-#else
-  SVDRPPort         = 2001;
-#endif
   timeShiftValue    = 30;
   toggleGreenYellow = 1;
   StartMenu         = 0;
@@ -98,6 +94,16 @@ cEPGSearchConfig::cEPGSearchConfig(void)
   sendMailOnConflicts = 0;
 }
 
+cShowMode& cShowMode::operator= (const cShowMode &ShowMode)
+{
+	this->mode = ShowMode.mode;
+	this->seekTime = ShowMode.seekTime;
+    memcpy(this->description, ShowMode.description, sizeof(ShowMode.description));
+    this->useIt = ShowMode.useIt;
+    this->itime = ShowMode.itime;
+    return *this;
+}
+
 int cShowMode::Compare(const cListObject &ListObject) const
 {
     cShowMode *p = (cShowMode *)&ListObject;
diff --git a/epgsearchcfg.h b/epgsearchcfg.h
index 2fafef9..e51dee8 100644
--- a/epgsearchcfg.h
+++ b/epgsearchcfg.h
@@ -60,6 +60,7 @@ class cShowMode: public cListObject
 	    else
 		sprintf(description, "%02d:%02d", iTime/100, iTime%100);
 	}
+    cShowMode& operator= (const cShowMode &ShowMode);
     const char* GetDescription() { return description; }
     int GetTime() const { return itime; }
     bool GetUsage() const { return useIt; }
diff --git a/epgsearchext.c b/epgsearchext.c
index 0c981dc..bfe8b5c 100644
--- a/epgsearchext.c
+++ b/epgsearchext.c
@@ -58,14 +58,11 @@ cSearchExt::cSearchExt(void)
    startTime = 0000;
    stopTime = 2359;
    useChannel = false;
-#if VDRVERSNUM > 20300
+   {
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   channelMin = vdrchannels->GetByNumber(cDevice::CurrentChannel());
-   channelMax = vdrchannels->GetByNumber(cDevice::CurrentChannel());
+   channelMin = Channels->GetByNumber(cDevice::CurrentChannel());
+   channelMax = Channels->GetByNumber(cDevice::CurrentChannel());
+   }
    channelGroup = NULL;
    useCase = false;
    mode = 0;
@@ -486,13 +483,8 @@ bool cSearchExt::Parse(const char *s)
                         char *channelMaxbuffer = NULL;
                         int channels = sscanf(value, "%m[^|]|%m[^|]", &channelMinbuffer, &channelMaxbuffer);
 #endif
-#if VDRVERSNUM > 20300
                         LOCK_CHANNELS_READ;
-                        const cChannels *vdrchannels = Channels;
-#else
-                        cChannels *vdrchannels = &Channels;
-#endif
-                        channelMin = vdrchannels->GetByChannelID(tChannelID::FromString(channelMinbuffer), true, true);
+                        channelMin = Channels->GetByChannelID(tChannelID::FromString(channelMinbuffer), true, true);
                         if (!channelMin)
                         {
                            LogFile.eSysLog("ERROR: channel '%s' not defined", channelMinbuffer);
@@ -504,7 +496,7 @@ bool cSearchExt::Parse(const char *s)
                            channelMax = channelMin;
                         else
                         {
-                           channelMax = vdrchannels->GetByChannelID(tChannelID::FromString(channelMaxbuffer), true, true);
+                           channelMax = Channels->GetByChannelID(tChannelID::FromString(channelMaxbuffer), true, true);
                            if (!channelMax)
                            {
                               LogFile.eSysLog("ERROR: channel '%s' not defined", channelMaxbuffer);
@@ -1023,19 +1015,6 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
 {
    LogFile.Log(3,"start search for search timer '%s'", search);
 
-   const cSchedules *schedules;
-#if VDRVERSNUM > 20300
-   LOCK_SCHEDULES_READ;
-   schedules = Schedules;
-#else
-   cSchedulesLock schedulesLock;
-   schedules = cSchedules::Schedules(schedulesLock);
-#endif
-   if(!schedules) {
-      LogFile.Log(1,"schedules are currently locked! try again later.");
-      return NULL;
-   }
-
    bool noPayTV = false;
    if (PayTVMode == -1) // use search's setting
       noPayTV = (useChannel == 3);
@@ -1043,22 +1022,20 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
       noPayTV = (PayTVMode == 1);
 
    time_t tNow=time(NULL);
-   const cSchedule *Schedule = schedules->First();
    cSearchResults* pSearchResults = pPrevResults;
    cSearchResults* pBlacklistResults = GetBlacklistEvents(inspectTimerMargin?MarginStop:0);
 
-   int counter = 0;
-#if VDRVERSNUM > 20300
+   {
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
+   LOCK_SCHEDULES_READ;
+
+   int counter = 0;
+   const cSchedule *Schedule = Schedules->First();
    while (Schedule) {
-      const cChannel* channel = vdrchannels->GetByChannelID(Schedule->ChannelID(),true,true);
+      const cChannel* channel = Channels->GetByChannelID(Schedule->ChannelID(),true,true);
       if (!channel)
       {
-         Schedule = (const cSchedule *)schedules->Next(Schedule);
+         Schedule = (const cSchedule *)Schedules->Next(Schedule);
          continue;
       }
 
@@ -1066,7 +1043,7 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
       {
          if (channelMin->Number() > channel->Number() || channelMax->Number() < channel->Number())
          {
-            Schedule = (const cSchedule *)schedules->Next(Schedule);
+            Schedule = (const cSchedule *)Schedules->Next(Schedule);
             continue;
          }
       }
@@ -1075,7 +1052,7 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
          cChannelGroup* group = ChannelGroups.GetGroupByName(channelGroup);
          if (!group || !group->ChannelInGroup(channel))
          {
-            Schedule = (const cSchedule *)schedules->Next(Schedule);
+            Schedule = (const cSchedule *)Schedules->Next(Schedule);
             continue;
          }
       }
@@ -1084,7 +1061,7 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
       {
          if (channel->Ca() >= CA_ENCRYPTED_MIN)
          {
-            Schedule = (const cSchedule *)schedules->Next(Schedule);
+            Schedule = (const cSchedule *)Schedules->Next(Schedule);
             continue;
          }
       }
@@ -1093,7 +1070,7 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
       {
          if (channel->Ca() >= CA_ENCRYPTED_MIN)
          {
-            Schedule = (const cSchedule *)schedules->Next(Schedule);
+            Schedule = (const cSchedule *)Schedules->Next(Schedule);
             continue;
          }
       }
@@ -1107,7 +1084,7 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
             if (tNow + evalLimitMins*60 <= event->EndTime())
                break;
          }
-         if (event && vdrchannels->GetByChannelID(event->ChannelID(),true,true))
+         if (event && Channels->GetByChannelID(event->ChannelID(),true,true))
          {
             if (pBlacklistResults && pBlacklistResults->Lookup(event))
             {
@@ -1119,9 +1096,10 @@ cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int eval
             counter++;
          }
       } while(pPrevEvent);
-      Schedule = (const cSchedule *)schedules->Next(Schedule);
+      Schedule = (const cSchedule *)Schedules->Next(Schedule);
    }
    LogFile.Log(3,"found %d event(s) for search timer '%s'", counter, search);
+   } // Give up locks
 
    if (pBlacklistResults) delete pBlacklistResults;
 
@@ -1181,22 +1159,16 @@ void cSearchExt::CheckRepeatTimers(cSearchResults* pResults)
       return;
 
    LogFile.Log(2,"analysing repeats for search timer '%s'...", search);
-   if (action != searchTimerActionRecord)
+   if ((action != searchTimerActionRecord) && (action != searchTimerActionInactiveRecord))
    {
       LogFile.Log(3,"search timer not set to 'record', so skip all");
       return;
    }
 
    cSearchResult* pResultObj = NULL;
-#if VDRVERSNUM > 20300
-   LOCK_TIMERS_READ;
-   const cTimers* vdrtimers = Timers;
-#else
-   cTimers* vdrtimers = &Timers;
-#endif
    for (pResultObj = pResults->First(); pResultObj; pResultObj = pResults->Next(pResultObj))
    {
-      if (action != searchTimerActionRecord) // only announce if there is no timer for the event
+      if ((action != searchTimerActionRecord) && (action != searchTimerActionInactiveRecord)) // only announce if there is no timer for the event
       {
          pResultObj->needsTimer = false;
          continue;
@@ -1282,7 +1254,7 @@ void cSearchExt::CheckRepeatTimers(cSearchResults* pResults)
          }
       }
       bool dummy;
-      const cTimer* timer = cSearchTimerThread::GetTimer(vdrtimers, this, pEvent, dummy);
+      const cTimer* timer = cSearchTimerThread::GetTimer(this, pEvent, dummy);
       if (timer && !timer->HasFlags(tfActive))
       {
          LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d), existing timer disabled", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent));
@@ -1366,55 +1338,42 @@ bool cSearchExt::MatchesExtEPGInfo(const cEvent* e)
 
 void cSearchExt::OnOffTimers(bool bOn)
 {
-#if VDRVERSNUM > 20300
    LOCK_TIMERS_WRITE;
-   cTimers *vdrtimers = Timers;
-#else
-   cTimers *vdrtimers = &Timers;
-#endif
-   for (cTimer *ti = vdrtimers->First(); ti; ti = vdrtimers->Next(ti))
+   for (cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
    {
       if (((!bOn && ti->HasFlags(tfActive)) || (bOn && !ti->HasFlags(tfActive))) && TriggeredFromSearchTimerID(ti) == ID)
          ti->OnOff();
    }
-#if VDRVERSNUM < 20300
-   Timers.SetModified();
-#endif
 }
 
 void cSearchExt::DeleteAllTimers()
 {
    cList<cTimerObj> DelTimers;
-#if VDRVERSNUM > 20300
    LOCK_TIMERS_WRITE;
-   cTimers *vdrtimers = Timers;
-#else
-   cTimers *vdrtimers = &Timers;
-#endif
-   cTimer *ti = vdrtimers->First();
+   Timers->SetExplicitModify();
+   cTimer *ti = Timers->First();
    while(ti)
    {
       if (!ti->Recording() && TriggeredFromSearchTimerID(ti) == ID)
       {
-         cTimer* tiNext = vdrtimers->Next(ti);
+         cTimer* tiNext = Timers->Next(ti);
          LogFile.iSysLog("deleting timer %s", *ti->ToDescr());
-         vdrtimers->Del(ti);
-#if VDRVERSNUM < 20300
-         vdrtimers->SetModified();
-#endif
+         Timers->Del(ti);
+         Timers->SetModified();
          ti = tiNext;
       }
       else
-         ti = vdrtimers->Next(ti);
+         ti = Timers->Next(ti);
    };
 }
 
-cTimerObjList* cSearchExt::GetTimerList(const cTimers* vdrtimers, cTimerObjList* timerList)
+cTimerObjList* cSearchExt::GetTimerList(cTimerObjList* timerList)
 {
    if (!timerList)
       timerList = new cTimerObjList;
 
-   for (const cTimer *ti = vdrtimers->First(); ti; ti = vdrtimers->Next(ti))
+   LOCK_TIMERS_READ;
+   for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
    {
       if (TriggeredFromSearchTimerID(ti) == ID)
       {
@@ -1440,13 +1399,8 @@ int cSearchExt::GetCountRecordings()
 {
    int countRecs = 0;
 
-#if VDRVERSNUM > 20300
    LOCK_RECORDINGS_READ;
-   const cRecordings *vdrrecordings = Recordings;
-#else
-   cRecordings *vdrrecordings = &Recordings;
-#endif
-   for (const cRecording *recording = vdrrecordings->First(); recording; recording = vdrrecordings->Next(recording))
+   for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording))
    {
       if (recording->IsEdited()) continue; // ignore recordings edited
       if (!recording->Info()) continue;
@@ -1504,9 +1458,6 @@ void cSearchExt::SetContentFilter(int* contentStringsFlags)
 
 bool cSearchExt::MatchesContentsFilter(const cEvent* e)
 {
-#if APIVERSNUM < 10711
-  return true;
-#else
   if (!e) return false;
   // check if each content filter ID is contained in the events descriptors
   for(unsigned int i=0; i<contentsFilter.size();i+=2)
@@ -1527,7 +1478,6 @@ bool cSearchExt::MatchesContentsFilter(const cEvent* e)
     if (!found) return false;
   }
   return true;
-#endif
 }
 
 // -- cSearchExts ----------------------------------------------------------------
@@ -1586,7 +1536,7 @@ int cSearchExts::GetNewID()
    int newID = -1;
    cSearchExt *l = (cSearchExt *)First();
    while (l) {
-      newID = max(newID, l->ID);
+      newID = std::max(newID, l->ID);
       l = (cSearchExt *)l->Next();
    }
    return newID+1;
diff --git a/epgsearchext.h b/epgsearchext.h
index 3d4b9c5..50758f5 100644
--- a/epgsearchext.h
+++ b/epgsearchext.h
@@ -51,7 +51,8 @@ typedef enum
     searchTimerActionAnnounceViaOSD,
     searchTimerActionSwitchOnly,
     searchTimerActionAnnounceAndSwitch,
-    searchTimerActionAnnounceViaMail
+    searchTimerActionAnnounceViaMail,
+    searchTimerActionInactiveRecord
 } searchTimerAction;
 
 class cSearchExt;
@@ -199,7 +200,7 @@ public:
   cSearchResults* GetBlacklistEvents(int MarginStop = 0);
   void OnOffTimers(bool);
   void DeleteAllTimers();
-  cTimerObjList* GetTimerList(const cTimers* vdrtimers, cTimerObjList* timerList);
+  cTimerObjList* GetTimerList(cTimerObjList* timerList);
   int GetCountRecordings();
   bool IsActiveAt(time_t t);
   bool HasContent(int contentID);
diff --git a/epgsearchsetup.c b/epgsearchsetup.c
index 72ac690..851c115 100644
--- a/epgsearchsetup.c
+++ b/epgsearchsetup.c
@@ -52,11 +52,9 @@ const char *cMenuSetupMailNotification::MailBoxChars     = " abcdefghijklmnopqrs
 // ------------------
 // cMenuSetupSubMenu
 cMenuSetupSubMenu::cMenuSetupSubMenu(const char* Title, cEPGSearchConfig* Data)
-    : cOsdMenu(Title, 33)
+:cOsdMenu(Title, 33)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSetupPlugins);
-#endif
     data = Data;
 }
 
diff --git a/epgsearchsvdrp.c b/epgsearchsvdrp.c
index 6b3c039..591201c 100644
--- a/epgsearchsvdrp.c
+++ b/epgsearchsvdrp.c
@@ -232,11 +232,7 @@ cString cPluginEpgsearch::SVDRPCommand(const char *Command, const char *Option,
             {
                LogFile.Log(1,"search '%s' deleted via SVDRP", search->search);
                cMutexLock SearchExtsLock(&SearchExts);
-               if (delTimers
-#if VDRVERSNUM < 20300
-                   && !Timers.BeingEdited()
-#endif
-                  )
+               if (delTimers)
                 search->DeleteAllTimers();
                SearchExts.Del(search);
                SearchExts.Save();
@@ -566,25 +562,15 @@ cString cPluginEpgsearch::SVDRPCommand(const char *Command, const char *Option,
 
             eTimerMatch timerMatch;
             bool hasTimer = false;
-#if VDRVERSNUM > 20300
             LOCK_TIMERS_READ;
-            const cTimers *vdrtimers = Timers;
-#else
-            cTimers *vdrtimers = &Timers;
-#endif
-            if (vdrtimers->GetMatch(pEvent, &timerMatch))
+            if (Timers->GetMatch(pEvent, &timerMatch))
                hasTimer = (timerMatch == tmFull);
 
             if (!result->search->useAsSearchTimer)
                result->needsTimer = false;
 
-#if VDRVERSNUM > 20300
             LOCK_CHANNELS_READ;
-            const cChannels *vdrchannels = Channels;
-#else
-            cChannels *vdrchannels = &Channels;
-#endif
-            const cChannel *channel = vdrchannels->GetByChannelID(pEvent->ChannelID(), true,true);
+            const cChannel *channel = Channels->GetByChannelID(pEvent->ChannelID(), true,true);
             int timerMode = hasTimer?1:(result->needsTimer?2:0);
 
             string title = pEvent->Title()?ReplaceAll(pEvent->Title(), "|", "!^pipe!^"):"";
@@ -1059,13 +1045,8 @@ cString cPluginEpgsearch::SVDRPCommand(const char *Command, const char *Option,
                   ReplyCode = 901;
                   return cString::sprintf("invalid channel id");
                }
-#if VDRVERSNUM > 20300
                LOCK_CHANNELS_READ;
-               const cChannels *vdrchannels = Channels;
-#else
-               cChannels *vdrchannels = &Channels;
-#endif
-               const cChannel *ch = vdrchannels->GetByChannelID(chID,true,true);
+               const cChannel *ch = Channels->GetByChannelID(chID,true,true);
                if (!ch)
                {
                   ReplyCode = 901;
@@ -1075,18 +1056,13 @@ cString cPluginEpgsearch::SVDRPCommand(const char *Command, const char *Option,
             }
             else
             {
-#if VDRVERSNUM > 20300
                LOCK_CHANNELS_READ;
-               const cChannels *vdrchannels = Channels;
-#else
-               cChannels *vdrchannels = &Channels;
-#endif
                string sBuffer;
-               for (int i = 0; i < vdrchannels->Count(); i++)
+               for (int i = 0; i < Channels->Count(); i++)
                {
-                  const cChannel* ch = vdrchannels->Get(i);
+                  const cChannel* ch = Channels->Get(i);
                   if (ch && !ch->GroupSep())
-                     sBuffer += string(*ch->GetChannelID().ToString()) + string(": ") + NumToString(DefTimerCheckModes.GetMode(ch)) + string((i<vdrchannels->Count()-1)?"\n":"");
+                     sBuffer += string(*ch->GetChannelID().ToString()) + string(": ") + NumToString(DefTimerCheckModes.GetMode(ch)) + string((i<Channels->Count()-1)?"\n":"");
                }
                return sBuffer.c_str();
             }
@@ -1301,13 +1277,13 @@ cString cPluginEpgsearch::SVDRPCommand(const char *Command, const char *Option,
 		 if (relOnly && (*it)->ignore) continue;
 		 std::ostringstream timerpart;
 		 int recPart = (*it)->recDuration * 100 / ((*it)->stop - (*it)->start);
-		 timerpart << (*it)->origIndex+1 << "|" << recPart << "|";
+		 timerpart << (*it)->timer->Id() << "|" << recPart << "|";
 		 std::set<cConflictCheckTimerObj*,TimerObjSort>::iterator itcc;
 		 if ((*it)->concurrentTimers)
 		   {
 		   std::ostringstream cctimers;
 		   for (itcc = (*it)->concurrentTimers->begin(); itcc != (*it)->concurrentTimers->end(); ++itcc)
-		     cctimers << (cctimers.str().empty()?"":"#") << (*itcc)->origIndex+1;
+		     cctimers << (cctimers.str().empty()?"":"#") << (*itcc)->timer->Id();
 		   timerpart << cctimers.str();
 		   }
 		 timerparts << (timerparts.str().empty()?"":":") << timerpart.str();
diff --git a/epgsearchtools.c b/epgsearchtools.c
index 09ad7b3..b8a8c6c 100644
--- a/epgsearchtools.c
+++ b/epgsearchtools.c
@@ -483,7 +483,7 @@ double FuzzyMatch(const char* s1, const char* s2, int maxLength)
 {
    Distance D;
    int dist = D.LD (s1, s2, maxLength);
-   double fMaxLength = max(strlen(s1), strlen(s2));
+   double fMaxLength = std::max(strlen(s1), strlen(s2));
    return (fMaxLength - dist)/fMaxLength;
 }
 
@@ -498,8 +498,8 @@ bool DescriptionMatches(const char* eDescr, const char* rDescr, int matchLimit)
 
    // partial match:
    // first check the length, should only be different at match limit
-   int minLength = min(l_eDescr, l_rDescr);
-   int maxLength = max(l_eDescr, l_rDescr);
+   int minLength = std::min(l_eDescr, l_rDescr);
+   int maxLength = std::max(l_eDescr, l_rDescr);
    if (100*double(minLength)/double(maxLength) < matchLimit)
       return false;
 
@@ -527,15 +527,9 @@ const cEvent* GetEvent(const cTimer* timer)
    for (int seconds = 0; seconds <= 3; seconds++)
    {
       {
-#if VDRVERSNUM > 20300
          LOCK_SCHEDULES_READ;
-         const cSchedules *schedules = Schedules;
-#else
-         cSchedulesLock SchedulesLock;
-         const cSchedules *schedules = cSchedules::Schedules(SchedulesLock);
-#endif
-         if (schedules) {
-            const cSchedule *Schedule = schedules->GetSchedule(channel->GetChannelID());
+         if (Schedules) {
+            const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID());
             if (Schedule) {
                event = Schedule->GetEventAround(Time);
                if (event) return event;
@@ -714,13 +708,8 @@ int ChannelNrFromEvent(const cEvent* pEvent)
 {
    if (!pEvent)
       return -1;
-#if VDRVERSNUM > 20300
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   const cChannel* channel = vdrchannels->GetByChannelID(pEvent->ChannelID(), true, true);
+   const cChannel* channel = Channels->GetByChannelID(pEvent->ChannelID(), true, true);
    if (!channel)
       return -1;
    else
@@ -997,7 +986,6 @@ long getAddrFromString(const char* hostnameOrIp, struct sockaddr_in* addr)
     }
 }
 
-#if VDRVERSNUM >= 10712
 char *cCommand::result = NULL;
 
 cCommand::cCommand(void)
@@ -1060,4 +1048,3 @@ const char *cCommand::Execute(const char *Parameters)
      esyslog("ERROR: can't open pipe for command '%s'", cmd);
   return result;
 }
-#endif
diff --git a/epgsearchtools.h b/epgsearchtools.h
index 7227970..9b80473 100644
--- a/epgsearchtools.h
+++ b/epgsearchtools.h
@@ -31,10 +31,6 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 
 using std::string;
 
-#if VDRVERSNUM < 10733
-#define eTimerMatch int
-#endif 
-
 #define MAXPARSEBUFFER KILOBYTE(10)
 
 #undef CHANNELNAME
@@ -70,7 +66,7 @@ using std::string;
 #undef CONFIGDIR
 #define CONFIGDIR (!ConfigDir?cPlugin::ConfigDirectory():ConfigDir)
 
-#define CHNUMWIDTH  (numdigits(vdrchannels->MaxNumber()) + 2)
+#define CHNUMWIDTH  (numdigits(Channels->MaxNumber()) + 2)
 
 #define SHORTTEXT(EVENT) \
   (EVENT && EPGSearchConfig.showShortText && !isempty((EVENT)->ShortText()))?" ~ ":"", \
@@ -253,7 +249,6 @@ typedef std::basic_string<char,ignorecase_traits> icstring;
 // --- eTimerMod -------------------------------------------------------------
 enum eTimerMod { tmNoChange=0, tmStartStop=1, tmFile=2, tmAuxEventID=4 };
 
-#if VDRVERSNUM >= 10712
 // --- cCommands -------------------------------------------------------------------
 class cCommand : public cListObject {
 private:
@@ -271,6 +266,5 @@ public:
   };
 
 class cCommands : public cConfig<cCommand> {};
-#endif
 
 #endif
diff --git a/mail.c b/mail.c
index 369cbfa..a5f815c 100644
--- a/mail.c
+++ b/mail.c
@@ -50,13 +50,8 @@ string cMailTimerNotification::Format(const string& templ) const
     if (!pEvent) return "";
 
     eTimerMatch TimerMatch = tmNone;
-#if VDRVERSNUM > 20300
     LOCK_TIMERS_READ;
-    const cTimers *vdrtimers = Timers;
-#else
-    cTimers *vdrtimers = &Timers;
-#endif
-    const cTimer* pTimer = vdrtimers->GetMatch(pEvent, &TimerMatch);
+    const cTimer* pTimer = Timers->GetMatch(pEvent, &TimerMatch);
     if (!pTimer) return "";
 
     string result = templ;
@@ -76,29 +71,18 @@ string cMailTimerNotification::Format(const string& templ) const
 
 const cEvent* cMailTimerNotification::GetEvent() const
 {
-#if VDRVERSNUM > 20300
     LOCK_SCHEDULES_READ;
-    const cSchedules *schedules = Schedules;
-#else
-    cSchedulesLock schedulesLock;
-    const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
-#endif
-    if (!schedules) return NULL;
-    const cSchedule *schedule = schedules->GetSchedule(channelID);
+    if (!Schedules) return NULL;
+    const cSchedule *schedule = Schedules->GetSchedule(channelID);
     if (!schedule) return NULL;
     return schedule->GetEvent(eventID);
 }
 
 bool cMailTimerNotification::operator< (const cMailTimerNotification &N) const
 {
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel* channel = vdrchannels->GetByChannelID(channelID,true,true);
-    const cChannel* channelOther = vdrchannels->GetByChannelID(N.channelID,true,true);
+    const cChannel* channel = Channels->GetByChannelID(channelID,true,true);
+    const cChannel* channelOther = Channels->GetByChannelID(N.channelID,true,true);
     if (!channel || !channelOther)
 	return false;
     const cEvent* event = GetEvent();
@@ -138,14 +122,9 @@ cMailDelTimerNotification::cMailDelTimerNotification(const string& Formatted, tC
 
 bool cMailDelTimerNotification::operator< (const cMailDelTimerNotification &N) const
 {
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel* channel = vdrchannels->GetByChannelID(channelID,true,true);
-    const cChannel* channelOther = vdrchannels->GetByChannelID(N.channelID,true,true);
+    const cChannel* channel = Channels->GetByChannelID(channelID,true,true);
+    const cChannel* channelOther = Channels->GetByChannelID(N.channelID,true,true);
     if (!channel || !channelOther)
 	return false;
     if (channel != channelOther)
diff --git a/menu_announcelist.c b/menu_announcelist.c
index 6034ca2..125fbeb 100644
--- a/menu_announcelist.c
+++ b/menu_announcelist.c
@@ -86,11 +86,9 @@ eOSState cMenuAnnounceList::ProcessKey(eKeys Key)
 
 // --- cMenuAnnounceDetails -------------------------------------------------------
 cMenuAnnounceDetails::cMenuAnnounceDetails(const cEvent* Event, const cSearchExt* Search)
-   :cOsdMenu("", 25), event(Event)
+:cOsdMenu("", 25), event(Event)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcEvent);
-#endif
    cMenuAnnounceList::showsDetails = true;
    if (event && !isempty(event->Title()))
    {
diff --git a/menu_blacklistedit.c b/menu_blacklistedit.c
index ef5a1c3..4db0815 100644
--- a/menu_blacklistedit.c
+++ b/menu_blacklistedit.c
@@ -42,9 +42,7 @@ extern const char AllowedChars[];
 cMenuBlacklistEdit::cMenuBlacklistEdit(cBlacklist *Blacklist, bool New)
 :cOsdMenu(tr("Edit blacklist"),32)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSetupPlugins);
-#endif
     SearchModes[0] = strdup(tr("phrase"));
     SearchModes[1] = strdup(tr("all words"));
     SearchModes[2] = strdup(tr("at least one word"));
@@ -351,13 +349,8 @@ eOSState cMenuBlacklistEdit::ProcessKey(eKeys Key)
 	    case kOk:
 		if (data.useChannel==1)
 		{
-#if VDRVERSNUM > 20300
 		    LOCK_CHANNELS_READ;
-		    const cChannels *vdrchannels = Channels;
-#else
-		    cChannels *vdrchannels = &Channels;
-#endif
-		    const cChannel *ch = vdrchannels->GetByNumber(channelMin);
+		    const cChannel *ch = Channels->GetByNumber(channelMin);
 		    if (ch)
 			data.channelMin = ch;
 		    else
@@ -365,7 +358,7 @@ eOSState cMenuBlacklistEdit::ProcessKey(eKeys Key)
 		      ERROR(tr("*** Invalid Channel ***"));
 		      break;
 		    }
-		    ch = vdrchannels->GetByNumber(channelMax);
+		    ch = Channels->GetByNumber(channelMax);
 		    if (ch)
 			data.channelMax = ch;
 		    else
diff --git a/menu_blacklists.c b/menu_blacklists.c
index e6f500a..5290484 100644
--- a/menu_blacklists.c
+++ b/menu_blacklists.c
@@ -99,9 +99,7 @@ int cMenuBlacklistsItem::Compare(const cListObject &ListObject) const
 cMenuBlacklists::cMenuBlacklists()
 :cOsdMenu(tr("Blacklists"), 3, 20, 11, 6, 5)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSetupPlugins);
-#endif
     cMutexLock BlacklistLock(&Blacklists);
     cBlacklist *Blacklist = Blacklists.First();
     while (Blacklist) {
diff --git a/menu_commands.c b/menu_commands.c
index 1bc3a21..ef20c11 100644
--- a/menu_commands.c
+++ b/menu_commands.c
@@ -43,11 +43,9 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 // --- cMenuSearchCommands ---------------------------------------------------------
 
 cMenuSearchCommands::cMenuSearchCommands(const char *Title, const cEvent* Event, bool DirectCall, cSearchExt* Search)
-   :cOsdMenu(Title)
+:cOsdMenu(Title)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcCommand);
-#endif
 
    directCall = DirectCall;
    SetHasHotkeys();
@@ -102,13 +100,8 @@ void cMenuSearchCommands::LoadCommands()
 
 eOSState cMenuSearchCommands::Switch(void)
 {
-#if VDRVERSNUM > 20300
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   const cChannel *channel = vdrchannels->GetByChannelID(event->ChannelID(), true, true);
+   const cChannel *channel = Channels->GetByChannelID(event->ChannelID(), true, true);
    if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true))
       return osEnd;
    else
@@ -128,13 +121,9 @@ eOSState cMenuSearchCommands::Record(void)
    if (!event) return osContinue;
 
    eTimerMatch timerMatch = tmNone;
-#if VDRVERSNUM > 20300
    LOCK_TIMERS_WRITE;
-   cTimers *vdrtimers = Timers;
-#else
-   cTimers *vdrtimers = &Timers;
-#endif
-   cTimer* timer = vdrtimers->GetMatch(event, &timerMatch);
+   Timers->SetExplicitModify();
+   cTimer* timer = Timers->GetMatch(event, &timerMatch);
    if (timerMatch == tmFull)
    {
       if (EPGSearchConfig.useVDRTimerEditMenu)
@@ -145,7 +134,7 @@ eOSState cMenuSearchCommands::Record(void)
 
    timer = new cTimer(event);
    PrepareTimerFile(event, timer);
-   cTimer *t = vdrtimers->GetTimer(timer);
+   cTimer *t = Timers->GetTimer(timer);
 
    if (EPGSearchConfig.onePressTimerCreation == 0 || t || (!t && event->StartTime() - (Setup.MarginStart+2) * 60 < time(NULL)))
    {
@@ -182,12 +171,16 @@ eOSState cMenuSearchCommands::Record(void)
 #endif
 
       SetAux(timer, fullaux);
-      vdrtimers->Add(timer);
+      if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+         timer->SetRemote(Setup.SVDRPDefaultHost);
+      Timers->Add(timer);
       timer->Matches();
-#if VDRVERSNUM < 20300
-      vdrtimers->SetModified();
-#endif
-      LogFile.iSysLog("timer %s added (active)", *timer->ToDescr());
+      Timers->SetModified();
+      if (!HandleRemoteTimerModifications(timer)) {
+         ERROR(tr("Epgsearch: RemoteTimerModifications failed"));
+		 Timers->Del(timer);
+      }
+			else
       return osBack;
    }
    return osContinue;
@@ -245,13 +238,8 @@ eOSState cMenuSearchCommands::CreateSearchTimer(void)
 
    cSearchExt* pNew = new cSearchExt;
    strcpy(pNew->search, event->Title());
-#if VDRVERSNUM > 20300
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   pNew->channelMin = pNew->channelMax = vdrchannels->GetByChannelID(event->ChannelID());
+   pNew->channelMin = pNew->channelMax = Channels->GetByChannelID(event->ChannelID());
    return AddSubMenu(new cMenuEditSearchExt(pNew, true, false, true));
 }
 
@@ -299,19 +287,16 @@ eOSState cMenuSearchCommands::Execute(void)
 	buffer = cString::sprintf("%s...", command->Title());
 	Skins.Message(mtStatus, buffer);
 
-#if VDRVERSNUM > 20300
+	{
 	LOCK_CHANNELS_READ;
-	const cChannels *vdrchannels = Channels;
-#else
-	cChannels *vdrchannels = &Channels;
-#endif
 	buffer = cString::sprintf("'%s' %ld %ld %d '%s' '%s'",
 				  EscapeString(event->Title()).c_str(),
 				  event->StartTime(),
 				  event->EndTime(),
 				  ChannelNrFromEvent(event),
-				  EscapeString(vdrchannels->GetByChannelID(event->ChannelID(), true, true)->Name()).c_str(),
+				  EscapeString(Channels->GetByChannelID(event->ChannelID(), true, true)->Name()).c_str(),
 				  EscapeString(event->ShortText()?event->ShortText():"").c_str());
+	}
 	const char *Result = command->Execute(buffer);
 	Skins.Message(mtStatus, NULL);
 	if (Result)
diff --git a/menu_conflictcheck.c b/menu_conflictcheck.c
index cf10fd0..4450f25 100644
--- a/menu_conflictcheck.c
+++ b/menu_conflictcheck.c
@@ -62,9 +62,7 @@ cMenuConflictCheckItem::cMenuConflictCheckItem(cConflictCheckTime* Ct, cConflict
 cMenuConflictCheck::cMenuConflictCheck()
 :cOsdMenu("", 4, 12, 4, 5, 30)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcTimerEdit);
-#endif
     showAll = false;
     lastSel = -1;
     BuildList();
@@ -165,20 +163,16 @@ eOSState cMenuConflictCheck::ProcessKey(eKeys Key)
 cMenuConflictCheckDetailsItem::cMenuConflictCheckDetailsItem(cConflictCheckTimerObj* TimerObj)
 {
     timerObj = TimerObj;
-#if VDRVERSNUM > 20300
     LOCK_TIMERS_READ;
-    const cTimers *vdrtimers = Timers;
-#else
-    cTimers *vdrtimers = &Timers;
-#endif
-    hasTimer = timerObj->OrigTimer(vdrtimers)?timerObj->OrigTimer(vdrtimers)->HasFlags(tfActive):false;
-    Update(vdrtimers, true);
+    hasTimer = timerObj->OrigTimer(Timers)?timerObj->OrigTimer(Timers)->HasFlags(tfActive):false;
+    Update(true);
 }
 
-bool cMenuConflictCheckDetailsItem::Update(const cTimers* vdrtimers, bool Force)
+bool cMenuConflictCheckDetailsItem::Update(bool Force)
 {
     bool oldhasTimer = hasTimer;
-    hasTimer = timerObj->OrigTimer(vdrtimers)?timerObj->OrigTimer(vdrtimers)->HasFlags(tfActive):false;
+    LOCK_TIMERS_READ;
+    hasTimer = timerObj->OrigTimer(Timers)?timerObj->OrigTimer(Timers)->HasFlags(tfActive):false;
     if (Force || hasTimer != oldhasTimer)
     {
 	const cTimer* timer = timerObj->timer;
@@ -203,9 +197,7 @@ bool cMenuConflictCheckDetailsItem::Update(const cTimers* vdrtimers, bool Force)
 cMenuConflictCheckDetails::cMenuConflictCheckDetails(cConflictCheckTimerObj* TimerObj, cConflictCheck* ConflictCheck)
 :cOsdMenu(tr("Timer conflicts"), 2, 4, 13, 3, 2)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcTimerEdit);
-#endif
     timerObj = TimerObj;
     checktime = timerObj->conflCheckTime;
     conflictCheck = ConflictCheck;
@@ -272,28 +264,21 @@ eOSState cMenuConflictCheckDetails::Commands(eKeys Key)
 
 eOSState cMenuConflictCheckDetails::ToggleTimer(cConflictCheckTimerObj* TimerObj)
 {
-  cTimers *vdrtimers;
-#if VDRVERSNUM > 20300
   LOCK_TIMERS_WRITE;
-  vdrtimers = Timers;
-#else
-  vdrtimers = &Timers;
-#endif
-  if (!TimerObj || !TimerObj->OrigTimer(vdrtimers)) return osContinue;
-  TimerObj->OrigTimer(vdrtimers)->OnOff();  // Toggles Timer Flag
-#if VDRVERSNUM < 20300
-  vdrtimers->SetModified();
-#endif
-  Update(vdrtimers);
+  Timers->SetExplicitModify();
+  if (!TimerObj || !TimerObj->OrigTimer(Timers)) return osContinue;
+  TimerObj->OrigTimer(Timers)->OnOff();  // Toggles Timer Flag
+  Timers->SetModified();
+  Update();
   Display();
   return osContinue;
 }
 
-bool cMenuConflictCheckDetails::Update(const cTimers* vdrtimers, bool Force)
+bool cMenuConflictCheckDetails::Update(bool Force)
 {
     bool result = false;
     for (cOsdItem *item = First(); item; item = Next(item)) {
-	if (item->Selectable() && ((cMenuConflictCheckDetailsItem *)item)->Update(vdrtimers, Force))
+	if (item->Selectable() && ((cMenuConflictCheckDetailsItem *)item)->Update(Force))
 	    result = true;
     }
     return result;
@@ -301,34 +286,24 @@ bool cMenuConflictCheckDetails::Update(const cTimers* vdrtimers, bool Force)
 
 eOSState cMenuConflictCheckDetails::DeleteTimer(cConflictCheckTimerObj* TimerObj)
 {
-#if VDRVERSNUM > 20300
   LOCK_TIMERS_WRITE;
-  cTimers *vdrtimers = Timers;
-#else
-  cTimers *vdrtimers = &Timers;
-#endif
-  cTimer* timer = TimerObj->OrigTimer(vdrtimers);
+  Timers->SetExplicitModify();
+  cTimer* timer = TimerObj->OrigTimer(Timers);
   // Check if this timer is active:
   if (timer) {
     if (Interface->Confirm(trVDR("Delete timer?"))) {
       if (timer->Recording()) {
 	if (Interface->Confirm(trVDR("Timer still recording - really delete?"))) {
 	  timer->Skip();
-#if VDRVERSNUM > 20300
-	  cRecordControls::Process(vdrtimers, time(NULL));
-#else
-	  cRecordControls::Process(time(NULL));
-#endif
+	  cRecordControls::Process(Timers, time(NULL));
 	}
 	else
 	  return osContinue;
       }
       LogFile.iSysLog("deleting timer %s", *timer->ToDescr());
-      vdrtimers->Del(timer);
+      Timers->Del(timer);
       cOsdMenu::Del(Current());
-#if VDRVERSNUM < 20300
-      vdrtimers->SetModified();
-#endif
+      Timers->SetModified();
       Display();
       return osBack;
     }
@@ -346,13 +321,11 @@ eOSState cMenuConflictCheckDetails::ShowSummary()
     const cEvent *ei = curTimerObj->Event();
     if (ei)
     {
-#if VDRVERSNUM > 20300
+	const cChannel *channel;
+	{
 	LOCK_CHANNELS_READ;
-	const cChannels *vdrchannels = Channels;
-#else
-	cChannels *vdrchannels = &Channels;
-#endif
-	const cChannel *channel = vdrchannels->GetByChannelID(ei->ChannelID(), true, true);
+	channel = Channels->GetByChannelID(ei->ChannelID(), true, true);
+	}
 	if (channel)
 	    return AddSubMenu(new cMenuEventSearchSimple(ei, eventObjects));
     }
@@ -441,16 +414,11 @@ eOSState cMenuConflictCheckDetails::ProcessKey(eKeys Key)
 		for (it = timerObj->concurrentTimers->begin(); it != timerObj->concurrentTimers->end(); ++it)
 		{
 		    bool found = false;
-#if VDRVERSNUM > 20300
-		    LOCK_TIMERS_WRITE;
-		    cTimers *vdrtimers = Timers;
-#else
-		    cTimers *vdrtimers = &Timers;
-#endif
-		    for(cTimer* checkT = vdrtimers->First(); checkT; checkT = vdrtimers->Next(checkT))
+		    LOCK_TIMERS_READ;
+		    for(const cTimer* checkT = Timers->First(); checkT; checkT = Timers->Next(checkT))
 		    {
 			checkT->Matches();
-			if (checkT == (*it)->OrigTimer(vdrtimers)) // ok -> found, check for changes
+			if (checkT == (*it)->OrigTimer(Timers)) // ok -> found, check for changes
 			{
 			    if (checkT->IsSingleEvent())
 			    {
@@ -483,13 +451,7 @@ eOSState cMenuConflictCheckDetails::ProcessKey(eKeys Key)
 
 	if (Key != kNone)
 	    SetHelpKeys();
-#if VDRVERSNUM > 20300
-        LOCK_TIMERS_READ;
-        const cTimers *vdrtimers = Timers;
-#else
-        cTimers *vdrtimers = &Timers;
-#endif
-	if ((HadSubMenu || gl_TimerProgged) && Update(vdrtimers, true))
+	if ((HadSubMenu || gl_TimerProgged) && Update(true))
 	{
 	    if (gl_TimerProgged) // when using epgsearch's timer edit menu, update is delayed because of SVDRP
 	    {
diff --git a/menu_conflictcheck.h b/menu_conflictcheck.h
index e7a858e..e8d48d0 100644
--- a/menu_conflictcheck.h
+++ b/menu_conflictcheck.h
@@ -56,7 +56,7 @@ class cMenuConflictCheckDetailsItem : public cOsdItem {
 public:
     cConflictCheckTimerObj* timerObj;
     cMenuConflictCheckDetailsItem(cConflictCheckTimerObj* TimerObj = NULL);
-    bool Update(const cTimers *vdrtimers, bool Force = false);
+    bool Update(bool Force = false);
 };
 
 // --- cMenuConflictCheckDetails ------------------------------------------------------
@@ -73,7 +73,7 @@ private:
     void SetHelpKeys();
     eOSState ToggleTimer(cConflictCheckTimerObj* TimerObj);
     eOSState DeleteTimer(cConflictCheckTimerObj* TimerObj);
-    bool Update(const cTimers* vdrtimers, bool Force = false);
+    bool Update(bool Force = false);
     bool BuildList();
     eOSState ShowSummary();
     void UpdateCurrent();
diff --git a/menu_deftimercheckmethod.c b/menu_deftimercheckmethod.c
index c776c43..ce37dd5 100644
--- a/menu_deftimercheckmethod.c
+++ b/menu_deftimercheckmethod.c
@@ -118,11 +118,9 @@ void cDefTimerCheckModes::SetMode(const cChannel* channel, int mode)
 // --- cMenuDefTimerCheckMethod ---------------------------------------------------------
 
 cMenuDefTimerCheckMethod::cMenuDefTimerCheckMethod()
-    :cOsdMenu(tr("Default timer check method"), 20)
+:cOsdMenu(tr("Default timer check method"), 20)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSetupPlugins);
-#endif
     CheckModes[0] = tr("no check");
     CheckModes[UPD_CHDUR] = tr("by channel and time");
     CheckModes[UPD_EVENTID] = tr("by event ID");
@@ -142,15 +140,10 @@ void cMenuDefTimerCheckMethod::Set()
     Clear();
 
     delete modes;
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    modes = new int[vdrchannels->Count()];
+    modes = new int[Channels->Count()];
     int i=0;
-    for (const cChannel *channel = vdrchannels->First(); channel; channel = vdrchannels->Next(channel), i++)
+    for (const cChannel *channel = Channels->First(); channel; channel = Channels->Next(channel), i++)
     {
 	if (!channel->GroupSep() && *channel->Name())
 	{
@@ -170,13 +163,8 @@ eOSState cMenuDefTimerCheckMethod::ProcessKey(eKeys Key)
 	    case kOk:
 	    {
 		int i=0;
-#if VDRVERSNUM > 20300
 		LOCK_CHANNELS_READ;
-		const cChannels *vdrchannels = Channels;
-#else
-		cChannels *vdrchannels = &Channels;
-#endif
-		for (const cChannel *channel = vdrchannels->First(); channel; channel = vdrchannels->Next(channel), i++)
+		for (const cChannel *channel = Channels->First(); channel; channel = Channels->Next(channel), i++)
 		    if (!channel->GroupSep() && *channel->Name())
 			DefTimerCheckModes.SetMode(channel, modes[i]);
 		DefTimerCheckModes.Save();
diff --git a/menu_dirselect.c b/menu_dirselect.c
index 3064c09..4f9cfc4 100644
--- a/menu_dirselect.c
+++ b/menu_dirselect.c
@@ -62,11 +62,9 @@ int cMenuDirItem::Compare(const cListObject &ListObject) const
 // --- cMenuDirSelect ---------------------------------------------------------
 
 cMenuDirSelect::cMenuDirSelect(char* szDirectory)
-    :cOsdMenu(tr("Select directory"))
+:cOsdMenu(tr("Select directory"))
 {
-#if VDRVERSNUM >= 10733
   SetMenuCategory(mcTimerEdit);
-#endif
 
     Directory = szDirectory;
     yellow=NULL;
@@ -103,7 +101,7 @@ int cMenuDirSelect::Level(const char* szDir)
 void cMenuDirSelect::AddDistinct(const char* szText)
 {
     int iLevel = Level(szText);
-    MaxLevel = max(MaxLevel, iLevel);
+    MaxLevel = std::max(MaxLevel, iLevel);
 
     if (iLevel > CurLevel) // only show Items of the specified level, except those with vars
 	return;
@@ -132,15 +130,9 @@ void cMenuDirSelect::CreateDirSet(bool extraDirs)
     directorySet.clear();
 
     // add distinct directories from current recordings
-#if VDRVERSNUM > 20300
+	{
     LOCK_RECORDINGS_READ;
-    const cRecordings *vdrrecordings = Recordings;
-#else
-    cRecordings *vdrrecordings = &Recordings;
-    if (Recordings.Count() == 0)
-	Recordings.Load();
-#endif
-    for (const cRecording *recording = vdrrecordings->First(); recording; recording = vdrrecordings->Next(recording))
+    for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording))
     {
 	if (recording->HierarchyLevels() > 0)
 	{
@@ -161,14 +153,11 @@ void cMenuDirSelect::CreateDirSet(bool extraDirs)
 	    free(dir);
 	}
     }
+	} // give up Recordings Lock
     // add distinct directories from current timers
-#if VDRVERSNUM > 20300
-    LOCK_TIMERS_READ;
-    const cTimers *vdrtimers = Timers;
-#else
-    const cTimers *vdrtimers = &Timers;
-#endif
-    for (const cTimer *timer = vdrtimers->First(); timer; timer = vdrtimers->Next(timer))
+	{
+	LOCK_TIMERS_READ;
+    for (const cTimer *timer = Timers->First(); timer; timer = Timers->Next(timer))
     {
 	char* dir = strdup(timer->File());
 	// strip the trailing name dir
@@ -188,12 +177,11 @@ void cMenuDirSelect::CreateDirSet(bool extraDirs)
 	}
 	free(dir);
     }
+	}
 
-#if APIVERSNUM >= 10712
     // add distinct directories from folders.conf
     for(cNestedItem* item = Folders.First(); item; item = Folders.Next(item))
       AddVDRFolders(item);
-#endif
 
     if (extraDirs)
       {
@@ -224,7 +212,6 @@ void cMenuDirSelect::CreateDirSet(bool extraDirs)
       }
 }
 
-#if APIVERSNUM >= 10712
 void cMenuDirSelect::AddVDRFolders(cNestedItem* folder, string parentDirectory)
 {
   if (folder == NULL) return;
@@ -234,7 +221,6 @@ void cMenuDirSelect::AddVDRFolders(cNestedItem* folder, string parentDirectory)
   for(cNestedItem* subfolder = folder->SubItems()->First(); subfolder; subfolder = folder->SubItems()->Next(subfolder))
     AddVDRFolders(subfolder, folderDirectory);
 }
-#endif
 
 void cMenuDirSelect::Load()
 {
diff --git a/menu_dirselect.h b/menu_dirselect.h
index a9e9fa6..c1d9aa3 100644
--- a/menu_dirselect.h
+++ b/menu_dirselect.h
@@ -63,9 +63,7 @@ private:
     ~cMenuDirSelect();
     void Load();
     void AddDistinct(const char* szText);
-#if APIVERSNUM >= 10712
     static void AddVDRFolders(cNestedItem* folder, string parentDirectory = "");
-#endif
     virtual eOSState ProcessKey(eKeys Key);
     int Level(const char* szDir);
     void ReplaceDirVars();
diff --git a/menu_event.c b/menu_event.c
index 7c29114..e94b54a 100644
--- a/menu_event.c
+++ b/menu_event.c
@@ -29,14 +29,12 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 #include "epgsearchtools.h"
 
 // --- cMenuEventSearch ------------------------------------------------------------
-cMenuEventSearch::cMenuEventSearch(const cEvent* Event, cEventObjects& EventObjects,  MenuEventSurfMode SurfMode)
-   :cOsdMenu(tr("Event")),
-   eventObjects(EventObjects),
-   surfMode(SurfMode)
+cMenuEventSearch::cMenuEventSearch(const cEvent* Event, cEventObjects& EventObjects, MenuEventSurfMode SurfMode)
+:cOsdMenu(tr("Event")),
+eventObjects(EventObjects),
+surfMode(SurfMode)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcEvent);
-#endif
 
    eventObjects.SetCurrent(Event);
    szGreen = szYellow = NULL;
@@ -84,13 +82,9 @@ void cMenuEventSearch::Set()
 
    if (event)
    {
-#if VDRVERSNUM > 20300
+	  LOCK_TIMERS_READ;
       LOCK_CHANNELS_READ;
-      const cChannels *vdrchannels = Channels;
-#else
-      cChannels *vdrchannels = &Channels;
-#endif
-      const cChannel *channel = vdrchannels->GetByChannelID(event->ChannelID(), true, true);
+      const cChannel *channel = Channels->GetByChannelID(event->ChannelID(), true, true);
       bool canSwitch = false;
       if (channel)
       {
@@ -102,13 +96,7 @@ void cMenuEventSearch::Set()
       cEventObj* eventObjNext = GetNext(event);
 
       eTimerMatch timerMatch = tmNone;
-#if VDRVERSNUM > 20300
-      LOCK_TIMERS_READ;
-      const cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
-      vdrtimers->GetMatch(event, &timerMatch);
+      Timers->GetMatch(event, &timerMatch);
       const char* szRed = trVDR("Button$Record");
       if (timerMatch == tmFull)
          szRed = trVDR("Button$Timer");
@@ -124,9 +112,9 @@ void cMenuEventSearch::Set()
       else if (surfMode == SurfModeChannel)
       {
          if (eventObjPrev && eventObjPrev->Event())
-            szGreen = strdup(CHANNELNAME(vdrchannels->GetByChannelID(eventObjPrev->Event()->ChannelID(), true, true)));
+            szGreen = strdup(CHANNELNAME(Channels->GetByChannelID(eventObjPrev->Event()->ChannelID(), true, true)));
          if (eventObjNext && eventObjNext->Event())
-            szYellow = strdup(CHANNELNAME(vdrchannels->GetByChannelID(eventObjNext->Event()->ChannelID(), true, true)));
+            szYellow = strdup(CHANNELNAME(Channels->GetByChannelID(eventObjNext->Event()->ChannelID(), true, true)));
          SetHelp(szRed, szGreen, szYellow, canSwitch ? trVDR("Button$Switch") : NULL);
       }
    }
@@ -248,13 +236,8 @@ void cMenuEventSearchSimple::Set()
 
    if (event)
    {
-#if VDRVERSNUM > 20300
       LOCK_CHANNELS_READ;
-      const cChannels *vdrchannels = Channels;
-#else
-      cChannels *vdrchannels = &Channels;
-#endif
-      const cChannel *channel = vdrchannels->GetByChannelID(event->ChannelID(), true, true);
+      const cChannel *channel = Channels->GetByChannelID(event->ChannelID(), true, true);
       if (channel)
       {
          SetTitle(channel->Name());
diff --git a/menu_favorites.c b/menu_favorites.c
index f04aea2..a4115c9 100644
--- a/menu_favorites.c
+++ b/menu_favorites.c
@@ -122,13 +122,8 @@ eOSState cMenuFavorites::OnYellow()
       cMenuSearchResultsItem *item = (cMenuSearchResultsItem *)Get(Current());
       if (item && item->event)
       {
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
-         const cChannel *channel = vdrchannels->GetByChannelID(item->event->ChannelID(), true, true);
+         const cChannel *channel = Channels->GetByChannelID(item->event->ChannelID(), true, true);
          cMenuWhatsOnSearch::scheduleChannel = channel;
          cMenuWhatsOnSearch::currentShowMode = showNow;
       }
diff --git a/menu_main.c b/menu_main.c
index 69af173..d392e20 100644
--- a/menu_main.c
+++ b/menu_main.c
@@ -49,28 +49,18 @@ int cMenuSearchMain::forceMenu = 0; // 1 = now, 2 = schedule, 3 = summary
 cMenuSearchMain::cMenuSearchMain(void)
 :cOsdMenu("", GetTab(1), GetTab(2), GetTab(3), GetTab(4), GetTab(5))
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcSchedule);
-#endif
   helpKeys = -1;
   otherChannel = 0;
   toggleKeys = 0;
   shiftTime = 0;
   InWhatsOnMenu = false;
   InFavoritesMenu = false;
-#if VDRVERSNUM > 20300
+  const cChannel *channel;
+  {
   LOCK_CHANNELS_READ;
-  const cChannels *vdrchannels = Channels;
-#else
-  cChannels *vdrchannels = &Channels;
-#endif
-  const cChannel *channel = vdrchannels->GetByNumber(cDevice::CurrentChannel());
-#if VDRVERSNUM > 20300
-  LOCK_SCHEDULES_READ;
-  schedules = Schedules;
-#else
-  schedules = cSchedules::Schedules(schedulesLock);
-#endif
+  channel = Channels->GetByNumber(cDevice::CurrentChannel());
+  }
   if (channel) {
     cMenuWhatsOnSearch::SetCurrentChannel(channel->Number());
     if (EPGSearchConfig.StartMenu == 0 || forceMenu != 0)
@@ -83,10 +73,10 @@ cMenuSearchMain::cMenuSearchMain(void)
 
   }
   if ((EPGSearchConfig.StartMenu == 1 || forceMenu == 1) && forceMenu != 2)
-    {
+	  {
       InWhatsOnMenu = true;
-      AddSubMenu(new cMenuWhatsOnSearch(schedules, cDevice::CurrentChannel()));
-    }
+      AddSubMenu(new cMenuWhatsOnSearch(cDevice::CurrentChannel()));
+		}
   if (forceMenu == 3)
       ShowSummary();
 }
@@ -128,8 +118,12 @@ void cMenuSearchMain::PrepareSchedule(const cChannel *Channel)
     cMenuTemplate* ScheduleTemplate = cTemplFile::GetTemplateByName("MenuSchedule");
     eventObjects.Clear();
 
-   if (schedules) {
-	const cSchedule *Schedule = schedules->GetSchedule(Channel);
+		LOCK_TIMERS_READ;
+	const cSchedule *Schedule;
+	{
+	LOCK_SCHEDULES_READ;
+	Schedule = Schedules->GetSchedule(Channel);
+	}
 	currentChannel = Channel->Number();
 	if (Schedule && Schedule->Events()->First())
 	{
@@ -154,17 +148,16 @@ void cMenuSearchMain::PrepareSchedule(const cChannel *Channel)
 			struct tm *t_event = localtime_r(&EventDate, &tm_rEvent);
 			struct tm *t_lastevent = localtime_r(&lastEventDate, &tm_rLastEvent);
 			if (t_event->tm_mday != t_lastevent->tm_mday)
-			  Add(new cMenuMyScheduleSepItem(Event));
+			  Add(new cMenuMyScheduleSepItem(NULL, Event));
 			lastEventDate = EventDate;
 		    }
-		    Add(new cMenuMyScheduleItem(Event, NULL, showNow, ScheduleTemplate), Event == PresentEvent);
+		    Add(new cMenuMyScheduleItem(Timers, Event, NULL, showNow, ScheduleTemplate), Event == PresentEvent);
 		    eventObjects.Add(Event);
 		}
             }
 	    //	    	    timeb tnow;
 		    //	    ftime(&tnow);
 		    //	    isyslog("duration epgs prepsched:  %d (%d)", tnow.millitm - tstart.millitm + ((tnow.millitm - tstart.millitm<0)?1000:0), Count());
-        }
     }
     if (shiftTime)
     {
@@ -174,11 +167,12 @@ void cMenuSearchMain::PrepareSchedule(const cChannel *Channel)
     }
 }
 
-bool cMenuSearchMain::Update(const cTimers* vdrtimers)
+bool cMenuSearchMain::Update(void)
 {
   bool result = false;
+	LOCK_TIMERS_READ;
   for (cOsdItem *item = First(); item; item = Next(item)) {
-      if (item->Selectable() && ((cMenuMyScheduleItem *)item)->Update(vdrtimers))
+      if (item->Selectable() && ((cMenuMyScheduleItem *)item)->Update(Timers))
          result = true;
       }
   return result;
@@ -188,16 +182,13 @@ eOSState cMenuSearchMain::Record(void)
 {
   cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)Get(Current());
   if (item) {
-#if VDRVERSNUM > 20300
-      LOCK_TIMERS_WRITE;
-      cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
+	  cTimer *timer, *t;
+	  {
+      LOCK_TIMERS_READ;
       if (item->timerMatch == tmFull)
       {
 	  eTimerMatch tm = tmNone;
-	  cTimer *timer = vdrtimers->GetMatch(item->event, &tm);
+	  cTimer *timer = (cTimer*)Timers->GetMatch(item->event, &tm);
 	  if (timer)
 	    {
 	      if (EPGSearchConfig.useVDRTimerEditMenu)
@@ -207,9 +198,11 @@ eOSState cMenuSearchMain::Record(void)
 	    }
       }
 
-     cTimer *timer = new cTimer(item->event);
+     timer = new cTimer(item->event);
      PrepareTimerFile(item->event, timer);
-     cTimer *t = vdrtimers->GetTimer(timer);
+
+     t = (cTimer*)Timers->GetTimer(timer);
+	  } // release TIMERS_READ
      if (EPGSearchConfig.onePressTimerCreation == 0 || t || !item->event || (!t && item->event && item->event->StartTime() - (Setup.MarginStart+2) * 60 < time(NULL)))
      {
 	 if (t)
@@ -246,17 +239,22 @@ eOSState cMenuSearchMain::Record(void)
 #endif
 
 	 SetAux(timer, fullaux);
-	 vdrtimers->Add(timer);
+         if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+                      timer->SetRemote(Setup.SVDRPDefaultHost);
+            LOCK_TIMERS_WRITE;
+	        Timers->Add(timer); // implicit SetModified
 	 gl_timerStatusMonitor->SetConflictCheckAdvised();
 	 timer->Matches();
-#if VDRVERSNUM < 20300
-	 vdrtimers->SetModified();
-#endif
+         if (!HandleRemoteTimerModifications(timer)) {
+            ERROR(tr("Epgsearch: RemoteTimerModifications failed"));
+			Timers->Del(timer);
+         }
+				 else
 	 LogFile.iSysLog("timer %s added (active)", *timer->ToDescr());
 
 	 if (HasSubMenu())
 	     CloseSubMenu();
-	 if (Update(vdrtimers))
+	 if (Update())
 	     Display();
 	 SetHelpKeys();
      }
@@ -268,13 +266,8 @@ eOSState cMenuSearchMain::Switch(void)
 {
   cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)Get(Current());
   if (item) {
-#if VDRVERSNUM > 20300
      LOCK_CHANNELS_READ;
-     const cChannels *vdrchannels = Channels;
-#else
-     cChannels *vdrchannels = &Channels;
-#endif
-     const cChannel *channel = vdrchannels->GetByChannelID(item->event->ChannelID(), true, true);
+     const cChannel *channel = Channels->GetByChannelID(item->event->ChannelID(), true, true);
      if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true))
         return osEnd;
      }
@@ -331,14 +324,9 @@ void cMenuSearchMain::SetHelpKeys(bool Force)
 	  SetHelp((EPGSearchConfig.redkeymode==0?(hasTimer?trVDR("Button$Timer"):trVDR("Button$Record")):tr("Button$Commands")), trVDR("Button$Now"), trVDR("Button$Next"), EPGSearchConfig.bluekeymode==0?trVDR("Button$Switch"):tr("Button$Search"));
 	else
 	  {
-#if VDRVERSNUM > 20300
      LOCK_CHANNELS_READ;
-     const cChannels *vdrchannels = Channels;
-#else
-     cChannels *vdrchannels = &Channels;
-#endif
-	    const char* szGreenToggled = CHANNELNAME(vdrchannels->GetByNumber(currentChannel-1,-1));
-	    const char* szYellowToggled = CHANNELNAME(vdrchannels->GetByNumber(currentChannel+1,1));
+	    const char* szGreenToggled = CHANNELNAME(Channels->GetByNumber(currentChannel-1,-1));
+	    const char* szYellowToggled = CHANNELNAME(Channels->GetByNumber(currentChannel+1,1));
 
 	    SetHelp((EPGSearchConfig.redkeymode==1?(hasTimer?trVDR("Button$Timer"):trVDR("Button$Record")):tr("Button$Commands")), (EPGSearchConfig.toggleGreenYellow==0?trVDR("Button$Now"):szGreenToggled), (EPGSearchConfig.toggleGreenYellow==0?trVDR("Button$Next"):szYellowToggled), EPGSearchConfig.bluekeymode==1?trVDR("Button$Switch"):tr("Button$Search"));
 
@@ -350,13 +338,8 @@ void cMenuSearchMain::SetHelpKeys(bool Force)
 eOSState cMenuSearchMain::Shift(int iMinutes)
 {
     shiftTime += iMinutes;
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel *channel = vdrchannels->GetByNumber(currentChannel);
+    const cChannel *channel = Channels->GetByNumber(currentChannel);
     PrepareSchedule(channel);
     Display();
     SetHelpKeys();
@@ -453,8 +436,7 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 		 state = osContinue;
 	     break;
 	 case kGreen:
-	     if (schedules)
-	     {
+		 {
 		 if (HasSubMenu() && !InWhatsOnMenu && !InFavoritesMenu)
 		 {
 		     if (Count())
@@ -470,13 +452,8 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 			 cMenuMyScheduleItem* Item = (cMenuMyScheduleItem *)Get(Current());
 			 if (Item && Item->event)
 			 {
-#if VDRVERSNUM > 20300
-			     LOCK_CHANNELS_READ;
-			     const cChannels *vdrchannels = Channels;
-#else
-			     cChannels *vdrchannels = &Channels;
-#endif
-			     const cChannel *channel = vdrchannels->GetByChannelID(Item->event->ChannelID(), true, true);
+				 LOCK_CHANNELS_READ;
+			     const cChannel *channel = Channels->GetByChannelID(Item->event->ChannelID(), true, true);
 			     if (channel)
 				 ChannelNr = channel->Number();
 			 }
@@ -489,18 +466,16 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 		     else
 		     {
 			 InWhatsOnMenu = true;
-			 return AddSubMenu(new cMenuWhatsOnSearch(schedules, ChannelNr));
+			 return AddSubMenu(new cMenuWhatsOnSearch(ChannelNr));
 		     }
 		 }
 		 else
 		 {
-#if VDRVERSNUM > 20300
-		     LOCK_CHANNELS_READ;
-		     const cChannels *vdrchannels = Channels;
-#else
-		     cChannels *vdrchannels = &Channels;
-#endif
-		     const cChannel *channel = vdrchannels->GetByNumber(currentChannel-1,-1);
+			 const cChannel *channel;
+			 {
+			 LOCK_CHANNELS_READ;
+		     channel = Channels->GetByNumber(currentChannel-1,-1);
+			 }
 
 		     if (channel) {
 			 PrepareSchedule(channel);
@@ -512,10 +487,9 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 		     SetHelpKeys(true);
 		     return osContinue;
 		 }
-	     }
+		 }
 	 case kYellow:
-	     if (schedules)
-	     {
+		 {
 		 if (HasSubMenu())
 		 {
 		     if (Count())
@@ -528,17 +502,15 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 		 {
 		     cMenuWhatsOnSearch::currentShowMode = showNext;
 		     InWhatsOnMenu = true;
-		     return AddSubMenu(new cMenuWhatsOnSearch(schedules, cMenuWhatsOnSearch::CurrentChannel()));
+		     return AddSubMenu(new cMenuWhatsOnSearch(cMenuWhatsOnSearch::CurrentChannel()));
 		 }
 		 else
 		 {
-#if VDRVERSNUM > 20300
-		     LOCK_CHANNELS_READ;
-		     const cChannels *vdrchannels = Channels;
-#else
-		     cChannels *vdrchannels = &Channels;
-#endif
-		     const cChannel *channel = vdrchannels->GetByNumber(currentChannel+1,1);
+			 const cChannel *channel;
+			 {
+			 LOCK_CHANNELS_READ;
+		     channel = Channels->GetByNumber(currentChannel+1,1);
+			 }
 		     if (channel) {
 			 PrepareSchedule(channel);
 			 if (channel->Number() != cDevice::CurrentChannel()) {
@@ -549,8 +521,8 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 		     SetHelpKeys(true);
 		     return osContinue;
 		 }
-	     }
 	     break;
+		 }
 	 case kBlue:
         if (HasSubMenu())
         {
@@ -575,12 +547,6 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
       const cChannel *ch = cMenuWhatsOnSearch::ScheduleChannel();
       InWhatsOnMenu = false;
       InFavoritesMenu = false;
-#if VDRVERSNUM > 20300
-      LOCK_TIMERS_READ;
-      const cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
       if (ch) {
 	// when switch from the other menus to the schedule, try to keep the same time
        	if (cMenuWhatsOnSearch::shiftTime)
@@ -597,7 +563,7 @@ eOSState cMenuSearchMain::ProcessKey(eKeys Key)
 	}
 	Display();
       }
-      else if ((HadSubMenu || gl_TimerProgged) && Update(vdrtimers))
+      else if ((HadSubMenu || gl_TimerProgged) && Update())
       {
 	  if (gl_TimerProgged) // when using epgsearch's timer edit menu, update is delayed because of SVDRP
 	  {
diff --git a/menu_main.h b/menu_main.h
index 26452bf..96567a1 100644
--- a/menu_main.h
+++ b/menu_main.h
@@ -32,8 +32,6 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 class cMenuSearchMain : public cOsdMenu {
  private:
   int helpKeys;
-  cSchedulesLock schedulesLock;
-  const cSchedules *schedules;
   int otherChannel;
   int currentChannel;
   eOSState Record(void);
@@ -53,7 +51,7 @@ class cMenuSearchMain : public cOsdMenu {
   eOSState Switch(void);
   eOSState Shift(int iMinutes);
   eOSState ShowSummary();
-  bool Update(const cTimers *vdrtimers);
+  bool Update(void);
   void UpdateCurrent();
 #ifdef USE_GRAPHTFT
   virtual const char* MenuKind() { return "MenuEpgsSchedule"; }
diff --git a/menu_myedittimer.c b/menu_myedittimer.c
index a9baaf6..238c3b1 100644
--- a/menu_myedittimer.c
+++ b/menu_myedittimer.c
@@ -40,20 +40,20 @@ const char *cMenuMyEditTimer::CheckModes[3];
 cMenuMyEditTimer::cMenuMyEditTimer(cTimer *Timer, bool New, const cEvent* Event, const cChannel* forcechannel)
 :cOsdMenu(trVDR("Edit timer"), 14)
 {
-#if VDRVERSNUM >= 10734
   SetMenuCategory(mcTimerEdit);
-#endif
     CheckModes[0] = tr("no check");
     CheckModes[UPD_CHDUR] = tr("by channel and time");
     CheckModes[UPD_EVENTID] = tr("by event ID");
 
     strcpy(file, "");
     strcpy(directory, "");
+    strcpy(remote, "");
     UserDefDaysOfWeek = 0;
     checkmode = 0;
     if (Timer)
     {
 	timer = Timer;
+	newtimer = *timer;
 	event = Event;
 	flags = Timer->Flags();
 	day = Timer->Day();
@@ -68,6 +68,8 @@ cMenuMyEditTimer::cMenuMyEditTimer(cTimer *Timer, bool New, const cEvent* Event,
 #ifdef USE_PINPLUGIN
 	fskProtection = Timer->FskProtection();
 #endif
+	if (Timer->Remote())
+	    strcpy(remote, Timer->Remote());
 	if (forcechannel)
 	    channel = forcechannel->Number();
 	SplitFile();
@@ -76,9 +78,6 @@ cMenuMyEditTimer::cMenuMyEditTimer(cTimer *Timer, bool New, const cEvent* Event,
 	Set();
 	SetHelp(addIfConfirmed?NULL:trVDR("Button$Delete"), NULL, NULL, NULL);
     }
-#if VDRVERSNUM < 20300
-  Timers.IncBeingEdited();
-#endif
 }
 
 void cMenuMyEditTimer::SplitFile()
@@ -132,13 +131,8 @@ void cMenuMyEditTimer::Set()
 #ifdef USE_PINPLUGIN
     if (cOsd::pinValid || !fskProtection) Add(new cMenuEditChanItem(tr("Channel"), &channel));
     else {
-#if VDRVERSNUM > 20300
-        LOCK_CHANNELS_READ;
-        const cChannels *vdrchannels = Channels;
-#else
-        cChannels *vdrchannels = &Channels;
-#endif
-      cString buf = cString::sprintf("%s\t%s", tr("Channel"), vdrchannels->GetByNumber(channel)->Name());
+      LOCK_CHANNELS_READ;
+      cString buf = cString::sprintf("%s\t%s", tr("Channel"), Channels->GetByNumber(channel)->Name());
       Add(new cOsdItem(buf));
     }
 #else
@@ -161,7 +155,11 @@ void cMenuMyEditTimer::Set()
       Add(new cOsdItem(buf));
     }
 #endif
-
+	if (GetSVDRPServerNames(&svdrpServerNames)) {
+	  svdrpServerNames.Sort(true);
+	  svdrpServerNames.Insert(strdup(""));
+	  Add(new cMenuEditStrlItem(tr("Record on"), remote, sizeof(remote),  &svdrpServerNames));
+	}
     if (search)
     {
 	cMenuEditStrItem* searchtimerItem = new cMenuEditStrItem( tr("Search timer"), search->search, MaxFileName, tr(AllowedChars));
@@ -170,13 +168,10 @@ void cMenuMyEditTimer::Set()
     }
     else if (IsSingleEvent() && event)
     {
-#if VDRVERSNUM > 20300
+		{
 	LOCK_CHANNELS_READ;
-	const cChannels *vdrchannels = Channels;
-#else
-	cChannels *vdrchannels = &Channels;
-#endif
-	checkmode = DefTimerCheckModes.GetMode(vdrchannels->GetByNumber(channel));
+	checkmode = DefTimerCheckModes.GetMode(Channels->GetByNumber(channel));
+		}
 	char* checkmodeAux = GetAuxValue(timer, "update");
 	if (checkmodeAux)
 	{
@@ -210,9 +205,6 @@ cMenuMyEditTimer::~cMenuMyEditTimer()
 {
   if (timer && addIfConfirmed)
      delete timer; // apparently it wasn't confirmed
-#if VDRVERSNUM < 20300
-  Timers.DecBeingEdited();
-#endif
 }
 
 void cMenuMyEditTimer::HandleSubtitle()
@@ -249,43 +241,35 @@ bool cMenuMyEditTimer::IsSingleEvent(void) const
 eOSState cMenuMyEditTimer::DeleteTimer()
 {
     // Check if this timer is active:
-#if VDRVERSNUM > 20300
     LOCK_TIMERS_WRITE;
-    cTimers *vdrtimers = Timers;
-#else
-    cTimers *vdrtimers = &Timers;
-#endif
+    Timers->SetExplicitModify();
     if (timer && !addIfConfirmed) {
 	if (Interface->Confirm(trVDR("Delete timer?"))) {
 	    if (timer->Recording()) {
 		if (Interface->Confirm(trVDR("Timer still recording - really delete?"))) {
-		    timer->Skip();
-#if VDRVERSNUM > 20300
-		    cRecordControls::Process(vdrtimers, time(NULL));
-#else
-		    cRecordControls::Process(time(NULL));
-#endif
+			if (!timer->Remote()) {
+		        timer->Skip();
+		        cRecordControls::Process(Timers, time(NULL));
+			}
 		}
 		else
-		    return osContinue;
+		    timer = NULL;
 	    }
-	    LogFile.iSysLog("deleting timer %s", *timer->ToDescr());
-            if (vdrtimers)
-            {
-	       vdrtimers->Del(timer);
-
-	       gl_timerStatusMonitor->SetConflictCheckAdvised();
-#if VDRVERSNUM < 20300
-	       Timers.SetModified();
-#endif
-	       return osBack;
-            }
-            else
-            {
-               LogFile.iSysLog("EPGSEARCH deleting timer failed");
-            }
+		if (timer) {
+			if (!HandleRemoteTimerModifications(NULL, timer))
+			{
+				LogFile.Log(2,"HandleRemoteTimerModifications failed");
+				return osContinue;
+			}
+	        LogFile.iSysLog("deleting timer %s", *timer->ToDescr());
+	        Timers->Del(timer);
+
+	        gl_timerStatusMonitor->SetConflictCheckAdvised();
+	        Timers->SetModified();
+	        return osBack;
         }
     }
+	}
     return osContinue;
 }
 
@@ -360,19 +344,6 @@ eOSState cMenuMyEditTimer::ProcessKey(eKeys Key)
 	{
 	    case kOk:
 	    {
-#if VDRVERSNUM > 20300
-		LOCK_CHANNELS_READ;
-		const cChannels *vdrchannels = Channels;
-#else
-		cChannels *vdrchannels = &Channels;
-#endif
-		const cChannel *ch = vdrchannels->GetByNumber(channel);
-		if (!ch)
-		{
-		  ERROR(tr("*** Invalid Channel ***"));
-		  break;
-		}
-
 		string fullaux = "";
         string aux = "";
 		if (timer && timer->Aux())
@@ -397,6 +368,14 @@ eOSState cMenuMyEditTimer::ProcessKey(eKeys Key)
 			aux = epgsearchaux;
 			free(epgsearchaux);
 		    }
+			LOCK_CHANNELS_READ;
+		    const cChannel *ch = Channels->GetByNumber(channel);
+		    if (!ch)
+		    {
+		         ERROR(tr("*** Invalid Channel ***"));
+		         break;
+		    }
+
 		    aux = UpdateAuxValue(aux, "channel", NumToString(ch->Number()) + " - " + CHANNELNAME(ch));
 		    aux = UpdateAuxValue(aux, "update", checkmode);
 		    aux = UpdateAuxValue(aux, "eventid", event->EventID());
@@ -420,18 +399,36 @@ eOSState cMenuMyEditTimer::ProcessKey(eKeys Key)
 		strreplace(tmpFile, ':', '|');
 		char* tmpDir = strdup(directory);
 		strreplace(tmpDir, ':', '|');
-		if (strlen(tmpFile) == 0)
-		{
-		    free(tmpFile);
-		    tmpFile = strdup(CHANNELNAME(ch));
-		}
 
                 if (timer)
                 {
+					LOCK_TIMERS_WRITE;
+					if (!addIfConfirmed && !Timers->Contains(timer))
+					{
+						if (cTimer *t = Timers->GetById(timer->Id(), timer->Remote()))
+							timer = t;
+						else
+						{
+							ERROR(tr("Timer has been deleted"));
+							break;
+						}
+					}
+				    LOCK_CHANNELS_READ;
+		            const cChannel *ch = Channels->GetByNumber(channel);
+		            if (!ch)
+		            {
+		                ERROR(tr("*** Invalid Channel ***"));
+		                break;
+		            }
+		            if (strlen(tmpFile) == 0)
+		            {
+		                free(tmpFile);
+		                tmpFile = strdup(CHANNELNAME(ch));
+		            }
                     cString cmdbuf;
                     cmdbuf = cString::sprintf("%d:%d:%s:%04d:%04d:%d:%d:%s%s%s:%s",
                        flags,
-                       ch->Number(),
+                       channel,
                        PRINTDAY(day, weekdays, true),
                        start,
                        stop,
@@ -442,32 +439,33 @@ eOSState cMenuMyEditTimer::ProcessKey(eKeys Key)
                        tmpFile,
                        fullaux.c_str());
 
-                    timer->Parse(cmdbuf);
+                    newtimer.Parse(cmdbuf);
 
                     free(tmpFile);
                     free(tmpDir);
 
-#if VDRVERSNUM > 20300
-                    {
-                    LOCK_TIMERS_WRITE;
-                    cTimers* vdrtimers = Timers;
-#else
-                    cTimers* vdrtimers = &Timers;
-#endif
-                    if (addIfConfirmed && vdrtimers != NULL)
-                      vdrtimers->Add(timer);
-#if VDRVERSNUM > 20300
+                    newtimer.SetRemote(*remote ? remote : NULL);
+                    if (addIfConfirmed) {
+					  *timer = newtimer;
+                      Timers->Add(timer);
+                      if (!HandleRemoteTimerModifications(timer)) {
+						 Timers->Del(timer);
+                         ERROR(tr("Epgsearch: RemoteTimerModifications failed"));
+												 return osContinue;
+                      }
                     }
+					else {
+					  if (!HandleRemoteTimerModifications(&newtimer, timer)) {
+						 return osContinue;
+					  }
+					  if (timer->Local() && timer->Recording() && newtimer.Remote())
+						 cRecordControls::Stop(timer);
+					  *timer = newtimer;
+					}
                     LOCK_SCHEDULES_READ;
                     timer->SetEventFromSchedule(Schedules);
-#else
-                    timer->SetEventFromSchedule();
-#endif
                     timer->Matches();
                     gl_timerStatusMonitor->SetConflictCheckAdvised();
-#if VDRVERSNUM < 20300
-                    Timers.SetModified();
-#endif
                     addIfConfirmed = false;
                 } else {
 		    free(tmpFile);
diff --git a/menu_myedittimer.h b/menu_myedittimer.h
index 537dafd..ce39270 100644
--- a/menu_myedittimer.h
+++ b/menu_myedittimer.h
@@ -26,11 +26,13 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 
 #include <vdr/menuitems.h>
 #include "timer_thread.h"
+#include <vdr/svdrp.h>
 
 // --- cMenuMyEditTimer --------------------------------------------------------
 class cMenuMyEditTimer : public cOsdMenu {
 private:
   cTimer *timer;
+  cTimer newtimer;
   const cEvent* event;
   int channel;
   bool addIfConfirmed;
@@ -49,6 +51,8 @@ private:
 #ifdef USE_PINPLUGIN
   int fskProtection;
 #endif
+  cStringList svdrpServerNames;
+  char remote[HOST_NAME_MAX];
   int checkmode;
 public:
   cMenuMyEditTimer(cTimer *Timer, bool New, const cEvent* event, const cChannel* forcechannel=NULL);
diff --git a/menu_quicksearch.c b/menu_quicksearch.c
index 53aeff5..cceaefa 100644
--- a/menu_quicksearch.c
+++ b/menu_quicksearch.c
@@ -248,13 +248,8 @@ eOSState cMenuQuickSearch::ProcessKey(eKeys Key)
 	    case kOk:
 		if (data.useChannel==1)
 		{
-#if VDRVERSNUM > 20300
 		    LOCK_CHANNELS_READ;
-		    const cChannels *vdrchannels = Channels;
-#else
-		    cChannels *vdrchannels = &Channels;
-#endif
-		    const cChannel *ch = vdrchannels->GetByNumber(channelMin);
+		    const cChannel *ch = Channels->GetByNumber(channelMin);
 		    if (ch)
 			data.channelMin = ch;
 		    else
@@ -262,7 +257,7 @@ eOSState cMenuQuickSearch::ProcessKey(eKeys Key)
 		      ERROR(tr("*** Invalid Channel ***"));
 		      break;
 		    }
-		    ch = vdrchannels->GetByNumber(channelMax);
+		    ch = Channels->GetByNumber(channelMax);
 		    if (ch)
 			data.channelMax = ch;
 		    else
diff --git a/menu_recsdone.c b/menu_recsdone.c
index d52551c..062f93d 100644
--- a/menu_recsdone.c
+++ b/menu_recsdone.c
@@ -71,9 +71,7 @@ int cMenuRecDoneItem::Compare(const cListObject &ListObject) const
 cMenuRecsDone::cMenuRecsDone(cSearchExt* Search)
 :cOsdMenu("", 16)
 {
-#if VDRVERSNUM >= 10734
-  SetMenuCategory(mcRecordingInfo);
-#endif
+  SetMenuCategory(mcUnknown);
     search = Search;
     showMode = SHOW_RECDONE_ALL;
     showEpisodeOnly = false;
diff --git a/menu_search.c b/menu_search.c
index 0261ff3..5aef353 100644
--- a/menu_search.c
+++ b/menu_search.c
@@ -108,9 +108,7 @@ int cMenuSearchExtItem::Compare(const cListObject &ListObject) const
 cMenuEPGSearchExt::cMenuEPGSearchExt()
 :cOsdMenu("", 2, 20, 11, 6, 5)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
 	cMutexLock SearchExtsLock(&SearchExts);
 	cSearchExt *SearchExt = SearchExts.First();
 	while (SearchExt) {
diff --git a/menu_searchactions.c b/menu_searchactions.c
index abf01ff..ef700cc 100644
--- a/menu_searchactions.c
+++ b/menu_searchactions.c
@@ -48,9 +48,7 @@ extern int updateForced;
 cMenuSearchActions::cMenuSearchActions(cSearchExt* Search, bool DirectCall)
 :cOsdMenu(tr("Search actions"))
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcCommand);
-#endif
     directCall = DirectCall;
     SetHasHotkeys();
 
diff --git a/menu_searchedit.c b/menu_searchedit.c
index 9328e5b..89c508d 100644
--- a/menu_searchedit.c
+++ b/menu_searchedit.c
@@ -47,11 +47,9 @@ cSearchExtCats SearchExtCats;
 
 // --- cMenuEditSearchExt --------------------------------------------------------
 cMenuEditSearchExt::cMenuEditSearchExt(cSearchExt *SearchExt, bool New, bool Template, bool FromEPG)
-   :cOsdMenu(tr("Edit search"),32)
+:cOsdMenu(tr("Edit search"),32)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
    templateMode = Template;
 
    SearchModes[0] = strdup(tr("phrase"));
@@ -80,6 +78,7 @@ cMenuEditSearchExt::cMenuEditSearchExt(cSearchExt *SearchExt, bool New, bool Tem
    SearchTimerModes[2] = strdup(tr("Switch only"));
    SearchTimerModes[3] = strdup(tr("Announce and switch"));
    SearchTimerModes[4] = strdup(tr("Announce by mail"));
+   SearchTimerModes[5] = strdup(tr("Inactive record"));
 
    BlacklistModes[0] = strdup(tr("only globals"));
    BlacklistModes[1] = strdup(tr("Selection"));
@@ -102,7 +101,6 @@ cMenuEditSearchExt::cMenuEditSearchExt(cSearchExt *SearchExt, bool New, bool Tem
    CompareDateModes[2] = strdup(tr("same week"));
    CompareDateModes[3] = strdup(tr("same month"));
 
-#if APIVERSNUM > 10710
    // collect content string IDs
    std::set<std::string> contentStrings;
    for(unsigned int i=0; i<CONTENT_DESCRIPTOR_MAX;i++)
@@ -114,7 +112,6 @@ cMenuEditSearchExt::cMenuEditSearchExt(cSearchExt *SearchExt, bool New, bool Tem
 	   contentStringIDs.push_back(i);
 	 }
      }
-#endif
    useContentDescriptors = false;
 
    if (!templateMode && New)
@@ -174,13 +171,11 @@ cMenuEditSearchExt::cMenuEditSearchExt(cSearchExt *SearchExt, bool New, bool Tem
       }
 
       contentStringsFlags = NULL;
-#if APIVERSNUM > 10710
       // set the flags for the content descriptors
       contentStringsFlags = (int*) malloc((CONTENT_DESCRIPTOR_MAX+1) * sizeof(int));
       for(unsigned int i=0; i<=CONTENT_DESCRIPTOR_MAX;i++)
 	contentStringsFlags[i] = data.HasContent(i);
       useContentDescriptors = (data.contentsFilter.size() > 0);
-#endif
 
       catarrayAvoidRepeats = NULL;
       catvaluesNumeric = NULL;
@@ -254,7 +249,6 @@ void cMenuEditSearchExt::Set()
    Add(new cMenuEditBoolItem( tr("Use description"), &data.useDescription, trVDR("no"), trVDR("yes")));
    AddHelp(tr("Help$Set this to 'Yes' if you like to search in the summary of an event."));
 
-#if APIVERSNUM > 10710
    Add(new cMenuEditBoolItem( tr("Use content descriptor"), &useContentDescriptors, trVDR("no"), trVDR("yes")));
    AddHelp(tr("Help$Set this to 'Yes' if you want to search the contents by a descriptor."));
    if (useContentDescriptors)
@@ -266,7 +260,6 @@ void cMenuEditSearchExt::Set()
 	   Add(new cMenuEditBoolItem(IndentMenuItem(tr(cEvent::ContentToString(contentStringIDs[i])), level), &contentStringsFlags[contentStringIDs[i]], trVDR("no"), trVDR("yes")));
 	 }
      }
-#endif
 
    // show Categories only if we have them
    if (SearchExtCats.Count() > 0)
@@ -353,7 +346,7 @@ void cMenuEditSearchExt::Set()
    Add(new cMenuEditStraItem( tr("Use as search timer"), &data.useAsSearchTimer, 3, SearchActiveModes));
    if (data.useAsSearchTimer)
    {
-      Add(new cMenuEditStraItem(IndentMenuItem(tr("Action")), &data.action, 5, SearchTimerModes));
+      Add(new cMenuEditStraItem(IndentMenuItem(tr("Action")), &data.action, 6, SearchTimerModes));
       if (data.action == searchTimerActionSwitchOnly)
       {
          Add(new cMenuEditIntItem(IndentMenuItem(tr("Switch ... minutes before start")), &data.switchMinsBefore, 0, 99));
@@ -364,7 +357,7 @@ void cMenuEditSearchExt::Set()
          Add(new cMenuEditIntItem(IndentMenuItem(tr("Ask ... minutes before start")), &data.switchMinsBefore, 0, 99));
          Add(new cMenuEditBoolItem(IndentMenuItem(tr("Unmute sound")), &data.unmuteSoundOnSwitch, trVDR("no"), trVDR("yes")));
       }
-      if (data.action == searchTimerActionRecord)
+      if ((data.action == searchTimerActionRecord) || (data.action == searchTimerActionInactiveRecord))
       {
          Add(new cMenuEditBoolItem( tr("  Series recording"), &data.useEpisode, trVDR("no"), trVDR("yes")));
          Add(new cMenuEditStrItem(IndentMenuItem(tr("Directory")), data.directory, sizeof(data.directory), tr(AllowedChars)));
@@ -409,7 +402,7 @@ void cMenuEditSearchExt::Set()
          Add(new cMenuEditIntItem(IndentMenuItem(trVDR("Setup.Recording$Margin at stop (min)")), &data.MarginStop, -INT_MAX, INT_MAX));
          Add(new cMenuEditBoolItem(IndentMenuItem(tr("VPS")), &data.useVPS, trVDR("no"), trVDR("yes")));
       }
-      if (data.action == searchTimerActionRecord)
+      if ((data.action == searchTimerActionRecord) || (data.action == searchTimerActionInactiveRecord))
 	{
 	  Add(new cMenuEditStraItem(IndentMenuItem(tr("Auto delete")), &data.delMode, 3, DelModes));
 	  if (data.delMode == 1)
@@ -441,9 +434,9 @@ cMenuEditSearchExt::~cMenuEditSearchExt()
       free(SearchModes[i]);
    for(i=0; i<=7; i++)
       free(DaysOfWeek[i]);
-   for(i=0; i<=2; i++)
+   for(i=0; i<=3; i++)
       free(UseChannelSel[i]);
-   for(i=0; i<=2; i++)
+   for(i=0; i<=5; i++)
       free(SearchTimerModes[i]);
    for(i=0; i<=3; i++)
       free(BlacklistModes[i]);
@@ -643,13 +636,8 @@ eOSState cMenuEditSearchExt::ProcessKey(eKeys Key)
          case kOk:
             if (data.useChannel==1)
             {
-#if VDRVERSNUM > 20300
                LOCK_CHANNELS_READ;
-               const cChannels *vdrchannels = Channels;
-#else
-               cChannels *vdrchannels = &Channels;
-#endif
-               const cChannel *ch = vdrchannels->GetByNumber(channelMin);
+               const cChannel *ch = Channels->GetByNumber(channelMin);
                if (ch)
                   data.channelMin = ch;
                else
@@ -657,7 +645,7 @@ eOSState cMenuEditSearchExt::ProcessKey(eKeys Key)
 		 ERROR(tr("*** Invalid Channel ***"));
 		 break;
                }
-               ch = vdrchannels->GetByNumber(channelMax);
+               ch = Channels->GetByNumber(channelMax);
                if (ch)
                   data.channelMax = ch;
                else
@@ -831,11 +819,9 @@ eOSState cMenuEditSearchExt::ProcessKey(eKeys Key)
 
 // --- cMenuEditDaysOfWeek --------------------------------------------------------
 cMenuEditDaysOfWeek::cMenuEditDaysOfWeek(int* DaysOfWeek, int Offset, bool Negate)
-   :cOsdMenu(tr("Edit user-defined days of week"),30)
+:cOsdMenu(tr("Edit user-defined days of week"),30)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
    int i=0;
    offset = Offset;
    negate = Negate;
@@ -877,11 +863,9 @@ eOSState cMenuEditDaysOfWeek::ProcessKey(eKeys Key)
 
 // --- cMenuSearchEditCompCats --------------------------------------------------------
 cMenuSearchEditCompCats::cMenuSearchEditCompCats(int* catarrayAvoidRepeats)
-   :cOsdMenu(tr("Compare categories"),30)
+:cOsdMenu(tr("Compare categories"),30)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
    search_catarrayAvoidRepeats = catarrayAvoidRepeats;
    edit_catarrayAvoidRepeats = (int*) malloc(SearchExtCats.Count() * sizeof(int));
    cSearchExtCat *SearchExtCat = SearchExtCats.First();
@@ -929,9 +913,7 @@ eOSState cMenuSearchEditCompCats::ProcessKey(eKeys Key)
 cMenuBlacklistsSelection::cMenuBlacklistsSelection(cList<cBlacklistObject>* pBlacklists)
 :cOsdMenu(tr("Select blacklists"),30)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
    blacklists = pBlacklists;
    blacklistsSel = new int[Blacklists.Count()];
    cMutexLock BlacklistLock(&Blacklists);
@@ -1072,11 +1054,9 @@ eOSState cMenuBlacklistsSelection::ProcessKey(eKeys Key)
 
 // --- cMenuCatValuesSelect --------------------------------------------------------
 cMenuCatValuesSelect::cMenuCatValuesSelect(char* CatValues, int CatIndex, int SearchMode)
-   :cOsdMenu(tr("Values for EPG category"), 1, 40)
+:cOsdMenu(tr("Values for EPG category"), 1, 40)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
 
    catValues = CatValues;
    catIndex = CatIndex;
@@ -1207,9 +1187,7 @@ eOSState cMenuCatValuesSelect::ProcessKey(eKeys Key)
 cMenuSearchActivSettings::cMenuSearchActivSettings(cSearchExt *SearchExt)
 :cOsdMenu(tr("Activation of search timer"), 25)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
 
   searchExt = SearchExt;
   if (searchExt)
diff --git a/menu_searchedit.h b/menu_searchedit.h
index 9bfbf4f..f026dac 100644
--- a/menu_searchedit.h
+++ b/menu_searchedit.h
@@ -48,7 +48,7 @@ protected:
   char *SearchModes[6];
   char *DaysOfWeek[8];
   char *UseChannelSel[4];
-  char *SearchTimerModes[5];
+  char *SearchTimerModes[6];
   char *BlacklistModes[4];
   char *DelModes[3];
   char *SearchActiveModes[3];
diff --git a/menu_searchresults.c b/menu_searchresults.c
index 396c9d6..99c11bf 100644
--- a/menu_searchresults.c
+++ b/menu_searchresults.c
@@ -47,11 +47,7 @@ extern bool isUTF8;
 
 static int CompareRecording(const void *p1, const void *p2)
 {
-#if APIVERSNUM < 10721
-   return (int)((*(cRecording **)p1)->start - (*(cRecording **)p2)->start);
-#else
    return (int)((*(cRecording **)p1)->Start() - (*(cRecording **)p2)->Start());
-#endif
 }
 
 // --- cMenuSearchResultsItem -------------------------------------------------------
@@ -67,16 +63,10 @@ cMenuSearchResultsItem::cMenuSearchResultsItem(const cEvent *EventInfo, bool Epi
    menuTemplate = MenuTemplate?MenuTemplate:cTemplFile::GetTemplateByName("MenuSearchResults");
    search = Search;
    inSwitchList = false;
-#if VDRVERSNUM > 20300
-   LOCK_TIMERS_READ;
-   const cTimers *vdrtimers = Timers;
-#else
-   cTimers *vdrtimers = &Timers;
-#endif
-   Update(vdrtimers, true);
+   Update(true);
 }
 
-bool cMenuSearchResultsItem::Update(const cTimers* vdrtimers, bool Force)
+bool cMenuSearchResultsItem::Update(bool Force)
 {
    if (!menuTemplate)
       return false;
@@ -87,11 +77,8 @@ bool cMenuSearchResultsItem::Update(const cTimers* vdrtimers, bool Force)
    bool OldInSwitchList = inSwitchList;
    bool hasMatch = false;
    const cTimer* timer = NULL;
-#if VDRVERSNUM > 20300
-   if (event) timer = vdrtimers->GetMatch(event, &timerMatch);
-#else
-   if (event) timer = ((cTimers*)vdrtimers)->GetMatch(event, &timerMatch);
-#endif
+   LOCK_TIMERS_READ;
+   if (event) timer = Timers->GetMatch(event, &timerMatch);
    if (event) inSwitchList = (SwitchTimers.InSwitchList(event)!=NULL);
    if (timer) hasMatch = true;
 
@@ -196,19 +183,12 @@ cMenuSearchResultsItem::cMenuSearchResultsItem(const cRecording *Recording)
 
 void cMenuSearchResultsItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
 {
-#if APIVERSNUM >= 10733
-#if VDRVERSNUM > 20300
   LOCK_CHANNELS_READ;
-  const cChannels *vdrchannels = Channels;
-#else
-  cChannels *vdrchannels = &Channels;
-#endif
-  const cChannel *channel = event?vdrchannels->GetByChannelID(event->ChannelID(), true, true):NULL;
+  const cChannel *channel = event?Channels->GetByChannelID(event->ChannelID(), true, true):NULL;
   if (!event)
      DisplayMenu->SetItem(Text(), Index, Current, Selectable);
   else if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, true, timerMatch))
      DisplayMenu->SetItem(Text(), Index, Current, Selectable);
-#endif
 }
 
 // --- cMenuSearchResults -------------------------------------------------------
@@ -216,11 +196,9 @@ void cMenuSearchResultsItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Inde
 const cEvent *cMenuSearchResults::scheduleEventInfo = NULL;
 
 cMenuSearchResults::cMenuSearchResults(cMenuTemplate* MenuTemplate)
-   :cOsdMenu("", MenuTemplate->Tab(0), MenuTemplate->Tab(1), MenuTemplate->Tab(2), MenuTemplate->Tab(3), MenuTemplate->Tab(4))
+:cOsdMenu("", MenuTemplate->Tab(0), MenuTemplate->Tab(1), MenuTemplate->Tab(2), MenuTemplate->Tab(3), MenuTemplate->Tab(4))
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcSchedule);
-#endif
 
   helpKeys = -1;
   menuTemplate = MenuTemplate;
@@ -238,11 +216,12 @@ int cMenuSearchResults::GetTab(int Tab)
    return menuTemplate->Tab(Tab-1);
 }
 
-bool cMenuSearchResults::Update(const cTimers* vdrtimers)
+bool cMenuSearchResults::Update(void)
 {
    bool result = false;
+   LOCK_TIMERS_READ;
    for (cOsdItem *item = First(); item; item = Next(item)) {
-      if (((cMenuSearchResultsItem *)item)->Update(vdrtimers))
+      if (((cMenuSearchResultsItem *)item)->Update(Timers))
          result = true;
    }
    return result;
@@ -253,16 +232,12 @@ eOSState cMenuSearchResults::Record(void)
    UpdateCurrent();
    cMenuSearchResultsItem *item = (cMenuSearchResultsItem *)Get(Current());
    if (item) {
-#if VDRVERSNUM > 20300
       LOCK_TIMERS_WRITE;
-      cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
+      Timers->SetExplicitModify();
       if (item->timerMatch == tmFull)
       {
          eTimerMatch tm = tmNone;
-         cTimer *timer = vdrtimers->GetMatch(item->event, &tm);
+         cTimer *timer = Timers->GetMatch(item->event, &tm);
          if (timer)
 	   {
 	     if (EPGSearchConfig.useVDRTimerEditMenu)
@@ -274,7 +249,7 @@ eOSState cMenuSearchResults::Record(void)
 
       cTimer *timer = new cTimer(item->event);
       PrepareTimerFile(item->event, timer);
-      cTimer *t = vdrtimers->GetTimer(timer);
+      cTimer *t = Timers->GetTimer(timer);
       if (EPGSearchConfig.onePressTimerCreation == 0 || t || !item->event || (!t && item->event && item->event->StartTime() - (Setup.MarginStart+2) * 60 < time(NULL)))
       {
          if (t)
@@ -312,17 +287,20 @@ eOSState cMenuSearchResults::Record(void)
 #endif
 
          SetAux(timer, fullaux);
-         vdrtimers->Add(timer);
+         if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+            timer->SetRemote(Setup.SVDRPDefaultHost);
+         Timers->Add(timer);
 	 gl_timerStatusMonitor->SetConflictCheckAdvised();
          timer->Matches();
-#if VDRVERSNUM < 20300
-         Timers.SetModified();
-#endif
-         LogFile.iSysLog("timer %s added (active)", *timer->ToDescr());
+         Timers->SetModified();
+         if (!HandleRemoteTimerModifications(timer)) {
+		 ERROR(tr("Epgsearch: RemoteTimerModifications failed"));
+			Timers->Del(timer);
+         }
 
          if (HasSubMenu())
             CloseSubMenu();
-         if (Update(vdrtimers))
+         if (Update())
             Display();
          SetHelpKeys();
       }
@@ -336,13 +314,8 @@ eOSState cMenuSearchResults::Switch(void)
    UpdateCurrent();
    cMenuSearchResultsItem *item = (cMenuSearchResultsItem *)Get(Current());
    if (item) {
-#if VDRVERSNUM > 20300
       LOCK_CHANNELS_READ;
-      const cChannels *vdrchannels = Channels;
-#else
-      cChannels *vdrchannels = &Channels;
-#endif
-      const cChannel *channel = vdrchannels->GetByChannelID(item->event->ChannelID(), true, true);
+      const cChannel *channel = Channels->GetByChannelID(item->event->ChannelID(), true, true);
       if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true))
          return osEnd;
    }
@@ -372,13 +345,11 @@ eOSState cMenuSearchResults::ShowSummary()
       const cEvent *ei = ((cMenuSearchResultsItem *)Get(Current()))->event;
       if (ei)
       {
-#if VDRVERSNUM > 20300
+				const cChannel *channel;
+				{
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
-         const cChannel *channel = vdrchannels->GetByChannelID(ei->ChannelID(), true, true);
+         channel = Channels->GetByChannelID(ei->ChannelID(), true, true);
+				}
          if (channel)
             return AddSubMenu(new cMenuEventSearch(ei, eventObjects));
       }
@@ -490,13 +461,7 @@ eOSState cMenuSearchResults::ProcessKey(eKeys Key)
    }
    if (!HasSubMenu())
    {
-#if VDRVERSNUM > 20300
-      LOCK_TIMERS_READ;
-      const cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
-      if ((HadSubMenu || gl_TimerProgged) && Update(vdrtimers))
+      if ((HadSubMenu || gl_TimerProgged) && Update())
       {
          if (gl_TimerProgged) // when using epgsearch's timer edit menu, update is delayed because of SVDRP
          {
@@ -792,9 +757,7 @@ bool cMenuSearchResultsForQuery::BuildList()
 cMenuSearchResultsForRecs::cMenuSearchResultsForRecs(const char *query)
    :cMenuSearchResultsForQuery(NULL)
 {
-#if VDRVERSNUM >= 10728
    SetMenuCategory(mcCommand);
-#endif
    SetTitle(tr("found recordings"));
    if (query)
    {
@@ -815,13 +778,8 @@ bool cMenuSearchResultsForRecs::BuildList()
 
    int current = Current();
    Clear();
-#if VDRVERSNUM > 20300
    LOCK_RECORDINGS_READ;
-   const cRecordings *vdrrecordings = Recordings;
-#else
-   cRecordings *vdrrecordings = &Recordings;
-#endif
-   for (const cRecording *recording = vdrrecordings->First(); recording; recording = vdrrecordings->Next(recording)) {
+   for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording)) {
      const cRecordingInfo *recInfo = recording->Info();
      if (!recInfo) continue;
      string s1 = (recInfo && recInfo->Title())?recInfo->Title():"";
@@ -879,13 +837,8 @@ bool cMenuSearchResultsForRecs::BuildList()
 
 const cRecording *cMenuSearchResultsForRecs::GetRecording(cMenuSearchResultsItem *Item)
 {
-#if VDRVERSNUM > 20300
    LOCK_RECORDINGS_READ;
-   const cRecordings *vdrrecordings = Recordings;
-#else
-   cRecordings *vdrrecordings = &Recordings;
-#endif
-   const cRecording *recording = vdrrecordings->GetByName(Item->FileName());
+   const cRecording *recording = Recordings->GetByName(Item->FileName());
    if (!recording)
      ERROR(tr("Error while accessing recording!"));
    return recording;
@@ -898,11 +851,7 @@ eOSState cMenuSearchResultsForRecs::Play(void)
    {
       const cRecording *recording = GetRecording(ri);
       if (recording) {
-#if APIVERSNUM < 10728
-         cReplayControl::SetRecording(recording->FileName(), recording->Title());
-#else
          cReplayControl::SetRecording(recording->FileName());
-#endif
          return osReplay;
       }
    }
diff --git a/menu_searchresults.h b/menu_searchresults.h
index f31d9c0..36b8665 100644
--- a/menu_searchresults.h
+++ b/menu_searchresults.h
@@ -59,7 +59,7 @@ class cMenuSearchResultsItem : public cOsdItem {
                            bool PreviewTimer = false, cMenuTemplate* MenuTemplate = NULL,
                            const cSearchExt* Search = NULL);
     cMenuSearchResultsItem(const cRecording *Recording);
-    bool Update(const cTimers* vdrtimers, bool Force = false);
+    bool Update(bool Force = false);
     void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
 };
 
@@ -83,7 +83,7 @@ class cMenuSearchResults : public cOsdMenu {
     eOSState Commands(eKeys Key, cSearchExt* SearchExt = NULL);
     int GetTab(int Tab);
     virtual void SetHelpKeys(bool Force=false)=0;
-    bool Update(const cTimers* vdrtimers);
+    bool Update(void);
     void UpdateCurrent();
 
     static const cEvent *scheduleEventInfo;
diff --git a/menu_searchtemplate.c b/menu_searchtemplate.c
index 32685cd..a38484c 100644
--- a/menu_searchtemplate.c
+++ b/menu_searchtemplate.c
@@ -107,9 +107,7 @@ int cMenuSearchTemplateItem::Compare(const cListObject &ListObject) const
 cMenuEPGSearchTemplate::cMenuEPGSearchTemplate(cSearchExt* Search, cBlacklist* Blacklist, bool New)
 :cOsdMenu(tr("Search templates"), 2, 20, 11, 6, 5)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
     search = Search;
     blacklist = Blacklist;
     newSearch = New;
diff --git a/menu_switchtimers.c b/menu_switchtimers.c
index 7c1bc72..00ccfba 100644
--- a/menu_switchtimers.c
+++ b/menu_switchtimers.c
@@ -40,9 +40,7 @@ public:
 cMenuEditSwitchTimer::cMenuEditSwitchTimer(cSwitchTimer* SwitchTimer, bool New)
 :cOsdMenu(tr("Edit entry"),30)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
 
   SwitchModes[0] = strdup(tr("Switch"));
   SwitchModes[1] = strdup(tr("Announce only"));
@@ -136,13 +134,8 @@ void cMenuSwitchTimerItem::Set()
     tm *tm = localtime_r(&startTime, &tm_r);
     strftime(datebuf, sizeof(datebuf), "%d.%m", tm);
 
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel* channel = vdrchannels->GetByChannelID(switchTimer->channelID,true,true);
+    const cChannel* channel = Channels->GetByChannelID(switchTimer->channelID,true,true);
 
     msprintf(&buffer, "%s\t%d\t%s\t%s\t%d\'\t%s~%s", switchTimer->mode==1?"":">", channel?channel->Number():-1, datebuf, TIMESTRING(startTime), switchTimer->switchMinsBefore, event->Title()?event->Title():"", event->ShortText()?event->ShortText():"");
     SetText(buffer, false);
@@ -161,9 +154,7 @@ int cMenuSwitchTimerItem::Compare(const cListObject &ListObject) const
 cMenuSwitchTimers::cMenuSwitchTimers()
 :cOsdMenu(tr("Switch list"), 2, 4, 6, 6, 4)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcPlugin);
-#endif
 
     Set();
     Display();
@@ -190,7 +181,7 @@ cSwitchTimer* cMenuSwitchTimers::CurrentSwitchTimer(void)
 {
     cMenuSwitchTimerItem *item = (cMenuSwitchTimerItem *)Get(Current());
     if (item && SwitchTimers.Exists(item->switchTimer))
-	return item->switchTimer;
+        return item->switchTimer;
     return NULL;
 }
 
diff --git a/menu_templateedit.c b/menu_templateedit.c
index fc7d9c3..20278b0 100644
--- a/menu_templateedit.c
+++ b/menu_templateedit.c
@@ -187,13 +187,8 @@ eOSState cMenuEditTemplate::ProcessKey(eKeys Key)
          case kOk:
             if (data.useChannel==1)
             {
-#if VDRVERSNUM > 20300
                LOCK_CHANNELS_READ;
-               const cChannels *vdrchannels = Channels;
-#else
-               cChannels *vdrchannels = &Channels;
-#endif
-               const cChannel *ch = vdrchannels->GetByNumber(channelMin);
+               const cChannel *ch = Channels->GetByNumber(channelMin);
                if (ch)
                   data.channelMin = ch;
                else
@@ -201,7 +196,7 @@ eOSState cMenuEditTemplate::ProcessKey(eKeys Key)
 		 ERROR(tr("*** Invalid Channel ***"));
 		 break;
                }
-               ch = vdrchannels->GetByNumber(channelMax);
+               ch = Channels->GetByNumber(channelMax);
                if (ch)
                   data.channelMax = ch;
                else
diff --git a/menu_timersdone.c b/menu_timersdone.c
index 6eb370d..5120bad 100644
--- a/menu_timersdone.c
+++ b/menu_timersdone.c
@@ -44,13 +44,8 @@ void cMenuTimerDoneItem::Set(void)
    tm *tm = localtime_r(&timerDone->start, &tm_r);
    strftime(buf, sizeof(buf), "%d.%m.%y %H:%M", tm);
 
-#if VDRVERSNUM > 20300
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   const cChannel* ch = vdrchannels->GetByChannelID(timerDone->channelID, true, true);
+   const cChannel* ch = Channels->GetByChannelID(timerDone->channelID, true, true);
    msprintf(&buffer, "%d\t%s\t%s~%s", ch?ch->Number():0, buf, timerDone->title.c_str(), timerDone->shorttext.c_str());
    SetText(buffer, false);
 }
@@ -71,11 +66,9 @@ int cMenuTimerDoneItem::Compare(const cListObject &ListObject) const
 
 // --- cMenuTimersDone ----------------------------------------------------------
 cMenuTimersDone::cMenuTimersDone(cSearchExt* Search)
-   :cOsdMenu("", 4, 15)
+:cOsdMenu("", 4, 15)
 {
-#if VDRVERSNUM >= 10728
   SetMenuCategory(mcTimer);
-#endif
 
    search = Search;
    showAll = true;
diff --git a/menu_whatson.c b/menu_whatson.c
index 51fa7e0..e84bb95 100644
--- a/menu_whatson.c
+++ b/menu_whatson.c
@@ -55,7 +55,7 @@ extern bool isUTF8;
 int gl_InfoConflict = 0;
 
 // --- cMenuMyScheduleItem ------------------------------------------------------
-cMenuMyScheduleItem::cMenuMyScheduleItem(const cEvent *Event, const cChannel *Channel, showMode Mode, cMenuTemplate* MenuTemplate)
+cMenuMyScheduleItem::cMenuMyScheduleItem(const cTimers *Timers, const cEvent *Event, const cChannel *Channel, showMode Mode, cMenuTemplate* MenuTemplate)
 {
    event = Event;
    channel = Channel;
@@ -63,16 +63,10 @@ cMenuMyScheduleItem::cMenuMyScheduleItem(const cEvent *Event, const cChannel *Ch
    timerMatch = tmNone;
    inSwitchList = false;
    menuTemplate = MenuTemplate;
-#if VDRVERSNUM > 20300
-   LOCK_TIMERS_READ;
-   const cTimers *vdrtimers = Timers;
-#else
-   cTimers *vdrtimers = &Timers;
-#endif
-   Update(vdrtimers, true);
+   Update(Timers, true);
 }
 
-bool cMenuMyScheduleItem::Update(const cTimers* vdrtimers, bool Force)
+bool cMenuMyScheduleItem::Update(const cTimers* Timers, bool Force)
 {
    if (!menuTemplate)
       return false;
@@ -87,11 +81,7 @@ bool cMenuMyScheduleItem::Update(const cTimers* vdrtimers, bool Force)
    bool OldInSwitchList = inSwitchList;
    bool hasMatch = false;
    const cTimer* timer = NULL;
-#if VDRVERSNUM > 20300
-   if (event) timer = vdrtimers->GetMatch(event, &timerMatch);
-#else
-   if (event) timer = ((cTimers*)vdrtimers)->GetMatch(event, &timerMatch);
-#endif
+   if (event) timer = Timers->GetMatch(event, &timerMatch);
    if (event) inSwitchList = (SwitchTimers.InSwitchList(event)!=NULL);
    if (timer) hasMatch = true;
 
@@ -115,9 +105,9 @@ bool cMenuMyScheduleItem::Update(const cTimers* vdrtimers, bool Force)
 		    frac = ((now - startTime) * 8 + (dur >> 1)) / dur;
 		}
 	      if (mode == showNext)
-		frac = (  ( 30*60 - min((time_t)30*60, startTime - now) ) * 8 + 15*60  ) / (30*60);
+		frac = (  ( 30*60 - std::min((time_t)30*60, startTime - now) ) * 8 + 15*60  ) / (30*60);
 
-	      frac = min(8,max(0, frac));
+	      frac = std::min(8,std::max(0, frac));
 
 	      szProgressPartT2S[0] = '[';
 	      memset(szProgressPartT2S + 1,'|',frac);
@@ -245,7 +235,7 @@ bool cMenuMyScheduleItem::Update(const cTimers* vdrtimers, bool Force)
 
       SetText(buffer, false);
 
-      if (gl_InfoConflict == 0 && EPGSearchConfig.checkTimerConflAfterTimerProg && !Force && timer && timerMatch && timerMatch != OldTimerMatch)
+      if (gl_InfoConflict == 0 && EPGSearchConfig.checkTimerConflAfterTimerProg && !Force && timer && timerMatch && timerMatch != OldTimerMatch && !(timer->Remote()))
       {
          cConflictCheck C;
          C.Check();
@@ -259,28 +249,20 @@ bool cMenuMyScheduleItem::Update(const cTimers* vdrtimers, bool Force)
 
 void cMenuMyScheduleItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
 {
-#if APIVERSNUM >= 10733
   bool withDate = (channel == NULL); // search for a better way to determine this
   if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, withDate, timerMatch))
      DisplayMenu->SetItem(Text(), Index, Current, Selectable);
-#endif
 }
 
 // --- cMenuMyScheduleSepItem ------------------------------------------------------
-cMenuMyScheduleSepItem::cMenuMyScheduleSepItem(const cEvent *Event, const cChannel *Channel)
-  : cMenuMyScheduleItem(Event, Channel, showNow, NULL)
+cMenuMyScheduleSepItem::cMenuMyScheduleSepItem(const cTimers *Timers, const cEvent *Event, const cChannel *Channel)
+  : cMenuMyScheduleItem(Timers, Event, Channel, showNow, NULL)
 {
    event = Event;
    channel = Channel;
    dummyEvent = NULL;
    SetSelectable(false);
-#if VDRVERSNUM > 20300
-   LOCK_TIMERS_READ;
-   const cTimers *vdrtimers = Timers;
-#else
-   cTimers *vdrtimers = &Timers;
-#endif
-   Update(vdrtimers, true);
+   Update(Timers, true);
 }
 
 cMenuMyScheduleSepItem::~cMenuMyScheduleSepItem()
@@ -289,7 +271,7 @@ cMenuMyScheduleSepItem::~cMenuMyScheduleSepItem()
     delete dummyEvent;
 }
 
-bool cMenuMyScheduleSepItem::Update(const cTimers* vdrtimer, bool Force)
+bool cMenuMyScheduleSepItem::Update(const cTimers *Timers, bool Force)
 {
   if (channel)
     SetText(cString::sprintf("%s\t %s %s", MENU_SEPARATOR_ITEMS, channel->Name(), MENU_SEPARATOR_ITEMS));
@@ -304,11 +286,9 @@ bool cMenuMyScheduleSepItem::Update(const cTimers* vdrtimer, bool Force)
 
 void cMenuMyScheduleSepItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
 {
-#if APIVERSNUM >= 10733
   bool withDate = (channel == NULL); // search for a better way to determine this
   if (!DisplayMenu->SetItemEvent(dummyEvent, Index, Current, Selectable, channel, withDate, timerMatch))
      DisplayMenu->SetItem(Text(), Index, Current, Selectable);
-#endif
 }
 
 
@@ -322,21 +302,18 @@ cList<cShowMode> cMenuWhatsOnSearch::showModes;
 time_t cMenuWhatsOnSearch::seekTime = 0;
 int cMenuWhatsOnSearch::shiftTime = 0;
 
-cMenuWhatsOnSearch::cMenuWhatsOnSearch(const cSchedules *Schedules, int CurrentChannelNr)
-   :cOsdMenu("", GetTab(1), GetTab(2), GetTab(3), GetTab(4), GetTab(5))
+cMenuWhatsOnSearch::cMenuWhatsOnSearch(int CurrentChannelNr)
+:cOsdMenu("", GetTab(1), GetTab(2), GetTab(3), GetTab(4), GetTab(5))
 {
-#if VDRVERSNUM >= 10734
   if (currentShowMode == showNow)
     SetMenuCategory(mcScheduleNow);
   else if (currentShowMode == showNext)
     SetMenuCategory(mcScheduleNext);
   else
     SetMenuCategory(mcSchedule);
-#endif
 
   helpKeys = -1;
   shiftTime = 0;
-  schedules = Schedules;
 
   CreateShowModes();
 
@@ -445,13 +422,9 @@ void cMenuWhatsOnSearch::LoadSchedules()
    if (currentChannel > maxChannel)
       maxChannel = 0;
 
-#if VDRVERSNUM > 20300
+	 LOCK_TIMERS_READ; // needed in MyScheduleItem
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   for (const cChannel *Channel = vdrchannels->First(); Channel; Channel = vdrchannels->Next(Channel))
+   for (const cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel))
    {
       if (!Channel->GroupSep())
       {
@@ -459,7 +432,11 @@ void cMenuWhatsOnSearch::LoadSchedules()
          if (EPGSearchConfig.showRadioChannels == 0 && ISRADIO(Channel))
             continue;
 
-         const cSchedule *Schedule = schedules->GetSchedule(Channel);
+				 const cSchedule *Schedule;
+				 {
+				 LOCK_SCHEDULES_READ;
+         Schedule = Schedules->GetSchedule(Channel);
+				 }
          const cEvent *Event = NULL;
          if (Schedule)
          {
@@ -488,13 +465,13 @@ void cMenuWhatsOnSearch::LoadSchedules()
 	     if (!EPGSearchConfig.showEmptyChannels && !Event)
             continue;
 
-	     Add(new cMenuMyScheduleItem(Event, Channel, currentShowMode, currentTemplate), Channel->Number() == currentChannel);
+	     Add(new cMenuMyScheduleItem(Timers, Event, Channel, currentShowMode, currentTemplate), Channel->Number() == currentChannel);
          if (Event) eventObjects.Add(Event);
       }
       else
       {
 	if (EPGSearchConfig.showChannelGroups && strlen(Channel->Name()))
-	  Add(new cMenuMyScheduleSepItem(NULL, Channel));
+	  Add(new cMenuMyScheduleSepItem(NULL, NULL, Channel));
       }
    }
 }
@@ -590,16 +567,12 @@ eOSState cMenuWhatsOnSearch::Record(void)
    cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)Get(Current());
    if (item)
    {
-#if VDRVERSNUM > 20300
       LOCK_TIMERS_WRITE;
-      cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
+      Timers->SetExplicitModify();
       if (item->timerMatch == tmFull)
       {
          eTimerMatch tm = tmNone;
-         cTimer *timer = vdrtimers->GetMatch(item->event, &tm);
+         cTimer *timer = Timers->GetMatch(item->event, &tm);
          if (timer)
 	   {
 	     if (EPGSearchConfig.useVDRTimerEditMenu)
@@ -616,13 +589,9 @@ eOSState cMenuWhatsOnSearch::Record(void)
          PrepareTimerFile(item->event, timer);
       }
       else
-#if VDRVERSNUM > 20300
          timer = new cTimer(false, false, item->channel);
-#else
-         timer = new cTimer(false, false, (cChannel*)item->channel);
-#endif
 
-      cTimer *t = vdrtimers->GetTimer(timer);
+      cTimer *t = Timers->GetTimer(timer);
       if (EPGSearchConfig.onePressTimerCreation == 0 || t || !item->event || (!t && item->event && item->event->StartTime() - (Setup.MarginStart+2) * 60 < time(NULL)))
       {
          if (t)
@@ -659,17 +628,23 @@ eOSState cMenuWhatsOnSearch::Record(void)
          fullaux = UpdateAuxValue(fullaux, "pin-plugin", aux);
 #endif
          SetAux(timer, fullaux);
-         vdrtimers->Add(timer);
-	 gl_timerStatusMonitor->SetConflictCheckAdvised();
+         if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+            timer->SetRemote(Setup.SVDRPDefaultHost);
+         Timers->Add(timer);
+         if (!HandleRemoteTimerModifications(timer)) {
+			Timers->Del(timer);
+		    ERROR(tr("Epgsearch: RemoteTimerModifications failed"));
+         }
+				 else {
+         gl_timerStatusMonitor->SetConflictCheckAdvised();
          timer->Matches();
-#if VDRVERSNUM < 20300
-         Timers.SetModified();
-#endif
+         Timers->SetModified();
          LogFile.iSysLog("timer %s added (active)", *timer->ToDescr());
+				 }
 
          if (HasSubMenu())
             CloseSubMenu();
-         if (Update(vdrtimers))
+         if (Update())
             Display();
          SetHelpKeys();
       }
@@ -677,11 +652,12 @@ eOSState cMenuWhatsOnSearch::Record(void)
    return osContinue;
 }
 
-bool cMenuWhatsOnSearch::Update(const cTimers* vdrtimers)
+bool cMenuWhatsOnSearch::Update(void)
 {
    bool result = false;
+	 LOCK_TIMERS_READ;
    for (cOsdItem *item = First(); item; item = Next(item)) {
-      if (item->Selectable() && ((cMenuMyScheduleItem *)item)->Update(vdrtimers))
+      if (item->Selectable() && ((cMenuMyScheduleItem *)item)->Update(Timers))
          result = true;
    }
    return result;
@@ -759,13 +735,8 @@ eOSState cMenuWhatsOnSearch::Shift(int iMinutes)
    if (mi)
    {
       currentChannel = mi->channel->Number();
-#if VDRVERSNUM > 20300
       LOCK_CHANNELS_READ;
-      const cChannels *vdrchannels = Channels;
-#else
-      cChannels *vdrchannels = &Channels;
-#endif
-      scheduleChannel = vdrchannels->GetByNumber(currentChannel);
+      scheduleChannel = Channels->GetByNumber(currentChannel);
    }
    LoadSchedules();
    Display();
@@ -781,13 +752,8 @@ eOSState cMenuWhatsOnSearch::ShowSummary()
       const cEvent *ei = ((cMenuMyScheduleItem *)Get(Current()))->event;
       if (ei)
       {
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
-         const cChannel *channel = vdrchannels->GetByChannelID(ei->ChannelID(), true, true);
+         const cChannel *channel = Channels->GetByChannelID(ei->ChannelID(), true, true);
          if (channel)
             return AddSubMenu(new cMenuEventSearch(ei, eventObjects, SurfModeChannel));
       }
@@ -876,7 +842,8 @@ eOSState cMenuWhatsOnSearch::ProcessKey(eKeys Key)
                   cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current());
                   if (mi && mi->Selectable() && mi->channel)
                   {
-                     const cSchedule *Schedule = schedules->GetSchedule(mi->channel);
+										LOCK_SCHEDULES_READ;
+                     const cSchedule *Schedule = Schedules->GetSchedule(mi->channel);
                      if (Schedule)
                      {
                         time_t now = time(NULL);
@@ -912,13 +879,8 @@ eOSState cMenuWhatsOnSearch::ProcessKey(eKeys Key)
                   if (mi && mi->Selectable())
                   {
                      currentChannel = mi->channel->Number();
-#if VDRVERSNUM > 20300
                      LOCK_CHANNELS_READ;
-                     const cChannels *vdrchannels = Channels;
-#else
-                     cChannels *vdrchannels = &Channels;
-#endif
-                     scheduleChannel = vdrchannels->GetByNumber(currentChannel);
+                     scheduleChannel = Channels->GetByNumber(currentChannel);
                   }
                }
                else
@@ -956,13 +918,7 @@ eOSState cMenuWhatsOnSearch::ProcessKey(eKeys Key)
    }
    if (!HasSubMenu())
    {
-#if VDRVERSNUM > 20300
-      LOCK_TIMERS_READ;
-      const cTimers *vdrtimers = Timers;
-#else
-      cTimers *vdrtimers = &Timers;
-#endif
-      if ((HadSubMenu || gl_TimerProgged) && Update(vdrtimers))
+      if ((HadSubMenu || gl_TimerProgged) && Update())
       {
          if (gl_TimerProgged) // when using epgsearch's timer edit menu, update is delayed because of SVDRP
          {
diff --git a/menu_whatson.h b/menu_whatson.h
index 34d6de3..65a2b73 100644
--- a/menu_whatson.h
+++ b/menu_whatson.h
@@ -39,8 +39,8 @@ public:
   bool inSwitchList;
   cMenuTemplate* menuTemplate;
 
-  cMenuMyScheduleItem(const cEvent *Event, const cChannel *Channel = NULL, showMode ShowMode = showNow, cMenuTemplate* menuTemplate = NULL);
-  virtual bool Update(const cTimers* vdrtimers, bool Force = false);
+  cMenuMyScheduleItem(const cTimers *Timers, const cEvent *Event, const cChannel *Channel = NULL, showMode ShowMode = showNow, cMenuTemplate* menuTemplate = NULL);
+  virtual bool Update(const cTimers *Timers, bool Force = false);
   virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
 
 };
@@ -52,9 +52,9 @@ class cMenuMyScheduleSepItem : public cMenuMyScheduleItem {
                       // if VDR had a SetItemSeparator function for this
 public:
 
-  cMenuMyScheduleSepItem(const cEvent *Event, const cChannel *Channel = NULL);
+  cMenuMyScheduleSepItem(const cTimers *Timers = NULL, const cEvent *Event = NULL, const cChannel *Channel = NULL);
   ~cMenuMyScheduleSepItem();
-  virtual bool Update(const cTimers* vdrtimers, bool Force = false);
+  virtual bool Update(const cTimers *Timers = NULL,bool Force = false);
   virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
 };
 
@@ -62,7 +62,6 @@ public:
 class cMenuWhatsOnSearch : public cOsdMenu {
 private:
   int helpKeys;
-  const cSchedules* schedules;
   eOSState Record(void);
   eOSState ExtendedSearch(void);
   static int currentChannel;
@@ -75,7 +74,7 @@ private:
   static time_t seekTime;
   time_t GetTimeT(int iTime);
   static showMode GetNextMode();
-  cMenuWhatsOnSearch(const cSchedules *Schedules, int CurrentChannelNr);
+  cMenuWhatsOnSearch(int CurrentChannelNr);
   ~cMenuWhatsOnSearch();
   void LoadSchedules();
   static int CurrentChannel(void) { return currentChannel; }
@@ -88,7 +87,7 @@ private:
   virtual eOSState ShowSummary();
   void SetHelpKeys(bool Force = false);
   int GetTab(int Tab);
-  bool Update(const cTimers* vdrtimers);
+  bool Update(void);
   void CreateShowModes();
   static cShowMode* GetShowMode(showMode mode);
   void UpdateCurrent();
diff --git a/patches/README.patches b/patches/README.patches
index 08a1950..d9bc223 100644
--- a/patches/README.patches
+++ b/patches/README.patches
@@ -6,10 +6,5 @@ Description of patches
   patches vdr to allow plugins to replace main menu items like 'Schedule', 'Recordings',...
   Use this one, if epgsearch shall replace the schedules menu. This patch is also used
   by other plugins like the extrec-plugin.
-- timercmd-0.1_1.x.diff:
-  this patch adds a timer commands menu to VDR's timer menu, that can be called with '0'.
-  It can be used e.g. to search for repeats of a timer.
-- vdr-1.5.17-progressbar-support-0.0.1.diff:
-  this patch adds progressbar support to VDR's skins 'classic' and 'st:tng'
-- vdr.epgsearch-exttimeredit.diff:
+- vdr.epgsearch-exttimeredit-2.3.6.diff
   this patch against VDR integrates epgsearch's timer edit menu to VDR's timer menu.
diff --git a/patches/timercmd-0.1_1.6.0.diff b/patches/timercmd-0.1_1.6.0.diff
deleted file mode 100644
index bbab3f5..0000000
--- a/patches/timercmd-0.1_1.6.0.diff
+++ /dev/null
@@ -1,160 +0,0 @@
-diff -Nru vdr-1.6.0/config.c vdr-1.6.0-patched/config.c
---- vdr-1.6.0/config.c	2008-02-17 14:39:00.000000000 +0100
-+++ vdr-1.6.0-patched/config.c	2008-04-29 22:55:41.000000000 +0200
-@@ -125,6 +125,7 @@
- 
- cCommands Commands;
- cCommands RecordingCommands;
-+cCommands TimerCommands;
- 
- // --- cSVDRPhosts -----------------------------------------------------------
- 
-diff -Nru vdr-1.6.0/config.h vdr-1.6.0-patched/config.h
---- vdr-1.6.0/config.h	2008-03-23 11:26:10.000000000 +0100
-+++ vdr-1.6.0-patched/config.h	2008-04-29 22:55:41.000000000 +0200
-@@ -168,6 +168,7 @@
- 
- extern cCommands Commands;
- extern cCommands RecordingCommands;
-+extern cCommands TimerCommands;
- extern cSVDRPhosts SVDRPhosts;
- 
- class cSetupLine : public cListObject {
-diff -Nru vdr-1.6.0/menu.c vdr-1.6.0-patched/menu.c
---- vdr-1.6.0/menu.c	2008-03-16 12:15:28.000000000 +0100
-+++ vdr-1.6.0-patched/menu.c	2008-04-29 22:55:41.000000000 +0200
-@@ -772,8 +772,20 @@
-   return state;
- }
- 
--// --- cMenuTimerItem --------------------------------------------------------
-+// --- cMenuCommands ---------------------------------------------------------
-+// declaration shifted so it can be used in cMenuTimers
-+class cMenuCommands : public cOsdMenu {
-+private:
-+  cCommands *commands;
-+  char *parameters;
-+  eOSState Execute(void);
-+public:
-+  cMenuCommands(const char *Title, cCommands *Commands, const char *Parameters = NULL);
-+  virtual ~cMenuCommands();
-+  virtual eOSState ProcessKey(eKeys Key);
-+  };
- 
-+// --- cMenuTimerItem --------------------------------------------------------
- class cMenuTimerItem : public cOsdItem {
- private:
-   cTimer *timer;
-@@ -836,6 +848,7 @@
-   eOSState OnOff(void);
-   eOSState Info(void);
-   cTimer *CurrentTimer(void);
-+  eOSState Commands(eKeys Key = kNone);
-   void SetHelpKeys(void);
- public:
-   cMenuTimers(void);
-@@ -952,6 +965,53 @@
-   return osContinue;
- }
- 
-+#define CHECK_2PTR_NULL(x_,y_) ((x_)? ((y_)? y_:""):"")
-+
-+eOSState cMenuTimers::Commands(eKeys Key)
-+{
-+  if (HasSubMenu() || Count() == 0)
-+     return osContinue;
-+  cTimer *ti = CurrentTimer();
-+  if (ti) {
-+     char *parameter = NULL;
-+     const cEvent *pEvent = ti->Event();
-+     int iRecNumber=0;
-+
-+     if(!pEvent) {
-+        Timers.SetEvents();
-+        pEvent = ti->Event();
-+     }
-+     if(pEvent) {
-+// create a dummy recording to get the real filename
-+        cRecording *rc_dummy = new cRecording(ti, pEvent);
-+        Recordings.Load();
-+        cRecording *rc = Recordings.GetByName(rc_dummy->FileName());
-+
-+        delete rc_dummy;
-+        if(rc)
-+           iRecNumber=rc->Index() + 1;
-+     }
-+//Parameter format TimerNumber 'ChannelId' Start Stop 'Titel' 'Subtitel' 'file' RecNumer
-+//                 1           2           3     4    5       6          7      8
-+     asprintf(&parameter, "%d '%s' %d %d '%s' '%s' '%s' %d", ti->Index(),
-+                                                             *ti->Channel()->GetChannelID().ToString(),
-+                                                             (int)ti->StartTime(),
-+                                                             (int)ti->StopTime(),
-+                                                             CHECK_2PTR_NULL(pEvent, pEvent->Title()),
-+                                                             CHECK_2PTR_NULL(pEvent, pEvent->ShortText()),
-+                                                             ti->File(),
-+                                                             iRecNumber);
-+     isyslog("timercmd: %s", parameter);
-+     cMenuCommands *menu;
-+     eOSState state = AddSubMenu(menu = new cMenuCommands(tr("Timer commands"), &TimerCommands, parameter));
-+     free(parameter);
-+     if (Key != kNone)
-+        state = menu->ProcessKey(Key);
-+     return state;
-+     }
-+  return osContinue;
-+}
-+
- eOSState cMenuTimers::ProcessKey(eKeys Key)
- {
-   int TimerNumber = HasSubMenu() ? Count() : -1;
-@@ -966,6 +1026,8 @@
-        case kInfo:
-        case kBlue:   return Info();
-                      break;
-+       case k1...k9: return Commands(Key);
-+       case k0:      return (TimerCommands.Count()? Commands():osContinue);
-        default: break;
-        }
-      }
-@@ -1548,17 +1610,6 @@
- 
- // --- cMenuCommands ---------------------------------------------------------
- 
--class cMenuCommands : public cOsdMenu {
--private:
--  cCommands *commands;
--  char *parameters;
--  eOSState Execute(void);
--public:
--  cMenuCommands(const char *Title, cCommands *Commands, const char *Parameters = NULL);
--  virtual ~cMenuCommands();
--  virtual eOSState ProcessKey(eKeys Key);
--  };
--
- cMenuCommands::cMenuCommands(const char *Title, cCommands *Commands, const char *Parameters)
- :cOsdMenu(Title)
- {
-diff -Nru vdr-1.6.0/po/de_DE.po vdr-1.6.0-patched/po/de_DE.po
---- vdr-1.6.0/po/de_DE.po	2008-03-23 11:31:29.000000000 +0100
-+++ vdr-1.6.0-patched/po/de_DE.po	2008-04-29 22:55:41.000000000 +0200
-@@ -381,6 +381,9 @@
- msgid "Timer still recording - really delete?"
- msgstr "Timer zeichnet auf - trotzdem l�schen?"
- 
-+msgid "Timer commands"
-+msgstr "Befehle f�r Timer"
-+
- msgid "Event"
- msgstr "Sendung"
- 
-diff -Nru vdr-1.6.0/vdr.c vdr-1.6.0-patched/vdr.c
---- vdr-1.6.0/vdr.c	2008-03-14 14:22:39.000000000 +0100
-+++ vdr-1.6.0-patched/vdr.c	2008-04-29 22:55:41.000000000 +0200
-@@ -569,6 +569,7 @@
-         Timers.Load(AddDirectory(ConfigDirectory, "timers.conf")) &&
-         Commands.Load(AddDirectory(ConfigDirectory, "commands.conf"), true) &&
-         RecordingCommands.Load(AddDirectory(ConfigDirectory, "reccmds.conf"), true) &&
-+        TimerCommands.Load(AddDirectory(ConfigDirectory, "timercmds.conf"), true) &&
-         SVDRPhosts.Load(AddDirectory(ConfigDirectory, "svdrphosts.conf"), true) &&
-         Keys.Load(AddDirectory(ConfigDirectory, "remote.conf")) &&
-         KeyMacros.Load(AddDirectory(ConfigDirectory, "keymacros.conf"), true)
diff --git a/patches/timercmd-0.1_1.7.17.diff b/patches/timercmd-0.1_1.7.17.diff
deleted file mode 100644
index 609cefb..0000000
--- a/patches/timercmd-0.1_1.7.17.diff
+++ /dev/null
@@ -1,109 +0,0 @@
-diff -Nru vdr-1.7.17/config.c vdr-1.7.17-patched/config.c
---- vdr-1.7.17/config.c	2010-06-06 12:06:43.000000000 +0200
-+++ vdr-1.7.17-patched/config.c	2011-03-16 18:48:43.000000000 +0100
-@@ -211,6 +211,7 @@
- cNestedItemList Folders;
- cNestedItemList Commands;
- cNestedItemList RecordingCommands;
-+cNestedItemList TimerCommands;
- 
- // --- cSVDRPhosts -----------------------------------------------------------
- 
-diff -Nru vdr-1.7.17/config.h vdr-1.7.17-patched/config.h
---- vdr-1.7.17/config.h	2010-10-24 13:22:35.000000000 +0200
-+++ vdr-1.7.17-patched/config.h	2011-03-16 18:49:17.000000000 +0100
-@@ -181,6 +181,7 @@
- extern cNestedItemList Folders;
- extern cNestedItemList Commands;
- extern cNestedItemList RecordingCommands;
-+extern cNestedItemList TimerCommands;
- extern cSVDRPhosts SVDRPhosts;
- 
- class cSetupLine : public cListObject {
-diff -Nru vdr-1.7.17/menu.c vdr-1.7.17-patched/menu.c
---- vdr-1.7.17/menu.c	2011-02-27 13:37:48.000000000 +0100
-+++ vdr-1.7.17-patched/menu.c	2011-03-16 19:07:53.000000000 +0100
-@@ -1083,6 +1083,7 @@
-   eOSState Info(void);
-   cTimer *CurrentTimer(void);
-   void SetHelpKeys(void);
-+  eOSState Commands(eKeys Key = kNone);
- public:
-   cMenuTimers(void);
-   virtual ~cMenuTimers();
-@@ -1198,6 +1199,53 @@
-   return osContinue;
- }
- 
-+#define CHECK_2PTR_NULL(x_,y_) ((x_)? ((y_)? y_:""):"")
-+
-+eOSState cMenuTimers::Commands(eKeys Key)
-+{
-+  if (HasSubMenu() || Count() == 0)
-+     return osContinue;
-+  cTimer *ti = CurrentTimer();
-+  if (ti) {
-+     char *parameter = NULL;
-+     const cEvent *pEvent = ti->Event();
-+     int iRecNumber=0;
-+
-+     if(!pEvent) {
-+        Timers.SetEvents();
-+        pEvent = ti->Event();
-+     }
-+     if(pEvent) {
-+// create a dummy recording to get the real filename
-+        cRecording *rc_dummy = new cRecording(ti, pEvent);
-+        Recordings.Load();
-+        cRecording *rc = Recordings.GetByName(rc_dummy->FileName());
-+
-+        delete rc_dummy;
-+        if(rc)
-+           iRecNumber=rc->Index() + 1;
-+     }
-+//Parameter format TimerNumber 'ChannelId' Start Stop 'Titel' 'Subtitel' 'file' RecNumer
-+//                 1           2           3     4    5       6          7      8
-+     asprintf(&parameter, "%d '%s' %d %d '%s' '%s' '%s' %d", ti->Index(),
-+                                                             *ti->Channel()->GetChannelID().ToString(),
-+                                                             (int)ti->StartTime(),
-+                                                             (int)ti->StopTime(),
-+                                                             CHECK_2PTR_NULL(pEvent, pEvent->Title()),
-+                                                             CHECK_2PTR_NULL(pEvent, pEvent->ShortText()),
-+                                                             ti->File(),
-+                                                             iRecNumber);
-+     isyslog("timercmd: %s", parameter);
-+     cMenuCommands *menu;
-+     eOSState state = AddSubMenu(menu = new cMenuCommands(tr("Timer commands"), &TimerCommands, parameter));
-+     free(parameter);
-+     if (Key != kNone)
-+        state = menu->ProcessKey(Key);
-+     return state;
-+     }
-+  return osContinue;
-+}
-+
- eOSState cMenuTimers::ProcessKey(eKeys Key)
- {
-   int TimerNumber = HasSubMenu() ? Count() : -1;
-@@ -1212,6 +1260,9 @@
-        case kInfo:
-        case kBlue:   return Info();
-                      break;
-+       case k1...k9: return Commands(Key);
-+       case k0:      return (TimerCommands.Count()? Commands():osContinue);
-+
-        default: break;
-        }
-      }
- 
-diff -Nru vdr-1.7.17/vdr.c vdr-1.7.17-patched/vdr.c
---- vdr-1.7.17/vdr.c	2010-12-12 14:42:00.000000000 +0100
-+++ vdr-1.7.17-patched/vdr.c	2011-03-16 18:56:26.000000000 +0100
-@@ -585,6 +585,7 @@
-   Timers.Load(AddDirectory(ConfigDirectory, "timers.conf"));
-   Commands.Load(AddDirectory(ConfigDirectory, "commands.conf"));
-   RecordingCommands.Load(AddDirectory(ConfigDirectory, "reccmds.conf"));
-+  TimerCommands.Load(AddDirectory(ConfigDirectory, "timercmds.conf"));
-   SVDRPhosts.Load(AddDirectory(ConfigDirectory, "svdrphosts.conf"), true);
-   Keys.Load(AddDirectory(ConfigDirectory, "remote.conf"));
-   KeyMacros.Load(AddDirectory(ConfigDirectory, "keymacros.conf"), true);
diff --git a/patches/vdr-1.5.17-progressbar-support-0.0.1.diff b/patches/vdr-1.5.17-progressbar-support-0.0.1.diff
deleted file mode 100644
index 98b887d..0000000
--- a/patches/vdr-1.5.17-progressbar-support-0.0.1.diff
+++ /dev/null
@@ -1,106 +0,0 @@
-diff -Nru vdr-1.5.17-orig/skinclassic.c vdr-1.5.17-progressbar/skinclassic.c
---- vdr-1.5.17-orig/skinclassic.c
-+++ vdr-1.5.17-progressbar/skinclassic.c
-@@ -314,8 +314,47 @@
-   for (int i = 0; i < MaxTabs; i++) {
-       const char *s = GetTabbedText(Text, i);
-       if (s) {
--         int xt = x0 + Tab(i);
--         osd->DrawText(xt, y, s, ColorFg, ColorBg, font, x2 - xt);
-+         bool isprogressbar = false;
-+         int now = 0, total = 0;
-+         // check if progress bar: "[|||||||   ]"
-+         if ((strlen(s) > 5 && s[0] == '[' && s[strlen(s) - 1] == ']')) {
-+            const char *p = s + 1;
-+            // update status
-+            isprogressbar = true;
-+            for (; *p != ']'; ++p) {
-+                // check if progressbar characters
-+                if (*p == ' ' || *p == '|') {
-+                   // update counters
-+                   ++total;
-+                   if (*p == '|')
-+                      ++now;
-+                   }
-+                else {
-+                   // wrong character detected; not a progressbar
-+                   isprogressbar = false;
-+                   break;
-+                   }
-+                }
-+            }
-+         int xt = x0 + Tab(i);
-+         if (isprogressbar) {
-+            // define x coordinates of progressbar
-+            int px0 = xt;
-+            int px1 = (Tab(i + 1)?Tab(i+1):x1) - 5;
-+            int px = px0 + max((int)((float) now * (float) (px1 - px0) / (float) total), 1);
-+            // define y coordinates of progressbar
-+            int py0 = y + 4;
-+            int py1 = y + lineHeight - 4;
-+            // draw background
-+            osd->DrawRectangle(px0, y, (Tab(i + 1)?Tab(i+1):x1) - 1, y + lineHeight - 1, ColorBg);
-+            // draw progressbar
-+            osd->DrawRectangle(px0,    py0, px,  py1, ColorFg);
-+            osd->DrawRectangle(px + 1, py0, px1, py0 + 1, ColorFg);
-+            osd->DrawRectangle(px + 1, py1 - 1, px1, py1, ColorFg);
-+            osd->DrawRectangle(px1 - 1, py0, px1, py1, ColorFg);
-+            }
-+         else
-+            osd->DrawText(xt, y, s, ColorFg, ColorBg, font, x2 - xt);
-          }
-       if (!Tab(i + 1))
-          break;
-diff -Nru vdr-1.5.17-orig/skinsttng.c vdr-1.5.17-progressbar/skinsttng.c
---- vdr-1.5.17-orig/skinsttng.c
-+++ vdr-1.5.17-progressbar/skinsttng.c
-@@ -558,8 +558,47 @@
-   for (int i = 0; i < MaxTabs; i++) {
-       const char *s = GetTabbedText(Text, i);
-       if (s) {
--         int xt = x3 + 5 + Tab(i);
--         osd->DrawText(xt, y, s, ColorFg, ColorBg, font, x4 - xt);
-+         bool isprogressbar = false;
-+         int now = 0, total = 0;
-+         // check if progress bar: "[|||||||   ]"
-+         if ((strlen(s) > 5 && s[0] == '[' && s[strlen(s) - 1] == ']')) {
-+            const char *p = s + 1;
-+            // update status
-+            isprogressbar = true;
-+            for (; *p != ']'; ++p) {
-+                // check if progressbar characters
-+                if (*p == ' ' || *p == '|') {
-+                   // update counters
-+                   ++total;
-+                   if (*p == '|')
-+                      ++now;
-+                   }
-+                else {
-+                   // wrong character detected; not a progressbar
-+                   isprogressbar = false;
-+                   break;
-+                   }
-+                }
-+            }
-+         int xt = x3 + 5 + Tab(i);
-+         if (isprogressbar) {
-+            // define x coordinates of progressbar
-+            int px0 = xt;
-+            int px1 = x3 + (Tab(i + 1)?Tab(i + 1):x4-x3-5) - 1;
-+            int px = px0 + max((int)((float) now * (float) (px1 - px0) / (float) total), 1);
-+            // define y coordinates of progressbar
-+            int py0 = y + 4;
-+            int py1 = y + lineHeight - 4;
-+            // draw background
-+            osd->DrawRectangle(px0, y, (Tab(i + 1)?Tab(i + 1):x4-x3-5) - 1, y + lineHeight - 1, ColorBg);
-+            // draw progressbar
-+            osd->DrawRectangle(px0,    py0, px,  py1, ColorFg);
-+            osd->DrawRectangle(px + 1, py0, px1, py0 + 1, ColorFg);
-+            osd->DrawRectangle(px + 1, py1 - 1, px1, py1, ColorFg);
-+            osd->DrawRectangle(px1 - 1, py0, px1, py1, ColorFg);
-+            }
-+         else
-+            osd->DrawText(xt, y, s, ColorFg, ColorBg, font, x4 - xt);
-          }
-       if (!Tab(i + 1))
-          break;
diff --git a/patches/vdr.epgsearch-exttimeredit-0.0.2.diff b/patches/vdr.epgsearch-exttimeredit-0.0.2.diff
deleted file mode 100644
index c92ff8c..0000000
--- a/patches/vdr.epgsearch-exttimeredit-0.0.2.diff
+++ /dev/null
@@ -1,110 +0,0 @@
---- menu.c.orig	2009-04-11 14:47:08.000000000 +0200
-+++ menu.c	2009-04-17 13:53:05.000000000 +0200
-@@ -853,6 +853,7 @@ eOSState cMenuEditTimer::ProcessKey(eKey
- class cMenuTimerItem : public cOsdItem {
- private:
-   cTimer *timer;
-+  void DoSet(void);
- public:
-   cMenuTimerItem(cTimer *Timer);
-   virtual int Compare(const cListObject &ListObject) const;
-@@ -863,7 +864,7 @@ public:
- cMenuTimerItem::cMenuTimerItem(cTimer *Timer)
- {
-   timer = Timer;
--  Set();
-+  DoSet();
- }
- 
- int cMenuTimerItem::Compare(const cListObject &ListObject) const
-@@ -873,6 +874,18 @@ int cMenuTimerItem::Compare(const cListO
- 
- void cMenuTimerItem::Set(void)
- {
-+  // check for deleted timer
-+  for (cTimer *t = Timers.First(); ; t = Timers.Next(t)) {
-+     if (t == timer)
-+       break;  // timer still there
-+     if (t == NULL)
-+       return; // no matching timer found
-+     }
-+  DoSet();
-+}
-+
-+void cMenuTimerItem::DoSet(void)
-+{
-   cString day, name("");
-   if (timer->WeekDays())
-      day = timer->PrintDay(0, timer->WeekDays(), false);
-@@ -906,8 +919,7 @@ void cMenuTimerItem::Set(void)
- class cMenuTimers : public cOsdMenu {
- private:
-   int helpKeys;
--  eOSState Edit(void);
--  eOSState New(void);
-+  eOSState Edit(bool New = false);
-   eOSState Delete(void);
-   eOSState OnOff(void);
-   eOSState Info(void);
-@@ -980,19 +992,30 @@ eOSState cMenuTimers::OnOff(void)
-   return osContinue;
- }
- 
--eOSState cMenuTimers::Edit(void)
-+eOSState cMenuTimers::Edit(bool New)
- {
--  if (HasSubMenu() || Count() == 0)
-+  if (HasSubMenu() || (Count() == 0 && !New))
-      return osContinue;
--  isyslog("editing timer %s", *CurrentTimer()->ToDescr());
--  return AddSubMenu(new cMenuEditTimer(CurrentTimer()));
--}
-+  if (!New)
-+     isyslog("editing timer %s", *CurrentTimer()->ToDescr());
- 
--eOSState cMenuTimers::New(void)
--{
--  if (HasSubMenu())
--     return osContinue;
--  return AddSubMenu(new cMenuEditTimer(new cTimer, true));
-+  // Data structure for service "Epgsearch-exttimeredit-v1.0"
-+  struct Epgsearch_exttimeredit_v1_0
-+  {
-+    // in
-+    cTimer* timer;          // pointer to the timer to edit
-+    bool bNew;              // flag that indicates, if this is a new timer or an existing one
-+    const cEvent* event;    // pointer to the event corresponding to this timer (may be NULL)
-+    // out
-+    cOsdMenu* pTimerMenu;   // pointer to the menu of results
-+  } exttimeredit;
-+  exttimeredit.timer = New ? (new cTimer) : CurrentTimer();
-+  exttimeredit.bNew = New;
-+  exttimeredit.event = exttimeredit.timer->Event();
-+  if (cPluginManager::CallFirstService("Epgsearch-exttimeredit-v1.0", &exttimeredit))
-+    return AddSubMenu(exttimeredit.pTimerMenu);
-+
-+  return AddSubMenu(new cMenuEditTimer(exttimeredit.timer, New));
- }
- 
- eOSState cMenuTimers::Delete(void)
-@@ -1038,7 +1061,7 @@ eOSState cMenuTimers::ProcessKey(eKeys K
-      switch (Key) {
-        case kOk:     return Edit();
-        case kRed:    state = OnOff(); break; // must go through SetHelpKeys()!
--       case kGreen:  return New();
-+       case kGreen:  return Edit(true);
-        case kYellow: state = Delete(); break;
-        case kInfo:
-        case kBlue:   return Info();
-@@ -1051,6 +1074,11 @@ eOSState cMenuTimers::ProcessKey(eKeys K
-      Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true);
-      Display();
-      }
-+  if (!HasSubMenu() && Timers.Count()<Count()) {
-+     // timer was deleted
-+     cOsdMenu::Del(Current());
-+     Display();
-+     }
-   if (Key != kNone)
-      SetHelpKeys();
-   return state;
diff --git a/patches/vdr.epgsearch-exttimeredit-2.3.1.diff b/patches/vdr.epgsearch-exttimeredit-2.3.6.diff
similarity index 76%
rename from patches/vdr.epgsearch-exttimeredit-2.3.1.diff
rename to patches/vdr.epgsearch-exttimeredit-2.3.6.diff
index cd453e1..36dc30d 100644
--- a/patches/vdr.epgsearch-exttimeredit-2.3.1.diff
+++ b/patches/vdr.epgsearch-exttimeredit-2.3.6.diff
@@ -1,8 +1,6 @@
-Index: current/menu.c
-===================================================================
---- menu.c.orig	2015-11-02 11:54:55.310709767 +0100
-+++ menu.c	2015-11-02 11:54:55.310709767 +0100
-@@ -1190,6 +1190,7 @@
+--- a/menu.c.orig	2017-06-04 19:18:37.423036244 +0200
++++ b/menu.c	2017-06-09 21:33:53.775782116 +0200
+@@ -1155,6 +1155,7 @@
  class cMenuTimerItem : public cOsdItem {
  private:
    const cTimer *timer;
@@ -10,7 +8,7 @@ Index: current/menu.c
  public:
    cMenuTimerItem(const cTimer *Timer);
    virtual int Compare(const cListObject &ListObject) const;
-@@ -1201,7 +1202,7 @@
+@@ -1166,7 +1167,7 @@
  cMenuTimerItem::cMenuTimerItem(const cTimer *Timer)
  {
    timer = Timer;
@@ -19,18 +17,19 @@ Index: current/menu.c
  }
  
  int cMenuTimerItem::Compare(const cListObject &ListObject) const
-@@ -1211,6 +1212,19 @@
+@@ -1176,6 +1177,20 @@
  
  void cMenuTimerItem::Set(void)
  {
 +  // check for deleted timer
 +  LOCK_TIMERS_READ;
-+  for (const cTimer *t = Timers->First(); ; t = Timers->Next(t)) {
-+     if (t == timer)
-+       break;  // timer still there
-+     if (t == NULL)
-+       return; // no matching timer found
-+     }
++  if (!Timers->Contains(timer))
++  {
++	  if (const cTimer *t = Timers->GetById(timer->Id(), timer->Remote()))
++		  timer = t;
++	  else
++		  return; // no matching timer found
++  }
 +  DoSet();
 +}
 +
@@ -39,7 +38,7 @@ Index: current/menu.c
    cString day, name("");
    if (timer->WeekDays())
       day = timer->PrintDay(0, timer->WeekDays(), false);
-@@ -1258,8 +1273,7 @@
+@@ -1223,8 +1238,7 @@
    cStateKey timersStateKey;
    int helpKeys;
    void Set(void);
@@ -49,26 +48,32 @@ Index: current/menu.c
    eOSState Delete(void);
    eOSState OnOff(void);
    eOSState Info(void);
-@@ -1351,20 +1365,29 @@
+@@ -1316,21 +1330,34 @@
    return osContinue;
  }
  
 -eOSState cMenuTimers::Edit(void)
--{
++eOSState cMenuTimers::Edit(bool New)
+ {
 -  if (HasSubMenu() || Count() == 0)
--     return osContinue;
++  if (HasSubMenu() || Count() == 0 && !New)
+      return osContinue;
 -  return AddSubMenu(new cMenuEditTimer(GetTimer()));
 -}
 -
 -eOSState cMenuTimers::New(void)
-+eOSState cMenuTimers::Edit(bool New)
- {
+-{
 -  if (HasSubMenu())
-+  if (HasSubMenu() || Count() == 0 && !New)
-      return osContinue;
-   cTimer *Timer = new cTimer;
-   if (*Setup.SVDRPDefaultHost)
+-     return osContinue;
+-  cTimer *Timer = new cTimer;
++  cTimer *Timer;
++  if (New)
++  {
++  Timer = new cTimer;
+   if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
       Timer->SetRemote(Setup.SVDRPDefaultHost);
+-  return AddSubMenu(new cMenuEditTimer(Timer, true));
++  }
 +  // Data structure for service "Epgsearch-exttimeredit-v1.0"
 +  struct Epgsearch_exttimeredit_v1_0
 +  {
@@ -79,16 +84,17 @@ Index: current/menu.c
 +    // out
 +    cOsdMenu* pTimerMenu;   // pointer to the menu of results
 +  } exttimeredit;
-+  exttimeredit.timer = New ? (new cTimer) : GetTimer();
++  exttimeredit.timer = New ? Timer : GetTimer();
 +  exttimeredit.bNew = New;
 +  exttimeredit.event = exttimeredit.timer->Event();
 +  if (cPluginManager::CallFirstService("Epgsearch-exttimeredit-v1.0", &exttimeredit))
 +    return AddSubMenu(exttimeredit.pTimerMenu);
 +
-   return AddSubMenu(new cMenuEditTimer(Timer, true));
++  return AddSubMenu(new cMenuEditTimer(exttimeredit.timer, New));
  }
  
-@@ -1423,7 +1446,7 @@
+ eOSState cMenuTimers::Delete(void)
+@@ -1386,7 +1413,7 @@
       switch (Key) {
         case kOk:     return Edit();
         case kRed:    state = OnOff(); break; // must go through SetHelpKeys()!
@@ -97,7 +103,7 @@ Index: current/menu.c
         case kYellow: state = Delete(); break;
         case kInfo:
         case kBlue:   return Info();
-@@ -1437,6 +1460,14 @@
+@@ -1400,6 +1427,14 @@
       Add(new cMenuTimerItem(Timer), true);
       Display();
       }
diff --git a/pending_notifications.c b/pending_notifications.c
index 8d3046d..2702d1f 100644
--- a/pending_notifications.c
+++ b/pending_notifications.c
@@ -121,13 +121,8 @@ const char *cPendingNotification::ToText(void) const
 	free(buffer);
     buffer = NULL;
 
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel *channel = vdrchannels->GetByChannelID(channelID, true, true);
+    const cChannel *channel = Channels->GetByChannelID(channelID, true, true);
     if (!channel)
 	LogFile.Log(3,"invalid channel in pending notifications!");
 
diff --git a/po/ca_ES.po b/po/ca_ES.po
index a86b5cc..3aef54b 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Jordi Vilà <jvila at tinet.org>\n"
 "Language-Team: Catalan <vdr at linuxtv.org>\n"
@@ -742,6 +742,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -811,6 +814,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -823,6 +829,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -956,6 +965,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index 2d071c7..242884e 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.7.21\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2011-10-31 20:21+0200\n"
 "Last-Translator: Radek Stastny <dedkus at gmail.com>\n"
 "Language-Team: Czech <vdr at linuxtv.org>\n"
@@ -739,6 +739,9 @@ msgstr "Vytvořit blacklist"
 msgid "EPG Commands"
 msgstr "EPG příkazy"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "Již běží!"
 
@@ -808,6 +811,9 @@ msgstr "Stanice"
 msgid "Childlock"
 msgstr "Dětská pojistka"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Kontrola Nahrávání"
 
@@ -820,6 +826,9 @@ msgstr "S Názvem dílu"
 msgid "Button$Without subtitle"
 msgstr "Bez Názvu dílu"
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr "Rozšířené"
 
@@ -953,6 +962,9 @@ msgstr "Informovat a přepnout"
 msgid "Announce by mail"
 msgstr "Informovat mailem"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr "globální"
 
diff --git a/po/da_DK.po b/po/da_DK.po
index 008c328..f2237ae 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Mogens Elneff <mogens at elneff.dk>\n"
 "Language-Team: Danish <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -954,6 +963,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/de_DE.po b/po/de_DE.po
index 09b0c75..703f665 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Klaus Schmidinger <kls at cadsoft.de>\n"
 "Language-Team: German <vdr at linuxtv.org>\n"
@@ -778,6 +778,9 @@ msgstr "Ausschlussliste anlegen"
 msgid "EPG Commands"
 msgstr "EPG Befehle"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr "Epgsearch: Problem bei RemoteTimerModifications"
+
 msgid "Already running!"
 msgstr "Läuft bereits!"
 
@@ -847,6 +850,9 @@ msgstr ""
 msgid "Childlock"
 msgstr "Kindersicherung"
 
+msgid "Record on"
+msgstr "Aufnehmen auf"
+
 msgid "Timer check"
 msgstr "Überwachung"
 
@@ -859,6 +865,9 @@ msgstr "Mit Untertitel"
 msgid "Button$Without subtitle"
 msgstr "Ohne Untertitel"
 
+msgid "Timer has been deleted"
+msgstr "Timer wurde gelöscht!"
+
 msgid "Button$Extended"
 msgstr "Erweitert"
 
@@ -991,6 +1000,9 @@ msgstr "Ankündigen und Umschalten"
 msgid "Announce by mail"
 msgstr "per Mail ankündigen"
 
+msgid "Inactive record"
+msgstr "inaktive Aufnahme"
+
 msgid "only globals"
 msgstr "nur globale"
 
@@ -1280,6 +1292,12 @@ msgstr "Umschalten zu (%d) '%s'?"
 msgid "Programming timer failed!"
 msgstr "Timer-Programmierung fehlschlagen!"
 
+#~ msgid "Epgsearch: recursive TIMERS LOCK"
+#~ msgstr "Epgsearch: Rekursiver TIMER Lock"
+
+#~ msgid "Epgsearch: Recursive LOCK DeleteTimer failed"
+#~ msgstr "Epgsearch: Rekursiver LOCK Problem beim Löschen eines Timers"
+
 #~ msgid "in %02ldd"
 #~ msgstr "in %02ldd"
 
diff --git a/po/el_GR.po b/po/el_GR.po
index d9c5fc1..2befab5 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Dimitrios Dimitrakos <mail at dimitrios.de>\n"
 "Language-Team: Greek <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -954,6 +963,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/es_ES.po b/po/es_ES.po
index 069bb5b..e77a5eb 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-11-18 20:09+0200\n"
 "Last-Translator: bittor from open7x0.org <bittor7x0 _at_ gmail.com>\n"
 "Language-Team: Spanish <vdr at linuxtv.org>\n"
@@ -781,6 +781,9 @@ msgstr "Crear lista negra"
 msgid "EPG Commands"
 msgstr "Órdenes EPG"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "¡Ya se está ejecutando!"
 
@@ -850,6 +853,9 @@ msgstr "Canal"
 msgid "Childlock"
 msgstr "Bloqueo niños"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Comprobación"
 
@@ -862,6 +868,9 @@ msgstr "Con subtítulo"
 msgid "Button$Without subtitle"
 msgstr "Sin subtítulo"
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr "Ampliado"
 
@@ -997,6 +1006,9 @@ msgstr "Avisar y cambiar"
 msgid "Announce by mail"
 msgstr "Sólo avisar"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/et_EE.po b/po/et_EE.po
index 3cefb49..c5f5e7e 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Arthur Konovalov <kasjas at hot.ee>\n"
 "Language-Team: Estonian <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -954,6 +963,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/fi_FI.po b/po/fi_FI.po
index 4e5f963..24c7e59 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: EPGSearch 0.9.25\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2011-01-04 21:07+0200\n"
 "Last-Translator: Ville Skyttä <ville.skytta at iki.fi>\n"
 "Language-Team: Finnish <vdr at linuxtv.org>\n"
@@ -782,6 +782,9 @@ msgstr "Lisää mustalle listalle"
 msgid "EPG Commands"
 msgstr "Komennot"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "Nyt menossa!"
 
@@ -851,6 +854,9 @@ msgstr "Kanava"
 msgid "Childlock"
 msgstr "Lapsilukko"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Valvontatapa"
 
@@ -863,6 +869,9 @@ msgstr "Kuvaus"
 msgid "Button$Without subtitle"
 msgstr "Ei kuvausta"
 
+msgid "Timer has been deleted"
+msgstr "Ajastin on poistettu!"
+
 msgid "Button$Extended"
 msgstr "Laaja"
 
@@ -995,6 +1004,9 @@ msgstr "muistutus ja kanavanvaihto"
 msgid "Announce by mail"
 msgstr "muistutus sähköpostitse"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr "vain globaalit"
 
diff --git a/po/fr_FR.po b/po/fr_FR.po
index feb877c..8928dbc 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2008-04-30 08:36+0200\n"
 "Last-Translator: Patrice Staudt <patrice.staudt at laposte.net>\n"
 "Language-Team: French <vdr at linuxtv.org>\n"
@@ -781,6 +781,9 @@ msgstr "Créer la liste d'exclusions"
 msgid "EPG Commands"
 msgstr "Commande EPG"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "Est déjà en cours"
 
@@ -850,6 +853,9 @@ msgstr "Chaîne"
 msgid "Childlock"
 msgstr "Adulte"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "surveiller"
 
@@ -862,6 +868,9 @@ msgstr "Avec les sous-titres"
 msgid "Button$Without subtitle"
 msgstr "Sans sous-titres"
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr "Extention"
 
@@ -998,6 +1007,9 @@ msgstr "Annoncer seulement début d'une programme"
 msgid "Announce by mail"
 msgstr "Annoncer seulement début d'une programme"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/hr_HR.po b/po/hr_HR.po
index 1e6c148..fed7b39 100644
--- a/po/hr_HR.po
+++ b/po/hr_HR.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Drazen Dupor <drazen.dupor at dupor.com>\n"
 "Language-Team: Croatian <vdr at linuxtv.org>\n"
@@ -741,6 +741,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -810,6 +813,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -822,6 +828,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -955,6 +964,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/hu_HU.po b/po/hu_HU.po
index d156991..b3bac82 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Istvan Koenigsberger <istvnko at hotmail.com>, Guido Josten <guido.josten at t-online.de>\n"
 "Language-Team: Hungarian <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -953,6 +962,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/it_IT.po b/po/it_IT.po
index 9c76e0d..ebfb1b8 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2011-07-17 17:46+0100\n"
 "Last-Translator: Diego Pierotto <vdr-italian at tiscali.it>\n"
 "Language-Team: Italian <vdr at linuxtv.org>\n"
@@ -784,6 +784,9 @@ msgstr "Crea lista esclusioni"
 msgid "EPG Commands"
 msgstr "Comandi EPG"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "In esecuzione!"
 
@@ -853,6 +856,9 @@ msgstr "Canale"
 msgid "Childlock"
 msgstr "Filtro famiglia"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Verifica timer"
 
@@ -865,6 +871,9 @@ msgstr "Con sottotitoli"
 msgid "Button$Without subtitle"
 msgstr "Senza sottotitoli"
 
+msgid "Timer has been deleted"
+msgstr "Il timer è stata eliminato!"
+
 msgid "Button$Extended"
 msgstr "Esteso"
 
@@ -998,6 +1007,9 @@ msgstr "Annuncia e cambia"
 msgid "Announce by mail"
 msgstr "Annuncia tramite email"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr "solo globali"
 
diff --git a/po/lt_LT.po b/po/lt_LT.po
index a9f2cf4..4ce7a98 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.7.10\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Valdemaras Pipiras <varas at ambernet.lt>\n"
 "Language-Team: Lithuanian <vdr at linuxtv.org>\n"
@@ -786,6 +786,9 @@ msgstr "Sukurti juodajį sąrašą"
 msgid "EPG Commands"
 msgstr "EPG komandos"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "Jau groja!"
 
@@ -855,6 +858,9 @@ msgstr "Kanalas"
 msgid "Childlock"
 msgstr "Paveldėtojo užraktas"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Laikmačio patikra"
 
@@ -867,6 +873,9 @@ msgstr "Su subtitrais"
 msgid "Button$Without subtitle"
 msgstr "Be subtitrų"
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr "Išplėstas"
 
@@ -1000,6 +1009,9 @@ msgstr "Perspėti ir perjungti"
 msgid "Announce by mail"
 msgstr "Perspėti per emailą"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/nl_NL.po b/po/nl_NL.po
index 6e48357..142c6ba 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-12 12:04+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Maarten Wisse <Maarten.Wisse at urz.uni-hd.de>\n"
 "Language-Team: Dutch <vdr at linuxtv.org>\n"
@@ -780,6 +780,9 @@ msgstr "Maak nieuwe blacklist"
 msgid "EPG Commands"
 msgstr "EPG commando's"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "Reeds actief!"
 
@@ -849,6 +852,9 @@ msgstr "Kanaal"
 msgid "Childlock"
 msgstr "Kinderslot"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Timercontrole"
 
@@ -861,6 +867,9 @@ msgstr "Met ondertitel"
 msgid "Button$Without subtitle"
 msgstr "Zonder ondertitel"
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr "Uitgebreid"
 
@@ -997,6 +1006,9 @@ msgstr "Alleen aankondigen (geen timer)"
 msgid "Announce by mail"
 msgstr "Alleen aankondigen (geen timer)"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/nn_NO.po b/po/nn_NO.po
index ea595f8..286e41f 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Truls Slevigen <truls at slevigen.no>\n"
 "Language-Team: Norwegian Nynorsk <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -953,6 +962,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 7b46579..b91d576 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Michael Rakowski <mrak at gmx.de>\n"
 "Language-Team: Polish <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -953,6 +962,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/pt_PT.po b/po/pt_PT.po
index 67fa81c..47bc02a 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Paulo Lopes <pmml at netvita.pt>\n"
 "Language-Team: Portuguese <vdr at linuxtv.org>\n"
@@ -739,6 +739,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -808,6 +811,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -820,6 +826,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -952,6 +961,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/ro_RO.po b/po/ro_RO.po
index 13d2a3d..20683e6 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Lucian Muresan <lucianm at users.sourceforge.net>\n"
 "Language-Team: Romanian <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -953,6 +962,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/ru_RU.po b/po/ru_RU.po
index fa73059..188430d 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Vyacheslav Dikonov <sdiconov at mail.ru>\n"
 "Language-Team: Russian <vdr at linuxtv.org>\n"
@@ -739,6 +739,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -808,6 +811,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -820,6 +826,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -952,6 +961,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/sk_SK.po b/po/sk_SK.po
index 52765d7..10e771e 100644
--- a/po/sk_SK.po
+++ b/po/sk_SK.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: epgsearch\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2009-11-02 09:40+0100\n"
 "Last-Translator: Milan Hrala <hrala.milan at gmail.com>\n"
 "Language-Team: Slovak <hrala.milan at gmail.com>\n"
@@ -781,6 +781,9 @@ msgstr "Vytvoriť čiernu listinu"
 msgid "EPG Commands"
 msgstr "EPG príkazy"
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr "Práve spustené!"
 
@@ -850,6 +853,9 @@ msgstr "Kanál"
 msgid "Childlock"
 msgstr "Detský zámok"
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr "Kontrola plánu"
 
@@ -862,6 +868,9 @@ msgstr "S titulkami"
 msgid "Button$Without subtitle"
 msgstr "Bez titulkov"
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr "Rozšírené"
 
@@ -998,6 +1007,9 @@ msgstr "Iba oznámiť"
 msgid "Announce by mail"
 msgstr "Iba oznámiť"
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/sl_SI.po b/po/sl_SI.po
index d3e4087..631d5ba 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Matjaz Thaler <matjaz.thaler at guest.arnes.si>\n"
 "Language-Team: Slovenian <vdr at linuxtv.org>\n"
@@ -741,6 +741,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -810,6 +813,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -822,6 +828,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -954,6 +963,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/sv_SE.po b/po/sv_SE.po
index 4b59f38..dfcd6f8 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Tomas Prybil <tomas at prybil.se>\n"
 "Language-Team: Swedish <vdr at linuxtv.org>\n"
@@ -740,6 +740,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -809,6 +812,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -821,6 +827,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -954,6 +963,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/po/tr_TR.po b/po/tr_TR.po
index 47852fd..3e8305c 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.5.7\n"
 "Report-Msgid-Bugs-To: <see README>\n"
-"POT-Creation-Date: 2013-03-05 20:24+0100\n"
+"POT-Creation-Date: 2017-05-04 17:01+0200\n"
 "PO-Revision-Date: 2007-08-14 20:21+0200\n"
 "Last-Translator: Oktay Yolgeçen <oktay_73 at yahoo.de>\n"
 "Language-Team: Turkish <vdr at linuxtv.org>\n"
@@ -739,6 +739,9 @@ msgstr ""
 msgid "EPG Commands"
 msgstr ""
 
+msgid "Epgsearch: RemoteTimerModifications failed"
+msgstr ""
+
 msgid "Already running!"
 msgstr ""
 
@@ -808,6 +811,9 @@ msgstr ""
 msgid "Childlock"
 msgstr ""
 
+msgid "Record on"
+msgstr ""
+
 msgid "Timer check"
 msgstr ""
 
@@ -820,6 +826,9 @@ msgstr ""
 msgid "Button$Without subtitle"
 msgstr ""
 
+msgid "Timer has been deleted"
+msgstr ""
+
 msgid "Button$Extended"
 msgstr ""
 
@@ -952,6 +961,9 @@ msgstr ""
 msgid "Announce by mail"
 msgstr ""
 
+msgid "Inactive record"
+msgstr ""
+
 msgid "only globals"
 msgstr ""
 
diff --git a/recdone.c b/recdone.c
index e9b52e0..f40922d 100644
--- a/recdone.c
+++ b/recdone.c
@@ -200,13 +200,8 @@ const char *cRecDone::ToText(void)
 	free(buffer);
     buffer = NULL;
 
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel *channel = vdrchannels->GetByChannelID(channelID, true, true);
+    const cChannel *channel = Channels->GetByChannelID(channelID, true, true);
     if (!channel)
 	LogFile.Log(3,"invalid channel in recs done!");
 
@@ -232,13 +227,8 @@ bool cRecDone::Save(FILE *f)
 
 int cRecDone::ChannelNr()
 {
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel* channel = vdrchannels->GetByChannelID(channelID, true, true);
+    const cChannel* channel = Channels->GetByChannelID(channelID, true, true);
     if (!channel)
 	return -1;
     else
diff --git a/recstatus.c b/recstatus.c
index f2fd993..794ba27 100644
--- a/recstatus.c
+++ b/recstatus.c
@@ -27,14 +27,10 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 #include "conflictcheck_thread.h"
 #include "epgsearchcfg.h"
 #include <math.h>
-#if VDRVERSNUM > 20300
-#include "status_thread.h"
-#else
 #define ALLOWED_BREAK_INSECS 2
 
 extern int updateForced;
 extern int gl_InfoConflict;
-#endif
 
 
 cRecStatusMonitor* gl_recStatusMonitor = NULL;
@@ -45,9 +41,6 @@ cRecStatusMonitor::cRecStatusMonitor()
 
 void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const char* Filename, bool On)
 {
-#if VDRVERSNUM > 20300
-   cStatusThread::Init(Device,Name,Filename,On);
-#else
    time_t now = time(NULL);
    // insert new timers currently recording in TimersRecording
    if (On && Name)
@@ -55,7 +48,8 @@ void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const
       if (EPGSearchConfig.checkTimerConflOnRecording)
          cConflictCheckThread::Init((cPluginEpgsearch*)cPluginManager::GetPlugin("epgsearch"), true);
 
-      for (cTimer *ti = Timers.First(); ti; ti = Timers.Next(ti))
+		LOCK_TIMERS_READ;
+		for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
          if (ti->Recording())
          {
             // check if this is a new entry
@@ -119,7 +113,9 @@ void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const
       {
          // check if timer still exists
          bool found = false;
-         for (cTimer *ti = Timers.First(); ti; ti = Timers.Next(ti))
+
+			LOCK_TIMERS_READ;
+			for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
             if (ti == tiR->timer)
             {
                found = true;
@@ -136,13 +132,11 @@ void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const
                // check if recording has ended before timer end
 
                bool complete = true;
-#if VDRVERSNUM > 20300
-	       LOCK_RECORDINGS_READ;
-	       const cRecordings *vdrrecordings = Recordings;
-#else
-	       cRecordings *vdrrecordings = &Recordings;
-#endif
-	       const cRecording *pRecording = vdrrecordings->GetByName(Filename);
+			   const cRecording *pRecording;
+			   {
+	             LOCK_RECORDINGS_READ;
+	             pRecording = Recordings->GetByName(Filename);
+			   }
 	       long timerLengthSecs = tiR->timer->StopTime()-tiR->timer->StartTime();
 	       int recFraction = 100;
 	       if (pRecording && timerLengthSecs)
@@ -203,7 +197,6 @@ void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const
          tiR = TimersRecording.Next(tiR);
       }
    }
-#endif
 }
 
 int cRecStatusMonitor::TimerRecDevice(const cTimer* timer)
@@ -216,38 +209,11 @@ int cRecStatusMonitor::TimerRecDevice(const cTimer* timer)
 
 bool cRecStatusMonitor::IsPesRecording(const cRecording *pRecording)
 {
-#if VDRVERSNUM < 10703
-  return true;
-#else
   return pRecording && pRecording->IsPesRecording();
-#endif
 }
 
 #define LOC_INDEXFILESUFFIX     "/index"
 
-#if VDRVERSNUM < 10703
-
-int cRecStatusMonitor::RecLengthInSecs(const cRecording *pRecording)
-{
-  struct stat buf;
-  cString fullname = cString::sprintf("%s%s", pRecording->FileName(), "/index.vdr");
-  if (stat(fullname, &buf) == 0)
-  {
-    struct tIndex { int offset; uchar type; uchar number; short reserved; };
-    int delta = buf.st_size % sizeof(tIndex);
-    if (delta)
-    {
-      delta = sizeof(tIndex) - delta;
-      esyslog("ERROR: invalid file size (%ld) in '%s'", buf.st_size, *fullname);
-    }
-    return (buf.st_size + delta) / sizeof(tIndex) / SecondsToFrames(1);
-  }
-  else
-    return -1;
-}
-
-#else
-
 struct tIndexTs {
   uint64_t offset:40; // up to 1TB per file (not using off_t here - must definitely be exactly 64 bit!)
   int reserved:7;     // reserved for future use
@@ -275,4 +241,3 @@ int cRecStatusMonitor::RecLengthInSecs(const cRecording *pRecording)
     }
   return -1;
 }
-#endif
diff --git a/recstatus.h b/recstatus.h
index 0d08b6c..c0104f9 100644
--- a/recstatus.h
+++ b/recstatus.h
@@ -38,9 +38,7 @@ public:
 
 class cRecStatusMonitor : public cStatus
 {
-#if VDRVERSNUM > 20300
 public:
-#endif
     cList<cRecDoneTimerObj> TimersRecording;
 protected:
     virtual void Recording(const cDevice *Device, const char *Name, const char*, bool On);
diff --git a/searchtimer_thread.c b/searchtimer_thread.c
index 2ad4b07..930ba99 100644
--- a/searchtimer_thread.c
+++ b/searchtimer_thread.c
@@ -99,15 +99,11 @@ void cSearchTimerThread::Stop(void) {
 }
 
 
-const cTimer *cSearchTimerThread::GetTimer(const cTimers* vdrtimers, cSearchExt *searchExt, const cEvent *pEvent, bool& bTimesMatchExactly)
+const cTimer *cSearchTimerThread::GetTimer(cSearchExt *searchExt, const cEvent *pEvent, bool& bTimesMatchExactly)
 {
-#if VDRVERSNUM > 20300
+   LOCK_TIMERS_READ;
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   const cChannel *channel = vdrchannels->GetByChannelID(pEvent->ChannelID(), true, true);
+   const cChannel *channel = Channels->GetByChannelID(pEvent->ChannelID(), true, true);
    if (!channel)
       return NULL;
 
@@ -135,7 +131,7 @@ const cTimer *cSearchTimerThread::GetTimer(const cTimers* vdrtimers, cSearchExt
 
    tm *tmStartEv = localtime_r(&eStart, &tm_r);
 
-   for (const cTimer *ti = vdrtimers->First(); ti; ti = vdrtimers->Next(ti))
+   for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
    {
       if (ti->Channel() != channel)
          continue;
@@ -143,8 +139,10 @@ const cTimer *cSearchTimerThread::GetTimer(const cTimers* vdrtimers, cSearchExt
       if (ti->WeekDays()) // ignore serial timers
          continue;
 
+	  if (ti->Remote()) // ignore remote timers
+		 continue;
       // ignore manual timers if this search could modify them
-      if (searchExt->action == searchTimerActionRecord && TriggeredFromSearchTimerID(ti) == -1) // manual timer
+      if ((searchExt->action == searchTimerActionRecord || searchExt->action == searchTimerActionInactiveRecord) && TriggeredFromSearchTimerID(ti) == -1) // manual timer
          continue;
 
       if (UseVPS && ti->HasFlags(tfVps))
@@ -234,18 +232,11 @@ void cSearchTimerThread::Action(void)
 	    while(EITScanner.Active() && m_Active && Running());
   	    LogFile.Log(1,"EPG scan finished");
 	 }
-#if VDRVERSNUM > 20300
          // wait if TimersWriteLock is set or waited for
          {
-             LOCK_TIMERS_READ;
-         }
-#else
-         if (Timers.BeingEdited())
-         {
-            Wait.Wait(1000);
-            continue;
+             LOCK_TIMERS_WRITE;
+             Timers->SetExplicitModify();
          }
-#endif
          LogFile.iSysLog("search timer update started");
 
          UserVars.ResetCache(); // reset internal cache of user vars
@@ -265,15 +256,7 @@ void cSearchTimerThread::Action(void)
                searchExt = localSearchExts->Next(searchExt);
                continue;
             }
-           {
-#if VDRVERSNUM > 20300
-            LOCK_TIMERS_READ;
-            cTimers *vdrtimers = (cTimers *)Timers;
-#else
-            cTimers *vdrtimers = &Timers;
-#endif
-            pOutdatedTimers = searchExt->GetTimerList(vdrtimers, pOutdatedTimers);
-           } // End of Block should release ReadLock
+            pOutdatedTimers = searchExt->GetTimerList(pOutdatedTimers);
 
             cSearchResults* pSearchResults = searchExt->Run(-1, true);
             if (!pSearchResults)
@@ -296,13 +279,8 @@ void cSearchTimerThread::Action(void)
                   continue;
 
                {
-#if VDRVERSNUM > 20300
                LOCK_CHANNELS_READ;
-               const cChannels *vdrchannels = Channels;
-#else
-               cChannels *vdrchannels = &Channels;
-#endif
-               const cChannel *channel = vdrchannels->GetByChannelID(pEvent->ChannelID(), true, true);
+               const cChannel *channel = Channels->GetByChannelID(pEvent->ChannelID(), true, true);
                if (!channel)
                   continue;
                }
@@ -332,18 +310,10 @@ void cSearchTimerThread::Action(void)
 
                // search for an already existing timer
                bool bTimesMatchExactly = false;
-#if VDRVERSNUM > 20300
-               const cTimer *t = NULL;
-               {
-               LOCK_TIMERS_READ;
-               t = GetTimer(Timers,searchExt, pEvent, bTimesMatchExactly);
-               }
-#else
-               const cTimer *t = GetTimer(&Timers,searchExt, pEvent, bTimesMatchExactly);
-#endif
+               const cTimer *t = GetTimer(searchExt, pEvent, bTimesMatchExactly);
 
                char* Summary = NULL;
-	       uint timerMod = tmNoChange;
+               uint timerMod = tmNoChange;
 
                if (t)
                { // already exists
@@ -424,7 +394,7 @@ void cSearchTimerThread::Action(void)
                         if (timerMod & tmAuxEventID)
 			  LogFile.Log(3,"timer for '%s~%s' (%s - %s, channel %d) : aux info for event id has changed", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent));
 		      }
-		    index = t->Index()+1;
+		    index = t->Id();
 		    Priority = t->Priority();
 		    Lifetime = t->Lifetime();
                   }
@@ -533,24 +503,11 @@ void cSearchTimerThread::Action(void)
                {
                   const cTimer* t = tObj->timer;
                   // timer could have been deleted meanwhile, so check if its still there
-                  bool found = false;
-#if VDRVERSNUM > 20300
                   {
                   LOCK_TIMERS_READ;
-                  const cTimers *vdrtimers = Timers;
-#else
-                  cTimers *vdrtimers = &Timers;
-#endif
-                  for(const cTimer* checkT = vdrtimers->First(); checkT; checkT = vdrtimers->Next(checkT))
-                     if (checkT == t)
-                     {
-                        found = true;
-                        break;
-                     }
-#if VDRVERSNUM > 20300
+                  if (!Timers->Contains(t))
+                     continue;
                   }
-#endif
-                  if (!found) continue;
 
                   if (TimerWasModified(t)) continue;
                   if (!t->Event()) continue; // if there is no event, we keep the timer, since EPG could have been cleared
@@ -704,7 +661,7 @@ char* cSearchTimerThread::SummaryExtended(cSearchExt* searchExt, const cTimer* T
    return tmpSummary;
 }
 
-bool cSearchTimerThread::AddModTimer(const cTimer* Timer, int index, cSearchExt* searchExt, const cEvent* pEvent, int Prio, int Lifetime, char* Summary, uint timerMod)
+bool cSearchTimerThread::AddModTimer(cTimer* Timer, int index, cSearchExt* searchExt, const cEvent* pEvent, int Prio, int Lifetime, char* Summary, uint timerMod)
 {
    char *cmdbuf = NULL;
 
@@ -724,6 +681,9 @@ bool cSearchTimerThread::AddModTimer(const cTimer* Timer, int index, cSearchExt*
    else
       Flags = 1; // don't use VPS, if not set in this search
 
+   if (searchExt->action == searchTimerActionInactiveRecord)
+      Flags &= ~tfActive;
+
    // already done the same timer?
    if (!EPGSearchConfig.TimerProgRepeat && index == 0 && TimersDone.InList(start, stop, pEvent, -1))
    {
@@ -743,7 +703,9 @@ bool cSearchTimerThread::AddModTimer(const cTimer* Timer, int index, cSearchExt*
    }
    else
       tmpSummary = SummaryExtended(searchExt, Timer, pEvent);
-
+   if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+      Timer->SetRemote(Setup.SVDRPDefaultHost);
+   else {
    if (index==0)
       msprintf(&cmdbuf, "NEWT %d:%d:%s:%s:%s:%d:%d:%s:%s",
                Flags,
@@ -770,6 +732,9 @@ bool cSearchTimerThread::AddModTimer(const cTimer* Timer, int index, cSearchExt*
 
    if (!SendViaSVDRP(cmdbuf))
      return false;
+   }
+   if (!HandleRemoteTimerModifications(Timer))
+     return false;
 
    if (gl_timerStatusMonitor) gl_timerStatusMonitor->SetConflictCheckAdvised();
 
@@ -807,7 +772,7 @@ void cSearchTimerThread::RemoveTimer(const cTimer* t, const cEvent* e)
          TimersDone.Save();
       }
    }
-   DelTimer(t->Index()+1);
+   DelTimer(t->Id());
 }
 
 void cSearchTimerThread::DelRecording(int index)
@@ -820,23 +785,13 @@ void cSearchTimerThread::DelRecording(int index)
 void cSearchTimerThread::CheckExpiredRecs()
 {
    LogFile.Log(1, "check for expired recordings started");
-#if VDRVERSNUM > 20300
    LOCK_RECORDINGS_WRITE;
-   cRecordings *vdrrecordings = Recordings;
-#else
-   cThreadLock RecordingsLock(&Recordings);
-   cRecordings *vdrrecordings = &Recordings;
-#endif
+   Recordings->SetExplicitModify();
    cList<cRecordingObj> DelRecordings;
-   for (cRecording *recording = vdrrecordings->First(); recording && m_Active; recording = vdrrecordings->Next(recording))
+   for (cRecording *recording = Recordings->First(); recording && m_Active; recording = Recordings->Next(recording))
    {
-#if APIVERSNUM < 10721
-      LogFile.Log(3, "check recording %s from %s for expiration", recording->Name(), DAYDATETIME(recording->start));
-      if (recording->start == 0)
-#else
       LogFile.Log(3, "check recording %s from %s for expiration", recording->Name(), DAYDATETIME(recording->Start()));
       if (recording->Start() == 0)
-#endif
       {
          LogFile.Log(2, "oops, recording %s has no start time, skipped", recording->Name());
          continue;
@@ -868,11 +823,7 @@ void cSearchTimerThread::CheckExpiredRecs()
       if (search->delAfterDays == 0) continue;
       time_t now = time(NULL);
 
-#if APIVERSNUM < 10721
-      int daysBetween = int(double((now - recording->start)) / (60*60*24));
-#else
       int daysBetween = int(double((now - recording->Start())) / (60*60*24));
-#endif
       if (daysBetween  >= search->delAfterDays)
          DelRecordings.Add(new cRecordingObj(recording, search));
       else
@@ -884,25 +835,20 @@ void cSearchTimerThread::CheckExpiredRecs()
       cSearchExt* search = recordingObj->search;
       if (search->recordingsKeep > 0 && search->recordingsKeep >= search->GetCountRecordings())
       {
-#if APIVERSNUM < 10721
-         LogFile.Log(1, "recording '%s' from %s expired, but will be kept, search timer %s", recording->Name(), DAYDATETIME(recording->start), recordingObj->search->search);
-#else
          LogFile.Log(1, "recording '%s' from %s expired, but will be kept, search timer %s", recording->Name(), DAYDATETIME(recording->Start()), recordingObj->search->search);
-#endif
          continue;
       }
-#if APIVERSNUM < 10721
-      LogFile.Log(1, "delete expired recording '%s' from %s, search timer %s", recording->Name(), DAYDATETIME(recording->start), recordingObj->search->search);
-#else
       LogFile.Log(1, "delete expired recording '%s' from %s, search timer %s", recording->Name(), DAYDATETIME(recording->Start()), recordingObj->search->search);
-#endif
       cRecordControl *rc = cRecordControls::GetRecordControl(recording->FileName());
       if (!rc)
       {
          if (!recording->Delete())
             LogFile.Log(1, "error deleting recording!");
          else
-            vdrrecordings->DelByName(recording->FileName());
+         {
+            Recordings->DelByName(recording->FileName());
+            Recordings->SetModified();
+         }
       }
       else
          LogFile.Log(1, "recording already in use by a timer!");
@@ -912,7 +858,7 @@ void cSearchTimerThread::CheckExpiredRecs()
 
 void cSearchTimerThread::ModifyManualTimer(const cEvent* event, const cTimer* timer, int bstart, int bstop)
 {
-   LogFile.Log(1,"modified manual timer %d for '%s~%s' (%s - %s)", timer->Index()+1, event->Title(), event->ShortText()?event->ShortText():"", GETDATESTRING(event), GETTIMESTRING(event));
+   LogFile.Log(1,"modified manual timer %d for '%s~%s' (%s - %s)", timer->Id(), event->Title(), event->ShortText()?event->ShortText():"", GETDATESTRING(event), GETTIMESTRING(event));
 
    time_t start = event->StartTime() - bstart;
    time_t stop = event->EndTime() + bstop;
@@ -929,7 +875,7 @@ void cSearchTimerThread::ModifyManualTimer(const cEvent* event, const cTimer* ti
 
    char* cmdbuf = NULL;
    msprintf(&cmdbuf, "MODT %d %d:%d:%s:%s:%s:%d:%d:%s:%s",
-            timer->Index()+1,
+            timer->Id(),
             timer->Flags(),
             timer->Channel()->Number(),
             daybuffer,
@@ -952,18 +898,10 @@ void cSearchTimerThread::CheckManualTimers(void)
 {
    LogFile.Log(1, "manual timer check started");
 
-#if VDRVERSNUM > 20300
-    LOCK_TIMERS_WRITE;  // to be checked !!!
-    cTimers *vdrtimers = (cTimers*) Timers;
+    LOCK_TIMERS_READ;
     LOCK_SCHEDULES_READ;
-    const cSchedules *schedules = Schedules;
-#else
-    cTimers *vdrtimers = &Timers;
-    cSchedulesLock SchedulesLock;
-    const cSchedules* schedules = cSchedules::Schedules(SchedulesLock);
-#endif
 
-   for (const cTimer *ti = vdrtimers->First(); ti && m_Active; ti = vdrtimers->Next(ti))
+   for (const cTimer *ti = Timers->First(); ti && m_Active; ti = Timers->Next(ti))
    {
       if (TriggeredFromSearchTimerID(ti) != -1) continue; // manual timer?
 
@@ -985,14 +923,14 @@ void cSearchTimerThread::CheckManualTimers(void)
       if (updateMethod && atoi(updateMethod) == UPD_EVENTID) // by event ID?
       {
          // get the channels schedule
-         const cSchedule* schedule = schedules->GetSchedule(ti->Channel());
+         const cSchedule* schedule = Schedules->GetSchedule(ti->Channel());
          if (schedule)
          {
             tEventID eventID = 0;
             char* szEventID = GetAuxValue(ti, "eventid");
             if (szEventID)
                eventID = atol(szEventID);
-            LogFile.Log(3,"checking manual timer %d by event ID %u", ti->Index()+1, eventID);
+            LogFile.Log(3,"checking manual timer %d by event ID %u", ti->Id(), eventID);
             const cEvent* event = schedule->GetEvent(eventID);
             if (event)
             {
@@ -1000,7 +938,7 @@ void cSearchTimerThread::CheckManualTimers(void)
                   ModifyManualTimer(event, ti, bstart, bstop);
             }
             else
-               LogFile.Log(1,"ooops - no event found with id %u for manual timer %d", eventID, ti->Index()+1);
+               LogFile.Log(1,"ooops - no event found with id %u for manual timer %d", eventID, ti->Id());
 
             if (szEventID) free(szEventID);
          }
@@ -1008,7 +946,7 @@ void cSearchTimerThread::CheckManualTimers(void)
       if (updateMethod && atoi(updateMethod) == UPD_CHDUR) // by channel and time?
       {
          // get the channels schedule
-         const cSchedule* schedule = schedules->GetSchedule(ti->Channel());
+         const cSchedule* schedule = Schedules->GetSchedule(ti->Channel());
          if (schedule)
          {
             // collect all events touching the old timer margins
@@ -1018,7 +956,7 @@ void cSearchTimerThread::CheckManualTimers(void)
                if (testevent->StartTime() < ti->StopTime() && testevent->EndTime() > ti->StartTime())
                   eventlist.Add(new cSearchResult(testevent, (const cSearchExt*)NULL));
             }
-            LogFile.Log(3,"checking manual timer %d by channel and time, found %d candidates", ti->Index()+1, eventlist.Count());
+            LogFile.Log(3,"checking manual timer %d by channel and time, found %d candidates", ti->Id(), eventlist.Count());
             if (eventlist.Count() > 0)
             {
                // choose the event with the best match by duration
@@ -1045,7 +983,7 @@ void cSearchTimerThread::CheckManualTimers(void)
 		 LogFile.Log(3,"selected candidate is too bad");
             }
             else
-               LogFile.Log(1,"ooops - no events found touching manual timer %d", ti->Index()+1);
+               LogFile.Log(1,"ooops - no events found touching manual timer %d", ti->Id());
          }
          if (updateMethod) free(updateMethod);
       }
@@ -1073,13 +1011,7 @@ void cSearchTimerThread::CheckEPGHours()
 
   time_t checkTime = time(NULL) + EPGSearchConfig.checkEPGHours * 60 * 60;
 
-#if VDRVERSNUM > 20300
     LOCK_SCHEDULES_READ;
-    const cSchedules *schedules = Schedules;
-#else
-    cSchedulesLock SchedulesLock;
-    const cSchedules* schedules = cSchedules::Schedules(SchedulesLock);
-#endif
 
   cChannelGroup channelsWithSmallEPG;
   cChannelGroupItem* channelInGroup = channelGroup->channels.First();
@@ -1087,7 +1019,7 @@ void cSearchTimerThread::CheckEPGHours()
     {
       const cChannel* channel = channelInGroup->channel;
       // get the channels schedule
-      const cSchedule* schedule = schedules->GetSchedule(channel);
+      const cSchedule* schedule = Schedules->GetSchedule(channel);
       if (!schedule || !schedule->GetEventAround(checkTime))
 	{
 	  LogFile.Log(3,"less than %d hours of EPG for channel %s!", EPGSearchConfig.checkEPGHours, channel->Name());
diff --git a/searchtimer_thread.h b/searchtimer_thread.h
index a5326e4..ddf8b85 100644
--- a/searchtimer_thread.h
+++ b/searchtimer_thread.h
@@ -52,7 +52,7 @@ class cSearchTimerThread: public cThread {
 
  protected:
     virtual void Action(void);
-    bool AddModTimer(const cTimer* Timer, int, cSearchExt*, const cEvent*, int Prio, int Lifetime, char* Summary = NULL, uint timerMod = tmNoChange);
+    bool AddModTimer(cTimer* Timer, int, cSearchExt*, const cEvent*, int Prio, int Lifetime, char* Summary = NULL, uint timerMod = tmNoChange);
     void RemoveTimer(const cTimer* Timer, const cEvent* Event = NULL);
     void Stop(void);
     bool NeedUpdate();
@@ -61,7 +61,7 @@ class cSearchTimerThread: public cThread {
     static cSearchResults announceList;
     static char* SummaryExtended(cSearchExt* searchExt, const cTimer* Timer, const cEvent* pEvent);
     static cSearchTimerThread *m_Instance;
-    static const cTimer* GetTimer(const cTimers* vdrtimers, cSearchExt *searchExt, const cEvent *pEvent, bool& bTimesMatchExactly);
+    static const cTimer* GetTimer(cSearchExt *searchExt, const cEvent *pEvent, bool& bTimesMatchExactly);
     static bool justRunning;
 
     cSearchTimerThread(cPluginEpgsearch* thePlugin);
diff --git a/services.c b/services.c
index 3c2dac8..617c9b3 100644
--- a/services.c
+++ b/services.c
@@ -145,25 +145,15 @@ std::list<std::string> cEpgsearchServiceHandler::TranslateResults(cSearchResults
 
          eTimerMatch timerMatch;
          bool hasTimer = false;
-#if VDRVERSNUM > 20300
          LOCK_TIMERS_READ;
-         const cTimers *vdrtimers = Timers;
-#else
-         cTimers *vdrtimers = &Timers;
-#endif
-         if (vdrtimers->GetMatch(pEvent, &timerMatch))
+         if (Timers->GetMatch(pEvent, &timerMatch))
             hasTimer = (timerMatch == tmFull);
 
          if (!result->search->useAsSearchTimer)
             result->needsTimer = false;
 
-#if VDRVERSNUM > 20300
          LOCK_CHANNELS_READ;
-         const cChannels *vdrchannels = Channels;
-#else
-         cChannels *vdrchannels = &Channels;
-#endif
-         const cChannel *channel = vdrchannels->GetByChannelID(pEvent->ChannelID(), true, true);
+         const cChannel *channel = Channels->GetByChannelID(pEvent->ChannelID(), true, true);
          int timerMode = hasTimer?1:(result->needsTimer?2:0);
 
          std::string title = pEvent->Title()?ReplaceAll(pEvent->Title(), "|", "!^pipe!^"):"";
@@ -309,13 +299,13 @@ std::list<std::string> cEpgsearchServiceHandler::TimerConflictList(bool relOnly)
 	       if (relOnly && (*it)->ignore) continue;
 	       std::ostringstream timerpart;
 	       int recPart = (*it)->recDuration * 100 / ((*it)->stop - (*it)->start);
-	       timerpart << (*it)->origIndex+1 << "|" << recPart << "|";
+	       timerpart << (*it)->timer->Id() << "|" << recPart << "|";
 	       std::set<cConflictCheckTimerObj*,TimerObjSort>::iterator itcc;
 	       if ((*it)->concurrentTimers)
 		 {
 		   std::ostringstream cctimers;
 		   for (itcc = (*it)->concurrentTimers->begin(); itcc != (*it)->concurrentTimers->end(); ++itcc)
-		     cctimers << (cctimers.str().empty()?"":"#") << (*itcc)->origIndex+1;
+		     cctimers << (cctimers.str().empty()?"":"#") << (*itcc)->timer->Id();
 		   timerpart << cctimers.str();
 		 }
 	       timerparts << (timerparts.str().empty()?"":":") << timerpart.str();
diff --git a/status_thread.c b/status_thread.c
deleted file mode 100644
index f9c7a3e..0000000
--- a/status_thread.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*                                                                  -*- c++ -*-
-Copyright (C) 2004-2013 Christian Wieninger
-
-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
-Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-
-The author can be reached at cwieninger at gmx.de
-
-The project's page is at http://winni.vdr-developer.org/epgsearch
-*/
-
-#include <string>
-#include <list>
-#ifdef __FreeBSD__
-#include <netinet/in.h>
-#endif
-#include "timer_thread.h"
-#include "epgsearchcfg.h"
-#include "epgsearchtools.h"
-#include "services.h"
-#include "svdrpclient.h"
-#include "timerstatus.h"
-#include "recstatus.h"
-#include "recdone.h"
-#include "conflictcheck_thread.h"
-#include "status_thread.h"
-#include <math.h>
-
-#include <vdr/tools.h>
-#include <vdr/plugin.h>
-
-#if VDRVERSNUM > 20300
-
-#define ALLOWED_BREAK_INSECS 2
-
-extern int updateForced;
-
-cStatusThread *cStatusThread::m_Instance = NULL;
-StatusThreadStatus cStatusThread::m_Status = StatusThreadReady;
-int gl_StatusProgged=0; // Flag that indicates, when programming is finished
-
-cStatusThread::cStatusThread()
-: cThread("EPGSearch: recstatus")
-{
-    m_Active = false;
-}
-
-cStatusThread::~cStatusThread() {
-    if (m_Active)
-	Stop();
-    cStatusThread::m_Instance = NULL;
-}
-
-void cStatusThread::Init(const cDevice *Device, const char *Name, const char *Filename, bool On) {
-    if (m_Instance == NULL) {
-        m_Instance = new cStatusThread;
-    }
-    else {
-        if (m_Instance->m_Active) {
-            LogFile.eSysLog("Epgsearch recstatus_thread called too fast"); //should stack
-            return;
-        }
-    }
-    m_Instance->m_device=Device;
-    m_Instance->m_name=Name;
-    m_Instance->m_filename=Filename;
-    m_Instance->m_on=On;
-    m_Instance->Start();
-}
-
-void cStatusThread::Exit(void) {
-    if (m_Instance != NULL) {
-	m_Instance->Stop();
-	DELETENULL(m_Instance);
-    }
-
-}
-
-void cStatusThread::Stop(void) {
-    m_Active = false;
-    Cancel(3);
-}
-
-void cStatusThread::Action(void)
-{
-   m_Active = true;
-   time_t now = time(NULL);
-   // insert new timers currently recording in TimersRecording
-   if (m_on && m_name)
-   {
-      if (EPGSearchConfig.checkTimerConflOnRecording)
-         cConflictCheckThread::Init((cPluginEpgsearch*)cPluginManager::GetPlugin("epgsearch"), true);
-
-      LOCK_TIMERS_READ;
-
-      for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
-         if (ti->Recording())
-         {
-            // check if this is a new entry
-            cRecDoneTimerObj *tiRFound = NULL;
-            for (cRecDoneTimerObj *tiR = gl_recStatusMonitor->TimersRecording.First(); tiR; tiR = gl_recStatusMonitor->TimersRecording.Next(tiR))
-               if (tiR->timer == ti)
-               {
-                  tiRFound = tiR;
-                  break;
-               }
-
-            if (tiRFound) // already handled, perhaps a resume
-            {
-               if (tiRFound->lastBreak > 0 && now - tiRFound->lastBreak <= ALLOWED_BREAK_INSECS)
-               {
-                  LogFile.Log(1,"accepting resume of '%s' on device %d", m_name, m_device->CardIndex());
-                  tiRFound->lastBreak = 0;
-               }
-               continue;
-            }
-
-            cRecDoneTimerObj* timerObj = new cRecDoneTimerObj(ti, m_device->DeviceNumber());
-            gl_recStatusMonitor->TimersRecording.Add(timerObj);
-
-            cSearchExt* search = TriggeredFromSearchTimer(ti);
-            if (!search || (search->avoidRepeats == 0 && search->delMode == 0)) // ignore if not avoid repeats and no auto-delete
-               continue;
-
-            bool vpsUsed = ti->HasFlags(tfVps) && ti->Event() && ti->Event()->Vps();
-            LogFile.Log(1,"recording started '%s' on device %d (search timer '%s'); VPS used: %s", m_name, m_device->CardIndex(), search->search, vpsUsed ? "Yes": "No");
-            const cEvent* event = ti->Event();
-            if (!event)
-            {
-               event = GetEvent(ti);
-               if (event)
-                  LogFile.Log(3,"timer had no event: assigning '%s'", event->Title());
-            }
-            if (!event)
-            {
-               LogFile.Log(1,"no event for timer found! will be ignored in done list");
-               continue;
-            }
-            time_t now = time(NULL);
-            if (vpsUsed || now < ti->StartTime() + 60) // allow a delay of one minute
-            {
-               timerObj->recDone = new cRecDone(ti, event, search);
-               return;
-            }
-            else
-               LogFile.Log(1,"recording started too late! will be ignored");
-         }
-   }
-
-   if (!m_on)
-   {
-      cMutexLock RecsDoneLock(&RecsDone);
-      // remove timers that finished recording from TimersRecording
-      // incomplete recordings are kept for a while, perhaps they will be resumed
-      cRecDoneTimerObj *tiR = gl_recStatusMonitor->TimersRecording.First();
-      while(tiR)
-      {
-         // check if timer still exists
-         bool found = false;
-         LOCK_TIMERS_READ;
-         for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti))
-            if (ti == tiR->timer)
-            {
-               found = true;
-               break;
-            }
-         if (found && !tiR->timer->Recording())
-         {
-            if (tiR->recDone)
-            {
-               cSearchExt* search = SearchExts.GetSearchFromID(tiR->recDone->searchID);
-               if (!search) return;
-
-               // check if recording has ended before timer end
-
-               bool complete = true;
-	       LOCK_RECORDINGS_READ;
-	       const cRecording *pRecording = Recordings->GetByName(m_filename);
-	       long timerLengthSecs = tiR->timer->StopTime()-tiR->timer->StartTime();
-	       int recFraction = 100;
-	       if (pRecording && timerLengthSecs)
-	       {
-		  int recLen = gl_recStatusMonitor->RecLengthInSecs(pRecording);
-		  recFraction = double(recLen) * 100 / timerLengthSecs;
-	       }
-	       bool vpsUsed = tiR->timer->HasFlags(tfVps) && tiR->timer->Event() && tiR->timer->Event()->Vps();
-               if ((!vpsUsed && now < tiR->timer->StopTime()) || recFraction < (vpsUsed ? 90: 98)) // assure timer has reached its end or at least 98% were recorded
-               {
-                  complete = false;
-                  LogFile.Log(1,"finished: '%s' (not complete! - recorded only %d%%); search timer: '%s'; VPS used: %s", tiR->timer->File(), recFraction, search->search, vpsUsed ? "Yes": "No");
-               }
-               else
-	       {
-                  LogFile.Log(1,"finished: '%s'; search timer: '%s'; VPS used: %s", tiR->timer->File(), search->search, vpsUsed ? "Yes": "No");
-		  if (recFraction < 100)
-		    LogFile.Log(2,"recorded %d%%'", recFraction);
-	       }
-               if (complete)
-               {
-                  RecsDone.Add(tiR->recDone);
-                  LogFile.Log(1,"added rec done for '%s~%s';%s", tiR->recDone->title?tiR->recDone->title:"unknown title",
-                              tiR->recDone->shortText?tiR->recDone->shortText:"unknown subtitle",
-                              search->search);
-                  RecsDone.Save();
-                  tiR->recDone = NULL; // prevent deletion
-                  tiR->lastBreak = 0;
-
-                  // check for search timers to delete automatically
-                  SearchExts.CheckForAutoDelete(search);
-
-                  // trigger a search timer update (skip running events)
-		  search->skipRunningEvents = true;
-                  updateForced = 1;
-               }
-               else if (tiR->lastBreak == 0) // store first break
-                  tiR->lastBreak = now;
-            }
-            if (tiR->lastBreak == 0 || (now - tiR->lastBreak) > ALLOWED_BREAK_INSECS)
-            { // remove finished recordings or those with an unallowed break
-               if (tiR->recDone) delete tiR->recDone; // clean up
-               cRecDoneTimerObj *tiRNext = gl_recStatusMonitor->TimersRecording.Next(tiR);
-               gl_recStatusMonitor->TimersRecording.Del(tiR);
-               tiR = tiRNext;
-               continue;
-            }
-            break;
-         }
-         if (!found)
-         {
-            if (tiR->recDone) delete tiR->recDone; // clean up
-            cRecDoneTimerObj *tiRNext = gl_recStatusMonitor->TimersRecording.Next(tiR);
-            gl_recStatusMonitor->TimersRecording.Del(tiR);
-            tiR = tiRNext;
-            continue;
-         }
-         tiR = gl_recStatusMonitor->TimersRecording.Next(tiR);
-      }
-   }
-   m_Active = false;
-}
-#endif
diff --git a/status_thread.h b/status_thread.h
deleted file mode 100644
index e2bdb6e..0000000
--- a/status_thread.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*                                                                  -*- c++ -*-
-Copyright (C) 2004-2013 Christian Wieninger
-
-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
-Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-
-The author can be reached at cwieninger at gmx.de
-
-The project's page is at http://winni.vdr-developer.org/epgsearch
-*/
-
-#ifndef VDR_STATUS_THREAD_H
-#define VDR_STATUS_THREAD_H
-
-#include <vdr/thread.h>
-#include <vdr/status.h>
-#include "epgsearchext.h"
-#include "recdone.h"
-#include "epgsearchtools.h"
-#include "log.h"
-
-extern int gl_StatusProgged;
-
-typedef enum
-{
-    StatusThreadReady,
-    StatusThreadWorking,
-    StatusThreadError,
-    StatusThreadDone
-} StatusThreadStatus;
-
-class cStatusThread: public cThread {
-private:
-        static cStatusThread *m_Instance;
-	const cDevice * m_device;
-	const char * m_name;
-	const char * m_filename;
-	bool m_on;
-	static StatusThreadStatus m_Status;
-protected:
-        virtual void Action(void);
-        void Stop(void);
-public:
-        bool m_Active;
-	StatusThreadStatus GetStatus() { return cStatusThread::m_Status; }
-	void SetStatus(StatusThreadStatus Status) { LogFile.eSysLog("%d", int(Status)); cStatusThread::m_Status = Status; }
-        cStatusThread();
-        virtual ~cStatusThread();
-        static void Init(const cDevice *Device, const char *Name, const char *Filename, bool On);
-        void Exit(void);
-};
-
-#endif
diff --git a/switchtimer.c b/switchtimer.c
index d145c7a..b01172e 100644
--- a/switchtimer.c
+++ b/switchtimer.c
@@ -49,6 +49,17 @@ cSwitchTimer::cSwitchTimer(const cEvent* Event, int SwitchMinsBefore, int Mode,
     unmute = Unmute;
 }
 
+cSwitchTimer& cSwitchTimer::operator= (const cSwitchTimer &SwitchTimer)
+{
+    this->eventID = SwitchTimer.eventID;
+    this->startTime = SwitchTimer.startTime;
+    this->channelID = SwitchTimer.channelID;
+    this->switchMinsBefore = SwitchTimer.switchMinsBefore;
+    this->mode = SwitchTimer.mode;
+    this->unmute = SwitchTimer.unmute;
+    return *this;
+}
+
 bool cSwitchTimer::Parse(const char *s)
 {
   char *line;
@@ -114,15 +125,9 @@ const cEvent* cSwitchTimer::Event()
   const cEvent* event = NULL;
   if (startTime > now)
   {
-#if VDRVERSNUM > 20300
       LOCK_SCHEDULES_READ;
-      const cSchedules *schedules = Schedules;
-#else
-      cSchedulesLock SchedulesLock;
-      const cSchedules* schedules = cSchedules::Schedules(SchedulesLock);
-#endif
-      if (!schedules) return NULL;
-      const cSchedule *Schedule = schedules->GetSchedule(channelID);
+      if (!Schedules) return NULL;
+      const cSchedule *Schedule = Schedules->GetSchedule(channelID);
       if (Schedule)
       {
 	  event = Schedule->GetEvent(eventID, startTime);
@@ -141,13 +146,8 @@ cString cSwitchTimer::ToText(bool& ignore)
 	ignore = true;
 	return NULL;
     }
-#if VDRVERSNUM > 20300
     LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
-    const cChannel *channel = vdrchannels->GetByChannelID(channelID, true, true);
+    const cChannel *channel = Channels->GetByChannelID(channelID, true, true);
     if (!channel) return NULL;
     cString buffer = cString::sprintf("%s:%u:%ld:%d:%d:%d",
 				      CHANNELSTRING(channel), eventID,
diff --git a/switchtimer.h b/switchtimer.h
index 6f2345d..695249b 100644
--- a/switchtimer.h
+++ b/switchtimer.h
@@ -39,6 +39,7 @@ public:
 
     cSwitchTimer(void);
     cSwitchTimer(const cEvent* Event, int SwitchMinsBefore=1, int mode=0, int unmute=0);
+    cSwitchTimer& operator= (const cSwitchTimer &SwitchTimer);
     const cEvent* Event();
     bool Parse(const char *s);
     cString ToText(bool& ignore);
diff --git a/switchtimer_thread.c b/switchtimer_thread.c
index 3b2ce99..be1c12a 100644
--- a/switchtimer_thread.c
+++ b/switchtimer_thread.c
@@ -88,13 +88,8 @@ void cSwitchTimerThread::Action(void)
          {
             if (switchTimer->startTime - now < switchTimer->switchMinsBefore*60 + MSG_DELAY + 1)
             {
-#if VDRVERSNUM > 20300
                LOCK_CHANNELS_READ;
-               const cChannels *vdrchannels = Channels;
-#else
-               cChannels *vdrchannels = &Channels;
-#endif
-               const cChannel *channel = vdrchannels->GetByChannelID(switchTimer->channelID, true, true);
+               const cChannel *channel = Channels->GetByChannelID(switchTimer->channelID, true, true);
                bool doSwitch = (switchTimer->mode == 0);
                bool doAsk = (switchTimer->mode == 2);
 	       bool doUnmute = switchTimer->unmute;
diff --git a/templatefile.c b/templatefile.c
index fdce3bf..a2536f5 100644
--- a/templatefile.c
+++ b/templatefile.c
@@ -210,13 +210,10 @@ bool cTemplFile::Parse(const char *Name, const char *Value)
 void cTemplFile::PrepareDefaultTemplates()
 {
     char channelnr[20] = "";
-#if VDRVERSNUM > 20300
-    LOCK_CHANNELS_READ;
-    const cChannels *vdrchannels = Channels;
-#else
-    cChannels *vdrchannels = &Channels;
-#endif
+	{
+	LOCK_CHANNELS_READ;  // Channels used in CHNUMWIDTH
     sprintf(channelnr, "%%chnr%%:%d|", CHNUMWIDTH);
+	}
 
     bool text2skin = !(strcmp(Setup.OSDSkin, "soppalusikka") == 0 ||
 		       strcmp(Setup.OSDSkin, "classic") == 0 ||
diff --git a/timer_thread.c b/timer_thread.c
index e4c8be1..feef7b3 100644
--- a/timer_thread.c
+++ b/timer_thread.c
@@ -89,17 +89,10 @@ void cTimerThread::Action(void)
             m_Active=false;
             break;
         }
-#if VDRVERSNUM > 20300
-        {
-	LOCK_TIMERS_READ;
-        }
-#else
-	if (Timers.BeingEdited())
-	{
-	    sleepSec(1);
-	    continue;
-	}
-#endif
+    {
+        LOCK_TIMERS_WRITE;
+        Timers->SetExplicitModify();
+    }
 	bool bSuccess = SendViaSVDRP(m_cmd);
 	if (!bSuccess)
 	{
diff --git a/timerdone.c b/timerdone.c
index 06d2b23..0940225 100644
--- a/timerdone.c
+++ b/timerdone.c
@@ -126,13 +126,8 @@ bool cTimerDone::Parse(const char *s)
 
 cString cTimerDone::ToText(void) const
 {
-#if VDRVERSNUM > 20300
    LOCK_CHANNELS_READ;
-   const cChannels *vdrchannels = Channels;
-#else
-   cChannels *vdrchannels = &Channels;
-#endif
-   const cChannel *channel = vdrchannels->GetByChannelID(channelID, true, true);
+   const cChannel *channel = Channels->GetByChannelID(channelID, true, true);
    string info = string(DAYDATETIME(start)) + " - " + string(channel?channel->Name():"");
 
    cString buffer = cString::sprintf("%s:%ld:%ld:%d:%s:%s:%s",
@@ -153,15 +148,9 @@ bool cTimerDone::Save(FILE *f)
 
 const cEvent* cTimerDone::GetEvent() const
 {
-#if VDRVERSNUM > 20300
     LOCK_SCHEDULES_READ;
-    const cSchedules *schedules = Schedules;
-#else
-    cSchedulesLock SchedulesLock;
-    const cSchedules* schedules = cSchedules::Schedules(SchedulesLock);
-#endif
-   if (!schedules) return NULL;
-   const cSchedule *Schedule = schedules->GetSchedule(channelID);
+   if (!Schedules) return NULL;
+   const cSchedule *Schedule = Schedules->GetSchedule(channelID);
    if (!Schedule) return NULL;
    const cEvent* Event = Schedule->GetEventAround(start + (stop - start)/2);
    return Event;
diff --git a/timerstatus.c b/timerstatus.c
index 005e822..9c5e1fb 100644
--- a/timerstatus.c
+++ b/timerstatus.c
@@ -42,9 +42,6 @@ void cTimerStatusMonitor::SetConflictCheckAdvised(bool ConflictCheckAdvised)
 {
   if (!ConflictCheckAdvised)
     conflictCheckAdvised = false;
-#if APIVERSNUM < 10515
-  conflictCheckAdvised = ConflictCheckAdvised;
-#endif
 }
 
 bool cTimerStatusMonitor::ConflictCheckAdvised()
diff --git a/timerstatus.h b/timerstatus.h
index d970a7f..5e25a4a 100644
--- a/timerstatus.h
+++ b/timerstatus.h
@@ -23,10 +23,6 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
 
 #include <vdr/status.h>
 
-#if APIVERSNUM < 10515
-enum eTimerChange { tcMod, tcAdd, tcDel };
-#endif
-
 class cTimerStatusMonitor : public cStatus
 {
   bool conflictCheckAdvised;
diff --git a/uservars.h b/uservars.h
index 1681f25..546a816 100644
--- a/uservars.h
+++ b/uservars.h
@@ -176,13 +176,8 @@ public:
     string Evaluate(const cEvent* e, bool escapeStrings = false)
 	{
 	    if (!e) return "";
-#if VDRVERSNUM > 20300
 	    LOCK_CHANNELS_READ;
-	    const cChannels *vdrchannels = Channels;
-#else
-	    cChannels *vdrchannels = &Channels;
-#endif
-	    const cChannel *channel = vdrchannels->GetByChannelID(e->ChannelID(), true);
+	    const cChannel *channel = Channels->GetByChannelID(e->ChannelID(), true);
 	    if (!channel) return "";
 
 	    string res(channel->GetChannelID().ToString());
@@ -421,13 +416,8 @@ public:
     string Evaluate(const cEvent* e, bool escapeStrings = false)
 	{
 	    if (!e) return "";
-#if VDRVERSNUM > 20300
 	    LOCK_CHANNELS_READ;
-	    const cChannels *vdrchannels = Channels;
-#else
-	    cChannels *vdrchannels = &Channels;
-#endif
-	    const cChannel *channel = vdrchannels->GetByChannelID(e->ChannelID(), true);
+	    const cChannel *channel = Channels->GetByChannelID(e->ChannelID(), true);
 	    string res = channel?channel->ShortName(true):"";
 	    if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res;
 	}
@@ -439,13 +429,8 @@ public:
     string Evaluate(const cEvent* e, bool escapeStrings = false)
 	{
 	    if (!e) return "";
-#if VDRVERSNUM > 20300
 	    LOCK_CHANNELS_READ;
-	    const cChannels *vdrchannels = Channels;
-#else
-	    cChannels *vdrchannels = &Channels;
-#endif
-	    const cChannel *channel = vdrchannels->GetByChannelID(e->ChannelID(), true);
+	    const cChannel *channel = Channels->GetByChannelID(e->ChannelID(), true);
 	    string res = channel?channel->Name():"";
 	    if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res;
 	}
@@ -457,13 +442,8 @@ class cChannelDataVar : public cInternalVar {
     string Evaluate(const cEvent* e, bool escapeStrings = false)
 	{
 	    if (!e) return "";
-#if VDRVERSNUM > 20300
 	    LOCK_CHANNELS_READ;
-	    const cChannels *vdrchannels = Channels;
-#else
-	    cChannels *vdrchannels = &Channels;
-#endif
-	    const cChannel *channel = vdrchannels->GetByChannelID(e->ChannelID(), true);
+	    const cChannel *channel = Channels->GetByChannelID(e->ChannelID(), true);
 	    return channel?CHANNELSTRING(channel):"";
 	}
 };
@@ -475,15 +455,10 @@ public:
 	{
 	    if (!e) return "";
 	    ostringstream os;
-#if VDRVERSNUM > 20300
 	    LOCK_CHANNELS_READ;
-	    const cChannels *vdrchannels = Channels;
-#else
-	    cChannels *vdrchannels = &Channels;
-#endif
-	    const cChannel *channel = vdrchannels->GetByChannelID(e->ChannelID(), true);
+	    const cChannel *channel = Channels->GetByChannelID(e->ChannelID(), true);
 	    while(channel && !channel->GroupSep())
-	      channel = vdrchannels->Prev(channel);
+	      channel = Channels->Prev(channel);
 	    if (!channel || !channel->Name()) return "";
 	    string grpName = channel->Name();
 	    if (escapeStrings) return "'" + EscapeString(grpName) + "'"; else return grpName;
@@ -568,11 +543,7 @@ class cVideodirVar : public cInternalVar {
     cVideodirVar() : cInternalVar("videodir") {}
     string Evaluate(const cEvent*, bool escapeStrings = false)
 	{
-#if APIVERSNUM > 20101
 	    return cVideoDirectory::Name();
-#else
-	    return VideoDirectory;
-#endif
 	}
 };
 

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



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