diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8d44386e45f13d424f935a8505899ccb862c6131..ead1c32bfb3e4bc5c1c0a230ead2486c2163a8dd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,8 +18,8 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "compile as PIC by default")
 option(HUNTER_ENABLED "Enable Hunter package manager" OFF)
 include("cmake/HunterGate.cmake")
 HunterGate(
-    URL "https://github.com/cpp-pm/hunter/archive/v0.23.260.tar.gz"
-    SHA1 "13775235910a3fa85644568d1c5be8271de72e1c"
+    URL "https://github.com/cpp-pm/hunter/archive/v0.23.288.tar.gz"
+    SHA1 "6c9b2bc606d86ae31f96a62fc68f0a593024815b"
 )
 
 option(USE_BUNDLED_BOOST "Use the bundled version of Boost." ${HUNTER_ENABLED})
@@ -579,6 +579,7 @@ endif()
 
 if(WIN32)
 	add_executable (nheko WIN32 ${OS_BUNDLE} ${NHEKO_DEPS})
+	target_compile_definitions(nheko PRIVATE _WIN32_WINNT=0x0601)
 else()
 	add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS})
 endif()
diff --git a/CMakeSettings.json b/CMakeSettings.json
index cd32e37805a9f67dc63e0bb2572875a861012a7e..310be64847b2d5d3d01b0bc12bf6ffbfc92b7f73 100644
--- a/CMakeSettings.json
+++ b/CMakeSettings.json
@@ -1,46 +1,66 @@
-{
-  "configurations": [
-    {
-      "name": "Debug",
-      "generator": "Visual Studio 15 2017 Win64",
-      "configurationType": "Debug",
-      "buildRoot": "${workspaceRoot}\\build-vc\\${name}",
-      "cmakeCommandArgs": "",
-      "variables": [
-        {
-          "name": "CMAKE_TOOLCHAIN_FILE",
-          "value": "${workspaceRoot}\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake" // <-- change vcpkg location here
-        },
-        {
-          "name": "CMAKE_INSTALL_PREFIX",
-          "value": "${workspaceRoot}/.deps"
-        },
-        {
-          "name": "Qt5_DIR",
-          "value": "C:\\Qt\\5.11.1\\msvc2017_64\\lib\\cmake\\Qt5" // <-- change qt location here
-        }
-      ]
-    },
-    {
-      "name": "Release",
-      "generator": "Visual Studio 15 2017 Win64",
-      "configurationType": "Release",
-      "buildRoot": "${workspaceRoot}\\build-vc\\${name}",
-      "cmakeCommandArgs": "",
-      "variables": [
-        {
-          "name": "CMAKE_TOOLCHAIN_FILE",
-          "value": "${workspaceRoot}\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake" // <-- change vcpkg location here
-        },
-        {
-          "name": "CMAKE_INSTALL_PREFIX",
-          "value": "${workspaceRoot}/.deps"
-        },
-        {
-          "name": "Qt5_DIR",
-          "value": "C:\\Qt\\5.11.1\\msvc2017_64\\lib\\cmake\\Qt5" // <-- change qt location here
-        }
-      ]
-    },
- ]
-}
+{
+  "configurations": [
+    {
+      "name": "Debug",
+      "generator": "Visual Studio 16 2019 Win64",
+      "configurationType": "Debug",
+      "buildRoot": "${workspaceRoot}\\build-vc\\${name}",
+      "cmakeCommandArgs": "",
+      "variables": [
+        {
+          "name": "HUNTER_ENABLED",
+          "value": "OFF",
+          "type": "BOOL"
+        },
+        {
+          "name": "BUILD_SHARED_LIBS",
+          "value": "ON",
+          "type": "BOOL"
+        },
+        {
+          "name": "CMAKE_INSTALL_PREFIX",
+          "value": "${workspaceRoot}/.deps",
+          "type": "STRING"
+        },
+        {
+          "name": "Qt5_DIR",
+          "value": "C:\\Qt\\5.12.5\\msvc2017_64\\lib\\cmake\\Qt5", // <-- change qt location here
+          "type": "STRING"
+        }
+      ],
+      "cmakeToolchain": "${workspaceRoot}\\toolchain.cmake",
+      "inheritEnvironments": [ "msvc_x64" ]
+    },
+    {
+      "name": "Release",
+      "generator": "Visual Studio 16 2019 Win64",
+      "configurationType": "Release",
+      "buildRoot": "${workspaceRoot}\\build-vc\\${name}",
+      "cmakeCommandArgs": "",
+      "variables": [
+        {
+          "name": "HUNTER_ENABLED",
+          "value": "ON",
+          "type": "BOOL"
+        },
+        {
+          "name": "BUILD_SHARED_LIBS",
+          "value": "OFF",
+          "type": "BOOL"
+        },
+        {
+          "name": "CMAKE_INSTALL_PREFIX",
+          "value": "${workspaceRoot}/.deps",
+          "type": "STRING"
+        },
+        {
+          "name": "Qt5_DIR",
+          "value": "C:\\Qt\\5.12.5\\msvc2017_64\\lib\\cmake\\Qt5", // <-- change qt location here
+          "type": "STRING"
+        }
+      ],
+      "cmakeToolchain": "${workspaceRoot}\\toolchain.cmake",
+      "inheritEnvironments": [ "msvc_x64" ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
index 16fea8d7e59e49b967dd68f6fd98f7f07fce2e62..6f50bf4a6f7af8a365df0344c10b9b26259a32d3 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -3,7 +3,7 @@
 version: 0.7.2-{build}
 
 configuration: Release
-image: Visual Studio 2017
+image: Visual Studio 2019
 platform: x64
 
 environment:
@@ -22,9 +22,9 @@ build:
     verbosity: minimal
 
 install:
-    - set QT_DIR=C:\Qt\5.13\msvc2017_64
-    - set PATH=%PATH%;%QT_DIR%\bin
-    - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
+    - set QT_DIR=C:\Qt\5.15\msvc2019_64
+    - set PATH=C:\Strawberry\perl\bin;%PATH%;%QT_DIR%\bin
+    - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
 
 build_script:
     # VERSION format:     branch-master/branch-1.2
@@ -46,8 +46,8 @@ build_script:
     - echo %DATE%
 
     # Build nheko
-    #- cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
-    - cmake -G "Visual Studio 15 2017 Win64" -H. -Bbuild
+    #- cmake -G "Visual Studio 15 2017 Win64" -H. -Bbuild
+    - cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
       -DHUNTER_ROOT="C:\hunter"
       -DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF
       -DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
diff --git a/src/AvatarProvider.cpp b/src/AvatarProvider.cpp
index b1751c33d1a05a636283a988bbc1b85aad9ef512..4c3969bed4e5f0e56112b93b03b11712a80aa98e 100644
--- a/src/AvatarProvider.cpp
+++ b/src/AvatarProvider.cpp
@@ -81,7 +81,7 @@ resolve(const QString &avatarUrl, int size, QObject *receiver, AvatarCallback ca
                           cache::saveImage(cacheKey.toStdString(), res);
                   }
 
-                  emit proxy->avatarDownloaded(QByteArray(res.data(), res.size()));
+                  emit proxy->avatarDownloaded(QByteArray(res.data(), (int)res.size()));
           });
 }
 
diff --git a/src/BlurhashProvider.cpp b/src/BlurhashProvider.cpp
index 08dc2d4079ea72902221bb07f3adce2544be384f..acaef400eba1444b2f6219a5f8ab1a16d59967cf 100644
--- a/src/BlurhashProvider.cpp
+++ b/src/BlurhashProvider.cpp
@@ -31,7 +31,8 @@ BlurhashResponse::run()
                 return;
         }
 
