diff --git a/data/web/debug.php b/data/web/debug.php
index 0723ba6a..f9685ab4 100644
--- a/data/web/debug.php
+++ b/data/web/debug.php
@@ -23,7 +23,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
         <li role="presentation"><a href="#tab-postfix-logs" aria-controls="tab-postfix-logs" role="tab" data-toggle="tab">Postfix</a></li>
         <li role="presentation"><a href="#tab-dovecot-logs" aria-controls="tab-dovecot-logs" role="tab" data-toggle="tab">Dovecot</a></li>
         <li role="presentation"><a href="#tab-sogo-logs" aria-controls="tab-sogo-logs" role="tab" data-toggle="tab">SOGo</a></li>
-        <li role="presentation"><a href="#tab-fail2ban-logs" aria-controls="tab-fail2ban-logs" role="tab" data-toggle="tab">Fail2ban</a></li>
+        <li role="presentation"><a href="#tab-netfilter-logs" aria-controls="tab-netfilter-logs" role="tab" data-toggle="tab">Netfilter</a></li>
         <li role="presentation"><a href="#tab-rspamd-history" aria-controls="tab-rspamd-history" role="tab" data-toggle="tab">Rspamd</a></li>
         <li role="presentation"><a href="#tab-autodiscover-logs" aria-controls="tab-autodiscover-logs" role="tab" data-toggle="tab">Autodiscover</a></li>
         <li role="presentation"><a href="#tab-watchdog-logs" aria-controls="tab-watchdog-logs" role="tab" data-toggle="tab">Watchdog</a></li>
@@ -112,7 +112,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               'redis-mailcow',
               'php-fpm-mailcow',
               'mysql-mailcow',
-              'fail2ban-mailcow',
+              'netfilter-mailcow',
               'clamd-mailcow'
             );
             foreach ($container_array as $container) {
@@ -123,21 +123,26 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
                 <?php
                 date_default_timezone_set('UTC');
                 $StartedAt = date_parse($container_stats['State']['StartedAt']);
-                $date = new \DateTime();
-                $date->setTimestamp(mktime(
-                  $StartedAt['hour'],
-                  $StartedAt['minute'],
-                  $StartedAt['second'],
-                  $StartedAt['month'],
-                  $StartedAt['day'],
-                  $StartedAt['year']));
-                $user_tz = new DateTimeZone(getenv('TZ'));
-                $date->setTimezone($user_tz);
-                $started = $date->format('r');
+                if ($StartedAt['hour'] !== false) {
+                  $date = new \DateTime();
+                  $date->setTimestamp(mktime(
+                    $StartedAt['hour'],
+                    $StartedAt['minute'],
+                    $StartedAt['second'],
+                    $StartedAt['month'],
+                    $StartedAt['day'],
+                    $StartedAt['year']));
+                  $user_tz = new DateTimeZone(getenv('TZ'));
+                  $date->setTimezone($user_tz);
+                  $started = $date->format('r');
+                }
+                else {
+                  $started = '?';
+                }
                 ?>
                 <small>(Started on <?=$started;?>),
                 <a href data-toggle="modal" data-container="<?=$container;?>" data-target="#RestartContainer">Restart</a></small>
-                <span class="pull-right label label-<?=($container_stats['State']['Running'] == 1) ? 'success' : 'danger';?>">&nbsp;&nbsp;&nbsp;</span>
+                <span class="pull-right label label-<?=($container_stats !== false && !empty($container_stats)) ? (($container_stats['State']['Running'] == 1) ? 'success' : 'danger') : 'default'; ?>">&nbsp;&nbsp;&nbsp;</span>
                 </li>
               <?php
               }
@@ -198,18 +203,18 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
           </div>
         </div>
 
-        <div role="tabpanel" class="tab-pane" id="tab-fail2ban-logs">
+        <div role="tabpanel" class="tab-pane" id="tab-netfilter-logs">
           <div class="panel panel-default">
