diff --git a/whisper/message.go b/whisper/message.go
index ad31aa592704f395c12268f629526f1555d21add..a4de18f650e033bcfa496547a9af3450020a6382 100644
--- a/whisper/message.go
+++ b/whisper/message.go
@@ -30,7 +30,7 @@ type Options struct {
 	From   *ecdsa.PrivateKey
 	To     *ecdsa.PublicKey
 	TTL    time.Duration
-	Topics [][]byte
+	Topics []Topic
 }
 
 // NewMessage creates and initializes a non-signed, non-encrypted Whisper message.
@@ -75,13 +75,8 @@ func (self *Message) Wrap(pow time.Duration, options Options) (*Envelope, error)
 			return nil, err
 		}
 	}
-	// Convert the user topic into whisper ones
-	topics := make([]Topic, len(options.Topics))
-	for i, topic := range options.Topics {
-		topics[i] = NewTopic(topic)
-	}
 	// Wrap the processed message, seal it and return
-	envelope := NewEnvelope(options.TTL, topics, self)
+	envelope := NewEnvelope(options.TTL, options.Topics, self)
 	envelope.Seal(pow)
 
 	return envelope, nil
diff --git a/whisper/topic.go b/whisper/topic.go
index 10069c90208cca93f550207e06006e27b63aa4c5..7792e437fa5d79b22d3cee251ff487bfe67705ff 100644
--- a/whisper/topic.go
+++ b/whisper/topic.go
@@ -17,6 +17,32 @@ func NewTopic(data []byte) Topic {
 	return Topic(prefix)
 }
 
+// NewTopics creates a list of topics from a list of binary data elements, by
+// iteratively calling NewTopic on each of them.
+func NewTopics(data ...[]byte) []Topic {
+	topics := make([]Topic, len(data))
+	for i, element := range data {
+		topics[i] = NewTopic(element)
+	}
+	return topics
+}
+
+// NewTopicFromString creates a topic using the binary data contents of the
+// specified string.
+func NewTopicFromString(data string) Topic {
+	return NewTopic([]byte(data))
+}
+
+// NewTopicsFromStrings creates a list of topics from a list of textual data
+// elements, by iteratively calling NewTopicFromString on each of them.
+func NewTopicsFromStrings(data ...string) []Topic {
+	topics := make([]Topic, len(data))
+	for i, element := range data {
+		topics[i] = NewTopicFromString(element)
+	}
+	return topics
+}
+
 // String converts a topic byte array to a string representation.
 func (self *Topic) String() string {
 	return string(self[:])
diff --git a/whisper/topic_test.go b/whisper/topic_test.go
index 4626e2ae5543ff7a49185cbd3459448704a4a064..5f85839872390e6aaa7c9bbf76050020e859c5e1 100644
--- a/whisper/topic_test.go
+++ b/whisper/topic_test.go
@@ -15,10 +15,39 @@ var topicCreationTests = []struct {
 }
 
 func TestTopicCreation(t *testing.T) {
+	// Create the topics individually
 	for i, tt := range topicCreationTests {
 		topic := NewTopic(tt.data)
 		if bytes.Compare(topic[:], tt.hash[:]) != 0 {
-			t.Errorf("test %d: hash mismatch: have %v, want %v.", i, topic, tt.hash)
+			t.Errorf("binary test %d: hash mismatch: have %v, want %v.", i, topic, tt.hash)
+		}
+	}
+	for i, tt := range topicCreationTests {
+		topic := NewTopicFromString(string(tt.data))
+		if bytes.Compare(topic[:], tt.hash[:]) != 0 {
+			t.Errorf("textual test %d: hash mismatch: have %v, want %v.", i, topic, tt.hash)
+		}
+	}
+	// Create the topics in batches
+	binaryData := make([][]byte, len(topicCreationTests))
+	for i, tt := range topicCreationTests {
+		binaryData[i] = tt.data
+	}
+	textualData := make([]string, len(topicCreationTests))
+	for i, tt := range topicCreationTests {
+		textualData[i] = string(tt.data)
+	}
+
+	topics := NewTopics(binaryData...)
+	for i, tt := range topicCreationTests {
+		if bytes.Compare(topics[i][:], tt.hash[:]) != 0 {
+			t.Errorf("binary batch test %d: hash mismatch: have %v, want %v.", i, topics[i], tt.hash)
+		}
+	}
+	topics = NewTopicsFromStrings(textualData...)
+	for i, tt := range topicCreationTests {
+		if bytes.Compare(topics[i][:], tt.hash[:]) != 0 {
+			t.Errorf("textual batch test %d: hash mismatch: have %v, want %v.", i, topics[i], tt.hash)
 		}
 	}
 }