diff --git a/game/engine/ButtonList.lua b/game/engine/ButtonList.lua
index dc59b722d21da8f8df63eb1bac222d5d11241211..7981744517fe3602c5fcafbb737c52b3c15a697c 100644
--- a/game/engine/ButtonList.lua
+++ b/game/engine/ButtonList.lua
@@ -106,7 +106,6 @@ function _M:select(i, offset)
 	end
 	if self.selected > #self.list then self.selected = 1 end
 	if self.selected < 1 then self.selected = #self.list end
-	print(self.list,self.selected)
 	if old ~= self.selected and self.list[self.selected].onSelect then self.list[self.selected].onSelect() end
 	self.changed = true
 end
diff --git a/game/engine/PlayerProfile.lua b/game/engine/PlayerProfile.lua
index c3a250425ae3eb8186224ae5c8075941ae0bde8f..fb52e694e2dec0793f031777d3641874c8c3c462 100644
--- a/game/engine/PlayerProfile.lua
+++ b/game/engine/PlayerProfile.lua
@@ -217,6 +217,14 @@ function _M:rpc(data)
 	end
 end
 
+function _M:getNews()
+	print("[ONLINE PROFILE] get news")
+	local data = self:rpc{action="GetNews"}
+	if not data then print("[ONLINE PROFILE] no news") return end
+	print("[ONLINE PROFILE] news ", data[1] and data[1].title)
+	return data
+end
+
 function _M:tryAuth()
 	print("[ONLINE PROFILE] auth")
 	local data = self:rpc{action="TryAuth", login=self.login, pass=self.pass}
@@ -250,6 +258,7 @@ end
 
 function _M:setConfigs(module, name, val)
 	if not self.auth then return end
+	if name == "online" then return end
 
 	if type(val) ~= "string" then val = serialize(val) end
 
