diff --git a/briar-gtk/briar_gtk/actions/window.py b/briar-gtk/briar_gtk/actions/window.py
index b18d7c596e257b955bda3dc14362b6cc2bcd352f..58e071d70641bffe10b1141e832a9e9550089818 100644
--- a/briar-gtk/briar_gtk/actions/window.py
+++ b/briar-gtk/briar_gtk/actions/window.py
@@ -10,7 +10,7 @@ from gi.repository import GLib
 
 from briar_gtk.actions.actions import Actions
 from briar_gtk.actions.prefixes import WINDOW_PREFIX
-from briar_gtk.controllers.main_window import MainWindowController
+from briar_gtk.presenters.main_window import MainWindowPresenter
 from briar_gtk.define import APP
 
 
@@ -64,25 +64,25 @@ class WindowActions(Actions):
 
     # pylint: disable=unused-argument
     def _back_to_sidebar(self, action, parameter):
-        if isinstance(self.widget.main_window_controller,
-                      MainWindowController):
-            self.widget.main_window_controller.close_private_chat()
+        if isinstance(self.widget.main_window_presenter,
+                      MainWindowPresenter):
+            self.widget.main_window_presenter.close_private_chat()
 
     # pylint: disable=unused-argument
     def _delete_all_messages_dialog(self, action, parameter):
-        self.widget.main_window_controller.open_delete_all_messages_dialog()
+        self.widget.main_window_presenter.open_delete_all_messages_dialog()
 
     # pylint: disable=unused-argument
     def _delete_contact_dialog(self, action, parameter):
-        self.widget.main_window_controller.open_delete_contact_dialog()
+        self.widget.main_window_presenter.open_delete_contact_dialog()
 
     # pylint: disable=unused-argument
     def _change_alias_contact_dialog(self, action, parameter):
-        self.widget.main_window_controller.open_change_contact_alias_dialog()
+        self.widget.main_window_presenter.open_change_contact_alias_dialog()
 
     # pylint: disable=unused-argument
     def _open_about_page(self, action, parameter):
-        self.widget.main_window_controller.open_about_page()
+        self.widget.main_window_presenter.open_about_page()
 
     # pylint: disable=unused-argument
     def _open_add_contact(self, action, parameter):
@@ -94,5 +94,5 @@ class WindowActions(Actions):
 
     # pylint: disable=unused-argument
     def _open_private_chat(self, action, contact_id):
