diff --git a/include/MatrixClient.h b/include/MatrixClient.h
index df21ccdbd3719a21fda58a7ecbc3be33a12f7a92..66b30dcefd80113213ab79ee51cfea65d617d03f 100644
--- a/include/MatrixClient.h
+++ b/include/MatrixClient.h
@@ -159,4 +159,7 @@ private:
 
         // Token to be used for the next sync.
         QString next_batch_;
+
+	// filter to be send as filter-param for (initial) /sync requests
+	QString filter_;
 };
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index 607fc1aedb11fa97cdb5dbb6a5d7e2c2cc873756..05832c24bf696d8e8020f5bdc47dbe6dcaebaa5d 100644
--- a/src/MatrixClient.cc
+++ b/src/MatrixClient.cc
@@ -41,6 +41,32 @@ MatrixClient::MatrixClient(QString server, QObject *parent)
         QSettings settings;
         txn_id_ = settings.value("client/transaction_id", 1).toInt();
 
+        QJsonObject default_filter{
+          {"room",
+           QJsonObject{
+             {"include_leave", true},
+             {"account_data",
+               QJsonObject{
+                 {"not_types", QJsonArray{"*"}},
+               },
+             },
+           },
+          },{"account_data",
+            QJsonObject{
+              {"not_types", QJsonArray{"*"}},
+            },
+          },{"presence",
+            QJsonObject{
+              {"not_types", QJsonArray{"*"}},
+            },
+          },
+        };
+
+	filter_ = settings.value(
+            "client/sync_filter",
+            QJsonDocument(default_filter).toJson(QJsonDocument::Compact)
+        ).toString();
+
         connect(this,
                 &QNetworkAccessManager::networkAccessibleChanged,
                 this,
@@ -194,17 +220,10 @@ MatrixClient::registerUser(const QString &user, const QString &pass, const QStri
 void
 MatrixClient::sync() noexcept
 {
-        QJsonObject filter{
-          {"room",
-           QJsonObject{
-             {"include_leave", true},
-           }},
-        };
-
         QUrlQuery query;
         query.addQueryItem("set_presence", "online");
-        query.addQueryItem("filter", QJsonDocument(filter).toJson(QJsonDocument::Compact));
-        query.addQueryItem("timeout", "15000");
+        query.addQueryItem("filter", filter_);
+        query.addQueryItem("timeout", "30000");
         query.addQueryItem("access_token", token_);
 
         if (next_batch_.isEmpty()) {
@@ -334,6 +353,7 @@ MatrixClient::initialSync() noexcept
 {
         QUrlQuery query;
         query.addQueryItem("timeout", "0");
+        query.addQueryItem("filter", filter_);
         query.addQueryItem("access_token", token_);
 
         QUrl endpoint(server_);