diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl
index b5a36b8..89990e0 100644
--- a/doc/sample-ngircd.conf.tmpl
+++ b/doc/sample-ngircd.conf.tmpl
@@ -182,6 +182,9 @@
 	# Use PAM if ngIRCd has been compiled with support for it.
 	;PAM = no
 
+	# Enhance user privacy slightly (useful for IRC server on TOR or I2P)
+	;MorePrivacy = no
+
 [Operator]
 	# [Operator] sections are used to define IRC Operators. There may be
 	# more than one [Operator] block, one for each local operator.
diff --git a/man/ngircd.conf.5.tmpl b/man/ngircd.conf.5.tmpl
index d1a0a64..288c3c8 100644
--- a/man/ngircd.conf.5.tmpl
+++ b/man/ngircd.conf.5.tmpl
@@ -310,6 +310,15 @@ If ngIRCd is compiled with PAM support this can be used to disable all calls
 to the PAM library at runtime; all users connecting without password are
 allowed to connect, all passwords given will fail.
 Default: yes.
+.TP
+\fBMorePrivacy\fR (boolean)
+This will cause ngIRCd to censor user idle time, logon time as well as the
+part/quit messages (that are sometimes used to inform everyone about which
+client software is being used.) WHOWAS requests are also silently ignored.
+This option is most useful when ngIRCd is being used together with 
+anonymizing software such as TOR or I2P and one does not wish to make it
+too easy to collect statistics on the users.
+Default: no.
 .SH [SERVER]
 Other servers are configured in
 .I [Server]
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c
index 6e8851b..4c78e0b 100644
--- a/src/ngircd/channel.c
+++ b/src/ngircd/channel.c
@@ -263,6 +263,9 @@ Channel_Part(CLIENT * Client, CLIENT * Origin, const char *Name, const char *Rea
 		return false;
 	}
 
+	if (Conf_MorePrivacy)
+		Reason = "";
+
 	/* Part client from channel */
 	if (!Remove_Client(REMOVE_PART, chan, Client, Origin, Reason, true))
 		return false;
@@ -331,6 +334,9 @@ Channel_Quit( CLIENT *Client, const char *Reason )
 	assert( Client != NULL );
 	assert( Reason != NULL );
 
+	if (Conf_MorePrivacy)
+		Reason = "";
+
 	IRC_WriteStrRelatedPrefix( Client, Client, false, "QUIT :%s", Reason );
 
 	c = My_Channels;
@@ -961,6 +967,9 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const ch
 				Client_Mask( Client ), c->name, Client_ID(Origin), Reason);
 			break;
 		default: /* PART */
+			if (Conf_MorePrivacy)
+				Reason = ""; 
+
 			if (InformServer)
 				IRC_WriteStrServersPrefix(Origin, Client, "PART %s :%s", c->name, Reason);
 
diff --git a/src/ngircd/client.c b/src/ngircd/client.c
index e01c424..d01dc50 100644
--- a/src/ngircd/client.c
+++ b/src/ngircd/client.c
@@ -335,8 +335,10 @@ Client_SetID( CLIENT *Client, const char *ID )
 	
 	strlcpy( Client->id, ID, sizeof( Client->id ));
 
-	if (Conf_CloakUserToNick)
+	if (Conf_CloakUserToNick) {
 		strlcpy( Client->user, ID, sizeof( Client->user ));
+		strlcpy( Client->info, ID, sizeof( Client->info ));
+	}
 
 	/* Hash */
 	Client->hash = Hash( Client->id );
@@ -351,9 +353,9 @@ Client_SetUser( CLIENT *Client, const char *User, bool Idented )
 	assert( Client != NULL );
 	assert( User != NULL );
 
-	if (Conf_CloakUserToNick) return;
-
-	if (Idented) {
+	if (Conf_CloakUserToNick) {
+		strlcpy(Client->user, Client->id, sizeof(Client->user));
+	} else if (Idented) {
 		strlcpy(Client->user, User, sizeof(Client->user));
 	} else {
 		Client->user[0] = '~';
@@ -390,7 +392,10 @@ Client_SetInfo( CLIENT *Client, const char *Info )
 	assert( Client != NULL );
 	assert( Info != NULL );
 
-	strlcpy(Client->info, Info, sizeof(Client->info));
+	if (Conf_CloakUserToNick)
+		strlcpy(Client->info, Client->id, sizeof(Client->info));
+	else 
+		strlcpy(Client->info, Info, sizeof(Client->info));
 } /* Client_SetInfo */
 
 
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index 326b433..ff73eb3 100644
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -410,6 +410,7 @@ Conf_Test( void )
 	printf("  DNS = %s\n", yesno_to_str(Conf_DNS));
 	printf("  Ident = %s\n", yesno_to_str(Conf_Ident));
 	printf("  PAM = %s\n", yesno_to_str(Conf_PAM));
+	printf("  MorePrivacy =%s\n", yesno_to_str(Conf_MorePrivacy));
 	puts("");
 
 	opers_puts();
@@ -711,6 +712,8 @@ Set_Defaults(bool InitServers)
 	strcpy(Conf_CloakHost, "");
 	Conf_CloakUserToNick = false;
 
+	Conf_MorePrivacy = false;
+
 #ifdef SYSLOG
 #ifdef LOG_LOCAL5
 	Conf_SyslogFacility = LOG_LOCAL5;
@@ -1447,6 +1450,11 @@ Handle_FEATURES(int Line, char *Var, char *Arg)
 		WarnPAM(Line);
 		return;
 	}
+	if(strcasecmp(Var, "MorePrivacy") == 0){
+		/* Increase privacy by hiding stats on users */
+		Conf_MorePrivacy = Check_ArgIsTrue(Arg);
+		return;
+	}
 
 	Config_Error_Section(Line, Var, "Options");
 }
diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h
index 80d1818..72aa7ca 100644
--- a/src/ngircd/conf.h
+++ b/src/ngircd/conf.h
@@ -178,6 +178,8 @@ GLOBAL bool Conf_Ident;
 /** Enable all usage of PAM, even when compiled with support for it */
 GLOBAL bool Conf_PAM;
 
+GLOBAL bool Conf_MorePrivacy;
+
 /** Enable NOTICE AUTH messages on connect */
 GLOBAL bool Conf_NoticeAuth;
 
diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c
index 22c65aa..ed8fe40 100644
--- a/src/ngircd/irc-info.c
+++ b/src/ngircd/irc-info.c
@@ -999,7 +999,7 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
 			return DISCONNECTED;
 
 	/* Idle and signon time (local clients only!) */
-	if (Client_Conn(c) > NONE &&
+	if (!Conf_MorePrivacy && Client_Conn(c) > NONE &&
 		!IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
 				    Client_ID(from), Client_ID(c),
 				    (unsigned long)Conn_GetIdle(Client_Conn(c)),
@@ -1163,6 +1163,11 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
 	assert( Client != NULL );
 	assert( Req != NULL );
 
+	/* Do not reveal any info on disconnected users? */
+	if (Conf_MorePrivacy)
+		return CONNECTED;
+
+
 	/* Wrong number of parameters? */
 	if (Req->argc > 3)
 		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
@@ -1389,6 +1394,10 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
 	if( Channel_IsMemberOf( Chan, Client )) is_member = true;
 	else is_member = false;
 
+	/* Do not print info on channel memberships to anyone that is not member? */
+	if(Conf_MorePrivacy && !is_member)
+		return CONNECTED;
+
 	/* Secret channel? */
 	if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
 
