diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a69d11783ace8a3f8b48cfab771333118da96996..e54c1bae3993f26333aef85276a54ff6cce40c2a 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1980,6 +1980,27 @@ static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_r
 	return __transmit_response(p, msg, req, 1);
 }
 
+static void append_date(struct sip_request *req)
+{
+	char tmpdat[256];
+	struct tm tm;
+	time_t t;
+	time(&t);
+	gmtime_r(&t, &tm);
+	strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
+	add_header(req, "Date", tmpdat);
+}
+
+static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
+{
+	struct sip_request resp;
+	respprep(&resp, p, msg, req);
+	append_date(&resp);
+	add_header(&resp, "Content-Length", "0");
+	add_blank_header(&resp);
+	return send_response(p, &resp, 0, 0);
+}
+
 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
 {
 	struct sip_request resp;
@@ -2770,7 +2791,7 @@ static int register_verify(struct sip_pvt *p, struct sockaddr_in *sin, struct si
 					ast_log(LOG_WARNING, "Failed to parse contact info\n");
 				} else {
 					/* Say OK and ask subsystem to retransmit msg counter */
-					transmit_response(p, "200 OK", req);
+					transmit_response_with_date(p, "200 OK", req);
 					peer->lastmsgssent = -1;
 					res = 0;
 				}
@@ -4178,7 +4199,7 @@ static void *do_monitor(void *data)
 restartsearch:		
 		sip = iflist;
 		while(sip) {
-			if (sip->needdestroy) {
+			if (sip->needdestroy && !sip->packets) {
 				__sip_destroy(sip, 1);
 				goto restartsearch;
 			}