diff --git a/include/AvatarProvider.h b/include/AvatarProvider.h
index 0a37ffb90169067dc19d31194b687729fd93f669..a58ef0b7e6b7ecea65f25019efe2acb04a8d7c13 100644
--- a/include/AvatarProvider.h
+++ b/include/AvatarProvider.h
@@ -18,12 +18,11 @@
 #pragma once
 
 #include <QImage>
-#include <QObject>
 #include <QSharedPointer>
 #include <QUrl>
 
-#include "MatrixClient.h"
-#include "TimelineItem.h"
+class MatrixClient;
+class TimelineItem;
 
 class AvatarProvider : public QObject
 {
diff --git a/include/Cache.h b/include/Cache.h
index 69d880f5022c03df457bb95ec616f0e7cfd10fa5..c16654d0e7e68b1f5447b0c8a9d46b754219c512 100644
--- a/include/Cache.h
+++ b/include/Cache.h
@@ -20,7 +20,7 @@
 #include <QDir>
 #include <lmdb++.h>
 
-#include "RoomState.h"
+class RoomState;
 
 class Cache
 {
diff --git a/include/ChatPage.h b/include/ChatPage.h
index bac83ece39e9c499bbc7bc2e6fca64e0ea7b7401..d3790f785a94be620f941868038fe34688170bf3 100644
--- a/include/ChatPage.h
+++ b/include/ChatPage.h
@@ -17,23 +17,27 @@
 
 #pragma once
 
+#include <QHBoxLayout>
+#include <QMap>
 #include <QPixmap>
 #include <QTimer>
 #include <QWidget>
 
-#include "Cache.h"
-#include "MatrixClient.h"
-#include "QuickSwitcher.h"
-#include "RoomList.h"
-#include "RoomSettings.h"
-#include "RoomState.h"
-#include "SideBarActions.h"
-#include "Splitter.h"
-#include "TextInputWidget.h"
-#include "TimelineViewManager.h"
-#include "TopRoomBar.h"
-#include "TypingDisplay.h"
-#include "UserInfoWidget.h"
+class Cache;
+class MatrixClient;
+class OverlayModal;
+class QuickSwitcher;
+class RoomList;
+class RoomSettings;
+class RoomState;
+class SideBarActions;
+class Splitter;
+class SyncResponse;
+class TextInputWidget;
+class TimelineViewManager;
+class TopRoomBar;
+class TypingDisplay;
+class UserInfoWidget;
 
 constexpr int CONSENSUS_TIMEOUT    = 1000;
 constexpr int SHOW_CONTENT_TIMEOUT = 3000;
diff --git a/include/Deserializable.h b/include/Deserializable.h
index 0d0b2882d172b1508c362b577c061a7ef87f55a0..0b97ce298d657d3a3836a56ab1dadba8b8f6a722 100644
--- a/include/Deserializable.h
+++ b/include/Deserializable.h
@@ -21,7 +21,6 @@
 
 #include <QJsonDocument>
 #include <QJsonObject>
-#include <QJsonValue>
 
 class DeserializationException : public std::exception
 {
diff --git a/include/EmojiCategory.h b/include/EmojiCategory.h
index 154ad8f420d87dcb55424b6134c156ada222de5b..06099f3dcb2f47fe3694ee6803b6bce0f19e6b9e 100644
--- a/include/EmojiCategory.h
+++ b/include/EmojiCategory.h
@@ -17,15 +17,14 @@
 
 #pragma once
 
-#include <QHBoxLayout>
 #include <QLabel>
+#include <QLayout>
 #include <QListView>
 #include <QStandardItemModel>
-#include <QVBoxLayout>
-#include <QWidget>
 
 #include "EmojiItemDelegate.h"
-#include "EmojiProvider.h"
+
+class EmojiProvider;
 
 class EmojiCategory : public QWidget
 {
diff --git a/include/EmojiPanel.h b/include/EmojiPanel.h
index 360e7006b7fa140219a4a6c91d6f867df6f304ef..211d916ba51a53ba1585c815523b92851e75798c 100644
--- a/include/EmojiPanel.h
+++ b/include/EmojiPanel.h
@@ -20,11 +20,11 @@
 #include <QGraphicsOpacityEffect>
 #include <QPropertyAnimation>
 #include <QScrollArea>
-#include <QWidget>
 
-#include "EmojiCategory.h"
 #include "EmojiProvider.h"
 
+class EmojiCategory;
+
 class EmojiPanel : public QWidget
 {
         Q_OBJECT
diff --git a/include/EmojiPickButton.h b/include/EmojiPickButton.h
index d4226165e536768c9f312b2b24e90dcdc951d6f3..8ef9be9e7786cd8fff4b44778283d2c827c4429f 100644
--- a/include/EmojiPickButton.h
+++ b/include/EmojiPickButton.h
@@ -20,9 +20,10 @@
 #include <QEvent>
 #include <QWidget>
 
-#include "EmojiPanel.h"
 #include "FlatButton.h"
 
+class EmojiPanel;
+
 class EmojiPickButton : public FlatButton
 {
         Q_OBJECT
diff --git a/include/EmojiProvider.h b/include/EmojiProvider.h
index 3f91f2b358859d137d09aac62df092c8e6d1cddb..847157fd3d4f2fe6f8a56335d1d4fb6ee93789a5 100644
--- a/include/EmojiProvider.h
+++ b/include/EmojiProvider.h
@@ -17,9 +17,7 @@
 
 #pragma once
 
-#include <QFile>
 #include <QList>
-#include <QMap>
 
 struct Emoji
 {
diff --git a/include/ImageItem.h b/include/ImageItem.h
index 20e0772dc624968bd3b4399131da03298949cfb6..c4f6998abf4592ecc35d8f7079a2f9673bdf4560 100644
--- a/include/ImageItem.h
+++ b/include/ImageItem.h
@@ -24,6 +24,7 @@
 
 #include "Image.h"
 #include "MatrixClient.h"
+#include "MessageEvent.h"
 
 namespace events = matrix::events;
 namespace msgs   = matrix::events::messages;
diff --git a/include/InputValidator.h b/include/InputValidator.h
index 4f77033e84bee7241e797e4fc14007663b47e2ce..da1c121e6dbc8535157512dad90ca0bd9d739e87 100644
--- a/include/InputValidator.h
+++ b/include/InputValidator.h
@@ -17,7 +17,6 @@
 
 #pragma once
 
-#include <QRegExp>
 #include <QRegExpValidator>
 
 class InputValidator
diff --git a/include/JoinRoomDialog.h b/include/JoinRoomDialog.h
index 6c3fbdcf57c6cd8d53708dadb583ab6a7e63c83f..84184733d0d532e7a2a15031948f6788b027d414 100644
--- a/include/JoinRoomDialog.h
+++ b/include/JoinRoomDialog.h
@@ -3,7 +3,7 @@
 #include <QFrame>
 #include <QLineEdit>
 
-#include "FlatButton.h"
+class FlatButton;
 
 class JoinRoomDialog : public QFrame
 {
diff --git a/include/LeaveRoomDialog.h b/include/LeaveRoomDialog.h
index 1639a578a7181409a14491e830545e458a2b108a..231556dcff3c359b4f698b88ba09b165c398ae91 100644
--- a/include/LeaveRoomDialog.h
+++ b/include/LeaveRoomDialog.h
@@ -2,7 +2,7 @@
 
 #include <QFrame>
 
-#include "FlatButton.h"
+class FlatButton;
 
 class LeaveRoomDialog : public QFrame
 {
diff --git a/include/LoginPage.h b/include/LoginPage.h
index 88cffaf304afdafc6b918126e88c7b9dbd1aae85..d5f46f76dcc8e341969614cd88cc7c654d74285b 100644
--- a/include/LoginPage.h
+++ b/include/LoginPage.h
@@ -17,18 +17,17 @@
 
 #pragma once
 
-#include <QHBoxLayout>
 #include <QLabel>
+#include <QLayout>
 #include <QSharedPointer>
-#include <QVBoxLayout>
 #include <QWidget>
 
-#include "FlatButton.h"
-#include "LoadingIndicator.h"
-#include "MatrixClient.h"
-#include "OverlayModal.h"
-#include "RaisedButton.h"
-#include "TextField.h"
+class FlatButton;
+class LoadingIndicator;
+class MatrixClient;
+class OverlayModal;
+class RaisedButton;
+class TextField;
 
 class LoginPage : public QWidget
 {
diff --git a/include/LogoutDialog.h b/include/LogoutDialog.h
index 44dab17aef236bb85cd3a7e90d4e62ac399ef789..e081986eeaafd7aa259c76087dad7443f1da997f 100644
--- a/include/LogoutDialog.h
+++ b/include/LogoutDialog.h
@@ -19,7 +19,7 @@
 
 #include <QFrame>
 
-#include "FlatButton.h"
+class FlatButton;
 
 class LogoutDialog : public QFrame
 {
diff --git a/include/MainWindow.h b/include/MainWindow.h
index 95935c462606e415285db119c147ae60b885ae55..f56592c29fcbf914d64d13114596cb020ecf7bf8 100644
--- a/include/MainWindow.h
+++ b/include/MainWindow.h
@@ -19,16 +19,18 @@
 
 #include <QMainWindow>
 #include <QSharedPointer>
-
-#include "ChatPage.h"
-#include "LoadingIndicator.h"
-#include "LoginPage.h"
-#include "MatrixClient.h"
-#include "OverlayModal.h"
-#include "RegisterPage.h"
-#include "SnackBar.h"
-#include "TrayIcon.h"
-#include "WelcomePage.h"
+#include <QStackedWidget>
+#include <QSystemTrayIcon>
+
+class ChatPage;
+class LoadingIndicator;
+class LoginPage;
+class MatrixClient;
+class OverlayModal;
+class RegisterPage;
+class SnackBar;
+class TrayIcon;
+class WelcomePage;
 
 class MainWindow : public QMainWindow
 {
diff --git a/include/MatrixClient.h b/include/MatrixClient.h
index 7a415e826f8b41d7ed96167f88be9bd09c9d6fcb..2e45e397d8385052306509ee5d795c9b8d05ae1a 100644
--- a/include/MatrixClient.h
+++ b/include/MatrixClient.h
@@ -17,12 +17,13 @@
 
 #pragma once
 
-#include <QtNetwork/QNetworkAccessManager>
+#include <QNetworkAccessManager>
 
 #include "MessageEvent.h"
-#include "Profile.h"
-#include "RoomMessages.h"
-#include "Sync.h"
+
+class SyncResponse;
+class Profile;
+class RoomMessages;
 
 /*
  * MatrixClient provides the high level API to communicate with
diff --git a/include/Profile.h b/include/Profile.h
index e2868e62dbb314456c841432688608b97070e0d5..d640db022aea381b9afc5858f24148f34e79927f 100644
--- a/include/Profile.h
+++ b/include/Profile.h
@@ -20,7 +20,7 @@
 #include <QJsonDocument>
 #include <QUrl>
 
-#include "Deserializable.h"
+class Deserializable;
 
 class ProfileResponse : public Deserializable
 {
diff --git a/include/Register.h b/include/Register.h
index 83f538b9feacfee196a834e5bc7cdc5f9f321d66..fc4a49e6c5e0766021cb228ccaced62053ea6c89 100644
--- a/include/Register.h
+++ b/include/Register.h
@@ -19,7 +19,7 @@
 
 #include <QJsonDocument>
 
-#include "Deserializable.h"
+class Deserializable;
 
 class RegisterRequest
 {
diff --git a/include/RegisterPage.h b/include/RegisterPage.h
index a42cbedd1f9df9a4303aadadb9c6dcd673369b62..e0a3b6d8f3db78370d19f755d38b26c7cbf3224c 100644
--- a/include/RegisterPage.h
+++ b/include/RegisterPage.h
@@ -17,17 +17,15 @@
 
 #pragma once
 
-#include <QHBoxLayout>
 #include <QLabel>
+#include <QLayout>
 #include <QSharedPointer>
-#include <QVBoxLayout>
-#include <QWidget>
 
-#include "Avatar.h"
-#include "FlatButton.h"
-#include "MatrixClient.h"
-#include "RaisedButton.h"
-#include "TextField.h"
+class Avatar;
+class FlatButton;
+class MatrixClient;
+class RaisedButton;
+class TextField;
 
 class RegisterPage : public QWidget
 {
diff --git a/include/RoomInfoListItem.h b/include/RoomInfoListItem.h
index 8975af795d210bc28bf7f03b162f10e0076d26c5..a137b37f26952f31c30e17a5dcbbf431a63e541e 100644
--- a/include/RoomInfoListItem.h
+++ b/include/RoomInfoListItem.h
@@ -21,11 +21,12 @@
 #include <QSharedPointer>
 #include <QWidget>
 
-#include "Menu.h"
-#include "RippleOverlay.h"
-#include "RoomSettings.h"
 #include "RoomState.h"
 
+class Menu;
+class RippleOverlay;
+class RoomSettings;
+
 struct DescInfo
 {
         QString username;
diff --git a/include/RoomList.h b/include/RoomList.h
index d7b201f19fc9091e7527e9e2e9b403c9a5c07b76..df668ac6cfa087e822365b871170c770afd26056 100644
--- a/include/RoomList.h
+++ b/include/RoomList.h
@@ -17,19 +17,22 @@
 
 #pragma once
 
+#include <QMap>
 #include <QPushButton>
 #include <QScrollArea>
 #include <QSharedPointer>
 #include <QVBoxLayout>
 #include <QWidget>
 
-#include "JoinRoomDialog.h"
-#include "LeaveRoomDialog.h"
-#include "MatrixClient.h"
-#include "OverlayModal.h"
-#include "RoomInfoListItem.h"
-#include "RoomState.h"
-#include "Sync.h"
+class JoinRoomDialog;
+class LeaveRoomDialog;
+class MatrixClient;
+class OverlayModal;
+class RoomInfoListItem;
+class RoomSettings;
+class RoomState;
+class Sync;
+struct DescInfo;
 
 class RoomList : public QWidget
 {
diff --git a/include/SideBarActions.h b/include/SideBarActions.h
index 60975a0370370d98cfa8ef95b54397f0650d56eb..7b55057869b45bda730833449757df2793b88822 100644
--- a/include/SideBarActions.h
+++ b/include/SideBarActions.h
@@ -1,7 +1,10 @@
+#pragma once
+
 #include <QHBoxLayout>
 #include <QResizeEvent>
+#include <QWidget>
 
-#include <FlatButton.h>
+#include "FlatButton.h"
 
 class SideBarActions : public QWidget
 {
diff --git a/include/Sync.h b/include/Sync.h
index ae61015e071fdb1ef058fc064e43c28af8c16bbc..d59a57dc53c1078b61cf23880664c7ea19aa4081 100644
--- a/include/Sync.h
+++ b/include/Sync.h
@@ -18,9 +18,7 @@
 #pragma once
 
 #include <QJsonArray>
-#include <QJsonDocument>
 #include <QMap>
-#include <QString>
 
 #include "Deserializable.h"
 
diff --git a/include/TimelineItem.h b/include/TimelineItem.h
index ef021cfe92f2c09e733eb34cc2c28af1b54d2830..1adf574c5562f40812f9e3504af3b9a3bd5b9a9f 100644
--- a/include/TimelineItem.h
+++ b/include/TimelineItem.h
@@ -19,12 +19,7 @@
 
 #include <QHBoxLayout>
 #include <QLabel>
-#include <QWidget>
 
-#include "ImageItem.h"
-#include "Sync.h"
-
-#include "Avatar.h"
 #include "Emote.h"
 #include "Image.h"
 #include "MessageEvent.h"
@@ -32,6 +27,9 @@
 #include "RoomInfoListItem.h"
 #include "Text.h"
 
+class ImageItem;
+class Avatar;
+
 namespace events = matrix::events;
 namespace msgs   = matrix::events::messages;
 
diff --git a/include/TimelineView.h b/include/TimelineView.h
index 8324794824df13f1889ee716ca9ae886c1b53f71..7e44db46fded6353fbc134fb41cfb284519dc215 100644
--- a/include/TimelineView.h
+++ b/include/TimelineView.h
@@ -17,24 +17,23 @@
 
 #pragma once
 
-#include <QHBoxLayout>
+#include <QLayout>
 #include <QList>
 #include <QScrollArea>
-#include <QVBoxLayout>
-#include <QWidget>
-
-#include "ScrollBar.h"
-#include "Sync.h"
-#include "TimelineItem.h"
 
 #include "Emote.h"
 #include "Image.h"
 #include "MessageEvent.h"
 #include "Notice.h"
-#include "RoomInfoListItem.h"
 #include "Text.h"
 
 class FloatingButton;
+class MatrixClient;
+class RoomMessages;
+class ScrollBar;
+class Timeline;
+class TimelineItem;
+struct DescInfo;
 
 namespace msgs   = matrix::events::messages;
 namespace events = matrix::events;
diff --git a/include/TimelineViewManager.h b/include/TimelineViewManager.h
index 91fda99619ab09ccd63481743f68186c11b57e65..8ff49f20405ae7c2244086f4ac449d025c181751 100644
--- a/include/TimelineViewManager.h
+++ b/include/TimelineViewManager.h
@@ -17,16 +17,16 @@
 
 #pragma once
 
-#include <QDebug>
+#include <QMap>
 #include <QSharedPointer>
 #include <QStackedWidget>
-#include <QWidget>
 
-#include "MatrixClient.h"
-#include "MessageEvent.h"
-#include "RoomInfoListItem.h"
-#include "Sync.h"
-#include "TimelineView.h"
+class JoinedRoom;
+class MatrixClient;
+class RoomInfoListItem;
+class Rooms;
+class TimelineView;
+struct DescInfo;
 
 class TimelineViewManager : public QStackedWidget
 {
diff --git a/include/TopRoomBar.h b/include/TopRoomBar.h
index eb941b3ba535d74c289e0e6cd6bcfd6a726ea4db..f1e93d9d29a1456324de15e7dd8e48bc2bdf121f 100644
--- a/include/TopRoomBar.h
+++ b/include/TopRoomBar.h
@@ -18,22 +18,21 @@
 #pragma once
 
 #include <QAction>
-#include <QDebug>
 #include <QIcon>
 #include <QImage>
 #include <QLabel>
+#include <QMenu>
 #include <QPaintEvent>
 #include <QSharedPointer>
 #include <QVBoxLayout>
-#include <QWidget>
-
-#include "Avatar.h"
-#include "FlatButton.h"
-#include "Label.h"
-#include "LeaveRoomDialog.h"
-#include "Menu.h"
-#include "OverlayModal.h"
-#include "RoomSettings.h"
+
+class Avatar;
+class FlatButton;
+class Label;
+class LeaveRoomDialog;
+class Menu;
+class OverlayModal;
+class RoomSettings;
 
 static const QString URL_HTML = "<a href=\"\\1\" style=\"color: #333333\">\\1</a>";
 static const QRegExp URL_REGEX("((?:https?|ftp)://\\S+)");
diff --git a/include/TrayIcon.h b/include/TrayIcon.h
index 6073ea695a08484dadb55e2f67041f0cc665968a..a3536cc33ad9236a09e5bbd1cd5dd3612d7b31f3 100644
--- a/include/TrayIcon.h
+++ b/include/TrayIcon.h
@@ -20,7 +20,6 @@
 #include <QAction>
 #include <QIcon>
 #include <QIconEngine>
-#include <QMenu>
 #include <QPainter>
 #include <QRect>
 #include <QSystemTrayIcon>
diff --git a/include/UserInfoWidget.h b/include/UserInfoWidget.h
index b2c7b87662551cba8bdd03f4d71fb5d06dcf549b..111f580817edbbe0f55d1e2aa2f5c77847805e08 100644
--- a/include/UserInfoWidget.h
+++ b/include/UserInfoWidget.h
@@ -17,15 +17,13 @@
 
 #pragma once
 
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QWidget>
-
-#include "Avatar.h"
-#include "FlatButton.h"
-#include "LogoutDialog.h"
-#include "OverlayModal.h"
+#include <QLabel>
+#include <QLayout>
+
+class Avatar;
+class FlatButton;
+class LogoutDialog;
+class OverlayModal;
 
 class UserInfoWidget : public QWidget
 {
diff --git a/include/Versions.h b/include/Versions.h
index 31d8af82819363713e7f4569841d3af14bbabd51..a603e3914fa40c223f406e34cc12f4b2f2fab950 100644
--- a/include/Versions.h
+++ b/include/Versions.h
@@ -20,7 +20,7 @@
 #include <QJsonDocument>
 #include <QVector>
 
-#include "Deserializable.h"
+class Deserializable;
 
 class VersionsResponse : public Deserializable
 {
diff --git a/include/WelcomePage.h b/include/WelcomePage.h
index 7cd83fd166871d2a57f37d4ad38a1db1a8772776..73b612a84c3342a0641666da500d8d28d5aeba50 100644
--- a/include/WelcomePage.h
+++ b/include/WelcomePage.h
@@ -17,7 +17,9 @@
 
 #pragma once
 
-#include "RaisedButton.h"
+#include <QWidget>
+
+class RaisedButton;
 
 class WelcomePage : public QWidget
 {
diff --git a/include/ui/FlatButton.h b/include/ui/FlatButton.h
index 816563e39a8a5b7f78ffd7e2e4ecfa2c9d8a3143..9c2bf4257f49b018ae5c1911da2d2f27393b26b3 100644
--- a/include/ui/FlatButton.h
+++ b/include/ui/FlatButton.h
@@ -5,9 +5,9 @@
 #include <QPushButton>
 #include <QStateMachine>
 
-#include "RippleOverlay.h"
 #include "Theme.h"
 
+class RippleOverlay;
 class FlatButton;
 
 class FlatButtonStateMachine : public QStateMachine
diff --git a/src/AvatarProvider.cc b/src/AvatarProvider.cc
index c4e5d19e6b19474c98edf287cb6a525b63bb6a10..ab938cb153ca6664eb5058f4062622003df7153e 100644
--- a/src/AvatarProvider.cc
+++ b/src/AvatarProvider.cc
@@ -16,6 +16,8 @@
  */
 
 #include "AvatarProvider.h"
+#include "MatrixClient.h"
+#include "TimelineItem.h"
 
 QSharedPointer<MatrixClient> AvatarProvider::client_;
 
diff --git a/src/Cache.cc b/src/Cache.cc
index befb3a0a05c956b46e230a17f9f2479b051222e7..de2c79442213bdbe73b8321bf5d1a7e71f438122 100644
--- a/src/Cache.cc
+++ b/src/Cache.cc
@@ -18,12 +18,12 @@
 #include <stdexcept>
 
 #include <QDebug>
-#include <QDir>
 #include <QFile>
 #include <QStandardPaths>
 
 #include "Cache.h"
 #include "MemberEventContent.h"
+#include "RoomState.h"
 
 namespace events = matrix::events;
 
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index d087c3f3a2fb6dec8b33abea56219855bf20270b..150f60071a62f32ba68646103b106c2bdd7a9e23 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -21,16 +21,26 @@
 #include <QtConcurrent>
 
 #include "AvatarProvider.h"
+#include "Cache.h"
 #include "ChatPage.h"
 #include "MainWindow.h"
+#include "MatrixClient.h"
+#include "OverlayModal.h"
+#include "QuickSwitcher.h"
+#include "RoomList.h"
+#include "RoomSettings.h"
+#include "RoomState.h"
+#include "SideBarActions.h"
 #include "Splitter.h"
+#include "StateEvent.h"
 #include "Sync.h"
+#include "TextInputWidget.h"
 #include "Theme.h"
 #include "TimelineViewManager.h"
+#include "TopRoomBar.h"
+#include "TypingDisplay.h"
 #include "UserInfoWidget.h"
 
-#include "StateEvent.h"
-
 constexpr int MAX_INITIAL_SYNC_FAILURES = 5;
 constexpr int SYNC_RETRY_TIMEOUT        = 10000;
 
diff --git a/src/Deserializable.cc b/src/Deserializable.cc
index 6033f898fef0b4a31c20623a841c2f61eaef746c..8bdbfc2c8e51daf87208daf3654bc763ddd394c5 100644
--- a/src/Deserializable.cc
+++ b/src/Deserializable.cc
@@ -15,10 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonValue>
-
 #include "Deserializable.h"
 
 DeserializationException::DeserializationException(const std::string &msg)
diff --git a/src/EmojiCategory.cc b/src/EmojiCategory.cc
index ea32ea9c28b162e4f422472746a9c85d7998023e..8546b8078c1045b68de058976da40fdee77b6b9e 100644
--- a/src/EmojiCategory.cc
+++ b/src/EmojiCategory.cc
@@ -15,7 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
 #include <QScrollBar>
 
 #include "Config.h"
diff --git a/src/EmojiPanel.cc b/src/EmojiPanel.cc
index 16299ace79071030268c94f300a3c3baeec189fe..71e2526c2bf7d926a533d01d7297cad38a0f38d7 100644
--- a/src/EmojiPanel.cc
+++ b/src/EmojiPanel.cc
@@ -16,11 +16,9 @@
  */
 
 #include <QPushButton>
-#include <QScrollArea>
 #include <QScrollBar>
 #include <QVBoxLayout>
 
-#include "Avatar.h"
 #include "DropShadow.h"
 #include "EmojiCategory.h"
 #include "EmojiPanel.h"
diff --git a/src/EmojiPickButton.cc b/src/EmojiPickButton.cc
index 06d97d4ceae362570b817e0c47c0e4eea415ae2d..17716f6fb4fc67310742da6c3acef34dbdf136e4 100644
--- a/src/EmojiPickButton.cc
+++ b/src/EmojiPickButton.cc
@@ -15,8 +15,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
-
+#include "EmojiPanel.h"
 #include "EmojiPickButton.h"
 
 EmojiPickButton::EmojiPickButton(QWidget *parent)
diff --git a/src/EmojiProvider.cc b/src/EmojiProvider.cc
index 11cdffcbe38902ee53a2e724ff86e30623ebc1d0..ed380ae0875a2f9a4328f9c7cbfec64b03f12d73 100644
--- a/src/EmojiProvider.cc
+++ b/src/EmojiProvider.cc
@@ -16,11 +16,6 @@
  */
 
 #include <QByteArray>
-#include <QDebug>
-#include <QFile>
-#include <QJsonArray>
-#include <QJsonDocument>
-#include <QJsonObject>
 
 #include "EmojiProvider.h"
 
diff --git a/src/ImageItem.cc b/src/ImageItem.cc
index 5e95f8b251d5202a2f923594af1f91d6a98f13d3..39fa630fd87cd1c38313e21408f49a1384358b03 100644
--- a/src/ImageItem.cc
+++ b/src/ImageItem.cc
@@ -19,7 +19,6 @@
 #include <QDebug>
 #include <QDesktopServices>
 #include <QFileInfo>
-#include <QImage>
 #include <QPainter>
 #include <QPixmap>
 
diff --git a/src/ImageOverlayDialog.cc b/src/ImageOverlayDialog.cc
index 56b5707cc864a8705301a340e0ed05f664c56c37..8d6db45e65770d361f6993bd5cc9341eea8fcf8f 100644
--- a/src/ImageOverlayDialog.cc
+++ b/src/ImageOverlayDialog.cc
@@ -16,11 +16,8 @@
  */
 
 #include <QApplication>
-#include <QDebug>
 #include <QDesktopWidget>
 #include <QPainter>
-#include <QScreen>
-#include <QTimer>
 
 #include "ImageOverlayDialog.h"
 
diff --git a/src/JoinRoomDialog.cc b/src/JoinRoomDialog.cc
index c3ee289e4e61096e9b8c8f427bfe54f40d2ac7d9..d071876a1af1095ce9e2d6d07cccd77292f23195 100644
--- a/src/JoinRoomDialog.cc
+++ b/src/JoinRoomDialog.cc
@@ -2,6 +2,7 @@
 #include <QVBoxLayout>
 
 #include "Config.h"
+#include "FlatButton.h"
 #include "JoinRoomDialog.h"
 #include "Theme.h"
 
diff --git a/src/LeaveRoomDialog.cc b/src/LeaveRoomDialog.cc
index f7669f0d67f74016f5f93c328156979b2ffb3c96..cd4a32606e41e56d4fa4ac9412e2652879be811f 100644
--- a/src/LeaveRoomDialog.cc
+++ b/src/LeaveRoomDialog.cc
@@ -2,6 +2,7 @@
 #include <QVBoxLayout>
 
 #include "Config.h"
+#include "FlatButton.h"
 #include "LeaveRoomDialog.h"
 #include "Theme.h"
 
diff --git a/src/Login.cc b/src/Login.cc
index 16c6f17283a6dc901d8e7bcc8073c723f4f036ce..69338f2ce33938f26ec225491443675f58b8dbe0 100644
--- a/src/Login.cc
+++ b/src/Login.cc
@@ -15,10 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonValue>
-
 #include "Deserializable.h"
 #include "Login.h"
 
diff --git a/src/LoginPage.cc b/src/LoginPage.cc
index bbe2a13465732d1fdfa8cf5c95bbb5c2d2a4e021..c1ba352cd3518188953e398aa4bc55a0da33937b 100644
--- a/src/LoginPage.cc
+++ b/src/LoginPage.cc
@@ -15,11 +15,15 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
-
 #include "Config.h"
+#include "FlatButton.h"
 #include "InputValidator.h"
+#include "LoadingIndicator.h"
 #include "LoginPage.h"
+#include "MatrixClient.h"
+#include "OverlayModal.h"
+#include "RaisedButton.h"
+#include "TextField.h"
 
 LoginPage::LoginPage(QSharedPointer<MatrixClient> client, QWidget *parent)
   : QWidget(parent)
diff --git a/src/LogoutDialog.cc b/src/LogoutDialog.cc
index 768efcd362ab0c3e16fc17ac599cb3011073f409..7f2cdbd3d07a6dbcf8e254f6a1fc5e3e2bdfee93 100644
--- a/src/LogoutDialog.cc
+++ b/src/LogoutDialog.cc
@@ -19,6 +19,7 @@
 #include <QVBoxLayout>
 
 #include "Config.h"
+#include "FlatButton.h"
 #include "LogoutDialog.h"
 #include "Theme.h"
 
diff --git a/src/MainWindow.cc b/src/MainWindow.cc
index b6033eafa3cf17dae631bb9fe67f6850e742fc70..92388ae46baa0dfa258cff2d6805270a2d7b1117 100644
--- a/src/MainWindow.cc
+++ b/src/MainWindow.cc
@@ -15,15 +15,23 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "MainWindow.h"
-#include "Config.h"
-
 #include <QApplication>
 #include <QLayout>
 #include <QNetworkReply>
 #include <QSettings>
 #include <QShortcut>
-#include <QSystemTrayIcon>
+
+#include "ChatPage.h"
+#include "Config.h"
+#include "LoadingIndicator.h"
+#include "LoginPage.h"
+#include "MainWindow.h"
+#include "MatrixClient.h"
+#include "OverlayModal.h"
+#include "RegisterPage.h"
+#include "SnackBar.h"
+#include "TrayIcon.h"
+#include "WelcomePage.h"
 
 MainWindow *MainWindow::instance_ = nullptr;
 
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index afd99995bc997010ee357acf307f63a9af3c4e52..b1854dd86140fdf8b99c1122aaa497087f5233bf 100644
--- a/src/MatrixClient.cc
+++ b/src/MatrixClient.cc
@@ -30,8 +30,11 @@
 
 #include "Login.h"
 #include "MatrixClient.h"
+#include "MessageEvent.h"
 #include "Profile.h"
 #include "Register.h"
+#include "RoomMessages.h"
+#include "Sync.h"
 #include "Versions.h"
 
 MatrixClient::MatrixClient(QString server, QObject *parent)
diff --git a/src/Profile.cc b/src/Profile.cc
index dcd9c7a186785bca27066246f35002189efb235c..38795e4912d01d13e0ade1990f39e9a0c759f469 100644
--- a/src/Profile.cc
+++ b/src/Profile.cc
@@ -15,10 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QJsonObject>
-#include <QJsonValue>
-#include <QUrl>
-
 #include "Deserializable.h"
 #include "Profile.h"
 
diff --git a/src/QuickSwitcher.cc b/src/QuickSwitcher.cc
index 5b459eaf700170b3c09ad5a62c0cb6411a38e7ee..542eebd92b2beb78ead037e8210bb938cc5ff19f 100644
--- a/src/QuickSwitcher.cc
+++ b/src/QuickSwitcher.cc
@@ -16,7 +16,6 @@
  */
 
 #include <QCompleter>
-#include <QDebug>
 #include <QStringListModel>
 #include <QTimer>
 
diff --git a/src/Register.cc b/src/Register.cc
index db3ce4f95d57a637180e399c36e6f5e43e3d6d2c..0fe2ddceac62eb7033a3cfe15a118949c5d5849f 100644
--- a/src/Register.cc
+++ b/src/Register.cc
@@ -15,10 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonValue>
-
 #include "Deserializable.h"
 #include "Register.h"
 
diff --git a/src/RegisterPage.cc b/src/RegisterPage.cc
index bcd02be023e45072e7281d66dda45c68e555c31d..d8186f65cfcff6edf4164af2da0b57596694a31d 100644
--- a/src/RegisterPage.cc
+++ b/src/RegisterPage.cc
@@ -15,12 +15,14 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
-#include <QToolTip>
-
+#include "Avatar.h"
 #include "Config.h"
+#include "FlatButton.h"
 #include "InputValidator.h"
+#include "MatrixClient.h"
+#include "RaisedButton.h"
 #include "RegisterPage.h"
+#include "TextField.h"
 
 RegisterPage::RegisterPage(QSharedPointer<MatrixClient> client, QWidget *parent)
   : QWidget(parent)
diff --git a/src/RoomInfoListItem.cc b/src/RoomInfoListItem.cc
index 588ee5c8d02e8adba85a9c67a5632fce366a8bfb..857189b5ae49782161149c2554512b5681d77711 100644
--- a/src/RoomInfoListItem.cc
+++ b/src/RoomInfoListItem.cc
@@ -15,14 +15,15 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
 #include <QMouseEvent>
 #include <QPainter>
 
 #include "Config.h"
+#include "Menu.h"
 #include "Ripple.h"
+#include "RippleOverlay.h"
 #include "RoomInfoListItem.h"
-#include "RoomState.h"
+#include "RoomSettings.h"
 #include "Theme.h"
 
 RoomInfoListItem::RoomInfoListItem(QSharedPointer<RoomSettings> settings,
diff --git a/src/RoomList.cc b/src/RoomList.cc
index 90d8b83c268a104a22629c574c06f3e93717bfe7..73e85ea8e4cc76779ad05d0037c855830e55c3d8 100644
--- a/src/RoomList.cc
+++ b/src/RoomList.cc
@@ -16,12 +16,16 @@
  */
 
 #include <QDebug>
-#include <QJsonArray>
-#include <QRegularExpression>
 
+#include "JoinRoomDialog.h"
+#include "LeaveRoomDialog.h"
 #include "MainWindow.h"
+#include "MatrixClient.h"
+#include "OverlayModal.h"
 #include "RoomInfoListItem.h"
 #include "RoomList.h"
+#include "RoomSettings.h"
+#include "RoomState.h"
 #include "Sync.h"
 
 RoomList::RoomList(QSharedPointer<MatrixClient> client, QWidget *parent)
diff --git a/src/RoomState.cc b/src/RoomState.cc
index de0ed6ea4501fbd94a516d6bc62cc759ad217b5d..8db9b2bc836e639fc14c78c35920c6ea256b4a6a 100644
--- a/src/RoomState.cc
+++ b/src/RoomState.cc
@@ -15,7 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
 #include <QJsonArray>
 #include <QSettings>
 
diff --git a/src/SideBarActions.cc b/src/SideBarActions.cc
index d4874c6acb4b2ad196c16767e546005d5c03865d..1484bd001b01ab9636104994b3106dd40f23f08a 100644
--- a/src/SideBarActions.cc
+++ b/src/SideBarActions.cc
@@ -1,9 +1,8 @@
-#include <QDebug>
 #include <QIcon>
 
 #include "Config.h"
+#include "SideBarActions.h"
 #include "Theme.h"
-#include <SideBarActions.h>
 
 SideBarActions::SideBarActions(QWidget *parent)
   : QWidget{ parent }
diff --git a/src/Sync.cc b/src/Sync.cc
index 39d84acb6227256535fec7009b8eeacfdb0e9b97..965f7c3df68e8d18c7569f02da1ad9e0c0239f8d 100644
--- a/src/Sync.cc
+++ b/src/Sync.cc
@@ -16,12 +16,7 @@
  */
 
 #include <QDebug>
-#include <QJsonArray>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonValue>
 
-#include "Deserializable.h"
 #include "Sync.h"
 
 void
diff --git a/src/TimelineItem.cc b/src/TimelineItem.cc
index 28cabc12b0d8408fab8055a702765debdfb41bf2..ba9e54bd1ae2e3d3471d364fd3b339fded3cb587 100644
--- a/src/TimelineItem.cc
+++ b/src/TimelineItem.cc
@@ -16,14 +16,16 @@
  */
 
 #include <QDateTime>
-#include <QDebug>
 #include <QFontDatabase>
 #include <QRegExp>
+#include <QSettings>
 #include <QTextEdit>
 
+#include "Avatar.h"
 #include "AvatarProvider.h"
 #include "Config.h"
 #include "ImageItem.h"
+#include "Sync.h"
 #include "TimelineItem.h"
 #include "TimelineViewManager.h"
 
diff --git a/src/TimelineView.cc b/src/TimelineView.cc
index 132090627108e7fcc2d084c6d9ab17066def431e..ee98fe724a4b7d6b9f649d6a5eaade0c54856d19 100644
--- a/src/TimelineView.cc
+++ b/src/TimelineView.cc
@@ -17,21 +17,16 @@
 
 #include <QApplication>
 #include <QDebug>
-#include <QJsonArray>
-#include <QScrollBar>
 #include <QSettings>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QSpacerItem>
-
-#include "Event.h"
-#include "MessageEvent.h"
-#include "MessageEventContent.h"
+#include <QTimer>
 
 #include "FloatingButton.h"
 #include "ImageItem.h"
+#include "RoomMessages.h"
+#include "ScrollBar.h"
+#include "Sync.h"
 #include "TimelineItem.h"
 #include "TimelineView.h"
-#include "TimelineViewManager.h"
 
 namespace events = matrix::events;
 namespace msgs   = matrix::events::messages;
diff --git a/src/TimelineViewManager.cc b/src/TimelineViewManager.cc
index 9f8137fc4a841a52f21280da4ab8ab660efb6788..44b626edb1d079fe8ada310d4a65f3caa78f2c7d 100644
--- a/src/TimelineViewManager.cc
+++ b/src/TimelineViewManager.cc
@@ -21,9 +21,9 @@
 #include <QDebug>
 #include <QFileInfo>
 #include <QSettings>
-#include <QStackedWidget>
-#include <QWidget>
 
+#include "MatrixClient.h"
+#include "Sync.h"
 #include "TimelineView.h"
 #include "TimelineViewManager.h"
 
diff --git a/src/TopRoomBar.cc b/src/TopRoomBar.cc
index 72aef92a643160be0284f674047840649a1a1955..0361bd476a945a732832be0fc0885956191a8cb3 100644
--- a/src/TopRoomBar.cc
+++ b/src/TopRoomBar.cc
@@ -17,8 +17,15 @@
 
 #include <QStyleOption>
 
+#include "Avatar.h"
 #include "Config.h"
+#include "FlatButton.h"
+#include "Label.h"
+#include "LeaveRoomDialog.h"
 #include "MainWindow.h"
+#include "Menu.h"
+#include "OverlayModal.h"
+#include "RoomSettings.h"
 #include "TopRoomBar.h"
 
 TopRoomBar::TopRoomBar(QWidget *parent)
diff --git a/src/TrayIcon.cc b/src/TrayIcon.cc
index 1360cc4e7eda2f6a82ffa9f8b0a73f6d031abb51..ad644ed9eff377231e34ba17dbd00a9bc434811a 100644
--- a/src/TrayIcon.cc
+++ b/src/TrayIcon.cc
@@ -17,6 +17,7 @@
 
 #include <QApplication>
 #include <QList>
+#include <QMenu>
 #include <QTimer>
 
 #include "TrayIcon.h"
diff --git a/src/TypingDisplay.cc b/src/TypingDisplay.cc
index 7792d3e49b4abebeaf7a98930a4e8aec8bcabbfd..e3eb9db9265e8a39f48d0f7d1766f218bdb037ee 100644
--- a/src/TypingDisplay.cc
+++ b/src/TypingDisplay.cc
@@ -1,4 +1,3 @@
-#include <QDebug>
 #include <QPainter>
 #include <QPoint>
 
diff --git a/src/UserInfoWidget.cc b/src/UserInfoWidget.cc
index 04cfec7495f5666d7ccc98bdd52d5c3d0b1aa925..1fadc8e7047aa1af881ed5985948d6c85c88abdc 100644
--- a/src/UserInfoWidget.cc
+++ b/src/UserInfoWidget.cc
@@ -15,12 +15,14 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
 #include <QTimer>
 
+#include "Avatar.h"
 #include "Config.h"
 #include "FlatButton.h"
+#include "LogoutDialog.h"
 #include "MainWindow.h"
+#include "OverlayModal.h"
 #include "UserInfoWidget.h"
 
 UserInfoWidget::UserInfoWidget(QWidget *parent)
diff --git a/src/Versions.cc b/src/Versions.cc
index 8d0e2e9c05a89d24d5471bf1f9a242ee9adc50de..9de1aafef1528319cd113448c75772ff77af9c1f 100644
--- a/src/Versions.cc
+++ b/src/Versions.cc
@@ -16,9 +16,6 @@
  */
 
 #include <QJsonArray>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonValue>
 #include <QRegExp>
 
 #include "Deserializable.h"
diff --git a/src/WelcomePage.cc b/src/WelcomePage.cc
index 1fc0c19b76bc88b36fd5827cc51f2931f0e0934b..f361ca053d70125cce59ca4aed357f4a5d0e18f4 100644
--- a/src/WelcomePage.cc
+++ b/src/WelcomePage.cc
@@ -19,6 +19,7 @@
 #include <QLayout>
 
 #include "Config.h"
+#include "RaisedButton.h"
 #include "WelcomePage.h"
 
 WelcomePage::WelcomePage(QWidget *parent)
diff --git a/src/main.cc b/src/main.cc
index fa89cc603825af35e2e38d6ba9836ade15eab36b..2d0597880d35474718621e90b83bc8de0a2e8297 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -19,6 +19,7 @@
 #include <QDesktopWidget>
 #include <QFontDatabase>
 #include <QLibraryInfo>
+#include <QSettings>
 #include <QTranslator>
 
 #include "MainWindow.h"
diff --git a/src/ui/Avatar.cc b/src/ui/Avatar.cc
index c2ee629b8657eee84c91c58a4d18110825a348e3..e3987e7a9ee27602180cadb909fe9d94a73a0af0 100644
--- a/src/ui/Avatar.cc
+++ b/src/ui/Avatar.cc
@@ -1,6 +1,4 @@
-#include <QIcon>
 #include <QPainter>
-#include <QWidget>
 
 #include "Avatar.h"
 
diff --git a/src/ui/LoadingIndicator.cc b/src/ui/LoadingIndicator.cc
index 0fafaf23133360801d213639d696462bef936991..71312d32c253b0769aebff6ac5b2eefc2dfc6476 100644
--- a/src/ui/LoadingIndicator.cc
+++ b/src/ui/LoadingIndicator.cc
@@ -1,6 +1,5 @@
 #include "LoadingIndicator.h"
 
-#include <QDebug>
 #include <QPoint>
 #include <QtGlobal>
 
diff --git a/src/ui/OverlayModal.cc b/src/ui/OverlayModal.cc
index 1da009d416d87d65dd95f87841242a082d7945a5..05bd7d03c048b639d4741ae5315b92c7309e3ea6 100644
--- a/src/ui/OverlayModal.cc
+++ b/src/ui/OverlayModal.cc
@@ -15,7 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QDebug>
 #include <QPainter>
 #include <QVBoxLayout>