-        QImage image(decoded.image.data(), decoded.width, decoded.height, QImage::Format_RGB32);
+        QImage image(
+          decoded.image.data(), (int)decoded.width, (int)decoded.height, QImage::Format_RGB32);
 
         m_image = image.copy();
         emit finished();
diff --git a/src/Cache.cpp b/src/Cache.cpp
index 8ea44e1309e5d765ed45ca6f519e27d749b0e574..5d11a1783730a0b14c0b6686108f9c2ba52e6aa5 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -685,7 +685,7 @@ Cache::image(lmdb::txn &txn, const std::string &url) const
                 if (!res)
                         return QByteArray();
 
-                return QByteArray(image.data(), image.size());
+                return QByteArray(image.data(), (int)image.size());
         } catch (const lmdb::error &e) {
                 nhlog::db()->critical("image: {}, {}", e.what(), url);
         }
@@ -713,7 +713,7 @@ Cache::image(const QString &url) const
                 if (!res)
                         return QByteArray();
 
-                return QByteArray(image.data(), image.size());
+                return QByteArray(image.data(), (int)image.size());
         } catch (const lmdb::error &e) {
                 nhlog::db()->critical("image: {} {}", e.what(), url.toStdString());
         }
@@ -1267,9 +1267,10 @@ Cache::saveState(const mtx::responses::Sync &res)
                                                 updatedInfo.tags = tmp.tags;
                                         } catch (const json::exception &e) {
                                                 nhlog::db()->warn(
-                                                  "failed to parse room info: room_id ({}), {}",
+                                                  "failed to parse room info: room_id ({}), {}: {}",
                                                   room.first,
-                                                  std::string(data.data(), data.size()));
+                                                  std::string(data.data(), data.size()),
+                                                  e.what());
                                         }
                                 }
                         }