-            <div class="panel-heading">Fail2ban <span class="badge badge-info log-lines"></span>
+            <div class="panel-heading">Netfilter <span class="badge badge-info log-lines"></span>
               <div class="btn-group pull-right">
-                <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="fail2ban_log" data-log-url="fail2ban" data-nrows="100">+ 100</button>
-                <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="fail2ban_log" data-log-url="fail2ban" data-nrows="1000">+ 1000</button>
-                <button class="btn btn-xs btn-default" id="refresh_fail2ban_log"><?=$lang['admin']['refresh'];?></button>
+                <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="100">+ 100</button>
+                <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="1000">+ 1000</button>
+                <button class="btn btn-xs btn-default" id="refresh_netfilter_log"><?=$lang['admin']['refresh'];?></button>
               </div>
             </div>
             <div class="panel-body">
               <div class="table-responsive">
-                <table class="table table-striped table-condensed" id="fail2ban_log"></table>
+                <table class="table table-striped table-condensed" id="netfilter_log"></table>
               </div>
             </div>
           </div>
diff --git a/data/web/edit.php b/data/web/edit.php
index 43e055ca..1611a6af 100644
--- a/data/web/edit.php
+++ b/data/web/edit.php
@@ -661,7 +661,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
           ?>
           <h4>Recipient map: <?=$result['recipient_map_old'];?></h4>
           <br />
-          <form class="form-horizontal" data-id="editrecipient_map" role="form" method="post">
+          <form class="form-horizontal" data-id="edit_recipient_map" role="form" method="post">
             <input type="hidden" value="0" name="active">
             <div class="form-group">
               <label class="control-label col-sm-2" for="recipient_map_new">New destination</label>
@@ -679,7 +679,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
             </div>
             <div class="form-group">
               <div class="col-sm-offset-2 col-sm-10">
-                <button class="btn btn-success" id="edit_selected" data-id="editrecipient_map" data-item="<?=$map;?>" data-api-url='edit/recipient_map' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
+                <button class="btn btn-success" id="edit_selected" data-id="edit_recipient_map" data-item="<?=$map;?>" data-api-url='edit/recipient_map' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
               </div>
             </div>
           </form>
