diff --git a/qutebrowser/app.py b/qutebrowser/app.py
index b5ce72f1b..0e4b152f8 100644
--- a/qutebrowser/app.py
+++ b/qutebrowser/app.py
@@ -32,19 +32,18 @@ import functools
 import traceback
 
 from PyQt5.QtWidgets import QApplication, QDialog
-from PyQt5.QtCore import (pyqtSlot, QTimer, QEventLoop, Qt, QStandardPaths,
+from PyQt5.QtCore import (pyqtSlot, QTimer, QEventLoop, QStandardPaths,
                           qInstallMessageHandler, QObject, QUrl)
 
 import qutebrowser
-from qutebrowser.commands import runners, cmdutils
+from qutebrowser.commands import cmdutils
 from qutebrowser.config import style, config, websettings
 from qutebrowser.network import qutescheme, proxy
 from qutebrowser.browser import quickmarks, cookies, downloads, cache
 from qutebrowser.widgets import mainwindow, console, crash
 from qutebrowser.keyinput import modeman
-from qutebrowser.utils import (log, version, message, utilcmds, readline,
-                               utils, qtutils, urlutils, debug, objreg,
-                               usertypes)
+from qutebrowser.utils import (log, version, message, readline, utils, qtutils,
+                               urlutils, debug, objreg, usertypes)
 
 
 class Application(QApplication):
diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py
index 20c9eb35a..f3e95cb71 100644
--- a/qutebrowser/browser/commands.py
+++ b/qutebrowser/browser/commands.py
@@ -836,17 +836,17 @@ class CommandDispatcher:
         try:
             timer.setInterval(ms)
         except OverflowError:
-            raise cmdexc.CommandError("Numeric argument is too large for internal "
-                                    "int representation.")
+            raise cmdexc.CommandError("Numeric argument is too large for "
+                                      "internal int representation.")
         self._timers.append(timer)
         cmdline = ' '.join(command)
         commandrunner = objreg.get('command-runner', scope='window',
                                    window=self._win_id)
-        timer.timeout.connect(functools.partial(commandrunner.run_safely, cmdline))
+        timer.timeout.connect(
+            functools.partial(commandrunner.run_safely, cmdline))
         timer.timeout.connect(lambda: self._timers.remove(timer))
         timer.start()
 
-
     @cmdutils.register(instance='command-dispatcher',
                        modes=[usertypes.KeyMode.insert],
                        hide=True, scope='window')
@@ -874,7 +874,7 @@ class CommandDispatcher:
         else:
             text = elem.evaluateJavaScript('this.value')
         self._editor = editor.ExternalEditor(
-            win_id, self._tabbed_browser())
+            self._win_id, self._tabbed_browser())
         self._editor.editing_finished.connect(
             functools.partial(self.on_editing_finished, elem))
         self._editor.edit(text)
diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py
index 5c4b9282d..473596e6f 100644
--- a/qutebrowser/browser/downloads.py
+++ b/qutebrowser/browser/downloads.py
@@ -31,7 +31,6 @@ from qutebrowser.config import config
 from qutebrowser.commands import cmdexc, cmdutils
 from qutebrowser.utils import (message, http, usertypes, log, utils, qtutils,
                                objreg)
-from qutebrowser.widgets import mainwindow
 
 
 class DownloadItem(QObject):
diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py
index f24e9a39e..6fe13c7b0 100644
--- a/qutebrowser/browser/hints.py
+++ b/qutebrowser/browser/hints.py
@@ -367,7 +367,7 @@ class HintManager(QObject):
         qtutils.ensure_valid(url)
         cmd = self._context.args[0]
         args = self._context.args[1:]
-        userscripts.run(cmd, *args, url=url)
+        userscripts.run(cmd, *args, url=url, win_id=self._win_id)
 
     def _spawn(self, url):
         """Spawn a simple command from a hint."""