@@ -1468,9 +1469,10 @@ Cache::singleRoomInfo(const std::string &room_id)
 
                         return tmp;
                 } catch (const json::exception &e) {
-                        nhlog::db()->warn("failed to parse room info: room_id ({}), {}",
+                        nhlog::db()->warn("failed to parse room info: room_id ({}), {}: {}",
                                           room_id,
-                                          std::string(data.data(), data.size()));
+                                          std::string(data.data(), data.size()),
+                                          e.what());
                 }
         }
 
@@ -1502,9 +1504,10 @@ Cache::getRoomInfo(const std::vector<std::string> &rooms)
 
                                 room_info.emplace(QString::fromStdString(room), std::move(tmp));
                         } catch (const json::exception &e) {
-                                nhlog::db()->warn("failed to parse room info: room_id ({}), {}",
+                                nhlog::db()->warn("failed to parse room info: room_id ({}), {}: {}",
                                                   room,
-                                                  std::string(data.data(), data.size()));
+                                                  std::string(data.data(), data.size()),
+                                                  e.what());
                         }
                 } else {
                         // Check if the room is an invite.
@@ -1517,10 +1520,11 @@ Cache::getRoomInfo(const std::vector<std::string> &rooms)
                                         room_info.emplace(QString::fromStdString(room),
                                                           std::move(tmp));
                                 } catch (const json::exception &e) {
-                                        nhlog::db()->warn(
-                                          "failed to parse room info for invite: room_id ({}), {}",
-                                          room,
-                                          std::string(data.data(), data.size()));
+                                        nhlog::db()->warn("failed to parse room info for invite: "
+                                                          "room_id ({}), {}: {}",
+                                                          room,
+                                                          std::string(data.data(), data.size()),
+                                                          e.what());
                                 }
                         }
                 }
@@ -2053,8 +2057,8 @@ Cache::getRoomName(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb)
                 }
         }
 
-        auto cursor     = lmdb::cursor::open(txn, membersdb);
-        const int total = membersdb.size(txn);
+        auto cursor      = lmdb::cursor::open(txn, membersdb);
+        const auto total = membersdb.size(txn);
 
         std::size_t ii = 0;
         std::string user_id;
@@ -2337,7 +2341,7 @@ Cache::getRoomAvatar(const std::string &room_id)
 
         txn.commit();
 
