diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 1856c9af2ae09492cc62d833081de7bf253974bb..07576269b1f56ddbe0d40e889dfe0bf46ea3e488 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2249,9 +2249,8 @@ static void sip_destroy_peer(struct sip_peer *peer)
 	if (peer->call)
 		sip_destroy(peer->call);
 
-	if (peer->mwipvt) {	/* We have an active subscription, delete it */
+	if (peer->mwipvt) 	/* We have an active subscription, delete it */
 		sip_destroy(peer->mwipvt);
-	}
 
 	if (peer->chanvars) {
 		ast_variables_destroy(peer->chanvars);
@@ -16257,12 +16256,23 @@ static int sip_get_codec(struct ast_channel *chan)
 	return p->peercapability;	
 }
 
-/*! \brief Send a poke to all known peers */
+/*! \brief Send a poke to all known peers 
+	Space them out 100 ms apart
+	XXX We might have a cool algorithm for this or use random - any suggestions?
+*/
 static void sip_poke_all_peers(void)
 {
+	int ms = 0;
+	
+	if (!speerobjs)	/* No peers, just give up */
+		return;
+
 	ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
 		ASTOBJ_WRLOCK(iterator);
-		sip_poke_peer(iterator);
+		if (iterator->pokeexpire > -1)
+			ast_sched_del(sched, iterator->pokeexpire);
+		ms += 100;
+		iterator->pokeexpire = ast_sched_add(sched, ms, sip_poke_peer_s, iterator);
 		ASTOBJ_UNLOCK(iterator);
 	} while (0)
 	);