[X2Go-Commits] [pyhoca-gui] 02/09: run 2to3 on this project

git-admin at x2go.org git-admin at x2go.org
Mon Dec 2 17:16:16 CET 2019


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository pyhoca-gui.

commit 69ea6d8e1d7eafed9a763a9d83d3616ea0b91b5f
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Mon Dec 2 08:37:44 2019 +0100

    run 2to3 on this project
---
 icon2exe.py                    |  36 ++--
 nsis_template.py               |   2 +-
 pyhoca-gui                     |   2 +-
 pyhoca/wxgui/about.py          |   6 +-
 pyhoca/wxgui/basepath.py       |   2 +-
 pyhoca/wxgui/brokerlogon.py    |  24 +--
 pyhoca/wxgui/frontend.py       | 252 ++++++++++++++--------------
 pyhoca/wxgui/launcher.py       |  36 ++--
 pyhoca/wxgui/listdesktops.py   |  16 +-
 pyhoca/wxgui/logon.py          |  88 +++++-----
 pyhoca/wxgui/menus_taskbar.py  | 204 +++++++++++------------
 pyhoca/wxgui/messages.py       |  16 +-
 pyhoca/wxgui/notify.py         |  11 +-
 pyhoca/wxgui/passphrase.py     |  72 ++++----
 pyhoca/wxgui/printingprefs.py  |  60 +++----
 pyhoca/wxgui/profilemanager.py | 362 ++++++++++++++++++++---------------------
 pyhoca/wxgui/serverinfo.py     |  26 +--
 pyhoca/wxgui/sessiontitle.py   |  10 +-
 pyhoca/wxgui/splash.py         |   2 +-
 pyhoca/wxgui/taskbar.py        |  12 +-
 setup.py                       |  12 +-
 21 files changed, 625 insertions(+), 626 deletions(-)

diff --git a/icon2exe.py b/icon2exe.py
index d0fdf9b..2c3c75a 100644
--- a/icon2exe.py
+++ b/icon2exe.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python2
+#! /usr/bin/env python3
 # Copyright (C) 2005, Giovanni Bajo
 # Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
 #
@@ -26,7 +26,7 @@ LOAD_LIBRARY_AS_DATAFILE = 2
 import struct
 import types
 try:
-    StringTypes = types.StringTypes
+    StringTypes = (str,)
 except AttributeError:
     StringTypes = [ type("") ]
 
@@ -38,11 +38,11 @@ class Structure:
         for i in range (len (self._names_)):
             indexes[self._names_[i]] = i
     def dump (self):
-        print "I: DUMP of", self
+        print(("I: DUMP of", self))
         for name in self._names_:
             if name[0] != '_':
-                print "I: %20s = %s" % (name, getattr (self, name))
-        print
+                print(("I: %20s = %s" % (name, getattr (self, name))))
+        print()
     def __getattr__ (self, name):
         if name in self._names_:
             index = self._indexes_[name]
@@ -50,7 +50,7 @@ class Structure:
         try:
             return self.__dict__[name]
         except KeyError:
-            raise AttributeError, name
+            raise AttributeError(name)
     def __setattr__ (self, name, value):
         if name in self._names_:
             index = self._indexes_[name]
@@ -58,7 +58,7 @@ class Structure:
         else:
             self.__dict__[name] = value
     def tostring (self):
-        return apply (struct.pack, [self._format_,] + self._fields_)
+        return struct.pack(*[self._format_,] + self._fields_)
     def fromfile (self, file):
         data = file.read (self._sizeInBytes)
         self._fields_ = list (struct.unpack (self._format_, data))
@@ -112,8 +112,8 @@ class IconFile:
 
 def CopyIcons_FromIco (dstpath, srcpath, id=1):
     import win32api #, win32con
-    icons = map(IconFile, srcpath)
-    print "I: Updating icons from", srcpath, "to", dstpath
+    icons = list(map(IconFile, srcpath))
+    print(("I: Updating icons from", srcpath, "to", dstpath))
 
     hdst = win32api.BeginUpdateResource (dstpath, 0)
 
@@ -123,10 +123,10 @@ def CopyIcons_FromIco (dstpath, srcpath, id=1):
         data = f.grp_icon_dir()
         data = data + f.grp_icondir_entries(iconid)
         win32api.UpdateResource (hdst, RT_GROUP_ICON, i, data)
-        print "I: Writing RT_GROUP_ICON %d resource with %d bytes" % (i, len(data))
+        print(("I: Writing RT_GROUP_ICON %d resource with %d bytes" % (i, len(data))))
         for data in f.images:
             win32api.UpdateResource (hdst, RT_ICON, iconid, data)
-            print "I: Writing RT_ICON %d resource with %d bytes" % (iconid, len (data))
+            print(("I: Writing RT_ICON %d resource with %d bytes" % (iconid, len (data))))
             iconid = iconid + 1
 
     win32api.EndUpdateResource (hdst, 0)
@@ -139,13 +139,13 @@ def CopyIcons (dstpath, srcpath):
 
     def splitter(s):
         try:
-            srcpath, index = map(string.strip, string.split(s, ','))
+            srcpath, index = list(map(string.strip, string.split(s, ',')))
             return srcpath, int(index)
         except ValueError:
             return s, None
 
-    srcpath = map(splitter, srcpath)
-    print "I: SRCPATH", srcpath
+    srcpath = list(map(splitter, srcpath))
+    print(("I: SRCPATH", srcpath))
 
     if len(srcpath) > 1:
         # At the moment, we support multiple icons only from .ico files
@@ -153,9 +153,9 @@ def CopyIcons (dstpath, srcpath):
         for s in srcpath:
             e = os.path.splitext(s[0])[1]
             if string.lower(e) != '.ico':
-                raise ValueError, "multiple icons supported only from .ico files"
+                raise ValueError("multiple icons supported only from .ico files")
             if s[1] is not None:
-                raise ValueError, "index not allowed for .ico files"
+                raise ValueError("index not allowed for .ico files")
             srcs.append(s[0])
         return CopyIcons_FromIco(dstpath, srcs)
 
@@ -164,9 +164,9 @@ def CopyIcons (dstpath, srcpath):
     if string.lower (srcext) == '.ico':
         return CopyIcons_FromIco (dstpath, [srcpath])
     if index is not None:
-        print "I: Updating icons from", srcpath, ", %d to" % index, dstpath
+        print(("I: Updating icons from", srcpath, ", %d to" % index, dstpath))
     else:
-        print "I: Updating icons from", srcpath, "to", dstpath
+        print(("I: Updating icons from", srcpath, "to", dstpath))
     import win32api #, win32con
     hdst = win32api.BeginUpdateResource (dstpath, 0)
     hsrc = win32api.LoadLibraryEx (srcpath, 0, LOAD_LIBRARY_AS_DATAFILE)
diff --git a/nsis_template.py b/nsis_template.py
index 83d792c..216afb4 100644
--- a/nsis_template.py
+++ b/nsis_template.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # vim:fenc=utf-8
 
diff --git a/pyhoca-gui b/pyhoca-gui
index 879376d..50cfd9f 100755
--- a/pyhoca-gui
+++ b/pyhoca-gui
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # vim:fenc=utf-8
 
diff --git a/pyhoca/wxgui/about.py b/pyhoca/wxgui/about.py
index 87071e0..ceadb65 100644
--- a/pyhoca/wxgui/about.py
+++ b/pyhoca/wxgui/about.py
@@ -30,7 +30,7 @@ import x2go
 import wx
 
 # PyHoca-GUI modules
-import basepath
+from . import basepath
 
 class PyHocaGUI_AboutFrame(wx.Frame):
     """\
@@ -76,9 +76,9 @@ class PyHocaGUI_AboutFrame(wx.Frame):
             about_what = self._PyHocaGUI.appname
 
         if x2go.X2GOCLIENT_OS == 'Windows':
-            wx.Frame.__init__(self, None, -1, _(u'About %s ...') % about_what, size=(403,340))
+            wx.Frame.__init__(self, None, -1, _('About %s ...') % about_what, size=(403,340))
         else:
-            wx.Frame.__init__(self, None, -1, _(u'About %s ...') % about_what, size=(400,298))
+            wx.Frame.__init__(self, None, -1, _('About %s ...') % about_what, size=(400,298))
         self.Bind(wx.EVT_CLOSE, self.OnHide)
 
         panel = wx.Panel(self, -1, pos=(0,0), size=(0,0), )
diff --git a/pyhoca/wxgui/basepath.py b/pyhoca/wxgui/basepath.py
index 73a8149..85ffc0f 100644
--- a/pyhoca/wxgui/basepath.py
+++ b/pyhoca/wxgui/basepath.py
@@ -23,7 +23,7 @@ import os
 from x2go import X2GOCLIENT_OS as _X2GOCLIENT_OS
 
 def reload_base_paths():
-    if os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1':
+    if 'PYHOCAGUI_DEVELOPMENT' in os.environ and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1':
         _base_location = os.path.abspath(os.path.curdir)
         _icons_location = os.path.join(_base_location, 'icons')
         _images_location = os.path.join(_base_location, 'img')
diff --git a/pyhoca/wxgui/brokerlogon.py b/pyhoca/wxgui/brokerlogon.py
index 64c045a..2ff8906 100644
--- a/pyhoca/wxgui/brokerlogon.py
+++ b/pyhoca/wxgui/brokerlogon.py
@@ -27,9 +27,9 @@ import x2go
 import wx
 import os
 
-import messages
+from . import messages
 
-if os.environ.has_key('DESKTOP_SESSION'):
+if 'DESKTOP_SESSION' in os.environ:
     WINDOW_MANAGER = os.environ['DESKTOP_SESSION']
 else:
     WINDOW_MANAGER = 'generic'
@@ -52,16 +52,16 @@ class PyHocaGUI_BrokerDialogBoxPassword(wx.Dialog):
         self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
         self._pyhoca_logger('password dialog box started', loglevel=x2go.loglevel_INFO, )
 
-        wx.Dialog.__init__(self, None, id=-1, title=self._PyHocaGUI.broker_name + ' ' + _(u'Logon'), style=wx.DEFAULT_FRAME_STYLE, )
+        wx.Dialog.__init__(self, None, id=-1, title=self._PyHocaGUI.broker_name + ' ' + _('Logon'), style=wx.DEFAULT_FRAME_STYLE, )
         self._PyHocaGUI._sub_windows.append(self)
 
-        self.brokerLbl = wx.StaticText(self, wx.ID_ANY, _(u'Broker URL')+':', size=(-1, -1))
+        self.brokerLbl = wx.StaticText(self, wx.ID_ANY, _('Broker URL')+':', size=(-1, -1))
         self.brokerTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER, size=(240, -1))
 
-        self.userLbl = wx.StaticText(self, wx.ID_ANY, _(u'Username')+':', size=(-1, -1))
+        self.userLbl = wx.StaticText(self, wx.ID_ANY, _('Username')+':', size=(-1, -1))
         self.userTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER, size=(240, -1))
 
-        self.passwordLbl = wx.StaticText(self, wx.ID_ANY, _(u'Password')+':', size=(-1, -1))
+        self.passwordLbl = wx.StaticText(self, wx.ID_ANY, _('Password')+':', size=(-1, -1))
         self.passwordTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER|wx.TE_PASSWORD, size=(240, -1))
         self.passwordTxt.SetFocus()
 
@@ -82,9 +82,9 @@ class PyHocaGUI_BrokerDialogBoxPassword(wx.Dialog):
             else:
                 self.brokerTxt.SetValue(self._PyHocaGUI.session_profiles.get_broker_url())
 
-        self.loginBtn = wx.Button(self, wx.ID_OK, _(u'Authenticate'), )
+        self.loginBtn = wx.Button(self, wx.ID_OK, _('Authenticate'), )
         self.loginBtn.SetDefault()
-        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _(u'Cancel'), )
+        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _('Cancel'), )
         _tab_order = [self.userTxt, self.passwordTxt, self.loginBtn, self.cancelBtn, ]
 
         self.Bind(wx.EVT_BUTTON, self.OnLogin, self.loginBtn)
@@ -116,7 +116,7 @@ class PyHocaGUI_BrokerDialogBoxPassword(wx.Dialog):
         self.SetSizerAndFit(mainSizer)
         self.Layout()
 
-        for i in xrange(len(_tab_order) - 1):
+        for i in range(len(_tab_order) - 1):
             _tab_order[i+1].MoveAfterInTabOrder(_tab_order[i])
 
         maxX, maxY = wx.GetDisplaySize()
@@ -163,13 +163,13 @@ class PyHocaGUI_BrokerDialogBoxPassword(wx.Dialog):
         self._PyHocaGUI.session_profiles.set_broker_url(broker_url)
         try:
             if self._PyHocaGUI.session_profiles.broker_simpleauth(username, password):
-                self._PyHocaGUI.notifier.send(_(u"%s - success") % self._PyHocaGUI.broker_name, _(u"Authentication to session broker has been\nsuccessful."), icon='auth_success', timeout=10000)
+                self._PyHocaGUI.notifier.send(_("%s - success") % self._PyHocaGUI.broker_name, _("Authentication to session broker has been\nsuccessful."), icon='auth_success', timeout=10000)
             else:
-                self._PyHocaGUI.notifier.send(_(u"%s - failure") % self._PyHocaGUI.broker_name, _(u"Authentication to session broker failed."), icon='auth_failed', timeout=10000)
+                self._PyHocaGUI.notifier.send(_("%s - failure") % self._PyHocaGUI.broker_name, _("Authentication to session broker failed."), icon='auth_failed', timeout=10000)
             self.Close()
             self.Destroy()
         except x2go.x2go_exceptions.X2GoBrokerConnectionException:
-            m = messages.PyHoca_MessageWindow_YesNo(self._PyHocaGUI, title=_(u'%s: Connection refused error') % self._PyHocaGUI.appname, msg=_(u'Connection to %s failed. Retry?') % self._PyHocaGUI.broker_name, icon='connect_error')
+            m = messages.PyHoca_MessageWindow_YesNo(self._PyHocaGUI, title=_('%s: Connection refused error') % self._PyHocaGUI.appname, msg=_('Connection to %s failed. Retry?') % self._PyHocaGUI.broker_name, icon='connect_error')
             m.ShowModal()
             if m.No():
                 self.Close()
diff --git a/pyhoca/wxgui/frontend.py b/pyhoca/wxgui/frontend.py
index 05eea1c..e65b227 100644
--- a/pyhoca/wxgui/frontend.py
+++ b/pyhoca/wxgui/frontend.py
@@ -36,20 +36,20 @@ import threading
 import locale
 
 # PyHoca-GUI modules
-import about
-import logon
-import brokerlogon
-import passphrase
-import taskbar
-import profilemanager
-import printingprefs
-import notify
-import basepath
-import messages
-import splash
-import sessiontitle
-import listdesktops
-import serverinfo
+from . import about
+from . import logon
+from . import brokerlogon
+from . import passphrase
+from . import taskbar
+from . import profilemanager
+from . import printingprefs
+from . import notify
+from . import basepath
+from . import messages
+from . import splash
+from . import sessiontitle
+from . import listdesktops
+from . import serverinfo
 
 wx.SetDefaultPyEncoding("utf-8")
 
@@ -198,7 +198,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             _x2goclient_kwargs['start_xserver'] = self.args.start_xserver
             _x2goclient_kwargs['start_pulseaudio'] = self.args.start_pulseaudio
 
-        if x2go.X2GOCLIENT_OS == 'Windows' and self.args.start_pulseaudio and os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1':
+        if x2go.X2GOCLIENT_OS == 'Windows' and self.args.start_pulseaudio and 'PYHOCAGUI_DEVELOPMENT' in os.environ and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1':
             _x2goclient_kwargs['pulseaudio_installdir'] = os.path.dirname(basepath.pulseaudio_binary)
 
         self.broker_autoconnect = self.args.broker_autoconnect
@@ -353,7 +353,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         ###
         ### disable functionality for release versions
         ###
-        if os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1':
+        if 'PYHOCAGUI_DEVELOPMENT' in os.environ and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1':
             self.options_disabled = self.args.disable_options
         else:
             self._pyhoca_logger('the current release of %s does not support client configuration' % self.appname, loglevel=x2go.log.loglevel_WARN)
@@ -469,7 +469,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             _win.Close()
         for session_obj in [ _s for _s in self._X2GoClient__client_running_sessions(return_objects=True) if _s.is_associated() ]:
             profile_name = session_obj.get_profile_name()
-            if not self._hide_notifications_map.has_key(profile_name):
+            if profile_name not in self._hide_notifications_map:
                 self._hide_notifications_map[profile_name] = []
             self._hide_notifications_map[profile_name].append(session_obj.get_session_name())
             try: session_obj.suspend()
@@ -492,12 +492,12 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         if self.args.single_session_profile:
             if not x2go.defaults.X2GOCLIENT_OS == 'Windows':
                 if self.client_running_sessions_of_profile_name(self.args.session_profile):
-                    self.notifier.send(self.appname, _(u'Suspending sessions and exiting application...'), icon='application-exit', timeout=10000)
+                    self.notifier.send(self.appname, _('Suspending sessions and exiting application...'), icon='application-exit', timeout=10000)
                 else:
                     if self.is_profile_connected(profile_name=self.args.session_profile):
-                        self.notifier.send(self.appname, _(u'Disconnecting %s and exiting application...') % str(self.args.session_profile), icon='application-exit', timeout=10000)
+                        self.notifier.send(self.appname, _('Disconnecting %s and exiting application...') % str(self.args.session_profile), icon='application-exit', timeout=10000)
                     else:
-                        self.notifier.send(self.appname, _(u'Exiting application...'), icon='application-exit', timeout=10000)
+                        self.notifier.send(self.appname, _('Exiting application...'), icon='application-exit', timeout=10000)
             self._eventid_profilenames_map[evt.GetId()] = self.args.session_profile
         self.WakeUpIdle()
         self.ExitMainLoop()
@@ -517,7 +517,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         if profile_name is None and session_uuid:
             profile_name = self._X2GoClient__get_session_profile_name(session_uuid)
 
-        if not self._temp_launching_pubapp_locks.has_key(profile_name):
+        if profile_name not in self._temp_launching_pubapp_locks:
             self._temp_launching_pubapp_locks[profile_name] = threading.Lock()
 
         if not self._X2GoClient__client_connected_sessions_of_profile_name(profile_name):
@@ -544,7 +544,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             # suspend any running session that is in published applications mode (unless we are already associated with it)
             session_list = self._X2GoClient__list_sessions(session_uuid=session_uuid, profile_name=profile_name)
             if session_list:
-                pubapp_sessions_running = [ _sn for _sn in session_list.keys() if session_list[_sn].is_running() and session_list[_sn].is_published_applications_provider() ]
+                pubapp_sessions_running = [ _sn for _sn in list(session_list.keys()) if session_list[_sn].is_running() and session_list[_sn].is_published_applications_provider() ]
                 for session_name in pubapp_sessions_running:
 
                     self.suspend_session(session_uuid=connected_session(), session_name=session_name)
@@ -556,7 +556,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                     session_list = self._X2GoClient__list_sessions(session_uuid=session_uuid, profile_name=profile_name, refresh_cache=True)
 
             if session_list:
-                pubapp_sessions_suspended = [ _sn for _sn in session_list.keys() if session_list[_sn].is_suspended() and session_list[_sn].is_published_applications_provider() ]
+                pubapp_sessions_suspended = [ _sn for _sn in list(session_list.keys()) if session_list[_sn].is_suspended() and session_list[_sn].is_published_applications_provider() ]
 
                 for session_name in pubapp_sessions_suspended:
 
@@ -597,7 +597,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             return pubapp_session_started | pubapp_session_resumed
 
         elif not connected_session.has_server_feature('X2GO_PUBLISHED_APPLICATIONS') and self.get_profile_config(profile_name)['published']:
-            self.notifier.send(_(u'%s - server warning') % profile_name, _(u'The X2Go Server does not publish an application menu.'), icon='session_warning', timeout=10000)
+            self.notifier.send(_('%s - server warning') % profile_name, _('The X2Go Server does not publish an application menu.'), icon='session_warning', timeout=10000)
 
         return None
 
@@ -641,14 +641,14 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             if _can_session_auto_connect or _can_sshproxy_auto_connect:
                 self._X2GoClient__connect_session(session_uuid, add_to_known_hosts=self.add_to_known_hosts)
                 if not self._X2GoClient__server_valid_x2gouser(session_uuid):
-                    self.notifier.send(_(u'%s - connect failure') % profile_name, _(u'User is not allowed to start X2Go sessions!'), icon='session_warning', timeout=10000)
+                    self.notifier.send(_('%s - connect failure') % profile_name, _('User is not allowed to start X2Go sessions!'), icon='session_warning', timeout=10000)
                     self.OnServerDisconnect(evt)
                     try:
                         self._temp_disabled_profile_names.remove(profile_name)
                     except ValueError:
                         pass
                 else:
-                    self.notifier.send(_(u'%s - connect') % profile_name, _(u'SSH key authentication has been successful.'), icon='auth_success', timeout=4000)
+                    self.notifier.send(_('%s - connect') % profile_name, _('SSH key authentication has been successful.'), icon='auth_success', timeout=4000)
                     self._X2GoClient__list_sessions(session_uuid, refresh_cache=True, update_sessionregistry=True)
                     self._post_authenticate(evt, session_uuid)
                     try:
@@ -690,7 +690,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             else:
                 _logon_window = logon.PyHocaGUI_DialogBoxPassword(self, profile_name, caller=self, sshproxy_auth=True, )
             self._logon_windows[profile_name] = _logon_window
-        except x2go.SSHException, e:
+        except x2go.SSHException as e:
             if str(e).startswith('Two-factor authentication requires a password'):
                 self._pyhoca_logger('X2Go Server requests two-factor authentication', loglevel=x2go.loglevel_NOTICE)
 
@@ -710,8 +710,8 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                 except ValueError:
                     pass
                 connect_failed = True
-                self.notifier.send(_(u'%s - SSH error') % profile_name, u'%s!' % errmsg, icon='auth_error', timeout=10000)
-        except x2go.X2GoSSHProxyException, e:
+                self.notifier.send(_('%s - SSH error') % profile_name, '%s!' % errmsg, icon='auth_error', timeout=10000)
+        except x2go.X2GoSSHProxyException as e:
             if str(e).startswith('Two-factor authentication requires a password'):
                 self._pyhoca_logger('SSH proxy host requests two-factor authentication', loglevel=x2go.loglevel_NOTICE)
                 _logon_window = logon.PyHocaGUI_DialogBoxPassword(self, profile_name,
@@ -730,16 +730,16 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                 except ValueError:
                     pass
                 connect_failed = True
-                self.notifier.send(_(u'%s - SSH error') % profile_name, u'%s!' % errmsg, icon='auth_error', timeout=10000)
-        except x2go.X2GoHostKeyException, e:
-            self.notifier.send(_(u'%s - host key error') % profile_name, _(u'The remote server\'s host key is invalid or has not been accepted by the user') + '!', icon='auth_error', timeout=4000)
+                self.notifier.send(_('%s - SSH error') % profile_name, '%s!' % errmsg, icon='auth_error', timeout=10000)
+        except x2go.X2GoHostKeyException as e:
+            self.notifier.send(_('%s - host key error') % profile_name, _('The remote server\'s host key is invalid or has not been accepted by the user') + '!', icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
                 pass
             connect_failed = True
-        except x2go.X2GoSSHProxyHostKeyException, e:
-            self.notifier.send(_(u'%s - host key error') % profile_name, _(u'The SSH proxy\'s host key is invalid or has not been accepted by the user') + '!', icon='auth_error', timeout=4000)
+        except x2go.X2GoSSHProxyHostKeyException as e:
+            self.notifier.send(_('%s - host key error') % profile_name, _('The SSH proxy\'s host key is invalid or has not been accepted by the user') + '!', icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
@@ -752,42 +752,42 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         #    except ValueError:
         #        pass
         #    connect_failed = True
-        except gevent.socket.error, e:
-            self.notifier.send(_(u'%s - socket error') % profile_name, e.strerror, icon='auth_error', timeout=4000)
+        except gevent.socket.error as e:
+            self.notifier.send(_('%s - socket error') % profile_name, e.strerror, icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
                 pass
             connect_failed = True
-        except EOFError, e:
-            self.notifier.send(_(u'%s - EOF error') % profile_name, _(u'Authentication protocol communication incomplete! Try again...'), icon='auth_error', timeout=4000)
+        except EOFError as e:
+            self.notifier.send(_('%s - EOF error') % profile_name, _('Authentication protocol communication incomplete! Try again...'), icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
                 pass
             connect_failed = True
-        except x2go.X2GoRemoteHomeException, e:
-            self.notifier.send(_(u'%s - missing home directory') % profile_name, _(u"The remote user's home directory does not exist."), icon='auth_error', timeout=4000)
+        except x2go.X2GoRemoteHomeException as e:
+            self.notifier.send(_('%s - missing home directory') % profile_name, _("The remote user's home directory does not exist."), icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
                 pass
             connect_failed = True
-        except x2go.X2GoSessionException, e:
-            self.notifier.send(_(u'%s - auth error') % profile_name, u'%s' % str(e), icon='auth_error', timeout=4000)
+        except x2go.X2GoSessionException as e:
+            self.notifier.send(_('%s - auth error') % profile_name, '%s' % str(e), icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
                 pass
             connect_failed = True
         except:
-            self.notifier.send('%s - unknown error' % profile_name, _(u'An unknown error occurred during authentication!'), icon='auth_error', timeout=4000)
+            self.notifier.send('%s - unknown error' % profile_name, _('An unknown error occurred during authentication!'), icon='auth_error', timeout=4000)
             try:
                 self._temp_disabled_profile_names.remove(profile_name)
             except ValueError:
                 pass
             connect_failed = True
-            if self.args.debug or self.args.libdebug or (os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'):
+            if self.args.debug or self.args.libdebug or ('PYHOCAGUI_DEVELOPMENT' in os.environ and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'):
                 raise
 
         if connect_failed and self.exit_on_disconnect:
@@ -810,8 +810,8 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         profile_name = self._eventid_profilenames_map[evt.GetId()]
         if self.session_profiles.get_profile_config(profile_name)['directrdp']:
             m = messages.PyHoca_MessageWindow_Ok(self,
-                                                 title=_(u'%s: DirectRDP not supported yet') % self.appname,
-                                                 msg=_(u"We apologize for the inconvenience...\n\nSession profiles of type ,,DirectRDP'' are not\nsupported by %s (%s), yet!!\n\nDirectRDP support will be available in %s (>= 1.0.0.0).") % (self.appname, self.version, self.appname),
+                                                 title=_('%s: DirectRDP not supported yet') % self.appname,
+                                                 msg=_("We apologize for the inconvenience...\n\nSession profiles of type ,,DirectRDP'' are not\nsupported by %s (%s), yet!!\n\nDirectRDP support will be available in %s (>= 1.0.0.0).") % (self.appname, self.version, self.appname),
                                                  icon='warning',
                                                  profile_name=profile_name)
             m.ShowModal()
@@ -826,7 +826,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             self._temp_disabled_profile_names.append(profile_name)
             gevent.spawn(self._do_authenticate, evt, session_uuid)
         elif self.args.session_profile:
-            self.notifier.send(profile_name, _(u'Unknown session profile, configure before using it...'), icon='profile_warning', timeout=10000)
+            self.notifier.send(profile_name, _('Unknown session profile, configure before using it...'), icon='profile_warning', timeout=10000)
             if not self.is_session_profile(profile_name):
                 profilemanager.PyHocaGUI_ProfileManager(self, 'ADD_EXPLICITLY', profile_name=profile_name)
 
@@ -887,8 +887,8 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         server_version = self.get_server_versions(profile_name, 'x2goserver')
         if not self.has_server_feature(profile_name, 'X2GO_LIST_SHADOWSESSIONS'):
             m = messages.PyHoca_MessageWindow_Ok(self,
-                                                 title=_(u'Desktop Sharing with %s not supported by server') % self.appname,
-                                                 msg=_(u"We apologize for the inconvenience...\n\nSession profiles of type ,,SHADOW'' are not\nsupported by X2Go Server (v%s)!!!\n\nDesktop Sharing with %s requires\nX2Go Server 4.0.1.21 and above.") % (server_version, self.appname),
+                                                 title=_('Desktop Sharing with %s not supported by server') % self.appname,
+                                                 msg=_("We apologize for the inconvenience...\n\nSession profiles of type ,,SHADOW'' are not\nsupported by X2Go Server (v%s)!!!\n\nDesktop Sharing with %s requires\nX2Go Server 4.0.1.21 and above.") % (server_version, self.appname),
                                                  icon='warning',
                                                  profile_name=profile_name)
             m.ShowModal()
@@ -946,7 +946,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                 try:
                     _s._X2GoSession__exec_published_application(exec_name=_exec, timeout=40)
                 except x2go.x2go_exceptions.X2GoControlSessionException:
-                    self.notifier.send(_(u'%s - session warning') % profile_name, _(u'Execution of command ,,%s\'\' failed.') % _exec, icon='session_warning', timeout=10000)
+                    self.notifier.send(_('%s - session warning') % profile_name, _('Execution of command ,,%s\'\' failed.') % _exec, icon='session_warning', timeout=10000)
         except KeyError:
             pass
 
@@ -976,7 +976,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type session_uuid: C{str}
 
         """
