diff --git a/app/src/main/assets/networks.json b/app/src/main/assets/networks.json
index 43fb35140fa7c6c4790daf99a63035504318ab62..eaf2bbdec04f57b22c7fcb9f34a6280372189d27 100644
--- a/app/src/main/assets/networks.json
+++ b/app/src/main/assets/networks.json
@@ -298,21 +298,16 @@
     ]
   },
   {
-    "name": "Freenode",
+    "name": "Libera.Chat",
     "default": true,
     "defaultChannels": [
       "#quassel"
     ],
     "servers": [
       {
-        "host": "chat.freenode.net",
+        "host": "irc.libera.chat",
         "port": 6697,
         "secure": true
-      },
-      {
-        "host": "chat.freenode.net",
-        "port": 6667,
-        "secure": false
       }
     ]
   },
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt
index ddf6aea96b109aaaad88169e6941f02db5c4fdb3..0176e398f7bd79b5cbb9e7e62c5137d798cae99f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt
@@ -27,7 +27,8 @@ data class AppearanceSettings(
   val showLag: Boolean = true,
   val theme: Theme = Theme.MATERIAL_LIGHT,
   val language: String = "",
-  val keepScreenOn: Boolean = false
+  val keepScreenOn: Boolean = false,
+  val deceptiveNetworks: Boolean = true
 ) {
   enum class InputEnterMode {
     EMOJI,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
index 20cb304301d60754ab217c836db18e586124cc50..102cf64c3ac221a3fb09334f31648384a435a726 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
@@ -51,7 +51,11 @@ object Settings {
       language = getString(
         context.getString(R.string.preference_language_key),
         AppearanceSettings.DEFAULT.language
-      ) ?: ""
+      ) ?: "",
+      deceptiveNetworks = getBoolean(
+        context.getString(R.string.preference_deceptive_networks_key),
+        AppearanceSettings.DEFAULT.deceptiveNetworks
+      )
     )
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 5f8b613bc547160f93f95358d3679c9599190a61..e8c9bb369f2792c0c6913b3744a96c1cc241eb43 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -769,7 +769,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       if (modelHelper.connectionProgress.value?.first == ConnectionState.CONNECTED
         && modelHelper.deceptiveNetwork.value == true) {
         DeceptiveNetworkDialog.Builder(this)
-          .message(R.raw.untrustworthy_network_freenode)
+          .message(R.string.deceptive_network_freenode)
           .show()
       } else {
         modelHelper.sessionManager.value?.orNull()?.apply {
@@ -789,6 +789,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
           ConnectionState.CLOSED     -> {
             binding.layoutMain.layoutToolbar.progressBar.visibility = View.INVISIBLE
 
+            binding.layoutMain.connectionStatus.icon.setImageResource(R.drawable.ic_disconnected)
             binding.layoutMain.connectionStatus.setMode(WarningBarView.MODE_ICON)
             binding.layoutMain.connectionStatus.setText(getString(R.string.label_status_disconnected))
           }
@@ -818,8 +819,9 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
           }
           ConnectionState.CONNECTED  -> {
             binding.layoutMain.layoutToolbar.progressBar.visibility = View.INVISIBLE
-            if (deceptive) {
+            if (deceptive && appearanceSettings.deceptiveNetworks) {
               binding.layoutMain.connectionStatus.setMode(WarningBarView.MODE_ICON)
+              binding.layoutMain.connectionStatus.icon.setImageResource(R.drawable.ic_alert)
               binding.layoutMain.connectionStatus.setText(R.string.deceptive_network)
             } else {
               binding.layoutMain.connectionStatus.setMode(WarningBarView.MODE_NONE)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/deceptive_networks/DeceptiveNetworkDialog.kt b/app/src/main/java/de/kuschku/quasseldroid/util/deceptive_networks/DeceptiveNetworkDialog.kt
index 2acf8d935c686f369a04f345d062628f3afcc0b5..beed44af54037744f6946bf13846d0286c39862d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/deceptive_networks/DeceptiveNetworkDialog.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/deceptive_networks/DeceptiveNetworkDialog.kt
@@ -25,6 +25,7 @@ import android.os.Bundle
 import android.text.Html
 import android.widget.TextView
 import androidx.annotation.RawRes
+import androidx.annotation.StringRes
 import androidx.fragment.app.DialogFragment
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentManager
@@ -32,6 +33,7 @@ import butterknife.BindView
 import butterknife.ButterKnife
 import com.afollestad.materialdialogs.MaterialDialog
 import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.util.ui.BetterLinkMovementMethod
 
 class DeceptiveNetworkDialog : DialogFragment() {
   private var builder: Builder? = null
@@ -44,12 +46,12 @@ class DeceptiveNetworkDialog : DialogFragment() {
     val dialog = MaterialDialog.Builder(requireContext())
       .customView(R.layout.dialog_deceptive_network, true)
       .title(R.string.deceptive_network)
+      .negativeText(R.string.label_close)
       .build()
     ButterKnife.bind(this, dialog.customView!!)
     builder?.message?.let {
-      message.text = Html.fromHtml(
-        resources.openRawResource(it).bufferedReader(Charsets.UTF_8).readText()
-      )
+      message.text = Html.fromHtml(getString(it))
+      message.movementMethod = BetterLinkMovementMethod.newInstance()
     }
     return dialog
   }
@@ -70,10 +72,10 @@ class DeceptiveNetworkDialog : DialogFragment() {
   class Builder(private val fragmentManager: FragmentManager) {
     constructor(context: FragmentActivity) : this(context.supportFragmentManager)
 
-    @RawRes
+    @StringRes
     var message: Int? = null
 
-    fun message(@RawRes message: Int?): Builder {
+    fun message(@StringRes message: Int?): Builder {
       this.message = message
       return this
     }
diff --git a/app/src/main/res/raw/untrustworthy_network_freenode.html b/app/src/main/res/raw/untrustworthy_network_freenode.html
deleted file mode 100644
index a565c563b8a3ab7a3ed94699fad9c3938ec6b231..0000000000000000000000000000000000000000
--- a/app/src/main/res/raw/untrustworthy_network_freenode.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  Quasseldroid - Quassel client for Android
-
-  Copyright (c) 2021 Janne Mareike Koschinski
-  Copyright (c) 2021 The Quassel Project
-
-  This program is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 3 as published
-  by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program. If not, see <http://www.gnu.org/licenses/>.
-  -->
-<p>The staff of this network has taken over several official project channels against the wishes of the channel owners.<br/>
-Those projects have mostly moved to other networks such as libera.chat.</p>
-<p>Before joining or chatting in any project channel make sure to verify that the channel you are in hasn’t moved or been taken over.</p>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index a66f3f457d91ede62bbd7bee230058d20ae86158..7568d2d451343f4fb0ad74040dc647c472e4d1d9 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -187,6 +187,18 @@
   <string name="notification_channel_highlight_title">Benachrichtigungen</string>
   <string name="notification_channel_old_highlight_title">Alte Benachrichtigungen</string>
 
+  <string name="deceptive_network">Irreführendes IRC-Netzwerk</string>
+  <string name="deceptive_network_freenode"><![CDATA[
+    <p>
+      Das Team dieses Netzwerkes hat die Kontrolle über die offiziellen Kanäle mehrerer Projekte übernommen.
+      Dies geschah gegen die Wünsche der Channel-Operatoren.
+      Diese Projekte sind auf andere IRC-Netzwerke wie <a href="https://libera.chat/">libera.chat</a> und <a href="https://www.oftc.net/">OFTC</a> umgezogen.
+    </p>
+    <p>
+      Bitte verifiziere vor dem Betreten und Chatten in Kanälen, ob die Channels umgezogen sind oder von neuen Moderatoren übernommen wurden.
+    </p>
+  ]]></string>
+
   <string name="label_missing_features">Fehlende Features</string>
   <string name="info_missing_features" tools:ignore="StringFormatCount">Deinem Core fehlen bestimmte Features die benötigt werden damit Quasseldroid korrekt funktionieren kann. Du solltest deinen Quassel Core auf Version %1$s oder neuer &lt;a href="https://quassel-irc.org&gt;updaten&lt;/a&gt;.</string>
 
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e1fae92644f7beeb768256be5c6812c2edac2559..d95a4d04526ab93ef5bad25e2eae4594c39613bd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -188,6 +188,14 @@
   <string name="notification_channel_old_highlight_title">Old Highlights</string>
 
   <string name="deceptive_network">Deceptive Network detected</string>
+  <string name="deceptive_network_freenode"><![CDATA[
+    <p>
+      The staff of this network have taken over several official project channels.
+      This happened against the wishes of the channel operators.
+      Those projects have moved to other networks such as <a href="https://libera.chat/">libera.chat</a> and <a href="https://www.oftc.net/">OFTC</a>.
+      Before joining or chatting in any project channel make sure to verify that the channel you are in hasn’t moved or been taken over.
+    </p>
+  ]]></string>
 
   <string name="label_missing_features">Missing Features</string>
   <string name="info_missing_features" tools:ignore="StringFormatCount">Your core is missing features that are required for Quasseldroid to work correctly. You should &lt;a href="https://quassel-irc.org&gt;upgrade&lt;/a&gt; your Quassel core to %1$s or newer.</string>
diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml
index 1105843140ddadf109238bd6a209d1686aa54f60..17790a2cf83354960a64ddb3df5d42f368bfa489 100644
--- a/app/src/main/res/values/strings_preferences.xml
+++ b/app/src/main/res/values/strings_preferences.xml
@@ -36,21 +36,26 @@
   <string name="preference_theme_entry_gruvbox_light">Gruvbox (Light)</string>
   <string name="preference_theme_entry_gruvbox_dark">Gruvbox (Dark)</string>
   <string name="preference_theme_entry_dracula">Dracula</string>
+
   <string name="preference_input_enter_key" translatable="false">input_enter</string>
   <string name="preference_input_enter_title">Enter key on keyboard</string>
 
+  <string name="preference_deceptive_networks_key" translatable="false">deceptive_networks</string>
+  <string name="preference_deceptive_networks_title">Warn against deceptive networks</string>
+
   <string name="preference_input_enter_entry_emoji">Emoji</string>
   <string name="preference_input_enter_entry_send">Send</string>
   <string name="preference_input_enter_entry_newline">New Line</string>
+
   <string name="preference_show_lag_key" translatable="false">show_lag</string>
   <string name="preference_show_lag_title">Show Lag</string>
   <string name="preference_show_lag_summary">Displays the lag between client and core in the action bar</string>
-  <string name="preference_keep_screen_on_key" translatable="false">keep_screen_on</string>
 
+  <string name="preference_keep_screen_on_key" translatable="false">keep_screen_on</string>
   <string name="preference_keep_screen_on_title">Keep Screen Active</string>
   <string name="preference_keep_screen_on_summary">Prevents the device from going to sleep while the app is in foreground</string>
-  <string name="preference_language_key" translatable="false">language</string>
 
+  <string name="preference_language_key" translatable="false">language</string>
   <string name="preference_language_title">Language</string>
   <string name="preference_language_entry_auto">System Default</string>
   <string name="preference_language_entry_en" translatable="false">English</string>
@@ -64,14 +69,13 @@
   <string name="preference_language_entry_nl" translatable="false">Nederlands</string>
   <string name="preference_language_entry_pt" translatable="false">Português</string>
   <string name="preference_language_entry_sr" translatable="false">Srpski (latinica)</string>
+
   <string name="preference_redirection_title">Message Redirection</string>
   <string name="preference_redirection_user_notices_key" translatable="false">redirection_user_notices</string>
   <string name="preference_redirection_user_notices_title">Redirect User Notices</string>
   <string name="preference_redirection_user_notices_summary">Displays user notices in the currently open channel</string>
   <string name="preference_redirection_server_notices_key" translatable="false">redirection_user_notices</string>
   <string name="preference_redirection_server_notices_title">Redirect Server Notices</string>
-
-
   <string name="preference_redirection_server_notices_summary">Displays server notices in the currently open channel</string>
 
   <string name="preference_redirection_errors_key" translatable="false">redirection_errors</string>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 6d5099edd1477edafa8242d2457cea3ff584e356..5744510bb4b406d10a09791ddc6e69bbaf6b617f 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -60,6 +60,11 @@
       android:entryValues="@array/preference_language_entryvalues"
       android:key="@string/preference_language_key"
       android:title="@string/preference_language_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_deceptive_networks_key"
+      android:title="@string/preference_deceptive_networks_title" />
   </PreferenceCategory>
 
   <PreferenceCategory android:layout="@layout/widget_preference_divider" />
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt
index fa1ddf148e5eea1d4ee764acb0306c7af2aa7bec..28c8eb5028cd9d2e9ca3eff03c5b3bb17518b29c 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt
@@ -33,6 +33,7 @@ import de.kuschku.libquassel.util.helper.mapNullable
 import de.kuschku.libquassel.util.helper.nullIf
 import de.kuschku.libquassel.util.helper.safeSwitchMap
 import de.kuschku.quasseldroid.util.emoji.EmojiData
+import de.kuschku.quasseldroid.util.safety.DeceptiveNetworkManager
 import de.kuschku.quasseldroid.viewmodel.ChatViewModel
 import de.kuschku.quasseldroid.viewmodel.EditorViewModel
 import de.kuschku.quasseldroid.viewmodel.QuasselViewModel
@@ -44,9 +45,10 @@ import javax.inject.Inject
 
 open class EditorViewModelHelper @Inject constructor(
   val editor: EditorViewModel,
+  deceptiveNetworkManager: DeceptiveNetworkManager,
   chat: ChatViewModel,
   quassel: QuasselViewModel
-) : ChatViewModelHelper(chat, quassel) {
+) : ChatViewModelHelper(chat, deceptiveNetworkManager, quassel) {
   val rawAutoCompleteData: Observable<Triple<Optional<ISession>, BufferId, Pair<String, IntRange>>> =
     combineLatest(
       connectedSession,