diff --git a/fhem/FHEM/98_DOIFtools.pm b/fhem/FHEM/98_DOIFtools.pm
new file mode 100644
index 000000000..690261c42
--- /dev/null
+++ b/fhem/FHEM/98_DOIFtools.pm
@@ -0,0 +1,1011 @@
+#############################################
+# $Id$
+#
+# This file is part of fhem.
+#
+# Fhem 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.
+# Fhem 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 fhem. If not, see .
+#
+###############################################
+
+
+package main;
+use strict;
+use warnings;
+use Time::Local;
+
+sub DOIFtools_Initialize($);
+sub DOIFtools_Set($@);
+sub DOIFtools_Get($@);
+sub DOIFtools_Undef;
+sub DOIFtools_Define($$$);
+sub DOIFtools_Attr(@);
+sub DOIFtools_Notify($$);
+sub DOIFtoolsRg;
+sub DOIFtoolsNxTimer;
+sub DOIFtoolsNextTimer;
+sub DOIFtoolsGetAssocDev;
+sub DOIFtoolsCheckDOIF;
+sub DOIFtoolsCheckDOIFcoll;
+sub DOIFtools_fhemwebFn($$$$);
+sub DOIFtools_eM($$$$);
+sub DOIFtools_dO ($$$$);
+sub DOIFtoolsSetNotifyDev;
+sub DOIFtools_logWrapper($);
+sub DOIFtoolsCounterReset($);
+
+my @DOIFtools_we =();
+
+
+#########################
+sub DOIFtools_Initialize($)
+{
+ my ($hash) = @_;
+ $hash->{DefFn} = "DOIFtools_Define";
+ $hash->{SetFn} = "DOIFtools_Set";
+ $hash->{GetFn} = "DOIFtools_Get";
+ $hash->{UndefFn} = "DOIFtools_Undef";
+ $hash->{AttrFn} = "DOIFtools_Attr";
+ $hash->{NotifyFn} = "DOIFtools_Notify";
+
+ $hash->{FW_detailFn} = "DOIFtools_fhemwebFn";
+
+ $data{FWEXT}{"/DOIFtools_logWrapper"}{CONTENTFUNC} = "DOIFtools_logWrapper";
+
+ my $oldAttr = "target_room:noArg target_group:noArg executeDefinition:noArg executeSave:noArg eventMonitorInDOIF:noArg readingsPrefix:noArg";
+ $hash->{AttrList} = "DOIFtoolsExecuteDefinition:1,0 DOIFtoolsTargetRoom DOIFtoolsTargetGroup DOIFtoolsExecuteSave:1,0 DOIFtoolsReadingsPrefix DOIFtoolsEventMonitorInDOIF:1,0 DOIFtoolsHideModulShortcuts:1,0 DOIFtoolsMyShortcuts DOIFtoolsMenuEntry:1,0 disabledForIntervals ".$oldAttr;
+}
+
+
+sub DOIFtools_dO ($$$$){return "";}
+# FW_detailFn for DOIF injecting event monitor
+sub DOIFtools_eM($$$$) {
+ my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn.
+ my $ret = "";
+ # Event Monitor
+ $ret .= "
";
+ }
+ return $ret;
+}
+######################
+# Show the content of the log (plain text), or an image and offer a link
+# to convert it to an SVG instance
+# If text and no reverse required, try to return the data as a stream;
+sub DOIFtools_logWrapper($) {
+ my ($cmd) = @_;
+
+ my $d = $FW_webArgs{dev};
+ my $type = $FW_webArgs{type};
+ my $file = $FW_webArgs{file};
+ my $ret = "";
+
+ if(!$d || !$type || !$file) {
+ FW_pO '