diff --git a/.cleancount b/.cleancount
index f5c89552bd3e62bfce023a230e90d141f7a46b2f..bb95160cb6e07358f54a28a208ae41e69889c97b 100644
--- a/.cleancount
+++ b/.cleancount
@@ -1 +1 @@
-32
+33
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index aea8f4d8c164aa182e10da5df9a8639cc012d55c..8a20d3b91bd921ee8074f282dc408690a2084eb7 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -505,6 +505,7 @@ struct ast_channel {
 	int epfd;
 	struct ast_epoll_data *epfd_data[AST_MAX_FDS];
 #endif
+	int visible_indication;                         /*!< Indication currently playing on the channel */
 };
 
 /*! \brief ast_channel_tech Properties */
diff --git a/main/channel.c b/main/channel.c
index 219485939e6657f9140085e66e42b92e35f3157b..f0ee9e7d4bbc4a470783b55750c6ccc6488e0a0e 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -1519,7 +1519,7 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay)
 	default:
 		break;
 	}
-
+	chan->visible_indication = 0;
 	ast_channel_unlock(chan);
 
 	return res;
@@ -2557,6 +2557,7 @@ int ast_indicate_data(struct ast_channel *chan, int condition, const void *data,
 				ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
 				ast_playtones_start(chan,0,ts->data, 1);
 				res = 0;
+				chan->visible_indication = condition;
 			} else if (condition == AST_CONTROL_PROGRESS) {
 				/* ast_playtones_stop(chan); */
 			} else if (condition == AST_CONTROL_PROCEEDING) {
@@ -2573,7 +2574,9 @@ int ast_indicate_data(struct ast_channel *chan, int condition, const void *data,
 				res = -1;
 			}
 		}
-	}
+	} else
+		chan->visible_indication = condition;
+
 	return res;
 }
 
@@ -3724,6 +3727,10 @@ int ast_do_masquerade(struct ast_channel *original)
 	} else
 		ast_log(LOG_WARNING, "Channel type '%s' does not have a fixup routine (for %s)!  Bad things may happen.\n",
 			original->tech->type, original->name);
+
+	/* If an indication is currently playing maintain it on the channel that is taking the place of original */
+	if (original->visible_indication)
+		ast_indicate(original, original->visible_indication);
 	
 	/* Now, at this point, the "clone" channel is totally F'd up.  We mark it as
 	   a zombie so nothing tries to touch it.  If it's already been marked as a