diff --git a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt
index 0e0c9043e374f1249ce818aab7eaeb27757fd634..358b46ee5fb845b2e4d19de97627769e1e5e1d0a 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt
@@ -18,17 +18,22 @@
 
 package org.briarproject.briar.desktop.expiration
 
+import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Close
 import androidx.compose.material.icons.filled.Warning
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
@@ -52,23 +57,35 @@ fun main() = preview {
 }
 
 @Composable
-fun ExpirationBanner(onExpired: () -> Unit) {
+fun ColumnScope.ExpirationBanner(onExpired: () -> Unit) {
 
     var daysLeft by remember { mutableStateOf(0) }
     var expired by remember { mutableStateOf(false) }
+
+    var hideTimestamp by remember { mutableStateOf(0L) }
+
+    var showExpirationBanner by remember { mutableStateOf(value = true) }
+
     LaunchedEffect(Unit) {
         periodicallyCheckIfExpired(
             reportDaysLeft = { daysLeft = it },
-            onExpired = { expired = true; onExpired() },
+            onExpiry = { expired = true; onExpired() },
+            reportHideThreshold = { showExpirationBanner = hideTimestamp <= it }
         )
     }
 
-    if (!expired) ExpirationBanner(daysLeft)
+    AnimatedVisibility(showExpirationBanner && !expired) {
+        ExpirationBanner(daysLeft) {
+            hideTimestamp = System.currentTimeMillis()
+            showExpirationBanner = false
+        }
+    }
 }
 
 @Composable
 fun ExpirationBanner(
     daysLeft: Int,
+    hide: () -> Unit,
 ) = Surface(
     color = MaterialTheme.colors.error,
     modifier = Modifier.fillMaxWidth()
@@ -87,5 +104,11 @@ fun ExpirationBanner(
             text = text,
             style = MaterialTheme.typography.body2
         )
+        Spacer(Modifier.weight(1f))
+        IconButton(
+            onClick = hide,
+        ) {
+            Icon(Icons.Filled.Close, i18n("hide"), Modifier.size(32.dp))
+        }
     }
 }
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt
index d9716edd921d51dcfb78bbf386f16f2490d77ce0..0694ada55d9374f40e36f1b766ca3db3fb09618b 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt
@@ -29,10 +29,12 @@ object ExpirationUtils {
 
     private val EXPIRE_AFTER = BuildData.GIT_TIME + 91.days.inWholeMilliseconds
     private val CHECK_INTERVAL = 1.hours.inWholeMilliseconds
+    private val HIDE_INTERVAL = 1.days.inWholeMilliseconds
 
     // for testing uncomment the following instead
     // private val EXPIRE_AFTER = Instant.now().toEpochMilli() + 10.seconds.inWholeMilliseconds
     // private val CHECK_INTERVAL = 1.seconds.inWholeMilliseconds
+    // private val HIDE_INTERVAL = 10.seconds.inWholeMilliseconds
 
     private fun getMillisLeft() = (EXPIRE_AFTER - Instant.now().toEpochMilli()).milliseconds
 
@@ -40,15 +42,20 @@ object ExpirationUtils {
 
     private fun isExpired() = getMillisLeft() <= 0.milliseconds
 
+    private fun hideThreshold() = System.currentTimeMillis() - HIDE_INTERVAL
+
     suspend fun periodicallyCheckIfExpired(
         reportDaysLeft: (Int) -> Unit,
-        onExpired: () -> Unit,
+        onExpiry: () -> Unit,
+        reportHideThreshold: (Long) -> Unit,
     ) {
         while (true) {
+            reportDaysLeft(getDaysLeft())
             if (isExpired()) {
-                onExpired()
-                break
-            } else reportDaysLeft(getDaysLeft())
+                onExpiry()
+            }
+
+            reportHideThreshold(hideThreshold())
             delay(CHECK_INTERVAL)
         }
     }
diff --git a/src/main/resources/strings/BriarDesktop.properties b/src/main/resources/strings/BriarDesktop.properties
index 08146b58a6bc82946b0fbd4f753a589454d73e08..8cc8b55bb99116e0fbc9d1b465a80290312d3379 100644
--- a/src/main/resources/strings/BriarDesktop.properties
+++ b/src/main/resources/strings/BriarDesktop.properties
@@ -170,6 +170,7 @@ error=Error
 warning=Warning
 unsupported_feature=Unfortunately, this feature is not yet supported by Briar Desktop.
 remove=Remove
+hide=Hide
 
 # Compose text edit actions
 copy=Copy