diff --git a/fhem/t/FHEM/98_HTTPMOD/10_Redirects.cfg b/fhem/t/FHEM/98_HTTPMOD/10_Redirects.cfg
new file mode 100644
index 000000000..623208d78
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/10_Redirects.cfg
@@ -0,0 +1,5 @@
+define H2 HTTPMOD file://t/FHEM/98_HTTPMOD/10_Redirects.testdata 0
+attr H2 verbose 5
+attr H2 fileHeaderSplit --end-of-http-header--
+attr H2 queueDelay 2
+attr H2 minSendDelay 2
diff --git a/fhem/t/FHEM/98_HTTPMOD/10_Redirects.t b/fhem/t/FHEM/98_HTTPMOD/10_Redirects.t
new file mode 100644
index 000000000..ebde8b0c2
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/10_Redirects.t
@@ -0,0 +1,15 @@
+##############################################
+# test redirects
+##############################################
+use strict;
+use warnings;
+use Test::More;
+
+fhem('set H2 reread');
+
+is(FhemTestUtils_gotLog("AddToQueue prepends type update to URL http://test.url/"), 1, "Match redirected url");
+
+done_testing;
+exit(0);
+
+1;
diff --git a/fhem/t/FHEM/98_HTTPMOD/10_Redirects.testdata b/fhem/t/FHEM/98_HTTPMOD/10_Redirects.testdata
new file mode 100644
index 000000000..bcb111081
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/10_Redirects.testdata
@@ -0,0 +1,13 @@
+HTTP/1.1 301 Moved Permanently
+Content-Type: text/html
+Content-Length: 162
+Connection: close
+Location: http://test.url/
+--end-of-http-header--
+
+
301 Moved Permanently
+
+301 Moved Permanently
+
nginx
+
+
\ No newline at end of file
diff --git a/fhem/t/FHEM/98_HTTPMOD/20_extractAllJSON.cfg b/fhem/t/FHEM/98_HTTPMOD/20_extractAllJSON.cfg
new file mode 100644
index 000000000..1a285a3c3
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/20_extractAllJSON.cfg
@@ -0,0 +1,3 @@
+define H1 HTTPMOD file://t/FHEM/98_HTTPMOD/JSON.testdata 0
+attr H1 extractAllJSON 1
+attr H1 verbose 5
\ No newline at end of file
diff --git a/fhem/t/FHEM/98_HTTPMOD/20_extractAllJSON.t b/fhem/t/FHEM/98_HTTPMOD/20_extractAllJSON.t
new file mode 100644
index 000000000..2d6987931
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/20_extractAllJSON.t
@@ -0,0 +1,19 @@
+##############################################
+# test extractAllReadings
+##############################################
+use strict;
+use warnings;
+use Test::More;
+
+fhem('set H1 reread');
+InternalTimer(time()+1, sub() {
+
+ is(FhemTestUtils_gotLog("Read response matched 24"), 1, "Match 24 Readings log");
+ is(FhemTestUtils_gotEvent("H1:MQTT_ip_1: 168"), 1, "Reading creation 1");
+ is(FhemTestUtils_gotEvent("H1:modes_2: RainbowChase"), 1, "Reading creation 2");
+
+ done_testing;
+ exit(0);
+}, 0);
+
+1;
diff --git a/fhem/t/FHEM/98_HTTPMOD/30_requestExpr.cfg b/fhem/t/FHEM/98_HTTPMOD/30_requestExpr.cfg
new file mode 100644
index 000000000..3a03a1658
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/30_requestExpr.cfg
@@ -0,0 +1,28 @@
+define H1 HTTPMOD file://t/FHEM/98_HTTPMOD/JSON 0
+attr H1 verbose 3
+attr H1 get01Name TestGet
+attr H1 get01Data Post Data for Test
+attr H1 get01Header1 Content-Type: application/json
+attr H1 get01URLExpr $old . '.testdata'
+attr H1 get01HdrExpr $old . '345'
+attr H1 get01DatExpr $old . '567'
+
+define H2 HTTPMOD file://t/FHEM/98_HTTPMOD/JSON.testdata 0
+attr H2 requestHeader1 Content-Type: Test-Content
+attr H2 requestHeader2 TestHeader: T1E2S3T
+attr H2 verbose 5
+attr H2 minSendDelay 0
+attr H2 reading01Name TestReading
+attr H2 reading01JSON MQTT_ip_1
+attr H2 reading01OExpr $val * 2
+
+attr H2 reading02Name TestReading2
+attr H2 reading02JSON modes
+
+attr H2 reading03Name CombReading
+attr H2 reading03JSON modes
+attr H2 reading03RecombineExpr join ' ', @matchlist
+
+attr H2 set01Name TestSet1
+attr H2 set01Data TestSet1 PostData $val
+attr H2 set01IExpr $val * 2
diff --git a/fhem/t/FHEM/98_HTTPMOD/30_requestExpr.t b/fhem/t/FHEM/98_HTTPMOD/30_requestExpr.t
new file mode 100644
index 000000000..46da3e7cb
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/30_requestExpr.t
@@ -0,0 +1,55 @@
+##############################################
+# test Expressions in config
+##############################################
+use strict;
+use warnings;
+use Test::More;
+use FHEM::HTTPMOD::Utils qw(:all);
+
+fhem('attr H1 verbose 5');
+fhem('attr H1 get02IExpr $vale');
+is(FhemTestUtils_gotLog('attr H1 get02IExpr \$vale : Invalid Expression'), 1, "perl syntax check in attrs");
+
+fhem('get H1 TestGet');
+
+is(FhemTestUtils_gotLog("with timeout 2 to file://t/FHEM/98_HTTPMOD/JSON.testdata"), 1, "URL Expression log");
+is(FhemTestUtils_gotLog("header Content-Type: application/json345"), 1, "Header expression in log");
+is(FhemTestUtils_gotLog(", data Post Data for Test567"), 1, "Post Data expression in log");
+
+fhem('set H2 reread');
+is(FhemTestUtils_gotEvent(qr/H2:TestReading:\s336/xms), 1, "JSON Reading creation with OExpr Expression");
+is(FhemTestUtils_gotEvent("H2:TestReading2-8: UDP"), 1, "JSON multiple Reading creation");
+is(FhemTestUtils_gotEvent("H2:CombReading: Off SimpleColor RainbowChase"), 1, "Reading recombine expresion");
+is(FhemTestUtils_gotLog(qr/HandleSendQueue\ssends\supdate.*header:\sContent-Type:\sTest-Content.*TestHeader:\sT1E2S3T/xms), 1, "requestHeader");
+
+fhem('set H2 TestSet1 4');
+is(FhemTestUtils_gotLog("TestSet1 PostData 8"), 1, "set IExpr1 to Post Data in log");
+
+my $hash = $defs{'H2'};
+my $name = 'H2';
+my $val = 5;
+my @array = (1,2,3);
+my %tHash = (a => 10, b => 20);
+my $exp = '$val * 2';
+
+my $result = EvalExpr($hash, $exp, {'$val' => $val, '@array' => \@array});
+#Log3 $name, 3, "$name: result of EvalExpr test 1 = $result";
+is $result, 10, "simple expression with one scalar in list";
+
+$exp = '$array[1] * 2';
+$result = EvalExpr($hash, $exp, {'$val' => $val, '@array' => \@array});
+is $result, 4, "simple expression with array ref in hash";
+
+$exp = '$hash{a} * 2';
+$result = EvalExpr($hash, $exp, {'$val' => $val, '%hash' => \%tHash});
+is $result, 20, "simple expression with hash ref in hash";
+
+$exp = '$hash->{a} * 2';
+$result = EvalExpr($hash, $exp, {'$val' => $val, '$hash' => \%tHash});
+is $result, 20, "simple expression with hash ref as ref in hash";
+
+
+done_testing;
+exit(0);
+
+1;
diff --git a/fhem/t/FHEM/98_HTTPMOD/31_Regexes.cfg b/fhem/t/FHEM/98_HTTPMOD/31_Regexes.cfg
new file mode 100644
index 000000000..a6d636da7
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/31_Regexes.cfg
@@ -0,0 +1,67 @@
+define H1 HTTPMOD file://t/FHEM/98_HTTPMOD/JSON.testdata 0
+attr H1 verbose 5
+attr H1 minSendDelay 0
+
+attr H1 regexDecode none
+attr H1 regexCompile 1
+
+attr H1 reading01Name TestReading1
+attr H1 reading01Regex \"SimpleColor\",\"([^\"]+)\"
+
+attr H1 reading02Name TestReading2
+attr H1 reading02Regex \" SimpleColor \" ,\" ([^\"]+) \"
+attr H1 reading02RegOpt xms
+
+attr H1 reading03Name TestReading3
+attr H1 reading03Regex \" SimpleColor \" ,\" ([^\"]+) \"
+
+attr H1 reading10Name TestReading4
+attr H1 reading10Regex code . \" : (\d+)
+attr H1 reading10RegOpt gxms
+attr H1 reading10RecombineExpr join ' ', @matchlist
+
+
+define H2 HTTPMOD file://t/FHEM/98_HTTPMOD/JSON.testdata 0
+attr H2 verbose 5
+attr H2 minSendDelay 0
+
+attr H2 regexDecode none
+attr H2 regexCompile 0
+
+attr H2 reading01Name TestReading1
+attr H2 reading01Regex \"SimpleColor\",\"([^\"]+)\"
+
+attr H2 reading02Name TestReading2
+attr H2 reading02Regex \" SimpleColor \" ,\" ([^\"]+) \"
+attr H2 reading02RegOpt xms
+
+attr H2 reading03Name TestReading3
+attr H2 reading03Regex \" SimpleColor \" ,\" ([^\"]+) \"
+
+attr H2 reading10Name TestReading4
+attr H2 reading10Regex code . \" : (\d+)
+attr H2 reading10RegOpt gxms
+attr H2 reading10RecombineExpr join ' ', @matchlist
+
+
+define H3 HTTPMOD file://t/FHEM/98_HTTPMOD/JSON.testdata 0
+attr H3 verbose 3
+attr H3 reading01Name TestReading
+attr H3 reading01JSON MQTT_ip_1
+attr H3 preProcessRegex s/168/466/g
+
+define H4 HTTPMOD file://t/FHEM/98_HTTPMOD/Login.testdata 0
+attr H4 verbose 3
+attr H4 minSendDelay 0
+attr H4 queueDelay 0
+attr H4 showMatched 1
+attr H4 authRetries 1
+
+attr H4 reAuthRegex Login required
+attr H4 sid01URL file://t/FHEM/98_HTTPMOD/JSON.testdata
+attr H4 sid02URL file://t/FHEM/98_HTTPMOD/JSON3.testdata
+attr H4 idRegex session ([\d]+)
+#attr H4 dontRequeueAfterAuth 1
+
+attr H4 reading01Name TestReading
+attr H4 reading01JSON MQTT_ip_1
diff --git a/fhem/t/FHEM/98_HTTPMOD/31_Regexes.t b/fhem/t/FHEM/98_HTTPMOD/31_Regexes.t
new file mode 100644
index 000000000..e4a738265
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/31_Regexes.t
@@ -0,0 +1,49 @@
+##############################################
+# test regexes
+#
+# readingXRegex
+# preProcess
+# reAuth
+# idRegex
+# replacementRegex
+#
+# reading|get|set regOpt (gceor are not compiled in, xmsi need to be in compilation)
+#
+# decode and compile
+##############################################
+use strict;
+use warnings;
+use Test::More;
+
+fhem('set H1 reread');
+is(FhemTestUtils_gotEvent(qr/H1:TestReading1:\sRainbowChase/xms), 1, "match simple case with regex compilation");
+is(FhemTestUtils_gotEvent(qr/H1:TestReading2:\sRainbowChase/xms), 1, "match with options xms with regex compilation");
+is(FhemTestUtils_gotLog(qr/H1:.*TestReading3 did not match/), 1, "No match with wrong options with regex compilation");
+is(FhemTestUtils_gotEvent(qr/H1:TestReading4:\s3\s4/xms), 1, "match with options gxms with regex compilation");
+
+
+fhem('set H2 reread');
+is(FhemTestUtils_gotEvent(qr/H2:TestReading1:\sRainbowChase/xms), 1, "match simple case without regex compilation");
+is(FhemTestUtils_gotEvent(qr/H2:TestReading2:\sRainbowChase/xms), 1, "match with options xms without regex compilation");
+is(FhemTestUtils_gotLog(qr/H2:.*TestReading3 did not match/), 1, "No match with wrong options without regex compilation");
+is(FhemTestUtils_gotEvent(qr/H2:TestReading4:\s3\s4/xms), 1, "match with options gxms without regex compilation");
+
+fhem ('attr H2 reading20Name TestReadingBad');
+fhem ('attr H2 reading20Regex \"SimpleColor\",\"[^\"]+)\"');
+is(FhemTestUtils_gotLog(qr/H2: reading20Regex Regex: Bad regexp/), 2, "validation of a bad regex");
+
+fhem('set H3 reread');
+is(FhemTestUtils_gotEvent(qr/H3:TestReading:\s466/xms), 1, "preProcessRegex");
+
+fhem('set H4 reread');
+
+InternalTimer(time()+1, sub() {
+ is(FhemTestUtils_gotEvent("H4:LAST_REQUEST: auth01"), 1, "Auth Step 1");
+ is(FhemTestUtils_gotEvent("H4:LAST_REQUEST: auth02"), 1, "Auth Step 2");
+ is(FhemTestUtils_gotEvent("H4:TestReading: 168"), 1, "Reading after auth");
+ done_testing;
+ exit(0);
+}, 0);
+
+
+1;
diff --git a/fhem/t/FHEM/98_HTTPMOD/40_maxAge.cfg b/fhem/t/FHEM/98_HTTPMOD/40_maxAge.cfg
new file mode 100644
index 000000000..60f306037
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/40_maxAge.cfg
@@ -0,0 +1,32 @@
+define H1 HTTPMOD none 0
+attr H1 verbose 5
+attr H1 minSendDelay 0
+
+attr H1 reading01Name TestReading1
+attr H1 reading01JSON MQTT_ip_1
+
+attr H1 reading02Name TestReading2
+attr H1 reading02JSON modes
+attr H1 readingMaxAge 0.1
+
+attr H1 readingMaxAgeReplacement outdated
+attr H1 readingMaxAgeReplacementMode text
+
+attr H1 reading02MaxAgeReplacement "old - was $val"
+attr H1 reading02MaxAgeReplacementMode expression
+
+attr H1 reading02-2MaxAgeReplacement tr
+attr H1 reading02-2MaxAgeReplacementMode reading
+
+attr H1 reading02-3MaxAgeReplacement NAME
+attr H1 reading02-3MaxAgeReplacementMode internal
+
+attr H1 reading02-4MaxAgeReplacement 0
+attr H1 reading02-4MaxAgeReplacementMode delete
+
+attr H1 get01URL file://t/FHEM/98_HTTPMOD/JSON.testdata
+attr H1 get01Name G1
+
+attr H1 get02URL file://t/FHEM/98_HTTPMOD/empty.testdata
+attr H1 get02Name G2
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/40_maxAge.t b/fhem/t/FHEM/98_HTTPMOD/40_maxAge.t
new file mode 100644
index 000000000..1377c646c
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/40_maxAge.t
@@ -0,0 +1,26 @@
+##############################################
+# test MaxAge
+##############################################
+use strict;
+use warnings;
+use Test::More;
+
+fhem('get H1 G1');
+is(FhemTestUtils_gotEvent("H1:TestReading1: 168"), 1, "Normal Reading 1");
+is(FhemTestUtils_gotEvent("H1:TestReading2-1: Off"), 1, "Normal Reading 2");
+
+sleep 0.15;
+
+fhem('setreading H1 tr 789');
+fhem('get H1 G2');
+
+is(FhemTestUtils_gotEvent("H1:TestReading1: outdated"), 1, "Outdated Reading 1 with mode text");
+is(FhemTestUtils_gotEvent("H1:TestReading2-1: old - was Off"), 1, "Outdated Reading 2 with mode expression");
+is(FhemTestUtils_gotEvent("H1:TestReading2-2: 789"), 1, "Outdated Reading 3 with mode reading");
+is(FhemTestUtils_gotEvent("H1:TestReading2-3: H1"), 1, "Outdated Reading 4 with mode internal");
+is(FhemTestUtils_gotEvent("H1:TestReading2-4:"), 1, "Outdated Reading 5 with mode delete");
+
+done_testing;
+exit(0);
+
+1;
diff --git a/fhem/t/FHEM/98_HTTPMOD/90_SmallFeatures.cfg b/fhem/t/FHEM/98_HTTPMOD/90_SmallFeatures.cfg
new file mode 100644
index 000000000..7d18e1779
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/90_SmallFeatures.cfg
@@ -0,0 +1,9 @@
+define H2 HTTPMOD file://t/FHEM/98_HTTPMOD/Charset.testdata 0
+attr H2 verbose 3
+attr H2 fileHeaderSplit --end-of-http-header--
+attr H2 memReading 1
+attr H2 minSendDelay 0
+
+attr H2 reading01Name TestReading1
+attr H2 reading01Regex erraschung mit (.*)
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/90_SmallFeatures.t b/fhem/t/FHEM/98_HTTPMOD/90_SmallFeatures.t
new file mode 100644
index 000000000..64c101425
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/90_SmallFeatures.t
@@ -0,0 +1,22 @@
+##############################################
+# test other small features
+##############################################
+use strict;
+use warnings;
+use Test::More;
+
+fhem('attr H2 bodyDecode none');
+fhem('set H2 reread');
+
+is(FhemTestUtils_gotEvent("H2:Fhem_Mem"), 1, "memReading");
+is(FhemTestUtils_gotEvent("H2:TestReading1: \x8e\x6e"), 1, "TestReading without bodyDecode");
+
+fhem('attr H2 bodyDecode auto');
+fhem('set H2 reread');
+
+is(FhemTestUtils_gotEvent("H2:TestReading1: \xc4\x6e"), 1, "TestReading with body decode");
+
+done_testing;
+exit(0);
+
+1;
diff --git a/fhem/t/FHEM/98_HTTPMOD/Charset.testdata b/fhem/t/FHEM/98_HTTPMOD/Charset.testdata
new file mode 100644
index 000000000..ffb292692
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/Charset.testdata
@@ -0,0 +1,13 @@
+HTTP/1.1 200 OK
+Content-Type: text/html; charset=cp437
+--end-of-http-header--
+
+Test
+
+Test Data
+
for HTTPMOD Test
+
+šberraschung mit Žnderungen ‚Š
+
+
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/JSON.testdata b/fhem/t/FHEM/98_HTTPMOD/JSON.testdata
new file mode 100755
index 000000000..f06719f45
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/JSON.testdata
@@ -0,0 +1,17 @@
+{"settings":{"currentpreset":255,"effect":"Off"},
+ "device":"tvlights",
+ "heap":20864,
+ "power":"0",
+ "modes":["Off","SimpleColor","RainbowChase","BobblySquares","Blobs","CuriousCat","Adalight","UDP","DMX"],
+ "currentpresets":[],
+ "code1":3,
+ "code2":4,
+ "pixels":118,
+ "MQTT":
+ {"enable":true,
+ "ip":[192,168,1,24],
+ "port":1883
+ },
+ "timer":{"running":false}
+ }
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/JSON2.testdata b/fhem/t/FHEM/98_HTTPMOD/JSON2.testdata
new file mode 100644
index 000000000..a87b2d9c5
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/JSON2.testdata
@@ -0,0 +1,17 @@
+{"settings":{"currentpreset":255,"effect":"Off"},
+ "device":"testdevice",
+ "heap":1122,
+ "power":"0",
+ "modes":["Off","SimpleColor","RainbowChase","BobblySquares","Blobs","CuriousCat","Adalight","UDP","DMX"],
+ "currentpresets":[],
+ "code1":3,
+ "code2":4,
+ "pixels":118,
+ "MQTT":
+ {"enable":true,
+ "ip":[192,168,1,24],
+ "port":1883
+ },
+ "timer":{"running":false}
+ }
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/JSON3.testdata b/fhem/t/FHEM/98_HTTPMOD/JSON3.testdata
new file mode 100644
index 000000000..a916e01c7
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/JSON3.testdata
@@ -0,0 +1,17 @@
+{"settings":{"currentpreset":255,"effect":"Off"},
+ "device":"testdevice",
+ "heap":1122,
+ "power":"0",
+ "modes":["Off","Step2","RainbowChase","session 55","Blobs","CuriousCat","Adalight","UDP","DMX"],
+ "currentpresets":[],
+ "code1":3,
+ "code2":4,
+ "pixels":118,
+ "MQTT":
+ {"enable":true,
+ "ip":[192,168,1,24],
+ "port":1883
+ },
+ "timer":{"running":false}
+ }
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/Login.testdata b/fhem/t/FHEM/98_HTTPMOD/Login.testdata
new file mode 100644
index 000000000..81a9af509
--- /dev/null
+++ b/fhem/t/FHEM/98_HTTPMOD/Login.testdata
@@ -0,0 +1,17 @@
+{"settings":{"currentpreset":255,"effect":"Off"},
+ "device":"testdevice",
+ "heap":1122,
+ "power":"0",
+ "modes":["Off","Login required","RainbowChase","BobblySquares","Blobs","CuriousCat","Adalight","UDP","DMX"],
+ "currentpresets":[],
+ "code1":3,
+ "code2":4,
+ "pixels":118,
+ "MQTT":
+ {"enable":true,
+ "ip":[192,168,1,24],
+ "port":1883
+ },
+ "timer":{"running":false}
+ }
+
diff --git a/fhem/t/FHEM/98_HTTPMOD/empty.testdata b/fhem/t/FHEM/98_HTTPMOD/empty.testdata
new file mode 100644
index 000000000..e69de29bb