diff --git a/src/common/gajim.py b/src/common/gajim.py
index 3eac8449517a4d494ccf5d19ffc8fcc648b2a8f8..25798761b4d217a39473b5d1e7155b5aded12a16 100644
--- a/src/common/gajim.py
+++ b/src/common/gajim.py
@@ -67,16 +67,9 @@ thread_interface = None # Interface to run a thread and then a callback
 config = config.Config()
 version = config.get('version')
 connections = {} # 'account name': 'account (connection.Connection) instance'
-verbose = False
 ipython_window = None
 
-h = logging.StreamHandler()
-f = logging.Formatter('%(asctime)s %(name)s: %(message)s', '%d %b %Y %H:%M:%S')
-h.setFormatter(f)
-log = logging.getLogger('Gajim')
-log.addHandler(h)
-del h
-del f
+log = logging.getLogger('gajim')
 
 import logger
 logger = logger.Logger() # init the logger
diff --git a/src/gajim.py b/src/gajim.py
index dda9c25a5aa967dbff79e4ce757cc584e3a9e514..41f9e10578a421c86715c8ff03c7ccbed7975f68 100644
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -65,56 +65,18 @@ if os.name == 'nt':
 	# needed for docutils
 	sys.path.append('.')
 
+from common import logging_helpers
+logging_helpers.init('TERM' in os.environ)
+
 import logging
-consoleloghandler = logging.StreamHandler()
-consoleloghandler.setLevel(1)
-consoleloghandler.setFormatter(
-	logging.Formatter('%(asctime)s %(name)s: %(levelname)s: %(message)s')
-	)
-log = logging.getLogger('gajim')
-log.setLevel(logging.WARNING)
-log.addHandler(consoleloghandler)
-log.propagate = False
+# gajim.gui or gajim.gtk more appropriate ?
 log = logging.getLogger('gajim.gajim')
 
-# create intermediate loggers
-logging.getLogger('gajim.c')
-logging.getLogger('gajim.c.x')
-
 import getopt
 from common import i18n
 
-def parseLogLevel(arg):
-	if arg.isdigit():
-		return int(arg)
-	if arg.isupper():
-		return getattr(logging, arg)
-	raise ValueError(_('%s is not a valid loglevel'), repr(arg))
-
-def parseLogTarget(arg):
-	arg = arg.lower()
-	if arg.startswith('.'): return arg[1:]
-	if arg.startswith('gajim'): return arg
-	return 'gajim.' + arg
-
-def parseAndSetLogLevels(arg):
-	for directive in arg.split(','):
-		directive = directive.strip()
-		targets, level = directive.rsplit('=', 1)
-		level = parseLogLevel(level.strip())
-		for target in targets.split('='):
-			target = parseLogTarget(target.strip())
-			if target == '':
-				consoleloghandler.setLevel(level)
-				print "consoleloghandler level set to %s" % level
-			else:
-				logger = logging.getLogger(target)
-				logger.setLevel(level)
-				print "Logger %s level set to %d" % (target, level)
-
 def parseOpts():
 	profile = ''
-	verbose = False
 	config_path = None
 
 	try:
@@ -130,21 +92,19 @@ def parseOpts():
 			print 'gajim [--help] [--quiet] [--verbose] [--loglevel subsystem=level[,subsystem=level[...]]] [--profile name] [--config-path]'
 			sys.exit()
 		elif o in ('-q', '--quiet'):
-			consoleloghandler.setLevel(logging.CRITICAL)
-			verbose = False
+			logging_helpers.set_quiet()
 		elif o in ('-v', '--verbose'):
-			consoleloghandler.setLevel(logging.INFO)
-			verbose = True
+			logging_helpers.set_verbose()
 		elif o in ('-p', '--profile'): # gajim --profile name
 			profile = a
 		elif o in ('-l', '--loglevel'):
-			parseAndSetLogLevels(a)
+			logging_helpers.set_loglevels(a)
 		elif o in ('-c', '--config-path'):
 			config_path = a
-	return profile, verbose, config_path
+	return profile, config_path
 
-profile, verbose, config_path = parseOpts()
-del parseOpts, parseAndSetLogLevels, parseLogTarget, parseLogLevel
+profile, config_path = parseOpts()
+del parseOpts
 
 import locale
 profile = unicode(profile, locale.getpreferredencoding())
@@ -288,9 +248,6 @@ from common import optparser
 from common import dataforms
 from common import passwords
 
-if verbose: gajim.verbose = True
-del verbose
-
 gajimpaths = common.configpaths.gajimpaths
 
 pid_filename = gajimpaths['PID_FILE']
@@ -3250,9 +3207,9 @@ class Interface:
 		}
 
 		cfg_was_read = parser.read()
-		# Do not set gajim.verbose to False if -v option was given
+		# override logging settings from config (don't take care of '-q' option)
 		if gajim.config.get('verbose'):
-			gajim.verbose = True
+			logging_helpers.set_verbose()
 
 		# Is Gajim default app?
 		if os.name != 'nt' and gajim.config.get('check_if_gajim_is_default'):
@@ -3300,11 +3257,6 @@ class Interface:
 		if gajim.config.get('autodetect_browser_mailer') or not cfg_was_read:
 			gtkgui_helpers.autodetect_browser_mailer()
 
-		if gajim.verbose:
-			gajim.log.setLevel(gajim.logging.DEBUG)
-		else:
-			gajim.log.setLevel(None)
-
 		gajim.idlequeue = idlequeue.get_idlequeue()
 		# resolve and keep current record of resolved hosts
 		gajim.resolver = resolver.get_resolver(gajim.idlequeue)
@@ -3500,9 +3452,8 @@ if __name__ == '__main__':
 	# ^C exits the application normally to delete pid file
 	signal.signal(signal.SIGINT, sigint_cb)
 
-	if gajim.verbose:
-		print >> sys.stderr, "Encodings: d:%s, fs:%s, p:%s" % \
-		(sys.getdefaultencoding(), sys.getfilesystemencoding(), locale.getpreferredencoding())
+	log.info("Encodings: d:%s, fs:%s, p:%s", sys.getdefaultencoding(), \
+		sys.getfilesystemencoding(), locale.getpreferredencoding())
 
 	if ((os.name != 'nt') and (sys.platform != 'darwin')):
 		# Session Management support