diff --git a/data/web/favicon.png b/data/web/favicon.png
index 6390041d..69eb2fcd 100644
Binary files a/data/web/favicon.png and b/data/web/favicon.png differ
diff --git a/data/web/img/cow_lock.svg b/data/web/img/cow_lock.svg
new file mode 100644
index 00000000..2be88dec
--- /dev/null
+++ b/data/web/img/cow_lock.svg
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="267.80917"
+   height="306.93799"
+   viewBox="0 0 267.80917 306.93799"
+   enable-background="new 0 0 1600 1200"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="cow_protected_nb.svg"><metadata
+     id="metadata175"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs173" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1721"
+     inkscape:window-height="1177"
+     id="namedview171"
+     showgrid="false"
+     inkscape:zoom="1.5733333"
+     inkscape:cx="29.160751"
+     inkscape:cy="110.78493"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Layer_1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" /><g
+     id="g3"
+     transform="translate(-661.33429,-371.905)"><g
+       id="g11"><g
+         id="g13"><g
+           id="g15" /></g><g
+         id="g19"><g
+           id="g21" /></g><g
+         id="g25"><g
+           id="g27"><g
+             id="g29" /></g></g><g
+         id="g33"><g
+           id="g35"><g
+             id="g37" /></g></g></g><polyline
+       points="702.43,498.974 684.548,546.739 697.837,612.03 723.777,638.295  "
+       id="polyline43"
+       style="fill:#3d5263" /><g
+       id="g45"><g
+         id="g47"><polyline
+           points="669.541,457.293 684.791,493.55 705.121,503.375 735.319,465.213    "
+           id="polyline49"
+           style="fill:#fef3df" /><g
+           id="g51"><path
+             d="m 721.916,479.683 c 0,0 -22.477,-25.55 -49.782,-18.971 0,0 4.666,34.11 46.339,44.009 l 2.61,8.531 c 0,0 -65.598,-9.687 -59.326,-67.578 0,0 48.997,-19.88 72.582,15.103"
+             id="path53"
+             inkscape:connector-curvature="0"
+             style="fill:#b58765" /><polyline
+             points="920.935,457.293 905.688,493.55 885.359,503.375 855.16,465.213     "
+             id="polyline55"
+             style="fill:#fef3df" /><path
+             d="m 868.564,479.683 c 0,0 22.475,-25.55 49.779,-18.971 0,0 -4.663,34.11 -46.336,44.009 l -2.612,8.531 c 0,0 65.596,-9.687 59.326,-67.578 0,0 -48.995,-19.88 -72.584,15.103"
+             id="path57"
+             inkscape:connector-curvature="0"
+             style="fill:#b58765" /></g></g><path
+         d="m 737.898,653.506 55.932,0 20.22445,-212.1817 c -55.801,0 -116.21545,37.4237 -116.21545,85.2487 0,1.454 0.085,2.786 0.121,4.174 0.127,3.933 0.448,7.583 0.856,11.132 1.689,14.813 5.45,27.171 8.459,43.373 1.451,7.829 5.001,23.369 5.001,23.369 0.056,0.408 0.165,0.804 0.224,1.211 2.533,16.542 11.829,32.019 25.398,43.674 z"
+         id="path59"
+         inkscape:connector-curvature="0"
+         style="fill:#b58765"
+         sodipodi:nodetypes="cccscccccc" /><path
+         d="m 793.259,439.976 0,213.53 55.932,0 c 13.569,-11.654 22.862,-27.132 25.4,-43.675 0.058,-0.407 0.163,-0.803 0.221,-1.211 0,0 3.548,-15.539 5.001,-23.369 3.01,-16.202 6.773,-28.561 8.462,-43.371 0.404,-3.552 0.724,-7.202 0.846,-11.135 0.042,-1.388 0.126,-2.72 0.126,-4.174 -10e-4,-47.823 -40.183,-86.595 -95.988,-86.595 z"
+         id="path61"
+         inkscape:connector-curvature="0"
+         style="fill:#b58765" /><g
+         id="g63"><g
+           id="g65"><path
+             d="m 872.193,619.949 c 0,28.315 -35.083,51.278 -78.366,51.278 -43.289,0 -78.371,-22.963 -78.371,-51.278 0,-28.319 35.082,-51.278 78.371,-51.278 43.282,0 78.366,22.959 78.366,51.278 z"
+             id="path67"
+             inkscape:connector-curvature="0"
+             style="fill:#fef3df" /></g></g><g
+         id="g69"><g
+           id="g71"><g
+             id="g73"><path
+               d="m 758.318,612.03 c 0,6.213 -5.039,11.254 -11.258,11.254 -6.208,0 -11.25,-5.04 -11.25,-11.254 0,-6.222 5.042,-11.254 11.25,-11.254 6.218,0 11.258,5.033 11.258,11.254 z"
+               id="path75"
+               inkscape:connector-curvature="0"
+               style="fill:#5a3620" /></g></g><g
+           id="g77"><g
+             id="g79"><path
+               d="m 852.109,612.03 c 0,6.213 -5.036,11.254 -11.254,11.254 -6.216,0 -11.257,-5.04 -11.257,-11.254 0,-6.222 5.04,-11.254 11.257,-11.254 6.218,0 11.254,5.033 11.254,11.254 z"
+               id="path81"
+               inkscape:connector-curvature="0"
+               style="fill:#5a3620" /></g></g></g><g
+         id="g83"><path
+           d="m 886.474,532.301 c 0.354,-3.113 0.634,-6.31 0.743,-9.752 0.035,-1.217 0.109,-2.384 0.109,-3.66 0,-40.776 -33.361,-74.027 -80.219,-75.758 l -7.333,0.005 c -0.003,0 -0.003,0 -0.006,0 -0.007,0.018 -26.057,89.686 79.134,141.521 0.945,-4.316 2.078,-10.867 2.73,-14.369 2.638,-14.193 3.363,-25.015 4.842,-37.987 z"
+           id="path85"
+           inkscape:connector-curvature="0"
+           style="fill:#87654a" /></g><g
+         id="g87"><g
+           id="g89"><g
+             id="g91"><g
+               id="g93"><path
+                 d="m 855.16,526.149 c 0,6.963 -5.649,12.608 -12.616,12.608 -6.961,0 -12.611,-5.645 -12.611,-12.608 0,-6.969 5.65,-12.611 12.611,-12.611 6.967,-10e-4 12.616,5.642 12.616,12.611 z"
+                 id="path95"
+                 inkscape:connector-curvature="0"
+                 style="fill:#5a3620" /></g></g></g><g
+           id="g97"><g
+             id="g99"><g
+               id="g101"><path
+                 d="m 763.301,526.149 c 0,6.963 -5.647,12.608 -12.609,12.608 -6.968,0 -12.609,-5.645 -12.609,-12.608 0,-6.969 5.641,-12.611 12.609,-12.611 6.962,-10e-4 12.609,5.642 12.609,12.611 z"
+                 id="path103"
+                 inkscape:connector-curvature="0"
+                 style="fill:#5a3620" /></g></g></g><g
+           id="g105"><g
+             id="g107"><path
+               d="m 760.023,522.362 c 0,2.557 -2.07,4.628 -4.629,4.628 -2.557,0 -4.632,-2.071 -4.632,-4.628 0,-2.552 2.075,-4.625 4.632,-4.625 2.559,0.001 4.629,2.073 4.629,4.625 z"
+               id="path109"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff" /></g></g><g
+           id="g111"><g
+             id="g113"><path
+               d="m 851.024,522.362 c 0,2.557 -2.073,4.628 -4.628,4.628 -2.558,0 -4.63,-2.071 -4.63,-4.628 0,-2.552 2.072,-4.625 4.63,-4.625 2.555,0.001 4.628,2.073 4.628,4.625 z"
+               id="path115"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff" /></g></g></g></g><path
+       d="m 725.288,441.121 c 0,0 -18.232,-25.193 0,-41.628 0,0 13.123,32.005 40.233,31.495"
+       id="path117"
+       inkscape:connector-curvature="0"
+       style="fill:#fef3df" /><path
+       d="m 848.318,439.837 c 0,0 18.232,-25.193 0,-41.628 0,0 -13.123,32.005 -40.233,31.495"
+       id="path119"
+       inkscape:connector-curvature="0"
+       style="fill:#fef3df" /><path
+       d="m 797.53,438.453 c -66.381,0 -120.196,53.815 -120.196,120.196 0,66.381 53.815,120.194 120.196,120.194 66.382,0 120.196,-53.813 120.196,-120.194 C 917.725,492.268 863.912,438.453 797.53,438.453 Z m -11.958,215.653 c -52.997,0 -95.961,-43.845 -95.961,-97.931 0,-54.086 42.963,-97.931 95.961,-97.931 52.995,0 95.958,43.845 95.958,97.931 0,54.086 -42.963,97.931 -95.958,97.931 z"
+       id="path121"
+       inkscape:connector-curvature="0"
+       style="fill:#f1f2f2" /><g
+       id="g123"><path
+         d="m 793.003,443.237 c 66.381,0 120.194,53.815 120.194,120.196 0,30.711 -11.523,58.726 -30.475,79.973 21.631,-21.736 35.002,-51.697 35.002,-84.785 0,-66.38 -53.813,-120.196 -120.196,-120.196 -35.67,0 -67.706,15.545 -89.719,40.224 21.769,-21.872 51.899,-35.412 85.194,-35.412 z"
+         id="path125"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" /></g><g
+       id="g127"><path
+         d="m 694.265,502.313 c 0,0 40.198,-14.957 95.353,-14.022 55.155,0.935 100.027,29.447 100.027,29.447 l 8.413,-57.492 c 0,0 -51.883,-35.524 -77.591,-59.829 -25.708,-24.306 -28.98,-28.512 -28.98,-28.512 0,0 -40.198,41.6 -66.373,56.557 -26.175,14.957 -35.524,20.566 -35.524,20.566 l 4.675,53.285 z"
+         id="path129"
+         inkscape:connector-curvature="0"
+         style="fill:#f1f2f2" /><path
+         d="m 752.039,427.289 c -5.218,15.301 0.741,45.305 6.446,52.941 4.565,-14.198 1.381,-39.668 -6.446,-52.941 z"
+         id="path131"
+         inkscape:connector-curvature="0"
+         style="fill:#97a3a2" /><path
+         d="m 792.297,477.645 c 8.422,-10.272 5.501,-61.687 -0.342,-73.723 -6.194,15.191 -10.634,65.438 0.342,73.723 z"
+         id="path133"
+         inkscape:connector-curvature="0"
+         style="fill:#97a3a2" /><path
+         d="m 720.593,443.412 c -3.983,12.281 1.136,36.168 5.784,42.198 3.474,-11.393 0.625,-31.693 -5.784,-42.198 z"
+         id="path135"
+         inkscape:connector-curvature="0"
+         style="fill:#97a3a2" /><path
+         d="m 832.42,429.158 c 5.218,15.301 -0.741,45.305 -6.446,52.941 -4.565,-14.197 -1.38,-39.667 6.446,-52.941 z"
+         id="path137"
+         inkscape:connector-curvature="0"
+         style="fill:#97a3a2" /><path
+         d="m 863.633,447.619 c 3.983,12.281 -1.136,36.168 -5.784,42.198 -3.474,-11.393 -0.625,-31.693 5.784,-42.198 z"
+         id="path139"
+         inkscape:connector-curvature="0"
+         style="fill:#97a3a2" /></g><g
+       id="g143" /><path
+       d="m 730.865,636.637 c 0,0 43.49,2.05 64.328,-35.861 0,0 14.758,30.223 46.61,34.759"
+       id="path157"
+       inkscape:connector-curvature="0"
+       style="opacity:0.1;fill:#3d5263" /><path
+       d="m 795.193,671.227 0,-60.691 c -13.615,27.608 -64.328,26.101 -64.328,26.101 0,0 3.306,8.89 3.788,9.853 0.482,0.963 21.508,12.52 21.508,12.52"
+       id="path159"
+       inkscape:connector-curvature="0"
+       style="fill:#f1f2f2" /><path
+       d="m 859.521,636.637 c 0,0 -50.713,1.507 -64.328,-26.101 l 0,60.691"
+       id="path161"
+       inkscape:connector-curvature="0"
+       style="fill:#f1f2f2" /><g
+       id="g163" /></g></svg>
\ No newline at end of file
diff --git a/data/web/inc/functions.docker.inc.php b/data/web/inc/functions.docker.inc.php
index 5b6afa9f..11747f25 100644
--- a/data/web/inc/functions.docker.inc.php
+++ b/data/web/inc/functions.docker.inc.php
@@ -7,6 +7,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea
       curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/json');
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($curl, CURLOPT_POST, 0);
+      curl_setopt($curl, CURLOPT_TIMEOUT, 4);
       $response = curl_exec($curl);
       if ($response === false) {
         $err = curl_error($curl);
@@ -32,6 +33,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea
         curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/json');
         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($curl, CURLOPT_POST, 0);
+        curl_setopt($curl, CURLOPT_TIMEOUT, 4);
         $response = curl_exec($curl);
         if ($response === false) {
           $err = curl_error($curl);
@@ -58,6 +60,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea
         if (ctype_xdigit($container_id) && ctype_alnum($attr1)) {
           curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/' . $attr1);
           curl_setopt($curl, CURLOPT_POST, 1);
+          curl_setopt($curl, CURLOPT_TIMEOUT, 4);
           if (!empty($attr2)) {
             curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($attr2));
           }
diff --git a/data/web/inc/functions.fail2ban.inc.php b/data/web/inc/functions.fail2ban.inc.php
index b78fb36a..5acbf60f 100644
--- a/data/web/inc/functions.fail2ban.inc.php
+++ b/data/web/inc/functions.fail2ban.inc.php
@@ -4,30 +4,26 @@ function fail2ban($_action, $_data = null) {
   global $lang;
   switch ($_action) {
     case 'get':
-      $data = array();
+      $f2b_options = array();
       if ($_SESSION['mailcow_cc_role'] != "admin") {
         return false;
       }
       try {
-        $data['ban_time'] = $redis->Get('F2B_BAN_TIME');
-        $data['max_attempts'] = $redis->Get('F2B_MAX_ATTEMPTS');
-        $data['retry_window'] = $redis->Get('F2B_RETRY_WINDOW');
-        $data['netban_ipv4'] = $redis->Get('F2B_NETBAN_IPV4');
-        $data['netban_ipv6'] = $redis->Get('F2B_NETBAN_IPV6');
+        $f2b_options = json_decode($redis->Get('F2B_OPTIONS'), true);
         $wl = $redis->hGetAll('F2B_WHITELIST');
         if (is_array($wl)) {
           foreach ($wl as $key => $value) {
             $tmp_data[] = $key;
           }
           if (isset($tmp_data)) {
-            $data['whitelist'] = implode(PHP_EOL, $tmp_data);
+            $f2b_options['whitelist'] = implode(PHP_EOL, $tmp_data);
           }
           else {
-            $data['whitelist'] = "";
+            $f2b_options['whitelist'] = "";
           }
         }
         else {
-          $data['whitelist'] = "";
+          $f2b_options['whitelist'] = "";
         }
       }
       catch (RedisException $e) {
@@ -37,7 +33,7 @@ function fail2ban($_action, $_data = null) {
         );
         return false;
       }
-      return $data;
+      return $f2b_options;
     break;
     case 'edit':
       if ($_SESSION['mailcow_cc_role'] != "admin") {
@@ -63,21 +59,16 @@ function fail2ban($_action, $_data = null) {
         return false;
       }
       $wl = $_data['whitelist'];
-      $ban_time = ($ban_time < 60) ? 60 : $ban_time;
-
-      $netban_ipv4 = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
-      $netban_ipv6 = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
-      $netban_ipv4 = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
-      $netban_ipv6 = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
-
-      $max_attempts = ($max_attempts < 1) ? 1 : $max_attempts;
-      $retry_window = ($retry_window < 1) ? 1 : $retry_window;
+      $f2b_options = array();
+      $f2b_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time;
+      $f2b_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
+      $f2b_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
+      $f2b_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
+      $f2b_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
+      $f2b_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts;
+      $f2b_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window;
       try {
-        $redis->Set('F2B_BAN_TIME', $ban_time);
-        $redis->Set('F2B_MAX_ATTEMPTS', $max_attempts);
-        $redis->Set('F2B_RETRY_WINDOW', $retry_window);
-        $redis->Set('F2B_NETBAN_IPV4', $netban_ipv4);
-        $redis->Set('F2B_NETBAN_IPV6', $netban_ipv6);
+        $redis->Set('F2B_OPTIONS', json_encode($f2b_options));
         $redis->Del('F2B_WHITELIST');
         if(!empty($wl)) {
           $wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl));
diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php
index f7f08403..54ca415e 100644
--- a/data/web/inc/functions.inc.php
+++ b/data/web/inc/functions.inc.php
@@ -1134,13 +1134,13 @@ function get_logs($container, $lines = false) {
       return $data_array;
     }
   }
-  if ($container == "fail2ban-mailcow") {
+  if ($container == "netfilter-mailcow") {
     if (!is_numeric($lines)) {
       list ($from, $to) = explode('-', $lines);
-      $data = $redis->lRange('F2B_LOG', intval($from), intval($to));
+      $data = $redis->lRange('NETFILTER_LOG', intval($from), intval($to));
     }
     else {
-      $data = $redis->lRange('F2B_LOG', 0, intval($lines));
+      $data = $redis->lRange('NETFILTER_LOG', 0, intval($lines));
     }
     if ($data) {
       foreach ($data as $json_line) {
diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php
index f3577d50..f059ced0 100644
--- a/data/web/inc/init_db.inc.php
+++ b/data/web/inc/init_db.inc.php
@@ -3,7 +3,7 @@ function init_db_schema() {
   try {
     global $pdo;
 
-    $db_version = "27012018_1721";
+    $db_version = "30012018_1521";
 
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -21,10 +21,6 @@ function init_db_schema() {
       AND active = '1'
       AND address NOT LIKE '@%'
       GROUP BY goto;",
-    "grouped_sender_acl" => "CREATE VIEW grouped_sender_acl (username, send_as_acl) AS
-      SELECT logged_in_as, IFNULL(GROUP_CONCAT(send_as SEPARATOR ' '), '') AS send_as_acl FROM sender_acl
-      WHERE send_as NOT LIKE '@%'
-      GROUP BY logged_in_as;",
     "grouped_domain_alias_address" => "CREATE VIEW grouped_domain_alias_address (username, ad_alias) AS
       SELECT username, IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ' '), '') AS ad_alias FROM mailbox
       LEFT OUTER JOIN alias_domain ON target_domain=domain
@@ -193,7 +189,6 @@ function init_db_schema() {
           "tls_enforce_out" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "kind" => "VARCHAR(100) NOT NULL DEFAULT ''",
           "multiple_bookings" => "TINYINT(1) NOT NULL DEFAULT '0'",
-          "wants_tagged_subject" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
           "modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP",
           "active" => "TINYINT(1) NOT NULL DEFAULT '1'"
@@ -250,7 +245,8 @@ function init_db_schema() {
           "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "filters" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "quarantaine" => "TINYINT(1) NOT NULL DEFAULT '1'",
-          "bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '1'",
+          "bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '0'",
+          "recipient_maps" => "TINYINT(1) NOT NULL DEFAULT '0'",
         ),
         "keys" => array(
           "fkey" => array(
diff --git a/data/web/js/debug.js b/data/web/js/debug.js
index 48ebd5e9..4ffcc044 100644
--- a/data/web/js/debug.js
+++ b/data/web/js/debug.js
@@ -31,9 +31,9 @@ jQuery(function($){
     e.preventDefault();
     draw_acme_logs();
   });
-  $("#refresh_fail2ban_log").on('click', function(e) {
+  $("#refresh_netfilter_log").on('click', function(e) {
     e.preventDefault();
-    draw_fail2ban_logs();
+    draw_netfilter_logs();
   });
   $("#refresh_rspamd_history").on('click', function(e) {
     e.preventDefault();
@@ -206,8 +206,8 @@ jQuery(function($){
       }
     });
   }
-  function draw_fail2ban_logs() {
-    ft_fail2ban_logs = FooTable.init('#fail2ban_log', {
+  function draw_netfilter_logs() {
+    ft_netfilter_logs = FooTable.init('#netfilter_log', {
       "columns": [
         {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleString();},"title":lang.time,"style":{"width":"170px"}},
         {"name":"priority","title":lang.priority,"style":{"width":"80px"}},
@@ -215,10 +215,10 @@ jQuery(function($){
       ],
       "rows": $.ajax({
         dataType: 'json',
-        url: '/api/v1/get/logs/fail2ban',
+        url: '/api/v1/get/logs/netfilter',
         jsonp: false,
         error: function () {
-          console.log('Cannot draw fail2ban log table');
+          console.log('Cannot draw netfilter log table');
         },
         success: function (data) {
           return process_table_data(data, 'general_syslog');
@@ -497,7 +497,7 @@ jQuery(function($){
   draw_watchdog_logs();
   draw_acme_logs();
   draw_api_logs();
-  draw_fail2ban_logs();
+  draw_netfilter_logs();
   draw_rspamd_history();
 
-});
\ No newline at end of file
+});
diff --git a/data/web/json_api.php b/data/web/json_api.php
index 8c2c5b44..9d6e9761 100644
--- a/data/web/json_api.php
+++ b/data/web/json_api.php
@@ -880,14 +880,14 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
                   echo '{}';
                 }
               break;
-              case "fail2ban":
+              case "netfilter":
                 // 0 is first record, so empty is fine
                 if (isset($extra)) {
                   $extra = preg_replace('/[^\d\-]/i', '', $extra);
-                  $logs = get_logs('fail2ban-mailcow', $extra);
+                  $logs = get_logs('netfilter-mailcow', $extra);
                 }
                 else {
-                  $logs = get_logs('fail2ban-mailcow');
+                  $logs = get_logs('netfilter-mailcow');
                 }
                 if (isset($logs) && !empty($logs)) {
                   echo json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index a874eea1..71587fcf 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -666,3 +666,14 @@ $lang['mailbox']['bcc_to_rcpt'] = "Map empfängerabhängig verwenden";
 $lang['mailbox']['add_bcc_entry'] = "BCC-Eintrag hinzufügen";
 $lang['mailbox']['bcc_info'] = "Eine empfängerabhängige Map wird verwendet, wenn die BCC-Map Eintragung auf den Eingang einer E-Mail auf das lokale Ziel reagieren soll. Senderabhängige Maps verfahren nach dem gleichen Prinzip.<br/>
   Das lokale Ziel wird bei Fehlzustellungen an ein BCC-Ziel nicht informiert.";
+$lang['mailbox']['address_rewriting'] = 'Adressumschreibung';
+$lang['mailbox']['recipient_maps'] = 'Empfängerumschreibungen';
+$lang['mailbox']['recipient_map_info'] = 'Empfängerumschreibung ersetzen den Empfänger einer E-Mail vor dem Versand.';
+$lang['mailbox']['recipient_map_old'] = 'Original Empfänger';
+$lang['mailbox']['recipient_map_new'] = 'Neuer Empfänger';
+$lang['mailbox']['add_recipient_map_entry'] = 'Empfängerumschreibung hinzufügen';
+$lang['mailbox']['sender_maps'] = 'Senderumschreibungen';
+$lang['mailbox']['sender_map_info'] = 'Senderumschreibungen werden verwendet, um den Absender einer E-Mail noch vor dem Versand umzuschreiben.';
+$lang['mailbox']['sender_map_old'] = 'Original Absender';
+$lang['mailbox']['sender_map_new'] = 'Neuer Absender';
+$lang['mailbox']['add_sender_map_entry'] = 'Senderumschreibung hinzufügen';
\ No newline at end of file
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index 41795bc3..50eb64f9 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -666,4 +666,9 @@ $lang['mailbox']['recipient_maps'] = 'Recipient maps';
 $lang['mailbox']['recipient_map_info'] = 'Recipient maps are used to replace the destination address on a message before it is delivered.';
 $lang['mailbox']['recipient_map_old'] = 'Original recipient';
 $lang['mailbox']['recipient_map_new'] = 'New recipient';
-$lang['mailbox']['add_recipient_map_entry'] = 'Add recipient map';
\ No newline at end of file
+$lang['mailbox']['add_recipient_map_entry'] = 'Add recipient map';
+$lang['mailbox']['sender_maps'] = 'Sender maps';
+$lang['mailbox']['sender_map_info'] = 'Sender maps are used to replace the sender address on a message before it is sent.';
+$lang['mailbox']['sender_map_old'] = 'Original sender';
+$lang['mailbox']['sender_map_new'] = 'New sender';
+$lang['mailbox']['add_sender_map_entry'] = 'Add sender map';
\ No newline at end of file