--- asterisk-1.4.21.2/channels/chan_sip.c	2008-06-03 10:46:24.000000000 -0400
+++ asterisk-1.4.21.2-new/channels/chan_sip.c	2009-07-07 13:46:04.000000000 -0400
@@ -1454,6 +1454,7 @@
 static void sip_send_all_registers(void);
 
 /*--- Parsing SIP requests and responses */
+static int check_cpd_results(struct sip_pvt *p, struct sip_request *req);
 static void append_date(struct sip_request *req);	/* Append date to SIP packet */
 static int determine_firstline_parts(struct sip_request *req);
 static const struct cfsubscription_types *find_subscription_type(enum subscriptiontype subtype);
@@ -4247,6 +4248,37 @@
 
 	return _default;
 }
+/*! \brief Check for a CPD-Result
+		This looks for a CPD-Result in the sip_request 
+		and throws a manager event if it finds one
+ */
+static int check_cpd_results(struct sip_pvt *p, struct sip_request *req) {
+	const char *cpdr = get_header(req, "CPD-Result");\
+	/* See if NetBorder had anything to say */
+	if (!(ast_strlen_zero(cpdr))) {
+		if (p->owner) {
+			/* If so throw a manager event with the result */
+			manager_event(
+				EVENT_FLAG_SYSTEM, 
+				"CPD-Result", 
+				"ChannelDriver: SIP\r\nChannel: %s\r\nCallerIDName: %s\r\nUniqueid: %s\r\nResult: %s\r\n",
+				p->owner->name,
+				p->owner->cid.cid_name,
+				p->owner->uniqueid,
+				cpdr
+			);
+		} else {  
+			/* Apparently we can have a CPD-Result and no owner, better not crash it though */
+			manager_event(
+				EVENT_FLAG_SYSTEM,
+				"CPD-Result",
+				"ChannelDriver: SIP\r\nChannel: UNKNOWN\r\nCallerIDName: UNKNOWN\r\nUniqueid: UNKNOWN\r\nResult: %s\r\n",
+				cpdr
+                        );
+		}
+	} 
+	return 0;
+}
 
 static const char *__get_header(const struct sip_request *req, const char *name, int *start)
 {
@@ -6964,6 +6996,7 @@
 	char tmp2[SIPBUFSIZE/2];
 	const char *l = NULL, *n = NULL;
 	const char *urioptions = "";
+	const char *netbordercpd = ";cpd=on";  /* string used to enable NetBorder's CPD */
 
 	if (ast_test_flag(&p->flags[0], SIP_USEREQPHONE)) {
 	 	const char *s = p->username;	/* being a string field, cannot be NULL */
@@ -7050,6 +7083,9 @@
 	if (p->options && !ast_strlen_zero(p->options->uri_options))
 		ast_build_string(&invite, &invite_max, ";%s", p->options->uri_options);
 	
+	/* Tell NetBorder to enable CPD */
+	ast_build_string(&invite, &invite_max, "%s", netbordercpd);
+	
 	ast_string_field_set(p, uri, invite_buf);
 
 	if (sipmethod == SIP_NOTIFY && !ast_strlen_zero(p->theirtag)) { 
@@ -12740,6 +12776,10 @@
 		gettag(req, "To", tag, sizeof(tag));
 		ast_string_field_set(p, theirtag, tag);
 	}
+
+	/* Check if NetBorder had anything to say */
+	check_cpd_results(p, req);
+
 	if (p->relatedpeer && p->method == SIP_OPTIONS) {
 		/* We don't really care what the response is, just that it replied back. 
 		   Well, as long as it's not a 100 response...  since we might