diff --git a/game/engine/TextBox.lua b/game/engine/TextBox.lua
index a4551e8bdcc741848a73e01a66ba948074468b0e..2ac1ea114147d8e82c5ffbecad127a18ec795986 100644
--- a/game/engine/TextBox.lua
+++ b/game/engine/TextBox.lua
@@ -28,8 +28,8 @@ module(..., package.seeall, class.inherit(
 
 tiles = engine.Tiles.new(16, 16)
 
-function _M:init(dialogdef, owner, font, mask, fct)	        
-	--name, title, min, max, x, y, w, height	
+function _M:init(dialogdef, owner, font, mask, fct)
+	--name, title, min, max, x, y, w, height
 	self.type = "TextBox"
 	self.name = dialogdef.name
 	self.title = dialogdef.title
@@ -37,23 +37,24 @@ function _M:init(dialogdef, owner, font, mask, fct)
 	self.max = dialogdef.max or 25
 	self.h = dialogdef.h or 30
 	self.font = font
-	self.w = dialogdef.w or 200	
+	self.w = dialogdef.w or 200
 	self.x = dialogdef.x
 	self.y = dialogdef.y
+	self.private = dialogdef.private
 	self.text = ""
-	self.owner = owner	
-	self.btn = 	{ 		
+	self.owner = owner
+	self.btn = 	{
 		h = dialogdef.h,
-		mouse_over= function(button)							
-						if self.owner.state ~= self.name then self.focused=true self.owner:focusControl(self.name) end						
+		mouse_over= function(button)
+						if self.owner.state ~= self.name then self.focused=true self.owner:focusControl(self.name) end
 						if button == "right" then
-							self.text=""							
+							self.text=""
 							self.ownwer.changed=true
 						end
 					end
 				}
-	self.owner.mouse:registerZone(self.owner.display_x + self.x, self.owner.display_y + self.y + self.h, self.w, self.h, self.btn.mouse_over)		
-	self:startCursor()	
+	self.owner.mouse:registerZone(self.owner.display_x + self.x, self.owner.display_y + self.y + self.h, self.w, self.h, self.btn.mouse_over)
+	self:startCursor()
 end
 
 function _M:delete()
@@ -62,11 +63,11 @@ function _M:delete()
 	if self.cursorPosition < self.maximumCurosrPosition - 1 then temptext = temptext..self.text:sub(self.cursorPosition + 2, self.text:len()) end
 	self.text =  temptext
 	self.maximumCurosrPosition = self.maximumCurosrPosition - 1
-end	
+end
 
 function _M:backSpace()
 	if (self.cursorPosition==0) then return end
-	local temptext = self.text:sub(1, self.cursorPosition - 1)	
+	local temptext = self.text:sub(1, self.cursorPosition - 1)
 	if self.cursorPosition < self.maximumCurosrPosition then temptext = temptext..self.text:sub(self.cursorPosition + 1, self.text:len()) end
 	self.text =  temptext
 	self.maximumCurosrPosition = self.maximumCurosrPosition - 1
@@ -80,9 +81,7 @@ function _M:textInput(c)
 		self.text = self.text:sub(1,self.cursorPosition) .. c
 		if temp then self.text=self.text..temp end
 		self.owner.changed = true
-		print("[Cursor] before ", c, self.cursorPosition, self.maximumCurosrPosition)
-		self:moveRight(1, true)		
-		print("[Cursor] after ", c, self.cursorPosition, self.maximumCurosrPosition)
+		self:moveRight(1, true)
 	end
 end
 
@@ -91,8 +90,8 @@ function _M:unFocus()
 end
 
 
-function _M:drawControl(s)    
-	
+function _M:drawControl(s)
+
 	local r, g, b
 	local w = self.w
 	local h = self.h
@@ -102,8 +101,8 @@ function _M:drawControl(s)
 	if self.owner.state==self.name then
 		title = title.."*"
 	end
-	r, g, b = s:drawColorStringBlended(self.font, title, self.x, self.y + ((h - th) / 2), r, g, b)	
-		
+	r, g, b = s:drawColorStringBlended(self.font, title, self.x, self.y + ((h - th) / 2), r, g, b)
+
 	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_7"..(sel and "_sel" or "")..".png"), self.x + tw, self.y)
 	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_9"..(sel and "_sel" or "")..".png"), w + self.x - 8, self.y)
 	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_1"..(sel and "_sel" or "")..".png"), self.x + tw, self.y + h - 8)
@@ -119,10 +118,11 @@ function _M:drawControl(s)
 
 	local text = self.text
 	if text=="" then text=self.mask or "" end
+	if self.private then text = text:gsub('.', '*') end
 	local sw, sh = self.font:size(text)
-	
+
 	local baseX = self.x + tw + 10
-	
+
 	s:drawColorStringBlended(self.font, text, baseX, self.y + h - sh - 8)
 	self:drawCursor(s, baseX, text)
 end
diff --git a/game/engine/Tooltip.lua b/game/engine/Tooltip.lua
index d93c43d3abee55c93d2fe176e10196825ddb2be1..cf562ad293e2039284f637df8dcbdceef7933441 100644
--- a/game/engine/Tooltip.lua
+++ b/game/engine/Tooltip.lua
@@ -25,12 +25,12 @@ module(..., package.seeall, class.make)
 
 tiles = engine.Tiles.new(16, 16)
 
-function _M:init(fontname, fontsize, color, bgcolor)
+function _M:init(fontname, fontsize, color, bgcolor, max)
 	self.color = color or {255,255,255}
 	self.bgcolor = bgcolor or {0,0,0}
 	self.font = core.display.newFont(fontname or "/data/font/Vera.ttf", fontsize or 12)
 	self.font_h = self.font:lineSkip()
-	self.max = max or 400
+	self.max = max or 300
 	self.changed = true
 	self.old_tmx, self.old_tmy = -1,-1
 	self.old_turn = -1
@@ -38,7 +38,7 @@ end
 
 --- Set the tooltip text
 function _M:set(str, ...)
-	self.text = str:format(...):splitLines(300, self.font)
+	self.text = str:format(...):splitLines(self.max, self.font)
 	self.w, self.h = 0, 0
 	for i, l in ipairs(self.text) do
 		local w, h = self.font:size(l)
@@ -100,6 +100,12 @@ function _M:display()
 	self.texture = self.surface:glTexture()
 end
 
+function _M:toScreen(x, y)
+	if self.surface then
+		self.surface:toScreenWithTexture(self.texture, x, y)
+	end
+end
+
 --- Displays the tooltip at the given map coordinates
 -- @param tmx the map coordinate to get tooltip from
 -- @param tmy the map coordinate to get tooltip from
diff --git a/game/special/mainmenu/class/Game.lua b/game/special/mainmenu/class/Game.lua
index e2e2967c291b49ae9483f1ab91b31c6ace90234d..ee3b7a6ae0b4df9b7af781afa3d6d3eaa883e6eb 100644
--- a/game/special/mainmenu/class/Game.lua
+++ b/game/special/mainmenu/class/Game.lua
@@ -24,6 +24,7 @@ require "engine.interface.GameMusic"
 local Module = require "engine.Module"
 local Savefile = require "engine.Savefile"
 local Dialog = require "engine.Dialog"
+local Tooltip = require "engine.Tooltip"
 local ButtonList = require "engine.ButtonList"
 local DownloadDialog = require "engine.dialogs.DownloadDialog"
 
@@ -34,6 +35,8 @@ function _M:init()
 	self.profile_font = core.display.newFont("/data/font/VeraIt.ttf", 14)
 	engine.Game.init(self, engine.KeyBind.new())
 
+	self.tooltip = Tooltip.new(nil, 14, nil, colors.DARK_GREY, 400)
+
 	self.background = core.display.loadImage("/data/gfx/mainmenu/background.png")
 	self.refuse_threads = true
 end
@@ -80,6 +83,11 @@ function _M:display()
 		self.s_log:toScreen(self.w - w, self.h - h)
 	end
 
+	if self.step.do_tooltip then
+		self.tooltip:display()
+		self.tooltip:toScreen(5, 5)
+	end
+
 	engine.Game.display(self)
 end
 
@@ -209,7 +217,21 @@ function _M:selectStepMain()
 				core.game.exit_engine()
 			end,
 		},
-	}, self.w * 0.3, self.h * 0.2, self.w * 0.4, self.h * 0.3)
+	}, 400, self.h * 0.2, self.w * 0.4, self.h * 0.3)
+
+	if not self.news then
+		self.news = profile:getNews()
+		if not self.news or not self.news[1] then
+			self.nesw = {
+				title = 'Welcome to T-Engine and the Tales of Middle-earth',
+				text = [[From this interface you can create new characters for the game modules you want to play.
+T-Engine comes by default with the "Tales of Middle-earth" module, you can also install more by selecting "Install a game module" or by going to http://te4.org/
+]]
+			}
+		end
+		self.tooltip:set("%s\n---\n%s", self.news[1].title, self.news[1].text)
+	end
+	self.step.do_tooltip = true
 
 	if not self.firstrunchecked then
 		-- Check first time run for online profile