-        if profile_name not in self._temp_disabled_session_names.keys():
+        if profile_name not in list(self._temp_disabled_session_names.keys()):
             self._temp_disabled_session_names[profile_name] = []
         self._temp_disabled_session_names[profile_name].append(session_name)
 
@@ -1087,10 +1087,10 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         session_list = self._X2GoClient__list_sessions(session_uuid)
         if self._X2GoClient__server_is_alive(session_uuid):
             if session_list:
-                _notify_text = _(u'Cleaning X2Go sessions...')
-                if not self._hide_notifications_map.has_key(profile_name):
+                _notify_text = _('Cleaning X2Go sessions...')
+                if profile_name not in self._hide_notifications_map:
                     self._hide_notifications_map[profile_name] = []
-                session_names = session_list.keys()
+                session_names = list(session_list.keys())
                 session_names = [ _sn for _sn in session_names if not session_list[_sn].is_published_applications_provider() ]
                 for session_name in session_names:
                     _notify_text += '\n%s' % session_name
@@ -1135,7 +1135,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             self.WakeUpIdle()
             self.ExitMainLoop()
         else:
-            self.notifier.send(_(u'%s - disconnect') % profile_name, _(u'X2Go Profile is now disconnected.'), icon='auth_disconnect', timeout=4000)
+            self.notifier.send(_('%s - disconnect') % profile_name, _('X2Go Profile is now disconnected.'), icon='auth_disconnect', timeout=4000)
 
         try:
             del self._temp_disabled_session_names[profile_name]
@@ -1156,7 +1156,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._pyhoca_logger('adding new X2Go session profile', loglevel=x2go.log.loglevel_INFO, )
-        profilemanager.PyHocaGUI_ProfileManager(self, 'ADD', profile_name=_(u'New Session Profile'))
+        profilemanager.PyHocaGUI_ProfileManager(self, 'ADD', profile_name=_('New Session Profile'))
 
     def OnProfileEdit(self, evt):
         """\
@@ -1211,12 +1211,12 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         profile_name = self._eventid_profilenames_map[evt.GetId()]
         self._temp_disabled_profile_names.append(profile_name)
 
-        m = messages.PyHoca_MessageWindow_NoYes(self, shortmsg='REALLY_DELETE_PROFILE', title=_(u'Really Delete Session Profile ,,%s\'\'?') % profile_name, icon='question', profile_name=profile_name)
+        m = messages.PyHoca_MessageWindow_NoYes(self, shortmsg='REALLY_DELETE_PROFILE', title=_('Really Delete Session Profile ,,%s\'\'?') % profile_name, icon='question', profile_name=profile_name)
         m.ShowModal()
         if m.Yes():
             self._pyhoca_logger('deleting session profile %s' % profile_name, loglevel=x2go.log.loglevel_INFO, )
             self.session_profiles.delete_profile(profile_name)
-            self.notifier.send(title=_(u'%s - profile deleted') % profile_name, text=_(u'The session profile has been deleted.'), icon='profile_delete')
+            self.notifier.send(title=_('%s - profile deleted') % profile_name, text=_('The session profile has been deleted.'), icon='profile_delete')
         self._temp_disabled_profile_names.remove(profile_name)
 
     def OnProfileImport(self, evt):#
@@ -1228,7 +1228,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         dlg = wx.FileDialog(
-            self.about, message=_(u"import session profile(s)"), wildcard="*.x2go", style=wx.FD_OPEN)
+            self.about, message=_("import session profile(s)"), wildcard="*.x2go", style=wx.FD_OPEN)
 
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
@@ -1240,8 +1240,8 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                 imported_session_profiles = x2go.X2GoSessionProfiles(config_files=[_import_file])
             except:
                 m = messages.PyHoca_MessageWindow_Ok(self,
-                                                     title=_(u'%s: Import of session profile(s) failed') % self.appname,
-                                                     msg=_(u"The selected session profile(s) could not be imported from \nfile »%s«.\n\nAre you sure the session profiles file has the correct format?") % os.path.normpath(_import_file),
+                                                     title=_('%s: Import of session profile(s) failed') % self.appname,
+                                                     msg=_("The selected session profile(s) could not be imported from \nfile »%s«.\n\nAre you sure the session profiles file has the correct format?") % os.path.normpath(_import_file),
                                                      icon='error')
                 m.ShowModal()
                 return
@@ -1252,13 +1252,13 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                 this_profile = imported_session_profiles.get_profile_config(profile_name)
 
                 # clean up session profile options that are unknown to Python X2Go
-                for key in copy.deepcopy(this_profile).keys():
+                for key in list(copy.deepcopy(this_profile).keys()):
                     if key not in x2go.defaults.X2GO_SESSIONPROFILE_DEFAULTS:
                         del this_profile[key]
 
                 try:
                     self.session_profiles.add_profile(**this_profile)
-                except x2go.x2go_exceptions.X2GoProfileException, e:
+                except x2go.x2go_exceptions.X2GoProfileException as e:
                     self._pyhoca_logger('Importing session profile %s failed. Reason: %s' % (profile_name, str(e)), loglevel=x2go.loglevel_ERROR)
                     failed_profiles.append(profile_name)
 
@@ -1269,37 +1269,37 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             self.session_profiles.write_user_config = True
             if not self.session_profiles.write():
                 m = messages.PyHoca_MessageWindow_Ok(self,
-                                                     title=_(u'%s: Write failure after import') % self.appname,
-                                                     msg=_(u"The session profiles configuration could not be written to file after import\n\nCheck for common problems (disk full, insufficient access, etc.)."),
+                                                     title=_('%s: Write failure after import') % self.appname,
+                                                     msg=_("The session profiles configuration could not be written to file after import\n\nCheck for common problems (disk full, insufficient access, etc.)."),
                                                      icon='error',
                                                      profile_name=profile_name)
                 m.ShowModal()
             elif len(failed_profiles) == len(imported_profiles):
-                _notify_text = _(u'None of the session profiles could be imported...') + '\n'
+                _notify_text = _('None of the session profiles could be imported...') + '\n'
                 for failed_profile in failed_profiles:
                     _notify_text += '\n  %s' % failed_profile
-                _notify_text += '\n\n' + _(u'For details, start %s from the command line and retry the import.') % self.appname
-                self.notifier.send(u'Session Profile Import (Failure)', _notify_text, icon='profile_error', timeout=10000)
+                _notify_text += '\n\n' + _('For details, start %s from the command line and retry the import.') % self.appname
+                self.notifier.send('Session Profile Import (Failure)', _notify_text, icon='profile_error', timeout=10000)
 
             elif 0 < len(failed_profiles) < len(imported_profiles):
-                _notify_text = _(u'Only these session profiles could be imported...') + '\n'
+                _notify_text = _('Only these session profiles could be imported...') + '\n'
                 for profile_name in [ pn for pn in imported_profiles if pn not in failed_profiles ]:
                     _notify_text += '\n  %s' % profile_name
-                _notify_text += '\n\n' + _(u'Whereas these session profiles failed to import...') + '\n'
+                _notify_text += '\n\n' + _('Whereas these session profiles failed to import...') + '\n'
                 for failed_profile in failed_profiles:
                     _notify_text += '\n  %s' % failed_profile
-                _notify_text += '\n\n' + _(u'For details, start %s from the command line and retry the import.') % self.appname
-                self.notifier.send(u'Session Profile Import (Warning)', _notify_text, icon='profile_warning', timeout=10000)
+                _notify_text += '\n\n' + _('For details, start %s from the command line and retry the import.') % self.appname
+                self.notifier.send('Session Profile Import (Warning)', _notify_text, icon='profile_warning', timeout=10000)
             elif 1 < len(imported_profiles):
-                _notify_text = _(u'New session profiles have been imported...') + '\n'
+                _notify_text = _('New session profiles have been imported...') + '\n'
                 for profile_name in imported_profiles:
                     _notify_text += '\n  %s' % profile_name
-                self.notifier.send(u'Session Profile Import (Success)', _notify_text, icon='profile_add', timeout=10000)
+                self.notifier.send('Session Profile Import (Success)', _notify_text, icon='profile_add', timeout=10000)
             elif 1 == len(imported_profiles):
-                _notify_text = _(u'New session profile has been imported...') + '\n'
+                _notify_text = _('New session profile has been imported...') + '\n'
                 for profile_name in imported_profiles:
                     _notify_text += '\n  %s' % profile_name
-                self.notifier.send(u'Session Profile Import (Success)', _notify_text, icon='profile_add', timeout=10000)
+                self.notifier.send('Session Profile Import (Success)', _notify_text, icon='profile_add', timeout=10000)
 
     def OnProfileExport(self, evt):
         """\
@@ -1322,15 +1322,15 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         if profile_group:
 
             # This returns a Python list of files that were selected.
-            filtered_profile_names = [ pn for pn in self._X2GoClient__get_profiles().profile_names if pn.startswith(unicode(profile_group)) ]
+            filtered_profile_names = [ pn for pn in self._X2GoClient__get_profiles().profile_names if pn.startswith(str(profile_group)) ]
 
             dlg = wx.FileDialog(
-                self.about, message=_(u"%s - export session profiles") % profile_group, defaultFile="%s.x2go" % profile_group.replace("/", "::"), wildcard="*.x2go", style=wx.FD_SAVE)
+                self.about, message=_("%s - export session profiles") % profile_group, defaultFile="%s.x2go" % profile_group.replace("/", "::"), wildcard="*.x2go", style=wx.FD_SAVE)
 
         if profile_name:
 
             dlg = wx.FileDialog(
-                self.about, message=_(u"%s - export session profile") % profile_name, defaultFile="%s.x2go" % profile_name, wildcard="*.x2go", style=wx.FD_SAVE)
+                self.about, message=_("%s - export session profile") % profile_name, defaultFile="%s.x2go" % profile_name, wildcard="*.x2go", style=wx.FD_SAVE)
             filtered_profile_names = [profile_name]
 
         # Show the dialog and retrieve the user response. If it is the OK response,
@@ -1342,8 +1342,8 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
             if os.path.exists(_export_file):
                 m = messages.PyHoca_MessageWindow_NoYes(self,
-                                                        title=_(u'%s: Export file already exists') % self.appname,
-                                                        msg=_(u"The file »%s« already exists in this folder.\n\nDo you want to replace it?") % os.path.basename(_export_file),
+                                                        title=_('%s: Export file already exists') % self.appname,
+                                                        msg=_("The file »%s« already exists in this folder.\n\nDo you want to replace it?") % os.path.basename(_export_file),
                                                         icon='warning',
                                                         profile_name=profile_name)
                 m.ShowModal()
@@ -1355,7 +1355,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
                 this_profile = self._X2GoClient__get_profile_config(profile_name)
 
                 # clean up session profile options that are unknown to Python X2Go
-                for key in copy.deepcopy(this_profile).keys():
+                for key in list(copy.deepcopy(this_profile).keys()):
                     if key not in x2go.defaults.X2GO_SESSIONPROFILE_DEFAULTS:
                         del this_profile[key]
 
@@ -1364,14 +1364,14 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
             exported_session_profiles.write_user_config = True
             if exported_session_profiles.write():
                 if profile_group:
-                    self.notifier.send(_(u'%s - profiles exported') % profile_group, _(u'Successfully exported session profile group »%s« to file »%s«.') % (profile_group, os.path.basename(_export_file)), icon='success', timeout=10000)
+                    self.notifier.send(_('%s - profiles exported') % profile_group, _('Successfully exported session profile group »%s« to file »%s«.') % (profile_group, os.path.basename(_export_file)), icon='success', timeout=10000)
                 elif profile_name:
-                    self.notifier.send(_(u'%s - profile exported') % profile_name, _(u'Successfully exported single session profile »%s« to file »%s«.') % (profile_name, os.path.basename(_export_file)), icon='success', timeout=10000)
+                    self.notifier.send(_('%s - profile exported') % profile_name, _('Successfully exported single session profile »%s« to file »%s«.') % (profile_name, os.path.basename(_export_file)), icon='success', timeout=10000)
             else:
                 self._pyhoca_logger('Exporting session profile(s) to file %s failed.' % _export_file, loglevel=x2go.loglevel_ERROR)
                 m = messages.PyHoca_MessageWindow_Ok(self,
-                                                     title=_(u'%s: Exporting session profile(s) failed') % self.appname,
-                                                     msg=_(u"The selected session profile(s) could not be exported to the \nfile »%s«.\n\nCheck for common problems (disk full, insufficient access, etc.).") % os.path.normpath(_export_file),
+                                                     title=_('%s: Exporting session profile(s) failed') % self.appname,
+                                                     msg=_("The selected session profile(s) could not be exported to the \nfile »%s«.\n\nCheck for common problems (disk full, insufficient access, etc.).") % os.path.normpath(_export_file),
                                                      icon='error',
                                                      profile_name=profile_name)
                 m.ShowModal()
@@ -1390,7 +1390,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         if not os.path.exists(shared_folder):
             shared_folder = os.getcwd()
         dlg = wx.DirDialog(
-            self.about, message=_(u"%s - share local folder with sessions of this profile") % profile_name, style=1, defaultPath=shared_folder)
+            self.about, message=_("%s - share local folder with sessions of this profile") % profile_name, style=1, defaultPath=shared_folder)
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
         if dlg.ShowModal() == wx.ID_OK:
@@ -1556,15 +1556,15 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @rtype: C{bool}
 
         """
-        _message = _(u'The authenticity of host [%s]:%s can\'t be established.\n%s key fingerprint is ,,%s\'\'.\n\nAre you sure you want to continue connecting?') % (host, port, fingerprint_type, fingerprint)
+        _message = _('The authenticity of host [%s]:%s can\'t be established.\n%s key fingerprint is ,,%s\'\'.\n\nAre you sure you want to continue connecting?') % (host, port, fingerprint_type, fingerprint)
 
-        if self._logon_windows.has_key(profile_name):
+        if profile_name in self._logon_windows:
             _parent = self._logon_windows[profile_name]
         else:
             # use a dummy parent...
             _parent = None
 
-        m = messages.PyHoca_MessageWindow_NoYes(self, parent=_parent, msg=_message, title=_(u'%s: Confirm Host Authorization') % profile_name, icon='profile_warning')
+        m = messages.PyHoca_MessageWindow_NoYes(self, parent=_parent, msg=_message, title=_('%s: Confirm Host Authorization') % profile_name, icon='profile_warning')
 
         if _parent:
             m.ShowModal()
@@ -1610,7 +1610,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         if not self._exiting:
-            self.notifier.send(_(u'%s - channel error') % profile_name, _(u'Lost connection to server %s unexpectedly!\n\nTry to re-authenticate to the server...') % profile_name, icon='session_warning', timeout=10000)
+            self.notifier.send(_('%s - channel error') % profile_name, _('Lost connection to server %s unexpectedly!\n\nTry to re-authenticate to the server...') % profile_name, icon='session_warning', timeout=10000)
         try:
             del self._temp_disabled_session_names[profile_name]
         except KeyError:
@@ -1628,7 +1628,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         if not self._exiting:
-            self.notifier.send(_(u'%s - SFTP client error') % profile_name, _(u'New X2Go session will lack SFTP client support.\nCheck your server setup.\n\nAvoid echoing ~/.*shrc files on server!!!\n\nNot starting new session...'), icon='session_error', timeout=10000)
+            self.notifier.send(_('%s - SFTP client error') % profile_name, _('New X2Go session will lack SFTP client support.\nCheck your server setup.\n\nAvoid echoing ~/.*shrc files on server!!!\n\nNot starting new session...'), icon='session_error', timeout=10000)
         try:
             del self._temp_disabled_session_names[profile_name]
         except KeyError:
@@ -1645,7 +1645,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type profile_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - session failure') % profile_name, _(u'The session startup failed.'), icon='session_error', timeout=10000)
+        self.notifier.send(_('%s - session failure') % profile_name, _('The session startup failed.'), icon='session_error', timeout=10000)
         if self.exit_on_disconnect:
             self.WakeUpIdle()
             self.ExitMainLoop()
@@ -1658,7 +1658,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type profile_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - session failure') % profile_name, _(u'The session initialization failed.'), icon='session_error', timeout=10000)
+        self.notifier.send(_('%s - session failure') % profile_name, _('The session initialization failed.'), icon='session_error', timeout=10000)
         if self.exit_on_disconnect:
             self.WakeUpIdle()
             self.ExitMainLoop()
@@ -1671,7 +1671,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type profile_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - desktop sharing failure') % profile_name, _(u'Desktop sharing was denied by the other user or\nboth of you have insufficient privileges to share one another\'s desktop.'), icon='session_error', timeout=10000)
+        self.notifier.send(_('%s - desktop sharing failure') % profile_name, _('Desktop sharing was denied by the other user or\nboth of you have insufficient privileges to share one another\'s desktop.'), icon='session_error', timeout=10000)
         if self.exit_on_disconnect:
             self.WakeUpIdle()
             self.ExitMainLoop()
@@ -1684,7 +1684,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type profile_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - timeout') % profile_name, _(u'The server took long to provide a list of sharable desktops.\nThis can happen from time to time, please try again'), icon='session_warning', timeout=10000)
+        self.notifier.send(_('%s - timeout') % profile_name, _('The server took long to provide a list of sharable desktops.\nThis can happen from time to time, please try again'), icon='session_warning', timeout=10000)
 
     def HOOK_no_such_desktop(self, profile_name='UNKNOWN', desktop='UNKNOWN', **kwargs):
         """\
@@ -1696,7 +1696,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type desktop: C{str}
 
         """
-        self.notifier.send(_(u'%s - desktop sharing failed') % profile_name, _(u'The desktop %s is not available for sharing (anymore).') % desktop, icon='session_warning', timeout=10000)
+        self.notifier.send(_('%s - desktop sharing failed') % profile_name, _('The desktop %s is not available for sharing (anymore).') % desktop, icon='session_warning', timeout=10000)
         if self.exit_on_disconnect:
             self.WakeUpIdle()
             self.ExitMainLoop()
@@ -1714,9 +1714,9 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         if session_name == 'UNKNOWN':
-            self.notifier.send(_(u'%s - session failure') % profile_name, _(u'The command ,,%s\'\' is not available on X2Go server.') % cmd, icon='session_error', timeout=10000)
+            self.notifier.send(_('%s - session failure') % profile_name, _('The command ,,%s\'\' is not available on X2Go server.') % cmd, icon='session_error', timeout=10000)
         else:
-            self.notifier.send(_(u'%s - session failure') % profile_name, _(u'The command ,,%s\'\' is not available on X2Go server\n%s.') % (cmd, session_name), icon='session_error', timeout=10000)
+            self.notifier.send(_('%s - session failure') % profile_name, _('The command ,,%s\'\' is not available on X2Go server\n%s.') % (cmd, session_name), icon='session_error', timeout=10000)
         if self.exit_on_disconnect:
             self.WakeUpIdle()
             self.ExitMainLoop()
@@ -1733,7 +1733,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type server_port: C{str}
 
         """
-        self.notifier.send(_(u'%s - session warning') % profile_name, _(u'Reverse TCP port forwarding request for session %s to server port %s has been denied.') % (session_name, server_port), icon='session_warning', timeout=10000)
+        self.notifier.send(_('%s - session warning') % profile_name, _('Reverse TCP port forwarding request for session %s to server port %s has been denied.') % (session_name, server_port), icon='session_warning', timeout=10000)
         if self.exit_on_disconnect:
             self.WakeUpIdle()
             self.ExitMainLoop()
@@ -1754,13 +1754,13 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type subsystem: C{str}
 
         """
-        if type(subsystem) in (types.StringType, types.UnicodeType):
+        if type(subsystem) in (bytes, str):
             _subsystem = '(%s) ' % subsystem
         else:
             _subsystem = ''
 
-        self.notifier.send(_(u'%s - session failure') % profile_name, _(u'Forwarding tunnel request to [%s]:%s for session %s was denied by remote X2Go/SSH server. Subsystem %sstartup failed.') % (chain_host, chain_port, session_name, _subsystem), icon='session_error', timeout=10000)
-        if not self._hide_notifications_map.has_key(profile_name):
+        self.notifier.send(_('%s - session failure') % profile_name, _('Forwarding tunnel request to [%s]:%s for session %s was denied by remote X2Go/SSH server. Subsystem %sstartup failed.') % (chain_host, chain_port, session_name, _subsystem), icon='session_error', timeout=10000)
+        if profile_name not in self._hide_notifications_map:
             self._hide_notifications_map[profile_name] = []
         self._hide_notifications_map[profile_name].append(session_name)
         try:
@@ -1778,21 +1778,21 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         Notify that pulseaudio is not available in RDP sessions.
 
         """
-        self.notifier.send(_(u'%s - audio warning') % self.appname, _(u'The X2Go PulseAudio system is not available within Remote Desktop sessions.'), icon='audio_error', timeout=10000)
+        self.notifier.send(_('%s - audio warning') % self.appname, _('The X2Go PulseAudio system is not available within Remote Desktop sessions.'), icon='audio_error', timeout=10000)
 
     def HOOK_pulseaudio_server_startup_failed(self, **kwargs):
         """\
         Notify about pulseaudio daemon startup failures.
 
         """
-        self.notifier.send(_(u'%s - audio error') % self.appname, _(u'The X2Go PulseAudio system could not be started.'), icon='audio_error', timeout=10000)
+        self.notifier.send(_('%s - audio error') % self.appname, _('The X2Go PulseAudio system could not be started.'), icon='audio_error', timeout=10000)
 
     def HOOK_pulseaudio_server_died(self, **kwargs):
         """\
         Notify about sudden pulseaudio crashes.
 
         """
