diff --git a/channel.c b/channel.c
index cbedf3fecf592fdcf026a62944fadc71c9c6ea54..c5afa428d48693e33ec7e06a82a1e38885be38bf 100644
--- a/channel.c
+++ b/channel.c
@@ -1485,6 +1485,9 @@ int ast_answer(struct ast_channel *chan)
 {
 	int res = 0;
 	ast_channel_lock(chan);
+	/* You can't answer an outbound call */
+	if (ast_test_flag(chan, AST_FLAG_OUTGOING))
+		return 0;
 	/* Stop if we're a zombie or need a soft hangup */
 	if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
 		ast_channel_unlock(chan);
@@ -1953,13 +1956,17 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
 		switch (f->frametype) {
 		case AST_FRAME_CONTROL:
 			if (f->subclass == AST_CONTROL_ANSWER) {
-				if (prestate == AST_STATE_UP) {
+				if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
+					ast_log(LOG_DEBUG, "Ignoring answer on an inbound call!\n");
+					f = &ast_null_frame;
+				} else if (prestate == AST_STATE_UP) {
 					ast_log(LOG_DEBUG, "Dropping duplicate answer!\n");
 					f = &ast_null_frame;
+				} else {
+					/* Answer the CDR */
+					ast_setstate(chan, AST_STATE_UP);
+					ast_cdr_answer(chan->cdr);
 				}
-				/* Answer the CDR */
-				ast_setstate(chan, AST_STATE_UP);
-				ast_cdr_answer(chan->cdr);
 			}
 			break;
 		case AST_FRAME_DTMF:
@@ -2638,9 +2645,11 @@ int ast_call(struct ast_channel *chan, char *addr, int timeout)
 	int res = -1;
 	/* Stop if we're a zombie or need a soft hangup */
 	ast_channel_lock(chan);
-	if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan))
+	if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
 		if (chan->tech->call)
 			res = chan->tech->call(chan, addr, timeout);
+		ast_set_flag(chan, AST_FLAG_OUTGOING);
+	}
 	ast_channel_unlock(chan);
 	return res;
 }
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 73f1e17a72678c88c160eb21ec12f66b922d8d51..770f8ce145a40e75cd1db3af02a43a929d103418 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -466,6 +466,7 @@ struct ast_channel {
 						   so when ->priority is set, it will get incremented before
 						   finding the next priority to run
 						*/
+#define AST_FLAG_OUTGOING (1 << 10) /*! Is this call outgoing */
 /* @} */
 
 #define AST_FEATURE_PLAY_WARNING	(1 << 0)