diff --git a/configure.ac b/configure.ac
index 9261c14f7e79a6c4450a9b224477de8edceeb729..7545378a666baa8321639c457cb64b83f2c32f0e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
 AC_INIT([Gajim - A Jabber Instant Messager],
-		[0.12.3.1-dev],[http://trac.gajim.org/],[gajim])
+		[0.12.5.1-dev],[http://trac.gajim.org/],[gajim])
 AC_PREREQ([2.59])
 
 AC_CONFIG_HEADER(config.h)
diff --git a/src/common/check_paths.py b/src/common/check_paths.py
index e883d16359aa5f7a843c3b913ed3ea2f05c4e98f..0a9dcb83e5ba5825dc8fe82ae4fc91d957d569f7 100644
--- a/src/common/check_paths.py
+++ b/src/common/check_paths.py
@@ -64,7 +64,8 @@ def create_log_db():
 
 		CREATE TABLE unread_messages(
 			message_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
-			jid_id INTEGER
+			jid_id INTEGER,
+			shown BOOLEAN default 0
 		);
 
 		CREATE INDEX idx_unread_messages_jid_id ON unread_messages (jid_id);
diff --git a/src/common/defs.py b/src/common/defs.py
index c321440d0c6a339d348f9bd5f4c4aa82c628c83d..e213fdab103618876db3215635eafd358ad39b60 100644
--- a/src/common/defs.py
+++ b/src/common/defs.py
@@ -27,7 +27,7 @@ docdir = '../'
 datadir = '../'
 localedir = '../po'
 
-version = '0.12.3.1-dev'
+version = '0.12.5.1-dev'
 
 import sys, os.path
 for base in ('.', 'common'):
diff --git a/src/common/logger.py b/src/common/logger.py
index 51ad1d08080aa60167276593d0810fdd820fd791..5fc94b9b91b6a006c547658816624051f79239a2 100644
--- a/src/common/logger.py
+++ b/src/common/logger.py
@@ -390,17 +390,29 @@ class Logger:
 		sql = 'DELETE FROM unread_messages WHERE message_id IN (%s)' % ids
 		self.simple_commit(sql)
 
+	def set_shown_unread_msgs(self, msg_id):
+		''' mark unread message as shown un GUI '''
+		sql = 'UPDATE unread_messages SET shown = 1 where message_id = %s' % \
+			msg_id
+		self.simple_commit(sql)
+
+	def reset_shown_unread_messages(self):
+		''' Set shown field to False in unread_messages table '''
+		sql = 'UPDATE unread_messages SET shown = 0'
+		self.simple_commit(sql)
+
 	def get_unread_msgs(self):
 		''' get all unread messages '''
 		all_messages = []
 		try:
 			self.cur.execute(
-				'SELECT message_id from unread_messages')
+				'SELECT message_id, shown from unread_messages')
 			results = self.cur.fetchall()
 		except Exception:
 			pass
 		for message in results:
 			msg_id = message[0]
+			shown = message[1]
 			# here we get infos for that message, and related jid from jids table
 			# do NOT change order of SELECTed things, unless you change function(s)
 			# that called this function
@@ -416,7 +428,7 @@ class Logger:
 				# Log line is no more in logs table. remove it from unread_messages
 				self.set_read_messages([msg_id])
 				continue
-			all_messages.append(results[0])
+			all_messages.append(results[0] + (shown,))
 		return all_messages
 
 	def write(self, kind, jid, message = None, show = None, tim = None,
diff --git a/src/common/optparser.py b/src/common/optparser.py
index 9fbcf38f18225abf6f3c8dfcf4ed56b9e2fcff52..18cfe2802808a9e442b8bdae64ed1bae0fc5ed0c 100644
--- a/src/common/optparser.py
+++ b/src/common/optparser.py
@@ -200,6 +200,8 @@ class OptionsParser:
 			self.update_config_to_01215()
 		if old < [0, 12, 3, 1] and new >= [0, 12, 3, 1]:
 			self.update_config_to_01231()
+		if old < [0, 12, 5, 1] and new >= [0, 12, 5, 1]:
+			self.update_config_to_01251()
 
 		gajim.logger.init_vars()
 		gajim.config.set('version', new_version)
@@ -705,7 +707,23 @@ class OptionsParser:
 		con.close()
 		gajim.config.set('version', '0.12.3.1')
 
-
-
+	def update_config_to_01251(self):
+		back = os.getcwd()
+		os.chdir(logger.LOG_DB_FOLDER)
+		con = sqlite.connect(logger.LOG_DB_FILE)
+		os.chdir(back)
+		cur = con.cursor()
+		try:
+			cur.executescript(
+				'''
+				ALTER TABLE unread_messages
+				ADD shown BOOLEAN default 0;
+				'''
+			)
+			con.commit()
+		except sqlite.OperationalError:
+			pass
+		con.close()
+		gajim.config.set('version', '0.12.5.1')
 
 # vim: se ts=3:
diff --git a/src/gajim.py b/src/gajim.py
index 41a29ce65de29fe95dda731c5d07df882a5bc678..83382f7de3d9be2bee7856f3b13955e180b893c3 100644
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -3247,6 +3247,7 @@ class Interface:
 	def __init__(self):
 		gajim.interface = self
 		gajim.thread_interface = ThreadInterface
+		gajim.logger.reset_shown_unread_messages()
 		# This is the manager and factory of message windows set by the module
 		self.msg_win_mgr = None
 		self.jabber_state_images = {'16': {}, '32': {}, 'opened': {},
diff --git a/src/roster_window.py b/src/roster_window.py
index 2089dd7e6ea4fb88222f611474c45980288ccd80..b9358f07bf4e49de37d0ff4f5c0f5be2c31ad160 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1654,7 +1654,9 @@ class RosterWindow:
 		results = gajim.logger.get_unread_msgs()
 		for result in results:
 			jid = result[4]
-			if gajim.contacts.get_first_contact_from_jid(account, jid):
+			shown = result[5]
+			if gajim.contacts.get_first_contact_from_jid(account, jid) and not \
+			shown:
 				# We have this jid in our contacts list
 				# XXX unread messages should probably have their session saved with
 				# them
@@ -1663,6 +1665,7 @@ class RosterWindow:
 				tim = time.localtime(float(result[2]))
 				session.roster_message(jid, result[1], tim, msg_type='chat',
 					msg_id=result[0])
+				gajim.logger.set_shown_unread_msgs(result[0])
 
 			elif (time.time() - result[2]) > 2592000:
 				# ok, here we see that we have a message in unread messages table