-        self.notifier.send(_(u'%s - audio error') % self.appname, _(u'The X2Go PulseAudio system has died unexpectedly.'), icon='audio_error', timeout=10000)
+        self.notifier.send(_('%s - audio error') % self.appname, _('The X2Go PulseAudio system has died unexpectedly.'), icon='audio_error', timeout=10000)
 
     def HOOK_on_sound_tunnel_failed(self, profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1804,7 +1804,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type session_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - audio problem') % profile_name, _(u'The audio connection could not be set up for this session.\n%s') % session_name, icon='session_warning', timeout=5000)
+        self.notifier.send(_('%s - audio problem') % profile_name, _('The audio connection could not be set up for this session.\n%s') % session_name, icon='session_warning', timeout=5000)
 
     def HOOK_printing_not_available(self, profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1816,7 +1816,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type session_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - client-side printing not available') % profile_name, _(u'The server denies client-side printing from within this session.\n%s') % session_name, icon='session_warning', timeout=5000)
+        self.notifier.send(_('%s - client-side printing not available') % profile_name, _('The server denies client-side printing from within this session.\n%s') % session_name, icon='session_warning', timeout=5000)
 
     def HOOK_mimebox_not_available(self, profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1828,7 +1828,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type session_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - MIME box not available') % profile_name, _(u'The server does not support the X2Go MIME box.\n%s') % session_name, icon='session_warning', timeout=5000)
+        self.notifier.send(_('%s - MIME box not available') % profile_name, _('The server does not support the X2Go MIME box.\n%s') % session_name, icon='session_warning', timeout=5000)
 
     def HOOK_foldersharing_not_available(self, profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1840,7 +1840,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type session_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - client-side folders not sharable') % profile_name, _(u'The server denies client-side folder sharing with this session.\n%s') % session_name, icon='session_warning', timeout=5000)
+        self.notifier.send(_('%s - client-side folders not sharable') % profile_name, _('The server denies client-side folder sharing with this session.\n%s') % session_name, icon='session_warning', timeout=5000)
 
     def HOOK_sshfs_not_available(self, profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1852,7 +1852,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         @type session_name: C{str}
 
         """
-        self.notifier.send(_(u'%s - client resources not sharable') % profile_name, _(u'Client-side folders and printers cannot be shared with this session.\n%s') % session_name, icon='session_warning', timeout=5000)
+        self.notifier.send(_('%s - client resources not sharable') % profile_name, _('Client-side folders and printers cannot be shared with this session.\n%s') % session_name, icon='session_warning', timeout=5000)
 
     def HOOK_printaction_error(self, filename, profile_name='UNKNOWN', session_name='UNKNOWN', err_msg='GENERIC_ERROR', printer=None, **kwargs):
         """\
@@ -1871,9 +1871,9 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         if printer:
-            self.notifier.send(_(u'%s - print error') % profile_name, _(u'%s\n...caused on printer %s by session\n%s')  % (err_msg, printer, session_name), icon='session_error', timeout=5000)
+            self.notifier.send(_('%s - print error') % profile_name, _('%s\n...caused on printer %s by session\n%s')  % (err_msg, printer, session_name), icon='session_error', timeout=5000)
         else:
-            self.notifier.send(_(u'%s - print error') % profile_name, _(u'%s\n...caused by session\n%s')  % (err_msg, session_name), icon='session_error', timeout=5000)
+            self.notifier.send(_('%s - print error') % profile_name, _('%s\n...caused by session\n%s')  % (err_msg, session_name), icon='session_error', timeout=5000)
 
     def HOOK_on_session_has_started_by_me(self, session_uuid='UNKNOWN', profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1888,7 +1888,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._enable_session_name(profile_name, session_name)
-        self.notifier.send(_(u'%s - start') % profile_name, _(u'New X2Go session starting up...\n%s') % session_name, icon='session_start', timeout=5000)
+        self.notifier.send(_('%s - start') % profile_name, _('New X2Go session starting up...\n%s') % session_name, icon='session_start', timeout=5000)
 
     def HOOK_on_session_has_started_by_other(self, session_uuid='UNKNOWN', profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1903,7 +1903,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._enable_session_name(profile_name, session_name)
-        self.notifier.send(_(u'%s - start') % profile_name, _(u'Another client started X2Go session\n%s') % session_name, icon='session_start', timeout=5000)
+        self.notifier.send(_('%s - start') % profile_name, _('Another client started X2Go session\n%s') % session_name, icon='session_start', timeout=5000)
 
     def HOOK_on_session_has_resumed_by_me(self, session_uuid='UNKNOWN', profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1918,7 +1918,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._enable_session_name(profile_name, session_name)
-        self.notifier.send(_(u'%s - resume') % profile_name, _(u'Resuming X2Go session...\n%s') % session_name, icon='session_resume', timeout=5000)
+        self.notifier.send(_('%s - resume') % profile_name, _('Resuming X2Go session...\n%s') % session_name, icon='session_resume', timeout=5000)
 
     def HOOK_on_session_has_resumed_by_other(self, session_uuid='UNKNOWN', profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1933,7 +1933,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._enable_session_name(profile_name, session_name)
-        self.notifier.send(_(u'%s - resume') % profile_name, _(u'Another client resumed X2Go session\n%s') % session_name, icon='session_resume', timeout=5000)
+        self.notifier.send(_('%s - resume') % profile_name, _('Another client resumed X2Go session\n%s') % session_name, icon='session_resume', timeout=5000)
 
     def HOOK_on_found_session_running_after_connect(self, session_uuid='UNKNOWN', profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1948,7 +1948,7 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._enable_session_name(profile_name, session_name)
-        gevent.spawn_later(5, self.notifier.send, _(u'%s - running') % profile_name, _(u'Found already running session\n%s') %  session_name, icon='session_resume', timeout=5000)
+        gevent.spawn_later(5, self.notifier.send, _('%s - running') % profile_name, _('Found already running session\n%s') %  session_name, icon='session_resume', timeout=5000)
 
     def HOOK_on_session_has_been_suspended(self, session_uuid='UNKNOWN', profile_name='UNKNOWN', session_name='UNKNOWN', **kwargs):
         """\
@@ -1963,12 +1963,12 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
 
         """
         self._enable_session_name(profile_name, session_name)
-        if self._hide_notifications_map.has_key(profile_name) and session_name in self._hide_notifications_map[profile_name]:
+        if profile_name in self._hide_notifications_map and session_name in self._hide_notifications_map[profile_name]:
             self._hide_notifications_map[profile_name].remove(session_name)
             if not self._hide_notifications_map[profile_name]:
                 del self._hide_notifications_map[profile_name]
         else:
-            self.notifier.send(_(u'%s - suspend') % profile_name, _(u'X2Go Session has been suspended\n%s') % session_name, icon='session_suspend', timeout=5000)
+            self.notifier.send(_('%s - suspend') % profile_name, _('X2Go Session has been suspended\n%s') % session_name, icon='session_suspend', timeout=5000)
         if self.disconnect_on_suspend and session_name in self.client_associated_sessions(return_session_names=True):
             _dummy_id = wx.NewId()
             self._eventid_profilenames_map[_dummy_id] = profile_name
@@ -1990,12 +1990,12 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         """
         self._enable_session_name(profile_name, session_name)
         # avoid notification if X2Go Client.clean_sessions has been used to terminate sessions
-        if self._hide_notifications_map.has_key(profile_name) and session_name in self._hide_notifications_map[profile_name]:
+        if profile_name in self._hide_notifications_map and session_name in self._hide_notifications_map[profile_name]:
             self._hide_notifications_map[profile_name].remove(session_name)
             if not self._hide_notifications_map[profile_name]:
                 del self._hide_notifications_map[profile_name]
         else:
-            self.notifier.send(_(u'%s - terminate') % profile_name, _(u'X2Go Session has terminated\n%s') % session_name, icon='session_terminate', timeout=5000)
+            self.notifier.send(_('%s - terminate') % profile_name, _('X2Go Session has terminated\n%s') % session_name, icon='session_terminate', timeout=5000)
         if self.disconnect_on_terminate and session_name in self.client_associated_sessions(return_session_names=True):
             _dummy_id = wx.NewId()
             self._eventid_profilenames_map[_dummy_id] = profile_name
@@ -2019,14 +2019,14 @@ class PyHocaGUI(wx.App, x2go.X2GoClient):
         """
         if is_profile_connected:
             m = messages.PyHoca_MessageWindow_OkCancel(self,
-                                                       title=_(u'%s: connection failure') % self.broker_name,
-                                                       msg=_(u"While initializing a session for profile '%s' the connection\nto %s has failed.\n\nIt is possible to attempt session initialization anyway. Do you\nwant to continue?") % (profile_name, self.broker_name),
+                                                       title=_('%s: connection failure') % self.broker_name,
+                                                       msg=_("While initializing a session for profile '%s' the connection\nto %s has failed.\n\nIt is possible to attempt session initialization anyway. Do you\nwant to continue?") % (profile_name, self.broker_name),
                                                        icon='warning',
                                                        profile_name=profile_name)
         else:
             m = messages.PyHoca_MessageWindow_OkCancel(self,
-                                                       title=_(u'%s: connection failure') % self.broker_name,
-                                                       msg=_(u"While connecting to profile '%s' the connection\nto %s has failed.\n\nIt is possible to attempt session initialization anyway. Do you\nwant to continue?") % (profile_name, self.broker_name),
+                                                       title=_('%s: connection failure') % self.broker_name,
+                                                       msg=_("While connecting to profile '%s' the connection\nto %s has failed.\n\nIt is possible to attempt session initialization anyway. Do you\nwant to continue?") % (profile_name, self.broker_name),
                                                        icon='warning',
                                                        profile_name=profile_name)
 
diff --git a/pyhoca/wxgui/launcher.py b/pyhoca/wxgui/launcher.py
index 06afd46..0c8e5d4 100644
--- a/pyhoca/wxgui/launcher.py
+++ b/pyhoca/wxgui/launcher.py
@@ -42,11 +42,11 @@ from x2go import BACKENDS
 from x2go import X2GoLogger
 
 from pyhoca.wxgui import __VERSION__
-from frontend import PyHocaGUI
-from messages import PyHoca_MessageWindow_Ok
+from .frontend import PyHocaGUI
+from .messages import PyHoca_MessageWindow_Ok
 
-import defaults
-import basepath
+from . import defaults
+from . import basepath
 
 
 class PyHocaGUI_Launcher(object):
@@ -94,7 +94,7 @@ VERSION: %s
             os.environ.update({'NXPROXY_BINARY': nxproxy_binary, })
 
     def modify_default_option(self, option, value):
-        if self.default_options.has_key(option):
+        if option in self.default_options:
             if type(self.default_options[option]) == type(value):
                 self.default_options[option] = value
 
@@ -102,7 +102,7 @@ VERSION: %s
         if sys.argv[0].startswith('./') or sys.argv[0].startswith('python'):
             sys.path.insert(0, os.getcwd())
             os.environ['PYHOCAGUI_DEVELOPMENT'] = '1'
-            print '### {progname} running in development mode ###'.format(progname=self.PROG_NAME)
+            print('### {progname} running in development mode ###'.format(progname=self.PROG_NAME))
             basepath.reload_base_paths()
 
     def check_running(self):
@@ -135,8 +135,8 @@ VERSION: %s
 
                 if display.split('.')[0] == my_display.split('.')[0]:
                     other_pid = pidfile.split('.')[1]
-                    print
-                    print('One instance of {progname} (PID: {other_pid}) is already running for this $DISPLAY {display}'.format(progname=_executable, other_pid=other_pid, display=my_display))
+                    print()
+                    print(('One instance of {progname} (PID: {other_pid}) is already running for this $DISPLAY {display}'.format(progname=_executable, other_pid=other_pid, display=my_display)))
 
                     return True
 
@@ -149,7 +149,7 @@ VERSION: %s
             for process in w.Win32_Process():
                 if process.Name == _executable:
                     _p[process.ProcessId] = process.SessionId
-            return len([ _p_id for _p_id in _p.keys() if _p[self.PROG_PID] ==  _p[_p_id] ]) > 1
+            return len([ _p_id for _p_id in list(_p.keys()) if _p[self.PROG_PID] ==  _p[_p_id] ]) > 1
 
 
     def version(self):
@@ -203,7 +203,7 @@ VERSION: %s
             _config_backends = ('FILE')
 
         _default_options = copy.deepcopy(self.default_options)
-        for key in _default_options.keys():
+        for key in list(_default_options.keys()):
             if not _default_options[key]:
                 _default_options[key] = None
 
@@ -259,11 +259,11 @@ VERSION: %s
             )
 
         backend_options = [
-            {'args':['--backend-controlsession'], 'default': _default_options['backend_controlsession'], 'metavar': '<CONTROLSESSION_BACKEND>', 'choices': BACKENDS['X2GoControlSession'].keys(), 'help': 'force usage of a certain CONTROLSESSION_BACKEND (do not use this unless you know exactly what you are doing)', },
-            {'args':['--backend-terminalsession'], 'default': _default_options['backend_terminalsession'], 'metavar': '<TERMINALSESSION_BACKEND>', 'choices': BACKENDS['X2GoTerminalSession'].keys(), 'help': 'force usage of a certain TERMINALSESSION_BACKEND (do not use this unless you know exactly what you are doing)', },
-            {'args':['--backend-serversessioninfo'], 'default': _default_options['backend_serversessioninfo'], 'metavar': '<SERVERSESSIONINFO_BACKEND>', 'choices': BACKENDS['X2GoServerSessionInfo'].keys(), 'help': 'force usage of a certain SERVERSESSIONINFO_BACKEND (do not use this unless you know exactly what you are doing)', },
-            {'args':['--backend-serversessionlist'], 'default': _default_options['backend_serversessionlist'], 'metavar': '<SERVERSESSIONLIST_BACKEND>', 'choices': BACKENDS['X2GoServerSessionList'].keys(), 'help': 'force usage of a certain SERVERSESSIONLIST_BACKEND (do not use this unless you know exactly what you are doing)', },
-            {'args':['--backend-proxy'], 'default': _default_options['backend_proxy'], 'metavar': '<PROXY_BACKEND>', 'choices': BACKENDS['X2GoProxy'].keys(), 'help': 'force usage of a certain PROXY_BACKEND (do not use this unless you know exactly what you are doing)', },
+            {'args':['--backend-controlsession'], 'default': _default_options['backend_controlsession'], 'metavar': '<CONTROLSESSION_BACKEND>', 'choices': list(BACKENDS['X2GoControlSession'].keys()), 'help': 'force usage of a certain CONTROLSESSION_BACKEND (do not use this unless you know exactly what you are doing)', },
+            {'args':['--backend-terminalsession'], 'default': _default_options['backend_terminalsession'], 'metavar': '<TERMINALSESSION_BACKEND>', 'choices': list(BACKENDS['X2GoTerminalSession'].keys()), 'help': 'force usage of a certain TERMINALSESSION_BACKEND (do not use this unless you know exactly what you are doing)', },
+            {'args':['--backend-serversessioninfo'], 'default': _default_options['backend_serversessioninfo'], 'metavar': '<SERVERSESSIONINFO_BACKEND>', 'choices': list(BACKENDS['X2GoServerSessionInfo'].keys()), 'help': 'force usage of a certain SERVERSESSIONINFO_BACKEND (do not use this unless you know exactly what you are doing)', },
+            {'args':['--backend-serversessionlist'], 'default': _default_options['backend_serversessionlist'], 'metavar': '<SERVERSESSIONLIST_BACKEND>', 'choices': list(BACKENDS['X2GoServerSessionList'].keys()), 'help': 'force usage of a certain SERVERSESSIONLIST_BACKEND (do not use this unless you know exactly what you are doing)', },
+            {'args':['--backend-proxy'], 'default': _default_options['backend_proxy'], 'metavar': '<PROXY_BACKEND>', 'choices': list(BACKENDS['X2GoProxy'].keys()), 'help': 'force usage of a certain PROXY_BACKEND (do not use this unless you know exactly what you are doing)', },
             {'args':['--backend-sessionprofiles'], 'default': _default_options['backend_sessionprofiles'], 'metavar': '<SESSIONPROFILES_BACKEND>', 'choices': _config_backends, 'help': 'use given backend for accessing session profiles, available backends on your system: %s (default: %s)' % (', '.join(_config_backends), _profiles_backend_default), },
             {'args':['--backend-clientsettings'], 'default': _default_options['backend_clientsettings'], 'metavar': '<CLIENTSETTINGS_BACKEND>', 'choices': _config_backends, 'help': 'use given backend for accessing the client settings configuration, available backends on your system: %s (default: %s)' % (', '.join(_config_backends), _settings_backend_default), },
             {'args':['--backend-clientprinting'], 'default': _default_options['backend_clientprinting'], 'metavar': '<CLIENTPRINTING_BACKEND>', 'choices': _config_backends, 'help': 'use given backend for accessing the client printing configuration, available backends on your system: %s (default: %s)' % (', '.join(_config_backends), _printing_backend_default), },
@@ -381,14 +381,14 @@ VERSION: %s
                 lang = gettext.translation('PyHoca-GUI', localedir=basepath.locale_basepath, languages=[args.lang], )
             else:
                 lang = gettext.translation('PyHoca-GUI', localedir=basepath.locale_basepath, languages=['en'], )
-            lang.install(unicode=True)
+            lang.install(str=True)
         else:
-            gettext.install('PyHoca-GUI', localedir=basepath.locale_basepath, unicode=True)
+            gettext.install('PyHoca-GUI', localedir=basepath.locale_basepath, str=True)
 
         if self.check_running():
             sys.stderr.write("\n###############################\n### %s: already running for user %s\n###############################\n" % (self.PROG_NAME, CURRENT_LOCAL_USER))
             _dummy_app.appname = self.PROG_NAME
-            m = PyHoca_MessageWindow_Ok(_dummy_app, shortmsg='ALREADY_RUNNING', title=u'%s (%s)...' % (self.PROG_NAME, self.VERSION), icon='{progname}_trayicon'.format(progname=self.PROG_NAME))
+            m = PyHoca_MessageWindow_Ok(_dummy_app, shortmsg='ALREADY_RUNNING', title='%s (%s)...' % (self.PROG_NAME, self.VERSION), icon='{progname}_trayicon'.format(progname=self.PROG_NAME))
             m.ShowModal()
             self.version()
 
diff --git a/pyhoca/wxgui/listdesktops.py b/pyhoca/wxgui/listdesktops.py
index 02f96f4..efc1869 100644
--- a/pyhoca/wxgui/listdesktops.py
+++ b/pyhoca/wxgui/listdesktops.py
@@ -30,7 +30,7 @@ import os
 # PyHoca-GUI modules
 # ... NONE ...
 
-if os.environ.has_key('DESKTOP_SESSION'):
+if 'DESKTOP_SESSION' in os.environ:
     WINDOW_MANAGER = os.environ['DESKTOP_SESSION']
 else:
     WINDOW_MANAGER = 'generic'
@@ -64,24 +64,24 @@ class PyHocaGUI_DialogBoxListDesktops(wx.Dialog):
         wx.Dialog.__init__(self, None, id=-1, title=profile_name, style=wx.DEFAULT_FRAME_STYLE, )
         self._PyHocaGUI._sub_windows.append(self)
 
-        self.SetTitle(_(u'Share Desktop Session - %s') % profile_name)
+        self.SetTitle(_('Share Desktop Session - %s') % profile_name)
 
-        self.titleLbl = wx.StaticText(self, wx.ID_ANY, _(u'Select one of the available desktop sessions on this server')+':', size=(-1, -1))
+        self.titleLbl = wx.StaticText(self, wx.ID_ANY, _('Select one of the available desktop sessions on this server')+':', size=(-1, -1))
         self.desktopList = wx.ListCtrl(self, size=(420,140),
                                        style=wx.LC_REPORT|wx.BORDER_SUNKEN|wx.LC_SINGLE_SEL)
         self.desktopList.InsertColumn(0, 'Display')
         self.desktopList.InsertColumn(1, 'User')
 
-        self.shareMode0 = wx.RadioButton(self, -1, _(u"View session only"), style=wx.RB_GROUP)
-        self.shareMode1 = wx.RadioButton(self, -1, _(u"Gain full access"))
+        self.shareMode0 = wx.RadioButton(self, -1, _("View session only"), style=wx.RB_GROUP)
+        self.shareMode1 = wx.RadioButton(self, -1, _("Gain full access"))
         self.share_mode = 0
 
         ID_REFRESH = wx.NewId()
-        self.okBtn = wx.Button(self, wx.ID_OK, _(u'Share Desktop'), )
+        self.okBtn = wx.Button(self, wx.ID_OK, _('Share Desktop'), )
         self.okBtn.SetDefault()
         self.okBtn.Enable(False)
-        self.refreshBtn = wx.Button(self, ID_REFRESH, _(u'Refresh list'), )
-        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _(u'Cancel'), )
+        self.refreshBtn = wx.Button(self, ID_REFRESH, _('Refresh list'), )
+        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _('Cancel'), )
 
         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnListClick, self.desktopList)
         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnListDoubleClick, self.desktopList)
diff --git a/pyhoca/wxgui/logon.py b/pyhoca/wxgui/logon.py
index 7cf71b1..f35d0ea 100644
--- a/pyhoca/wxgui/logon.py
+++ b/pyhoca/wxgui/logon.py
@@ -31,9 +31,9 @@ import wx
 import os
 
 # PyHoca-GUI modules
-import passphrase
+from . import passphrase
 
-if os.environ.has_key('DESKTOP_SESSION'):
+if 'DESKTOP_SESSION' in os.environ:
     WINDOW_MANAGER = os.environ['DESKTOP_SESSION']
 else:
     WINDOW_MANAGER = 'generic'
@@ -79,30 +79,30 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
         if self.sshproxy_auth:
             self.sshproxy_started = False
             self.sshproxy_password = None
-            self.SetTitle(_(u'%s (via %s)') % (profile_name, self.current_profile_config['sshproxyhost']))
+            self.SetTitle(_('%s (via %s)') % (profile_name, self.current_profile_config['sshproxyhost']))
 
         self.password = None
         self.passphrase = passphrase
         self.sshproxy_passphrase = sshproxy_passphrase
 
-        self.userLbl = wx.StaticText(self, wx.ID_ANY, _(u'Username')+':', size=(-1, -1))
+        self.userLbl = wx.StaticText(self, wx.ID_ANY, _('Username')+':', size=(-1, -1))
         self.userTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER, size=(120, -1))
-        self.passwordLbl = wx.StaticText(self, wx.ID_ANY, _(u'Password')+':', size=(-1, -1))
+        self.passwordLbl = wx.StaticText(self, wx.ID_ANY, _('Password')+':', size=(-1, -1))
         self.passwordTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER|wx.TE_PASSWORD, size=(120, -1))
         self.passwordTxt.SetFocus()
-        self.loginBtn = wx.Button(self, wx.ID_OK, _(u'Authenticate'), )
+        self.loginBtn = wx.Button(self, wx.ID_OK, _('Authenticate'), )
         self.loginBtn.SetDefault()
 
         _tab_order = []
 
         # widgets
         if self.sshproxy_auth:
-            self.sshProxyUserLbl = wx.StaticText(self, wx.ID_ANY, _(u'Username')+':', size=(-1, -1))
+            self.sshProxyUserLbl = wx.StaticText(self, wx.ID_ANY, _('Username')+':', size=(-1, -1))
             self.sshProxyUserTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER, size=(120, -1))
-            self.sshProxyPasswordLbl = wx.StaticText(self, wx.ID_ANY, _(u'Password')+':', size=(-1, -1))
+            self.sshProxyPasswordLbl = wx.StaticText(self, wx.ID_ANY, _('Password')+':', size=(-1, -1))
             self.sshProxyPasswordTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER|wx.TE_PASSWORD, size=(120, -1))
             self.sshProxyPasswordTxt.SetFocus()
-            self.sshProxyLoginBtn = wx.Button(self, wx.ID_OK, '  '+_(u'Start SSH tunnel')+'  ')
+            self.sshProxyLoginBtn = wx.Button(self, wx.ID_OK, '  '+_('Start SSH tunnel')+'  ')
             self.sshProxyLoginBtn.SetDefault()
 
             _tab_order.extend([self.sshProxyUserTxt, self.sshProxyPasswordTxt, self.sshProxyLoginBtn, ])
@@ -110,8 +110,8 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
             headerWidth = max(self.userLbl.GetSize().GetWidth(), self.passwordLbl.GetSize().GetWidth()) + 150
             sshProxyHeaderWidth = max(self.sshProxyUserLbl.GetSize().GetWidth(), self.sshProxyPasswordLbl.GetSize().GetWidth()) + 150
 
-            self.headerLbl = wx.StaticText(self, wx.ID_ANY, _(u'Session login')+':', size=(headerWidth, -1))
-            self.sshProxyHeaderLbl = wx.StaticText(self, wx.ID_ANY, _(u'SSH proxy server login')+':', size=(sshProxyHeaderWidth, -1))
+            self.headerLbl = wx.StaticText(self, wx.ID_ANY, _('Session login')+':', size=(headerWidth, -1))
+            self.sshProxyHeaderLbl = wx.StaticText(self, wx.ID_ANY, _('SSH proxy server login')+':', size=(sshProxyHeaderWidth, -1))
             self.headerLbl.SetFont(wx.Font(-1, wx.DEFAULT, wx.NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
             self.sshProxyHeaderLbl.SetFont(wx.Font(-1, wx.DEFAULT, wx.NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
 
@@ -122,7 +122,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
             self.passwordTxt.Enable(False)
             self.loginBtn.Enable(False)
 
-        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _(u'Cancel'), )
+        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _('Cancel'), )
 
         _tab_order.extend([self.userTxt, self.passwordTxt, self.loginBtn, self.cancelBtn, ])
 
@@ -179,18 +179,18 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
         mainSizer.Add(credSizer, 0, wx.ALL, 5)
         mainSizer.Add(btnSizer, 0, wx.ALL|wx.ALIGN_RIGHT, 5)
 
-        if self.current_profile_config.has_key('user'):
+        if 'user' in self.current_profile_config:
             self.userTxt.SetValue(self.current_profile_config['user'])
             if not self.current_profile_config['user'] and not self.sshproxy_auth:
                 self.userTxt.SetFocus()
 
         if self.sshproxy_auth:
 
-            if self.current_profile_config.has_key('sshproxyuser'):
-                if self.current_profile_config.has_key('sshproxysameuser') and not self.current_profile_config['sshproxysameuser']:
+            if 'sshproxyuser' in self.current_profile_config:
+                if 'sshproxysameuser' in self.current_profile_config and not self.current_profile_config['sshproxysameuser']:
                     self.sshProxyUserTxt.SetValue(self.current_profile_config['sshproxyuser'])
-            if self.current_profile_config.has_key('user'):
-                if self.current_profile_config.has_key('sshproxysameuser') and self.current_profile_config['sshproxysameuser']:
+            if 'user' in self.current_profile_config:
+                if 'sshproxysameuser' in self.current_profile_config and self.current_profile_config['sshproxysameuser']:
                     self.sshProxyUserTxt.SetValue(self.current_profile_config['user'])
 
         # Logged in variable
@@ -199,7 +199,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
         self.SetSizerAndFit(mainSizer)
         self.Layout()
 
-        for i in xrange(len(_tab_order) - 1):
+        for i in range(len(_tab_order) - 1):
             _tab_order[i+1].MoveAfterInTabOrder(_tab_order[i])
 
         maxX, maxY = wx.GetDisplaySize()
@@ -294,14 +294,14 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
                                                         )
             if not self._PyHocaGUI._X2GoClient__server_valid_x2gouser(session_uuid):
                 self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                                 title=_(u'%s - connect failure') % self.current_profile_name,
-                                                 text=_(u'User is not allowed to start X2Go sessions!'),
+                                                 title=_('%s - connect failure') % self.current_profile_name,
+                                                 text=_('User is not allowed to start X2Go sessions!'),
                                                  icon='auth_error')
                 self._PyHocaGUI.OnServerDisconnect(evt)
             else:
                 self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                                 title=_(u'%s - connect') % self.current_profile_name,
-                                                 text=_(u'Authentication has been successful.'),
+                                                 title=_('%s - connect') % self.current_profile_name,
+                                                 text=_('Authentication has been successful.'),
                                                  icon='auth_success')
                 if self._PyHocaGUI.remember_username:
                     _sp = self._PyHocaGUI.session_profiles
@@ -343,12 +343,12 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
                 self.sshProxyPasswordLbl.Enable(False)
                 self.sshProxyPasswordTxt.Enable(False)
                 self.sshProxyLoginBtn.Enable(False)
-                self.sshProxyLoginBtn.SetLabel(_(u'SSH tunnel started'))
+                self.sshProxyLoginBtn.SetLabel(_('SSH tunnel started'))
                 return
             else:
                 self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                                 title=_(u'%s - connect failure') % self.current_profile_name,
-                                                 text=_(u'Authentication failed!'),
+                                                 title=_('%s - connect failure') % self.current_profile_name,
+                                                 text=_('Authentication failed!'),
                                                  icon='auth_failed')
                 connect_failed = True
 
@@ -356,8 +356,8 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
             try: wx.EndBusyCursor()
             except: pass
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - SSH proxy') % self.current_profile_name,
-                                             text=_(u'Authentication to the SSH proxy server failed!'),
+                                             title=_('%s - SSH proxy') % self.current_profile_name,
+                                             text=_('Authentication to the SSH proxy server failed!'),
                                              icon='auth_failed')
 
             if not self.current_profile_config['sshproxysamepass']:
@@ -382,46 +382,46 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
         #                                     icon='auth_error')
         #    connect_failed = True
 
-        except gevent.socket.error, e:
+        except gevent.socket.error as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - socket error') % self.current_profile_name,
+                                             title=_('%s - socket error') % self.current_profile_name,
                                              text=e.strerror + '!',
                                              icon='auth_error')
             connect_failed = True
 
