From b5541f78d01ea277d98dd2a3a50063c1315af9e5 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Tue, 13 Mar 2018 23:24:12 +0100
Subject: [PATCH] initial commit to use QT5 instead of QT4

What is NOT done yet:
- OpenGL context of QOpenGLWindow must be made
  active before calling any GL function in scene.cc. The wrong
  GL context is active otherwise.
- cmake polishing
- final grepping for QT4 leftovers
---
 CMakeLists.txt                                |   9 +-
 modules/gui/pymod/CMakeLists.txt              |   3 +-
 modules/gui/pymod/__init__.py                 |  10 +-
 modules/gui/pymod/dng/init.py                 |   6 +-
 modules/gui/pymod/dng/menu.py                 |  23 +-
 modules/gui/pymod/dng/superpositiondialog.py  |  29 ++-
 modules/gui/pymod/dng/termuse.py              |   7 +-
 modules/gui/pymod/export_input.cc             |   2 +-
 modules/gui/pymod/export_tool.cc              |   2 +-
 modules/gui/pymod/helpwidget.py               |  18 +-
 modules/gui/pymod/init_context_menu.py        | 134 ++++++------
 modules/gui/pymod/init_menubar.py             |   2 +-
 modules/gui/pymod/init_spacenav.py            |   2 +-
 modules/gui/pymod/init_splash.py              |  12 +-
 .../gui/pymod/scene/color_options_widget.py   |  36 ++--
 .../gui/pymod/scene/color_select_widget.py    |  24 ++-
 .../gui/pymod/scene/combo_options_widget.py   |  31 ++-
 modules/gui/pymod/scene/cpk_widget.py         |  18 +-
 modules/gui/pymod/scene/custom_widget.py      |  54 ++---
 modules/gui/pymod/scene/file_loader.py        |   2 +-
 .../gui/pymod/scene/gradient_editor_widget.py |  81 +++----
 .../gui/pymod/scene/gradient_info_handler.py  |   4 +-
 .../gui/pymod/scene/gradient_list_model.py    |  14 +-
 .../gui/pymod/scene/gradient_preset_widget.py |  63 +++---
 modules/gui/pymod/scene/hsc_widget.py         | 158 +++++++-------
 .../scene/immutable_gradient_info_handler.py  |   2 +-
 .../gui/pymod/scene/immutable_info_handler.py |  12 +-
 .../scene/immutable_preset_info_handler.py    |   1 -
 modules/gui/pymod/scene/init_inspector.py     |   2 +-
 modules/gui/pymod/scene/inspector_widget.py   |  28 +--
 modules/gui/pymod/scene/line_trace_widget.py  |  22 +-
 modules/gui/pymod/scene/map_level_widget.py   |  46 ++--
 modules/gui/pymod/scene/preset.py             |   1 -
 .../pymod/scene/preset_editor_list_model.py   |   2 +-
 .../gui/pymod/scene/preset_editor_widget.py   | 202 +++++++++---------
 .../gui/pymod/scene/preset_info_handler.py    |   3 +-
 modules/gui/pymod/scene/preset_list_model.py  |  16 +-
 modules/gui/pymod/scene/preset_widget.py      |  52 ++---
 modules/gui/pymod/scene/query_editor.py       |  58 +++--
 modules/gui/pymod/scene/remote.py             |  37 ++--
 modules/gui/pymod/scene/render_mode_widget.py |  12 +-
 modules/gui/pymod/scene/render_op.py          |   1 -
 .../gui/pymod/scene/render_options_widget.py  |  16 +-
 modules/gui/pymod/scene/simple_widget.py      |  32 +--
 modules/gui/pymod/scene/sline_widget.py       |  24 +--
 .../gui/pymod/scene/toolbar_options_widget.py |  27 ++-
 modules/gui/pymod/scene/trace_widget.py       |  28 +--
 modules/gui/pymod/scene/tube_widget.py        |  48 ++---
 .../gui/pymod/scene/uniform_color_widget.py   |  14 +-
 modules/gui/pymod/scene/visibility_op.py      |   1 -
 modules/gui/pymod/scene/wireframe_widget.py   |  24 +--
 modules/gui/pymod/sip_handler.hh              |   4 +-
 modules/gui/pymod/table.py                    |   4 +-
 modules/gui/pymod/trajectory_viewer.py        |  65 +++---
 modules/gui/pymod/transfer_ownership.hh       |   2 +-
 modules/gui/src/CMakeLists.txt                |  22 +-
 modules/gui/src/file_viewer.cc                |   2 +-
 modules/gui/src/gl_canvas.cc                  |  15 +-
 modules/gui/src/gl_canvas.hh                  |  15 +-
 modules/gui/src/gl_win.cc                     |  92 ++------
 modules/gui/src/gl_win.hh                     |   2 -
 modules/gui/src/main.cc                       |   1 +
 modules/gui/src/panels/event_button.cc        |   3 +-
 .../gui/src/panels/panel_bar_widget_holder.cc |   3 +
 modules/gui/src/panels/tabbed_panel_bar.cc    |   2 +
 .../python_namespace_tree_model.hh            |   3 +-
 .../src/python_shell/python_shell_widget.cc   |   1 +
 modules/gui/src/scene_win/scene_win_model.cc  |   1 +
 .../sequence_viewer/alignment_view_object.cc  |  14 +-
 modules/img/alg/src/CMakeLists.txt            |   3 -
 modules/info/src/CMakeLists.txt               |   5 +-
 modules/info/src/info_impl.cc                 |   3 +-
 modules/info/src/info_impl.hh                 |   8 +-
 73 files changed, 825 insertions(+), 900 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2cf4c283a..e01823287 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -198,7 +198,7 @@ if (WIN32)
 endif()
 
 if (ENABLE_INFO)        
-  find_package(Qt4 4.5.0 REQUIRED)
+  find_package(Qt5Xml REQUIRED)
 endif()
 
 if (OPTIMIZE)
@@ -233,7 +233,7 @@ else()
 endif()
 
 find_package(Eigen 3.2.0 REQUIRED)
-find_package(Python 2.4 REQUIRED)
+find_package(Python 2.7 REQUIRED)
 
 if(USE_NUMPY)
   find_package(Numpy REQUIRED)
@@ -269,8 +269,11 @@ if (ENABLE_STATIC)
 endif()
 
 if (ENABLE_GUI)
+  find_package(Qt5Widgets REQUIRED)
+  find_package(Qt5OpenGL REQUIRED)
+  find_package(Qt5PrintSupport REQUIRED)
   ost_find_python_module(sip)
-  ost_find_python_module(PyQt4)
+  ost_find_python_module(PyQt5)
 endif()
 
 if (ENABLE_SPNAV)
diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt
index 2d0690f01..9c4826656 100644
--- a/modules/gui/pymod/CMakeLists.txt
+++ b/modules/gui/pymod/CMakeLists.txt
@@ -117,6 +117,5 @@ install(FILES ${INSPECTOR_ICONS} DESTINATION "share/openstructure/scene/icons")
 
 set(QT_USE_QTOPENGL 1)
 set(QT_USE_QTNETWORK 1)
-include(${QT_USE_FILE})
 
