diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c
index a109673f546670ba7530edb8a16e38d5cfe1de19..bea2b7d1e00da5a74ac29badde4f6395c1407919 100644
--- a/apps/app_chanspy.c
+++ b/apps/app_chanspy.c
@@ -314,11 +314,16 @@ static int channel_spy(struct ast_channel *chan, struct ast_channel *spyee, int
 	return running;
 }
 
-static struct ast_channel *next_channel(const struct ast_channel *last)
+static struct ast_channel *next_channel(const struct ast_channel *last, const char *spec)
 {
 	struct ast_channel *this;
 
-	if ((this = ast_channel_walk_locked(last)))
+	if (spec)
+		this = ast_walk_channel_by_name_prefix_locked(last, spec, strlen(spec));
+	else
+		this = ast_channel_walk_locked(last);
+
+	if (this)
 		ast_channel_unlock(this);
 
 	return this;
@@ -364,23 +369,23 @@ static int common_exec(struct ast_channel *chan, const int silent, const int bro
 		waitms = 100;
 		peer = prev = next = NULL;
 
-		for (peer = next_channel(peer);
+		for (peer = next_channel(peer, spec);
 		     peer;
-		     prev = peer, peer = next ? next : next_channel(peer), next = NULL) {
+		     prev = peer, peer = next ? next : next_channel(peer, spec), next = NULL) {
 			const char *group;
-			int igrp = 0;
+			int igrp = !mygroup;
 			char *groups[25];
 			int num_groups = 0;
 			char *dup_group;
 			int x;
 			char *s;
 				
-			if (peer == chan)
-				continue;
-
 			if (peer == prev)
 				break;
 
+			if (peer == chan)
+				continue;
+
 			if (mygroup) {
 				if ((group = pbx_builtin_getvar_helper(peer, "SPYGROUP"))) {
 					dup_group = ast_strdupa(group);
@@ -388,22 +393,17 @@ static int common_exec(struct ast_channel *chan, const int silent, const int bro
 									   sizeof(groups) / sizeof(groups[0]));
 				}
 				
-				if (num_groups) {
-					for (x = 0; x < num_groups; x++) {
-						if (!strcmp(mygroup, groups[x])) {
-							igrp = 1;
-							break;
-						}
+				for (x = 0; x < num_groups; x++) {
+					if (!strcmp(mygroup, groups[x])) {
+						igrp = 1;
+						break;
 					}
-				} 
+				}
 			}
 			
 			if (!igrp)
 				continue;
 
-			if (spec && strncasecmp(peer->name, spec, strlen(spec)))
-				continue;
-
 			if (bronly && !ast_bridged_channel(peer))
 				continue;
 
diff --git a/channel.c b/channel.c
index 952c7b6ad95906bdce9d8fab14c71b2eb5ad1393..82eac1db14493e2e3b8b00652d3632214f1db261 100644
--- a/channel.c
+++ b/channel.c
@@ -905,7 +905,8 @@ struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, cons
 }
 
 /*! \brief Get next channel by name prefix and lock it */
-struct ast_channel *ast_walk_channel_by_name_prefix_locked(struct ast_channel *chan, const char *name, const int namelen)
+struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name,
+							   const int namelen)
 {
 	return channel_find_locked(chan, name, namelen, NULL, NULL);
 }
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index d3d5862adf95323f6d2c772ea26e3a6683ec0533..06a895293c48f916a08c9d92bf959e56cd6efdf6 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -874,7 +874,7 @@ struct ast_channel *ast_get_channel_by_name_locked(const char *chan);
 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen);
 
 /*! \brief Get channel by name prefix (locks channel) */
-struct ast_channel *ast_walk_channel_by_name_prefix_locked(struct ast_channel *chan, const char *name, const int namelen);
+struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name, const int namelen);
 
 /*! \brief Get channel by exten (and optionally context) and lock it */
 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context);