-        return QImage::fromData(QByteArray(response.data(), response.size()));
+        return QImage::fromData(QByteArray(response.data(), (int)response.size()));
 }
 
 std::vector<std::string>
diff --git a/src/CacheStructs.h b/src/CacheStructs.h
index b3d9acf1f5876ba17b90626ec05a8605905f91f9..10f8cc540814b13f19c0d74aa355edadcf7b76f2 100644
--- a/src/CacheStructs.h
+++ b/src/CacheStructs.h
@@ -61,7 +61,7 @@ struct RoomInfo
         //! Whether or not the room is an invite.
         bool is_invite = false;
         //! Total number of members in the room.
-        int16_t member_count = 0;
+        size_t member_count = 0;
         //! Who can access to the room.
         mtx::events::state::JoinRule join_rule = mtx::events::state::JoinRule::Public;
         bool guest_access                      = false;
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index e3325c05c2eb406b4f1de53b61d94d1afaa78cec..37248022de4769f3ba50414fda38e9050d87e189 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -439,7 +439,7 @@ ChatPage::bootstrap(QString userid, QString homeserver, QString token)
 
         try {
                 http::client()->set_user(parse<User>(userid.toStdString()));
-        } catch (const std::invalid_argument &e) {
+        } catch (const std::invalid_argument &) {
                 nhlog::ui()->critical("bootstrapped with invalid user_id: {}",
                                       userid.toStdString());
         }
diff --git a/src/CommunitiesList.cpp b/src/CommunitiesList.cpp
index 9af2ea9b515f4c3b13ceab269e944756b84cf6cf..f3af9932e552f132e35c2dcb2e9e76e2e4efd49c 100644
--- a/src/CommunitiesList.cpp
+++ b/src/CommunitiesList.cpp
@@ -104,7 +104,8 @@ CommunitiesList::setTagsForRoom(const QString &room_id, const std::vector<std::s
                 }
                 // insert or remove the room from the tag as appropriate
                 std::string current_tag =
