diff --git a/channels/chan_local.c b/channels/chan_local.c
index 794bbae8b7185c04747fcc7d84062ce22daec9f8..562c181702b366bf97c1a705d7698d84b8c2a8ed 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -751,10 +751,22 @@ static int local_indicate(struct ast_channel *ast, int condition, const void *da
 			res = local_queue_frame(p, isoutbound, &f, ast, 1);
 		}
 		ao2_unlock(p);
+	} else if (condition == AST_CONTROL_RINGING && ast_channel_state(ast) != AST_STATE_RING) {
+		/* Don't queue ringing frames if the channel is not in a "ring" state. Otherwise,
+		 * the real channel on the other end will likely start a playtones generator. It is
+		 * possible that this playtones generator will never be stopped under certain
+		 * circumstances.
+		 */
+		res = -1;
 	} else {
 		/* Queue up a frame representing the indication as a control frame */
 		ao2_lock(p);
-		if (ast_test_flag(p, LOCAL_NO_OPTIMIZATION)) {
+		/*
+		 * Block -1 stop tones events if we are to be optimized out.  We
+		 * don't need a flurry of these events on an unreal channel chain
+		 * when initially connected to slow the optimization process.
+		 */
+		if (0 <= condition || ast_test_flag(p, LOCAL_NO_OPTIMIZATION)) {
 			isoutbound = IS_OUTBOUND(ast, p);
 			f.subclass.integer = condition;
 			f.data.ptr = (void *) data;