diff --git a/whisper/whisperv5/whisper.go b/whisper/whisperv5/whisper.go
index 8e0662327a810f1ac246591a77a4fe6b755f25b0..4655458214f9206b729f97cccde8cf7a1de664f4 100644
--- a/whisper/whisperv5/whisper.go
+++ b/whisper/whisperv5/whisper.go
@@ -717,7 +717,7 @@ func (w *Whisper) expire() {
 				w.stats.messagesCleared++
 				w.stats.memoryCleared += sz
 				w.stats.memoryUsed -= sz
-				return true
+				return false
 			})
 			w.expirations[expiry].Clear()
 			delete(w.expirations, expiry)
diff --git a/whisper/whisperv5/whisper_test.go b/whisper/whisperv5/whisper_test.go
index 8af085292acf3cf260d9dfeeccf99da7759f3ec9..a7bd17e4d8f2b2872e73a1269d497ba395e8e6d5 100644
--- a/whisper/whisperv5/whisper_test.go
+++ b/whisper/whisperv5/whisper_test.go
@@ -487,27 +487,34 @@ func TestExpiry(t *testing.T) {
 	if err != nil {
 		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
 	}
-
 	params.TTL = 1
-	msg, err := NewSentMessage(params)
-	if err != nil {
-		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
-	}
-	env, err := msg.Wrap(params)
-	if err != nil {
-		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
-	}
 
-	err = w.Send(env)
-	if err != nil {
-		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
+	messagesCount := 5
+
+	// Send a few messages one after another. Due to low PoW and expiration buckets
+	// with one second resolution, it covers a case when there are multiple items
+	// in a single expiration bucket.
+	for i := 0; i < messagesCount; i++ {
+		msg, err := NewSentMessage(params)
+		if err != nil {
+			t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
+		}
+		env, err := msg.Wrap(params)
+		if err != nil {
+			t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
+		}
+
+		err = w.Send(env)
+		if err != nil {
+			t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
+		}
 	}
 
 	// wait till received or timeout
 	var received, expired bool
 	for j := 0; j < 20; j++ {
 		time.Sleep(100 * time.Millisecond)
-		if len(w.Envelopes()) > 0 {
+		if len(w.Envelopes()) == messagesCount {
 			received = true
 			break
 		}
diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go
index 34c1256a6fb202858c4ea310402d42e767ccc308..be633e7ff66b50f2071e4d80c618efddea50464a 100644
--- a/whisper/whisperv6/whisper.go
+++ b/whisper/whisperv6/whisper.go
@@ -900,7 +900,7 @@ func (whisper *Whisper) expire() {
 				whisper.stats.messagesCleared++
 				whisper.stats.memoryCleared += sz
 				whisper.stats.memoryUsed -= sz
-				return true
+				return false
 			})
 			whisper.expirations[expiry].Clear()
 			delete(whisper.expirations, expiry)
diff --git a/whisper/whisperv6/whisper_test.go b/whisper/whisperv6/whisper_test.go
index 7fe256309e61cc90b21f30530573671c769c5872..895bb2b969f9b63c93de8c2886e1f15c77fbebd9 100644
--- a/whisper/whisperv6/whisper_test.go
+++ b/whisper/whisperv6/whisper_test.go
@@ -465,27 +465,34 @@ func TestExpiry(t *testing.T) {
 	if err != nil {
 		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
 	}
-
 	params.TTL = 1
-	msg, err := NewSentMessage(params)
-	if err != nil {
-		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
-	}
-	env, err := msg.Wrap(params)
-	if err != nil {
-		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
-	}
 
-	err = w.Send(env)
-	if err != nil {
-		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
+	messagesCount := 5
+
+	// Send a few messages one after another. Due to low PoW and expiration buckets
+	// with one second resolution, it covers a case when there are multiple items
+	// in a single expiration bucket.
+	for i := 0; i < messagesCount; i++ {
+		msg, err := NewSentMessage(params)
+		if err != nil {
+			t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
+		}
+		env, err := msg.Wrap(params)
+		if err != nil {
+			t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
+		}
+
+		err = w.Send(env)
+		if err != nil {
+			t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
+		}
 	}
 
 	// wait till received or timeout
 	var received, expired bool
 	for j := 0; j < 20; j++ {
 		time.Sleep(100 * time.Millisecond)
-		if len(w.Envelopes()) > 0 {
+		if len(w.Envelopes()) == messagesCount {
 			received = true
 			break
 		}