diff --git a/ChannelSettings.iis b/ChannelSettings.iis
index e2466ba..7fe9b90 100644
--- a/ChannelSettings.iis
+++ b/ChannelSettings.iis
@@ -50,7 +50,10 @@ menu channel
 			showmessage("Not connected", "You are not connected to the server", "warn", "o");
 			return;
 		}
-	
+
+        channelOrig = channel;
+        channel = strlower(channel);
+
 		if (chansethndl[channel] != void && dlgvalidhndl(chansethndl[channel]))
 			dlgclose(chansethndl[channel]);
 
@@ -71,7 +74,7 @@ menu channel
 		# Custom attribute to keep track of which channel the dialog has an effect to
 		dlgsetattr(hndl, "channel", channel);
 		
-		dlgsetattr(hndl, "title", "Settings for " + channel);
+		dlgsetattr(hndl, "title", "Settings for " + channelOrig);
 		
 		dlgsetwidgetattr(hndl, "bantable", "header", list("Mask", "Set by", "Date"));
 		
@@ -104,7 +107,8 @@ menu channel
 
 hook numeric(code, params, message)
 {
-	channel = params[1];
+	channel = strlower(params[1]);
+
 	if (channel == void)
 		return;
 		
@@ -113,9 +117,10 @@ hook numeric(code, params, message)
 
 	hndl = chansethndl[channel];
 
-	# No topic is set.
+	# No topic is set
 	if (code == "331") {
 		topicDone[channel] = true;
+        currentTopic[channel] = "";
 	}
 	
 	# Topic received
@@ -124,11 +129,12 @@ hook numeric(code, params, message)
 		topicDone[channel] = true;
 		currentTopic[channel] = message;
 	}
-	
+
+    # Topic-by message is always a bit late to the party so must be unmuted separately.
 	else if (code == "333") {
 		/unmuteresp 333
 	}
-	
+
 	# Mode list received
 	else if (code == "324") {
 		args = list();
@@ -144,7 +150,7 @@ hook numeric(code, params, message)
 	
 	# Ban list item received
 	else if (code == "367") {
-		handle = chansethndl[params[1]];
+		handle = chansethndl[channel];
 		
 		mask = params[2];
 		setby = params[3];
@@ -160,7 +166,7 @@ hook numeric(code, params, message)
 	
 	# Invites list item received
 	else if (code == "346") {
-		handle = chansethndl[params[1]];
+		handle = chansethndl[channel];
 		
 		mask = params[2];
 		setby = params[3];
@@ -176,7 +182,7 @@ hook numeric(code, params, message)
 	
 	# Exceptions list item received
 	else if (code == "348") {
-		handle = chansethndl[params[1]];
+		handle = chansethndl[channel];
 		
 		mask = params[2];
 		setby = params[3];
@@ -199,6 +205,7 @@ hook numeric(code, params, message)
 #
 hook mode(sender, target, modes)
 {
+    target = strlower(target);
 	if (chansethndl[target] == void)
 		return;
 	handle = chansethndl[target];
@@ -274,6 +281,8 @@ function findAndRemoveFromTable(handle, table, mask)
 #
 function checkAndHandleAllDone(channel)
 {
+    channel = strlower(channel);
+
 	if ((topicDone[channel] == false)
 		|| (modesDone[channel] == false)
 		|| (bansDone[channel] == false)
@@ -293,6 +302,8 @@ function checkAndHandleAllDone(channel)
 #
 function parseChannelModes(channel, modes, args)
 {
+    channel = strlower(channel);
+
 	hndl = chansethndl[channel];
 	i = 0;
 	argi = 0; # Index of 'args', increments on group B and C.
@@ -658,9 +669,19 @@ dialog channelsettings
 		height = 25;
 		hook clicked => {
 			channel = dlggetattr(handle, "channel");
-			newModes = createModeDiff(channel);
+
+            newModes = createModeDiff(channel);
 			if (strlen(newModes) > 0)
 				/mode %channel %newModes
+
+            newTopic = dlggetwidgetattr(handle, "topic", "text");
+            if (newTopic != currentTopic[channel]) {
+                if (newTopic == "")
+                    /topic -c %channel
+                else
+                    /topic %channel %newTopic
+            }
+
 			dlgclose(handle);
 		}
 	}
@@ -672,6 +693,8 @@ dialog channelsettings
 #
 function createModeDiff(channel) 
 {
+    channel = strlower(channel);
+
 	hndl = chansethndl[channel];
 
 	unsetmodes = "";