-target_link_libraries(_ost_gui ${QT_LIBRARIES})
+target_link_libraries(_ost_gui ${QT_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport)
diff --git a/modules/gui/pymod/__init__.py b/modules/gui/pymod/__init__.py
index 227a0db3b..da9be0da8 100644
--- a/modules/gui/pymod/__init__.py
+++ b/modules/gui/pymod/__init__.py
@@ -42,8 +42,9 @@ def ClearMessageWidget():
       gosty.message_widget.Clear()
 
 
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import *
 from ost import gfx
 
 def PickColor(default=gfx.WHITE):
@@ -135,8 +136,7 @@ def AddMenuAction(*args, **kwargs):
       self.predicate=predicate
       self.action=action
       app=GostyApp.Instance()
-      QObject.connect(app.scene_win.qobject, SIGNAL('ActiveNodesChanged()'),
-                      self.TestEnable)
+      app.scene_win.qobject.ActiveNodesChanged.connect(self.TestEnable)
       self.TestEnable()
 
     def TestEnable(self):
@@ -168,7 +168,7 @@ def AddMenuAction(*args, **kwargs):
       enabler=MenuActionEnabler(kwargs['enabled'], action)
     else:
       action.setEnabled(kwargs['enabled'])
-  QObject.connect(action, SIGNAL('triggered()'), function)
+  action.triggered.connect(function)
   return action
 
 
diff --git a/modules/gui/pymod/dng/init.py b/modules/gui/pymod/dng/init.py
index 4be7ed291..d8c66b00e 100644
--- a/modules/gui/pymod/dng/init.py
+++ b/modules/gui/pymod/dng/init.py
@@ -15,7 +15,7 @@ except ImportError:
 
 import httplib
 
-from PyQt4 import QtGui, QtCore
+from PyQt5 import QtGui, QtWidgets, QtCore
 from ost.gui.scene.init_inspector import _InitInspector
 from ost.gui.init_menubar import _InitMenuBar
 from ost.gui.init_spacenav import _InitSpaceNav
@@ -26,7 +26,7 @@ from ost.gui.dng import superpositiondialog
 from ost.gui.scene.remote import RemoteLoader
 
 import ost.gui.dng.menu
-from PyQt4.QtGui import *
+from PyQt5.QtGui import *
 def _my_exit(code):
   QtGui.QApplication.instance().quit()
   gui.GostyApp.Instance().ProcessEvents()
@@ -49,7 +49,7 @@ _InitRuleBasedProcessor()
 
 def _CheckRestore():
   settings = QtCore.QSettings()
-  restore = settings.value("restore_settings",QtCore.QVariant(False)).toBool()
+  restore = settings.value("restore_settings",QtCore.QVariant(False))
   if not restore:
     settings.clear()
   settings.setValue("restore_settings",QtCore.QVariant(True))
diff --git a/modules/gui/pymod/dng/menu.py b/modules/gui/pymod/dng/menu.py
index 875d43cf2..9e4503cfa 100644
--- a/modules/gui/pymod/dng/menu.py
+++ b/modules/gui/pymod/dng/menu.py
@@ -1,5 +1,6 @@
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
 from ost import *
 from ost import gui
 from ost.gui.init_splash import _InitSplash
@@ -60,11 +61,11 @@ class ClipWidget(QWidget):
     l.addWidget(self.near_, 0, 2)
     l.addWidget(self.far_, 1, 2)
     l.addWidget(self.auto_, 2, 0, 1, 4)
-    self.connect(self.near_, SIGNAL('valueChanged(int)'), self.SetNear)
-    self.connect(self.far_, SIGNAL('valueChanged(int)'), self.SetFar)
-    self.connect(self.auto_, SIGNAL('stateChanged(int)'), self.SetAuto)
-    self.connect(bounds_near, SIGNAL('textEdited(QString)'), self.SetNearBounds)
-    self.connect(bounds_far, SIGNAL('textEdited(QString)'), self.SetFarBounds)
+    self.near_.valueChanged.connect(self.SetNear)
+    self.far_.valueChanged.connect(self.SetFar)
+    self.auto_.stateChanged.connect(self.SetAuto)
+    bounds_near.textEdited.connect(self.SetNearBounds)
+    bounds_far.textEdited.connect(self.SetFarBounds)
 
   def SetNear(self, val):
     gfx.Scene().near = val
@@ -104,13 +105,13 @@ class ExportSceneDialog(QDialog):
     l.addWidget(self.opaque_, 2, 1)
     hbox=QHBoxLayout()
     cancel=QPushButton("Cancel")
-    QObject.connect(cancel, SIGNAL('clicked()'), self.reject)
+    cancel.clicked.connect(self.reject)
     hbox.addWidget(cancel)
     export=QPushButton("Export")
     hbox.addWidget(export)
     export.setDefault(True)
     l.addLayout(hbox, 3, 1, 2, 1)
-    QObject.connect(export, SIGNAL('clicked()'), self.accept)
+    export.clicked.connect(self.accept)
   @property
   def transparent(self):
     return not self.opaque_.isChecked()
@@ -127,7 +128,7 @@ class SceneMenu(QMenu):
   def __init__(self, parent=None):
     QMenu.__init__(self, parent)
     self.setTitle('Scene')
-    QObject.connect(self, SIGNAL('aboutToShow()'), self._AboutToShow)
+    self.aboutToShow.connect(self._AboutToShow)
     gui.AddMenuAction(self, 'Background Color', self._SetSceneBackground)
     self.fog_action=gui.AddMenuAction(self, 'Depth Cueing', self._ToggleFog, 
                                   shortcut='Ctrl+Shift+F', checkable=True, 
@@ -214,7 +215,7 @@ class WindowMenu(QMenu):
     QMenu.__init__(self, parent)
     self.setTitle('Window')
     gosty=gui.GostyApp.Instance()
-    QObject.connect(self, SIGNAL('aboutToShow()'), self._AboutToShow)
+    self.aboutToShow.connect(self._AboutToShow)
     inspector_visible=gosty.GetWidget('InspectorDialog').isVisible()
     self._gl_win_action=gui.AddMenuAction(self, 'GL Window',  
                                       self._ToggleShowGLWindow, checkable=True,
diff --git a/modules/gui/pymod/dng/superpositiondialog.py b/modules/gui/pymod/dng/superpositiondialog.py
index 7eb391803..894043007 100644
--- a/modules/gui/pymod/dng/superpositiondialog.py
+++ b/modules/gui/pymod/dng/superpositiondialog.py
@@ -19,16 +19,15 @@
 #
 # Authors: Stefan Bienert 
 #
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from PyQt5 import QtCore, QtGui, QtWidgets
 from ost.mol.alg import Superpose
 from ost import mol
 
-class ChainComboBox(QComboBox):
+class ChainComboBox(QtWidgets.QComboBox):
   def __init__(self, ent, gfx, parent=None):
     # class variables
     self.all_chains = 'All'
-    QComboBox.__init__(self, parent)
+    QtWidgets.QComboBox.__init__(self, parent)
     self.entity = ent
     self.addItem(self.all_chains)
     for chain in self.entity.chains:
@@ -37,9 +36,7 @@ class ChainComboBox(QComboBox):
       self.setCurrentIndex(0)
     if gfx:
       self.gfx = gfx
-      QObject.connect(self,
-                      SIGNAL('highlighted (const QString&)'),
-                      self._HighlightChain)
+      self.highlighted.connect(self._HighlightChain)
     else:
       self.gfx = None
 
@@ -82,7 +79,7 @@ class ChainComboBox(QComboBox):
         break
   selected_chain = property(_GetSelectedChain, _SetSelectedChain)
 
-class SuperpositionDialog(QDialog):
+class SuperpositionDialog(QtWidgets.QDialog):
   """
   Provides a graphical user interface to structurally superpose two entities.
   Uses function :func:`~ost.mol.alg.Superpose`. The RMSD of two superposed
@@ -132,7 +129,7 @@ class SuperpositionDialog(QDialog):
     self.gfx_two = None
     self.gfx_select_one = None
     self.gfx_select_two = None
-    QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.setWindowTitle('Superpose structures')
     if not isinstance(ent_one, mol.EntityHandle) and \
        not isinstance(ent_one, mol.EntityView):
@@ -183,9 +180,7 @@ class SuperpositionDialog(QDialog):
     layout.addWidget(self._chain_two, grow, 1)
     grow += 1
     # link chain and reference selection
-    QObject.connect(self._reference,
-                    SIGNAL('currentIndexChanged(int)'),
-                    self._ChangeChainSelection)
+    self._reference.currentIndexChanged.connect(self._ChangeChainSelection)
     # match methods
     self._methods = self._MatchMethods()
     layout.addWidget(QLabel('match residues by'), grow, 0)
@@ -205,14 +200,14 @@ class SuperpositionDialog(QDialog):
     grow += 1
     # buttons
     ok_button = QPushButton("Superpose")
-    QObject.connect(ok_button, SIGNAL('clicked()'), self.accept)
+    ok_button.clicked.connect(self.accept)
     cancel_button = QPushButton("Cancel")
     hbox_layout = QHBoxLayout()
     hbox_layout.addStretch(1)
     layout.addLayout(hbox_layout, grow, 0, 1, 2)
     grow += 1
-    QObject.connect(cancel_button, SIGNAL('clicked()'), self.reject)
-    QObject.connect(self, SIGNAL('accepted()'), self._Superpose)
+    cancel_button.clicked.connect(self.reject)
+    self.accepted.connect(self._Superpose)
     hbox_layout.addWidget(cancel_button, 0)
     hbox_layout.addWidget(ok_button, 0)
     ok_button.setDefault(True)
@@ -260,7 +255,7 @@ class SuperpositionDialog(QDialog):
     vbox_layout.addWidget(bt3)
     vbox_layout.addWidget(custom_rbutton)
     vbox_layout.addWidget(self._atoms)
-    QObject.connect(custom_rbutton, SIGNAL('toggled(bool)'), self._toggle_atoms)
+    custom_rbutton.toggled.connect(self._toggle_atoms)
     box = QGroupBox("atom selection")
     box.setLayout(vbox_layout)
     return box, group
@@ -340,7 +335,7 @@ class SuperpositionDialog(QDialog):
     vbox_layout.addWidget(distance_label)
     vbox_layout.addWidget(distance_in)
     vbox_layout.addSpacing(50)
-    QObject.connect(bt1, SIGNAL('toggled(bool)'), self._toggle_iterative)
+    bt1.toggled.connect(self._toggle_iterative)
     box = QGroupBox("Iterative")
     box.setLayout(vbox_layout)
     return box,iteration_in, distance_in
diff --git a/modules/gui/pymod/dng/termuse.py b/modules/gui/pymod/dng/termuse.py
index a1fed90dd..68a937c5e 100644
--- a/modules/gui/pymod/dng/termuse.py
+++ b/modules/gui/pymod/dng/termuse.py
@@ -1,5 +1,4 @@
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from PyQt5 import QtGui, QtCore, QtWidgets
 from ost.gui import AdminRights
 import ost
 import os
@@ -7,9 +6,9 @@ import os
 
 usage='''The DNG application bundle contains two shell commands ('ost' and 'dng') that lets you use the OpenStructure command-line interpreter and dng from the terminal. If you want to use these commands, it is recommended that a symbolic link is created. 
 '''
-class TerminalUsageDialog(QDialog):
+class TerminalUsageDialog(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.setWindowTitle('Enhanced Terminal Usage')
     self.setFixedSize(QSize(480, 300))
     l=QVBoxLayout(self)
diff --git a/modules/gui/pymod/export_input.cc b/modules/gui/pymod/export_input.cc
index 8906e944b..b6ecb5c0b 100644
--- a/modules/gui/pymod/export_input.cc
+++ b/modules/gui/pymod/export_input.cc
@@ -31,7 +31,7 @@ namespace {
 object spnav_get_instance()
 {
   static object sip_module=import("sip");
-  static object pyqt4_module=import("PyQt4.QtCore");
+  static object pyqt5_module=import("PyQt5.QtCore");
   SpnavInput* si = SpnavInput::Instance();
   if(si->isValid()) {
     return ost::gui::get_py_qobject<SpnavInput>(si);
diff --git a/modules/gui/pymod/export_tool.cc b/modules/gui/pymod/export_tool.cc
index c5165570e..3d968fd88 100644
--- a/modules/gui/pymod/export_tool.cc
+++ b/modules/gui/pymod/export_tool.cc
@@ -103,7 +103,7 @@ void to_add_option_b(ToolOptions& to, const String& name,
 
 object qpoint_to_bp_object (QPoint& p)
 {
-  static object bp_module =import("PyQt4.QtCore");
+  static object bp_module =import("PyQt5.QtCore");
   return bp_module.attr("QPoint")(p.x(),p.y());
 }
 
diff --git a/modules/gui/pymod/helpwidget.py b/modules/gui/pymod/helpwidget.py
index 39e8602a8..9ac28e205 100644
--- a/modules/gui/pymod/helpwidget.py
+++ b/modules/gui/pymod/helpwidget.py
@@ -1,19 +1,17 @@
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from PyQt5 import QtWidgets
 from ost import gui
-class DocWidget(QWidget):
+class DocWidget(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QWidget.__init__(self, parent)
-    l=QVBoxLayout(self)
-    l.setMargin(0)
+    QtWidgets.QWidget.__init__(self, parent)
+    l=QtWidgets.QVBoxLayout(self)
+    l.setContentsMargins(0,0,0,0)
     self.setWindowTitle('OpenStructure Help')
-    self.searchbox=QLineEdit(self)
+    self.searchbox=QtWidgets.QLineEdit(self)
     l.addWidget(self.searchbox)
-    self.doctext=QTextEdit('', self)
+    self.doctext=QtWidgets.QTextEdit('', self)
     l.addWidget(self.doctext)
     self.setLayout(l)
-    QObject.connect(self.searchbox, SIGNAL('returnPressed()'),
-                    self.OnReturnPressed)
+    self.searchbox.returnPressed.connect(self.OnReturnPressed)
   def OnReturnPressed(self):
     help(str(self.searchbox.text()))
 doc_widget=DocWidget()
diff --git a/modules/gui/pymod/init_context_menu.py b/modules/gui/pymod/init_context_menu.py
index e911645c0..e130c76d8 100644
--- a/modules/gui/pymod/init_context_menu.py
+++ b/modules/gui/pymod/init_context_menu.py
@@ -1,6 +1,6 @@
 import platform
 
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 
 import sip
 
@@ -13,52 +13,52 @@ from ost.seq import alg
 import ost
 from ost.gui.scene.query_editor import QueryEditorWidget,QueryDialog
 
-class SelectRefDialog(QtGui.QDialog):
+class SelectRefDialog(QtWidgets.QDialog):
   def __init__(self, ent_list, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.ent_list_ = ent_list
-    vb = QtGui.QVBoxLayout()
+    vb = QtWidgets.QVBoxLayout()
     self.setLayout(vb)
     self.setWindowTitle("Select Reference Object")
-    self.label = QtGui.QLabel("Please Select the Reference Object")
-    self.list = QtGui.QTableWidget(self)
+    self.label = QtWidgets.QLabel("Please Select the Reference Object")
+    self.list = QtWidgets.QTableWidget(self)
     self.list.horizontalHeader().setStretchLastSection(True)
     self.list.setColumnCount(2)
     self.list.verticalHeader().setVisible(False)
     self.list.horizontalHeader().setVisible(False)
-    self.list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
-    self.list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+    self.list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+    self.list.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
     vb.addWidget(self.label)
     vb.addWidget(self.list)
-    self.show_scores = QtGui.QCheckBox(self)
+    self.show_scores = QtWidgets.QCheckBox(self)
     self.show_scores.setText("Show Scores")
     self.show_scores.setChecked(True)
     vb.addWidget(self.show_scores)
-    self.show_alignment = QtGui.QCheckBox(self)
+    self.show_alignment = QtWidgets.QCheckBox(self)
     self.show_alignment.setText("Display Alignment")
     self.show_alignment.setChecked(False)
     vb.addWidget(self.show_alignment)
-    hb = QtGui.QHBoxLayout()
-    hb.setDirection(QtGui.QBoxLayout.LeftToRight)
-    cancel_btn = QtGui.QPushButton("Cancel", self)
-    load_btn = QtGui.QPushButton("Select", self)
+    hb = QtWidgets.QHBoxLayout()
+    hb.setDirection(QtWidgets.QBoxLayout.LeftToRight)
+    cancel_btn = QtWidgets.QPushButton("Cancel", self)
+    load_btn = QtWidgets.QPushButton("Select", self)
     hb.addStretch(1)
     hb.addWidget(cancel_btn)
     hb.addWidget(load_btn)
     vb.addItem(hb)
     load_btn.setDefault(True)
-    QtCore.QObject.connect(load_btn, QtCore.SIGNAL("clicked()"), self.Select)
-    QtCore.QObject.connect(cancel_btn, QtCore.SIGNAL("clicked()"), self.reject)
+    load_btn.clicked.connect(self.Select)
+    cancel_btn.clicked.connect(self.reject)
 
     row = 0
     for ent in self.ent_list_:
       variant = QtCore.QVariant(ent)
       self.list.insertRow(row)
-      new_item = QtGui.QTableWidgetItem("%i"%(row+1))
+      new_item = QtWidgets.QTableWidgetItem("%i"%(row+1))
       new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
       new_item.setData(QtCore.Qt.UserRole,variant)
       self.list.setItem(row, 0, new_item)
-      new_item = QtGui.QTableWidgetItem(ent.GetName())
+      new_item = QtWidgets.QTableWidgetItem(ent.GetName())
       new_item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
       self.list.setItem(row, 1, new_item)
       row += 1  
@@ -83,103 +83,103 @@ class SelectRefDialog(QtGui.QDialog):
   def GetEntities(self):
     return self.ent_list_
 
-class ShowResultDialog(QtGui.QDialog):
+class ShowResultDialog(QtWidgets.QDialog):
   def __init__(self, ent_list, res_list, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.ent_list_ = ent_list
-    vb = QtGui.QVBoxLayout()
+    vb = QtWidgets.QVBoxLayout()
     self.setLayout(vb)
     self.setWindowTitle("Alignment result")
-    self.label = QtGui.QLabel("Alignment results with %s as reference"%ent_list[0].GetName())
-    self.list = QtGui.QTableWidget(self)
+    self.label = QtWidgets.QLabel("Alignment results with %s as reference"%ent_list[0].GetName())
+    self.list = QtWidgets.QTableWidget(self)
     self.list.horizontalHeader().setStretchLastSection(True)
     self.list.setColumnCount(4)
     self.list.verticalHeader().setVisible(False)
     self.list.setHorizontalHeaderLabels (["Name","RMSD","TMScore",""])
-    self.list.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+    self.list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
     vb.addWidget(self.label)
     vb.addWidget(self.list)
-    hb = QtGui.QHBoxLayout()
-    hb.setDirection(QtGui.QBoxLayout.LeftToRight)
-    ok_btn = QtGui.QPushButton("OK", self)
+    hb = QtWidgets.QHBoxLayout()
+    hb.setDirection(QtWidgets.QBoxLayout.LeftToRight)
+    ok_btn = QtWidgets.QPushButton("OK", self)
     hb.addStretch(1)
     hb.addWidget(ok_btn)
     vb.addItem(hb)
     ok_btn.setDefault(True)
-    QtCore.QObject.connect(ok_btn, QtCore.SIGNAL("clicked()"), self.accept)
+    ok_btn.clicked.connect(self.accept)
 
     for i in range(0, len(res_list)):
       self.list.insertRow(i)
-      new_item = QtGui.QTableWidgetItem(ent_list[i+1].GetName())
+      new_item = QtWidgets.QTableWidgetItem(ent_list[i+1].GetName())
       new_item.setFlags(QtCore.Qt.ItemIsEnabled)
       self.list.setItem(i, 0, new_item)
-      new_item = QtGui.QTableWidgetItem("%.2f"%res_list[i].rmsd)
+      new_item = QtWidgets.QTableWidgetItem("%.2f"%res_list[i].rmsd)
       new_item.setFlags(QtCore.Qt.ItemIsEnabled)
       self.list.setItem(i, 1, new_item)
-      new_item = QtGui.QTableWidgetItem("%i"%res_list[i].tm_score)
+      new_item = QtWidgets.QTableWidgetItem("%i"%res_list[i].tm_score)
       new_item.setFlags(QtCore.Qt.ItemIsEnabled)
       self.list.setItem(i, 2, new_item)
-      new_item = QtGui.QTableWidgetItem()
+      new_item = QtWidgets.QTableWidgetItem()
       new_item.setFlags(QtCore.Qt.ItemIsEnabled)
       self.list.setItem(i, 3, new_item)
           
     self.list.resizeColumnsToContents()
 
-class CalculateSurfaceSettingsDialog(QtGui.QDialog):
+class CalculateSurfaceSettingsDialog(QtWidgets.QDialog):
   def __init__(self, executable, parent=None):
-    QtGui.QDialog.__init__(self, parent)
-    vb = QtGui.QGridLayout()
+    QtWidgets.QDialog.__init__(self, parent)
+    vb = QtWidgets.QGridLayout()
     self.setLayout(vb)
     self.setWindowTitle("MSMS Surface Settings")
-    msmsexe_label=QtGui.QLabel("executable")
-    self.msmsexe_field=QtGui.QLineEdit()
+    msmsexe_label=QtWidgets.QLabel("executable")
+    self.msmsexe_field=QtWidgets.QLineEdit()
     self.msmsexe_field.setText(executable)
-    msmsexe_browsebutton=QtGui.QPushButton("Browse")
+    msmsexe_browsebutton=QtWidgets.QPushButton("Browse")
     vb.addWidget(msmsexe_label, 0, 0)
     vb.addWidget(self.msmsexe_field, 0, 1)
     vb.addWidget(msmsexe_browsebutton, 0, 2)
-    surfname_label=QtGui.QLabel("surface name")
-    self.surfname_field=QtGui.QLineEdit()
+    surfname_label=QtWidgets.QLabel("surface name")
+    self.surfname_field=QtWidgets.QLineEdit()
     self.surfname_field.setText("surface")
     vb.addWidget(surfname_label, 1, 0)
     vb.addWidget(self.surfname_field, 1, 1, 1, 2)
-    density_label=QtGui.QLabel("density")
-    self.density_spinbox=QtGui.QSpinBox()
+    density_label=QtWidgets.QLabel("density")
+    self.density_spinbox=QtWidgets.QSpinBox()
     self.density_spinbox.setRange(1, 10)
     self.density_spinbox.setValue(4)
     vb.addWidget(density_label, 2, 0)
     vb.addWidget(self.density_spinbox, 2, 1, 1, 2)
-    probe_label=QtGui.QLabel("probe radius")
-    self.probe_spinbox=QtGui.QDoubleSpinBox()
+    probe_label=QtWidgets.QLabel("probe radius")
+    self.probe_spinbox=QtWidgets.QDoubleSpinBox()
     self.probe_spinbox.setDecimals(1)
     self.probe_spinbox.setSingleStep(0.1)
     self.probe_spinbox.setRange(0.3, 5.0)
     self.probe_spinbox.setValue(1.4)
     vb.addWidget(probe_label, 3, 0)
     vb.addWidget(self.probe_spinbox, 3, 1, 1, 2)
-    selection_label=QtGui.QLabel("selection")
-    self.selection_field=QtGui.QLineEdit()
+    selection_label=QtWidgets.QLabel("selection")
+    self.selection_field=QtWidgets.QLineEdit()
     self.selection_field.setText("")
     vb.addWidget(selection_label, 4, 0)
     vb.addWidget(self.selection_field, 4, 1, 1, 2)
-    self.noh_box=QtGui.QCheckBox("no hydrogens")
+    self.noh_box=QtWidgets.QCheckBox("no hydrogens")
     vb.addWidget(self.noh_box, 5, 0)
-    self.nohet_box=QtGui.QCheckBox("no hetatoms")
+    self.nohet_box=QtWidgets.QCheckBox("no hetatoms")
     vb.addWidget(self.nohet_box, 5, 1)
-    self.nowat_box=QtGui.QCheckBox("no waters")
+    self.nowat_box=QtWidgets.QCheckBox("no waters")
     vb.addWidget(self.nowat_box, 5, 2)
     
-    cancel_btn = QtGui.QPushButton("Cancel", self)
-    ok_btn = QtGui.QPushButton("OK", self)
+    cancel_btn = QtWidgets.QPushButton("Cancel", self)
+    ok_btn = QtWidgets.QPushButton("OK", self)
     vb.addWidget(cancel_btn, 6, 1)
     vb.addWidget(ok_btn, 6, 2)
     
-    QtCore.QObject.connect(msmsexe_browsebutton, QtCore.SIGNAL("clicked()"), self.GetPath)
-    QtCore.QObject.connect(ok_btn, QtCore.SIGNAL("clicked()"), self.accept)
-    QtCore.QObject.connect(cancel_btn, QtCore.SIGNAL("clicked()"), self.reject)
+    msmsexe_browsebutton.clicked.connect(self.GetPath)
+    ok_btn.clicked.connect(self.accept)
+    cancel_btn.clicked.connect(self.reject)
     
   def GetPath(self):
-    path=QtGui.QFileDialog().getOpenFileName(self, "Choose MSMS Executable")
+    path=QtWidgets.QFileDialog().getOpenFileName(self, "Choose MSMS Executable")
     if path!='':
       self.msmsexe_field.setText(path)
 
@@ -191,9 +191,8 @@ class SurfaceContextMenu(QtCore.QObject):
     except settings.FileNotFound:
       self.executable=""
     QtCore.QObject.__init__(self, context_menu.qobject)
-    self.action = QtGui.QAction("Calculate Surface", self)
-    QtCore.QObject.connect(self.action, QtCore.SIGNAL("triggered()"),
-                           self.CalculateSurface)
+    self.action = QtWidgets.QAction("Calculate Surface", self)
+    self.action.triggered.connect(self.CalculateSurface)
     context_menu.AddAction(self.action, gui.ContextActionType.ENTITY)
     
   def CalculateSurface(self):
@@ -251,8 +250,8 @@ class AlignmentContextMenu(QtCore.QObject):
       settings.Locate(settings_name)
       QtCore.QObject.__init__(self, context_menu.qobject)
 
-      self.action = QtGui.QAction("Align", self)
-      QtCore.QObject.connect(self.action,QtCore.SIGNAL("triggered()"), self.Align)
+      self.action = QtWidgets.QAction("Align", self)
+      self.action.triggered.connect(self.Align)
       context_menu.AddAction(self.action, gui.ContextActionType.ENTITY | gui.ContextActionType.MULTI)
       self.seq_viewer = None
     except settings.FileNotFound:
@@ -311,17 +310,14 @@ class AlignmentContextMenu(QtCore.QObject):
 class SelectMenuPoints(QtCore.QObject):
   def __init__(self, context_menu):
     QtCore.QObject.__init__(self, context_menu.qobject)
-    action=QtGui.QAction("Select...", self)
-    QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
-                           self._Select)
+    action=QtWidgets.QAction("Select...", self)
+    action.triggered.connect(self._Select)
     context_menu.AddAction(action, gui.ENTITY)
-    action=QtGui.QAction("Copy Selection...", self)
-    QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
-                           self._CopyViews)
+    action=QtWidgets.QAction("Copy Selection...", self)
+    action.triggered.connect(self._CopyViews)
     context_menu.AddAction(action, gui.ENTITY)
-    action=QtGui.QAction('Select...', self)
-    QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'),
-                           self._SelectViewsSameEntity)
+    action=QtWidgets.QAction('Select...', self)
+    action.triggered.connect(self._SelectViewsSameEntity)
     context_menu.AddAction(action, gui.ENTITY_VIEW|gui.VIEWS_SAME_OBJECT)    
   def _Select(self):
     scene_selection=gui.SceneSelection.Instance()
diff --git a/modules/gui/pymod/init_menubar.py b/modules/gui/pymod/init_menubar.py
index 761e483bb..03930fc53 100644
--- a/modules/gui/pymod/init_menubar.py
+++ b/modules/gui/pymod/init_menubar.py
@@ -23,7 +23,7 @@ import sip
 from ost import gfx
 import ost
 
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtGui
 from ost.gui import FileLoader
 from ost.gui.init_splash import _InitSplash
 from ost.gui.dng import termuse
diff --git a/modules/gui/pymod/init_spacenav.py b/modules/gui/pymod/init_spacenav.py
index f94b569f9..86154534b 100644
--- a/modules/gui/pymod/init_spacenav.py
+++ b/modules/gui/pymod/init_spacenav.py
@@ -1,6 +1,6 @@
 import math,traceback
 
-from PyQt4 import QtCore
+from PyQt5 import QtCore
 
 import ost
 from ost import gfx, gui
diff --git a/modules/gui/pymod/init_splash.py b/modules/gui/pymod/init_splash.py
index ec5e3667c..de8f10c47 100644
--- a/modules/gui/pymod/init_splash.py
+++ b/modules/gui/pymod/init_splash.py
@@ -1,4 +1,4 @@
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtGui, QtWidgets
 
 import os
 import ost
@@ -15,16 +15,16 @@ Feel free visit our website at:<br />
 <a href='http://www.openstructure.org'>http://www.openstructure.org</a>
 """ % ost.VERSION
 
-class SplashDialog(QtGui.QDialog):
+class SplashDialog(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
-    layout = QtGui.QHBoxLayout(self)
+    QtWidgets.QDialog.__init__(self, parent)
+    layout = QtWidgets.QHBoxLayout(self)
     self.setLayout(layout)
-    imageLabel = QtGui.QLabel();
+    imageLabel = QtWidgets.QLabel();
     self.pix_map = QtGui.QPixmap(LOGO_PATH);
     imageLabel.setPixmap(self.pix_map);
     layout.addWidget(imageLabel)
-    self.label = QtGui.QTextBrowser()
+    self.label = QtWidgets.QTextBrowser()
     self.label.setReadOnly(True)
     self.label.setOpenExternalLinks(True)
     self.label.setHtml(SPLASH_TEXT)
diff --git a/modules/gui/pymod/scene/color_options_widget.py b/modules/gui/pymod/scene/color_options_widget.py
index 1d8e95cf6..c99eb41e2 100644
--- a/modules/gui/pymod/scene/color_options_widget.py
+++ b/modules/gui/pymod/scene/color_options_widget.py
@@ -29,7 +29,7 @@ except ImportError:
   _img_present=False
   pass
 
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtWidgets
 from scene_selection_helper import SelHelper
 from gradient_editor_widget import GradientEditor
 from uniform_color_widget import UniformColorWidget
@@ -41,8 +41,8 @@ class ColorOptionsWidget(ComboOptionsWidget):
     
     #Title
     self.text_ = "Color Options"
-    conly_label_ = QtGui.QLabel('carbons only')
-    self.conly_box_ = QtGui.QCheckBox()
+    conly_label_ = QtWidgets.QLabel('carbons only')
+    self.conly_box_ = QtWidgets.QCheckBox()
     
     #Add options to menu
     self.entity_widgets_ = list()
@@ -55,8 +55,8 @@ class ColorOptionsWidget(ComboOptionsWidget):
     self.img_widgets_ = list()
     self.img_widgets_.append(["Uniform",UniformColorWidget()])
 
-    qw = QtGui.QWidget(self)
-    gl = QtGui.QGridLayout(qw)
+    qw = QtWidgets.QWidget(self)
+    gl = QtWidgets.QGridLayout(qw)
     gl.addWidget(self.conly_box_, 0, 0, 1, 1)
     gl.addWidget(conly_label_, 0, 1, 1, 4)
     self.grid_layout_.addWidget(qw, 2, 0, 1, 1)
@@ -112,9 +112,9 @@ class ColorOptionsWidget(ComboOptionsWidget):
     return self.conly_box_.isChecked()
   
 
-class ByElementWidget(QtGui.QWidget):
+class ByElementWidget(QtWidgets.QWidget):
   def __init__(self, text, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.parent_ = parent
 
     
@@ -122,13 +122,13 @@ class ByElementWidget(QtGui.QWidget):
     self.text_ = text
     
     #UI
-    text_label = QtGui.QLabel(text)
+    text_label = QtWidgets.QLabel(text)
     font = text_label.font()
     font.setBold(True)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(text_label,0,0,1,1)
-    grid.addWidget(QtGui.QLabel("No Settings available"), 1, 0, 1, 3)
+    grid.addWidget(QtWidgets.QLabel("No Settings available"), 1, 0, 1, 3)
     grid.setRowStretch(2,1)
     self.setLayout(grid)
     self.setMinimumSize(250,60)
@@ -156,20 +156,20 @@ class ByElementWidget(QtGui.QWidget):
     return self.text_
   
   
-class ByChainWidget(QtGui.QWidget):
+class ByChainWidget(QtWidgets.QWidget):
   def __init__(self, text, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.parent_ = parent
     
     #Title
     self.text_ = text
     
     #UI
-    text_label = QtGui.QLabel(text)
+    text_label = QtWidgets.QLabel(text)
     font = text_label.font()
     font.setBold(True)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(text_label,0,0,1,1)
     grid.setRowStretch(2,1)
     self.setLayout(grid)
@@ -197,20 +197,20 @@ class ByChainWidget(QtGui.QWidget):
   def GetText(self):
     return self.text_
 
-class ByEntityWidget(QtGui.QWidget):
+class ByEntityWidget(QtWidgets.QWidget):
   def __init__(self, text, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.parent_ = parent
     
     #Title
     self.text_ = text
     
     #UI
-    text_label = QtGui.QLabel(text)
+    text_label = QtWidgets.QLabel(text)
     font = text_label.font()
     font.setBold(True)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(text_label,0,0,1,1)
     grid.setRowStretch(2,1)
     self.setLayout(grid)
diff --git a/modules/gui/pymod/scene/color_select_widget.py b/modules/gui/pymod/scene/color_select_widget.py
index 110108e63..e7847bb62 100644
--- a/modules/gui/pymod/scene/color_select_widget.py
+++ b/modules/gui/pymod/scene/color_select_widget.py
@@ -20,28 +20,31 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 
 #Gradient Stop  
-class ColorSelectWidget(QtGui.QWidget):
+class ColorSelectWidget(QtWidgets.QWidget):
+
+  colorChanged = QtCore.pyqtSignal()
+
   def __init__(self, width, height, color, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Membervars
     self.width_ = width
     self.height_ = height
 
     if(color is None):
-      self.color_ = QtGui.QColor("White")
+      self.color_ = QtWidgets.QColor("White")
     else:
       self.color_ = color
         
     self.show()
     
     #ContextMenu
-    self.change_color_ = QtGui.QAction('ChangeColor', self)
+    self.change_color_ = QtWidgets.QAction('ChangeColor', self)
     
-    QtCore.QObject.connect(self.change_color_, QtCore.SIGNAL('triggered()'), self.ChangeColor)
+    self.change_color_.triggered.connect(self.ChangeColor)
     
     self.addAction(self.change_color_)
     self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
@@ -49,11 +52,12 @@ class ColorSelectWidget(QtGui.QWidget):
     self.Resize()
     
   def ChangeColor(self):
-    color = QtGui.QColorDialog.getColor(self.color_, self)
+    color = QtWidgets.QColorDialog.getColor(initial = self.color_, parent = self,
+                                            title = "asdf")
     
     if(color != self.color_ and color.isValid()):
       self.color_ = color
-      self.emit(QtCore.SIGNAL("colorChanged"))
+      self.colorChanged.emit()
       self.update()
     
   def GetColor(self):
@@ -66,11 +70,11 @@ class ColorSelectWidget(QtGui.QWidget):
   def SetColor(self, color):
     if(self.color_ != color):
       self.color_ = color
-      self.emit(QtCore.SIGNAL("colorChanged"))
+      self.colorChanged.emit()
       self.update()
   
   def SetGfxColor(self, color):
-    qcolor= QtGui.QColor(color.Red()*255,color.Green()*255,color.Blue()*255,color.Alpha()*255)
+    qcolor= QtWidgets.QColor(color.Red()*255,color.Green()*255,color.Blue()*255,color.Alpha()*255)
     self.SetColor(qcolor)
             
   def paintEvent(self, event):
diff --git a/modules/gui/pymod/scene/combo_options_widget.py b/modules/gui/pymod/scene/combo_options_widget.py
index 8961c04a2..28bacce3f 100644
--- a/modules/gui/pymod/scene/combo_options_widget.py
+++ b/modules/gui/pymod/scene/combo_options_widget.py
@@ -21,9 +21,9 @@
 import sys
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 
-class ComboOptionsWidget(QtGui.QWidget):
+class ComboOptionsWidget(QtWidgets.QWidget):
   """QWidget with a Combobox and a show area.
     
    This abstract QWidget has a Combobox and a show area. Whenever the value of 
@@ -31,22 +31,21 @@ class ComboOptionsWidget(QtGui.QWidget):
    shown in the show area.  
   """
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     #Setup ui_
     self.parent_ = parent
-    self.grid_layout_ = QtGui.QGridLayout(self)
+    self.grid_layout_ = QtWidgets.QGridLayout(self)
     self.grid_layout_.setHorizontalSpacing(0)
     self.grid_layout_.setVerticalSpacing(0)
     self.grid_layout_.setContentsMargins(0,0,0,0)
-    self.combo_box_ = QtGui.QComboBox(self)
+    self.combo_box_ = QtWidgets.QComboBox(self)
     self.grid_layout_.addWidget(self.combo_box_, 0, 0, 1, 1)
-    self.stacked_widget_ = QtGui.QStackedWidget(self)
+    self.stacked_widget_ = QtWidgets.QStackedWidget(self)
     self.grid_layout_.addWidget(self.stacked_widget_, 1, 0, 1, 1)
 
     self.__UpdateView(self.combo_box_.currentIndex())
     
-    QtCore.QObject.connect(self.combo_box_, QtCore.SIGNAL("activated(int)"), 
-                           self.__UpdateView)
+    self.combo_box_.activated.connect(self.__UpdateView)
     
     self.setEnabled(False)
        
@@ -66,11 +65,11 @@ class ComboOptionsWidget(QtGui.QWidget):
      the old widget will be removed and the new widget gets the identifier.
      Returns True, if widget is added. Otherwise it returns False
     """
-    if isinstance(widget, QtGui.QWidget) and ident is not None:
+    if isinstance(widget, QtWidgets.QWidget) and ident is not None:
       if hasattr(widget, "GetText"):
-        string = QtCore.QString(widget.GetText())
+        string = widget.GetText()
       else:
-        string = QtCore.QString(ident)
+        string = ident
       
       self.RemoveWidget(ident)
       self.stacked_widget_.addWidget(widget)
@@ -82,7 +81,7 @@ class ComboOptionsWidget(QtGui.QWidget):
   def RemoveWidget(self,ident):
     index = self.__GetIndex(ident)
     if(index >= 0):
-      self.stacked_widget_.removeWidget(self.combo_box_.itemData(index).toPyObject()[1])
+      self.stacked_widget_.removeWidget(self.combo_box_.itemData(index)[1])
       self.combo_box_.removeItem(index)
   
   def OnComboChange(self, item):
@@ -137,18 +136,18 @@ class ComboOptionsWidget(QtGui.QWidget):
 
   def __GetIndex(self, ident):
     for i in range(self.combo_box_.count()):
-      pair = self.combo_box_.itemData(i).toPyObject()
+      pair = self.combo_box_.itemData(i)
       if ident == pair[0]:
         return i
     return -1
   
   def __GetCurrentPair(self):
       current_index = self.combo_box_.currentIndex()
-      return self.combo_box_.itemData(current_index).toPyObject()
+      return self.combo_box_.itemData(current_index)
 
   #Overwritten Methods
   def setEnabled(self, bool):
-    QtGui.QWidget.setEnabled(self, bool)
+    QtWidgets.QWidget.setEnabled(self, bool)
     for i in range(self.combo_box_.count()):
-        pair = self.combo_box_.itemData(i).toPyObject()
+        pair = self.combo_box_.itemData(i)
         pair[1].setEnabled(bool)
diff --git a/modules/gui/pymod/scene/cpk_widget.py b/modules/gui/pymod/scene/cpk_widget.py
index 038476597..c40819abe 100644
--- a/modules/gui/pymod/scene/cpk_widget.py
+++ b/modules/gui/pymod/scene/cpk_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #CPK Render Options
@@ -40,26 +40,26 @@ class CPKWidget(RenderModeWidget):
         
     #Create Ui elements
     
-    self.sphere_spinbox_ = QtGui.QSpinBox()
+    self.sphere_spinbox_ = QtWidgets.QSpinBox()
     self.sphere_spinbox_.setRange(min_sphere_detail, max_sphere_detail)
-    cpk_mode_label = QtGui.QLabel("Rendering Mode")
-    self.cpk_mode_ = QtGui.QComboBox()
+    cpk_mode_label = QtWidgets.QLabel("Rendering Mode")
+    self.cpk_mode_ = QtWidgets.QComboBox()
     self.cpk_mode_.addItem("Triangles")
     self.cpk_mode_.addItem("3D Sprites")
-    cpk_label = QtGui.QLabel(self.text_)
+    cpk_label = QtWidgets.QLabel(self.text_)
     font = cpk_label.font()
     font.setBold(True)
     
-    sphere_label = QtGui.QLabel("Sphere Detail")
-    grid = QtGui.QGridLayout()
+    sphere_label = QtWidgets.QLabel("Sphere Detail")
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(cpk_label,0,0,1,1)
     grid.addWidget(sphere_label, 1, 0, 1, 3)
     grid.addWidget(self.sphere_spinbox_, 1, 2, 1, 1)
     grid.setRowStretch(2,1)
     self.setLayout(grid)
   
-    QtCore.QObject.connect(self.sphere_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSphereDetail)
-    QtCore.QObject.connect(self.cpk_mode_, QtCore.SIGNAL("currentIndexChanged(int)"), self.UpdateSphereMode)
+    self.sphere_spinbox_.valueChanged.connect(self.UpdateSphereDetail)
+    self.cpk_mode_.currentIndexChanged.connect(self.UpdateSphereMode)
     
     self.setMinimumSize(250,60)
     
diff --git a/modules/gui/pymod/scene/custom_widget.py b/modules/gui/pymod/scene/custom_widget.py
index a0413862d..e94eabd2d 100644
--- a/modules/gui/pymod/scene/custom_widget.py
+++ b/modules/gui/pymod/scene/custom_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Custom Render Options
@@ -49,46 +49,46 @@ class CustomWidget(RenderModeWidget):
         
     #Create Ui elements
     
-    self.sphere_spinbox_ = QtGui.QSpinBox()
+    self.sphere_spinbox_ = QtWidgets.QSpinBox()
     self.sphere_spinbox_.setRange(min_sphere_detail, max_sphere_detail)
     
-    self.arc_spinbox_ = QtGui.QSpinBox()
+    self.arc_spinbox_ = QtWidgets.QSpinBox()
     self.arc_spinbox_.setRange(min_arc_detail, max_arc_detail)
   
     #Bond Radius
-    radius_bond_label = QtGui.QLabel("Bond Radius")
+    radius_bond_label = QtWidgets.QLabel("Bond Radius")
     
-    self.radius_bond_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_bond_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_bond_spinbox_.setRange(min_rad, max_bond_rad)
     self.radius_bond_spinbox_.setDecimals(2)
     self.radius_bond_spinbox_.setSingleStep(0.05)
     
-    self.radius_bond_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.radius_bond_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.radius_bond_slider_.setRange(min_rad*100.0, max_bond_rad*100.0)
-    self.radius_bond_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.radius_bond_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.radius_bond_slider_.setTickInterval(5)
     
     
     #Sphere Radius
-    radius_sphere_label = QtGui.QLabel("Sphere Radius")
+    radius_sphere_label = QtWidgets.QLabel("Sphere Radius")
     
-    self.radius_sphere_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_sphere_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_sphere_spinbox_.setRange(min_rad, max_sphere_rad)
     self.radius_sphere_spinbox_.setDecimals(2)
     self.radius_sphere_spinbox_.setSingleStep(0.05)
     
-    self.radius_sphere_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.radius_sphere_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.radius_sphere_slider_.setRange(min_rad*100.0, max_sphere_rad*100.0)
-    self.radius_sphere_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.radius_sphere_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.radius_sphere_slider_.setTickInterval(5)
     
-    custom_label = QtGui.QLabel(self.text_)
+    custom_label = QtWidgets.QLabel(self.text_)
     font = custom_label.font()
     font.setBold(True)
     
-    sphere_label = QtGui.QLabel("Sphere Detail")
-    arc_label = QtGui.QLabel("Arc Detail")
-    grid = QtGui.QGridLayout()
+    sphere_label = QtWidgets.QLabel("Sphere Detail")
+    arc_label = QtWidgets.QLabel("Arc Detail")
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(custom_label,0,0,1,1)
     grid.addWidget(sphere_label, 1, 0, 1, 3)
     grid.addWidget(self.sphere_spinbox_, 1, 2, 1, 1)
@@ -106,22 +106,14 @@ class CustomWidget(RenderModeWidget):
     grid.setRowStretch(3,1)
     self.setLayout(grid)
   
-    QtCore.QObject.connect(self.sphere_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSphereDetail)
-    QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail)
-    
-    QtCore.QObject.connect(self.radius_bond_spinbox_, 
-                           QtCore.SIGNAL("valueChanged(double)"), 
-                           self.UpdateBondRadius)
-    QtCore.QObject.connect(self.radius_bond_slider_, 
-                           QtCore.SIGNAL("valueChanged(int)"), 
-                           self.UpdateSliderBondRadius)
-    
-    QtCore.QObject.connect(self.radius_sphere_spinbox_, 
-                           QtCore.SIGNAL("valueChanged(double)"), 
-                           self.UpdateSphereRadius)
-    QtCore.QObject.connect(self.radius_sphere_slider_, 
-                           QtCore.SIGNAL("valueChanged(int)"), 
-                           self.UpdateSliderSphereRadius)
+    self.sphere_spinbox_.valueChanged.connect(self.UpdateSphereDetail)
+    self.arc_spinbox_.valueChanged.connect(self.UpdateArcDetail)
+    
+    self.radius_bond_spinbox_.valueChanged.connect(self.UpdateBondRadius)
+    self.radius_bond_slider_.valueChanged.connect(self.UpdateSliderBondRadius)
+    
+    self.radius_sphere_spinbox_.valueChanged.connect(self.UpdateSphereRadius)
+    self.radius_sphere_slider_.valueChanged.connect(self.UpdateSliderSphereRadius)
     
     self.setMinimumSize(250,150)
     
diff --git a/modules/gui/pymod/scene/file_loader.py b/modules/gui/pymod/scene/file_loader.py
index a0acf4140..fedca4543 100644
--- a/modules/gui/pymod/scene/file_loader.py
+++ b/modules/gui/pymod/scene/file_loader.py
@@ -23,7 +23,7 @@ import ost
 import sip
 import re
 
-from PyQt4 import QtCore, QtGui, QtNetwork
+from PyQt5 import QtCore, QtGui, QtNetwork
 from ost.gui import FileLoader
 
 """
diff --git a/modules/gui/pymod/scene/gradient_editor_widget.py b/modules/gui/pymod/scene/gradient_editor_widget.py
index d4b93071b..370bd51cd 100644
--- a/modules/gui/pymod/scene/gradient_editor_widget.py
+++ b/modules/gui/pymod/scene/gradient_editor_widget.py
@@ -21,22 +21,22 @@
 from ost import gui
 from ost import gfx
 from ost import mol
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtGui, QtWidgets
 from color_select_widget import ColorSelectWidget
 from gradient_preset_widget import GradientPresetWidget
 
 #Gradient Editor
-class GradientEditor(QtGui.QWidget):
+class GradientEditor(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.parent_ = parent
     
     #Create Ui elements
-    gradient_label = QtGui.QLabel("Gradient Editor")
+    gradient_label = QtWidgets.QLabel("Gradient Editor")
     font = gradient_label.font()
     font.setBold(True)
     
-    self.prop_combo_box_ = QtGui.QComboBox()
+    self.prop_combo_box_ = QtWidgets.QComboBox()
     self.gradient_preview_ = GradientPreview()
     self.gradient_edit_ = GradientEdit(self.gradient_preview_,self)
     self.gradient_preset_ = GradientPresetWidget(self.gradient_edit_)
@@ -51,7 +51,7 @@ class GradientEditor(QtGui.QWidget):
     
     self.props=["abfac","rbfac","x","y","z","rnum","acharge"]
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(gradient_label, 0, 0, 1, 1)
     grid.addWidget(self.prop_combo_box_, 1, 0, 1, 1)
@@ -61,9 +61,9 @@ class GradientEditor(QtGui.QWidget):
     grid.addWidget(self.gradient_preset_, 5, 0, 1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.prop_combo_box_, QtCore.SIGNAL("currentIndexChanged(int)"), self.Update)
-    QtCore.QObject.connect(self.gradient_edit_, QtCore.SIGNAL("gradientUpdated"), self.Update)
-    QtCore.QObject.connect(self.gradient_preset_, QtCore.SIGNAL("gradientSelected"), self.gradient_edit_.LoadGradient)
+    self.prop_combo_box_.currentIndexChanged.connect(self.Update)
+    self.gradient_edit_.gradientUpdated.connect(self.Update)
+    self.gradient_preset_.gradientSelected.connect(self.gradient_edit_.LoadGradient)
     
     self.setMinimumSize(250,300)
         
@@ -97,14 +97,14 @@ class GradientEditor(QtGui.QWidget):
       entity.Apply(glco)
       
 #Gradient Preview
-class GradientPreview(QtGui.QWidget):
+class GradientPreview(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Defaults
     self.border_offset_ = 3
     self.preview_height_ = 25
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     self.gradient_ = QtGui.QLinearGradient()
     
@@ -129,9 +129,12 @@ class GradientPreview(QtGui.QWidget):
         paint.end()
     
 #Gradient Edit
-class GradientEdit(QtGui.QWidget):
+class GradientEdit(QtWidgets.QWidget):
+  
+  gradientUpdated = QtCore.pyqtSignal()
+
   def __init__(self, gradient_preview, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
 
     #Defaults
     self.gradient_preview_ = gradient_preview
@@ -143,8 +146,8 @@ class GradientEdit(QtGui.QWidget):
     
     
     #ContextMenu    
-    self.add_ = QtGui.QAction("Add", self)
-    QtCore.QObject.connect(self.add_, QtCore.SIGNAL("triggered()"), self.Add)
+    self.add_ = QtWidgets.QAction("Add", self)
+    self.add_.triggered.connect(self.Add)
     self.addAction(self.add_)
     self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
     
@@ -165,33 +168,34 @@ class GradientEdit(QtGui.QWidget):
     self.width_ = self.width()
 
   def RemoveStop(self, stop):
-      self.stops.remove(stop)
-      stop.hide()
-      del(stop)
+    self.stops.remove(stop)
+    stop.hide()
+    del(stop)
 
-      self.UpdateGradient()
-      self.emit(QtCore.SIGNAL("gradientUpdated"),(self))
+    self.UpdateGradient()
+    self.gradientUpdated.emit()
       
   def RemoveStopGui(self, stop):
     if(len(self.stops)>2):
       self.RemoveStop(stop)
     else:
-      QtGui.QMessageBox.question(self, "Information", "Please keep in mind, at least two stops are needed for a gradient!")
+      QtWidgets.QMessageBox.question(self, "Information", "Please keep in mind, at least two stops are needed for a gradient!")
 
   def AddStop(self, pos, color=None):
     stop = MyGradientStop(pos, self.border_offset_, self, color)
-    QtCore.QObject.connect(stop, QtCore.SIGNAL("gradientChanged"), self.UpdateGradient)
-    QtCore.QObject.connect(stop, QtCore.SIGNAL("colorChanged"), self.UpdateGradient)
-    QtCore.QObject.connect(stop, QtCore.SIGNAL("colorChanged"), self.parent().Update)
-    QtCore.QObject.connect(stop, QtCore.SIGNAL("gradientUpdated"), self.parent().Update)
-    QtCore.QObject.connect(stop, QtCore.SIGNAL("removeStop"), self.RemoveStopGui)
+    stop.gradientChanged.connect(self.UpdateGradient)
+    stop.colorChanged.connect(self.UpdateGradient)
+    stop.colorChanged.connect(self.parent().Update)
+    stop.gradientUpdated.connect(self.parent().Update)
+    stop.removeStop.connect(self.RemoveStopGui)
+    stop.MoveToNewPos()
     
     self.stops.append(stop)
-    self.UpdateGradient()
-    self.emit(QtCore.SIGNAL("gradientUpdated"),(self))  
+    self.UpdateGradient() 
+    self.gradientUpdated.emit()
   
   def Add(self):
-    self.AddStop(QtGui.QCursor.pos().x() - self.mapToGlobal(QtCore.QPoint(0, 0)).x())
+    self.AddStop(QtWidgets.QCursor.pos().x() - self.mapToGlobal(QtCore.QPoint(0, 0)).x())
   
   def UpdateGradient(self):
     self.gradient_preview_.SetGradient(self.GetGradient())      
@@ -235,6 +239,11 @@ class GradientEdit(QtGui.QWidget):
     
 #Gradient Stop  
 class MyGradientStop(ColorSelectWidget):
+
+  removeStop = QtCore.pyqtSignal()
+  gradientChanged = QtCore.pyqtSignal()
+  gradientUpdated = QtCore.pyqtSignal()
+
   def __init__(self, pos, offset, parent, color=None):
     #Defaults
     self.length_ = 20
@@ -245,8 +254,6 @@ class MyGradientStop(ColorSelectWidget):
     
     ColorSelectWidget.__init__(self, self.length_,self.length_, color, parent)
     
-    self.MoveToNewPos()
-    
     if(color is None):
       self.color_ = QtGui.QColor("White")
       self.ChangeColor()
@@ -254,12 +261,12 @@ class MyGradientStop(ColorSelectWidget):
       self.color_ = color
     
     #ContextMenu    
-    self.remove_ = QtGui.QAction("Remove", self)
-    QtCore.QObject.connect(self.remove_, QtCore.SIGNAL("triggered()"), self.Remove)
+    self.remove_ = QtWidgets.QAction("Remove", self)
+    self.remove_.triggered.connect(self.Remove)
     self.addAction(self.remove_)
     
   def Remove(self):
-    self.emit(QtCore.SIGNAL("removeStop"),(self))
+    self.removeStop.emit()
 
   def GetPos(self):
     return self.pos_
@@ -279,7 +286,7 @@ class MyGradientStop(ColorSelectWidget):
   def MoveToNewPos(self):
     self.move(self.pos_ - self.halflength_, 0)
     self.update()
-    self.emit(QtCore.SIGNAL("gradientChanged"))
+    self.gradientChanged.emit()
  
   def mouseMoveEvent(self, event):
     self.pos_ += event.pos().x() - self.halflength_
@@ -294,4 +301,4 @@ class MyGradientStop(ColorSelectWidget):
     
   def mouseReleaseEvent(self, entity):
     if entity.button() == QtCore.Qt.LeftButton:
-      self.emit(QtCore.SIGNAL("gradientUpdated"))
+      self.gradientUpdated.emit()
diff --git a/modules/gui/pymod/scene/gradient_info_handler.py b/modules/gui/pymod/scene/gradient_info_handler.py
index 951dcd668..747b05860 100644
--- a/modules/gui/pymod/scene/gradient_info_handler.py
+++ b/modules/gui/pymod/scene/gradient_info_handler.py
@@ -21,7 +21,7 @@
 from ost import gui
 from ost import gfx
 from ost import info
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore
 from immutable_gradient_info_handler import ImmutableGradientInfoHandler
 
 #Gradient Info Handler
@@ -57,4 +57,4 @@ class GradientInfoHandler(ImmutableGradientInfoHandler):
         groupname = group.GetAttribute(self.NAME_ATTRIBUTE_NAME)
         if old == groupname:
           group.SetAttribute(self.NAME_ATTRIBUTE_NAME, new)
-          self.handle_.Export(self.FILE_NAME)
\ No newline at end of file
+          self.handle_.Export(self.FILE_NAME)
diff --git a/modules/gui/pymod/scene/gradient_list_model.py b/modules/gui/pymod/scene/gradient_list_model.py
index 8e859f4d7..43f3f95db 100644
--- a/modules/gui/pymod/scene/gradient_list_model.py
+++ b/modules/gui/pymod/scene/gradient_list_model.py
@@ -2,7 +2,7 @@ from ost import gui
 from ost import gfx
 import os
 import ost
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 from immutable_gradient_info_handler import ImmutableGradientInfoHandler
 from gradient_info_handler import GradientInfoHandler
 
@@ -11,6 +11,8 @@ class GradientListModel(QtCore.QAbstractListModel):
   IMMUTABLE_GRADIENTS_PATH = os.path.join(ost.GetSharedDataPath(),"scene", 
                                           "gradients.xml")
   MUTABLE_GRADIENTS_PATH = "user_gradients.xml"
+
+  dataChanged = QtCore.pyqtSignal(int, int, name="dataChanged")
   
   def __init__(self, parent=None, *args): 
     QtCore.QAbstractListModel.__init__(self, parent, *args)
@@ -32,7 +34,7 @@ class GradientListModel(QtCore.QAbstractListModel):
       end_index = self.createIndex(self.rowCount(),0)
       if save:
         self.AddGradientToInfo(gradient,name)
-      self.emit(QtCore.SIGNAL("dataChanged"),model_index, end_index)
+      self.dataChanged.emit(model_index, end_index)
       return True
     return False
   
@@ -45,7 +47,7 @@ class GradientListModel(QtCore.QAbstractListModel):
       self.removeRow(row, QtCore.QModelIndex())
       model_index = self.createIndex(row,0)
       self.infoh_.RemoveGradient(name)
-      self.emit(QtCore.SIGNAL("dataChanged"),model_index, model_index)
+      self.dataChanged.emit(model_index, model_index)
       return True
     return False
 
@@ -115,12 +117,12 @@ class GradientListModel(QtCore.QAbstractListModel):
         new_name = value.toString()
         self.data_[row][0] = new_name
         self.infoh_.RenameGradient(old_name,str(new_name))
-        self.emit(QtCore.SIGNAL("dataChanged"),index, index)
+        self.dataChanged.emit(index, index)
         return True
       elif role == QtCore.Qt.DisplayRole:
         self.data_[row][0] = value.toString()
       elif role == QtCore.Qt.DecorationRole:
-        self.dat_[row][2] = value.toPyObject()
+        self.data_[row][2] = value.toPyObject()
     return False
 
   def flags(self, index):
@@ -146,4 +148,4 @@ class GradientListModel(QtCore.QAbstractListModel):
 
   
   
-  
\ No newline at end of file
+  
diff --git a/modules/gui/pymod/scene/gradient_preset_widget.py b/modules/gui/pymod/scene/gradient_preset_widget.py
index ebbfc942f..998714bef 100644
--- a/modules/gui/pymod/scene/gradient_preset_widget.py
+++ b/modules/gui/pymod/scene/gradient_preset_widget.py
@@ -26,85 +26,88 @@ from ost import info
 from datetime import datetime
 
 from datetime import datetime
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 from gradient_info_handler import GradientInfoHandler
 from gradient_list_model import GradientListModel
 
 
 #Gradient Preset Widget
-class GradientPresetWidget(QtGui.QWidget):
+class GradientPresetWidget(QtWidgets.QWidget):
   ICONS_DIR = os.path.join(ost.GetSharedDataPath(), "gui", "icons/")
+
+  gradientSelected = QtCore.pyqtSignal(object, name="gradientSelected")
+
   def __init__(self, gradient_edit, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Title
     self.text_ = "Gradient Presets"
     
     #Refrences
-    self.gradient_edit_ = gradient_edit
-    
+    self.gradient_edit_ = gradient_edit   
+
     #Create Ui elements
-    self.list_view_ = QtGui.QListView()
+    self.list_view_ = QtWidgets.QListView()
     
     #Create Model
     self.list_model_ = GradientListModel(self)
     self.list_view_.setModel(self.list_model_)
-    self.list_view_.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+    self.list_view_.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
         
-    preset_label = QtGui.QLabel(self.text_)
+    preset_label = QtWidgets.QLabel(self.text_)
     font = preset_label.font()
     font.setBold(True)
     
-    self.add_action = QtGui.QAction("+",self)
+    self.add_action = QtWidgets.QAction("+",self)
     self.add_action.setIcon(QtGui.QIcon(GradientPresetWidget.ICONS_DIR+"add_icon.png"))
     
-    QtCore.QObject.connect(self.add_action, QtCore.SIGNAL("triggered()"), self.Add)
+    self.add_action.triggered.connect(self.Add)
     
-    self.add_button_ = QtGui.QToolButton(self)
+    self.add_button_ = QtWidgets.QToolButton(self)
     self.add_button_.setIconSize(QtCore.QSize(20,20))
     self.add_button_.setDefaultAction(self.add_action)
         
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(preset_label, 0, 0, 1, 1)
-    qhbox = QtGui.QHBoxLayout()
+    qhbox = QtWidgets.QHBoxLayout()
     grid.addWidget(self.list_view_,1,0,3,3)
     grid.addWidget(self.add_button_,4,0,1,1)
     self.setLayout(grid)
     
     self.list_view_.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
-    QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("customContextMenuRequested(const QPoint)"), self.contextMenuEvent)
+    self.list_view_.customContextMenuRequested.connect(self.contextMenuEvent)
     self.CreateImmutableContextMenu()
     self.CreateContextMenu()
 
-    QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("doubleClicked(const QModelIndex)"), self.Load)
+    self.list_view_.doubleClicked.connect(self.Load)
 
   def CreateImmutableContextMenu(self):  
-    self.immucontextMenu_ = QtGui.QMenu("Context menu", self)
-    self.load_ = QtGui.QAction("Load", self.list_view_)  
+    self.immucontextMenu_ = QtWidgets.QMenu("Context menu", self)
+    self.load_ = QtWidgets.QAction("Load", self.list_view_)  
     self.immucontextMenu_.addAction(self.load_)
     #Connect Signal with Slot  
-    QtCore.QObject.connect(self.load_, QtCore.SIGNAL("triggered()"), self.LoadCurrentIndex)
+    self.load_.triggered.connect(self.LoadCurrentIndex)
 
   def CreateContextMenu(self):
-    self.contextMenu_ = QtGui.QMenu("Context menu", self)
-    self.remove_ = QtGui.QAction("Remove", self.list_view_)
-    self.rename_ = QtGui.QAction("Rename", self.list_view_)
+    self.contextMenu_ = QtWidgets.QMenu("Context menu", self)
+    self.remove_ = QtWidgets.QAction("Remove", self.list_view_)
+    self.rename_ = QtWidgets.QAction("Rename", self.list_view_)
     self.contextMenu_.addAction(self.load_)
     self.contextMenu_.addAction(self.remove_)
     self.contextMenu_.addAction(self.rename_)
     #Connect Signals with Slots  
-    QtCore.QObject.connect(self.remove_, QtCore.SIGNAL("triggered()"), self.Remove)
-    QtCore.QObject.connect(self.rename_, QtCore.SIGNAL("triggered()"), self.Rename)
+    self.remove_.triggered.connect(self.Remove)
+    self.rename_.triggered.connect(self.Rename)
   
   def contextMenuEvent(self, pos):
     #ContextMenu
     index = self.list_view_.indexAt(pos)
     if index.isValid(): 
       if self.list_model_.IsEditable(index.row()):
-        self.contextMenu_.popup(QtGui.QCursor.pos())
+        self.contextMenu_.popup(QtWidgets.QCursor.pos())
       else:
-        self.immucontextMenu_.popup(QtGui.QCursor.pos())
+        self.immucontextMenu_.popup(QtWidgets.QCursor.pos())
   
   def Add(self):
     if(self.list_view_.currentIndex().isValid()):
@@ -115,14 +118,14 @@ class GradientPresetWidget(QtGui.QWidget):
       self.list_view_.setCurrentIndex(index)
       self.Rename()
     else:
-      QtGui.QMessageBox.information(self, "Gradient not added", "The gradient could not be added!")
+      QtWidgets.QMessageBox.information(self, "Gradient not added", "The gradient could not be added!")
       
   def Remove(self):
     if(self.list_view_.currentIndex().isValid()):
-      ret = QtGui.QMessageBox.warning(self, "Delete Gradient",
+      ret = QtWidgets.QMessageBox.warning(self, "Delete Gradient",
                    "Delete Gradient?",
-                   QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
-      if ret == QtGui.QMessageBox.Yes:
+                   QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+      if ret == QtWidgets.QMessageBox.Yes:
         self.list_model_.RemoveItem(self.list_view_.currentIndex().row())
 
   def LoadCurrentIndex(self):
@@ -131,7 +134,7 @@ class GradientPresetWidget(QtGui.QWidget):
 
   def Load(self, index):
     if(index.isValid()):
-      self.emit(QtCore.SIGNAL("gradientSelected"),self.list_model_.GetGradient(index))
+      self.gradientSelected.emit(self.list_model_.GetGradient(index))
 
   def Rename(self):
     if(self.list_view_.currentIndex().isValid()):
diff --git a/modules/gui/pymod/scene/hsc_widget.py b/modules/gui/pymod/scene/hsc_widget.py
index c67dc9721..442639a71 100644
--- a/modules/gui/pymod/scene/hsc_widget.py
+++ b/modules/gui/pymod/scene/hsc_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Tube Render Options
@@ -59,172 +59,172 @@ class HSCWidget(RenderModeWidget):
     #########UI##########
     
     #Poly Mode
-    poly_mode_label = QtGui.QLabel("Poly Mode")
+    poly_mode_label = QtWidgets.QLabel("Poly Mode")
     
-    self.poly_mode_cb_ = QtGui.QComboBox()
+    self.poly_mode_cb_ = QtWidgets.QComboBox()
     self.poly_mode_cb_.addItem("Points")
     self.poly_mode_cb_.addItem("Wireframe")
     self.poly_mode_cb_.addItem("Surface")
     
     #Sphere Label
-    spline_label = QtGui.QLabel("Spline Detail")
+    spline_label = QtWidgets.QLabel("Spline Detail")
     
-    self.spline_spinbox_ = QtGui.QSpinBox()
+    self.spline_spinbox_ = QtWidgets.QSpinBox()
     self.spline_spinbox_.setRange(min_spline_detail, max_spline_detail)
     
     #Arc Label
-    arc_label = QtGui.QLabel("Arc Detail")
+    arc_label = QtWidgets.QLabel("Arc Detail")
     
-    self.arc_spinbox_ = QtGui.QSpinBox()
+    self.arc_spinbox_ = QtWidgets.QSpinBox()
     self.arc_spinbox_.setRange(min_arc_detail, max_arc_detail)
     
     #Tube
-    tube_label = QtGui.QLabel("Tube")
+    tube_label = QtWidgets.QLabel("Tube")
     font = tube_label.font()
     font.setBold(True)
     
     #Tube Radius
-    radius_tube_label = QtGui.QLabel("Radius")
+    radius_tube_label = QtWidgets.QLabel("Radius")
     
-    self.width_tube_spinbox_ = QtGui.QDoubleSpinBox()
+    self.width_tube_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.width_tube_spinbox_.setRange(min_width, max_tube_width)
     self.width_tube_spinbox_.setDecimals(1)
     self.width_tube_spinbox_.setSingleStep(0.1)
     
-    self.width_tube_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.width_tube_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.width_tube_slider_.setRange(min_width*10.0, max_tube_width*10.0)
-    self.width_tube_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.width_tube_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.width_tube_slider_.setTickInterval(1)
     
     #Tube Ratio
-    ratio_tube_label = QtGui.QLabel("Ratio")
+    ratio_tube_label = QtWidgets.QLabel("Ratio")
     
-    self.thickness_tube_spinbox_ = QtGui.QDoubleSpinBox()
+    self.thickness_tube_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.thickness_tube_spinbox_.setRange(min_tube_ratio, max_tube_ratio)
     self.thickness_tube_spinbox_.setDecimals(1)
     self.thickness_tube_spinbox_.setSingleStep(0.1)
     
-    self.thickness_tube_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.thickness_tube_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.thickness_tube_slider_.setRange(min_tube_ratio*10.0, max_tube_ratio*10)
-    self.thickness_tube_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.thickness_tube_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.thickness_tube_slider_.setTickInterval(1)
 
     # Tube Profile Type
-    tube_profile_label = QtGui.QLabel("Tube Profile Type")
-    self.tube_profile_spinbox_ = QtGui.QSpinBox()
+    tube_profile_label = QtWidgets.QLabel("Tube Profile Type")
+    self.tube_profile_spinbox_ = QtWidgets.QSpinBox()
     self.tube_profile_spinbox_.setRange(min_profile, max_profile)
     
     # Helix
-    helix_label = QtGui.QLabel("Helix")
+    helix_label = QtWidgets.QLabel("Helix")
     font = helix_label.font()
     font.setBold(True)
     
     #Helix Radius
-    radius_helix_label = QtGui.QLabel("Width")
+    radius_helix_label = QtWidgets.QLabel("Width")
     
-    self.width_helix_spinbox_ = QtGui.QDoubleSpinBox()
+    self.width_helix_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.width_helix_spinbox_.setRange(min_width, max_width)
     self.width_helix_spinbox_.setDecimals(1)
     self.width_helix_spinbox_.setSingleStep(0.1)
     
-    self.width_helix_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.width_helix_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.width_helix_slider_.setRange(min_width*10.0, max_width*10.0)
-    self.width_helix_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.width_helix_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.width_helix_slider_.setTickInterval(1)
     
     #Helix Ratio
-    ratio_helix_label = QtGui.QLabel("Thickness")
+    ratio_helix_label = QtWidgets.QLabel("Thickness")
     
-    self.thickness_helix_spinbox_ = QtGui.QDoubleSpinBox()
+    self.thickness_helix_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.thickness_helix_spinbox_.setRange(min_ratio,max_ratio)
     self.thickness_helix_spinbox_.setDecimals(1)
     self.thickness_helix_spinbox_.setSingleStep(0.1)
     
-    self.thickness_helix_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.thickness_helix_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.thickness_helix_slider_.setRange(min_ratio*10.0,max_ratio*10.0)
-    self.thickness_helix_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.thickness_helix_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.thickness_helix_slider_.setTickInterval(1)
     
     #Helix ECC
-    ecc_helix_label = QtGui.QLabel("ECC")
+    ecc_helix_label = QtWidgets.QLabel("ECC")
     
-    self.ecc_helix_spinbox_ = QtGui.QDoubleSpinBox()
+    self.ecc_helix_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.ecc_helix_spinbox_.setRange(min_ecc,max_ecc)
     self.ecc_helix_spinbox_.setDecimals(1)
     self.ecc_helix_spinbox_.setSingleStep(0.1)
     
-    self.ecc_helix_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.ecc_helix_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.ecc_helix_slider_.setRange(min_ecc*10,max_ecc*10)
-    self.ecc_helix_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.ecc_helix_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.ecc_helix_slider_.setTickInterval(1)
     
     # Helix Profile Type
-    helix_profile_label = QtGui.QLabel("Helix Profile Type")
-    self.helix_profile_spinbox_ = QtGui.QSpinBox()
+    helix_profile_label = QtWidgets.QLabel("Helix Profile Type")
+    self.helix_profile_spinbox_ = QtWidgets.QSpinBox()
     self.helix_profile_spinbox_.setRange(min_profile, max_profile)
     
     # Helix Rendering Mode
-    helix_mode_label = QtGui.QLabel("Helix Render Mode")
-    self.helix_mode_spinbox_ = QtGui.QSpinBox()
+    helix_mode_label = QtWidgets.QLabel("Helix Render Mode")
+    self.helix_mode_spinbox_ = QtWidgets.QSpinBox()
     self.helix_mode_spinbox_.setRange(0, 1)
     
     #Strand
-    strand_label = QtGui.QLabel("Strand")
+    strand_label = QtWidgets.QLabel("Strand")
     font = strand_label.font()
     font.setBold(1)
     
     #Strand Radius
-    radius_strand_label = QtGui.QLabel("Width")
+    radius_strand_label = QtWidgets.QLabel("Width")
     
-    self.width_strand_spinbox_ = QtGui.QDoubleSpinBox()
+    self.width_strand_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.width_strand_spinbox_.setRange(min_width, max_width)
     self.width_strand_spinbox_.setDecimals(1)
     self.width_strand_spinbox_.setSingleStep(0.1)
     
-    self.width_strand_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.width_strand_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.width_strand_slider_.setRange(min_width*10, max_width*10)
-    self.width_strand_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.width_strand_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.width_strand_slider_.setTickInterval(1)
     
     #Strand Ratio
-    ratio_strand_label = QtGui.QLabel("Thickness")
+    ratio_strand_label = QtWidgets.QLabel("Thickness")
     
-    self.thickness_strand_spinbox_ = QtGui.QDoubleSpinBox()
+    self.thickness_strand_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.thickness_strand_spinbox_.setRange(min_ratio,max_ratio)
     self.thickness_strand_spinbox_.setDecimals(1)
     self.thickness_strand_spinbox_.setSingleStep(0.1)
     
-    self.thickness_strand_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.thickness_strand_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.thickness_strand_slider_.setRange(min_ratio*10,max_ratio*10)
-    self.thickness_strand_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.thickness_strand_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.thickness_strand_slider_.setTickInterval(1)
     
     #Strand ECC
-    ecc_strand_label = QtGui.QLabel("ECC")
+    ecc_strand_label = QtWidgets.QLabel("ECC")
     
-    self.ecc_strand_spinbox_ = QtGui.QDoubleSpinBox()
+    self.ecc_strand_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.ecc_strand_spinbox_.setRange(min_ecc,max_ecc)
     self.ecc_strand_spinbox_.setDecimals(1)
     self.ecc_strand_spinbox_.setSingleStep(0.1)
     
-    self.ecc_strand_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.ecc_strand_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.ecc_strand_slider_.setRange(min_ecc*10,max_ecc*10)
-    self.ecc_strand_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.ecc_strand_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.ecc_strand_slider_.setTickInterval(1)  
     
     # Strand Profile Type
-    strand_profile_label = QtGui.QLabel("Strand Profile Type")
-    self.strand_profile_spinbox_ = QtGui.QSpinBox()
+    strand_profile_label = QtWidgets.QLabel("Strand Profile Type")
+    self.strand_profile_spinbox_ = QtWidgets.QSpinBox()
     self.strand_profile_spinbox_.setRange(min_profile, max_profile)
 
     # Strand Rendering Mode
-    strand_mode_label = QtGui.QLabel("Strand Render Mode")
-    self.strand_mode_spinbox_ = QtGui.QSpinBox()
+    strand_mode_label = QtWidgets.QLabel("Strand Render Mode")
+    self.strand_mode_spinbox_ = QtWidgets.QSpinBox()
     self.strand_mode_spinbox_.setRange(0, 1)
 
     #
     row=1
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(poly_mode_label,row,0,1,1)
     grid.addWidget(self.poly_mode_cb_,row,3,1,2)
     row+=1
@@ -290,33 +290,33 @@ class HSCWidget(RenderModeWidget):
     grid.setRowStretch(row+1,1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.spline_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSplineDetail)
-    QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail)
-    QtCore.QObject.connect(self.poly_mode_cb_, QtCore.SIGNAL("currentIndexChanged(int)"), self.UpdatePolyMode)
-    
-    QtCore.QObject.connect(self.width_tube_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateTubeRadius)
-    QtCore.QObject.connect(self.width_tube_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderTubeRadius)
-    QtCore.QObject.connect(self.thickness_tube_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateTubeRatio)
-    QtCore.QObject.connect(self.thickness_tube_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderTubeRatio)
-    QtCore.QObject.connect(self.tube_profile_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateTubeProfileType)
-    
-    QtCore.QObject.connect(self.width_helix_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateHelixWidth)
-    QtCore.QObject.connect(self.width_helix_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderHelixWidth)
-    QtCore.QObject.connect(self.thickness_helix_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateHelixThickness)
-    QtCore.QObject.connect(self.thickness_helix_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderHelixThickness)
-    QtCore.QObject.connect(self.ecc_helix_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateHelixEcc)
-    QtCore.QObject.connect(self.ecc_helix_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderHelixEcc)
-    QtCore.QObject.connect(self.helix_profile_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateHelixProfileType)
-    QtCore.QObject.connect(self.helix_mode_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateHelixMode)
+    self.spline_spinbox_.valueChanged.connect(self.UpdateSplineDetail)
+    self.arc_spinbox_.valueChanged.connect(self.UpdateArcDetail)
+    self.poly_mode_cb_.currentIndexChanged.connect(self.UpdatePolyMode)
+    
+    self.width_tube_spinbox_.valueChanged.connect(self.UpdateTubeRadius)
+    self.width_tube_slider_.valueChanged.connect(self.UpdateSliderTubeRadius)
+    self.thickness_tube_spinbox_.valueChanged.connect(self.UpdateTubeRatio)
+    self.thickness_tube_slider_.valueChanged.connect(self.UpdateSliderTubeRatio)
+    self.tube_profile_spinbox_.valueChanged.connect(self.UpdateTubeProfileType)
+    
+    self.width_helix_spinbox_.valueChanged.connect(self.UpdateHelixWidth)
+    self.width_helix_slider_.valueChanged.connect(self.UpdateSliderHelixWidth)
+    self.thickness_helix_spinbox_.valueChanged.connect(self.UpdateHelixThickness)
+    self.thickness_helix_slider_.valueChanged.connect(self.UpdateSliderHelixThickness)
+    self.ecc_helix_spinbox_.valueChanged.connect(self.UpdateHelixEcc)
+    self.ecc_helix_slider_.valueChanged.connect(self.UpdateSliderHelixEcc)
+    self.helix_profile_spinbox_.valueChanged.connect(self.UpdateHelixProfileType)
+    self.helix_mode_spinbox_.valueChanged.connect(self.UpdateHelixMode)
 
-    QtCore.QObject.connect(self.width_strand_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateStrandWidth)
-    QtCore.QObject.connect(self.width_strand_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderStrandWidth)
-    QtCore.QObject.connect(self.thickness_strand_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateStrandThickness)
-    QtCore.QObject.connect(self.thickness_strand_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderStrandThickness)
-    QtCore.QObject.connect(self.ecc_strand_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateStrandEcc)
-    QtCore.QObject.connect(self.ecc_strand_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderStrandEcc)    
-    QtCore.QObject.connect(self.strand_profile_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateStrandProfileType)
-    QtCore.QObject.connect(self.strand_mode_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateStrandMode)
+    self.width_strand_spinbox_.valueChanged.connect(self.UpdateStrandWidth)
+    self.width_strand_slider_.valueChanged.connect(self.UpdateSliderStrandWidth)
+    self.thickness_strand_spinbox_.valueChanged.connect(self.UpdateStrandThickness)
+    self.thickness_strand_slider_.valueChanged.connect(self.UpdateSliderStrandThickness)
+    self.ecc_strand_spinbox_.valueChanged.connect(self.UpdateStrandEcc)
+    self.ecc_strand_slider_.valueChanged.connect(self.UpdateSliderStrandEcc)    
+    self.strand_profile_spinbox_.valueChanged.connect(self.UpdateStrandProfileType)
+    self.strand_mode_spinbox_.valueChanged.connect(self.UpdateStrandMode)
     
     self.setMinimumSize(250,550)
     ########/UI########
diff --git a/modules/gui/pymod/scene/immutable_gradient_info_handler.py b/modules/gui/pymod/scene/immutable_gradient_info_handler.py
index c70b041e9..65ecf0d9c 100644
--- a/modules/gui/pymod/scene/immutable_gradient_info_handler.py
+++ b/modules/gui/pymod/scene/immutable_gradient_info_handler.py
@@ -21,7 +21,7 @@
 from ost import gui
 from ost import gfx
 from ost import info
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 
 #Gradient Editor
 class ImmutableGradientInfoHandler:
diff --git a/modules/gui/pymod/scene/immutable_info_handler.py b/modules/gui/pymod/scene/immutable_info_handler.py
index 600fd393d..e766c8402 100644
--- a/modules/gui/pymod/scene/immutable_info_handler.py
+++ b/modules/gui/pymod/scene/immutable_info_handler.py
@@ -21,7 +21,7 @@
 from ost import gui
 from ost import gfx
 from ost import info
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 
 #Gradient Editor
 class ImmutableInfoHandler:
@@ -50,13 +50,13 @@ class ImmutableInfoHandler:
   
   def ConvertToQGradient(self, gfxGradient):
     stops = gfxGradient.GetStops()
-    qgrad = QtGui.QLinearGradient()
+    qgrad = QtWidgets.QLinearGradient()
     for stop in stops:
       color = stop.GetColor()
-      qcolor = QtGui.QColor(color.Red()*255,
-                            color.Green()*255,
-                            color.Blue()*255,
-                            color.Alpha()*255)
+      qcolor = QtWidgets.QColor(color.Red()*255,
+                                color.Green()*255,
+                                color.Blue()*255,
+                                color.Alpha()*255)
       qgrad.setColorAt(stop.GetRel(), qcolor) 
     return qgrad 
   
diff --git a/modules/gui/pymod/scene/immutable_preset_info_handler.py b/modules/gui/pymod/scene/immutable_preset_info_handler.py
index 5b1fb7c12..83dd1c741 100644
--- a/modules/gui/pymod/scene/immutable_preset_info_handler.py
+++ b/modules/gui/pymod/scene/immutable_preset_info_handler.py
@@ -21,7 +21,6 @@
 from ost import gui
 from ost import gfx
 from ost import info
-from PyQt4 import QtCore, QtGui
 from ost.gui.scene.preset import Preset
 
 #Gradient Editor
diff --git a/modules/gui/pymod/scene/init_inspector.py b/modules/gui/pymod/scene/init_inspector.py
index 72b35454d..0e2803dae 100644
--- a/modules/gui/pymod/scene/init_inspector.py
+++ b/modules/gui/pymod/scene/init_inspector.py
@@ -21,7 +21,7 @@ import sip
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore
 from ost.gui.scene.inspector_widget import InspectorDialog
   
 def _InitInspector(app):
diff --git a/modules/gui/pymod/scene/inspector_widget.py b/modules/gui/pymod/scene/inspector_widget.py
index 4a976841b..503d3acdc 100644
--- a/modules/gui/pymod/scene/inspector_widget.py
+++ b/modules/gui/pymod/scene/inspector_widget.py
@@ -23,7 +23,7 @@ import sip
 from ost import gfx
 import ost
 import os
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from toolbar_options_widget import ToolBarOptionsWidget 
 from render_options_widget import RenderOptionsWidget
 from color_options_widget import ColorOptionsWidget
@@ -48,8 +48,7 @@ class InspectorWidget(ToolBarOptionsWidget):
     self.obs = SceneObserverImpl()
     self.obs.AttachObserver(self)
     ost.scene.AttachObserver(self.obs)
-    QtCore.QObject.connect(app.scene_win.qobject,QtCore.SIGNAL("ActiveNodesChanged()"),
-                           self.ActiveNodesChanged)     
+    app.scene_win.qobject.ActiveNodesChanged.connect(self.ActiveNodesChanged)     
     
     self.setMinimumSize(250,215)
   #ToolBarOptionsWidget Method
@@ -73,19 +72,22 @@ class InspectorWidget(ToolBarOptionsWidget):
     SelHelper().Update()
     ToolBarOptionsWidget.Update(self)
 
-class InspectorDialog(QtGui.QDialog):
+class InspectorDialog(QtWidgets.QDialog):
+
+  visible = QtCore.pyqtSignal(bool, name="visible")
+
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.setWindowTitle("Inspector Gadget")
     self.setAttribute(QtCore.Qt.WA_MacSmallSize)    
-    self.layout=QtGui.QHBoxLayout()
-    self.layout.setMargin(0)
+    self.layout=QtWidgets.QHBoxLayout()
+    self.layout.setContentsMargins(0,0,0,0)
     self.layout.setSpacing(0)
     self.setLayout(self.layout)
     self.mywidget_ = InspectorWidget(self)
     self.layout.addWidget(self.mywidget_)
-    size_pol = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
-                                 QtGui.QSizePolicy.Expanding)
+    size_pol = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
+                                 QtWidgets.QSizePolicy.Expanding)
     self.setSizePolicy(size_pol)
     self.DoResize()
     
@@ -100,9 +102,9 @@ class InspectorDialog(QtGui.QDialog):
     self.setHidden(not self.isHidden())
 
   def hideEvent(self, event):
-    self.emit(QtCore.SIGNAL("visible"),False)
-    QtGui.QDialog.hideEvent(self,event)
+    self.visible.emit(False)
+    QtWidgets.QDialog.hideEvent(self,event)
     
   def showEvent(self, event):
-    self.emit(QtCore.SIGNAL("visible"),True)
-    QtGui.QDialog.showEvent(self,event)
\ No newline at end of file
+    self.visible.emit(True)
+    QtWidgets.QDialog.showEvent(self,event)
diff --git a/modules/gui/pymod/scene/line_trace_widget.py b/modules/gui/pymod/scene/line_trace_widget.py
index 5b1133e72..569f6dfcc 100644
--- a/modules/gui/pymod/scene/line_trace_widget.py
+++ b/modules/gui/pymod/scene/line_trace_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Simple Render Options
@@ -39,20 +39,20 @@ class LineTraceWidget(RenderModeWidget):
     max_line_width = 20
         
     #Create Ui elements
-    self.radius_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_spinbox_.setRange(min_line_width, max_line_width)
     self.radius_spinbox_.setDecimals(2)
     self.radius_spinbox_.setSingleStep(0.1)
     
-    self.aa_rendering_cb_ = QtGui.QCheckBox()
+    self.aa_rendering_cb_ = QtWidgets.QCheckBox()
     
-    sline_label = QtGui.QLabel("Trace Settings")
+    sline_label = QtWidgets.QLabel("Trace Settings")
     font = sline_label.font()
     font.setBold(True)
     
-    radius_label = QtGui.QLabel("Line Width")
-    aa_label = QtGui.QLabel("AA-Lines")
-    grid = QtGui.QGridLayout()
+    radius_label = QtWidgets.QLabel("Line Width")
+    aa_label = QtWidgets.QLabel("AA-Lines")
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(sline_label, 0, 0, 1, 1)
     grid.addWidget(radius_label, 1, 0, 1, 3)
     grid.addWidget(self.radius_spinbox_, 1, 2, 1, 1)
@@ -61,12 +61,8 @@ class LineTraceWidget(RenderModeWidget):
     grid.setRowStretch(3,1)
     self.setLayout(grid)
 
-    QtCore.QObject.connect(self.radius_spinbox_, 
-                           QtCore.SIGNAL("valueChanged(double)"), 
-                           self.UpdateLineWidth)
-    QtCore.QObject.connect(self.aa_rendering_cb_, 
-                           QtCore.SIGNAL("stateChanged(int)"), 
-                           self.UpdateAA)
+    self.radius_spinbox_.valueChanged.connect(self.UpdateLineWidth)
+    self.aa_rendering_cb_.stateChanged.connect(self.UpdateAA)
 
     self.setMinimumSize(250,90)
     
diff --git a/modules/gui/pymod/scene/map_level_widget.py b/modules/gui/pymod/scene/map_level_widget.py
index 02851b761..b5c0905de 100644
--- a/modules/gui/pymod/scene/map_level_widget.py
+++ b/modules/gui/pymod/scene/map_level_widget.py
@@ -26,13 +26,13 @@ try:
 except ImportError:
   _img_present=False
   pass
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 
 from preset_widget import PresetWidget
 
-class AdditionalSettingsWidget(QtGui.QStackedWidget):
+class AdditionalSettingsWidget(QtWidgets.QStackedWidget):
   def __init__(self, parent=None):
-    QtGui.QStackedWidget.__init__(self, parent)
+    QtWidgets.QStackedWidget.__init__(self, parent)
     self.map_widget_ = MapLevelWidget(self)
     self.preset_widget_ = PresetWidget(self)
     self.addWidget(self.preset_widget_);
@@ -67,22 +67,22 @@ class AdditionalSettingsWidget(QtGui.QStackedWidget):
       self.setEnabled(False)
     
 #Map Level Widget
-class MapLevelWidget(QtGui.QWidget):
+class MapLevelWidget(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Create Ui elements
-    self.map_level_label_ = QtGui.QLabel("Map Contour Level")
+    self.map_level_label_ = QtWidgets.QLabel("Map Contour Level")
     self.font = self.map_level_label_.font()
     self.font.setBold(True)
     
     self.level_preview_ = LevelPreview()
     
-    self.level_spinbox_ = QtGui.QDoubleSpinBox()
+    self.level_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.level_spinbox_.setDecimals(3)
     self.level_spinbox_.setSingleStep(0.05)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.level_preview_, 0, 0, 1, 4)
     grid.addWidget(self.map_level_label_, 1, 0, 1, 3)
@@ -90,9 +90,9 @@ class MapLevelWidget(QtGui.QWidget):
     grid.setRowStretch(3, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.level_preview_, QtCore.SIGNAL("levelUpdated"), self.UpdateLevel)
-    QtCore.QObject.connect(self.level_preview_, QtCore.SIGNAL("levelModified"), self.ModifySpinBox)
-    QtCore.QObject.connect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
+    self.level_preview_.levelUpdated.connect(self.UpdateLevel)
+    self.level_preview_.levelModified.connect(self.ModifySpinBox)
+    self.level_spinbox_.valueChanged.connect(self.UpdateLevel)
 
     self.setMinimumSize(250,200)
         
@@ -129,19 +129,23 @@ class MapLevelWidget(QtGui.QWidget):
       node.SetLevel(level)
       
   def ModifySpinBox(self, level):
-    QtCore.QObject.disconnect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
+    self.level_spinbox_.valueChanged.disconnect(self.UpdateLevel)
     self.level_spinbox_.setValue(level)
-    QtCore.QObject.connect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
+    self.level_spinbox_.valueChanged.connect(self.UpdateLevel)
         
 #Level Preview
-class LevelPreview(QtGui.QWidget):
+class LevelPreview(QtWidgets.QWidget):
+
+  levelUpdated = QtCore.pyqtSignal(int, name="levelUpdated")
+  levelModified = QtCore.pyqtSignal(int, name="levelModified")
+
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Defaults
     self.border_offset_ = 3
     self.preview_height_ = 150
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Ui
     self.setMinimumSize(0, self.preview_height_ + 4)
@@ -171,7 +175,7 @@ class LevelPreview(QtGui.QWidget):
     
   def paintEvent(self, event):   
     if self.isEnabled() and self.bins_ is not None:
-      painter = QtGui.QPainter()
+      painter = QtWidgets.QPainter()
       if painter.begin(self):
         self.PaintBackground(painter)
         self.PaintBins(painter)
@@ -228,7 +232,7 @@ class LevelPreview(QtGui.QWidget):
     width = size.width()-(2* self.border_offset_)
     painter.setBrush(QtCore.Qt.gray)
     painter.setPen(QtCore.Qt.gray)
-    pos=self.mapFromGlobal(QtGui.QCursor.pos())
+    pos=self.mapFromGlobal(QtWidgets.QCursor.pos())
     painter.drawRect(pos.x(),
                    self.border_offset_,
                    1,
@@ -241,7 +245,7 @@ class LevelPreview(QtGui.QWidget):
     tot_len = self.maximum_-self.minimum_
     self.level_ = self.minimum_ + float(event.x())/width * tot_len
     self.update()
-    self.emit(QtCore.SIGNAL("levelUpdated"),(self.level_))
+    self.levelUpdated.emit(self.level_)
   
   def mousePressEvent(self,event):
     self.paint_mouse_=True
@@ -251,5 +255,5 @@ class LevelPreview(QtGui.QWidget):
     width = size.width()-(2* self.border_offset_)
     tot_len = self.maximum_-self.minimum_
     level = self.minimum_ + float(event.x())/width * tot_len
-    self.emit(QtCore.SIGNAL("levelModified"),(level))
-    self.update()
\ No newline at end of file
+    self.levelModified.emit(level)
+    self.update()
diff --git a/modules/gui/pymod/scene/preset.py b/modules/gui/pymod/scene/preset.py
index 4628f8248..279765d7c 100644
--- a/modules/gui/pymod/scene/preset.py
+++ b/modules/gui/pymod/scene/preset.py
@@ -20,7 +20,6 @@
 
 from ost import info
 from ost import gfx
-from PyQt4 import QtGui
 
 from ost.gfx import ColorOp
 
diff --git a/modules/gui/pymod/scene/preset_editor_list_model.py b/modules/gui/pymod/scene/preset_editor_list_model.py
index a30fc13c3..35fac9836 100644
--- a/modules/gui/pymod/scene/preset_editor_list_model.py
+++ b/modules/gui/pymod/scene/preset_editor_list_model.py
@@ -2,7 +2,7 @@ from ost import gui
 from ost import gfx
 import os
 import ost
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore
 from preset import Preset
 
 class PresetEditorListModel(QtCore.QAbstractListModel):
diff --git a/modules/gui/pymod/scene/preset_editor_widget.py b/modules/gui/pymod/scene/preset_editor_widget.py
index 97d7e7723..c5a314efb 100644
--- a/modules/gui/pymod/scene/preset_editor_widget.py
+++ b/modules/gui/pymod/scene/preset_editor_widget.py
@@ -23,7 +23,7 @@ from ost import gfx
 from ost import mol
 from datetime import datetime
 from datetime import datetime
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 from color_select_widget import ColorSelectWidget
 from gradient_preset_widget import GradientPresetWidget
 from gradient_editor_widget import GradientPreview
@@ -41,16 +41,16 @@ from render_op import RenderOp
 from visibility_op import VisibilityOp
 
 #Preset Editor
-class PresetEditor(QtGui.QDialog):
+class PresetEditor(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
         
     self.setWindowTitle("Preset Editor")
     
     #Create Ui Elements
-    self.list_view_ = QtGui.QListView()
+    self.list_view_ = QtWidgets.QListView()
     
-    self.combo_box_ = QtGui.QComboBox()
+    self.combo_box_ = QtWidgets.QComboBox()
     
     self.ufcow_=UniformColorOpWidget(self)
     self.glcow_=GradientLevelColorOpWidget(self)
@@ -65,22 +65,22 @@ class PresetEditor(QtGui.QDialog):
     self.combo_box_.addItem("RenderMode Operation", QtCore.QVariant(self.row_))
     self.combo_box_.addItem("Visibility Operation", QtCore.QVariant(self.vow_))
     
-    self.add_button_ = QtGui.QPushButton("Add")
+    self.add_button_ = QtWidgets.QPushButton("Add")
     
     #Create Model
-    self.list_view_.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+    self.list_view_.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
     
     self.list_view_.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
-    QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("customContextMenuRequested(const QPoint)"), self.contextMenuEvent)
+    self.list_view_.customContextMenuRequested.connect(self.contextMenuEvent)
     
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.combo_box_,0,0,1,1)
     grid.addWidget(self.add_button_,0,1,1,1)
@@ -89,9 +89,9 @@ class PresetEditor(QtGui.QDialog):
     grid.setRowStretch(1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.add_button_, QtCore.SIGNAL("clicked()"), self.Add)
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
+    self.add_button_.clicked.connect(self.Add)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
   
     self.CreateContextMenu()
       
@@ -100,26 +100,26 @@ class PresetEditor(QtGui.QDialog):
     self.list_view_.setModel(self.list_model_)
   
   def CreateContextMenu(self):
-    self.context_menu_ = QtGui.QMenu("Context menu", self)
-    self.edit_ = QtGui.QAction("Edit", self.list_view_)
-    self.remove_ = QtGui.QAction("Remove", self.list_view_)
-    self.moveup_ = QtGui.QAction("Move Up", self.list_view_)
-    self.movedown_ = QtGui.QAction("Move Down", self.list_view_)
+    self.context_menu_ = QtWidgets.QMenu("Context menu", self)
+    self.edit_ = QtWidgets.QAction("Edit", self.list_view_)
+    self.remove_ = QtWidgets.QAction("Remove", self.list_view_)
+    self.moveup_ = QtWidgets.QAction("Move Up", self.list_view_)
+    self.movedown_ = QtWidgets.QAction("Move Down", self.list_view_)
     self.context_menu_.addAction(self.edit_)
     self.context_menu_.addAction(self.remove_)
     self.context_menu_.addAction(self.moveup_)
     self.context_menu_.addAction(self.movedown_)
     #Connect Signals with Slots
-    QtCore.QObject.connect(self.edit_, QtCore.SIGNAL("triggered()"), self.Edit)
-    QtCore.QObject.connect(self.remove_, QtCore.SIGNAL("triggered()"), self.Remove)
-    QtCore.QObject.connect(self.moveup_, QtCore.SIGNAL("triggered()"), self.MoveUp)
-    QtCore.QObject.connect(self.movedown_, QtCore.SIGNAL("triggered()"), self.MoveDown)
+    self.edit_.triggered.connect(self.Edit)
+    self.remove_.triggered.connect(self.Remove)
+    self.moveup_.triggered.connect(self.MoveUp)
+    self.movedown_.triggered.connect(self.MoveDown)
 
   def contextMenuEvent(self, pos):
     #ContextMenu
     index = self.list_view_.indexAt(pos)
     if index.isValid(): 
-        self.context_menu_.popup(QtGui.QCursor.pos())
+        self.context_menu_.popup(QtWidgets.QCursor.pos())
 
   def Add(self):
     dialog = self.combo_box_.itemData(self.combo_box_.currentIndex()).toPyObject()
@@ -180,29 +180,29 @@ class PresetEditor(QtGui.QDialog):
   def Cancel(self):
     self.reject()
 
-class UniformColorOpWidget(QtGui.QDialog):
+class UniformColorOpWidget(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.query_editor_ = QueryEditorWidget(self)
 
-    detail_label = QtGui.QLabel("Parts")
-    self.detail_selection_cb_ = QtGui.QComboBox()
+    detail_label = QtWidgets.QLabel("Parts")
+    self.detail_selection_cb_ = QtWidgets.QComboBox()
     self.detail_selection_cb_.addItem("Main and Detail",QtCore.QVariant(3))
     self.detail_selection_cb_.addItem("Main",QtCore.QVariant(2))
     self.detail_selection_cb_.addItem("Detail",QtCore.QVariant(1))
     
-    color_label = QtGui.QLabel("Color")
+    color_label = QtWidgets.QLabel("Color")
     self.color_select_widget_ = ColorSelectWidget(30,30,QtGui.QColor("White"))    
     
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
 
         
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.query_editor_, 0, 0, 1, 2)
     grid.addWidget(detail_label, 1, 0, 1, 1)
@@ -213,8 +213,8 @@ class UniformColorOpWidget(QtGui.QDialog):
     grid.setRowStretch(2, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
     
   def GetOp(self):
     qv=mol.QueryViewWrapper(self.query_editor_.GetQuery(),self.query_editor_.GetQueryFlags())
@@ -250,22 +250,22 @@ class UniformColorOpWidget(QtGui.QDialog):
   def Cancel(self):
     self.reject()
 
-class GradientLevelColorOpWidget(QtGui.QDialog):
+class GradientLevelColorOpWidget(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     
     self.query_editor_ = QueryEditorWidget(self)
     
-    detail_label = QtGui.QLabel("Parts")
-    self.detail_selection_cb_ = QtGui.QComboBox()
+    detail_label = QtWidgets.QLabel("Parts")
+    self.detail_selection_cb_ = QtWidgets.QComboBox()
     self.detail_selection_cb_.addItem("Main and Detail",QtCore.QVariant(3))
     self.detail_selection_cb_.addItem("Main",QtCore.QVariant(2))
     self.detail_selection_cb_.addItem("Detail",QtCore.QVariant(1))
     
-    property_label = QtGui.QLabel("Property")
-    self.property_edit_ = QtGui.QLineEdit()
+    property_label = QtWidgets.QLabel("Property")
+    self.property_edit_ = QtWidgets.QLineEdit()
 
-    self.prop_combo_box_ = QtGui.QComboBox()
+    self.prop_combo_box_ = QtWidgets.QComboBox()
     self.prop_combo_box_.addItem("atom B-factor",QtCore.QVariant("abfac"))
     self.prop_combo_box_.addItem("average residue B-factor",QtCore.QVariant("rbfac"))
     self.prop_combo_box_.addItem("X-Coordinate",QtCore.QVariant("x"))
@@ -276,42 +276,42 @@ class GradientLevelColorOpWidget(QtGui.QDialog):
     self.prop_combo_box_.addItem("Custom",QtCore.QVariant("custom"))
     
 
-    level_label = QtGui.QLabel("Level")
-    self.combo_box_ = QtGui.QComboBox(self);
+    level_label = QtWidgets.QLabel("Level")
+    self.combo_box_ = QtWidgets.QComboBox(self);
     self.combo_box_.addItem("Atom",QtCore.QVariant(Prop.Level.ATOM))
     self.combo_box_.addItem("Residue",QtCore.QVariant(Prop.Level.RESIDUE))
     self.combo_box_.addItem("Chain",QtCore.QVariant(Prop.Level.CHAIN))
     self.combo_box_.addItem("Unspecified",QtCore.QVariant(Prop.Level.UNSPECIFIED))
         
-    gradient_label = QtGui.QLabel("Gradient")
+    gradient_label = QtWidgets.QLabel("Gradient")
     self.gradient_preview_ = GradientPreview()    
     self.gradient_edit_ = GradientEdit(self.gradient_preview_,self)
     
-    self.minmax_label_ = QtGui.QLabel("Min Max")
-    self.auto_calc_ = QtGui.QCheckBox("Auto calculate")
+    self.minmax_label_ = QtWidgets.QLabel("Min Max")
+    self.auto_calc_ = QtWidgets.QCheckBox("Auto calculate")
     self.auto_calc_.setChecked(True)
     
-    self.minv_label_ = QtGui.QLabel("Min Value")
-    self.maxv_label_ = QtGui.QLabel("Max Value")
+    self.minv_label_ = QtWidgets.QLabel("Min Value")
+    self.maxv_label_ = QtWidgets.QLabel("Max Value")
     
-    self.minv_ = QtGui.QDoubleSpinBox(self)
+    self.minv_ = QtWidgets.QDoubleSpinBox(self)
     self.minv_.setDecimals(2)
     self.minv_.setMinimum(-9999.99)
     self.minv_.setValue(0)
-    self.maxv_ = QtGui.QDoubleSpinBox(self)
+    self.maxv_ = QtWidgets.QDoubleSpinBox(self)
     self.maxv_.setDecimals(2)
     self.maxv_.setValue(1)
     self.maxv_.setMinimum(-9999.99)
     
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
 
         
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.query_editor_, 0, 0, 1, 2)
     grid.addWidget(detail_label, 1, 0, 1, 1)
@@ -335,10 +335,10 @@ class GradientLevelColorOpWidget(QtGui.QDialog):
     grid.setRowStretch(1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.prop_combo_box_, QtCore.SIGNAL("currentIndexChanged(int)"), self.UpdateGui)
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
-    QtCore.QObject.connect(self.auto_calc_, QtCore.SIGNAL("stateChanged (int)"), self.UpdateGui)
+    self.prop_combo_box_.currentIndexChanged.connect(self.UpdateGui)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
+    self.auto_calc_.stateChanged.connect(self.UpdateGui)
     
     self.UpdateGui()
     
@@ -395,7 +395,7 @@ class GradientLevelColorOpWidget(QtGui.QDialog):
     self.UpdateGui()
     
   def UpdateGui(self):
-    prop = self.prop_combo_box_.itemData(self.prop_combo_box_.currentIndex()).toPyObject()
+    prop = str(self.prop_combo_box_.itemData(self.prop_combo_box_.currentIndex()))
     if(prop == "custom"):
       self.combo_box_.setEnabled(True)
       self.property_edit_.setEnabled(True)
@@ -419,25 +419,25 @@ class GradientLevelColorOpWidget(QtGui.QDialog):
   def Update(self):
     pass #Do Nothing
 
-class ByElementColorOpWidget(QtGui.QDialog):
+class ByElementColorOpWidget(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.query_editor_ = QueryEditorWidget(self)
 
-    detail_label = QtGui.QLabel("Parts")
-    self.detail_selection_cb_ = QtGui.QComboBox()
+    detail_label = QtWidgets.QLabel("Parts")
+    self.detail_selection_cb_ = QtWidgets.QComboBox()
     self.detail_selection_cb_.addItem("Main and Detail",QtCore.QVariant(3))
     self.detail_selection_cb_.addItem("Main",QtCore.QVariant(2))
     self.detail_selection_cb_.addItem("Detail",QtCore.QVariant(1))
   
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.query_editor_, 0, 0, 1, 2)
     grid.addWidget(detail_label, 1, 0, 1, 1)
@@ -446,8 +446,8 @@ class ByElementColorOpWidget(QtGui.QDialog):
     grid.setRowStretch(1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
     
   def GetOp(self):
     detail = self.detail_selection_cb_.itemData(self.detail_selection_cb_.currentIndex()).toPyObject()
@@ -475,25 +475,25 @@ class ByElementColorOpWidget(QtGui.QDialog):
     self.reject()
     
     
-class ByChainColorOpWidget(QtGui.QDialog):
+class ByChainColorOpWidget(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.query_editor_ = QueryEditorWidget(self)
 
-    detail_label = QtGui.QLabel("Parts")
-    self.detail_selection_cb_ = QtGui.QComboBox()
+    detail_label = QtWidgets.QLabel("Parts")
+    self.detail_selection_cb_ = QtWidgets.QComboBox()
     self.detail_selection_cb_.addItem("Main and Detail",QtCore.QVariant(3))
     self.detail_selection_cb_.addItem("Main",QtCore.QVariant(2))
     self.detail_selection_cb_.addItem("Detail",QtCore.QVariant(1))
   
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.query_editor_, 0, 0, 1, 2)
     grid.addWidget(detail_label, 1, 0, 1, 1)
@@ -502,8 +502,8 @@ class ByChainColorOpWidget(QtGui.QDialog):
     grid.setRowStretch(1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
     
   def GetOp(self):
     detail = self.detail_selection_cb_.itemData(self.detail_selection_cb_.currentIndex()).toPyObject()
@@ -531,16 +531,16 @@ class ByChainColorOpWidget(QtGui.QDialog):
     self.reject()
 
 
-class RenderOpWidget(QtGui.QDialog):
+class RenderOpWidget(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.query_editor_ = QueryEditorWidget(self)
   
-    self.keep_ = QtGui.QCheckBox("Keep")
+    self.keep_ = QtWidgets.QCheckBox("Keep")
     self.keep_.setChecked(False)
     
-    render_label = QtGui.QLabel("Rendermode")
-    self.render_modes_ = QtGui.QComboBox()
+    render_label = QtWidgets.QLabel("Rendermode")
+    self.render_modes_ = QtWidgets.QComboBox()
     self.render_modes_.addItem("Fast Bonds")
     self.render_modes_.addItem("Ball & Stick")
     self.render_modes_.addItem("Spheres")
@@ -559,14 +559,14 @@ class RenderOpWidget(QtGui.QDialog):
                                gfx.RenderMode.TUBE,
                                gfx.RenderMode.HSC]
     
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.query_editor_, 0, 0, 1, 2)
     grid.addWidget(self.keep_, 1, 1, 1, 1)
@@ -576,8 +576,8 @@ class RenderOpWidget(QtGui.QDialog):
     grid.setRowStretch(1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
     
   def GetOp(self):
     selection = self.query_editor_.GetQueryText()
@@ -606,22 +606,22 @@ class RenderOpWidget(QtGui.QDialog):
   def Cancel(self):
     self.reject()
     
-class VisibilityOpWidget(QtGui.QDialog):
+class VisibilityOpWidget(QtWidgets.QDialog):
   def __init__(self, parent=None):
-    QtGui.QDialog.__init__(self, parent)
+    QtWidgets.QDialog.__init__(self, parent)
     self.query_editor_ = QueryEditorWidget(self)
   
-    self.visible_ = QtGui.QCheckBox("Visible")
+    self.visible_ = QtWidgets.QCheckBox("Visible")
     self.visible_.setChecked(True)
     
-    self.hbox_ = QtGui.QHBoxLayout()
-    self.ok_button_ = QtGui.QPushButton("OK")
-    self.cancel_button_ = QtGui.QPushButton("Cancel")
+    self.hbox_ = QtWidgets.QHBoxLayout()
+    self.ok_button_ = QtWidgets.QPushButton("OK")
+    self.cancel_button_ = QtWidgets.QPushButton("Cancel")
     self.hbox_.addWidget(self.ok_button_)
     self.hbox_.addStretch()
     self.hbox_.addWidget(self.cancel_button_)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.query_editor_, 0, 0, 1, 2)
     grid.addWidget(self.visible_, 1, 1, 1, 1)
@@ -629,8 +629,8 @@ class VisibilityOpWidget(QtGui.QDialog):
     grid.setRowStretch(1, 1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
-    QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
+    self.ok_button_.clicked.connect(self.Ok)
+    self.cancel_button_.clicked.connect(self.Cancel)
     
   def GetOp(self):
     selection = self.query_editor_.GetQueryText()
diff --git a/modules/gui/pymod/scene/preset_info_handler.py b/modules/gui/pymod/scene/preset_info_handler.py
index ba77aaff8..25237b3bd 100644
--- a/modules/gui/pymod/scene/preset_info_handler.py
+++ b/modules/gui/pymod/scene/preset_info_handler.py
@@ -21,7 +21,6 @@
 from ost import gui
 from ost import gfx
 from ost import info
-from PyQt4 import QtCore, QtGui
 from immutable_preset_info_handler import ImmutablePresetInfoHandler
 
 #Preset Info Handler
@@ -55,4 +54,4 @@ class PresetInfoHandler(ImmutablePresetInfoHandler):
         groupname = group.GetAttribute(ImmutablePresetInfoHandler.NAME_ATTRIBUTE_NAME)
         if old == groupname:
           group.SetAttribute(ImmutablePresetInfoHandler.NAME_ATTRIBUTE_NAME, new)
-          self.handle_.Export(self.file_name_)
\ No newline at end of file
+          self.handle_.Export(self.file_name_)
diff --git a/modules/gui/pymod/scene/preset_list_model.py b/modules/gui/pymod/scene/preset_list_model.py
index c35aa453f..dbe1926ad 100644
--- a/modules/gui/pymod/scene/preset_list_model.py
+++ b/modules/gui/pymod/scene/preset_list_model.py
@@ -2,15 +2,16 @@ from ost import gui
 from ost import gfx
 import os
 import ost
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 from immutable_preset_info_handler import ImmutablePresetInfoHandler
 from preset_info_handler import PresetInfoHandler
-from PyQt4.QtGui import QDesktopServices
 class PresetListModel(QtCore.QAbstractListModel):
   
   IMMUTABLE_PRESET_PATH = os.path.join(ost.GetSharedDataPath(),"scene", 
                                           "presets.xml")
   MUTABLE_PRESET_PATH = "user_presets.xml"
+
+  dataChanged = QtCore.pyqtSignal(int, int, name="dataChanged")
   
   def __init__(self, parent=None, *args): 
     QtCore.QAbstractListModel.__init__(self, parent, *args)
@@ -20,7 +21,8 @@ class PresetListModel(QtCore.QAbstractListModel):
     #Info Handler
 
     self.immutable_infoh_=ImmutablePresetInfoHandler(PresetListModel.IMMUTABLE_PRESET_PATH)
-    data_loc=QDesktopServices.storageLocation(QDesktopServices.DataLocation)    
+    data_loc=str(QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.DataLocation))
+
     mutable_path=os.path.join(str(data_loc), 'config',
                               PresetListModel.MUTABLE_PRESET_PATH)
     qdir=QtCore.QDir(data_loc)
@@ -39,7 +41,7 @@ class PresetListModel(QtCore.QAbstractListModel):
       end_index = self.createIndex(self.rowCount(),0)
       if save:
         self.AddPresetToInfo(preset)
-      self.emit(QtCore.SIGNAL("dataChanged"),model_index, end_index)
+      self.dataChanged.emit(model_index, end_index)
       return True
     return False
   
@@ -52,7 +54,7 @@ class PresetListModel(QtCore.QAbstractListModel):
       self.removeRow(row, QtCore.QModelIndex())
       model_index = self.createIndex(row,0)
       self.infoh_.RemovePreset(name)
-      self.emit(QtCore.SIGNAL("dataChanged"),model_index, model_index)
+      self.dataChanged.emit(model_index, model_index)
       return True
     return False
 
@@ -113,7 +115,7 @@ class PresetListModel(QtCore.QAbstractListModel):
         new_name = value.toString()
         self.data_[row][0].SetName(str(new_name))
         self.infoh_.RenamePreset(old_name,str(new_name))
-        self.emit(QtCore.SIGNAL("dataChanged"),index, index)
+        self.dataChanged.emit(index, index)
         return True
       elif role == QtCore.Qt.DisplayRole:
         self.data_[row][0].SetName(value.toString())
@@ -144,4 +146,4 @@ class PresetListModel(QtCore.QAbstractListModel):
 
   
   
-  
\ No newline at end of file
+  
diff --git a/modules/gui/pymod/scene/preset_widget.py b/modules/gui/pymod/scene/preset_widget.py
index 87e8ea7cc..aec2f2d29 100644
--- a/modules/gui/pymod/scene/preset_widget.py
+++ b/modules/gui/pymod/scene/preset_widget.py
@@ -22,83 +22,83 @@ from ost import gfx
 import ost
 import os
 from datetime import datetime
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 from scene_selection_helper import SelHelper
 from preset_list_model import PresetListModel
 from preset_editor_widget import PresetEditor
 from preset import Preset
 
-class PresetWidget(QtGui.QWidget):
+class PresetWidget(QtWidgets.QWidget):
   PRESET_XML_FILE = os.path.join(ost.GetSharedDataPath(), "scene", "presets.xml")
   ICONS_DIR = os.path.join(ost.GetSharedDataPath(), "gui", "icons/")
   def __init__(self, parent=None):   
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     self.text_ = "Presets"
         
     #Create Ui elements
-    self.list_view_ = QtGui.QListView()
+    self.list_view_ = QtWidgets.QListView()
         
     #Create Model
     self.list_model_ = PresetListModel(self)
     self.list_view_.setModel(self.list_model_)
-    self.list_view_.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+    self.list_view_.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
     
-    self.add_action = QtGui.QAction("+",self)
+    self.add_action = QtWidgets.QAction("+",self)
     self.add_action.setIcon(QtGui.QIcon(PresetWidget.ICONS_DIR+"add_icon.png"))
     
-    QtCore.QObject.connect(self.add_action, QtCore.SIGNAL("triggered()"), self.Add)
+    self.add_action.triggered.connect(self.Add)
     
-    self.add_button_ = QtGui.QToolButton(self)
+    self.add_button_ = QtWidgets.QToolButton(self)
     self.add_button_.setIconSize(QtCore.QSize(20,20))
     self.add_button_.setDefaultAction(self.add_action)
     
     self.preset_editor_ = PresetEditor(self)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.setContentsMargins(0,5,0,0)
     grid.addWidget(self.list_view_,0,0,3,3)
     grid.addWidget(self.add_button_,3,0,1,1)
     self.setLayout(grid)
     
     self.list_view_.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
-    QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("customContextMenuRequested(const QPoint)"), self.contextMenuEvent)
+    self.list_view_.customContextMenuRequested.connect(self.contextMenuEvent)
     self.CreateImmutableContextMenu()
     self.CreateContextMenu()
   
-    QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("doubleClicked(const QModelIndex)"), self.Load)
+    self.list_view_.doubleClicked.connect(self.Load)
     
     self.setMinimumSize(250,200)
     
   def CreateImmutableContextMenu(self):  
-    self.immucontext_menu_ = QtGui.QMenu("Context menu", self)
-    self.load_ = QtGui.QAction("Load", self.list_view_)  
+    self.immucontext_menu_ = QtWidgets.QMenu("Context menu", self)
+    self.load_ = QtWidgets.QAction("Load", self.list_view_)  
     self.immucontext_menu_.addAction(self.load_)
     #Connect Signal with Slot  
-    QtCore.QObject.connect(self.load_, QtCore.SIGNAL("triggered()"), self.LoadCurrentIndex)
+    self.load_.triggered.connect(self.LoadCurrentIndex)
 
   def CreateContextMenu(self):
-    self.context_menu_ = QtGui.QMenu("Context menu", self)
-    self.remove_ = QtGui.QAction("Remove", self.list_view_)
-    self.rename_ = QtGui.QAction("Rename", self.list_view_)
-    self.edit_ = QtGui.QAction("Edit", self.list_view_)
+    self.context_menu_ = QtWidgets.QMenu("Context menu", self)
+    self.remove_ = QtWidgets.QAction("Remove", self.list_view_)
+    self.rename_ = QtWidgets.QAction("Rename", self.list_view_)
+    self.edit_ = QtWidgets.QAction("Edit", self.list_view_)
     self.context_menu_.addAction(self.load_)
     self.context_menu_.addAction(self.remove_)
     self.context_menu_.addAction(self.rename_)
     self.context_menu_.addAction(self.edit_)
     #Connect Signals with Slots  
-    QtCore.QObject.connect(self.remove_, QtCore.SIGNAL("triggered()"), self.Remove)
-    QtCore.QObject.connect(self.rename_, QtCore.SIGNAL("triggered()"), self.Rename)
-    QtCore.QObject.connect(self.edit_, QtCore.SIGNAL("triggered()"), self.Edit)
+    self.remove_.triggered.connect(self.Remove)
+    self.rename_.triggered.connect(self.Rename)
+    self.edit_.triggered.connect(self.Edit)
   
   def contextMenuEvent(self, pos):
     #ContextMenu
     index = self.list_view_.indexAt(pos)
     if index.isValid(): 
       if self.list_model_.IsEditable(index.row()):
-        self.context_menu_.popup(QtGui.QCursor.pos())
+        self.context_menu_.popup(QtWidgets.QCursor.pos())
       else:
-        self.immucontext_menu_.popup(QtGui.QCursor.pos())
+        self.immucontext_menu_.popup(QtWidgets.QCursor.pos())
   
   def Add(self):
     row = self.list_model_.GetLastRow()
@@ -112,10 +112,10 @@ class PresetWidget(QtGui.QWidget):
       
   def Remove(self):
     if(self.list_view_.currentIndex().isValid()):
-      ret = QtGui.QMessageBox.warning(self, "Delete Preset",
+      ret = QtWidgets.QMessageBox.warning(self, "Delete Preset",
                    "Delete Preset?",
-                   QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
-      if ret == QtGui.QMessageBox.Yes:
+                   QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+      if ret == QtWidgets.QMessageBox.Yes:
         self.list_model_.RemoveItem(self.list_view_.currentIndex().row())
 
   def Edit(self):
diff --git a/modules/gui/pymod/scene/query_editor.py b/modules/gui/pymod/scene/query_editor.py
index fcdfc4339..6cebc3ea5 100644
--- a/modules/gui/pymod/scene/query_editor.py
+++ b/modules/gui/pymod/scene/query_editor.py
@@ -1,36 +1,36 @@
 from ost import mol
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 
-class QueryEditorWidget(QtGui.QWidget):
+class QueryEditorWidget(QtWidgets.QWidget):
   def __init__(self, parent=None): 
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.default_font_=QtGui.QTextCharFormat()
     self.default_font_.setForeground(QtGui.QBrush(QtGui.QColor(0,0,0)))
     self.error_font_=QtGui.QTextCharFormat()
     self.error_font_.setForeground(QtGui.QBrush(QtGui.QColor(255,0,0))) 
-    self.selection_edit_=QtGui.QTextEdit(self)
+    self.selection_edit_=QtWidgets.QTextEdit(self)
     self.selection_edit_.setFixedHeight(40)
     self.selection_edit_.updateGeometry()
-    self.status_=QtGui.QLabel(" ",self);
+    self.status_=QtWidgets.QLabel(" ",self);
     self.status_.setWordWrap(True)
     self.status_.setMargin(0)
     self.status_.setAlignment(QtCore.Qt.AlignRight)
-    self.status_.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,
-                                                 QtGui.QSizePolicy.Expanding))
-    vl=QtGui.QVBoxLayout()
+    self.status_.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
+                                                 QtWidgets.QSizePolicy.Expanding))
+    vl=QtWidgets.QVBoxLayout()
     vl.addWidget(self.selection_edit_)
-    self.no_bonds_=QtGui.QRadioButton('none')
-    self.ex_bonds_=QtGui.QRadioButton('exclusive')
-    self.in_bonds_=QtGui.QRadioButton('inclusive')
+    self.no_bonds_=QtWidgets.QRadioButton('none')
+    self.ex_bonds_=QtWidgets.QRadioButton('exclusive')
+    self.in_bonds_=QtWidgets.QRadioButton('inclusive')
     self.in_bonds_.setChecked(True)
-    self.match_res_=QtGui.QCheckBox('match residues')
+    self.match_res_=QtWidgets.QCheckBox('match residues')
     
-    vl.setMargin(0)
+    vl.setContentsMargins(0,0,0,0)
     vl.setSpacing(0)
     self.setLayout(vl)
     vl.addWidget(self.status_)
-    hl=QtGui.QHBoxLayout()
-    l=QtGui.QLabel("bonds:")
+    hl=QtWidgets.QHBoxLayout()
+    l=QtWidgets.QLabel("bonds:")
 
     hl.addWidget(l)
     hl.addSpacing(5)
@@ -42,11 +42,9 @@ class QueryEditorWidget(QtGui.QWidget):
     vl.addWidget(self.match_res_)
 
     self.changing_text_=False;
-    self.connect(self.selection_edit_,QtCore.SIGNAL("textChanged()"),
-                 self._StartTimer)
+    self.selection_edit_.textChanged.connect(self._StartTimer)
     self.timer_=QtCore.QTimer()
-    QtCore.QObject.connect(self.timer_, QtCore.SIGNAL('timeout()'),
-                           self._UpdateMessage)
+    self.timer_.timeout.connect(self._UpdateMessage)
     
   def GetQueryFlags(self):
     flags=0
@@ -103,25 +101,25 @@ class QueryEditorWidget(QtGui.QWidget):
         cursor.setCharFormat(self.error_font_)
     self.changing_text_=False
     
-class QueryDialog(QtGui.QDialog):
+class QueryDialog(QtWidgets.QDialog):
   def __init__(self, title, parent=None):
-    QtGui.QDialog.__init__(self, parent)
-    l=QtGui.QVBoxLayout(self)
+    QtWidgets.QDialog.__init__(self, parent)
+    l=QtWidgets.QVBoxLayout(self)
     self.setWindowTitle(title)
     self.editor=QueryEditorWidget(self)
     l.addWidget(self.editor)
     l.addSpacing(10)
-    l3=QtGui.QHBoxLayout()
-    ab=QtGui.QPushButton('OK')
+    l3=QtWidgets.QHBoxLayout()
+    ab=QtWidgets.QPushButton('OK')
     ab.setDefault(True)
-    cb=QtGui.QPushButton('Cancel')
+    cb=QtWidgets.QPushButton('Cancel')
     l3.addStretch(1)
     l3.addWidget(cb, 0)
     l3.addWidget(ab, 0)
     l.addLayout(l3)
-    QtCore.QObject.connect(cb, QtCore.SIGNAL('clicked()'), self.reject)
-    QtCore.QObject.connect(ab, QtCore.SIGNAL('clicked()'), self.accept)
-    self.connect(self.editor.selection_edit_,QtCore.SIGNAL("textChanged()"),self._CheckNewline)
+    cb.clicked.connect(self.reject)
+    ab.clicked.connect(self.accept)
+    self.editor.selection_edit_.textChanged.connect(self._CheckNewline)
 
   @property 
   def query_flags(self):
@@ -135,8 +133,8 @@ class QueryDialog(QtGui.QDialog):
       self.accept()
       return True
     else:
-      return QtGui.QDialog.event(self, e)
+      return QtWidgets.QDialog.event(self, e)
   
   def _CheckNewline(self):
     if self.editor.GetQueryText().endswith("\n"):
-      self.accept()
\ No newline at end of file
+      self.accept()
diff --git a/modules/gui/pymod/scene/remote.py b/modules/gui/pymod/scene/remote.py
index 46a7553b4..cab9165a8 100644
--- a/modules/gui/pymod/scene/remote.py
+++ b/modules/gui/pymod/scene/remote.py
@@ -1,46 +1,41 @@
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from PyQt5 import QtCore, QtWidgets
 import threading
 from ost import LogError
 from ost import gui, gfx
 from ost.io.remote import RemoteLoad, REMOTE_REPOSITORIES
 import re
 
-class RemoteLoader(QWidget):
+class RemoteLoader(QtWidgets.QWidget):
   def __init__(self):
-    QWidget.__init__(self)
-    self._line = QLineEdit(self)
-    self._load = QToolButton(self)
-    self._load.setAttribute(Qt.WA_MacSmallSize)
-    QObject.connect(self._line, SIGNAL('returnPressed()'),
-                    self._DoLoad)
-    QObject.connect(self._load, SIGNAL('clicked()'),
-                    self._DoLoad)
-    hbox = QHBoxLayout(self)
+    QtWidgets.QWidget.__init__(self)
+    self._line = QtWidgets.QLineEdit(self)
+    self._load = QtWidgets.QToolButton(self)
+    self._line.returnPressed.connect(self._DoLoad)
+    self._load.clicked.connect(self._DoLoad)
+    hbox = QtWidgets.QHBoxLayout(self)
     hbox.addWidget(self._line,1)
     hbox.addWidget(self._load,0)
     self.setLayout(hbox)
-    hbox.setMargin(3)
+    hbox.setContentsMargins(3,3,3,3)
     hbox.setSpacing(3)
     self._menu = self._RemoteMenu()
     self._load.setMenu(self._menu)
     self._current_repo = 'pdb'
     self._UpdateLoadButton(self._current_repo)
     self.setFixedHeight(self._load.height())
-    self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
+    self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
 
   def _RemoteMenu(self):
-    menu = QMenu()
-    action_group = QActionGroup(menu)
+    menu = QtWidgets.QMenu()
+    action_group = QtWidgets.QActionGroup(menu)
     for k,v in REMOTE_REPOSITORIES.iteritems():
       action = menu.addAction(v.name)
       action.setCheckable(True)
       if k == 'pdb':
         action.setChecked(True)
-      action.setData(QVariant(k))
+      action.setData(QtCore.QVariant(k))
       action_group.addAction(action)
-    QObject.connect(menu, SIGNAL('triggered(QAction*)'),
-                    self._ToggleRepo)
+    menu.triggered.connect(self._ToggleRepo)
     return menu
   def _UpdateLoadButton(self, current):
     name = REMOTE_REPOSITORIES[current].name
@@ -72,7 +67,7 @@ class RemoteLoader(QWidget):
 
 remote_loader=RemoteLoader()
 remote_loader_for_panel=gui.Widget(remote_loader)
-remote_loader_for_panel.qobject.setSizePolicy(QSizePolicy.Expanding, 
-                                              QSizePolicy.Fixed)
+remote_loader_for_panel.qobject.setSizePolicy(QtWidgets.QSizePolicy.Expanding, 
+                                              QtWidgets.QSizePolicy.Fixed)
 panels=gui.GostyApp.Instance().perspective.panels
 panels.AddWidgetToPool("Remote Loader",remote_loader_for_panel)
diff --git a/modules/gui/pymod/scene/render_mode_widget.py b/modules/gui/pymod/scene/render_mode_widget.py
index 038e0950e..31b33ddd7 100644
--- a/modules/gui/pymod/scene/render_mode_widget.py
+++ b/modules/gui/pymod/scene/render_mode_widget.py
@@ -20,13 +20,13 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 
 
 #Tube Render Options
-class RenderModeWidget(QtGui.QWidget):
+class RenderModeWidget(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.options_ = None
     self.entities_ = set()
 
@@ -64,13 +64,13 @@ class RenderModeWidget(QtGui.QWidget):
       entity = self.entities_.pop()
       self.options_=entity.GetOptions(self.GetRenderMode())
       self.UpdateGui(self.options_)
-      QtGui.QWidget.setEnabled(self,True)
+      QtWidgets.QWidget.setEnabled(self,True)
     else:
-      QtGui.QWidget.setEnabled(self,False)
+      QtWidgets.QWidget.setEnabled(self,False)
     
   def ApplyOptions(self):
     for entity in self.entities_:
       entity.ApplyOptions(self.GetRenderMode(), self.GetOptions())
 
   def GetOptions(self):
-    return self.options_
\ No newline at end of file
+    return self.options_
diff --git a/modules/gui/pymod/scene/render_op.py b/modules/gui/pymod/scene/render_op.py
index cdbb7e036..ea2b54263 100644
--- a/modules/gui/pymod/scene/render_op.py
+++ b/modules/gui/pymod/scene/render_op.py
@@ -20,7 +20,6 @@
 
 from ost import info
 from ost import gfx
-from PyQt4 import QtGui
 
 class RenderOp:
   RENDERMODE_ATTRIBUTE_NAME = "RenderMode"
diff --git a/modules/gui/pymod/scene/render_options_widget.py b/modules/gui/pymod/scene/render_options_widget.py
index f1d9929ee..90cc213e8 100644
--- a/modules/gui/pymod/scene/render_options_widget.py
+++ b/modules/gui/pymod/scene/render_options_widget.py
@@ -28,7 +28,7 @@ try:
 except ImportError:
   _img_present=False
   pass
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from scene_selection_helper import SelHelper
 from combo_options_widget import ComboOptionsWidget
 from custom_widget import CustomWidget
@@ -47,11 +47,11 @@ class RenderOptionsWidget(ComboOptionsWidget):
     #Title
     self.text_ = "Render Options"
     
-    self.keep_action_ = QtGui.QAction("K",self)
+    self.keep_action_ = QtWidgets.QAction("K",self)
     self.keep_action_.setCheckable(True);
     self.keep_action_.setChecked(False)
     self.keep_action_.setToolTip("Keep rendermodes and add current")
-    self.keep_button_ = QtGui.QToolButton(self)
+    self.keep_button_ = QtWidgets.QToolButton(self)
     self.keep_button_.setDefaultAction(self.keep_action_)
     
     self.grid_layout_.addWidget(self.keep_button_, 0, 1, 1, 1)
@@ -157,19 +157,19 @@ class RenderOptionsWidget(ComboOptionsWidget):
   def GetText(self):
     return self.text_
         
-class EmptyMode(QtGui.QWidget):
+class EmptyMode(QtWidgets.QWidget):
   def __init__(self, text="", render_mode=None, parent=None):
-    QtGui.QLabel.__init__(self, parent)
+    QtWidgets.QLabel.__init__(self, parent)
     self.setMinimumSize(250,30)
     self.text = text
     self.render_mode = render_mode
     if(render_mode):
-      text_label = QtGui.QLabel(text)
+      text_label = QtWidgets.QLabel(text)
       font = text_label.font()
       font.setBold(True)
-      grid = QtGui.QGridLayout()
+      grid = QtWidgets.QGridLayout()
       grid.addWidget(text_label,0,0,1,1)
-      grid.addWidget(QtGui.QLabel("No Settings available"), 1, 0, 1, 3)
+      grid.addWidget(QtWidgets.QLabel("No Settings available"), 1, 0, 1, 3)
       grid.setRowStretch(2,1)
       self.setLayout(grid)
       self.setMinimumSize(250,60)
diff --git a/modules/gui/pymod/scene/simple_widget.py b/modules/gui/pymod/scene/simple_widget.py
index 1c9c337e9..53e172afd 100644
--- a/modules/gui/pymod/scene/simple_widget.py
+++ b/modules/gui/pymod/scene/simple_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Simple Render Options
@@ -41,30 +41,30 @@ class SimpleWidget(RenderModeWidget):
     self.mode_ = gfx.RenderMode.SIMPLE
         
     #Create Ui elements
-    self.aa_rendering_cb_ = QtGui.QCheckBox()
+    self.aa_rendering_cb_ = QtWidgets.QCheckBox()
   
-    self.radius_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_spinbox_.setRange(min_line_width, max_line_width)
     self.radius_spinbox_.setDecimals(2)
     self.radius_spinbox_.setSingleStep(0.1)
 
-    self.bo_rendering_cb_ = QtGui.QCheckBox()
+    self.bo_rendering_cb_ = QtWidgets.QCheckBox()
     
-    self.bo_distance_spinbox_ = QtGui.QDoubleSpinBox()
+    self.bo_distance_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.bo_distance_spinbox_.setRange(min_bo_dist, max_bo_dist)
     self.bo_distance_spinbox_.setDecimals(2)
     self.bo_distance_spinbox_.setSingleStep(0.01)
 
-    simple_label = QtGui.QLabel("Fast Bonds Simple Settings")
+    simple_label = QtWidgets.QLabel("Fast Bonds Simple Settings")
     font = simple_label.font()
     font.setBold(True)
     
-    radius_label = QtGui.QLabel("Line Width")
-    aa_label = QtGui.QLabel("AA-Lines")
-    bo_label = QtGui.QLabel("Show Bond Order")
-    bo_distance = QtGui.QLabel("Bond Order Distance")
+    radius_label = QtWidgets.QLabel("Line Width")
+    aa_label = QtWidgets.QLabel("AA-Lines")
+    bo_label = QtWidgets.QLabel("Show Bond Order")
+    bo_distance = QtWidgets.QLabel("Bond Order Distance")
 
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(simple_label,0,0,1,3)
     grid.addWidget(aa_label, 1, 0, 1, 3)
     grid.addWidget(self.aa_rendering_cb_, 1, 2, 1, 1)
@@ -77,10 +77,10 @@ class SimpleWidget(RenderModeWidget):
     grid.setRowStretch(5,1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLineWidth)
-    QtCore.QObject.connect(self.aa_rendering_cb_, QtCore.SIGNAL("stateChanged(int)"), self.UpdateAA)
-    QtCore.QObject.connect(self.bo_distance_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateBODistance)
-    QtCore.QObject.connect(self.bo_rendering_cb_, QtCore.SIGNAL("stateChanged(int)"), self.UpdateBO)    
+    self.radius_spinbox_.valueChanged.connect(self.UpdateLineWidth)
+    self.aa_rendering_cb_.stateChanged.connect(self.UpdateAA)
+    self.bo_distance_spinbox_.valueChanged.connect(self.UpdateBODistance)
+    self.bo_rendering_cb_.stateChanged.connect(self.UpdateBO)    
     self.setMinimumSize(250,140)
     
     self.setMinimumSize(250,140)
@@ -111,4 +111,4 @@ class SimpleWidget(RenderModeWidget):
     return self.text_
 
   def GetRenderMode(self):
-    return self.mode_
\ No newline at end of file
+    return self.mode_
diff --git a/modules/gui/pymod/scene/sline_widget.py b/modules/gui/pymod/scene/sline_widget.py
index 063a81e33..c42f2f98f 100644
--- a/modules/gui/pymod/scene/sline_widget.py
+++ b/modules/gui/pymod/scene/sline_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Simple Render Options
@@ -42,25 +42,25 @@ class SlineWidget(RenderModeWidget):
     max_line_width = 20
         
     #Create Ui elements
-    self.detail_spinbox_ = QtGui.QSpinBox()
+    self.detail_spinbox_ = QtWidgets.QSpinBox()
     self.detail_spinbox_.setRange(min_detail, max_detail)
     self.detail_spinbox_.setSingleStep(1)
     
-    self.aa_rendering_cb_ = QtGui.QCheckBox()
+    self.aa_rendering_cb_ = QtWidgets.QCheckBox()
     
-    self.radius_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_spinbox_.setRange(min_line_width, max_line_width)
     self.radius_spinbox_.setDecimals(2)
     self.radius_spinbox_.setSingleStep(0.1)
     
-    sline_label = QtGui.QLabel("Spline Settings")
+    sline_label = QtWidgets.QLabel("Spline Settings")
     font = sline_label.font()
     font.setBold(True)
     
-    detail_label = QtGui.QLabel("Spline Detail")
-    aa_label = QtGui.QLabel("AA-Lines")
-    radius_label = QtGui.QLabel("Line Width")
-    grid = QtGui.QGridLayout()
+    detail_label = QtWidgets.QLabel("Spline Detail")
+    aa_label = QtWidgets.QLabel("AA-Lines")
+    radius_label = QtWidgets.QLabel("Line Width")
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(sline_label, 0, 0, 1, 1)
     grid.addWidget(detail_label, 1, 0, 1, 3)
     grid.addWidget(self.detail_spinbox_, 1, 2, 1, 1)
@@ -71,9 +71,9 @@ class SlineWidget(RenderModeWidget):
     grid.setRowStretch(4,1)
     self.setLayout(grid)
 
-    QtCore.QObject.connect(self.detail_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateDetail)
-    QtCore.QObject.connect(self.aa_rendering_cb_, QtCore.SIGNAL("stateChanged(int)"), self.UpdateAA)
-    QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLineWidth)
+    self.detail_spinbox_.valueChanged.connect(self.UpdateDetail)
+    self.aa_rendering_cb_.stateChanged.connect(self.UpdateAA)
+    self.radius_spinbox_.valueChanged.connect(self.UpdateLineWidth)
 
     self.setMinimumSize(250,120)
   
diff --git a/modules/gui/pymod/scene/toolbar_options_widget.py b/modules/gui/pymod/scene/toolbar_options_widget.py
index fc4720493..55e45b046 100644
--- a/modules/gui/pymod/scene/toolbar_options_widget.py
+++ b/modules/gui/pymod/scene/toolbar_options_widget.py
@@ -21,36 +21,35 @@
 import sys
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 
-class ToolBarOptionsWidget(QtGui.QWidget):
+class ToolBarOptionsWidget(QtWidgets.QWidget):
   """QWidget with a ToolBar and a show area.
     
    This abstract QWidget has a toolbar and a show area. Whenever a button of the tool bar is pressed, the Widget corresponding to the button's value is shown in the show area.  
   """
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Setup ui_
     self.parent_=parent
     self.resize(400, 300)
     self.setMinimumSize(QtCore.QSize(250, 200))
-    self.gridLayout = QtGui.QGridLayout(self)
+    self.gridLayout = QtWidgets.QGridLayout(self)
     self.gridLayout.setHorizontalSpacing(0)
     self.gridLayout.setVerticalSpacing(0)
     self.gridLayout.setContentsMargins(0,0,0,0)
-    self.gridLayout.setMargin(0)
     self.gridLayout.setSpacing(0)    
-    self.tool_bar_ = QtGui.QToolBar(self)
+    self.tool_bar_ = QtWidgets.QToolBar(self)
     self.tool_bar_.setIconSize(QtCore.QSize(16, 16))
     self.gridLayout.addWidget(self.tool_bar_, 0, 0, 1, 1)
-    self.stackedWidget = QtGui.QStackedWidget(self)
+    self.stackedWidget = QtWidgets.QStackedWidget(self)
     self.gridLayout.addWidget(self.stackedWidget, 1, 0, 1, 1)
 
     self.current_action_ = None
     self.actions_ = list()
     
-    QtCore.QObject.connect(self.tool_bar_, QtCore.SIGNAL("actionTriggered(QAction*)"), self.ChangeSelectedItem)
+    self.tool_bar_.actionTriggered.connect(self.ChangeSelectedItem)
     
     self.setEnabled(False)
            
@@ -74,13 +73,13 @@ class ToolBarOptionsWidget(QtGui.QWidget):
      the old widget will be removed and the new widget gets the identifier.
      Returns True, if widget is added. Otherwise it returns False
     """
-    if isinstance(widget, QtGui.QWidget) and ident is not None:
+    if isinstance(widget, QtWidgets.QWidget) and ident is not None:
       if text is not None:
-        string = QtCore.QString(text)
+        string = text
       elif hasattr(widget, "GetText"):
-        string = QtCore.QString(widget.GetText())
+        string = widget.GetText()
       else:
-        string = QtCore.QString(ident)
+        string = ident
       
       self.stackedWidget.addWidget(widget)
       action = self.tool_bar_.addAction(ident)
@@ -124,7 +123,7 @@ class ToolBarOptionsWidget(QtGui.QWidget):
         self.current_action_.setChecked(False)
     else:
        self.current_action_ = action
-    widget = action.data().toPyObject()[1]
+    widget = action.data()[1]
     self.stackedWidget.setCurrentWidget(widget)
     if hasattr(widget, "Update"): 
       widget.Update()
@@ -139,5 +138,5 @@ class ToolBarOptionsWidget(QtGui.QWidget):
 
   #Overwritten Methods
   def setEnabled(self, bool):
-    QtGui.QWidget.setEnabled(self, bool)
+    QtWidgets.QWidget.setEnabled(self, bool)
 
diff --git a/modules/gui/pymod/scene/trace_widget.py b/modules/gui/pymod/scene/trace_widget.py
index 7dcb0342a..8705d18d8 100644
--- a/modules/gui/pymod/scene/trace_widget.py
+++ b/modules/gui/pymod/scene/trace_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Trace Render Options
@@ -44,25 +44,25 @@ class TraceWidget(RenderModeWidget):
     #########UI##########
             
     #Arc Label
-    arc_label = QtGui.QLabel("Arc Detail")
+    arc_label = QtWidgets.QLabel("Arc Detail")
     
-    self.arc_spinbox_ = QtGui.QSpinBox()
+    self.arc_spinbox_ = QtWidgets.QSpinBox()
     self.arc_spinbox_.setRange(min_arc_detail, max_arc_detail)
         
     #Tube Radius
-    radius_tube_label = QtGui.QLabel("Radius")
+    radius_tube_label = QtWidgets.QLabel("Radius")
     
-    self.width_tube_spinbox_ = QtGui.QDoubleSpinBox()
+    self.width_tube_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.width_tube_spinbox_.setRange(min_width, max_tube_width)
     self.width_tube_spinbox_.setDecimals(1)
     self.width_tube_spinbox_.setSingleStep(0.1)
     
-    self.width_tube_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.width_tube_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.width_tube_slider_.setRange(min_width*10.0, max_tube_width*10.0)
-    self.width_tube_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.width_tube_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.width_tube_slider_.setTickInterval(1)
 
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(arc_label,3,0,1,3)
     grid.addWidget(self.arc_spinbox_,3,4,1,1)
     
@@ -73,15 +73,9 @@ class TraceWidget(RenderModeWidget):
     grid.setRowStretch(15,1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), 
-                           self.UpdateArcDetail)
-    
-    QtCore.QObject.connect(self.width_tube_spinbox_, 
-                           QtCore.SIGNAL("valueChanged(double)"), 
-                           self.UpdateTubeRadius)
-    QtCore.QObject.connect(self.width_tube_slider_, 
-                           QtCore.SIGNAL("valueChanged(int)"), 
-                           self.UpdateSliderTubeRadius)
+    self.arc_spinbox_.valueChanged.connect(self.UpdateArcDetail)
+    self.width_tube_spinbox_.valueChanged.connect(self.UpdateTubeRadius)
+    self.width_tube_slider_.valueChanged.connect(self.UpdateSliderTubeRadius)
     
     self.setMinimumSize(250,60) #2*30
     ########/UI########
diff --git a/modules/gui/pymod/scene/tube_widget.py b/modules/gui/pymod/scene/tube_widget.py
index 561728800..682fd0b05 100644
--- a/modules/gui/pymod/scene/tube_widget.py
+++ b/modules/gui/pymod/scene/tube_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 from render_mode_widget import RenderModeWidget
 
 #Tube Render Options
@@ -48,57 +48,57 @@ class TubeWidget(RenderModeWidget):
     max_ratio = 4
     
     #UI
-    tube_label = QtGui.QLabel("Tube Settings")
+    tube_label = QtWidgets.QLabel("Tube Settings")
     font = tube_label.font()
     font.setBold(True)
     
     #Poly Mode
-    poly_mode_label = QtGui.QLabel("Poly Mode")
+    poly_mode_label = QtWidgets.QLabel("Poly Mode")
     
-    self.poly_mode_cb_ = QtGui.QComboBox()
+    self.poly_mode_cb_ = QtWidgets.QComboBox()
     self.poly_mode_cb_.addItem("Points")
     self.poly_mode_cb_.addItem("Wireframe")
     self.poly_mode_cb_.addItem("Surface")
     
     #Sphere Label
-    spline_label = QtGui.QLabel("Spline Detail")
+    spline_label = QtWidgets.QLabel("Spline Detail")
     
-    self.spline_spinbox_ = QtGui.QSpinBox()
+    self.spline_spinbox_ = QtWidgets.QSpinBox()
     self.spline_spinbox_.setRange(min_spline_detail, max_spline_detail)
     
     #Arc Label
-    arc_label = QtGui.QLabel("Arc Detail")
+    arc_label = QtWidgets.QLabel("Arc Detail")
     
-    self.arc_spinbox_ = QtGui.QSpinBox()
+    self.arc_spinbox_ = QtWidgets.QSpinBox()
     self.arc_spinbox_.setRange(min_arc_detail, max_arc_detail)
         
     #Radius
-    radius_label = QtGui.QLabel("Tube radius")
+    radius_label = QtWidgets.QLabel("Tube radius")
 
     
-    self.radius_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_spinbox_.setRange(min_radius, max_radius)
     self.radius_spinbox_.setDecimals(1)
     self.radius_spinbox_.setSingleStep(0.1)
 
-    self.radius_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.radius_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.radius_slider_.setRange(min_radius*10.0, max_radius*10.0)
-    self.radius_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.radius_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.radius_slider_.setTickInterval(1)
     
     #Ratio
-    ratio_label = QtGui.QLabel("Tube ratio")
+    ratio_label = QtWidgets.QLabel("Tube ratio")
     
-    self.ratio_spinbox_ = QtGui.QDoubleSpinBox()
+    self.ratio_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.ratio_spinbox_.setRange(min_ratio, max_ratio)
     self.ratio_spinbox_.setDecimals(1)
     self.ratio_spinbox_.setSingleStep(0.1)
-    self.ratio_slider_ = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+    self.ratio_slider_ = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
     self.ratio_slider_.setRange(min_ratio*10.0, max_ratio*10.0)
-    self.ratio_slider_.setTickPosition(QtGui.QSlider.NoTicks)
+    self.ratio_slider_.setTickPosition(QtWidgets.QSlider.NoTicks)
     self.ratio_slider_.setTickInterval(2)
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(tube_label,0,0,1,3)
     grid.addWidget(poly_mode_label,1,0,1,3)
     grid.addWidget(self.poly_mode_cb_,1,3,1,2)
@@ -115,13 +115,13 @@ class TubeWidget(RenderModeWidget):
     grid.setRowStretch(6,1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.spline_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSplineDetail)
-    QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail)
-    QtCore.QObject.connect(self.poly_mode_cb_, QtCore.SIGNAL("currentIndexChanged(int)"), self.UpdatePolyMode)
-    QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateRadius)
-    QtCore.QObject.connect(self.radius_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderRadius)
-    QtCore.QObject.connect(self.ratio_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateRatio)
-    QtCore.QObject.connect(self.ratio_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderRatio)
+    self.spline_spinbox_.valueChanged.connect(self.UpdateSplineDetail)
+    self.arc_spinbox_.valueChanged.connect(self.UpdateArcDetail)
+    self.poly_mode_cb_.currentIndexChanged.connect(self.UpdatePolyMode)
+    self.radius_spinbox_.valueChanged.connect(self.UpdateRadius)
+    self.radius_slider_.valueChanged.connect(self.UpdateSliderRadius)
+    self.ratio_spinbox_.valueChanged.connect(self.UpdateRatio)
+    self.ratio_slider_.valueChanged.connect(self.UpdateSliderRatio)
   
     self.setMinimumSize(250,200)
    
diff --git a/modules/gui/pymod/scene/uniform_color_widget.py b/modules/gui/pymod/scene/uniform_color_widget.py
index 66461dcff..2459cbc4c 100644
--- a/modules/gui/pymod/scene/uniform_color_widget.py
+++ b/modules/gui/pymod/scene/uniform_color_widget.py
@@ -27,27 +27,27 @@ try:
 except ImportError:
   _img_present=False
   pass
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets, QtGui
 from color_select_widget import ColorSelectWidget
 
 #Uniform Color Widget
-class UniformColorWidget(QtGui.QWidget):
+class UniformColorWidget(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     self.parent_ = parent
     
     self.text_ = "Uniform Color"
     
     #Create Ui elements
-    uniform_label = QtGui.QLabel(self.text_)
+    uniform_label = QtWidgets.QLabel(self.text_)
     font = uniform_label.font()
     font.setBold(True)
     
     self.color_select_widget_ = ColorSelectWidget(1,1,QtGui.QColor("White"))
     
-    top_layout = QtGui.QVBoxLayout()
+    top_layout = QtWidgets.QVBoxLayout()
     
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(self.color_select_widget_, 2, 1, 1, 1)
     grid.setRowStretch(1, 1)
     grid.setRowStretch(3, 1)
@@ -58,7 +58,7 @@ class UniformColorWidget(QtGui.QWidget):
     top_layout.addLayout(grid)
     self.setLayout(top_layout)
     
-    QtCore.QObject.connect(self.color_select_widget_, QtCore.SIGNAL("colorChanged"), self.ChangeColors)
+    self.color_select_widget_.colorChanged.connect(self.ChangeColors)
     
     self.setMinimumSize(250,150)
 
diff --git a/modules/gui/pymod/scene/visibility_op.py b/modules/gui/pymod/scene/visibility_op.py
index 9e7402dc1..4b5fc7fb8 100644
--- a/modules/gui/pymod/scene/visibility_op.py
+++ b/modules/gui/pymod/scene/visibility_op.py
@@ -20,7 +20,6 @@
 
 from ost import info
 from ost import gfx
-from PyQt4 import QtGui
 
 class VisibilityOp:
   VISIBLE_ATTRIBUTE_NAME = "Visible"
diff --git a/modules/gui/pymod/scene/wireframe_widget.py b/modules/gui/pymod/scene/wireframe_widget.py
index 35175222a..458a8f09b 100644
--- a/modules/gui/pymod/scene/wireframe_widget.py
+++ b/modules/gui/pymod/scene/wireframe_widget.py
@@ -20,7 +20,7 @@
 
 from ost import gui
 from ost import gfx
-from PyQt4 import QtCore, QtGui
+from PyQt5 import QtCore, QtWidgets
 try: 
   from ost import img
   _img_present=True
@@ -30,9 +30,9 @@ except ImportError:
 from scene_selection_helper import SelHelper
 
 #Wireframe Options
-class WireframeWidget(QtGui.QWidget):
+class WireframeWidget(QtWidgets.QWidget):
   def __init__(self, parent=None):
-    QtGui.QWidget.__init__(self, parent)
+    QtWidgets.QWidget.__init__(self, parent)
     
     #Title
     self.text_ = "Wireframe"
@@ -45,21 +45,21 @@ class WireframeWidget(QtGui.QWidget):
     self.mode_ = gfx.RenderMode.SIMPLE
         
     #Create Ui elements
-    self.aa_rendering_cb_ = QtGui.QCheckBox()
+    self.aa_rendering_cb_ = QtWidgets.QCheckBox()
   
-    self.radius_spinbox_ = QtGui.QDoubleSpinBox()
+    self.radius_spinbox_ = QtWidgets.QDoubleSpinBox()
     self.radius_spinbox_.setRange(min_line_width, max_line_width)
     self.radius_spinbox_.setDecimals(2)
     self.radius_spinbox_.setSingleStep(0.1)
 
-    simple_label = QtGui.QLabel("Wireframe Settings")
+    simple_label = QtWidgets.QLabel("Wireframe Settings")
     font = simple_label.font()
     font.setBold(True)
     
-    radius_label = QtGui.QLabel("Line Width")
-    aa_label = QtGui.QLabel("AA-Lines")
+    radius_label = QtWidgets.QLabel("Line Width")
+    aa_label = QtWidgets.QLabel("AA-Lines")
 
-    grid = QtGui.QGridLayout()
+    grid = QtWidgets.QGridLayout()
     grid.addWidget(simple_label,0,0,1,3)
     grid.addWidget(aa_label, 1, 0, 1, 3)
     grid.addWidget(self.aa_rendering_cb_, 1, 2, 1, 1)
@@ -68,8 +68,8 @@ class WireframeWidget(QtGui.QWidget):
     grid.setRowStretch(5,1)
     self.setLayout(grid)
     
-    QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLineWidth)
-    QtCore.QObject.connect(self.aa_rendering_cb_, QtCore.SIGNAL("stateChanged(int)"), self.UpdateAA)  
+    self.radius_spinbox_.valueChanged.connect(self.UpdateLineWidth)
+    self.aa_rendering_cb_.stateChanged.connect(self.UpdateAA)  
     
     self.setMinimumSize(250,100)
     
@@ -100,4 +100,4 @@ class WireframeWidget(QtGui.QWidget):
     return self.text_
 
   def GetRenderMode(self):
-    return self.mode_
\ No newline at end of file
+    return self.mode_
diff --git a/modules/gui/pymod/sip_handler.hh b/modules/gui/pymod/sip_handler.hh
index bdc43461f..a244bdf82 100644
--- a/modules/gui/pymod/sip_handler.hh
+++ b/modules/gui/pymod/sip_handler.hh
@@ -38,10 +38,10 @@ template <class O> object get_py_qobject(O* cpp_object)
 {
   if (cpp_object != NULL){
     static object sip_module=import("sip");
-    static object pyqt4_module=import("PyQt4.QtCore");
+    static object pyqt5_module=import("PyQt5.QtCore");
     QObject* qobject = qobject_cast<QObject*>(cpp_object);
     unsigned long addr = reinterpret_cast<unsigned long>(qobject);
-    object py_qobject = pyqt4_module.attr("QObject");
+    object py_qobject = pyqt5_module.attr("QObject");
     object object = sip_module.attr("wrapinstance")(addr, py_qobject);
     return object;
   }
diff --git a/modules/gui/pymod/table.py b/modules/gui/pymod/table.py
index 94f1c6418..d45b5d74e 100644
--- a/modules/gui/pymod/table.py
+++ b/modules/gui/pymod/table.py
@@ -1,5 +1,5 @@
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtCore import *
 
 from ost import table
 __all__=('Table', )
diff --git a/modules/gui/pymod/trajectory_viewer.py b/modules/gui/pymod/trajectory_viewer.py
index 0741f98fb..6a5189233 100644
--- a/modules/gui/pymod/trajectory_viewer.py
+++ b/modules/gui/pymod/trajectory_viewer.py
@@ -23,16 +23,13 @@ __all__=('TrajWidget','SetTimeUnit','AddTrajectory','RemoveTrajectory','SetSpeed
 # along with this library; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 #-------------------------------------------------------------------------------
-#from PyQt4.QtCore import *
-#from PyQt4.QtGui import *
-import PyQt4 as _PyQt4
-from PyQt4.QtCore import Qt as _Qt
-from PyQt4.QtCore import QObject as _QObject
-from PyQt4.QtGui import QWidget as _QWidget
-from PyQt4.QtGui import QLabel as _QLabel
-from PyQt4.QtGui import QPushButton as _QPushButton
-from PyQt4.QtCore import SIGNAL as _SIGNAL
-from PyQt4.QtCore import QString as _QString
+#from PyQt5.QtCore import *
+#from PyQt5.QtGui import *
+import PyQt5 as _PyQt5
+from PyQt5.QtCore import Qt as _Qt
+from PyQt5.QtWidgets import QWidget as _QWidget
+from PyQt5.QtWidgets import QLabel as _QLabel
+from PyQt5.QtWidgets import QPushButton as _QPushButton
 import ost as _ost
 import math as _math
 
@@ -50,22 +47,22 @@ class TrajWidget(_QWidget):
     self.modifiers=None
     for i,go in enumerate(self.golist_):
       self.index_dict[go.name]=i
-    vb=_PyQt4.QtGui.QVBoxLayout()
-    hb=_PyQt4.QtGui.QHBoxLayout()
-    hb1=_PyQt4.QtGui.QHBoxLayout()
-    hb2=_PyQt4.QtGui.QHBoxLayout()
-    hb3=_PyQt4.QtGui.QHBoxLayout()
-    hb4=_PyQt4.QtGui.QHBoxLayout()
+    vb=_PyQt5.QtGui.QVBoxLayout()
+    hb=_PyQt5.QtGui.QHBoxLayout()
+    hb1=_PyQt5.QtGui.QHBoxLayout()
+    hb2=_PyQt5.QtGui.QHBoxLayout()
+    hb3=_PyQt5.QtGui.QHBoxLayout()
+    hb4=_PyQt5.QtGui.QHBoxLayout()
     self.callback=None   
-    self._slider=_PyQt4.QtGui.QSlider(self)
+    self._slider=_PyQt5.QtGui.QSlider(self)
     self._slider.setOrientation(_Qt.Horizontal)
-    self._speed_slider=_PyQt4.QtGui.QSlider(self)
+    self._speed_slider=_PyQt5.QtGui.QSlider(self)
     self._speed_slider.setOrientation(_Qt.Horizontal)
     self._speedLabel=_QLabel(self)
     self._speedLabel.setText('Speed:')
     self._speedLabel.setAlignment(_Qt.AlignLeft)
-    self._play=_PyQt4.QtGui.QToolButton(self)
-    self._repeat=_PyQt4.QtGui.QCheckBox(self)
+    self._play=_PyQt5.QtGui.QToolButton(self)
+    self._repeat=_PyQt5.QtGui.QCheckBox(self)
     self._frame=_QLabel(self)
     self._frameNo=_QLabel(self)
     self._frameEnd=_QLabel(self)
@@ -96,11 +93,11 @@ class TrajWidget(_QWidget):
     self._left_arrow=_QPushButton("<")
     self._left_arrow2=_QPushButton("<<")
     self._left_end=_QPushButton("|<")
-    self._align_selection=_PyQt4.QtGui.QLineEdit()
+    self._align_selection=_PyQt5.QtGui.QLineEdit()
     self._align=_QPushButton("Align")
     self._align_label=_QLabel(self)
     self._align_label.setText('Selection:')
-    self._ref_entity_selection=_PyQt4.QtGui.QComboBox()
+    self._ref_entity_selection=_PyQt5.QtGui.QComboBox()
     for go in self.golist_:self._ref_entity_selection.addItem(go.name)
     self._ref_entity_selection_label=_QLabel(self)
     self._ref_entity_selection_label.setText('Ref. Entity:')
@@ -134,19 +131,17 @@ class TrajWidget(_QWidget):
     vb.addLayout(hb3)
     vb.addLayout(hb4)
     self._SetSpeedSliderPos(self._speed_slider_min+0.5*(self._speed_slider_max-self._speed_slider_min))
-    _QObject.connect(self._play, _SIGNAL('toggled(bool)'), 
-                    self._TogglePlay)
-    _QObject.connect(self._slider, _SIGNAL('valueChanged(int)'), 
-                    self._SliderValueChanged)
-    _QObject.connect(self._speed_slider,_SIGNAL('valueChanged(int)'),self._SpeedSliderValChanged)
-    _QObject.connect(self._right_end,_SIGNAL('clicked()'),self._RightEndClicked)
-    _QObject.connect(self._right_arrow2,_SIGNAL('clicked()'),self._Right2Clicked)
-    _QObject.connect(self._right_arrow,_SIGNAL('clicked()'),self._RightClicked)
-    _QObject.connect(self._left_arrow2,_SIGNAL('clicked()'),self._Left2Clicked)
-    _QObject.connect(self._left_arrow,_SIGNAL('clicked()'),self._LeftClicked)
-    _QObject.connect(self._left_end,_SIGNAL('clicked()'),self._LeftEndClicked)
-    _QObject.connect(self._align, _SIGNAL('clicked()'), self._AlignClicked)
-    _QObject.connect(self._ref_entity_selection, _SIGNAL('currentIndexChanged(int)'), self._EntitySelected)
+    self._play.toggled.connect(self._TogglePlay)
+    self._slider.valueChanged.connect(self._SliderValueChanged)
+    self._speed_slider.valueChanged.connect(self._SpeedSliderValChanged)
+    self._right_end.clicked.connect(self._RightEndClicked)
+    self._right_arrow2.clicked.connect(self._Right2Clicked)
+    self._right_arrow.clicked.connect(self._RightClicked)
+    self._left_arrow2.clicked.connect(self._Left2Clicked)
+    self._left_arrow.clicked.connect(self._LeftClicked)
+    self._left_end.clicked.connect(self._LeftEndClicked)
+    self._align.clicked.connect(self._AlignClicked)
+    self._ref_entity_selection.currentIndexChanged.connect(self._EntitySelected)
     self._slider.setMinimum(0)
     self.frame_number_=self.traj_.GetFrameCount()-1
     self.timestep_=self.traj_.GetDelta()
diff --git a/modules/gui/pymod/transfer_ownership.hh b/modules/gui/pymod/transfer_ownership.hh
index 5146c065b..63da0b4c7 100644
--- a/modules/gui/pymod/transfer_ownership.hh
+++ b/modules/gui/pymod/transfer_ownership.hh
@@ -13,7 +13,7 @@ namespace ost { namespace gui {
 inline void TransferOwnership(QWidget* obj)
 {
   boost::python::object main_module=boost::python::import("__main__");  
-  boost::python::object qt_gui=boost::python::import("PyQt4.QtGui");
+  boost::python::object qt_gui=boost::python::import("PyQt5.QtGui");
   boost::python::object pobj(reinterpret_cast<unsigned long>(obj));
   boost::python::object sip=main_module.attr("sip");
   boost::python::object type=qt_gui.attr("QWidget");
diff --git a/modules/gui/src/CMakeLists.txt b/modules/gui/src/CMakeLists.txt
index 858a64fec..5a6e33049 100644
--- a/modules/gui/src/CMakeLists.txt
+++ b/modules/gui/src/CMakeLists.txt
@@ -443,8 +443,8 @@ if (APPLE)
 endif()
 set(QT_USE_QTOPENGL 1)
 set(QT_USE_QTNETWORK 1)
-include(${QT_USE_FILE})
-qt4_wrap_cpp(OST_GUI_MOCS "${HEADERS_TO_BE_MOCCED}" 
+
+qt5_wrap_cpp(OST_GUI_MOCS "${HEADERS_TO_BE_MOCCED}" 
              OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
                      -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 module(NAME gui SOURCES ${OST_GUI_MOCS} ${OST_GUI_SOURCES}
@@ -458,24 +458,28 @@ module(NAME gui SOURCES ${OST_GUI_MOCS} ${OST_GUI_SOURCES}
                ${OST_GUI_DATA_VIEWER_HEADERS}
                ${OST_GUI_HEADERS}
        DEPENDS_ON ost_gfx ost_io ost_mol_alg ost_seq_alg
-       LINK ${QT_LIBRARIES} ${PYTHON_LIBRARIES} ${BOOST_PYTHON_LIBRARIES}
+       LINK Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL Qt5::PrintSupport Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL Qt5::PrintSupport
+            ${PYTHON_LIBRARIES} 
+            ${BOOST_PYTHON_LIBRARIES}
             ${SPNAV_LIBRARIES}
         NO_STATIC)
-            
+
+
+   
 if (ADDITIONAL_LIBRARIES)
   target_link_libraries(ost_gui "${ADDITIONAL_LIBRARIES}")
 endif()
 
 include_directories(${PYTHON_INCLUDE_PATH})
-qt4_add_resources(OST_QT_RESOURCE dngr.qrc)
-qt4_wrap_cpp(OST_GOSTY_MOC "gosty.hh"
+qt5_add_resources(OST_QT_RESOURCE dngr.qrc)
+qt5_wrap_cpp(OST_GOSTY_MOC "gosty.hh"
              OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
                      -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 
-set(LINK LINK ${BOOST_PROGRAM_OPTIONS_LIBRARIES})
+set(LINK LINK Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL Qt5::PrintSupport Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL Qt5::PrintSupport ${BOOST_PROGRAM_OPTIONS_LIBRARIES})
 
-executable_libexec(NAME gosty SOURCES gosty.cc ${OST_GOSTY_MOC} ${OST_QT_RESOURCE} 
-           DEPENDS_ON ost_gui ${LINK})
+executable_libexec(NAME gosty SOURCES gosty.cc ${OST_GOSTY_MOC}
+                   ${OST_QT_RESOURCE} DEPENDS_ON ost_gui ${LINK})
            
 file(GLOB MOC_CXX_FILES moc_*.cxx)
 
diff --git a/modules/gui/src/file_viewer.cc b/modules/gui/src/file_viewer.cc
index a5c5d7271..3d64433a9 100644
--- a/modules/gui/src/file_viewer.cc
+++ b/modules/gui/src/file_viewer.cc
@@ -24,7 +24,7 @@
 #include <QMainWindow>
 #include <QSyntaxHighlighter>
 #include <QTextEdit>
-#include <QtGui>
+#include <QVBoxLayout>
 
 namespace ost { namespace gui {
 
diff --git a/modules/gui/src/gl_canvas.cc b/modules/gui/src/gl_canvas.cc
index 9e39789b9..83dd63ccc 100644
--- a/modules/gui/src/gl_canvas.cc
+++ b/modules/gui/src/gl_canvas.cc
@@ -52,8 +52,8 @@ namespace ost { namespace gui {
 
 using gfx::Scene;
 
-GLCanvas::GLCanvas(GLWin* gl_win,  QWidget* parent, const QGLFormat& f):
-  QGLWidget(f,parent),
+GLCanvas::GLCanvas(GLWin* gl_win,  QWidget* parent, const QSurfaceFormat& f):
+  QOpenGLWidget(parent),
   glwin_(gl_win),
   mouse_key_mask_(),
   refresh_(true),
@@ -64,12 +64,13 @@ GLCanvas::GLCanvas(GLWin* gl_win,  QWidget* parent, const QGLFormat& f):
   show_beacon_(false),
   angular_speed_(0.0)
 {
-  if(!isValid()) return;
+  this->setFormat(f);
   master_timer_.start(10,this);
   setFocusPolicy(Qt::StrongFocus);
   setMouseTracking(true);
   scene_menu_=new SceneMenu();
   this->setContextMenuPolicy(Qt::CustomContextMenu);
+  this->setAutoFillBackground(false);
   connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this,
           SLOT(RequestContextMenu(const QPoint&)));
 #if QT_VERSION >= 0x040600
@@ -84,7 +85,7 @@ bool GLCanvas::event(QEvent* event)
     return this->GestureEvent(static_cast<QGestureEvent*>(event));
   }
 #endif
-  return QGLWidget::event(event);
+  return QOpenGLWidget::event(event);
 }
 
 
@@ -176,7 +177,7 @@ void GLCanvas::wheelEvent(QWheelEvent* event)
 }
 bool GLCanvas::IsToolEvent(QInputEvent* event) const
 {
-  return event->modifiers() & Qt::ControlModifier;
+  return (event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier;
 }
 
 MouseEvent::Buttons GLCanvas::TranslateButtons(Qt::MouseButtons buttons) const
@@ -464,7 +465,7 @@ void GLCanvas::keyReleaseEvent(QKeyEvent* event)
     emit ReleaseFocus();
     return;
   }
-  QGLWidget::keyReleaseEvent(event);
+  QOpenGLWidget::keyReleaseEvent(event);
 }
 
 #ifndef _MSC_VER
@@ -500,7 +501,7 @@ void GLCanvas::timerEvent(QTimerEvent * event)
   if(refresh_ || bench_flag_) {
     refresh_=false;
     master_timer_.stop();
-    this->updateGL();
+    this->update();
     master_timer_.start(10,this);
   }
 
diff --git a/modules/gui/src/gl_canvas.hh b/modules/gui/src/gl_canvas.hh
index dbc879e91..152f18fc3 100644
--- a/modules/gui/src/gl_canvas.hh
+++ b/modules/gui/src/gl_canvas.hh
@@ -29,30 +29,37 @@
 
 
 // Qt includes must come last
-#include <QGLWidget>
+#include <QOpenGLWidget>
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#include <QSurfaceFormat>
 #include <QBasicTimer>
 class QMenu;
 class QMouseEvent;
 
+#if QT_VERSION >= 0x040600  
+class QGestureEvent;
+#endif
+
 namespace ost { namespace gui {
 
 class GLCanvas;
 
 class GLWin;
 
-class DLLEXPORT_OST_GUI GLCanvas : public QGLWidget, public gfx::GLWinBase
+class DLLEXPORT_OST_GUI GLCanvas : public QOpenGLWidget, public gfx::GLWinBase
 {  
   Q_OBJECT;
 public:
   GLCanvas(GLWin *gl_win, QWidget* parent,
-           const QGLFormat& f = QGLFormat::defaultFormat());
+           const QSurfaceFormat& f = QSurfaceFormat::defaultFormat());
 
   // gfx::GLWinBase interface
   virtual void MakeActive();
   virtual void DoRefresh();
   virtual void StatusMessage(const String& m);
   virtual bool HasStereo() const {return format().stereo();};
-  virtual bool HasMultisample() const {return format().sampleBuffers();}
+  virtual bool HasMultisample() const {return format().samples() > 1;}
 
   // central point for sending input to the gfx layer
   void OnTransform(gfx::InputCommand, int indx, 
diff --git a/modules/gui/src/gl_win.cc b/modules/gui/src/gl_win.cc
index fc584da9b..aa4925897 100644
--- a/modules/gui/src/gl_win.cc
+++ b/modules/gui/src/gl_win.cc
@@ -58,59 +58,33 @@ gl_canvas_(NULL)
   
   if(try_stereo) {
     LOG_VERBOSE("GLCanvas: trying stereo visuals first");
-    for(int format_id=4;format_id>=0;--format_id) {
-      QGLFormat format=GLWin::CreateFormat(format_id);
-      if (try_stereo) {
-        format.setStereo(true);
-      }
-      gl_canvas_=new GLCanvas(this, main, format);
-      if(gl_canvas_->isValid() && gl_canvas_->format().stereo()) {
-        break; // format is fine
-      } else {
-        delete gl_canvas_; // delete this canvas and try a less sophisticated format
-        gl_canvas_=0;
-      }
-    }
+    QSurfaceFormat format=QSurfaceFormat::defaultFormat();
+    format.setStereo(true);
+    gl_canvas_=new GLCanvas(this, main, format);
   }
   if(!gl_canvas_) {
     if(try_stereo) {
       LOG_VERBOSE("GLCanvas: no stereo visual found, trying normal ones");
-    }
-    for(int format_id=4;format_id>=0;--format_id) {
-      QGLFormat format=GLWin::CreateFormat(format_id);
-      gl_canvas_=new GLCanvas(this, main, format);
-      if(gl_canvas_->isValid()) {
-        break; // format is fine
-      } else {
-        delete gl_canvas_; // delete this canvas and try a less sophisticated format
-        gl_canvas_=0;
-      }
-    }
-  }
-
-  if(!gl_canvas_ || !gl_canvas_->isValid()) {
-    LOG_ERROR("GLCanvas: no valid GL context found, this is pretty fatal");
-    return;
+    }  
+    gl_canvas_=new GLCanvas(this, main);
   }
 
   this->SetInternalWidget(main);
   gfx::Scene::Instance().AttachObserver(this);
-  QGLFormat format = gl_canvas_->format();
-
+  QSurfaceFormat format = gl_canvas_->format();
 
   LOG_VERBOSE("GLCanvas: using " << format.redBufferSize() << "." 
                               << format.greenBufferSize() << "."
                               << format.blueBufferSize() << "."
                               << format.alphaBufferSize() << " RGBA bits, " 
                               << format.depthBufferSize() << " depth bits, "
-                              << format.accumBufferSize() << " accum bits, and "
                               << format.stencilBufferSize() << " stencil bits")
   if(gl_canvas_->format().stereo()) {
     LOG_VERBOSE("GLCanvas: using stereo visual");
   } else {
     LOG_VERBOSE("GLCanvas: no stereo visual found");
   }
-  if(format.sampleBuffers()) {
+  if(format.samples() > 1) {
     LOG_VERBOSE("GLCanvas: using multisampling with " << format.samples() << " samples per pixel");
   } else {
     LOG_VERBOSE("GLCanvas: no multisampling");
@@ -126,6 +100,11 @@ gl_canvas_(NULL)
 #if OST_IMG_ENABLED
   ToolManager::Instance().AddTool(new MapTool);
 #endif
+
+  if(!gl_canvas_ || !gl_canvas_->isValid()) {
+    LOG_ERROR("GLCanvas: no valid GL context found, this is pretty fatal");
+    return;
+  }
 }
 
 void GLWin::ActiveToolChanged(Tool* t)
@@ -133,53 +112,6 @@ void GLWin::ActiveToolChanged(Tool* t)
   gfx::Scene::Instance().RequestRedraw();
 }
 
-QGLFormat GLWin::CreateFormat(int fid)
-{
-  QGLFormat format = QGLFormat::defaultFormat();
-  if(fid==4) {
-    format.setDepthBufferSize(24);
-    format.setRedBufferSize(8);
-    format.setGreenBufferSize(8);
-    format.setBlueBufferSize(8);
-    format.setAlpha(true);
-    format.setAlphaBufferSize(8);
-    format.setAccum(true);
-    format.setStencil(true);
-    format.setSampleBuffers(true);
-  } else if(fid==3) {
-    format.setDepthBufferSize(24);
-    format.setRedBufferSize(8);
-    format.setGreenBufferSize(8);
-    format.setBlueBufferSize(8);
-    format.setAlpha(true);
-    format.setAlphaBufferSize(8);
-    format.setAccum(true);
-    format.setSampleBuffers(true);
-  } else if(fid==2) {
-    format.setDepthBufferSize(12);
-    format.setRedBufferSize(8);
-    format.setGreenBufferSize(8);
-    format.setBlueBufferSize(8);
-    format.setAlpha(true);
-    format.setAlphaBufferSize(8);
-    format.setAccum(true);
-    format.setSampleBuffers(true);
-  } else if(fid==1) {
-    format.setDepthBufferSize(12);
-    format.setRedBufferSize(8);
-    format.setGreenBufferSize(8);
-    format.setBlueBufferSize(8);
-    format.setAlpha(true);
-    format.setAlphaBufferSize(8);
-  } else {
-    format.setDepthBufferSize(6);
-    format.setRedBufferSize(4);
-    format.setGreenBufferSize(4);
-    format.setBlueBufferSize(4);
-  }
-  return format;  
-}
-
 GLWin::~GLWin()
 {
   gfx::Scene::Instance().DetachObserver(this);
diff --git a/modules/gui/src/gl_win.hh b/modules/gui/src/gl_win.hh
index 3e32df5c2..8b2ccda0f 100644
--- a/modules/gui/src/gl_win.hh
+++ b/modules/gui/src/gl_win.hh
@@ -25,7 +25,6 @@
 #include <ost/gui/module_config.hh>
 #include <ost/gui/widget.hh>
 
-#include <QGLFormat>
 #include <QActionGroup>
 
 class QStatusBar;
@@ -60,7 +59,6 @@ public slots:
   void StatusMessage(const String& m);
   void ActiveToolChanged(Tool* t);
 private:
-  static QGLFormat CreateFormat(int fid);
   GLCanvas* gl_canvas_;
 
   QAction* edit_rigid_action_;
diff --git a/modules/gui/src/main.cc b/modules/gui/src/main.cc
index f3b1c6f6e..e68f5fcf8 100644
--- a/modules/gui/src/main.cc
+++ b/modules/gui/src/main.cc
@@ -50,6 +50,7 @@
 #include <QFile>
 #include <QDragEnterEvent>
 #include <QDropEvent>
+#include <QMimeData>
 
 namespace ost { namespace gui {
 
diff --git a/modules/gui/src/panels/event_button.cc b/modules/gui/src/panels/event_button.cc
index f541dcc87..3c7896440 100644
--- a/modules/gui/src/panels/event_button.cc
+++ b/modules/gui/src/panels/event_button.cc
@@ -18,7 +18,8 @@
 //------------------------------------------------------------------------------
 
 #include "event_button.hh"
-
+#include <QMimeData>
+#include <QDrag>
 
 namespace ost { namespace gui {
 
diff --git a/modules/gui/src/panels/panel_bar_widget_holder.cc b/modules/gui/src/panels/panel_bar_widget_holder.cc
index 358f86eef..0d979e822 100644
--- a/modules/gui/src/panels/panel_bar_widget_holder.cc
+++ b/modules/gui/src/panels/panel_bar_widget_holder.cc
@@ -42,6 +42,9 @@
 #include <QAction>
 #include <QComboBox>
 #include <QDebug>
+#include <QMimeData>
+#include <QDrag>
+
 /*
   Author: Marco Biasini, Stefan Scheuber
  */
diff --git a/modules/gui/src/panels/tabbed_panel_bar.cc b/modules/gui/src/panels/tabbed_panel_bar.cc
index aacb5cb3d..b02550762 100644
--- a/modules/gui/src/panels/tabbed_panel_bar.cc
+++ b/modules/gui/src/panels/tabbed_panel_bar.cc
@@ -27,6 +27,8 @@
 #include <QApplication>
 #include <QSettings>
 #include <QDir>
+#include <QMimeData>
+#include <QDrag>
 
 namespace ost { namespace gui {
 
diff --git a/modules/gui/src/python_shell/python_namespace_tree_model.hh b/modules/gui/src/python_shell/python_namespace_tree_model.hh
index da21a394f..21b283e6b 100644
--- a/modules/gui/src/python_shell/python_namespace_tree_model.hh
+++ b/modules/gui/src/python_shell/python_namespace_tree_model.hh
@@ -50,7 +50,8 @@ public:
   int columnCount(const QModelIndex&parent=QModelIndex()) const;
   QModelIndex index(int row, int column, const QModelIndex& parent=QModelIndex()) const;
   QModelIndex parent(const QModelIndex &index) const;
-  void Reset() { this->reset(); }
+  void Reset() {this->beginResetModel();
+                this->endResetModel(); }
 public slots:
   void NamespaceChanged();
 
diff --git a/modules/gui/src/python_shell/python_shell_widget.cc b/modules/gui/src/python_shell/python_shell_widget.cc
index 9c816f5dc..93d3f3896 100644
--- a/modules/gui/src/python_shell/python_shell_widget.cc
+++ b/modules/gui/src/python_shell/python_shell_widget.cc
@@ -42,6 +42,7 @@
 #include <QDirModel>
 #include <QStringList>
 #include <QDebug>
+#include <QMimeData>
 
 /*
  Authors: Marco Biasini, Andreas Schenk
diff --git a/modules/gui/src/scene_win/scene_win_model.cc b/modules/gui/src/scene_win/scene_win_model.cc
index 2acc15eb3..c9cf6d681 100644
--- a/modules/gui/src/scene_win/scene_win_model.cc
+++ b/modules/gui/src/scene_win/scene_win_model.cc
@@ -36,6 +36,7 @@
 #include <QSize>
 #include <QFont>
 #include <QDebug>
+#include <QDataStream>
 
 namespace ost { namespace gui {
 
diff --git a/modules/gui/src/sequence_viewer/alignment_view_object.cc b/modules/gui/src/sequence_viewer/alignment_view_object.cc
index a12a2e54b..9084ee7fa 100644
--- a/modules/gui/src/sequence_viewer/alignment_view_object.cc
+++ b/modules/gui/src/sequence_viewer/alignment_view_object.cc
@@ -143,19 +143,19 @@ QVariant AlignmentViewObject::GetData(int row, int column, int role)
         if(column -1 < conservation_1_.size()){
           return QVariant(conservation_1_[column-1]);
         }
-          return QVariant(Qt::transparent);
+          return QVariant(QColor(Qt::transparent));
       }
 
       if(role == Qt::ForegroundRole){
         if(column -1 < conservation_1_.size()){
           if(conservation_1_[column-1].red()>128){
-            return QVariant(Qt::black);
+            return QVariant(QColor(Qt::black));
           }
           else{
-            return QVariant(Qt::white);
+            return QVariant(QColor(Qt::white));
           }
         }
-        return QVariant(Qt::transparent);
+        return QVariant(QColor(Qt::transparent));
       }
     }
     else if(this->GetCurrentDisplayMode() == conservation_mode_2){
@@ -163,13 +163,13 @@ QVariant AlignmentViewObject::GetData(int row, int column, int role)
         if(column -1 < conservation_2_.size()){
           return QVariant(conservation_2_[column-1]);
         }
-        return QVariant(Qt::transparent);
+        return QVariant(QColor(Qt::transparent));
       }
       if(role == Qt::ForegroundRole){
         if(column -1 < conservation_2_.size()){
-            return QVariant(Qt::black);
+            return QVariant(QColor(Qt::black));
         }
-        return QVariant(Qt::transparent);
+        return QVariant(QColor(Qt::transparent));
       }
     }
   }
diff --git a/modules/img/alg/src/CMakeLists.txt b/modules/img/alg/src/CMakeLists.txt
index 5df3fd558..692f96f5c 100644
--- a/modules/img/alg/src/CMakeLists.txt
+++ b/modules/img/alg/src/CMakeLists.txt
@@ -92,9 +92,6 @@ line_average.hh
 rscrosscorr.hh
 )
 
-if(ENABLE_INFO)
-include(${QT_USE_FILE})
-endif()
 module(NAME img_alg SOURCES "${OST_IMG_ALG_SOURCES}" 
        HEADERS "${OST_IMG_ALG_HEADERS}" 
        HEADER_OUTPUT_DIR ost/img/alg
diff --git a/modules/info/src/CMakeLists.txt b/modules/info/src/CMakeLists.txt
index 31d6db3b4..6b976ecd7 100644
--- a/modules/info/src/CMakeLists.txt
+++ b/modules/info/src/CMakeLists.txt
@@ -27,10 +27,9 @@ item_type.hh
 geom_info_conversion.hh
 item_type_cast.hh)
 
-set(QT_DONT_USE_QTGUI 1)
 set(QT_USE_QTXML 1)
-include(${QT_USE_FILE})
+
 module(NAME info SOURCES ${OST_INFO_SOURCES}
        HEADERS ${OST_INFO_HEADERS}
-       DEPENDS_ON ost_base LINK ${BOOST_REGEX_LIBRARIES} ${QT_LIBRARIES})
+       DEPENDS_ON ost_base LINK ${BOOST_REGEX_LIBRARIES} ${QT_LIBRARIES} Qt5::Xml)
 
diff --git a/modules/info/src/info_impl.cc b/modules/info/src/info_impl.cc
index 0f6415504..4c0eadc65 100644
--- a/modules/info/src/info_impl.cc
+++ b/modules/info/src/info_impl.cc
@@ -31,8 +31,7 @@
 
 #include <boost/filesystem/operations.hpp>
 
-#include <QFile>
-#include <QtCore>
+#include <QtCore/QFile>
 
 #include "info_error.hh"
 #include "info_impl.hh"
diff --git a/modules/info/src/info_impl.hh b/modules/info/src/info_impl.hh
index fd84d96ed..4b3c46be3 100644
--- a/modules/info/src/info_impl.hh
+++ b/modules/info/src/info_impl.hh
@@ -32,10 +32,10 @@
 #include <vector>
 #include <iostream>
 
-#include <QDomElement>
-#include <QDomDocument>
-#include <QDomAttr>
-#include <QDomText>
+#include <QtXml/QDomElement>
+#include <QtXml/QDomDocument>
+#include <QtXml/QDomAttr>
+#include <QtXml/QDomText>
 
 #include <ost/base.hh>
 #include <ost/geom/geom.hh>
-- 
GitLab