diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php
index 791dacf12ba8861e5d9902457711c74ac3fd1de9..1fa9a6a5acecb736dc7a5280d01387c5188b6ff0 100644
--- a/interface/web/sites/web_vhost_domain_edit.php
+++ b/interface/web/sites/web_vhost_domain_edit.php
@@ -1440,7 +1440,7 @@ class page_action extends tform_actions {
 			$htaccess_allow_override = $web_config["htaccess_allow_override"];
 			$added_by = $_SESSION['s']['user']['username'];
 
-			$sql = "UPDATE web_domain SET system_user = ?, system_group = ?, document_root = ?, allow_override = ?, php_open_basedir = ?, added_date = CURDATE(), added_by = ?, log_retention  WHERE domain_id = ?";
+			$sql = "UPDATE web_domain SET system_user = ?, system_group = ?, document_root = ?, allow_override = ?, php_open_basedir = ?, added_date = CURDATE(), added_by = ?, log_retention = ? WHERE domain_id = ?";
 			$app->db->query($sql, $system_user, $system_group, $document_root, $htaccess_allow_override, $php_open_basedir, $added_by, $log_retention, $this->id);
 		} else  {
 			// Set the values for document_root, system_user and system_group
@@ -1454,7 +1454,7 @@ class page_action extends tform_actions {
 			$htaccess_allow_override = $this->parent_domain_record['allow_override'];
 			$added_by = $_SESSION['s']['user']['username'];
 			
-			$sql = "UPDATE web_domain SET sys_groupid = ?, system_user = ?, system_group = ?, document_root = ?, allow_override = ?, php_open_basedir = ?, added_date = CURDATE(), added_by = ?, log_retention  WHERE domain_id = ?";
+			$sql = "UPDATE web_domain SET sys_groupid = ?, system_user = ?, system_group = ?, document_root = ?, allow_override = ?, php_open_basedir = ?, added_date = CURDATE(), added_by = ?, log_retention = ? WHERE domain_id = ?";
 			$app->db->query($sql, $this->parent_domain_record['sys_groupid'], $system_user, $system_group, $document_root, $htaccess_allow_override, $php_open_basedir, $added_by, $log_retention, $this->id);
 		}
 		if(isset($this->dataRecord['folder_directive_snippets'])) $app->db->query("UPDATE web_domain SET folder_directive_snippets = ? WHERE domain_id = ?", $this->dataRecord['folder_directive_snippets'], $this->id);
diff --git a/server/scripts/vlogger b/server/scripts/vlogger
index 11a41c34492ded8986004df7e20c05c477fbfe57..8703df0d77a58f667574e8f7deb4ea1e6253f6ba 100755
--- a/server/scripts/vlogger
+++ b/server/scripts/vlogger
@@ -29,6 +29,11 @@
 # 1.2   support for mod_logio
 # 1.3	various contributed bugfixes
 # 1.4   automatically creates two levels of subdirs.
+# 1.4p1 implemented anonymization of ipv4 and ipv6
+# 1.4p2 implemented anonymization in error log part
+# 1.4p3 implemented stronger anonymization
+# 1.4p4 implemented re-opening on externally rotated error.log
+# 1.4p5 backported old ISPConfig changes (improved DBI error handling, naming)
 #
 # 
 # TODO:
@@ -39,7 +44,7 @@ package vlogger;
 
 $ENV{PATH} = "/bin:/usr/bin";
 
-my $VERSION = "1.3";
+my $VERSION = "1.4p5"; # modified for ISPConfig
 
 =head1 NAME
 
@@ -112,6 +117,9 @@ or "%m%d%Y-error.log".  When using the -r option, the default becomes
 -p
 	Privacy mode (delete last octet of ipv4 or last 4 sections of ipv6)
 
+-P
+	Extended privacy mode (delete 2 octets ipv4 or 5 sections ipv6)
+
 -h
 	Displays help.
 
@@ -156,7 +164,7 @@ use File::Basename;
 
 # get command line options
 our %OPTS;
-getopts( 'f:t:s:hu:g:aeipvr:d:', \%OPTS );
+getopts( 'f:t:s:hu:g:aeinpPvr:d:', \%OPTS );
 
 # print out version
 if ( $OPTS{'v'} ) {
@@ -176,9 +184,9 @@ if ( $OPTS{'h'} || !$ARGV[0] ) {
 # log directory
 my $LOGDIR;
 if ( $ARGV[0] ) {
-    if ( !-d $ARGV[0] ) {
+    if ( !-d $ARGV[0] || -l $ARGV[0] ) {
         print STDERR
-          "[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n";
+          "[vlogger] target directory $ARGV[0] does not exist or is a symlink - exiting.\n\n";
         exit;
     }
     $LOGDIR = $ARGV[0];
@@ -258,9 +266,14 @@ if ( $OPTS{'d'} ) {
     }
 
     # test the connection
-    my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
-      or die "DBI Error: $!";
-    $dbh->disconnect;
+    eval {
+        my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
+          or die "DBI Error: $!";
+        $dbh->disconnect;
+    };
+    if($@) {
+        print "MySQL Connection problem\n";
+    }
 
     # SIGALRM dumps the tracker hash
     $SIG{ALRM} = \&dump_tracker;
@@ -317,7 +330,7 @@ if ( $OPTS{'s'} ) {
 
 # chroot to the logdir
 chdir($LOGDIR);
-chroot(".");
+#chroot("."); #we better do not chroot as DBI requires to load a module on the fly -> error!
 
 my %logs     = ();
 my %tracker  = ();
@@ -367,6 +380,25 @@ if ( $OPTS{'e'} ) {
             $LASTWRITE = time();
         }
 
+#        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+#            $atime,$mtime,$ctime,$blksize,$blocks)
+#               = stat(time2str( $TEMPLATE, time() ));
+        my @fstat = ELOG->stat();
+        my $nlinks = $fstat[3];
+        if($nlinks < 1) {
+			close ELOG;
+			open ELOG, ">>" . time2str( $TEMPLATE, time() )
+				or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) );
+		}
+
+        if ( $OPTS{'P'} ) {
+			$log_line =~ s/^(.*?\[client\s+\d+\.\d+)\.\d+\.\d+((?::\d+)?\]\s+.*)/$1.0.0$2/g;
+			$log_line =~ s/^(.*?\[client\s+[a-f0-9]*:[a-f0-9]*:[a-f0-9]*)(?::[a-f0-9]*){2,5}((?::\d+)?\]\s+.*)/$1::0$2/g;
+		} elsif ( $OPTS{'p'} ) {
+			$log_line =~ s/^(.*?\[client\s+\d+\.\d+\.\d+)\.\d+((?::\d+)?\]\s+.*)/$1.0$2/g;
+			$log_line =~ s/^(.*?\[client\s+[a-f0-9]*:[a-f0-9]*:[a-f0-9]*:[a-f0-9]*)(?::[a-f0-9]*){1,4}((?::\d+)?\]\s+.*)/$1::0$2/g;
+        }
+
         # we dont need to do any other parsing at all, so write the line.
         print ELOG $log_line;
     }
@@ -379,10 +411,13 @@ else {
     while ( my $log_line = <STDIN> ) {
 
         
-        if ( $OPTS{'p'} ) {
-			$log_line =~ s/^(\S*\s+\d+\.\d+\.\d+)\.\d+(\s+.*)/$1.0$2/;
-			$log_line =~ s/^(\S*\s+[a-f0-9]*:[a-f0-9]*:[a-f0-9]*:[a-f0-9]*)(?::[a-f0-9]*){1,4}(\s+.*)/$1::0$2/;
-        }
+		if ( $OPTS{'P'} ) {
+			$log_line =~ s/^(\S*\s+\d+\.\d+)\.\d+\.\d+(\s+.*)/$1.0.0$2/g;
+			$log_line =~ s/^(\S*\s+[a-f0-9]*:[a-f0-9]*:[a-f0-9]*)(?::[a-f0-9]*){2,5}(\s+.*)/$1::0$2/g;
+		} elsif($OPTS{'p'}) {
+			$log_line =~ s/^(\S*\s+\d+\.\d+\.\d+)\.\d+(\s+.*)/$1.0$2/g;
+			$log_line =~ s/^(\S*\s+[a-f0-9]*:[a-f0-9]*:[a-f0-9]*:[a-f0-9]*)(?::[a-f0-9]*){1,4}(\s+.*)/$1::0$2/g;
+		}
         
         # parse out the first word (the vhost)
         my @this_line = split ( /\s/, $log_line );
@@ -392,6 +427,7 @@ else {
         if ( $vhost =~ m#[/\\]# ) { $vhost = "default" }
         $vhost =~ /(.*)/o;
         $vhost = $1;
+        $vhost = 'default' unless $vhost;
 
         if ( $OPTS{'i'} ) {
             $reqsize = $this_line[1] + $this_line[2];
@@ -439,6 +475,11 @@ else {
                 make_path($filepath)
                   or die ( "can't mkdir $filepath" );
             }
+            
+            # Dont log to symlinks
+            if( -l "${vhost}/".time2str( $TEMPLATE, time() ) ) {
+                die("Log target is a symlink: $LOGDIR/${vhost}/".time2str( $TEMPLATE, time() ));
+            }
 
             # open the file using the template
             open $vhost, ">>".$filename
@@ -520,25 +561,26 @@ sub open_errorlog {
 
 # sub to update the database with the tracker data
 sub dump_tracker {
+    eval {
     if ( keys(%tracker) > 0 ) {
         my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
           or warn "DBI Error: $!";
         foreach my $key ( keys(%tracker) ) {
-            my $ts = time2str( "%m%d%Y", time() );
+            my $ts = time2str( "%Y-%m-%d", time() );
             my $sth =
-              $dbh->prepare( "select * from wwwusage where vhost='" . $key
-                . "' and ldate='" . $ts . "'" );
+              $dbh->prepare( "select * from web_traffic where hostname='" . $key
+                . "' and traffic_date='" . $ts . "'" );
             $sth->execute;
             if ( $sth->rows ) {
                 my $query =
-                  "update wwwusage set bytes=bytes+"
+                  "update web_traffic set traffic_bytes=traffic_bytes+"
                   . $tracker{$key}
-                  . " where vhost='" . $key
-                  . "' and ldate='" . $ts . "'";
+                  . " where hostname='" . $key
+                  . "' and traffic_date='" . $ts . "'";
                 $dbh->do($query);
             }
             else {
-                my $query = "insert into wwwusage (vhost, ldate, bytes) values ('$key', '$ts', '$tracker{$key}')";
+                my $query = "insert into web_traffic (hostname, traffic_date, traffic_bytes) values ('$key', '$ts', '$tracker{$key}')";
                 $dbh->do($query);
             }
         }
@@ -546,6 +588,11 @@ sub dump_tracker {
         %tracker = ();
     }
     alarm $DBI_DUMP;
+    };
+    
+    if ($@) {
+        print "Unable to store vlogger data in database\n";
+    }
 }
 
 # print usage info
@@ -565,6 +612,8 @@ sub usage {
     print "  -d CONFIG                   use DBI usage tracker (see perldoc vlogger)\n";
     print "  -p                          Privacy mode (delete last octet of ipv4 or\n";
     print "                              last 4 sections of ipv6)\n";
+    print "  -P                         Extended privacy mode (delete 2 octets ipv4\n";
+    print "                              or last 5 sections of ipv6\n";
     print "  -i                          extract mod_logio instead of filesize\n";
     print "  -h                          display this help\n";
     print "  -v                          output version information\n\n";