diff --git a/cdr.c b/cdr.c
index 19c73dce48b36676f43a778e232b6fbe5bf20ba5..323c8ade2a472ef1bf63521a0fc2f6980e88e6d9 100644
--- a/cdr.c
+++ b/cdr.c
@@ -515,8 +515,10 @@ void ast_cdr_failed(struct ast_cdr *cdr)
 		chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
 		if (ast_test_flag(cdr, AST_CDR_FLAG_POSTED))
 			ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
-		if (!ast_test_flag(cdr, AST_CDR_FLAG_LOCKED))
-			cdr->disposition = AST_CDR_FAILED;
+		if (!ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) {
+			if (cdr->disposition < AST_CDR_FAILED)
+				cdr->disposition = AST_CDR_FAILED;
+		}
 		cdr = cdr->next;
 	}
 }
diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h
index e6685509a31c25018e5df314ae3967ac98760f65..b08f0fd7bf58275479c76a80acd90dfef37e0418 100644
--- a/include/asterisk/cdr.h
+++ b/include/asterisk/cdr.h
@@ -32,8 +32,8 @@
 
 #define AST_CDR_NOANSWER			(1 << 0)
 #define AST_CDR_BUSY				(1 << 1)
-#define AST_CDR_ANSWERED			(1 << 2)
-#define AST_CDR_FAILED				(1 << 3)
+#define AST_CDR_FAILED				(1 << 2)
+#define AST_CDR_ANSWERED			(1 << 3)
 
 /*! AMA Flags */
 #define AST_CDR_OMIT				(1)