-        except x2go.X2GoHostKeyException, e:
+        except x2go.X2GoHostKeyException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - host key error') % self.current_profile_name,
-                                             text=_(u'The remote server\'s host key is invalid or has not been accepted by the user') + '!',
+                                             title=_('%s - host key error') % self.current_profile_name,
+                                             text=_('The remote server\'s host key is invalid or has not been accepted by the user') + '!',
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.X2GoRemoteHomeException, e:
+        except x2go.X2GoRemoteHomeException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - missing home directory') % self.current_profile_name,
+                                             title=_('%s - missing home directory') % self.current_profile_name,
                                              text=_("The remote user's home directory does not exist."),
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.X2GoSSHProxyException, e:
+        except x2go.X2GoSSHProxyException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - key error') % self.current_profile_name,
+                                             title=_('%s - key error') % self.current_profile_name,
                                              text='%s!' % str(e),
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.X2GoSessionException, e:
+        except x2go.X2GoSessionException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - auth error') % self.current_profile_name,
+                                             title=_('%s - auth error') % self.current_profile_name,
                                              text='%s!' % str(e),
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.SSHException, e:
+        except x2go.SSHException as e:
 
             if str(e).startswith('Two-factor authentication requires a password'):
                 if self.sshproxy_auth and (not self.sshproxy_started):
@@ -443,7 +443,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
                     self.sshProxyPasswordLbl.Enable(False)
                     self.sshProxyPasswordTxt.Enable(False)
                     self.sshProxyLoginBtn.Enable(False)
-                    self.sshProxyLoginBtn.SetLabel(_(u'SSH tunnel started'))
+                    self.sshProxyLoginBtn.SetLabel(_('SSH tunnel started'))
                     return
 
             if str(e).startswith('Host key for server ') and str(e).endswith(' does not match!'):
@@ -452,7 +452,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
                 errmsg = str(e)
 
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - SSH error') % self.current_profile_name,
+                                             title=_('%s - SSH error') % self.current_profile_name,
                                              text='%s' % errmsg,
                                              icon='auth_error',
                                              timeout=10000)
@@ -462,11 +462,11 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
 
         except:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - unknown error') % self.current_profile_name,
-                                             text=_(u'An unknown error occured during authentication!'),
+                                             title=_('%s - unknown error') % self.current_profile_name,
+                                             text=_('An unknown error occured during authentication!'),
                                              icon='auth_error')
             connect_failed = True