diff --git a/game/special/mainmenu/dialogs/ProfileLogin.lua b/game/special/mainmenu/dialogs/ProfileLogin.lua
index 72eb16e8c9794f54682d415ba32e23e0f5c4e76b..2deb0c06418cff671bdf13025b83d294fd79f1ad 100644
--- a/game/special/mainmenu/dialogs/ProfileLogin.lua
+++ b/game/special/mainmenu/dialogs/ProfileLogin.lua
@@ -89,7 +89,7 @@ function _M:init(dialogdef, profile_help_text)
 	local basey = #self.lines * self.font:lineSkip() + 25
 
 	self:addControl(TextBox.new({name="login",title="Login:",min=2, max=25, x=30, y=basey + 5, w=350, h=30}, self, self.font, "login name"))
-	self:addControl(TextBox.new({name="pass",title ="Password:",min=2, max=25, x=30, y=basey + 45, w=350, h=30}, self, self.font, "password"))
+	self:addControl(TextBox.new({name="pass",title ="Password:",min=2, max=25, x=30, y=basey + 45, w=350, h=30, private=true}, self, self.font, "password"))
 	if not self.justlogin then
 		self:addControl(TextBox.new({name="email",title="Email Address:",min=2, max=25, x=30, y=basey + 85, w=350, h=30}, self, self.font, "email address"))
 		self:addControl(TextBox.new({name="name",title="Name:",min=2, max=25, x=30, y=basey + 125, w=350, h=30}, self, self.font, "name"))