-                  it->first.right(it->first.size() - strlen("tag:")).toStdString();
+                  it->first.right(static_cast<int>(it->first.size() - strlen("tag:")))
+                    .toStdString();
                 if (std::find(tags.begin(), tags.end(), current_tag) != tags.end()) {
                         // the room has this tag
                         it->second->addRoom(room_id);
@@ -246,7 +247,7 @@ CommunitiesList::fetchCommunityAvatar(const QString &id, const QString &avatarUr
 
                   cache::saveImage(opts.mxc_url, res);
 
-                  auto data = QByteArray(res.data(), res.size());
+                  auto data = QByteArray(res.data(), (int)res.size());
 
                   QPixmap pix;
                   pix.loadFromData(data);
diff --git a/src/CommunitiesListItem.cpp b/src/CommunitiesListItem.cpp
index c56c74a2e4f9c75c1a1e71dee8393bd02b458fd4..dca91441a8486700b5dd02ef8178ea8202ae6a4b 100644
--- a/src/CommunitiesListItem.cpp
+++ b/src/CommunitiesListItem.cpp
@@ -117,7 +117,7 @@ CommunitiesListItem::resolveName() const
         if (!name_.isEmpty())
                 return name_;
         if (groupId_.startsWith("tag:"))
-                return groupId_.right(groupId_.size() - strlen("tag:"));
+                return groupId_.right(static_cast<int>(groupId_.size() - strlen("tag:")));
         if (!groupId_.startsWith("+"))
                 return QString("Group"); // Group with no name or id.
 
@@ -132,7 +132,7 @@ CommunitiesListItem::updateTooltip()
         if (groupId_ == "world")
                 setToolTip(tr("All rooms"));
         else if (is_tag()) {
-                QString tag = groupId_.right(groupId_.size() - strlen("tag:"));
+                QString tag = groupId_.right(static_cast<int>(groupId_.size() - strlen("tag:")));
                 if (tag == "m.favourite")
                         setToolTip(tr("Favourite rooms"));
                 else if (tag == "m.lowpriority")
diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp
index 8076d6d6d9c61ea6a32e17239bbaf7a8f6c0bb12..05741ccaa1ea02e9333d8a0249e61909ab395ae9 100644
--- a/src/LoginPage.cpp
+++ b/src/LoginPage.cpp
@@ -225,7 +225,7 @@ LoginPage::onMatrixIdEntered()
 
         try {
                 user = parse<User>(matrixid_input_->text().toStdString());
-        } catch (const std::exception &e) {
+        } catch (const std::exception &) {
                 showError(error_matrixid_label_,
                           "You have entered an invalid Matrix ID  e.g @joe:matrix.org");
                 return;
@@ -389,7 +389,7 @@ LoginPage::onLoginButtonClicked()
 
         try {
                 user = parse<User>(matrixid_input_->text().toStdString());
-        } catch (const std::exception &e) {
+        } catch (const std::exception &) {
                 showError(error_matrixid_label_,
                           "You have entered an invalid Matrix ID  e.g @joe:matrix.org");
                 return;
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index ffd0e30b77d279632091aff78567cd6a41c2c01d..bc7b5223a119c169c86a5744ca2d5b86310d56f0 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -164,7 +164,7 @@ MainWindow::MainWindow(QWidget *parent)
                 try {
                         using namespace mtx::identifiers;
                         http::client()->set_user(parse<User>(user_id.toStdString()));
-                } catch (const std::invalid_argument &e) {
+                } catch (const std::invalid_argument &) {
                         nhlog::ui()->critical("bootstrapped with invalid user_id: {}",
                                               user_id.toStdString());
                 }
@@ -473,7 +473,7 @@ MainWindow::openReadReceiptsDialog(const QString &event_id)
 
         try {
                 dialog->addUsers(cache::readReceipts(event_id, room_id));
-        } catch (const lmdb::error &e) {
+        } catch (const lmdb::error &) {
                 nhlog::db()->warn("failed to retrieve read receipts for {} {}",
                                   event_id.toStdString(),
                                   chat_page_->currentRoom().toStdString());
diff --git a/src/MxcImageProvider.cpp b/src/MxcImageProvider.cpp
index d656427794e07bd65116d8e82131910f42b62aa4..b48fe01133775e620675feecea248a19132ae399 100644
--- a/src/MxcImageProvider.cpp
+++ b/src/MxcImageProvider.cpp
@@ -48,7 +48,7 @@ MxcImageResponse::run()
                                   return;
                           }
 
-                          auto data = QByteArray(res.data(), res.size());
+                          auto data = QByteArray(res.data(), (int)res.size());
                           cache::saveImage(fileName, data);
                           m_image = utils::readImage(&data);
                           if (!m_image.isNull()) {
@@ -92,7 +92,7 @@ MxcImageResponse::run()
                                   temp = mtx::crypto::to_string(
                                     mtx::crypto::decrypt_file(temp, m_encryptionInfo.value()));
 
-                          auto data = QByteArray(temp.data(), temp.size());
+                          auto data = QByteArray(temp.data(), (int)temp.size());
                           cache::saveImage(m_id, data);
                           m_image = utils::readImage(&data);
                           m_image.setText("original filename",
diff --git a/src/UsersModel.h b/src/UsersModel.h
index c60b34b8a214a901b1ca0468f1cc01ec7a058463..cd9b780cbff049f74d3e5a24f75618d393295f32 100644
--- a/src/UsersModel.h
+++ b/src/UsersModel.h
@@ -17,7 +17,7 @@ public:
         int rowCount(const QModelIndex &parent = QModelIndex()) const override
         {
                 (void)parent;
-                return roomMembers_.size();
+                return (int)roomMembers_.size();
         }
         QVariant data(const QModelIndex &index, int role) const override;
 
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 1d8fcd9cb83270aa25b125f2a214133df74871ee..3bb090df0e46f4752149caf2e809e9169cc22668 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -244,20 +244,20 @@ utils::humanReadableFileSize(uint64_t bytes)
 int
 utils::levenshtein_distance(const std::string &s1, const std::string &s2)
 {
-        const int nlen = s1.size();
-        const int hlen = s2.size();
+        const auto nlen = s1.size();
+        const auto hlen = s2.size();
 
         if (hlen == 0)
                 return -1;
         if (nlen == 1)
-                return s2.find(s1);
+                return (int)s2.find(s1);
 
         std::vector<int> row1(hlen + 1, 0);
 
-        for (int i = 0; i < nlen; ++i) {
-                std::vector<int> row2(1, i + 1);
+        for (size_t i = 0; i < nlen; ++i) {
+                std::vector<int> row2(1, (int)i + 1);
 
-                for (int j = 0; j < hlen; ++j) {
+                for (size_t j = 0; j < hlen; ++j) {
                         const int cost = s1[i] != s2[j];
                         row2.push_back(
                           std::min(row1[j + 1] + 1, std::min(row2[j] + 1, row1[j] + cost)));
@@ -381,15 +381,16 @@ utils::escapeBlacklistedHtml(const QString &rawStr)
           "caption",    "/caption",    "pre",    "/pre",    "span",  "/span",  "img",    "/img"};
         QByteArray data = rawStr.toUtf8();
         QByteArray buffer;
-        const size_t length = data.size();
+        const int length = data.size();
         buffer.reserve(length);
         bool escapingTag = false;
-        for (size_t pos = 0; pos != length; ++pos) {
+        for (int pos = 0; pos != length; ++pos) {
                 switch (data.at(pos)) {
                 case '<': {
                         bool oneTagMatched = false;
-                        size_t endPos      = std::min(static_cast<size_t>(data.indexOf('>', pos)),
-                                                 static_cast<size_t>(data.indexOf(' ', pos)));
+                        const int endPos =
+                          static_cast<int>(std::min(static_cast<size_t>(data.indexOf('>', pos)),
+                                                    static_cast<size_t>(data.indexOf(' ', pos))));
 
                         auto mid = data.mid(pos + 1, endPos - pos - 1);
                         for (const auto &tag : allowedTags) {
@@ -543,7 +544,7 @@ utils::generateContrastingHexColor(const QString &input, const QString &backgrou
         // Create a color for the input
         auto hash = hashQString(input);
         // create a hue value based on the hash of the input.
-        auto userHue = static_cast<int>(qAbs(hash % 360));
+        auto userHue = static_cast<int>(hash % 360);
         // start with moderate saturation and lightness values.
         auto sat       = 220;
         auto lightness = 125;
diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp
index e6c9c58c7441851f662b42472e69fce6956cc5ef..bd3cc26f87973d0e31339a6fd6b993b26b519a96 100644
--- a/src/dialogs/RoomSettings.cpp
+++ b/src/dialogs/RoomSettings.cpp
@@ -493,7 +493,7 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent)
         roomNameLabel_ = new QLabel(QString::fromStdString(info_.name), this);
         roomNameLabel_->setFont(largeFont);
 
-        auto membersLabel = new QLabel(tr("%n member(s)", "", info_.member_count), this);
+        auto membersLabel = new QLabel(tr("%n member(s)", "", (int)info_.member_count), this);
 
         auto textLayout = new QVBoxLayout;
         textLayout->addWidget(roomNameLabel_);
diff --git a/src/popups/SuggestionsPopup.cpp b/src/popups/SuggestionsPopup.cpp
index 2650b5e68664a5094ef09477e572f5d2a5f94aad..8add43130b9ed3b693c57fcb0dae586f971a9141 100644
--- a/src/popups/SuggestionsPopup.cpp
+++ b/src/popups/SuggestionsPopup.cpp
@@ -35,14 +35,14 @@ SuggestionsPopup::addRooms(const std::vector<RoomSearchResult> &rooms)
                 return;
         }
 
-        const size_t layoutCount = layout_->count();
-        const size_t roomCount   = rooms.size();
+        const int layoutCount = (int)layout_->count();
+        const int roomCount   = (int)rooms.size();
 
         // Remove the extra widgets from the layout.
         if (roomCount < layoutCount)
                 removeLayoutItemsAfter(roomCount - 1);
 
-        for (size_t i = 0; i < roomCount; ++i) {
+        for (int i = 0; i < roomCount; ++i) {
                 auto item = layout_->itemAt(i);
 
                 // Create a new widget if there isn't already one in that
@@ -62,7 +62,7 @@ SuggestionsPopup::addRooms(const std::vector<RoomSearchResult> &rooms)
         resetSelection();
         adjustSize();
 
-        resize(geometry().width(), 40 * rooms.size());
+        resize(geometry().width(), 40 * (int)rooms.size());
 
         selectNextSuggestion();
 }
@@ -150,7 +150,8 @@ SuggestionsPopup::removeLayoutItemsAfter(size_t startingPos)
         size_t posToRemove = layout_->count() - 1;
 
         QLayoutItem *item;
-        while (startingPos <= posToRemove && (item = layout_->takeAt(posToRemove)) != nullptr) {
+        while (startingPos <= posToRemove &&
+               (item = layout_->takeAt((int)posToRemove)) != nullptr) {
                 delete item->widget();
                 delete item;
 
diff --git a/src/timeline/EventStore.h b/src/timeline/EventStore.h
index 2d5fb1be964b5e50b76f77e54ec7532969095137..c6b397424897baafa91eed1cc597f33ffd6505b5 100644
--- a/src/timeline/EventStore.h
+++ b/src/timeline/EventStore.h
@@ -29,7 +29,8 @@ public:
                 friend uint qHash(const Index &i, uint seed = 0) noexcept
                 {
                         QtPrivate::QHashCombine hash;
-                        seed = hash(seed, QByteArray::fromRawData(i.room.data(), i.room.size()));
+                        seed =
+                          hash(seed, QByteArray::fromRawData(i.room.data(), (int)i.room.size()));
                         seed = hash(seed, i.idx);
                         return seed;
                 }
@@ -46,8 +47,9 @@ public:
                 friend uint qHash(const IdIndex &i, uint seed = 0) noexcept
                 {
                         QtPrivate::QHashCombine hash;
-                        seed = hash(seed, QByteArray::fromRawData(i.room.data(), i.room.size()));
-                        seed = hash(seed, QByteArray::fromRawData(i.id.data(), i.id.size()));
+                        seed =
+                          hash(seed, QByteArray::fromRawData(i.room.data(), (int)i.room.size()));
+                        seed = hash(seed, QByteArray::fromRawData(i.id.data(), (int)i.id.size()));
                         return seed;
                 }
 
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 11fa60c07787c2c8429106d3a5d9441b8f84fccc..adef886d2a459a6bb44fdc8a90cd0e8bf56908f1 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -28,7 +28,7 @@ namespace std {
 inline uint
 qHash(const std::string &key, uint seed = 0)
 {
-        return qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
+        return qHash(QByteArray::fromRawData(key.data(), (int)key.length()), seed);
 }
 }
 
@@ -1208,7 +1208,7 @@ TimelineModel::cacheMedia(QString eventId)
                           if (!file.open(QIODevice::WriteOnly))
                                   return;
 
-                          file.write(QByteArray(temp.data(), temp.size()));
+                          file.write(QByteArray(temp.data(), (int)temp.size()));
                           file.close();
                   } catch (const std::exception &e) {
                           nhlog::ui()->warn("Error while saving file to: {}", e.what());
@@ -1227,7 +1227,7 @@ TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
              "multiple users. Second argument is the last user of that list. (If only one user is "
              "typing, %1 is empty. You should still use it in your string though to silence Qt "
              "warnings.)",
-             users.size());
+             (int)users.size());
 
         if (users.empty()) {
                 return "";