-        self.widget.main_window_controller.open_private_chat(
+        self.widget.main_window_presenter.open_private_chat(
             contact_id.get_int32())
diff --git a/briar-gtk/briar_gtk/handlers/__init__.py b/briar-gtk/briar_gtk/handlers/__init__.py
index 57c15133254824c77ba5f6aeafd3dcd46351ad0e..09832ee9c69e944fc22a265421f40c6bde187b07 100644
--- a/briar-gtk/briar_gtk/handlers/__init__.py
+++ b/briar-gtk/briar_gtk/handlers/__init__.py
@@ -2,6 +2,6 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 # License-Filename: LICENSE.md
 """
-Similar to controllers, handlers react to input, but they aren't attached
+Similar to presenters, handlers react to input, but they aren't attached
 to a view
 """
diff --git a/briar-gtk/briar_gtk/controllers/__init__.py b/briar-gtk/briar_gtk/presenters/__init__.py
similarity index 55%
rename from briar-gtk/briar_gtk/controllers/__init__.py
rename to briar-gtk/briar_gtk/presenters/__init__.py
index fb84ada4bc313ecfdf8c809be769ebdc9d2ba4f5..d793e06631ea0761d822b96628d96b1edfd6f6a9 100644
--- a/briar-gtk/briar_gtk/controllers/__init__.py
+++ b/briar-gtk/briar_gtk/presenters/__init__.py
@@ -2,5 +2,5 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 # License-Filename: LICENSE.md
 """
-Controllers reacting to user input in Briar GTK
+Presenters (of MVP pattern) reacting to user input and model/data updates in Briar GTK
 """
diff --git a/briar-gtk/briar_gtk/controllers/main_window.py b/briar-gtk/briar_gtk/presenters/main_window.py
similarity index 62%
rename from briar-gtk/briar_gtk/controllers/main_window.py
rename to briar-gtk/briar_gtk/presenters/main_window.py
index 186e43620a42db8b9bf1afb89b3a52f53b0d42fb..cb81cd1c3771d3369fecc1042098fa38040645e7 100644
--- a/briar-gtk/briar_gtk/controllers/main_window.py
+++ b/briar-gtk/briar_gtk/presenters/main_window.py
@@ -3,15 +3,15 @@
 # License-Filename: LICENSE.md
 
 from briar_gtk.handlers.notification import NotificationHandler
-from briar_gtk.controllers.private_chat import PrivateChatController
-from briar_gtk.controllers.sidebar import SidebarController
+from briar_gtk.presenters.private_chat import PrivateChatPresenter
+from briar_gtk.presenters.sidebar import SidebarPresenter
 from briar_gtk.define import APP
 from briar_gtk.views.private_chat import PrivateChatView
 from briar_gtk.views.sidebar import SidebarView
 from briar_gtk.widgets.about_dialog import AboutDialogWidget
 
 
-class MainWindowController:
+class MainWindowPresenter:
 
     def __init__(self, main_window_view, builder):
         self._main_window_view = main_window_view
@@ -27,41 +27,41 @@ class MainWindowController:
         about_dialog.show()
 
     def open_change_contact_alias_dialog(self):
-        if self._private_chat_controller is not None:
-            self._private_chat_controller.open_change_contact_alias_dialog()
+        if self._private_chat_presenter is not None:
+            self._private_chat_presenter.open_change_contact_alias_dialog()
 
     def open_delete_all_messages_dialog(self):
-        if self._private_chat_controller is not None:
-            self._private_chat_controller.open_delete_all_messages_dialog()
+        if self._private_chat_presenter is not None:
+            self._private_chat_presenter.open_delete_all_messages_dialog()
 
     def open_delete_contact_dialog(self):
-        if self._private_chat_controller is not None:
-            self._private_chat_controller.open_delete_contact_dialog()
+        if self._private_chat_presenter is not None:
+            self._private_chat_presenter.open_delete_contact_dialog()
 
     def close_private_chat(self):
-        if self._private_chat_controller is not None:
-            self._private_chat_controller.close_private_chat()
-            self._private_chat_controller = None
+        if self._private_chat_presenter is not None:
+            self._private_chat_presenter.close_private_chat()
+            self._private_chat_presenter = None
 
     def open_private_chat(self, contact_id):
         private_chat_view = PrivateChatView(self._builder)
-        self._private_chat_controller = PrivateChatController(
-            contact_id, private_chat_view, self._sidebar_controller,
+        self._private_chat_presenter = PrivateChatPresenter(
+            contact_id, private_chat_view, self._sidebar_presenter,
             self._builder, APP().api)
 
     def _setup_children(self):
         self._setup_notification_handler()
-        self._setup_sidebar_controller()
-        self._private_chat_controller = None
+        self._setup_sidebar_presenter()
+        self._private_chat_presenter = None
         contact_name_label = self._builder.get_object("contact_name")
         contact_name_label.set_text("")
 
     def _setup_notification_handler(self):
         self._notification_handler = NotificationHandler()
 
-    def _setup_sidebar_controller(self):
+    def _setup_sidebar_presenter(self):
         sidebar_view = SidebarView(self._builder)
-        self._sidebar_controller = SidebarController(
+        self._sidebar_presenter = SidebarPresenter(
             sidebar_view, APP().api)
 
     def _setup_destroy_listener(self):
@@ -72,7 +72,7 @@ class MainWindowController:
         self._disconnect_signals()
 
     def _disconnect_signals(self):
-        self._sidebar_controller.disconnect_signals()
+        self._sidebar_presenter.disconnect_signals()
         self._notification_handler.disconnect_signals()
         for signal in self._signals:
             APP().api.socket_listener.disconnect(signal)
diff --git a/briar-gtk/briar_gtk/controllers/private_chat.py b/briar-gtk/briar_gtk/presenters/private_chat.py
similarity index 95%
rename from briar-gtk/briar_gtk/controllers/private_chat.py
rename to briar-gtk/briar_gtk/presenters/private_chat.py
index 185a8b87b6b4548ee1868d7ce3515940e9f514fe..6af1ca55abce12bed2cbcf57d0ebb254222293c5 100644
--- a/briar-gtk/briar_gtk/controllers/private_chat.py
+++ b/briar-gtk/briar_gtk/presenters/private_chat.py
@@ -13,13 +13,13 @@ from briar_gtk.widgets.edit_dialog import EditDialog
 
 
 # pylint: disable=too-many-arguments
-class PrivateChatController:
+class PrivateChatPresenter:
     _current_contact_id = 0
 
-    def __init__(self, contact_id, private_chat_view, sidebar_controller,
+    def __init__(self, contact_id, private_chat_view, sidebar_presenter,
                  builder, api):
         self._private_chat_view = private_chat_view
-        self._sidebar_controller = sidebar_controller
+        self._sidebar_presenter = sidebar_presenter
         self._builder = builder
         self._api = api
         self.open_private_chat(contact_id)
@@ -67,7 +67,7 @@ class PrivateChatController:
             Contacts(APP().api).set_alias(self._current_contact_id, user_alias)
             contact_name_label = self._builder.get_object("contact_name")
             contact_name_label.set_text(user_alias)
-            self._sidebar_controller.refresh_contacts()
+            self._sidebar_presenter.refresh_contacts()
             # TODO: Update name in chat history
 
     def open_delete_all_messages_dialog(self):
@@ -128,14 +128,14 @@ class PrivateChatController:
         if response_id == Gtk.ResponseType.OK:
             private_chat = PrivateChat(APP().api, self._current_contact_id)
             private_chat.delete_all_messages()
-            self._sidebar_controller.refresh_contacts()
+            self._sidebar_presenter.refresh_contacts()
             self.close_private_chat()
         widget.destroy()
 
     def _delete_contact(self, widget, response_id):
         if response_id == Gtk.ResponseType.OK:
             Contacts(APP().api).delete(self._current_contact_id)
-            self._sidebar_controller.refresh_contacts()
+            self._sidebar_presenter.refresh_contacts()
             self.close_private_chat()
         widget.destroy()
 
@@ -195,4 +195,4 @@ class PrivateChatController:
         if len(widget.get_text()) == 0:
             return
         self._private_chat_view.send_message(widget)
-        self._sidebar_controller.refresh_contacts()
+        self._sidebar_presenter.refresh_contacts()
diff --git a/briar-gtk/briar_gtk/controllers/sidebar.py b/briar-gtk/briar_gtk/presenters/sidebar.py
similarity index 98%
rename from briar-gtk/briar_gtk/controllers/sidebar.py
rename to briar-gtk/briar_gtk/presenters/sidebar.py
index 98198bd2c56978752a898aa00dec161cb41c5716..dfbecf6b1cc7e1cfb4a44e4bb63f58b0739218f6 100644
--- a/briar-gtk/briar_gtk/controllers/sidebar.py
+++ b/briar-gtk/briar_gtk/presenters/sidebar.py
@@ -7,7 +7,7 @@ from gi.repository import GLib
 from briar_wrapper.models.contacts import Contacts
 
 
-class SidebarController:
+class SidebarPresenter:
 
     def __init__(self, sidebar_view, api):
         self._sidebar_view = sidebar_view
diff --git a/briar-gtk/briar_gtk/views/__init__.py b/briar-gtk/briar_gtk/views/__init__.py
index 687b2489a1368a08a3750bca87105062086dc95b..485f7986d98fba951c47481b0fdffcde81a3a373 100644
--- a/briar-gtk/briar_gtk/views/__init__.py
+++ b/briar-gtk/briar_gtk/views/__init__.py
@@ -2,5 +2,5 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 # License-Filename: LICENSE.md
 """
-Views displaying data in Briar GTK
+Views (of MVP pattern) displaying data in Briar GTK
 """
diff --git a/briar-gtk/briar_gtk/views/add_contact.py b/briar-gtk/briar_gtk/views/add_contact.py
index 76adb3a5f5e15d75af10de524768447f63e88251..5e6cfb4e33d47d8273740314feeb02ae847a628e 100644
--- a/briar-gtk/briar_gtk/views/add_contact.py
+++ b/briar-gtk/briar_gtk/views/add_contact.py
@@ -14,7 +14,7 @@ from briar_gtk.define import APP, RESOURCES_DIR
 
 class AddContactView(Gtk.Overlay):
 
-    # TODO: Move more logic into AddContactController
+    # TODO: Move more logic into AddContactPresenter
 
     ADD_CONTACT_UI = "add_contact.ui"
     STACK_NAME = "add_contact_flow_stack"
diff --git a/briar-gtk/briar_gtk/views/login.py b/briar-gtk/briar_gtk/views/login.py
index 06e3dc71dcd2edf60725b9c11aebe39760154c42..08127161d0810c13f0b5dd0831b30b43d9b614ff 100644
--- a/briar-gtk/briar_gtk/views/login.py
+++ b/briar-gtk/briar_gtk/views/login.py
@@ -13,7 +13,7 @@ from briar_gtk.define import APP, RESOURCES_DIR
 
 class LoginView(Gtk.Overlay):
 
-    # TODO: Move more logic into LoginController
+    # TODO: Move more logic into LoginPresenter
 
     LOGIN_UI = "login.ui"
     STACK_NAME = "login_flow_stack"
diff --git a/briar-gtk/briar_gtk/views/private_chat.py b/briar-gtk/briar_gtk/views/private_chat.py
index a3071ad3f61f8c1ca78b9f5039a8124a9dde421c..27ec4aed665864e79b5269dc8e7acd6d8b8c7062 100644
--- a/briar-gtk/briar_gtk/views/private_chat.py
+++ b/briar-gtk/briar_gtk/views/private_chat.py
@@ -18,7 +18,7 @@ from briar_gtk.widgets.private_message import PrivateMessageWidget
 # pylint: disable=too-many-instance-attributes
 class PrivateChatView(Gtk.Overlay):
 
-    # TODO: Move more logic into PrivateChatController
+    # TODO: Move more logic into PrivateChatPresenter
 
     CONTAINER_UI = "private_chat.ui"
 
diff --git a/briar-gtk/briar_gtk/views/registration.py b/briar-gtk/briar_gtk/views/registration.py
index 4ef9246011da9dfc7b55d07c2f82a2c3beba07c4..fc075da61f006ec2db23bdef25ab50e18be37233 100644
--- a/briar-gtk/briar_gtk/views/registration.py
+++ b/briar-gtk/briar_gtk/views/registration.py
@@ -13,7 +13,7 @@ from briar_gtk.define import APP, RESOURCES_DIR
 
 class RegistrationView(Gtk.Overlay):
 
-    # TODO: Move more logic into RegistrationController
+    # TODO: Move more logic into RegistrationPresenter
 
     REGISTRATION_UI = "registration.ui"
     STACK_NAME = "registration_flow_stack"
diff --git a/briar-gtk/briar_gtk/views/sidebar.py b/briar-gtk/briar_gtk/views/sidebar.py
index a3146a0b14f6419621f2053336c60c3f8192726e..710a7faed03b36d5ecca9e82a3a4fd5e749d5841 100644
--- a/briar-gtk/briar_gtk/views/sidebar.py
+++ b/briar-gtk/briar_gtk/views/sidebar.py
@@ -7,7 +7,7 @@ from briar_gtk.widgets.contact_row import ContactRowWidget
 
 class SidebarView:
 
-    # TODO: Move more logic into SidebarController
+    # TODO: Move more logic into SidebarPresenter
 
     def __init__(self, builder):
         self._builder = builder
diff --git a/briar-gtk/briar_gtk/window.py b/briar-gtk/briar_gtk/window.py
index 335824932d185de57590a5378308411155bd7822..cd4fa4ded5cb37a80842a24175bba859100fd43a 100644
--- a/briar-gtk/briar_gtk/window.py
+++ b/briar-gtk/briar_gtk/window.py
@@ -9,7 +9,7 @@ from gi.repository import Gio, Gtk
 
 from briar_gtk.actions.window import WindowActions
 from briar_gtk.views.add_contact import AddContactView
-from briar_gtk.controllers.main_window import MainWindowController
+from briar_gtk.presenters.main_window import MainWindowPresenter
 from briar_gtk.views.main_window import MainWindowView
 from briar_gtk.views.startup import StartupView
 from briar_gtk.define import APP, APPLICATION_ID, APPLICATION_NAME
@@ -22,7 +22,7 @@ class Window(Gtk.ApplicationWindow):
     DEFAULT_WINDOW_SIZE = (900, 600)
 
     def __init__(self):
-        self.main_window_controller = None
+        self.main_window_presenter = None
         self._initialize_gtk_application_window()
         WindowActions(self)
         self._setup_content()
@@ -34,8 +34,8 @@ class Window(Gtk.ApplicationWindow):
 
     def show_add_contact_view(self):
         self._current_view.destroy()
-        if self.main_window_controller is not None:
-            self.main_window_controller = None
+        if self.main_window_presenter is not None:
+            self.main_window_presenter = None
         self._setup_add_contact_view()
 
     # pylint: disable=arguments-differ,unused-argument
@@ -107,7 +107,7 @@ class Window(Gtk.ApplicationWindow):
     def _setup_main_window_view(self):
         builder = self._setup_builder()
         main_window_view = MainWindowView(builder, self)
-        self.main_window_controller = MainWindowController(
+        self.main_window_presenter = MainWindowPresenter(
             main_window_view, builder)
         self._setup_view(main_window_view)
         builder.get_object("chat_menu_button").hide()  # TODO: Make default