diff --git a/qutebrowser/commands/userscripts.py b/qutebrowser/commands/userscripts.py
index b7945c35a..bd579b2a6 100644
--- a/qutebrowser/commands/userscripts.py
+++ b/qutebrowser/commands/userscripts.py
@@ -343,5 +343,5 @@ def run(cmd, *args, url, win_id):
     _runners.append(runner)
     _commandrunners.append(commandrunner)
     runner.finished.connect(functools.partial(_runners.remove, runner))
-    commandrunner.finished.connect(
+    runner.finished.connect(
         functools.partial(_commandrunners.remove, commandrunner))
diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py
index 238891e6c..9982b9aaf 100644
--- a/qutebrowser/keyinput/modeman.py
+++ b/qutebrowser/keyinput/modeman.py
@@ -113,6 +113,7 @@ class EventFilter(QObject):
         self._activated = True
 
     def eventFilter(self, obj, event):
+        """Forward events to the correct modeman."""
         if not self._activated:
             return False
         try:
diff --git a/qutebrowser/network/schemehandler.py b/qutebrowser/network/schemehandler.py
index a85565a8b..8256162eb 100644
--- a/qutebrowser/network/schemehandler.py
+++ b/qutebrowser/network/schemehandler.py
@@ -34,7 +34,8 @@ class SchemeHandler(QObject):
         _win_id: The window ID this scheme handler is associated with.
     """
 
-    def __init__(self, win_id):
+    def __init__(self, win_id, parent=None):
+        super().__init__(parent)
         self._win_id = win_id
 
     def createRequest(self, op, request, outgoing_data):
diff --git a/qutebrowser/utils/utilcmds.py b/qutebrowser/utils/utilcmds.py
index 82820357a..3a93acada 100644
--- a/qutebrowser/utils/utilcmds.py
+++ b/qutebrowser/utils/utilcmds.py
@@ -20,8 +20,6 @@
 """Misc. utility commands exposed to the user."""
 
 import types
-import functools
-
 
 from PyQt5.QtCore import QCoreApplication
 
diff --git a/qutebrowser/widgets/mainwindow.py b/qutebrowser/widgets/mainwindow.py
index e9e1a87fb..d444b2023 100644
--- a/qutebrowser/widgets/mainwindow.py
+++ b/qutebrowser/widgets/mainwindow.py
@@ -40,8 +40,14 @@ win_id_gen = itertools.count(0)
 
 
 def create_window():
+    """Create a new main window.
+
+    Return:
+        The MainWindow object.
+    """
     win_id = next(win_id_gen)
     win = MainWindow(win_id)
+    return win
 
 
 class MainWindow(QWidget):
@@ -170,14 +176,14 @@ class MainWindow(QWidget):
 
     def _connect_signals(self):
         """Connect all mainwindow signals."""
+        # pylint: disable=too-many-locals,too-many-statements
         app = objreg.get('app')
         download_manager = objreg.get('download-manager')
         key_config = objreg.get('key-config')
-        config_obj = objreg.get('config')
 
         status = self._get_object('statusbar')
         keyparsers = self._get_object('keyparsers')
-        completion = self._get_object('completion')
+        completion_obj = self._get_object('completion')
         tabs = self._get_object('tabbed-browser')
         cmd = self._get_object('status-command')
         completer = self._get_object('completer')
@@ -242,16 +248,14 @@ class MainWindow(QWidget):
         # command input / completion
         mode_manager.left.connect(tabs.on_mode_left)
         cmd.clear_completion_selection.connect(
-            completion.on_clear_completion_selection)
-        cmd.hide_completion.connect(completion.hide)
+            completion_obj.on_clear_completion_selection)
+        cmd.hide_completion.connect(completion_obj.hide)
         cmd.update_completion.connect(completer.on_update_completion)
         completer.change_completed_part.connect(cmd.on_change_completed_part)
 
         # downloads
         tabs.start_download.connect(download_manager.fetch)
 
-
-
     @pyqtSlot()
     def resize_completion(self):
         """Adjust completion according to config."""