-            if self._PyHocaGUI.args.debug or self._PyHocaGUI.args.libdebug or (os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'):
+            if self._PyHocaGUI.args.debug or self._PyHocaGUI.args.libdebug or ('PYHOCAGUI_DEVELOPMENT' in os.environ and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'):
                 raise
 
         self._PyHocaGUI.notifier.send(self.current_profile_name, context='AUTH_%s' % self.current_profile_name, timeout=4000)
diff --git a/pyhoca/wxgui/menus_taskbar.py b/pyhoca/wxgui/menus_taskbar.py
index 0a63c4f..a5f20a4 100644
--- a/pyhoca/wxgui/menus_taskbar.py
+++ b/pyhoca/wxgui/menus_taskbar.py
@@ -21,13 +21,13 @@
 
 import os.path
 import wx
-import StringIO
+import io
 import base64
 
 import x2go.defaults
 import x2go.x2go_exceptions
 
-import basepath
+from . import basepath
 
 class PyHocaGUI_Menu_TaskbarManageProfile(wx.Menu):
     """\
@@ -63,9 +63,9 @@ class PyHocaGUI_Menu_TaskbarManageProfile(wx.Menu):
             self._PyHocaGUI._eventid_profilenames_map[ID_DELETEPROFILE] = profile_name
 
         if self._PyHocaGUI.session_profiles.is_mutable(profile_name):
-            self.Append(text=_(u"Edit Profile"), id=ID_EDITPROFILE)
+            self.Append(text=_("Edit Profile"), id=ID_EDITPROFILE)
         else:
-            self.Append(text=_(u"View Profile"), id=ID_EDITPROFILE)
+            self.Append(text=_("View Profile"), id=ID_EDITPROFILE)
         self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileEdit, id=ID_EDITPROFILE)
 
         if not self._PyHocaGUI.args.single_session_profile:
@@ -73,15 +73,15 @@ class PyHocaGUI_Menu_TaskbarManageProfile(wx.Menu):
             self.AppendSeparator()
 
             if self._PyHocaGUI.session_profiles.is_mutable(profile_name):
-                self.Append(text=_(u"Use as Template for New Profile"), id=ID_COPYPROFILE)
+                self.Append(text=_("Use as Template for New Profile"), id=ID_COPYPROFILE)
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileCopy, id=ID_COPYPROFILE)
                 self.AppendSeparator()
 
-            self.Append(text=_(u"Export Profile"), id=ID_EXPORTPROFILE)
+            self.Append(text=_("Export Profile"), id=ID_EXPORTPROFILE)
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileExport, id=ID_EXPORTPROFILE)
 
             if self._PyHocaGUI.session_profiles.is_mutable(profile_name):
-                self.Append(text=_(u"Delete Profile"), id=ID_DELETEPROFILE)
+                self.Append(text=_("Delete Profile"), id=ID_DELETEPROFILE)
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileDelete, id=ID_DELETEPROFILE)
 
 
@@ -107,8 +107,8 @@ class PyHocaGUI_Menu_TaskbarOptionsManager(wx.Menu):
 
         ID_ABOUT = wx.NewId()
         ID_ABOUT_PYTHONX2GO = wx.NewId()
-        self.Append(id=ID_ABOUT, text=_(u"About %s (%s)...") % (self._PyHocaGUI.appname, self._PyHocaGUI.version))
-        self.Append(id=ID_ABOUT_PYTHONX2GO, text=_(u"About %s (%s)...") % ("Python X2Go", x2go.__VERSION__))
+        self.Append(id=ID_ABOUT, text=_("About %s (%s)...") % (self._PyHocaGUI.appname, self._PyHocaGUI.version))
+        self.Append(id=ID_ABOUT_PYTHONX2GO, text=_("About %s (%s)...") % ("Python X2Go", x2go.__VERSION__))
         self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnAbout, id=ID_ABOUT)
         self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnAboutPythonX2Go, id=ID_ABOUT_PYTHONX2GO)
 
@@ -120,7 +120,7 @@ class PyHocaGUI_Menu_TaskbarOptionsManager(wx.Menu):
 
                 ID_PROFILEMANAGER = wx.NewId()
                 _maintain_profiles_item = self.AppendMenu(id=ID_PROFILEMANAGER,
-                                                          text=_(u"Profile Manager"),
+                                                          text=_("Profile Manager"),
                                                           submenu=PyHocaGUI_Menu_TaskbarProfileNames(self._PyHocaGUI,
                                                                                                      caller=self,
                                                                                                      filter_profiles=[],
@@ -137,7 +137,7 @@ class PyHocaGUI_Menu_TaskbarOptionsManager(wx.Menu):
             elif self._PyHocaGUI.session_profiles.has_profile_name(self._PyHocaGUI.args.session_profile):
                 ID_SINGLEPROFILEMANAGER = wx.NewId()
                 _maintain_profile_item = self.AppendMenu(id=ID_SINGLEPROFILEMANAGER,
-                                                         text=_(u'Manage Session Profile'),
+                                                         text=_('Manage Session Profile'),
                                                          submenu=PyHocaGUI_Menu_TaskbarManageProfile(self._PyHocaGUI, caller=self, profile_name=self._PyHocaGUI.args.session_profile),
                                                         )
                 if self._PyHocaGUI.args.session_profile in self._PyHocaGUI.client_connected_profiles(return_profile_names=True):
@@ -146,12 +146,12 @@ class PyHocaGUI_Menu_TaskbarOptionsManager(wx.Menu):
 
         if self._PyHocaGUI.with_brokerage and self._PyHocaGUI.session_profiles.is_broker_authenticated():
             ID_BROKER_DISCONNECT = wx.NewId()
-            self.Append(id=ID_BROKER_DISCONNECT, text=_(u"Disconnect from session broker"))
+            self.Append(id=ID_BROKER_DISCONNECT, text=_("Disconnect from session broker"))
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnBrokerDisconnect, id=ID_BROKER_DISCONNECT)
             self.AppendSeparator()
 
         ID_PRINTINGPREFS = wx.NewId()
-        _printingprefs_item = self.Append(id=ID_PRINTINGPREFS, text=_(u"Printing Preferences"))
+        _printingprefs_item = self.Append(id=ID_PRINTINGPREFS, text=_("Printing Preferences"))
         self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnPrintingPreferences, id=ID_PRINTINGPREFS)
         if self._PyHocaGUI.printingprefs_disabled:
             _printingprefs_item.Enable(False)
@@ -159,7 +159,7 @@ class PyHocaGUI_Menu_TaskbarOptionsManager(wx.Menu):
         if not self._PyHocaGUI.restricted_trayicon:
 
             ID_OPTIONS = wx.NewId()
-            _options_item = self.Append(id=ID_OPTIONS, text=_(u"Client Options"))
+            _options_item = self.Append(id=ID_OPTIONS, text=_("Client Options"))
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnOptions, id=ID_OPTIONS)
             if self._PyHocaGUI.options_disabled:
                 _options_item.Enable(False)
@@ -247,7 +247,7 @@ class PyHocaGUI_Menu_TaskbarSessionActions(wx.Menu):
             if _s is not None and _s.is_color_depth_ok():
                 _rs = self.Append(text=_("Resume Session"), id=ID_RESUMESESSION)
             else:
-                _rs = self.Append(text=_(u"Resume Session (not possible)"), id=ID_RESUMESESSION_DISABLED)
+                _rs = self.Append(text=_("Resume Session (not possible)"), id=ID_RESUMESESSION_DISABLED)
                 _rs.Enable(False)
 
             if session_info is not None and session_info.is_published_applications_provider() and not self._PyHocaGUI.get_profile_config(profile_name, 'published'):
@@ -258,39 +258,39 @@ class PyHocaGUI_Menu_TaskbarSessionActions(wx.Menu):
             if not session_name in self._PyHocaGUI.client_associated_sessions_of_profile_name(profile_name, return_session_names=True):
 
                 if _s is not None and _s.is_color_depth_ok():
-                    self.Append(text=_(u"Transfer Session"), id=ID_TRANSFERSESSION)
+                    self.Append(text=_("Transfer Session"), id=ID_TRANSFERSESSION)
                 else:
-                    _ts = self.Append(text=_(u"Transfer Session (not possible)"), id=ID_TRANSFERSESSION_DISABLED)
+                    _ts = self.Append(text=_("Transfer Session (not possible)"), id=ID_TRANSFERSESSION_DISABLED)
                     _ts.Enable(False)
 
             if not _s.is_shadow_session():
                 if self._PyHocaGUI.disconnect_on_suspend and self._PyHocaGUI.exit_on_disconnect and _s.has_terminal_session():
-                    _ss = self.Append(text=_(u"Suspend Session (and disconnect/exit)"), id=ID_SUSPENDSESSION)
+                    _ss = self.Append(text=_("Suspend Session (and disconnect/exit)"), id=ID_SUSPENDSESSION)
                 elif self._PyHocaGUI.disconnect_on_suspend and _s.has_terminal_session():
-                    _ss = self.Append(text=_(u"Suspend Session (and disconnect)"), id=ID_SUSPENDSESSION)
+                    _ss = self.Append(text=_("Suspend Session (and disconnect)"), id=ID_SUSPENDSESSION)
                 else:
-                    _ss = self.Append(text=_(u"Suspend Session"), id=ID_SUSPENDSESSION)
+                    _ss = self.Append(text=_("Suspend Session"), id=ID_SUSPENDSESSION)
 
                 if _s.is_published_applications_provider() and not self._PyHocaGUI.get_profile_config(profile_name, 'published'):
                     _ss.Enable(False)
         if not _s.is_shadow_session():
             if self._PyHocaGUI.disconnect_on_terminate and self._PyHocaGUI.exit_on_disconnect and _s.has_terminal_session():
-                self.Append(text=_(u"Terminate Session (and disconnect/exit)"), id=ID_SUSPENDSESSION)
+                self.Append(text=_("Terminate Session (and disconnect/exit)"), id=ID_SUSPENDSESSION)
             elif self._PyHocaGUI.disconnect_on_terminate and _s.has_terminal_session():
-                self.Append(text=_(u"Terminate Session (and disconnect)"), id=ID_TERMINATESESSION)
+                self.Append(text=_("Terminate Session (and disconnect)"), id=ID_TERMINATESESSION)
             else:
-                self.Append(text=_(u"Terminate Session"), id=ID_TERMINATESESSION)
+                self.Append(text=_("Terminate Session"), id=ID_TERMINATESESSION)
         else:
             if self._PyHocaGUI.disconnect_on_terminate and self._PyHocaGUI.exit_on_disconnect and _s.has_terminal_session():
-                self.Append(text=_(u"End Desktop Sharing (and disconnect/exit)"), id=ID_SUSPENDSESSION)
+                self.Append(text=_("End Desktop Sharing (and disconnect/exit)"), id=ID_SUSPENDSESSION)
             elif self._PyHocaGUI.disconnect_on_terminate and _s.has_terminal_session():
-                self.Append(text=_(u"End Desktop Sharing (and disconnect)"), id=ID_TERMINATESESSION)
+                self.Append(text=_("End Desktop Sharing (and disconnect)"), id=ID_TERMINATESESSION)
             else:
-                self.Append(text=_(u"End Desktop Sharing"), id=ID_TERMINATESESSION)
+                self.Append(text=_("End Desktop Sharing"), id=ID_TERMINATESESSION)
 
         if _s is not None and _s.is_published_applications_provider() and self._PyHocaGUI.get_profile_config(profile_name, 'published'):
             self.AppendSeparator()
-            self.Append(text=_(u"Refresh menu tree"), id=ID_REFRESHMENU)
+            self.Append(text=_("Refresh menu tree"), id=ID_REFRESHMENU)
 
         if _s is not None and \
            _s.get_session_type() in ('D', 'S') and \
@@ -342,19 +342,19 @@ class PyHocaGUI_Menu_TaskbarProfileSharedFolders(wx.Menu):
             self._PyHocaGUI._eventid_profilenames_map[ID_UNSHAREALLLOCALFOLDERS] = \
             self._PyHocaGUI._eventid_profilenames_map[ID_REMEMBERSHAREDFOLDERS] = profile_name
 
-        self.Append(id=ID_SHARECUSTOMLOCALFOLDER, text=_(u"&Share custom local folder"))
+        self.Append(id=ID_SHARECUSTOMLOCALFOLDER, text=_("&Share custom local folder"))
 
         self.AppendSeparator()
         self._PyHocaGUI._eventid_unshared_folders_map={}
 
         _exported_folders = self._PyHocaGUI.get_profile_config(profile_name, 'export')
         _shared_folders = self._PyHocaGUI._X2GoClient__profile_get_shared_folders(profile_name=profile_name, check_list_mounts=True) or []
-        _sharable_folders = _exported_folders.keys()
+        _sharable_folders = list(_exported_folders.keys())
         _unshared_folders = [ f for f in _sharable_folders if f and f not in _shared_folders ]
 
         self._PyHocaGUI._eventid_unshared_folders_map = {}
         if _unshared_folders:
-            self.Append(id=wx.NewId(), text=_(u'Share:'))
+            self.Append(id=wx.NewId(), text=_('Share:'))
             for _unshared_folder in _unshared_folders:
                 ID_THISFOLDER = wx.NewId()
                 self.Append(id=ID_THISFOLDER, text="      %s" % _unshared_folder)
@@ -364,7 +364,7 @@ class PyHocaGUI_Menu_TaskbarProfileSharedFolders(wx.Menu):
 
         self._PyHocaGUI._eventid_shared_folders_map = {}
         if _shared_folders:
-            self.Append(id=wx.NewId(), text=_(u'Unshare:'))
+            self.Append(id=wx.NewId(), text=_('Unshare:'))
             for _shared_folder in _shared_folders:
                 ID_THISFOLDER = wx.NewId()
                 self.Append(id=ID_THISFOLDER, text="      %s" % _shared_folder)
@@ -372,14 +372,14 @@ class PyHocaGUI_Menu_TaskbarProfileSharedFolders(wx.Menu):
                 self._PyHocaGUI._eventid_shared_folders_map[ID_THISFOLDER] = _shared_folder
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnUnshareLocalFolder, id=ID_THISFOLDER)
 
-        _unshare_folders = self.Append(id=ID_UNSHAREALLLOCALFOLDERS, text=_(u"Unshare &all local folders"))
+        _unshare_folders = self.Append(id=ID_UNSHAREALLLOCALFOLDERS, text=_("Unshare &all local folders"))
         if not _shared_folders:
             _unshare_folders.Enable(False)
 
         self.AppendSeparator()
 
-        _remember_shared_folders_item = self.AppendCheckItem(id=ID_REMEMBERSHAREDFOLDERS, text=_(u"Restore shares in next session"))
-        if not self._PyHocaGUI._remember_shared_folders.has_key(profile_name):
+        _remember_shared_folders_item = self.AppendCheckItem(id=ID_REMEMBERSHAREDFOLDERS, text=_("Restore shares in next session"))
+        if profile_name not in self._PyHocaGUI._remember_shared_folders:
             self._PyHocaGUI._remember_shared_folders[profile_name] = self._PyHocaGUI.get_profile_config(profile_name, 'restoreexports')
         _remember_shared_folders_item.Check(self._PyHocaGUI._remember_shared_folders[profile_name])
 
@@ -411,10 +411,10 @@ class PyHocaGUI_Menu_LaunchSingleApplication(wx.Menu):
         wx.Menu.__init__(self)
 
         _available_applications = {
-            'WWWBROWSER': _(u'Internet Browser'),
-            'MAILCLIENT': _(u'Email Client'),
-            'OFFICE': _(u'Office'),
-            'TERMINAL': _(u'Terminal'),
+            'WWWBROWSER': _('Internet Browser'),
+            'MAILCLIENT': _('Email Client'),
+            'OFFICE': _('Office'),
+            'TERMINAL': _('Terminal'),
             }
 
         for application in self._PyHocaGUI.get_profile_config(profile_name, 'applications'):
@@ -449,7 +449,7 @@ def _generate_Menu_PublishedApplications(_PyHocaGUI, caller=None, profile_name=N
         menu_map = _pubapp_session.get_published_applications(lang=_lang, max_no_submenus=_PyHocaGUI.args.published_applications_no_submenus)
     except AttributeError:
         menu_map = None
-    if not menu_map or not menu_map.has_key(_lang):
+    if not menu_map or _lang not in menu_map:
         menu_map = { _lang: {} }
 
     if x2go.defaults.X2GOCLIENT_OS == 'Windows':
@@ -459,16 +459,16 @@ def _generate_Menu_PublishedApplications(_PyHocaGUI, caller=None, profile_name=N
 
     _icons_location = basepath.icons_basepath
     _category_name_translator = {
-        'Multimedia': (_(u'Multimedia'), os.path.normpath('%s/PyHoca/%s/applications-multimedia.png' % (_icons_location, _icon_size), ), ),
-        'Development': (_(u'Development'), os.path.normpath('%s/PyHoca/%s/applications-development.png' % (_icons_location, _icon_size), ), ),
-        'Education': (_(u'Education'), os.path.normpath('%s/PyHoca/%s/applications-education.png' % (_icons_location, _icon_size), ), ),
-        'Games': (_(u'Games'), os.path.normpath('%s/PyHoca/%s/applications-games.png' % (_icons_location, _icon_size), ), ),
-        'Graphics': (_(u'Graphics'), os.path.normpath('%s/PyHoca/%s/applications-graphics.png' % (_icons_location, _icon_size), ), ),
-        'Internet': (_(u'Internet'), os.path.normpath('%s/PyHoca/%s/applications-internet.png' % (_icons_location, _icon_size), ), ),
-        'Office': (_(u'Office Applications'), os.path.normpath('%s/PyHoca/%s/applications-office.png' % (_icons_location, _icon_size), ), ),
-        'System': (_(u'System'), os.path.normpath('%s/PyHoca/%s/applications-system.png' % (_icons_location, _icon_size), ), ),
-        'Utilities': (_(u'Utilities'), os.path.normpath('%s/PyHoca/%s/applications-utilities.png' % (_icons_location, _icon_size), ), ),
-        'Other Applications': (_(u'Other Applications'), os.path.normpath('%s/PyHoca/%s/applications-other.png' % (_icons_location, _icon_size), ), ),
+        'Multimedia': (_('Multimedia'), os.path.normpath('%s/PyHoca/%s/applications-multimedia.png' % (_icons_location, _icon_size), ), ),
+        'Development': (_('Development'), os.path.normpath('%s/PyHoca/%s/applications-development.png' % (_icons_location, _icon_size), ), ),
+        'Education': (_('Education'), os.path.normpath('%s/PyHoca/%s/applications-education.png' % (_icons_location, _icon_size), ), ),
+        'Games': (_('Games'), os.path.normpath('%s/PyHoca/%s/applications-games.png' % (_icons_location, _icon_size), ), ),
+        'Graphics': (_('Graphics'), os.path.normpath('%s/PyHoca/%s/applications-graphics.png' % (_icons_location, _icon_size), ), ),
+        'Internet': (_('Internet'), os.path.normpath('%s/PyHoca/%s/applications-internet.png' % (_icons_location, _icon_size), ), ),
+        'Office': (_('Office Applications'), os.path.normpath('%s/PyHoca/%s/applications-office.png' % (_icons_location, _icon_size), ), ),
+        'System': (_('System'), os.path.normpath('%s/PyHoca/%s/applications-system.png' % (_icons_location, _icon_size), ), ),
+        'Utilities': (_('Utilities'), os.path.normpath('%s/PyHoca/%s/applications-utilities.png' % (_icons_location, _icon_size), ), ),
+        'Other Applications': (_('Other Applications'), os.path.normpath('%s/PyHoca/%s/applications-other.png' % (_icons_location, _icon_size), ), ),
         'TOP': ('TOP', os.path.normpath('%s/PyHoca/%s/x2go-logo-grey.png' % (_icons_location, _icon_size), ), ),
     }
 
@@ -476,8 +476,8 @@ def _generate_Menu_PublishedApplications(_PyHocaGUI, caller=None, profile_name=N
 
     nolog = wx.LogNull()
     _wx_menu_map = {}
-    if menu_map[_lang].keys():
-        for cat in menu_map[_lang].keys():
+    if list(menu_map[_lang].keys()):
+        for cat in list(menu_map[_lang].keys()):
 
             _wx_menu_map[_category_name_translator[cat][0]] = (wx.Menu(), _category_name_translator[cat][1])
 
@@ -493,7 +493,7 @@ def _generate_Menu_PublishedApplications(_PyHocaGUI, caller=None, profile_name=N
                     _menu_item.SetBitmap(wx.Bitmap(os.path.normpath('%s/PyHoca/%s/x2go-logo-grey.png' % (_icons_location, _icon_size))))
                 else:
                     _menu_entry_icon_decoded = base64.b64decode(_item['icon'])
-                    _icon_image = wx.ImageFromStream(StringIO.StringIO(_menu_entry_icon_decoded))
+                    _icon_image = wx.ImageFromStream(io.StringIO(_menu_entry_icon_decoded))
                     _icon_bitmap = None
                     try:
                         if x2go.defaults.X2GOCLIENT_OS == 'Windows':
@@ -551,12 +551,12 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
         _foldersharing_disabled = False
 
         if self._PyHocaGUI.with_brokerage and not self._PyHocaGUI.session_profiles.is_broker_authenticated():
-            _auth_menu_text = _(u'Connect to') + self._PyHocaGUI.broker_name
+            _auth_menu_text = _('Connect to') + self._PyHocaGUI.broker_name
             self.Append(id=ID_AUTHENTICATE_BROKER, text=_auth_menu_text)
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnBrokerAuthenticate, id=ID_AUTHENTICATE_BROKER)
 
         elif self._PyHocaGUI.args.single_session_profile and not self._PyHocaGUI.is_session_profile(profile_name):
-            connect = self.Append(id=ID_CONNECT, text=_(u'Connect %s') % profile_name)
+            connect = self.Append(id=ID_CONNECT, text=_('Connect %s') % profile_name)
             connect.Enable(False)
         else:
             _applications = self._PyHocaGUI.get_profile_config(profile_name, 'applications')
@@ -565,13 +565,13 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
             _useexports = self._PyHocaGUI.get_profile_config(profile_name, 'useexports')
 
             if profile_name in self._PyHocaGUI._temp_disabled_profile_names:
-                _connecting_info = self.Append(wx.NewId(), text=_(u'Currently connecting...'))
+                _connecting_info = self.Append(wx.NewId(), text=_('Currently connecting...'))
                 _connecting_info.Enable(False)
 
             elif self._PyHocaGUI.args.single_session_profile and \
                  not self._PyHocaGUI.is_profile_connected(profile_name=profile_name):
                     self._PyHocaGUI._eventid_profilenames_map[ID_CONNECT] = profile_name
-                    self.Append(id=ID_CONNECT, text=_(u'Connect %s') % profile_name)
+                    self.Append(id=ID_CONNECT, text=_('Connect %s') % profile_name)
                     self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionAuthenticate, id=ID_CONNECT)
 
             else:
@@ -580,27 +580,27 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                     self._PyHocaGUI._eventid_profilenames_map[ID_SHADOWSESSIONSTART] = profile_name
 
                 if _command in x2go.defaults.X2GO_DESKTOPSESSIONS:
-                    self.Append(id=ID_SESSIONSTART, text='%s (%s)' % (_(u"Start &new Desktop Session"), _command))
+                    self.Append(id=ID_SESSIONSTART, text='%s (%s)' % (_("Start &new Desktop Session"), _command))
                     self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionStart, id=ID_SESSIONSTART)
 
                 elif _command == 'SHADOW':
-                    self.Append(id=ID_SHADOWSESSIONSTART, text=_(u"Start Desktop Sharing Session"))
+                    self.Append(id=ID_SHADOWSESSIONSTART, text=_("Start Desktop Sharing Session"))
                     self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnShadowSessionStart, id=ID_SHADOWSESSIONSTART)
 
                 elif _command == '' and _published:
                     _pub_app_start_item = None
                     if profile_name in self._PyHocaGUI._temp_launching_pubapp_profiles:
-                        _pub_app_start_item = self.Append(id=ID_PUBAPPSESSIONSTART, text=_(u"Retrieving Application Menu..."))
+                        _pub_app_start_item = self.Append(id=ID_PUBAPPSESSIONSTART, text=_("Retrieving Application Menu..."))
                         _pub_app_start_item.Enable(False)
                     elif not (self._PyHocaGUI.disconnect_on_suspend and self._PyHocaGUI.disconnect_on_terminate):
                         self._PyHocaGUI._eventid_profilenames_map[ID_PUBAPPSESSIONSTART] = profile_name
-                        _pub_app_start_item = self.Append(id=ID_PUBAPPSESSIONSTART, text=_(u"Retrieve Application Menu"))
+                        _pub_app_start_item = self.Append(id=ID_PUBAPPSESSIONSTART, text=_("Retrieve Application Menu"))
                         self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnPubAppSessionStart, id=ID_PUBAPPSESSIONSTART)
                 elif _command == 'RDP':
-                    self.Append(id=ID_SESSIONSTART, text=_(u"Start &new RDP Session"))
+                    self.Append(id=ID_SESSIONSTART, text=_("Start &new RDP Session"))
                     self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionStart, id=ID_SESSIONSTART)
                 else:
-                    self.Append(id=ID_SESSIONSTART, text=_(u"Start &new Session"))
+                    self.Append(id=ID_SESSIONSTART, text=_("Start &new Session"))
                     self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionStart, id=ID_SESSIONSTART)
 
                 if _command == '' and _published:
@@ -612,7 +612,7 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                             _pub_app_start_item.Enable(False)
                         _foldersharing_disabled = _session_name_disabled = self._PyHocaGUI.is_session_name_disabled(profile_name, _pubapp_session.get_session_name())
                         _category_map = _generate_Menu_PublishedApplications(self._PyHocaGUI, caller=self, profile_name=profile_name, session_name=_pubapp_session.get_session_name())
-                        _category_names = _category_map.keys()
+                        _category_names = list(_category_map.keys())
                         _category_names.sort()
                         if (not self._PyHocaGUI.restricted_trayicon and not (self._PyHocaGUI.disconnect_on_suspend and self._PyHocaGUI.disconnect_on_terminate)) or (profile_name in self._PyHocaGUI._temp_launching_pubapp_profiles and _category_names):
                             self.AppendSeparator()
@@ -643,27 +643,27 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                             self._PyHocaGUI._eventid_sessionnames_map[ID_TERMINATESESSION] = _pubapp_session.get_session_name()
 
                         if _pubapp_session.is_running():
-                            _refresh_menu_item = self.Append(text=_(u"Refresh menu tree"), id=ID_REFRESHMENU)
+                            _refresh_menu_item = self.Append(text=_("Refresh menu tree"), id=ID_REFRESHMENU)
                             self.AppendSeparator()
                             if self._PyHocaGUI.disconnect_on_suspend and self._PyHocaGUI.exit_on_disconnect and _pubapp_session.has_terminal_session():
-                                _suspend_item = self.Append(text=_(u"Suspend Session (and disconnect/exit)"), id=ID_SUSPENDSESSION)
+                                _suspend_item = self.Append(text=_("Suspend Session (and disconnect/exit)"), id=ID_SUSPENDSESSION)
                             elif self._PyHocaGUI.disconnect_on_suspend and _pubapp_session.has_terminal_session():
-                                _suspend_item = self.Append(text=_(u"Suspend Session (and disconnect)"), id=ID_SUSPENDSESSION)
+                                _suspend_item = self.Append(text=_("Suspend Session (and disconnect)"), id=ID_SUSPENDSESSION)
                             else:
-                                _suspend_item = self.Append(text=_(u"Suspend Session"), id=ID_SUSPENDSESSION)
+                                _suspend_item = self.Append(text=_("Suspend Session"), id=ID_SUSPENDSESSION)
                             if _session_name_disabled:
                                 _refresh_menu_item.Enable(False)
                                 _suspend_item.Enable(False)
                         elif _pubapp_session.is_suspended():
-                            _resume_item = self.Append(text=_(u"Resume Session"), id=ID_RESUMESESSION)
+                            _resume_item = self.Append(text=_("Resume Session"), id=ID_RESUMESESSION)
                             if _session_name_disabled:
                                 _resume_item.Enable(False)
                         if self._PyHocaGUI.disconnect_on_terminate and self._PyHocaGUI.exit_on_disconnect and _pubapp_session.has_terminal_session():
-                            _terminate_item = self.Append(text=_(u"Terminate Session (and disconnect/exit)"), id=ID_TERMINATESESSION)
+                            _terminate_item = self.Append(text=_("Terminate Session (and disconnect/exit)"), id=ID_TERMINATESESSION)
                         elif self._PyHocaGUI.disconnect_on_terminate and _pubapp_session.has_terminal_session():
-                            _terminate_item = self.Append(text=_(u"Terminate Session (and disconnect)"), id=ID_TERMINATESESSION)
+                            _terminate_item = self.Append(text=_("Terminate Session (and disconnect)"), id=ID_TERMINATESESSION)
                         else:
-                            _terminate_item = self.Append(text=_(u"Terminate Session"), id=ID_TERMINATESESSION)
+                            _terminate_item = self.Append(text=_("Terminate Session"), id=ID_TERMINATESESSION)
                         if _session_name_disabled:
                             _terminate_item.Enable(False)
 
@@ -678,13 +678,13 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                     self._PyHocaGUI._eventid_profilenames_map[ID_LAUNCHAPPLICATION] = \
                         self._PyHocaGUI._eventid_profilenames_map[ID_CLEANSESSIONS] = profile_name
 
-                    if _applications and _command in x2go.defaults.X2GO_DESKTOPSESSIONS.keys() and not _published:
+                    if _applications and _command in list(x2go.defaults.X2GO_DESKTOPSESSIONS.keys()) and not _published:
                         self.AppendSeparator()
-                        self.AppendMenu(id=ID_LAUNCHAPPLICATION, text=_(u"Launch Single Application"),
+                        self.AppendMenu(id=ID_LAUNCHAPPLICATION, text=_("Launch Single Application"),
                                         submenu=PyHocaGUI_Menu_LaunchSingleApplication(self._PyHocaGUI, caller=self, profile_name=profile_name)
                                        )
                         if _command != 'SHADOW' and not self._PyHocaGUI.restricted_trayicon:
-                            self.Append(id=ID_SHADOWSESSIONSTART, text=_(u"Start Desktop Sharing Session"))
+                            self.Append(id=ID_SHADOWSESSIONSTART, text=_("Start Desktop Sharing Session"))
                             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnShadowSessionStart, id=ID_SHADOWSESSIONSTART)
 
                     if _published:
@@ -699,7 +699,7 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                         if _pubapp_session and _pubapp_session.is_running():
                             _session_name_disabled = self._PyHocaGUI.is_session_name_disabled(profile_name, _pubapp_session.get_session_name())
                             _category_map = _generate_Menu_PublishedApplications(self._PyHocaGUI, caller=self, profile_name=profile_name, session_name=_pubapp_session.get_session_name())
-                            _category_names = _category_map.keys()
+                            _category_names = list(_category_map.keys())
                             _category_names.sort()
                             for cat_name in [ _cn for _cn in _category_names if _cn != 'TOP' ]:
                                 _submenu = self.AppendMenu(id=wx.NewId(), text=cat_name, submenu=_category_map[cat_name][0])
@@ -721,7 +721,7 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                             elif _pubapp_session.is_suspended(): _status = 'S'
 
                             if _status:
-                                _submenu = self.AppendMenu(id=wx.NewId(), text=_(u'Manage Application Menu')+' %s' % _marker,
+                                _submenu = self.AppendMenu(id=wx.NewId(), text=_('Manage Application Menu')+' %s' % _marker,
                                                            submenu=PyHocaGUI_Menu_TaskbarSessionActions(self._PyHocaGUI, caller=self,
                                                                                                         profile_name=profile_name,
                                                                                                         session_name=_pubapp_session.get_session_name(),
@@ -734,10 +734,10 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                         else:
                             self._PyHocaGUI._eventid_profilenames_map[ID_PUBAPPSESSIONSTART] = profile_name
                             if profile_name in self._PyHocaGUI._temp_launching_pubapp_profiles:
-                                _ram = self.Append(id=ID_PUBAPPSESSIONSTART, text=_(u"Retrieving Application Menu..."))
+                                _ram = self.Append(id=ID_PUBAPPSESSIONSTART, text=_("Retrieving Application Menu..."))
                                 _ram.Enable(False)
                             else:
-                                self.Append(id=ID_PUBAPPSESSIONSTART, text=_(u"Retrieve Application Menu"))
+                                self.Append(id=ID_PUBAPPSESSIONSTART, text=_("Retrieve Application Menu"))
                             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnPubAppSessionStart, id=ID_PUBAPPSESSIONSTART)
 
                     _query_session_uuid = self._PyHocaGUI.client_connected_sessions_of_profile_name(profile_name, return_objects=False)[0]
@@ -748,9 +748,9 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
 
                         # newest sessions at the top
                         if _published:
-                            _session_list_names = [ _s_name for _s_name in _session_list.keys() if not _session_list[_s_name].is_published_applications_provider() ]
+                            _session_list_names = [ _s_name for _s_name in list(_session_list.keys()) if not _session_list[_s_name].is_published_applications_provider() ]
                         else:
-                            _session_list_names = _session_list.keys()
+                            _session_list_names = list(_session_list.keys())
                         _session_list_names.reverse()
 
                     if _session_list_names:
@@ -776,37 +776,37 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                                 _s_id = wx.NewId()
 
                                 if _session_list[session_name].get_status() == 'R':
-                                    state = _(u'Running')
+                                    state = _('Running')
                                 elif _session_list[session_name].get_status() == 'S':
-                                    state = _(u'Suspended')
+                                    state = _('Suspended')
                                 _marker = ''
                                 if session and session.is_master_session():
                                     _marker = '(*)'
                                 if session:
-                                    session_submenu = self.AppendMenu(id=_s_id, text=u'%s: »%s« %s' % (state, session_name, _marker),
+                                    session_submenu = self.AppendMenu(id=_s_id, text='%s: »%s« %s' % (state, session_name, _marker),
                                                                       submenu=PyHocaGUI_Menu_TaskbarSessionActions(self._PyHocaGUI, caller=self,
                                                                                                                    profile_name=profile_name,
                                                                                                                    session_name=session_name,
                                                                                                                    session_info=_session_list[session_name],
                                                                                                                   )
                                                                  )
-                                    if self._PyHocaGUI._temp_disabled_session_names.has_key(profile_name) and session_name in self._PyHocaGUI._temp_disabled_session_names[profile_name]:
+                                    if profile_name in self._PyHocaGUI._temp_disabled_session_names and session_name in self._PyHocaGUI._temp_disabled_session_names[profile_name]:
                                         session_submenu.Enable(False)
 
                             # redefine list of session names to decide if the clean all session menu item is not be shown
                             _session_list_names = [ _s.get_session_name() for _s in _session_list_matching_profile if not _session_list[_s.get_session_name()].is_published_applications_provider() ]
 
                             if _session_list_names:
-                                self.Append(id=ID_CLEANSESSIONS, text=_(u"&Clean all sessions"))
+                                self.Append(id=ID_CLEANSESSIONS, text=_("&Clean all sessions"))
                                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnCleanSessions, id=ID_CLEANSESSIONS)
 
                 if not self._PyHocaGUI.restricted_trayicon:
 
                     self.AppendSeparator()
                     if self._PyHocaGUI.session_profiles.is_mutable(profile_name):
-                        self.Append(id=ID_EDITPROFILEWHILECONNECTED, text=_(u"Customize &profile"))
+                        self.Append(id=ID_EDITPROFILEWHILECONNECTED, text=_("Customize &profile"))
                     else:
-                        self.Append(id=ID_EDITPROFILEWHILECONNECTED, text=_(u"View &profile"))
+                        self.Append(id=ID_EDITPROFILEWHILECONNECTED, text=_("View &profile"))
                     self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileEditWhileConnected, id=ID_EDITPROFILEWHILECONNECTED)
 
                 self._PyHocaGUI._eventid_profilenames_map[ID_EDITPROFILEWHILECONNECTED] = \
@@ -821,7 +821,7 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
                     if self._PyHocaGUI.restricted_trayicon:
                         self.AppendSeparator()
 
-                    _shared_folders = self.AppendMenu(id=ID_SHARELOCALFOLDER, text=_(u"Shared &folders"),
+                    _shared_folders = self.AppendMenu(id=ID_SHARELOCALFOLDER, text=_("Shared &folders"),
                                                       submenu=PyHocaGUI_Menu_TaskbarProfileSharedFolders(self._PyHocaGUI, caller=self,
                                                       profile_name=profile_name)
                                                      )
@@ -833,29 +833,29 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
             self.AppendSeparator()
             ID_SERVERINFO = wx.NewId()
             self._PyHocaGUI._eventid_profilenames_map[ID_SERVERINFO] = profile_name
-            self.Append(id=ID_SERVERINFO, text=_(u"Server Information"))
+            self.Append(id=ID_SERVERINFO, text=_("Server Information"))
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnViewServerInformation, id=ID_SERVERINFO)
 
         if profile_name in self._PyHocaGUI.client_connected_profiles(return_profile_names=True) and not self._PyHocaGUI.exit_on_disconnect:
             self.AppendSeparator()
             ID_DISCONNECT = wx.NewId()
             self._PyHocaGUI._eventid_profilenames_map[ID_DISCONNECT] = profile_name
-            self.Append(id=ID_DISCONNECT, text=_(u"&Disconnect from Server"))
+            self.Append(id=ID_DISCONNECT, text=_("&Disconnect from Server"))
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnServerDisconnect, id=ID_DISCONNECT)
 
         if self._PyHocaGUI.args.single_session_profile:
             ID_EXIT = wx.NewId()
             if self._PyHocaGUI.client_running_sessions_of_profile_name(profile_name=self._PyHocaGUI.args.session_profile) and self._PyHocaGUI.exit_on_disconnect and not self._PyHocaGUI.disconnect_on_suspend:
                 self.AppendSeparator()
-                self.Append(id=ID_EXIT, text=_(u"Suspend Session and E&xit application"))
+                self.Append(id=ID_EXIT, text=_("Suspend Session and E&xit application"))
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
             elif self._PyHocaGUI.is_profile_connected(profile_name=self._PyHocaGUI.args.session_profile) and self._PyHocaGUI.exit_on_disconnect and not self._PyHocaGUI.disconnect_on_suspend:
                 self.AppendSeparator()
-                self.Append(id=ID_EXIT, text=_(u"Disconnect and E&xit application"))
+                self.Append(id=ID_EXIT, text=_("Disconnect and E&xit application"))
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
             elif not self._PyHocaGUI.exit_on_disconnect and not (self._PyHocaGUI.disconnect_on_suspend or self._PyHocaGUI.disconnect_on_terminate):
                 self.AppendSeparator()
-                self.Append(id=ID_EXIT, text=_(u"E&xit"))
+                self.Append(id=ID_EXIT, text=_("E&xit"))
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
 
 
@@ -905,7 +905,7 @@ class PyHocaGUI_Menu_TaskbarProfileNames(wx.Menu):
 
         if type(caller) == PyHocaGUI_Menu_TaskbarOptionsManager and self._PyHocaGUI.session_profiles.supports_mutable_profiles():
             ID_ADDPROFILE = wx.NewId()
-            self.Append(id=ID_ADDPROFILE, text=_(u"Add Profile"))
+            self.Append(id=ID_ADDPROFILE, text=_("Add Profile"))
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileAdd, id=ID_ADDPROFILE)
 
             self.AppendSeparator()
@@ -982,9 +982,9 @@ class PyHocaGUI_Menu_TaskbarProfileNames(wx.Menu):
 
         if not group_name and (not _profile_groups and not _profile_names) and not filter_profiles:
             if self._PyHocaGUI.with_brokerage:
-                _dummy = self.Append(text=_(u'Session broker is not connected'), id=wx.NewId())
+                _dummy = self.Append(text=_('Session broker is not connected'), id=wx.NewId())
             else:
-                _dummy = self.Append(text=_(u'No session profiles defined'), id=wx.NewId())
+                _dummy = self.Append(text=_('No session profiles defined'), id=wx.NewId())
             _dummy.Enable(False)
 
         else:
@@ -995,15 +995,15 @@ class PyHocaGUI_Menu_TaskbarProfileNames(wx.Menu):
                 _export_group_name = _export_group_name.strip("/")
                 self._PyHocaGUI._eventid_exportprofiles_map[_export_id] = _export_group_name
                 if not group_name:
-                    self.Append(text=_(u'Export all Profiles'), id=_export_id)
+                    self.Append(text=_('Export all Profiles'), id=_export_id)
                 else:
-                    self.Append(text=_(u'Export Profile Group'), id=_export_id)
+                    self.Append(text=_('Export Profile Group'), id=_export_id)
                 self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileExport, id=_export_id)
 
         if bind_method is None and not group_name and self._PyHocaGUI.session_profiles.supports_mutable_profiles():
             _import_id = wx.NewId()
             self.AppendSeparator()
-            self.Append(text=_(u'Import Session Profiles'), id=_import_id)
+            self.Append(text=_('Import Session Profiles'), id=_import_id)
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileImport, id=_import_id)
 
     def OnUpdateUI(self, evt):
@@ -1041,12 +1041,12 @@ class PyHocaGUI_Menu_TaskbarSessionManager(wx.Menu):
         ID_EXIT = wx.NewId()
 
         if self._PyHocaGUI.with_brokerage and not self._PyHocaGUI.session_profiles.is_broker_authenticated():
-            _auth_menu_text = _(u'Connect to') + ' ' + self._PyHocaGUI.broker_name
+            _auth_menu_text = _('Connect to') + ' ' + self._PyHocaGUI.broker_name
             self.Append(id=ID_AUTHENTICATE_BROKER, text=_auth_menu_text)
             self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnBrokerAuthenticate, id=ID_AUTHENTICATE_BROKER)
             self.AppendSeparator()
         else:
-            _auth_menu_text = _(u'Connect Server')
+            _auth_menu_text = _('Connect Server')
             self.AppendMenu(id=ID_AUTHENTICATE_SESSION,
                             text=_auth_menu_text,
                             submenu=PyHocaGUI_Menu_TaskbarProfileNames(self._PyHocaGUI,
@@ -1076,7 +1076,7 @@ class PyHocaGUI_Menu_TaskbarSessionManager(wx.Menu):
         if _connected_sessions:
             self.AppendSeparator()
 
-        self.Append(id=ID_EXIT, text=_(u"E&xit"))
+        self.Append(id=ID_EXIT, text=_("E&xit"))
         self._PyHocaGUI.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
 
 
diff --git a/pyhoca/wxgui/messages.py b/pyhoca/wxgui/messages.py
index bd52c1b..472e930 100644
--- a/pyhoca/wxgui/messages.py
+++ b/pyhoca/wxgui/messages.py
@@ -26,7 +26,7 @@ import wx
 import os
 
 # PyHoca-GUI modules
-import basepath
+from . import basepath
 
 # X2Go modules
 from x2go.defaults import CURRENT_LOCAL_USER as _CURRENT_LOCAL_USER
@@ -68,14 +68,14 @@ class PyHoca_MessageWindow(wx.Dialog):
         except: pass
 
         self._pyhoca_messages = {
-            'REALLY_DELETE_PROFILE': _(u'Are you really sure you want to\ndelete the session profile ,,%s\'\'?') % profile_name,
-            'ALREADY_RUNNING': _(u'{appname} is already running for user ,,{username}\'\'!\n\nOnly one instance of {appname} can be started per\nuser. The {appname} icon can be found in your desktop\'s\nnotification area/systray.').format(appname=self._PyHocaGUI.appname, username=_CURRENT_LOCAL_USER)
+            'REALLY_DELETE_PROFILE': _('Are you really sure you want to\ndelete the session profile ,,%s\'\'?') % profile_name,
+            'ALREADY_RUNNING': _('{appname} is already running for user ,,{username}\'\'!\n\nOnly one instance of {appname} can be started per\nuser. The {appname} icon can be found in your desktop\'s\nnotification area/systray.').format(appname=self._PyHocaGUI.appname, username=_CURRENT_LOCAL_USER)
         }
 
 
         if shortmsg is None:
             show_message = msg
-        elif shortmsg in self._pyhoca_messages.keys():
+        elif shortmsg in list(self._pyhoca_messages.keys()):
             show_message = self._pyhoca_messages[shortmsg]
         else:
             show_message = 'No message has been given...'
@@ -107,8 +107,8 @@ class PyHoca_MessageWindow(wx.Dialog):
         mainSizer = wx.BoxSizer(wx.VERTICAL)
 
         if buttontype in ('yesno', 'noyes'):
-            self.yesBtn = wx.Button(self, wx.ID_ANY, _(u'Yes'),)
-            self.noBtn = wx.Button(self, wx.ID_ANY, _(u'No'))
+            self.yesBtn = wx.Button(self, wx.ID_ANY, _('Yes'),)
+            self.noBtn = wx.Button(self, wx.ID_ANY, _('No'))
 
             self.Bind(wx.EVT_BUTTON, self.OnTrue, self.yesBtn)
             self.Bind(wx.EVT_BUTTON, self.OnFalse, self.noBtn)
@@ -125,13 +125,13 @@ class PyHoca_MessageWindow(wx.Dialog):
 
         if buttontype in ('ok', 'okcancel', 'cancelok'):
 
-            self.okBtn = wx.Button(self, wx.ID_ANY, _(u'Ok'),)
+            self.okBtn = wx.Button(self, wx.ID_ANY, _('Ok'),)
             self.Bind(wx.EVT_BUTTON, self.OnTrue, self.okBtn)
             btnSizer.Add(self.okBtn, flag=wx.ALL, border=5)
 
         if buttontype in ('okcancel', 'cancelok'):
 
-            self.cancelBtn = wx.Button(self, wx.ID_ANY, _(u'Cancel'))
+            self.cancelBtn = wx.Button(self, wx.ID_ANY, _('Cancel'))
             self.Bind(wx.EVT_BUTTON, self.OnFalse, self.cancelBtn)
             btnSizer.Add(self.cancelBtn, flag=wx.ALL, border=5)
 
diff --git a/pyhoca/wxgui/notify.py b/pyhoca/wxgui/notify.py
index 7431915..3970f64 100644
--- a/pyhoca/wxgui/notify.py
+++ b/pyhoca/wxgui/notify.py
@@ -30,13 +30,12 @@ if X2GOCLIENT_OS in ('Linux', 'Mac'):
         # GTK3 notifications are unavailable,
         # hopefully pynotify / GTK2-based notifications are available then...
         import pynotify as _Notify
-import exceptions
-import basepath
+from . import basepath
 
 import x2go.utils as utils
 
-class NotSupportedException(exceptions.StandardError): pass
-class PyHocaNotificationException(exceptions.StandardError): pass
+class NotSupportedException(BaseException): pass
+class PyHocaNotificationException(BaseException): pass
 
 def notification_service_available():
     return _Notify.get_server_info()[0]
@@ -386,7 +385,7 @@ class showballoon_NotifierPopup(object):
             'session_terminate': wx.ICON_INFORMATION,
             'session_warning': wx.ICON_WARNING,
         }
-        if icon in _icon_map_wx.keys():
+        if icon in list(_icon_map_wx.keys()):
            icon = _icon_map_wx[icon]
         else:
            icon = wx.ICON_INFORMATION
@@ -540,7 +539,7 @@ class notificationmessage_NotifierPopup(object):
             'session_terminate': wx.ICON_INFORMATION,
             'session_warning': wx.ICON_WARNING,
         }
-        if icon in _icon_map_wx.keys():
+        if icon in list(_icon_map_wx.keys()):
            icon = _icon_map_wx[icon]
         else:
            icon = wx.ICON_INFORMATION
diff --git a/pyhoca/wxgui/passphrase.py b/pyhoca/wxgui/passphrase.py
index a7ff97d..efa3229 100644
--- a/pyhoca/wxgui/passphrase.py
+++ b/pyhoca/wxgui/passphrase.py
@@ -34,9 +34,9 @@ import os
 import base64
 
 # PyHoca-GUI modules
-import logon
+from . import logon
 
-if os.environ.has_key('DESKTOP_SESSION'):
+if 'DESKTOP_SESSION' in os.environ:
     WINDOW_MANAGER = os.environ['DESKTOP_SESSION']
 else:
     WINDOW_MANAGER = 'generic'
@@ -67,9 +67,9 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
         self.current_profile_config = self._PyHocaGUI.session_profiles.get_profile_config(profile_name)
 
         if sshproxy_auth:
-            wx.Dialog.__init__(self, None, id=-1, title=_(u'%s (SSH proxy)') % profile_name, style=wx.DEFAULT_FRAME_STYLE, )
+            wx.Dialog.__init__(self, None, id=-1, title=_('%s (SSH proxy)') % profile_name, style=wx.DEFAULT_FRAME_STYLE, )
         else:
-            wx.Dialog.__init__(self, None, id=-1, title=_(u'%s (X2Go Server)') % profile_name, style=wx.DEFAULT_FRAME_STYLE, )
+            wx.Dialog.__init__(self, None, id=-1, title=_('%s (X2Go Server)') % profile_name, style=wx.DEFAULT_FRAME_STYLE, )
 
         self._PyHocaGUI._sub_windows.append(self)
 
@@ -79,19 +79,19 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
         self.sshproxy_passphrase = sshproxy_passphrase
 
         if self.key_filename:
-            keyfilenameLbl = wx.StaticText(self, wx.ID_ANY, _(u'Unlock SSH private key (%s)...') % key_filename)
+            keyfilenameLbl = wx.StaticText(self, wx.ID_ANY, _('Unlock SSH private key (%s)...') % key_filename)
         else:
-            keyfilenameLbl = wx.StaticText(self, wx.ID_ANY, _(u'Unlock auto-discovered SSH private key...'))
+            keyfilenameLbl = wx.StaticText(self, wx.ID_ANY, _('Unlock auto-discovered SSH private key...'))
 
-        self.passphraseLbl = wx.StaticText(self, wx.ID_ANY, _(u'Passphrase')+':', size=(-1, -1))
+        self.passphraseLbl = wx.StaticText(self, wx.ID_ANY, _('Passphrase')+':', size=(-1, -1))
         self.passphraseTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER|wx.TE_PASSWORD, size=(120, -1))
         self.passphraseTxt.SetFocus()
-        self.unlockBtn = wx.Button(self, wx.ID_OK, _(u'Unlock SSH key'), )
+        self.unlockBtn = wx.Button(self, wx.ID_OK, _('Unlock SSH key'), )
         self.unlockBtn.SetDefault()
 
         _tab_order = []
 
-        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _(u'Cancel'), )
+        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _('Cancel'), )
 
         _tab_order.extend([self.passphraseTxt, self.unlockBtn, self.cancelBtn, ])
 
@@ -119,7 +119,7 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
         self.SetSizerAndFit(mainSizer)
         self.Layout()
 
-        for i in xrange(len(_tab_order) - 1):
+        for i in range(len(_tab_order) - 1):
             _tab_order[i+1].MoveAfterInTabOrder(_tab_order[i])
 
         maxX, maxY = wx.GetDisplaySize()
@@ -196,8 +196,8 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
                                                          add_to_known_hosts=self._PyHocaGUI.add_to_known_hosts,
                                                         )
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - connect') % self.current_profile_name,
-                                             text=_(u'Authentication has been successful.'),
+                                             title=_('%s - connect') % self.current_profile_name,
+                                             text=_('Authentication has been successful.'),
                                              icon='auth_success')
 
         except x2go.PasswordRequiredException:
@@ -214,56 +214,56 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
 
             else:
                 self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                                 title=_(u'%s - connect failure') % self.current_profile_name,
-                                                 text=_(u'SSH key file (for X2Go server) could not be unlocked!'),
+                                                 title=_('%s - connect failure') % self.current_profile_name,
+                                                 text=_('SSH key file (for X2Go server) could not be unlocked!'),
                                                  icon='auth_failed')
                 connect_failed = True
 
         except x2go.X2GoSSHProxyPasswordRequiredException:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - connect failure') % self.current_profile_name,
-                                             text=_(u'SSH key file (for SSH proxy) could not be unlocked!'),
+                                             title=_('%s - connect failure') % self.current_profile_name,
+                                             text=_('SSH key file (for SSH proxy) could not be unlocked!'),
                                              icon='auth_failed')
             connect_failed = True
 
         except x2go.AuthenticationException:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - connect failure') % self.current_profile_name,
-                                             text=_(u'Authentication failed!'),
+                                             title=_('%s - connect failure') % self.current_profile_name,
+                                             text=_('Authentication failed!'),
                                              icon='auth_failed')
             connect_failed = True
 
         except x2go.X2GoSSHProxyAuthenticationException:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - connect failure') % self.current_profile_name,
-                                             text=_(u'Authentication to the SSH proxy server failed!'),
+                                             title=_('%s - connect failure') % self.current_profile_name,
+                                             text=_('Authentication to the SSH proxy server failed!'),
                                              icon='auth_failed')
             connect_failed = True
 
-        except gevent.socket.error, e:
+        except gevent.socket.error as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - socket error') % self.current_profile_name,
+                                             title=_('%s - socket error') % self.current_profile_name,
                                              text=e.strerror + '!',
                                              icon='auth_error')
             connect_failed = True
 
-        except x2go.X2GoHostKeyException, e:
+        except x2go.X2GoHostKeyException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - host key error') % self.current_profile_name,
-                                             text=_(u'The remote server\'s host key is invalid or has not been accepted by the user') + '!',
+                                             title=_('%s - host key error') % self.current_profile_name,
+                                             text=_('The remote server\'s host key is invalid or has not been accepted by the user') + '!',
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.X2GoRemoteHomeException, e:
+        except x2go.X2GoRemoteHomeException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - missing home directory') % self.current_profile_name,
+                                             title=_('%s - missing home directory') % self.current_profile_name,
                                              text=_("The remote user's home directory does not exist."),
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.X2GoSSHProxyException, e:
+        except x2go.X2GoSSHProxyException as e:
             if str(e).startswith('Two-factor authentication requires a password'):
                 self._pyhoca_logger('SSH proxy host requests two-factor authentication', loglevel=x2go.loglevel_NOTICE)
                 _logon_window = logon.PyHocaGUI_DialogBoxPassword(self._PyHocaGUI, self.current_profile_name,
@@ -280,21 +280,21 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
                 else:
                     errmsg = str(e)
                 self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                                 title=_(u'%s - key error') % self.current_profile_name,
+                                                 title=_('%s - key error') % self.current_profile_name,
                                                  text='%s!' % errmsg,
                                                  icon='auth_error',
                                                  timeout=4000)
                 connect_failed = True
 
-        except x2go.X2GoSessionException, e:
+        except x2go.X2GoSessionException as e:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - auth error') % self.current_profile_name,
+                                             title=_('%s - auth error') % self.current_profile_name,
                                              text='%s!' % str(e),
                                              icon='auth_error',
                                              timeout=4000)
             connect_failed = True
 
-        except x2go.SSHException, e:
+        except x2go.SSHException as e:
             if str(e).startswith('Two-factor authentication requires a password'):
                 self._pyhoca_logger('X2Go Server requests two-factor authentication', loglevel=x2go.loglevel_NOTICE)
                 _logon_window = logon.PyHocaGUI_DialogBoxPassword(self._PyHocaGUI, self.current_profile_name,
@@ -312,7 +312,7 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
                     errmsg = str(e)
 
                 self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                                 title=_(u'%s - SSH error') % self.current_profile_name,
+                                                 title=_('%s - SSH error') % self.current_profile_name,
                                                  text='%s' % errmsg,
                                                  icon='auth_error',
                                                  timeout=10000)
@@ -320,11 +320,11 @@ class PyHocaGUI_DialogBoxPassphrase(wx.Dialog):
 
         except:
             self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
-                                             title=_(u'%s - unknown error') % self.current_profile_name,
-                                             text=_(u'An unknown error occured during authentication!'),
+                                             title=_('%s - unknown error') % self.current_profile_name,
+                                             text=_('An unknown error occured during authentication!'),
                                              icon='auth_error')
             connect_failed = True
-            if self._PyHocaGUI.args.debug or self._PyHocaGUI.args.libdebug or (os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'):
+            if self._PyHocaGUI.args.debug or self._PyHocaGUI.args.libdebug or ('PYHOCAGUI_DEVELOPMENT' in os.environ and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'):
                 raise
 
         self._PyHocaGUI.notifier.send(self.current_profile_name, context='AUTH_%s' % self.current_profile_name, timeout=4000)
diff --git a/pyhoca/wxgui/printingprefs.py b/pyhoca/wxgui/printingprefs.py
index 0eaa3a2..198e9e3 100644
--- a/pyhoca/wxgui/printingprefs.py
+++ b/pyhoca/wxgui/printingprefs.py
@@ -35,7 +35,7 @@ if _X2GOCLIENT_OS != "Windows":
 else:
     import win32print
 
-import basepath
+from . import basepath
 
 class PyHocaGUI_PrintingPreferences(wx.Dialog):
     """\
@@ -65,21 +65,21 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
         self._pyhoca_logger('opening client printing configuration dialog, mode: ,,%s\'\'' % self.mode, loglevel=log.loglevel_INFO)
 
         if self.mode == 'edit':
-            _title = _(u'%s - Printing Preferences') % self._PyHocaGUI.appname
+            _title = _('%s - Printing Preferences') % self._PyHocaGUI.appname
         else:
-            _title = _(u'%s - Incoming Print Job from  %s (%s)') % (self._PyHocaGUI.appname, profile_name, session_name)
+            _title = _('%s - Incoming Print Job from  %s (%s)') % (self._PyHocaGUI.appname, profile_name, session_name)
         wx.Dialog.__init__(self, None, -1, title=_title, style=wx.DEFAULT_DIALOG_STYLE, )
         self._PyHocaGUI._sub_windows.append(self)
 
         self._availablePrintActions = {
-            'DIALOG': _(u'Open this dialog window'),
-            'PDFVIEW': _(u'Open with PDF viewer'),
-            'PDFSAVE': _(u'Save to a local folder'),
-            'PRINT': _(u'Print to a local printer'),
-            'PRINTCMD': _(u'Run custom print command'),
+            'DIALOG': _('Open this dialog window'),
+            'PDFVIEW': _('Open with PDF viewer'),
+            'PDFSAVE': _('Save to a local folder'),
+            'PRINT': _('Print to a local printer'),
+            'PRINTCMD': _('Run custom print command'),
             }
         if self.mode != 'edit':
-            self._availablePrintActions['DIALOG'] = _(u'<Select a print action here>')
+            self._availablePrintActions['DIALOG'] = _('<Select a print action here>')
 
         self._availablePrinters = {}
         if _X2GOCLIENT_OS != "Windows":
@@ -88,7 +88,7 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
                 cups.setUser(_CURRENT_LOCAL_USER)
                 cups_connection = cups.Connection()
                 cups_printers = cups_connection.getPrinters()
-                for p in cups_printers.keys():
+                for p in list(cups_printers.keys()):
                     self._availablePrinters.update({ p: '%s (%s)' % (p, cups_printers[p]['printer-info']), })
                 self._defaultPrinter = cups_connection.getDefault()
             except RuntimeError:
@@ -113,40 +113,40 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
         ### widgets for CLIENT PRINTING
         ###
         if self.mode != 'edit':
-            self.PrintActionLabel = wx.StaticText(self, -1, _(u"Print action")+':')
+            self.PrintActionLabel = wx.StaticText(self, -1, _("Print action")+':')
         else:
-            self.PrintActionLabel = wx.StaticText(self, -1, _(u"Default action for incoming print jobs")+':')
-        self.PrintAction = wx.ComboBox(self, -1, choices=self._availablePrintActions.values(), style=wx.CB_DROPDOWN|wx.CB_READONLY)
+            self.PrintActionLabel = wx.StaticText(self, -1, _("Default action for incoming print jobs")+':')
+        self.PrintAction = wx.ComboBox(self, -1, choices=list(self._availablePrintActions.values()), style=wx.CB_DROPDOWN|wx.CB_READONLY)
 
         # widgets for print action PDFVIEW
-        self.PdfViewCmdLabel = wx.StaticText(self, -1, _(u'PDF viewer command') + ':', )
+        self.PdfViewCmdLabel = wx.StaticText(self, -1, _('PDF viewer command') + ':', )
         self.PdfViewCmd = wx.TextCtrl(self, -1, '', )
         self.PdfViewCmdBrowseButton = wx.BitmapButton(self, -1,
                                                       wx.Bitmap('%s/PyHoca/16x16/system-search.png' % _icons_location, wx.BITMAP_TYPE_ANY)
                                                      )
 
         # widgets for print action PDFSAVE
-        self.PdfSaveToFolderLabel = wx.StaticText(self, -1, _(u'Save PDFs to folder') + ':', )
+        self.PdfSaveToFolderLabel = wx.StaticText(self, -1, _('Save PDFs to folder') + ':', )
         self.PdfSaveToFolder = wx.TextCtrl(self, -1, '', )
         self.PdfSaveToFolderBrowseButton = wx.BitmapButton(self, -1,
                                                            wx.Bitmap('%s/PyHoca/16x16/system-search.png' % _icons_location, wx.BITMAP_TYPE_ANY)
                                                           )
 
         # widgets for print action PRINT
-        self.PrintPrinterLabel = wx.StaticText(self, -1, _(u'Use this printer') + ':', )
-        self.PrintPrinter = wx.ComboBox(self, -1, choices=self._availablePrinters.values(), style=wx.CB_DROPDOWN|wx.CB_READONLY)
+        self.PrintPrinterLabel = wx.StaticText(self, -1, _('Use this printer') + ':', )
+        self.PrintPrinter = wx.ComboBox(self, -1, choices=list(self._availablePrinters.values()), style=wx.CB_DROPDOWN|wx.CB_READONLY)
 
         # widgets for print action PRINTCMD
-        self.PrintCmdLabel = wx.StaticText(self, -1, _(u'Custom print command') + ':', )
+        self.PrintCmdLabel = wx.StaticText(self, -1, _('Custom print command') + ':', )
         self.PrintCmd = wx.TextCtrl(self, -1, '', )
 
         if self.mode == 'edit':
-            self.OKButton = wx.Button(self, wx.ID_OK, _(u"Ok"))
-            self.ApplyButton = wx.Button(self, -1, _(u"Apply"))
+            self.OKButton = wx.Button(self, wx.ID_OK, _("Ok"))
+            self.ApplyButton = wx.Button(self, -1, _("Apply"))
         else:
-            self.OKButton = wx.Button(self, wx.ID_OK, _(u"Print"))
+            self.OKButton = wx.Button(self, wx.ID_OK, _("Print"))
         self.OKButton.SetDefault()
-        self.CancelButton = wx.Button(self, wx.ID_CANCEL, _(u"Cancel"))
+        self.CancelButton = wx.Button(self, wx.ID_CANCEL, _("Cancel"))
 
         self.__set_properties()
         self.__update_fields()
@@ -246,21 +246,21 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
                     if self._defaultPrinter != None:
                         _printer_name = self._availablePrinters[self._defaultPrinter]
                     else:
-                        _printer_name = self._availablePrinters[self._availablePrinters.keys()[0]]
+                        _printer_name = self._availablePrinters[list(self._availablePrinters.keys())[0]]
             else:
-                _printer_name = _(u'- no printers installed -')
+                _printer_name = _('- no printers installed -')
                 self.PrintPrinter.Clear()
                 self.PrintPrinter.Append(_(_printer_name))
                 self.PrintPrinter.Enable(False)
         else:
-            _printer_name = _(u'- print system is not available -')
+            _printer_name = _('- print system is not available -')
             self.PrintPrinter.Clear()
             self.PrintPrinter.Append(_(_printer_name))
             self.PrintPrinter.Enable(False)
         self.PrintPrinter.SetValue(_printer_name)
         self.PrintCmd.SetValue(self.client_printing.get_property('print_cmd'))
 
-        if self._availablePrintActions.has_key(print_action_name):
+        if print_action_name in self._availablePrintActions:
             self.PrintAction.SetValue(self._availablePrintActions[print_action_name])
         else:
             self.PrintAction.SetValue(print_action_name)
@@ -275,13 +275,13 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
 
     @property
     def _print_action(self):
-        return [ p for p in self._availablePrintActions.keys() if self._availablePrintActions[p] == self.PrintAction.GetValue() ][0]
+        return [ p for p in list(self._availablePrintActions.keys()) if self._availablePrintActions[p] == self.PrintAction.GetValue() ][0]
 
     @property
     def _print_action_properties(self):
 
         # handle missing print system
-        _printer = [ p for p in self._availablePrinters.keys() if self._availablePrinters[p] == self.PrintPrinter.GetValue() and self._defaultPrinter != '#PRINTSYSTEM_UNAVAILABLE#' ]
+        _printer = [ p for p in list(self._availablePrinters.keys()) if self._availablePrinters[p] == self.PrintPrinter.GetValue() and self._defaultPrinter != '#PRINTSYSTEM_UNAVAILABLE#' ]
         try:
             _printer = _printer[0]
         except IndexError:
@@ -407,7 +407,7 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
         """
         wildcard = "All files (*.*)|*"
         dlg = wx.FileDialog(
-            self, message=_(u"Choose PDF viewer application"), defaultDir=_LOCAL_HOME,
+            self, message=_("Choose PDF viewer application"), defaultDir=_LOCAL_HOME,
             defaultFile="", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR )
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
@@ -430,7 +430,7 @@ class PyHocaGUI_PrintingPreferences(wx.Dialog):
                 _start_dir = '~/%s' % _start_dir
             _start_dir = os.path.expanduser(_start_dir)
         dlg = wx.DirDialog(
-            self, message=_(u"Choose PDF saving location"), style=1, defaultPath=_start_dir, )
+            self, message=_("Choose PDF saving location"), style=1, defaultPath=_start_dir, )
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
         if dlg.ShowModal() == wx.ID_OK:
diff --git a/pyhoca/wxgui/profilemanager.py b/pyhoca/wxgui/profilemanager.py
index 1cad7ed..3cf6281 100644
--- a/pyhoca/wxgui/profilemanager.py
+++ b/pyhoca/wxgui/profilemanager.py
@@ -30,7 +30,7 @@ import x2go.defaults as defaults
 from x2go import X2GOCLIENT_OS
 
 from x2go._paramiko import PARAMIKO_FEATURE
-import basepath
+from . import basepath
 
 _known_encodings = utils.known_encodings()
 
@@ -79,41 +79,41 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
 
         self.action = action
         self.sessionChoices = {
-            'CINNAMON': _(u'Cinnamon Desktop (CINNAMON)'),
-            'GNOME': _(u'GNOME Desktop (GNOME)'),
-            'MATE': _(u'MATE Desktop (MATE)'),
-            'KDE': _(u'K Desktop Environment (KDE)'),
-            'LXDE': _(u'Lightweight X Desktop (LXDE, based on GTK-2)'),
-            'LXQt': _(u'Lightweight X Desktop (LXQt, based on Qt5)'),
-            'IceWM': _(u'IceWM Desktop'),
-            'TRINITY': _(u'Trinity X Desktop (KDE3-like)'),
-            'UNITY': _(u'Unity X Desktop Shell (UNITY)'),
-            'XFCE': _(u'XFCE Desktop (XFCE)'),
-            'PUBLISHEDAPPLICATIONS': _(u'Published Applications'),
-            'APPLICATION': _(u'Single Application'),
-            'SHADOW': _(u'X2Go/X11 Desktop Sharing (SHADOW)'),
-            'XDMCP': _(u'XDMCP Query'),
-            'RDP': _(u'Windows Terminal Server (X2Go-proxied RDP)'),
-            'DirectRDP': _(u'Windows Terminal Server (Direct RDP)'),
-            'CUSTOM': _(u'Custom command'),
+            'CINNAMON': _('Cinnamon Desktop (CINNAMON)'),
+            'GNOME': _('GNOME Desktop (GNOME)'),
+            'MATE': _('MATE Desktop (MATE)'),
+            'KDE': _('K Desktop Environment (KDE)'),
+            'LXDE': _('Lightweight X Desktop (LXDE, based on GTK-2)'),
+            'LXQt': _('Lightweight X Desktop (LXQt, based on Qt5)'),
+            'IceWM': _('IceWM Desktop'),
+            'TRINITY': _('Trinity X Desktop (KDE3-like)'),
+            'UNITY': _('Unity X Desktop Shell (UNITY)'),
+            'XFCE': _('XFCE Desktop (XFCE)'),
+            'PUBLISHEDAPPLICATIONS': _('Published Applications'),
+            'APPLICATION': _('Single Application'),
+            'SHADOW': _('X2Go/X11 Desktop Sharing (SHADOW)'),
+            'XDMCP': _('XDMCP Query'),
+            'RDP': _('Windows Terminal Server (X2Go-proxied RDP)'),
+            'DirectRDP': _('Windows Terminal Server (Direct RDP)'),
+            'CUSTOM': _('Custom command'),
             }
         if self.action == 'EDIT_CONNECTED':
             del self.sessionChoices['DirectRDP']
         self.applicationChoices = {
-            'WWWBROWSER': _(u'Internet Browser'),
-            'MAILCLIENT': _(u'Email Client'),
-            'OFFICE': _(u'Office'),
-            'TERMINAL': _(u'Terminal'),
+            'WWWBROWSER': _('Internet Browser'),
+            'MAILCLIENT': _('Email Client'),
+            'OFFICE': _('Office'),
+            'TERMINAL': _('Terminal'),
             }
         self.clipboardModeChoices = {
-            'both': _(u'between client and server'),
-            'server': _(u'from server to client only'),
-            'client': _(u'from client to server only'),
-            'none': _(u'not at all')
+            'both': _('between client and server'),
+            'server': _('from server to client only'),
+            'client': _('from client to server only'),
+            'none': _('not at all')
             }
         self.rdpclientChoices = {
-            'rdesktop': u'rdesktop',
-            'xfreerdp': u'xfreerdp',
+            'rdesktop': 'rdesktop',
+            'xfreerdp': 'xfreerdp',
             }
         self.linkChoices = {
             0: 'MODEM',
@@ -127,9 +127,9 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             'pulse': 4713,
         }
         self.mimeboxactionChoices = {
-            'OPEN': _(u'Open file with system\'s default application'),
-            'OPENWITH': _(u'Open application chooser dialog'),
-            'SAVEAS': _(u'Save incoming file as ...'),
+            'OPEN': _('Open file with system\'s default application'),
+            'OPENWITH': _('Open application chooser dialog'),
+            'SAVEAS': _('Save incoming file as ...'),
         }
 
         self._compressions = defaults.pack_methods_nx3_noqual
@@ -165,7 +165,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
 
         # this code block is for compatibility of session profiles prior to 0.2.2.0:
         _from_host = _from_port = _to_host = _to_port = None
-        if self.profile_config.has_key('sshproxytunnel'):
+        if 'sshproxytunnel' in self.profile_config:
             if self.profile_config['sshproxytunnel'].count(':') == 2:
                 _from_port, _to_host, _to_port = self.profile_config['sshproxytunnel'].split(':')
                 _from_host = 'localhost'
@@ -205,34 +205,34 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             self.tab_SharedResources.Enable(False)
 
         # boxes for all tabs
-        self.staticbox_Profile = wx.StaticBox(self.tab_Profile, -1, ' %s ' % _(u'Session Title'))
-        self.staticbox_Window = wx.StaticBox(self.tab_Profile, -1, ' %s ' % _(u'Session Window'))
-        self.staticbox_SessionType = wx.StaticBox(self.tab_Session, -1, ' %s ' % _(u'Session Startup'))
-        self.staticbox_Server = wx.StaticBox(self.tab_Connection, -1, ' %s ' % _(u"Server"))
-        self.staticbox_Proxy = wx.StaticBox(self.tab_Connection, -1, ' %s ' % _(u"Proxy"))
-        self.staticbox_LinkSpeed = wx.StaticBox(self.tab_LinkQuality, -1, ' %s ' % _(u"Connection Link Speed"))
-        self.staticbox_Compression = wx.StaticBox(self.tab_LinkQuality, -1, ' %s ' % _(u"Compression"))
-        self.staticbox_Display = wx.StaticBox(self.tab_IO, -1, ' %s ' % _(u"Display"))
-        self.staticbox_Clipboard = wx.StaticBox(self.tab_IO, -1, ' %s ' % _(u"Clipboard"))
-        self.staticbox_Keyboard = wx.StaticBox(self.tab_IO, -1, ' %s ' % _(u"Keyboard"))
-        self.staticbox_Sound = wx.StaticBox(self.tab_MediaResources, -1, ' %s ' % _(u"Sound"))
-        self.staticbox_Printing = wx.StaticBox(self.tab_MediaResources, -1, ' %s ' % _(u"Printing"))
-        self.staticbox_FolderSharing = wx.StaticBox(self.tab_SharedResources, -1, ' %s ' % _(u"Folder Exports"))
-        self.staticbox_FileMIMEbox = wx.StaticBox(self.tab_SharedResources, -1, ' %s ' % _(u"File Import"))
+        self.staticbox_Profile = wx.StaticBox(self.tab_Profile, -1, ' %s ' % _('Session Title'))
+        self.staticbox_Window = wx.StaticBox(self.tab_Profile, -1, ' %s ' % _('Session Window'))
+        self.staticbox_SessionType = wx.StaticBox(self.tab_Session, -1, ' %s ' % _('Session Startup'))
+        self.staticbox_Server = wx.StaticBox(self.tab_Connection, -1, ' %s ' % _("Server"))
+        self.staticbox_Proxy = wx.StaticBox(self.tab_Connection, -1, ' %s ' % _("Proxy"))
+        self.staticbox_LinkSpeed = wx.StaticBox(self.tab_LinkQuality, -1, ' %s ' % _("Connection Link Speed"))
+        self.staticbox_Compression = wx.StaticBox(self.tab_LinkQuality, -1, ' %s ' % _("Compression"))
+        self.staticbox_Display = wx.StaticBox(self.tab_IO, -1, ' %s ' % _("Display"))
+        self.staticbox_Clipboard = wx.StaticBox(self.tab_IO, -1, ' %s ' % _("Clipboard"))
+        self.staticbox_Keyboard = wx.StaticBox(self.tab_IO, -1, ' %s ' % _("Keyboard"))
+        self.staticbox_Sound = wx.StaticBox(self.tab_MediaResources, -1, ' %s ' % _("Sound"))
+        self.staticbox_Printing = wx.StaticBox(self.tab_MediaResources, -1, ' %s ' % _("Printing"))
+        self.staticbox_FolderSharing = wx.StaticBox(self.tab_SharedResources, -1, ' %s ' % _("Folder Exports"))
+        self.staticbox_FileMIMEbox = wx.StaticBox(self.tab_SharedResources, -1, ' %s ' % _("File Import"))
 
         ###
         ### widgets for the PROFILE tab
         ###
-        self.ProfileNameLabel = wx.StaticText(self.tab_Profile, -1, _(u"Name")+": ")
+        self.ProfileNameLabel = wx.StaticText(self.tab_Profile, -1, _("Name")+": ")
         self.ProfileName = wx.TextCtrl(self.tab_Profile, -1, "")
 
         if self.action in ("ADD_EXPLICITLY", "EDIT_EXPLICITLY"):
             self.ProfileNameLabel.Enable(False)
             self.ProfileName.Enable(False)
 
-        self.SetSessionWindowTitle = wx.CheckBox(self.tab_Profile, -1, _(u"Set session window title"))
-        self.UseDefaultSessionWindowTitle = wx.CheckBox(self.tab_Profile, -1, _(u"Use a default session window title"))
-        self.CustomSessionWindowTitleLabel = wx.StaticText(self.tab_Profile, -1, _(u"Custom session window title") + ": ")
+        self.SetSessionWindowTitle = wx.CheckBox(self.tab_Profile, -1, _("Set session window title"))
+        self.UseDefaultSessionWindowTitle = wx.CheckBox(self.tab_Profile, -1, _("Use a default session window title"))
+        self.CustomSessionWindowTitleLabel = wx.StaticText(self.tab_Profile, -1, _("Custom session window title") + ": ")
         self.CustomSessionWindowTitle = wx.TextCtrl(self.tab_Profile, -1, "")
         path_to_icon = os.path.normpath('%s/%s/128x128/%s_sessionicon.png' % (self._icons_location, self._PyHocaGUI.appname, self._PyHocaGUI.appname))
         self.default_icon = True
@@ -251,151 +251,151 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             path_to_icon = os.path.normpath('%s/PyHoca/128x128/PyHoca-GUI_sessionicon.png' % self._icons_location)
             self.default_icon = True
         self.IconPath = path_to_icon
-        self.IconButtonLabel = wx.StaticText(self.tab_Profile, -1, _(u"Window Icon")+": ")
+        self.IconButtonLabel = wx.StaticText(self.tab_Profile, -1, _("Window Icon")+": ")
         self.IconButton = wx.BitmapButton(self.tab_Profile, -1, wx.Bitmap(os.path.expanduser(path_to_icon), wx.BITMAP_TYPE_ANY), size=wx.Size(136,136), )
 
         ###
         ### widgets for the SESSION tab
         ###
-        self.AutoStartSession = wx.CheckBox(self.tab_Session, -1, _(u"Start session automatically after login"))
-        self.AutoConnectSessionProfile = wx.CheckBox(self.tab_Session, -1, _(u"Login automatically after %s has started (needs --auto-connect)") % self._PyHocaGUI.appname)
-        self.SessionTypeLabel = wx.StaticText(self.tab_Session, -1, _(u"Type")+": ")
-        self.SessionType = wx.ComboBox(self.tab_Session, -1, choices=self.sessionChoices.values(), style=wx.CB_DROPDOWN|wx.CB_READONLY)
-        self.SessionTypeKDrive = wx.CheckBox(self.tab_Session, -1, _(u"Use X2Go KDrive graphical backend (experimental)"))
-        self.ApplicationLabel = wx.StaticText(self.tab_Session, -1, _(u"Application")+": ")
-        self.Application = wx.ComboBox(self.tab_Session, -1, choices=self.applicationChoices.values(), style=wx.CB_DROPDOWN|wx.CB_READONLY)
-        self.CommandLabel = wx.StaticText(self.tab_Session, -1, _(u"Custom command")+": ")
+        self.AutoStartSession = wx.CheckBox(self.tab_Session, -1, _("Start session automatically after login"))
+        self.AutoConnectSessionProfile = wx.CheckBox(self.tab_Session, -1, _("Login automatically after %s has started (needs --auto-connect)") % self._PyHocaGUI.appname)
+        self.SessionTypeLabel = wx.StaticText(self.tab_Session, -1, _("Type")+": ")
+        self.SessionType = wx.ComboBox(self.tab_Session, -1, choices=list(self.sessionChoices.values()), style=wx.CB_DROPDOWN|wx.CB_READONLY)
+        self.SessionTypeKDrive = wx.CheckBox(self.tab_Session, -1, _("Use X2Go KDrive graphical backend (experimental)"))
+        self.ApplicationLabel = wx.StaticText(self.tab_Session, -1, _("Application")+": ")
+        self.Application = wx.ComboBox(self.tab_Session, -1, choices=list(self.applicationChoices.values()), style=wx.CB_DROPDOWN|wx.CB_READONLY)
+        self.CommandLabel = wx.StaticText(self.tab_Session, -1, _("Custom command")+": ")
         self.Command = wx.TextCtrl(self.tab_Session, -1, "", )
-        self.XDMCPServerLabel = wx.StaticText(self.tab_Session, -1, _(u"XDMCP server")+": ")
+        self.XDMCPServerLabel = wx.StaticText(self.tab_Session, -1, _("XDMCP server")+": ")
         self.XDMCPServer = wx.TextCtrl(self.tab_Session, -1, "", )
-        self.RDPServerLabel = wx.StaticText(self.tab_Session, -1, _(u"RDP server")+": ")
+        self.RDPServerLabel = wx.StaticText(self.tab_Session, -1, _("RDP server")+": ")
         self.RDPServer = wx.TextCtrl(self.tab_Session, -1, "", )
-        self.RDPOptionsLabel = wx.StaticText(self.tab_Session, -1, _(u"RDP options")+": ")
+        self.RDPOptionsLabel = wx.StaticText(self.tab_Session, -1, _("RDP options")+": ")
         self.RDPOptions = wx.TextCtrl(self.tab_Session, -1, "", )
-        self.RootlessSession = wx.CheckBox(self.tab_Session, -1, _(u"Integrate remote application(s) into local desktop (rootless mode)"))
-        self.UsePublishedApplications = wx.CheckBox(self.tab_Session, -1, _(u"Menu of published applications"))
+        self.RootlessSession = wx.CheckBox(self.tab_Session, -1, _("Integrate remote application(s) into local desktop (rootless mode)"))
+        self.UsePublishedApplications = wx.CheckBox(self.tab_Session, -1, _("Menu of published applications"))
         self._last_pubapp_value = None
         self._last_auto_start_value = None
 
         ###
         ### widgets for the CONNECTION tab
         ###
-        self.UserNameLabel = wx.StaticText(self.tab_Connection, -1, _(u"User")+": ")
+        self.UserNameLabel = wx.StaticText(self.tab_Connection, -1, _("User")+": ")
         self.UserName = wx.TextCtrl(self.tab_Connection, -1, "", size=wx.Size(200,20))
-        self.HostLabel = wx.StaticText(self.tab_Connection, -1, _(u"Host")+": ")
+        self.HostLabel = wx.StaticText(self.tab_Connection, -1, _("Host")+": ")
         self.Host = wx.TextCtrl(self.tab_Connection, -1, "", size=wx.Size(200,20))
-        self.SSHPortLabel = wx.StaticText(self.tab_Connection, -1, _(u"Port")+": ")
+        self.SSHPortLabel = wx.StaticText(self.tab_Connection, -1, _("Port")+": ")
         self.SSHPort = wx.SpinCtrl(self.tab_Connection, -1, "22", min=1, max=65534)
-        self.SSHKeyFileLabel = wx.StaticText(self.tab_Connection, -1, _(u"Key")+": ")
+        self.SSHKeyFileLabel = wx.StaticText(self.tab_Connection, -1, _("Key")+": ")
         self.SSHKeyFile = wx.TextCtrl(self.tab_Connection, -1, style=wx.TE_PROCESS_ENTER)
         self.SSHKeyFileBrowseButton = wx.BitmapButton(self.tab_Connection, -1, wx.Bitmap('%s/PyHoca/16x16/system-search.png' % self._icons_location, wx.BITMAP_TYPE_ANY), size=wx.Size(self._textfield_height,self._textfield_height), )
-        self.SSHAutoLogin = wx.CheckBox(self.tab_Connection, -1, _(u"Discover SSH keys or use SSH agent for X2Go authentication"))
+        self.SSHAutoLogin = wx.CheckBox(self.tab_Connection, -1, _("Discover SSH keys or use SSH agent for X2Go authentication"))
         if PARAMIKO_FEATURE['forward-ssh-agent']:
-            self.SSHForwardAuthAgent = wx.CheckBox(self.tab_Connection, -1, _(u"Enable forwarding of SSH authentication agent connections"))
-        self.UniqueHostKeyAliases = wx.CheckBox(self.tab_Connection, -1, _(u"Store SSH host keys under (unique) X2Go session profile ID"))
-        self.UseSSHProxy = wx.CheckBox(self.tab_Connection, -1, _(u"Server behind SSH proxy"))
-        self.SSHProxyUserLabel = wx.StaticText(self.tab_Connection, -1, _(u"User")+": ")
+            self.SSHForwardAuthAgent = wx.CheckBox(self.tab_Connection, -1, _("Enable forwarding of SSH authentication agent connections"))
+        self.UniqueHostKeyAliases = wx.CheckBox(self.tab_Connection, -1, _("Store SSH host keys under (unique) X2Go session profile ID"))
+        self.UseSSHProxy = wx.CheckBox(self.tab_Connection, -1, _("Server behind SSH proxy"))
+        self.SSHProxyUserLabel = wx.StaticText(self.tab_Connection, -1, _("User")+": ")
         self.SSHProxyUser = wx.TextCtrl(self.tab_Connection, -1, "", size=wx.Size(80,20))
-        self.SSHProxySameUser = wx.CheckBox(self.tab_Connection, -1, _(u"Use same username for X2Go and proxy host"))
-        self.SSHProxySamePassword = wx.CheckBox(self.tab_Connection, -1, _(u"Use same authentication for X2Go and proxy host"))
-        self.SSHProxyKeyFileLabel = wx.StaticText(self.tab_Connection, -1, _(u"Key file")+": ")
+        self.SSHProxySameUser = wx.CheckBox(self.tab_Connection, -1, _("Use same username for X2Go and proxy host"))
+        self.SSHProxySamePassword = wx.CheckBox(self.tab_Connection, -1, _("Use same authentication for X2Go and proxy host"))
+        self.SSHProxyKeyFileLabel = wx.StaticText(self.tab_Connection, -1, _("Key file")+": ")
         self.SSHProxyKeyFile = wx.TextCtrl(self.tab_Connection, -1, style=wx.TE_PROCESS_ENTER)
         self.SSHProxyKeyFileBrowseButton = wx.BitmapButton(self.tab_Connection, -1, wx.Bitmap('%s/PyHoca/16x16/system-search.png' % self._icons_location, wx.BITMAP_TYPE_ANY), size=wx.Size(self._textfield_height,self._textfield_height), )
-        self.SSHProxyHostLabel = wx.StaticText(self.tab_Connection, -1, _(u"Host")+": ")
+        self.SSHProxyHostLabel = wx.StaticText(self.tab_Connection, -1, _("Host")+": ")
         self.SSHProxyHost = wx.TextCtrl(self.tab_Connection, -1, "", size=wx.Size(80,20))
-        self.SSHProxyPortLabel = wx.StaticText(self.tab_Connection, -1, _(u"Port")+": ")
+        self.SSHProxyPortLabel = wx.StaticText(self.tab_Connection, -1, _("Port")+": ")
         self.SSHProxyPort = wx.SpinCtrl(self.tab_Connection, -1, "22", min=1, max=65534)
-        self.SSHProxyAutoLogin = wx.CheckBox(self.tab_Connection, -1, _(u"Discover SSH keys or use SSH agent for proxy authentication"))
+        self.SSHProxyAutoLogin = wx.CheckBox(self.tab_Connection, -1, _("Discover SSH keys or use SSH agent for proxy authentication"))
 
         self.LinkSpeed = wx.Slider(self.tab_LinkQuality, -1, 0, 0, 4)
-        self.ModemLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n "+_(u"Modem"), style=wx.ALIGN_CENTRE)
-        self.ISDNLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n "+_(u"ISDN"), style=wx.ALIGN_CENTRE)
-        self.ADSLLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n"+_(u"ADSL"), style=wx.ALIGN_CENTRE)
-        self.WANLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n"+_(u"WAN"), style=wx.ALIGN_CENTRE)
-        self.LANLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n"+_(u"LAN"), style=wx.ALIGN_CENTRE)
-
-        self.CompressionLabel = wx.StaticText(self.tab_LinkQuality, -1, _(u"Method")+": ")
-        self.Compression = wx.ComboBox(self.tab_LinkQuality, -1, choices=self.compressionChoices.values(), style=wx.CB_DROPDOWN)
-        self.ImageQualityLabel = wx.StaticText(self.tab_LinkQuality, -1, _(u"Image quality")+": ")
+        self.ModemLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n "+_("Modem"), style=wx.ALIGN_CENTRE)
+        self.ISDNLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n "+_("ISDN"), style=wx.ALIGN_CENTRE)
+        self.ADSLLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n"+_("ADSL"), style=wx.ALIGN_CENTRE)
+        self.WANLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n"+_("WAN"), style=wx.ALIGN_CENTRE)
+        self.LANLabel = wx.StaticText(self.tab_LinkQuality, -1, "|\n"+_("LAN"), style=wx.ALIGN_CENTRE)
+
+        self.CompressionLabel = wx.StaticText(self.tab_LinkQuality, -1, _("Method")+": ")
+        self.Compression = wx.ComboBox(self.tab_LinkQuality, -1, choices=list(self.compressionChoices.values()), style=wx.CB_DROPDOWN)
+        self.ImageQualityLabel = wx.StaticText(self.tab_LinkQuality, -1, _("Image quality")+": ")
         self.ImageQuality = wx.SpinCtrl(self.tab_LinkQuality, -1, "9", min=0, max=9)
 
         ###
         ### wigdets for the IO tab
         ###
-        self.DisplayTypeFullscreen = wx.RadioButton(self.tab_IO, -1, _(u"Fullscreen"), style=wx.RB_GROUP)
-        self.DisplayTypeMaximize = wx.RadioButton(self.tab_IO, -1, _(u"Maximized"))
-        self.DisplayTypeCustom = wx.RadioButton(self.tab_IO, -1, _(u"Custom Size")+": ")
+        self.DisplayTypeFullscreen = wx.RadioButton(self.tab_IO, -1, _("Fullscreen"), style=wx.RB_GROUP)
+        self.DisplayTypeMaximize = wx.RadioButton(self.tab_IO, -1, _("Maximized"))
+        self.DisplayTypeCustom = wx.RadioButton(self.tab_IO, -1, _("Custom Size")+": ")
         self.ScreenWidthLabel = wx.StaticText(self.tab_IO, -1, '')
         self.ScreenWidth = wx.SpinCtrl(self.tab_IO, -1, "800", min=400, max=3000)
         self.ScreenHeightLabel = wx.StaticText(self.tab_IO, -1, "x")
         self.ScreenHeight = wx.SpinCtrl(self.tab_IO, -1, "600", min=500, max=3000)
-        self.SetDisplayDPI = wx.CheckBox(self.tab_IO, -1, _(u"Set display DPI")+": ")
+        self.SetDisplayDPI = wx.CheckBox(self.tab_IO, -1, _("Set display DPI")+": ")
         self.DisplayDPI = wx.SpinCtrl(self.tab_IO, -1, "96", min=32, max=512)
-        self.EnableXinerama = wx.CheckBox(self.tab_IO, -1, _(u"Xinerama extension (support for two or more physical displays)"))
-        self.ClipboardModeLabel = wx.StaticText(self.tab_IO, -1, _(u"Allow copy'n'paste")+": ")
-        self.ClipboardMode = wx.ComboBox(self.tab_IO, -1, choices=self.clipboardModeChoices.values(), style=wx.CB_DROPDOWN|wx.CB_READONLY)
-        self.DontSetKeyboard = wx.RadioButton(self.tab_IO, -1, label=_(u"Do not set (use server-side tools to configure the keyboard)"), style=wx.RB_GROUP)
-        self.AutoSetKeyboard = wx.RadioButton(self.tab_IO, -1, label=_(u"Automatically detect and use client-side keyboard configuration inside the session"))
-        self.CustomSetKeyboard = wx.RadioButton(self.tab_IO, -1, label=_(u"Use custom keyboard settings as provided below") + ": ")
-        self.KeyboardModelLabel = wx.StaticText(self.tab_IO, -1, _(u"Keyboard model")+": ")
+        self.EnableXinerama = wx.CheckBox(self.tab_IO, -1, _("Xinerama extension (support for two or more physical displays)"))
+        self.ClipboardModeLabel = wx.StaticText(self.tab_IO, -1, _("Allow copy'n'paste")+": ")
+        self.ClipboardMode = wx.ComboBox(self.tab_IO, -1, choices=list(self.clipboardModeChoices.values()), style=wx.CB_DROPDOWN|wx.CB_READONLY)
+        self.DontSetKeyboard = wx.RadioButton(self.tab_IO, -1, label=_("Do not set (use server-side tools to configure the keyboard)"), style=wx.RB_GROUP)
+        self.AutoSetKeyboard = wx.RadioButton(self.tab_IO, -1, label=_("Automatically detect and use client-side keyboard configuration inside the session"))
+        self.CustomSetKeyboard = wx.RadioButton(self.tab_IO, -1, label=_("Use custom keyboard settings as provided below") + ": ")
+        self.KeyboardModelLabel = wx.StaticText(self.tab_IO, -1, _("Keyboard model")+": ")
         self.KeyboardModel = wx.TextCtrl(self.tab_IO, -1, "")
-        self.KeyboardLayoutLabel = wx.StaticText(self.tab_IO, -1, _(u"Layout")+": ")
+        self.KeyboardLayoutLabel = wx.StaticText(self.tab_IO, -1, _("Layout")+": ")
         self.KeyboardLayout = wx.TextCtrl(self.tab_IO, -1, "")
-        self.KeyboardVariantLabel = wx.StaticText(self.tab_IO, -1, _(u"Layout variant")+": ")
+        self.KeyboardVariantLabel = wx.StaticText(self.tab_IO, -1, _("Layout variant")+": ")
         self.KeyboardVariant = wx.TextCtrl(self.tab_IO, -1, "")
         ###
         ### wigdets for the MEDIA tab
         ###
-        self.EnableSound = wx.CheckBox(self.tab_MediaResources, -1, _(u"Enable sound support"))
-        self.PulseAudio = wx.RadioButton(self.tab_MediaResources, -1, _(u"Pulse Audio"), style=wx.RB_GROUP)
+        self.EnableSound = wx.CheckBox(self.tab_MediaResources, -1, _("Enable sound support"))
+        self.PulseAudio = wx.RadioButton(self.tab_MediaResources, -1, _("Pulse Audio"), style=wx.RB_GROUP)
 
         # Arts daemon is not supported by PyHoca-GUI / Python X2Go as it is outdated.
         # However, config files can contain an Arts configuration, so we will honour this
-        self.Arts = wx.RadioButton(self.tab_MediaResources, -1, _(u"Arts (not supported)"))
+        self.Arts = wx.RadioButton(self.tab_MediaResources, -1, _("Arts (not supported)"))
         self.Arts.Enable(False)
 
-        self.Esd = wx.RadioButton(self.tab_MediaResources, -1, _(u"esd"))
-        self.DefaultSoundPort = wx.CheckBox(self.tab_MediaResources, -1, _(u"Use default sound port"))
-        self.SoundPortLabel = wx.StaticText(self.tab_MediaResources, -1, _(u"Custom sound port")+": ")
+        self.Esd = wx.RadioButton(self.tab_MediaResources, -1, _("esd"))
+        self.DefaultSoundPort = wx.CheckBox(self.tab_MediaResources, -1, _("Use default sound port"))
+        self.SoundPortLabel = wx.StaticText(self.tab_MediaResources, -1, _("Custom sound port")+": ")
         self.SoundPort = wx.SpinCtrl(self.tab_MediaResources, -1, "4713", min=23, max=64889)
 
-        self.ClientSidePrinting = wx.CheckBox(self.tab_MediaResources, -1, _(u"Client Side printing"))
+        self.ClientSidePrinting = wx.CheckBox(self.tab_MediaResources, -1, _("Client Side printing"))
 
         ###
         ### wigdets for the SHARING tab
         ###
 
-        self.UseLocalFolderSharing = wx.CheckBox(self.tab_SharedResources, -1, _(u"Use local folder sharing"))
-        self.RestoreSharedLocalFolders = wx.CheckBox(self.tab_SharedResources, -1, _(u"Store share list at end of session"))
-        self.SharedFolderPathLabel = wx.StaticText(self.tab_SharedResources, -1, _(u"Path")+": ")
+        self.UseLocalFolderSharing = wx.CheckBox(self.tab_SharedResources, -1, _("Use local folder sharing"))
+        self.RestoreSharedLocalFolders = wx.CheckBox(self.tab_SharedResources, -1, _("Store share list at end of session"))
+        self.SharedFolderPathLabel = wx.StaticText(self.tab_SharedResources, -1, _("Path")+": ")
         self.SharedFolderPath = wx.TextCtrl(self.tab_SharedResources, -1, "", style=wx.TE_PROCESS_ENTER)
         self.SharedFolderPathBrowseButton = wx.BitmapButton(self.tab_SharedResources, -1, wx.Bitmap('%s/PyHoca/16x16/system-search.png' % self._icons_location, wx.BITMAP_TYPE_ANY), size=wx.Size(self._textfield_height,self._textfield_height), )
-        self.AddSharedFolderPathButton = wx.Button(self.tab_SharedResources, -1, _(u"Add"))
+        self.AddSharedFolderPathButton = wx.Button(self.tab_SharedResources, -1, _("Add"))
         self.SharedFoldersList = CheckListCtrl(self.tab_SharedResources)
         self.SharedFoldersList.InsertColumn(0, _("Local Path"), wx.LIST_FORMAT_LEFT)
         self.SharedFoldersList.InsertColumn(1, _("Connect Method"), wx.LIST_FORMAT_CENTER)
-        self.DeleteSharedFolderPathButton = wx.Button(self.tab_SharedResources, -1, _(u"Delete"))
+        self.DeleteSharedFolderPathButton = wx.Button(self.tab_SharedResources, -1, _("Delete"))
 
-        self.UseEncodingConverter = wx.CheckBox(self.tab_SharedResources, -1, _(u"Convert between client and server encodings"))
-        self.ClientEncodingLabel = wx.StaticText(self.tab_SharedResources, -1, _(u"Client encoding")+": ")
+        self.UseEncodingConverter = wx.CheckBox(self.tab_SharedResources, -1, _("Convert between client and server encodings"))
+        self.ClientEncodingLabel = wx.StaticText(self.tab_SharedResources, -1, _("Client encoding")+": ")
         self.ClientEncoding = wx.ComboBox(self.tab_SharedResources, -1, choices=_known_encodings, style=wx.CB_DROPDOWN|wx.CB_READONLY)
-        self.ServerEncodingLabel = wx.StaticText(self.tab_SharedResources, -1, _(u"Server encoding")+": ")
+        self.ServerEncodingLabel = wx.StaticText(self.tab_SharedResources, -1, _("Server encoding")+": ")
         self.ServerEncoding = wx.ComboBox(self.tab_SharedResources, -1, choices=_known_encodings, style=wx.CB_DROPDOWN|wx.CB_READONLY)
 
-        self.UseFileMIMEbox = wx.CheckBox(self.tab_SharedResources, -1, _(u"Use file MIME box for local file import"))
-        self.FileMIMEboxExtensionsLabel = wx.StaticText(self.tab_SharedResources, -1, _(u"Extensions")+": ")
+        self.UseFileMIMEbox = wx.CheckBox(self.tab_SharedResources, -1, _("Use file MIME box for local file import"))
+        self.FileMIMEboxExtensionsLabel = wx.StaticText(self.tab_SharedResources, -1, _("Extensions")+": ")
         self.FileMIMEboxExtensions = wx.TextCtrl(self.tab_SharedResources, -1, "", style=wx.TE_PROCESS_ENTER)
-        self.FileMIMEboxActionLabel = wx.StaticText(self.tab_SharedResources, -1, _(u"Action")+": ")
-        self.FileMIMEboxAction = wx.ComboBox(self.tab_SharedResources, -1, choices=self.mimeboxactionChoices.values(), style=wx.CB_DROPDOWN|wx.CB_READONLY)
+        self.FileMIMEboxActionLabel = wx.StaticText(self.tab_SharedResources, -1, _("Action")+": ")
+        self.FileMIMEboxAction = wx.ComboBox(self.tab_SharedResources, -1, choices=list(self.mimeboxactionChoices.values()), style=wx.CB_DROPDOWN|wx.CB_READONLY)
 
         if self.action == 'ADD':
-            self.OKButton = wx.Button(self, -1, _(u"Add"))
-            self.DefaultButton = wx.Button(self, -1, _(u'Defaults'))
+            self.OKButton = wx.Button(self, -1, _("Add"))
+            self.DefaultButton = wx.Button(self, -1, _('Defaults'))
         else:
-            self.OKButton = wx.Button(self, -1, _(u"Save"))
-            self.DefaultButton = wx.Button(self, -1, _(u'Reset'))
-        self.ApplyButton = wx.Button(self, -1, _(u"Apply"))
-        self.CancelButton = wx.Button(self, -1, _(u"Cancel"))
+            self.OKButton = wx.Button(self, -1, _("Save"))
+            self.DefaultButton = wx.Button(self, -1, _('Reset'))
+        self.ApplyButton = wx.Button(self, -1, _("Apply"))
+        self.CancelButton = wx.Button(self, -1, _("Cancel"))
         if self.session_profiles.is_mutable(self.profile_id):
             self.OKButton.SetDefault()
         elif self.action.startswith('ADD'):
@@ -466,17 +466,17 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
 
         """
         if self.action == 'ADD':
-            self.SetTitle(_(u"%s Profile Manager - new profile") % self._PyHocaGUI.appname)
+            self.SetTitle(_("%s Profile Manager - new profile") % self._PyHocaGUI.appname)
         elif self.action == 'EDIT_CONNECTED':
             if self._PyHocaGUI.session_profiles.is_mutable(profile_id=self.profile_id):
-                self.SetTitle(_(u"%s Profile Manager - %s (connected)") % (self._PyHocaGUI.appname, self.profile_config['name']))
+                self.SetTitle(_("%s Profile Manager - %s (connected)") % (self._PyHocaGUI.appname, self.profile_config['name']))
             else:
-                self.SetTitle(_(u"%s Profile Manager - %s (connected, immutable)") % (self._PyHocaGUI.appname, self.profile_config['name']))
+                self.SetTitle(_("%s Profile Manager - %s (connected, immutable)") % (self._PyHocaGUI.appname, self.profile_config['name']))
         else:
             if self._PyHocaGUI.session_profiles.is_mutable(profile_id=self.profile_id):
-                self.SetTitle(_(u"%s Profile Manager - %s") % (self._PyHocaGUI.appname, self.profile_config['name']))
+                self.SetTitle(_("%s Profile Manager - %s") % (self._PyHocaGUI.appname, self.profile_config['name']))
             else:
-                self.SetTitle(_(u"%s Profile Manager - %s (immutable)") % (self._PyHocaGUI.appname, self.profile_config['name']))
+                self.SetTitle(_("%s Profile Manager - %s (immutable)") % (self._PyHocaGUI.appname, self.profile_config['name']))
         self.SetFont(wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
         self._textfield_height = 30
 
@@ -863,13 +863,13 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         self.tab_SharedResources.SetSizerAndFit(sizer_7)
         self.tab_SharedResources.Layout()
 
-        self.X2GoTabs.AddPage(self.tab_Profile, _(u"Profile"))
-        self.X2GoTabs.AddPage(self.tab_Session, _(u"Session"))
-        self.X2GoTabs.AddPage(self.tab_Connection, _(u"Connection"))
-        self.X2GoTabs.AddPage(self.tab_LinkQuality, _(u"Link Quality"))
-        self.X2GoTabs.AddPage(self.tab_IO, _(u"Input/Output"))
-        self.X2GoTabs.AddPage(self.tab_MediaResources, _(u"Media"))
-        self.X2GoTabs.AddPage(self.tab_SharedResources, _(u"Sharing"))
+        self.X2GoTabs.AddPage(self.tab_Profile, _("Profile"))
+        self.X2GoTabs.AddPage(self.tab_Session, _("Session"))
+        self.X2GoTabs.AddPage(self.tab_Connection, _("Connection"))
+        self.X2GoTabs.AddPage(self.tab_LinkQuality, _("Link Quality"))
+        self.X2GoTabs.AddPage(self.tab_IO, _("Input/Output"))
+        self.X2GoTabs.AddPage(self.tab_MediaResources, _("Media"))
+        self.X2GoTabs.AddPage(self.tab_SharedResources, _("Sharing"))
 
         # the bottom area with OK, Defaults and Cancel buttons
         sizer_B = wx.BoxSizer(wx.HORIZONTAL)
@@ -915,7 +915,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         self.SetSessionWindowTitle.SetValue(self.profile_config['setsessiontitle'])
         self.CustomSessionWindowTitle.SetValue(self.profile_config['sessiontitle'])
 
-        if type(self.profile_config['host']) is types.ListType:
+        if type(self.profile_config['host']) is list:
             self.Host.SetValue(",".join(self.profile_config['host']))
         else:
             self.Host.SetValue(self.profile_config['host'])
@@ -980,7 +980,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         self.RootlessSession.Enable(False)
 
         self.UsePublishedApplications.SetValue(_published)
-        self.Application.SetItems(self.applicationChoices.values())
+        self.Application.SetItems(list(self.applicationChoices.values()))
         self.SessionTypeKDrive.Enable(True)
         self.SessionTypeKDrive.SetValue(self.profile_config['kdrive'])
         # XFCE4 has been renamed to XFCE for 0.2.1.0
@@ -996,13 +996,13 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             self.AutoStartSession.SetValue(False)
             self.SessionTypeKDrive.Enable(False)
             self.SessionTypeKDrive.SetValue(False)
-        elif _command in self.sessionChoices.keys():
+        elif _command in list(self.sessionChoices.keys()):
             self.SessionType.SetValue(self.sessionChoices[_command])
             self.Application.SetValue('')
             self.Command.SetValue('')
-            if _command not in defaults.X2GO_DESKTOPSESSIONS.keys():
+            if _command not in list(defaults.X2GO_DESKTOPSESSIONS.keys()):
                 self.RootlessSession.SetValue(True)
-        elif _command in self.applicationChoices.keys():
+        elif _command in list(self.applicationChoices.keys()):
             self.SessionType.SetValue(self.sessionChoices['APPLICATION'])
             self.ApplicationLabel.Enable(True)
             self.Application.Enable(True)
@@ -1066,15 +1066,15 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         else:
             self.DontSetKeyboard.SetValue(True)
         if self.profile_config['type'] == 'auto':
-            self.KeyboardModel.SetValue(_(u'<xkbtype>'))
-            self.KeyboardLayout.SetValue(_(u'<xkblayout>'))
-            self.KeyboardVariant.SetValue(_(u'<xkbvariant>'))
+            self.KeyboardModel.SetValue(_('<xkbtype>'))
+            self.KeyboardLayout.SetValue(_('<xkblayout>'))
+            self.KeyboardVariant.SetValue(_('<xkbvariant>'))
         else:
             self.KeyboardModel.SetValue(self.profile_config['type'])
             self.KeyboardLayout.SetValue(self.profile_config['layout'])
             self.KeyboardVariant.SetValue(self.profile_config['variant'])
 
-        if self.profile_config['clipboard'] in self.clipboardModeChoices.keys():
+        if self.profile_config['clipboard'] in list(self.clipboardModeChoices.keys()):
             self.ClipboardMode.SetValue(self.clipboardModeChoices[self.profile_config['clipboard']])
         else:
             self.ClipboardMode.SetValue(self.clipboardModeChoices['both'])
@@ -1209,7 +1209,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         #    self.profile_config['export'] = self.profile_config['export'].replace(',', ';')
 
         # strip off whitespaces and ";" from beginning and end of string
-        _shared_folders = self.profile_config['export'].keys()
+        _shared_folders = list(self.profile_config['export'].keys())
 
         for _shared_folder_path in _shared_folders:
 
@@ -1241,7 +1241,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             self.staticbox_FileMIMEbox.Enable(False)
 
         self.FileMIMEboxExtensions.SetValue(self.profile_config['mimeboxextensions'])
-        if self.profile_config['mimeboxaction'] in self.mimeboxactionChoices.keys():
+        if self.profile_config['mimeboxaction'] in list(self.mimeboxactionChoices.keys()):
             self.FileMIMEboxAction.SetValue(self.mimeboxactionChoices[self.profile_config['mimeboxaction']])
         else:
             self.FileMIMEboxAction.SetValue(self.mimeboxactionChoices['OPEN'])
@@ -1249,7 +1249,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
 
         self.disable_EditConnected_options()
 
-        self._last_session_type = [ i for i in self.sessionChoices.keys() if self.sessionChoices[i] == self.SessionType.GetValue() ][0]
+        self._last_session_type = [ i for i in list(self.sessionChoices.keys()) if self.sessionChoices[i] == self.SessionType.GetValue() ][0]
 
     def _toggle_DisplayProperties(self):
         """\
@@ -1358,7 +1358,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         """
         self.profile_config['name'] = self.ProfileName.GetValue()
         self.profile_config['setsessiontitle'] = self.SetSessionWindowTitle.GetValue()
-        _session_type = [ s for s in self.sessionChoices.keys() if self.sessionChoices[s] == self.SessionType.GetValue() ][0]
+        _session_type = [ s for s in list(self.sessionChoices.keys()) if self.sessionChoices[s] == self.SessionType.GetValue() ][0]
         self.profile_config['kdrive'] = self.SessionTypeKDrive.GetValue()
         if self.UseDefaultSessionWindowTitle.GetValue():
             self.profile_config['sessiontitle'] = ''
@@ -1402,10 +1402,10 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         else:
             self.profile_config['sshproxykeyfile'] = self.SSHProxyKeyFile.GetValue()
 
-        self.profile_config['applications'] = self.applicationChoices.keys()
+        self.profile_config['applications'] = list(self.applicationChoices.keys())
         self.profile_config['directrdp'] = False
         if _session_type == 'APPLICATION':
-            _command = [ a for a in self.applicationChoices.keys() if self.applicationChoices[a] == self.Application.GetValue() ][0]
+            _command = [ a for a in list(self.applicationChoices.keys()) if self.applicationChoices[a] == self.Application.GetValue() ][0]
             self.profile_config['rootless'] = True
         elif _session_type == 'CUSTOM':
             _command = self.Command.GetValue()
@@ -1423,7 +1423,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             self.profile_config['directrdp'] = True
             self.profile_config['directrdpsettings'] = self.RDPOptions.GetValue()
             self.profile_config['rdpport'] = self.SSHPort.GetValue()
-            self.profile_config['rdpclient'] = [ rc for rc in self.rdpclientChoices.keys() if self.rdpclientChoices[rc] == self.Application.GetValue() ][0]
+            self.profile_config['rdpclient'] = [ rc for rc in list(self.rdpclientChoices.keys()) if self.rdpclientChoices[rc] == self.Application.GetValue() ][0]
         elif _session_type == 'PUBLISHEDAPPLICATIONS':
             _command = ""
             self.profile_config['rootless'] = True
@@ -1451,7 +1451,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
 
         self.profile_config['xinerama'] = self.EnableXinerama.GetValue()
 
-        self.profile_config['clipboard'] = [ m for m in self.clipboardModeChoices.keys() if self.clipboardModeChoices[m] == self.ClipboardMode.GetValue() ][0]
+        self.profile_config['clipboard'] = [ m for m in list(self.clipboardModeChoices.keys()) if self.clipboardModeChoices[m] == self.ClipboardMode.GetValue() ][0]
 
         self.profile_config['usekbd'] = self.CustomSetKeyboard.GetValue() or self.AutoSetKeyboard.GetValue()
         self.profile_config['type'] = self.AutoSetKeyboard.GetValue() and "auto" or self.KeyboardModel.GetValue()
@@ -1484,7 +1484,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             _item_id = self.SharedFoldersList.GetNextItem(_item_id)
 
         if _shared_folders:
-            self.profile_config['export'] = '"' + ';'.join([ '%s:%s' % (_sf,int(_shared_folders[_sf])) for _sf in _shared_folders.keys() ]) + ';"'
+            self.profile_config['export'] = '"' + ';'.join([ '%s:%s' % (_sf,int(_shared_folders[_sf])) for _sf in list(_shared_folders.keys()) ]) + ';"'
         else:
             self.profile_config['export'] = ''
         self.profile_config['useiconv'] = self.UseEncodingConverter.GetValue()
@@ -1502,7 +1502,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
                 _normalized_exts.append(_ext)
         self.profile_config['mimeboxextensions'] = ','.join(_normalized_exts)
         try:
-            _mimebox_action = [ a for a in self.mimeboxactionChoices.keys() if self.mimeboxactionChoices[a] == self.FileMIMEboxAction.GetValue() ][0]
+            _mimebox_action = [ a for a in list(self.mimeboxactionChoices.keys()) if self.mimeboxactionChoices[a] == self.FileMIMEboxAction.GetValue() ][0]
         except IndexError:
             _mimebox_action = 'OPEN'
         self.profile_config['mimeboxaction'] = _mimebox_action
@@ -1537,10 +1537,10 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         iconsdir = self._icons_location
         if not os.path.exists(iconsdir):
             iconsdir = os.getcwd()
-        wildcard = _(u"Icon Files (*.png)|*.png|" \
-                     u"All files (*.*)|*")
+        wildcard = _("Icon Files (*.png)|*.png|" \
+                     "All files (*.*)|*")
         dlg = wx.FileDialog(
-            self, message=_(u"Choose an icon for this session profile"), defaultDir=iconsdir,
+            self, message=_("Choose an icon for this session profile"), defaultDir=iconsdir,
             defaultFile="", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR )
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
@@ -1646,9 +1646,9 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         # only one host address supported
         self.RDPServer.SetValue(_hosts.split(',')[0])
         self.RDPOptions.SetValue(self.profile_config_bak['directrdpsettings'])
-        if self.Application.GetValue() in self.applicationChoices.keys():
+        if self.Application.GetValue() in list(self.applicationChoices.keys()):
             self._last_application = self.Application.GetValue()
-        self.Application.SetItems(self.rdpclientChoices.values())
+        self.Application.SetItems(list(self.rdpclientChoices.values()))
         self.Application.SetValue(self._last_rdpclient)
         self.Application.Enable(True)
 
@@ -1702,9 +1702,9 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             self.tab_SharedResources.Enable(True)
         self.RDPServer.SetValue(self.profile_config_bak['rdpserver'])
         self.RDPOptions.SetValue(self.profile_config_bak['rdpoptions'])
-        if self.Application.GetValue() in self.rdpclientChoices.keys():
+        if self.Application.GetValue() in list(self.rdpclientChoices.keys()):
             self._last_rdpclient = self.Application.GetValue()
-        self.Application.SetItems(self.applicationChoices.values())
+        self.Application.SetItems(list(self.applicationChoices.values()))
         self.Application.SetValue(self._last_application)
 
     def OnSessionTypeSelected(self, event):
@@ -1715,7 +1715,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         @type event: C{obj}
 
         """
-        _session_type = [ i for i in self.sessionChoices.keys() if self.sessionChoices[i] == self.SessionType.GetValue() ][0]
+        _session_type = [ i for i in list(self.sessionChoices.keys()) if self.sessionChoices[i] == self.SessionType.GetValue() ][0]
         if self._last_session_type == 'SHADOW':
 
             self.EnableSound.SetValue(self.profile_config_bak['sound'])
@@ -1757,11 +1757,11 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         self.UsePublishedApplications.Enable(True)
         self.AutoStartSession.Enable(True)
 
-        if _session_type in defaults.X2GO_DESKTOPSESSIONS.keys():
+        if _session_type in list(defaults.X2GO_DESKTOPSESSIONS.keys()):
             self.RootlessSession.SetValue(False)
             self.RootlessSession.Enable(False)
             self.SessionTypeKDrive.Enable(True)
-            if _session_type in defaults.X2GO_DESKTOPSESSIONS_KDRIVE_PREFERRED.keys():
+            if _session_type in list(defaults.X2GO_DESKTOPSESSIONS_KDRIVE_PREFERRED.keys()):
                 self.SessionTypeKDrive.SetValue(True)
             else:
                 self.SessionTypeKDrive.SetValue(False)
@@ -1994,7 +1994,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         @type event: C{obj}
 
         """
-        if [ k for k in self.sessionChoices.keys() if self.sessionChoices[k] == self.SessionType.GetValue() ][0] == 'DirectRDP':
+        if [ k for k in list(self.sessionChoices.keys()) if self.sessionChoices[k] == self.SessionType.GetValue() ][0] == 'DirectRDP':
             self.RDPServer.SetValue(self.Host.GetValue().split(',')[0])
 
     def OnSSHKeyFileBrowse(self, event):
@@ -2008,9 +2008,9 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         sshdir = os.path.expanduser('~/.ssh')
         if not os.path.exists(sshdir):
             sshdir = os.getcwd()
-        wildcard = _(u"All files (*.*)|*")
+        wildcard = _("All files (*.*)|*")
         dlg = wx.FileDialog(
-            self, message=_(u"Choose a public SSH key"), defaultDir=sshdir,
+            self, message=_("Choose a public SSH key"), defaultDir=sshdir,
             defaultFile="", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR )
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
@@ -2034,7 +2034,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
             sshdir = os.getcwd()
         wildcard = "All files (*.*)|*"
         dlg = wx.FileDialog(
-            self, message=_(u"Choose a public SSH key"), defaultDir=sshdir,
+            self, message=_("Choose a public SSH key"), defaultDir=sshdir,
             defaultFile="", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR )
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
@@ -2207,7 +2207,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         @type event: C{obj}
 
         """
-        _session_type = [ i for i in self.sessionChoices.keys() if self.sessionChoices[i] == self.SessionType.GetValue() ][0]
+        _session_type = [ i for i in list(self.sessionChoices.keys()) if self.sessionChoices[i] == self.SessionType.GetValue() ][0]
         if self.EnableSound.GetValue():
             self.PulseAudio.Enable(True)
             if _session_type != 'DirectRDP':
@@ -2368,7 +2368,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         if not os.path.exists(shared_folder):
             shared_folder = os.getcwd()
         dlg = wx.DirDialog(
-            self, message=_(u"Choose a folder to share within a session"), style=1, defaultPath=shared_folder, )
+            self, message=_("Choose a folder to share within a session"), style=1, defaultPath=shared_folder, )
         # Show the dialog and retrieve the user response. If it is the OK response,
         # process the data.
         if dlg.ShowModal() == wx.ID_OK:
@@ -2496,13 +2496,13 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
         validateOk = True
         if len(self.profile_config['name'].strip()) == 0:
             validateOk = False
-            self._PyHocaGUI.notifier.send(title=_(u'Profile Manager'), text=_(u'Profile name is missing, profile unusable!!!'), icon='profile_error')
+            self._PyHocaGUI.notifier.send(title=_('Profile Manager'), text=_('Profile name is missing, profile unusable!!!'), icon='profile_error')
         elif self.profile_config['name'].strip() in self.session_profiles.profile_names and self.action == 'ADD':
             validateOk = False
-            self._PyHocaGUI.notifier.send(title=_(u'Profile Manager'), text=_(u'Profile name %s already exists!!!') % self.profile_config['name'].strip(), icon='profile_error')
+            self._PyHocaGUI.notifier.send(title=_('Profile Manager'), text=_('Profile name %s already exists!!!') % self.profile_config['name'].strip(), icon='profile_error')
         elif self.profile_config['name'].strip() != self.profile_config_bak['name'] and self.profile_config['name'].strip() in self.session_profiles.profile_names:
             validateOk = False
-            self._PyHocaGUI.notifier.send(title=_(u'Profile Manager'), text=_(u'Profile name %s already exists!!!') % self.profile_config['name'].strip(), icon='profile_error')
+            self._PyHocaGUI.notifier.send(title=_('Profile Manager'), text=_('Profile name %s already exists!!!') % self.profile_config['name'].strip(), icon='profile_error')
         return validateOk
 
     def OnApplyButton(self, event):
@@ -2522,7 +2522,7 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
                 if self.action in ('ADD', 'COPY'):
                     self.profile_id = self.session_profiles.add_profile(**self.profile_config)
                 else:
-                    for k in self.profile_config.keys():
+                    for k in list(self.profile_config.keys()):
                         self.session_profiles.update_value(self.profile_id, k, self.profile_config[k])
 
                 self.session_profiles.write_user_config = True
@@ -2530,13 +2530,13 @@ class PyHocaGUI_ProfileManager(wx.Dialog):
                 self.profile_id = self.session_profiles.to_profile_id(self.profile_config['name'])
 
                 if self.action == 'ADD':
-                    self._PyHocaGUI.notifier.send(title=_(u'%s - profile added') % self.profile_config['name'],
-                                                  text=_(u'A new session profile has been added.'),
+                    self._PyHocaGUI.notifier.send(title=_('%s - profile added') % self.profile_config['name'],
+                                                  text=_('A new session profile has been added.'),
                                                   icon='profile_add',
                                                  )
                 elif self.action == 'EDIT':
-                    self._PyHocaGUI.notifier.send(title=_(u'%s - modified') % self.profile_config['name'],
-                                                  text=_(u'Changes to profile have been saved.'),
+                    self._PyHocaGUI.notifier.send(title=_('%s - modified') % self.profile_config['name'],
+                                                  text=_('Changes to profile have been saved.'),
                                                   icon='profile_save',
                                                  )
                 self._PyHocaGUI.register_available_server_sessions_by_profile_name(profile_name=self.profile_config['name'], re_register=True)
diff --git a/pyhoca/wxgui/serverinfo.py b/pyhoca/wxgui/serverinfo.py
index 29b0f5c..37dc915 100644
--- a/pyhoca/wxgui/serverinfo.py
+++ b/pyhoca/wxgui/serverinfo.py
@@ -30,7 +30,7 @@ import os
 # PyHoca-GUI modules
 # ... NONE ...
 
-if os.environ.has_key('DESKTOP_SESSION'):
+if 'DESKTOP_SESSION' in os.environ:
     WINDOW_MANAGER = os.environ['DESKTOP_SESSION']
 else:
     WINDOW_MANAGER = 'generic'
@@ -59,15 +59,15 @@ class PyHocaGUI_DialogBoxServerInfo(wx.Dialog):
         wx.Dialog.__init__(self, None, id=-1, title=profile_name, style=wx.DEFAULT_FRAME_STYLE, )
         self._PyHocaGUI._sub_windows.append(self)
 
-        self.SetTitle(_(u'Server Information - %s') % profile_name)
+        self.SetTitle(_('Server Information - %s') % profile_name)
 
-        self.titleLbl = wx.StaticText(self, wx.ID_ANY, _(u'Session Profile: %s\n\nList of X2Go Server components, add-ons and their versions...') % self.current_profile_name, size=(-1, -1))
+        self.titleLbl = wx.StaticText(self, wx.ID_ANY, _('Session Profile: %s\n\nList of X2Go Server components, add-ons and their versions...') % self.current_profile_name, size=(-1, -1))
 
         self.infoArea = wx.TextCtrl(self, id=-1, value="", size=(520,300), style=wx.TE_READONLY|wx.TE_MULTILINE|wx.SUNKEN_BORDER)
 
         ID_REFRESH = wx.NewId()
-        self.refreshBtn = wx.Button(self, ID_REFRESH, _(u'Refresh'), )
-        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _(u'Close'), )
+        self.refreshBtn = wx.Button(self, ID_REFRESH, _('Refresh'), )
+        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _('Close'), )
 
         self.Bind(wx.EVT_BUTTON, self.OnRefreshServerInfo, self.refreshBtn)
         self.Bind(wx.EVT_BUTTON, self.OnCancel, self.cancelBtn)
@@ -128,34 +128,34 @@ class PyHocaGUI_DialogBoxServerInfo(wx.Dialog):
     def _refreshServerInfo(self):
 
         server_components = self._PyHocaGUI.get_server_components(self.current_profile_name, force=True)
-        server_extensions = [ k for k in server_components.keys() if k.startswith('x2goserver-') and k != 'x2goserver-common' ]
+        server_extensions = [ k for k in list(server_components.keys()) if k.startswith('x2goserver-') and k != 'x2goserver-common' ]
         server_extensions.sort()
-        server_addons = [ k for k in server_components.keys() if not k.startswith('x2goserver') and k != 'x2goagent' ]
+        server_addons = [ k for k in list(server_components.keys()) if not k.startswith('x2goserver') and k != 'x2goagent' ]
         server_addons.sort()
         server_features = self._PyHocaGUI.get_server_features(self.current_profile_name, force=True)
         halftab = '    '
         newline = '\n'
 
-        self.infoArea.AppendText(_(u'X2Go Server')+':'+2*newline)
-        self.infoArea.AppendText(halftab+_(u'Server Core')+':'+newline)
+        self.infoArea.AppendText(_('X2Go Server')+':'+2*newline)
+        self.infoArea.AppendText(halftab+_('Server Core')+':'+newline)
         self.infoArea.AppendText(newline)
         self.infoArea.AppendText(2*halftab+'%s (%s)\n' % ('x2goserver', server_components['x2goserver']))
-        if 'x2goserver-common' in server_components.keys():
+        if 'x2goserver-common' in list(server_components.keys()):
             self.infoArea.AppendText(2*halftab+'%s (%s)\n' % ('x2goserver-common', server_components['x2goserver-common']))
         self.infoArea.AppendText(2*halftab+'%s (%s)\n' % ('x2goagent', server_components['x2goagent']))
         self.infoArea.AppendText('\n')
         if server_extensions:
-            self.infoArea.AppendText(halftab+_(u'Server Extensions')+':'+newline)
+            self.infoArea.AppendText(halftab+_('Server Extensions')+':'+newline)
             self.infoArea.AppendText(newline)
             for comp in server_extensions:
                 self.infoArea.AppendText(2*halftab+'%s (%s)\n' % (comp, server_components[comp]))
         self.infoArea.AppendText('\n')
         if server_addons:
-            self.infoArea.AppendText(_(u'X2Go Server Add-ons')+':'+2*newline)
+            self.infoArea.AppendText(_('X2Go Server Add-ons')+':'+2*newline)
             for comp in server_addons:
                 self.infoArea.AppendText(2*halftab+'%s (%s)\n' % (comp, server_components[comp]))
         self.infoArea.AppendText('\n')
-        self.infoArea.AppendText(_(u'X2Go Server Features')+':'+2*newline)
+        self.infoArea.AppendText(_('X2Go Server Features')+':'+2*newline)
         for feature in server_features:
             self.infoArea.AppendText(2*halftab+'%s\n' % (feature))
         self.infoArea.ShowPosition(0)
diff --git a/pyhoca/wxgui/sessiontitle.py b/pyhoca/wxgui/sessiontitle.py
index ad3cc98..86adb5b 100644
--- a/pyhoca/wxgui/sessiontitle.py
+++ b/pyhoca/wxgui/sessiontitle.py
@@ -30,7 +30,7 @@ import os
 # PyHoca-GUI modules
 # ... NONE ...
 
-if os.environ.has_key('DESKTOP_SESSION'):
+if 'DESKTOP_SESSION' in os.environ:
     WINDOW_MANAGER = os.environ['DESKTOP_SESSION']
 else:
     WINDOW_MANAGER = 'generic'
@@ -63,13 +63,13 @@ class PyHocaGUI_DialogBoxSessionTitle(wx.Dialog):
         wx.Dialog.__init__(self, None, id=-1, title=profile_name, style=wx.DEFAULT_FRAME_STYLE, )
         self._PyHocaGUI._sub_windows.append(self)
 
-        self.SetTitle(_(u'Session Title - %s') % profile_name)
+        self.SetTitle(_('Session Title - %s') % profile_name)
 
-        self.titleLbl = wx.StaticText(self, wx.ID_ANY, _(u'Change session title to')+':', size=(-1, -1))
+        self.titleLbl = wx.StaticText(self, wx.ID_ANY, _('Change session title to')+':', size=(-1, -1))
         self.titleTxt = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PROCESS_ENTER, size=(120, -1))
-        self.okBtn = wx.Button(self, wx.ID_OK, _(u'OK'), )
+        self.okBtn = wx.Button(self, wx.ID_OK, _('OK'), )
         self.okBtn.SetDefault()
-        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _(u'Cancel'), )
+        self.cancelBtn = wx.Button(self, wx.ID_CANCEL, _('Cancel'), )
 
         self.Bind(wx.EVT_BUTTON, self.OnOk, self.okBtn)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnOk, self.titleTxt)
diff --git a/pyhoca/wxgui/splash.py b/pyhoca/wxgui/splash.py
index 684188d..c741560 100644
--- a/pyhoca/wxgui/splash.py
+++ b/pyhoca/wxgui/splash.py
@@ -23,7 +23,7 @@ import wx
 import os
 
 # PyHoca-GUI modules
-import basepath
+from . import basepath
 
 class PyHocaGUI_SplashScreen(wx.SplashScreen):
     """\
diff --git a/pyhoca/wxgui/taskbar.py b/pyhoca/wxgui/taskbar.py
index 51eea5b..23eeab1 100644
--- a/pyhoca/wxgui/taskbar.py
+++ b/pyhoca/wxgui/taskbar.py
@@ -35,8 +35,8 @@ if x2go.X2GOCLIENT_OS == 'Windows':
     import win32gui
 
 # PyHoca-GUI modules
-import menus_taskbar
-import basepath
+from . import menus_taskbar
+from . import basepath
 
 
 def MakeIcon(icon_name, fallback_name='PyHoca-GUI_trayicon.png', appname="PyHoca-GUI"):
@@ -116,11 +116,11 @@ class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
         if x2go.X2GOCLIENT_OS == 'Windows':
             icon_name = self._PyHocaGUI.tray_icon_connecting or self._PyHocaGUI.tray_icon
             self.icon = MakeIcon(icon_name=icon_name, appname=self._PyHocaGUI.appname)
-            self.SetIcon(self.icon, _(u"%s\nConnecting you to ,,%s\'\'") % (self._PyHocaGUI.appname, profile_name))
+            self.SetIcon(self.icon, _("%s\nConnecting you to ,,%s\'\'") % (self._PyHocaGUI.appname, profile_name))
         else:
             icon_name = self._PyHocaGUI.tray_icon_connecting or self._PyHocaGUI.tray_icon
             self.icon = MakeIcon(icon_name=icon_name, appname=self._PyHocaGUI.appname)
-            self.SetIcon(self.icon, _(u"%s\nCurrently connecting you to remote X2Go server ,,%s\'\'") % (self._PyHocaGUI.appname, profile_name))
+            self.SetIcon(self.icon, _("%s\nCurrently connecting you to remote X2Go server ,,%s\'\'") % (self._PyHocaGUI.appname, profile_name))
 
     def SetIconIdle(self):
         """\
@@ -130,11 +130,11 @@ class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
         if x2go.X2GOCLIENT_OS == 'Windows':
             icon_name = self._PyHocaGUI.tray_icon
             self.icon = MakeIcon(icon_name=icon_name, appname=self._PyHocaGUI.appname)
-            self.SetIcon(self.icon, _(u"%s\nConnecting you to X2Go...") % self._PyHocaGUI.appname)
+            self.SetIcon(self.icon, _("%s\nConnecting you to X2Go...") % self._PyHocaGUI.appname)
         else:
             icon_name = self._PyHocaGUI.tray_icon
             self.icon = MakeIcon(icon_name=icon_name, appname=self._PyHocaGUI.appname)
-            self.SetIcon(self.icon, _(u"%s\nClient for connecting you to a remote X2Go server") % self._PyHocaGUI.appname)
+            self.SetIcon(self.icon, _("%s\nClient for connecting you to a remote X2Go server") % self._PyHocaGUI.appname)
 
     def CreateSessionManagerPopupMenu(self, evt):
         """\
diff --git a/setup.py b/setup.py
index 841254b..1ca7b1e 100755
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # vim:fenc=utf-8
 
@@ -35,7 +35,7 @@ PROGRAM_DESC_SHORT = '%s is a graphical X2Go client.' % PROGRAM_NAME
 
 # silence pyflakes with assigning a dummy version here... the real __VERSION__ assignment happens below
 __VERSION__ = '0.0.0.0'
-for line in file(os.path.join('pyhoca', 'wxgui', '__init__.py')).readlines():
+for line in open(os.path.join('pyhoca', 'wxgui', '__init__.py'), 'r').readlines():
     if (line.startswith('__VERSION__')):
         exec(line.strip())
 if platform.system() == 'Windows':
@@ -194,9 +194,9 @@ class build_installer(object):
                             self.dist_dir,
                             UNINSTALL_ICON
                            )
-        print "*** creating the NSIS setup script***"
+        print("*** creating the NSIS setup script***")
         script.create()
-        print "*** compiling the NSIS setup script***"
+        print("*** compiling the NSIS setup script***")
         script.compile()
 
 
@@ -211,7 +211,7 @@ class build_installer_py2exe(build_installer, py2exe):
         # First, let py2exe do it's work.
         py2exe.run(self)
 
-class build_installer_bbfreeze(build_installer, Freezer, Command):
+class build_installer_bbfreeze(build_installer, Command, Freezer):
 
     user_options = [
         ('dist-dir=', 'd',
@@ -255,7 +255,7 @@ class build_installer_bbfreeze(build_installer, Freezer, Command):
         self.setIcon('pixmaps/pyhoca-gui.ico')
         Freezer.__call__(self)
         if self.distribution.has_data_files():
-            print "*** copy data files ***"
+            print("*** copy data files ***")
             install_data = self.reinitialize_command('install_data')
             install_data.install_dir = self.dist_dir
             install_data.ensure_finalized()

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/pyhoca-gui.git


More information about the x2go-commits mailing list