--- /dev/null
+Index: src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c
+===================================================================
+--- src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c (revision 745)
++++ src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c (working copy)
+@@ -98,19 +98,21 @@
+ * so we can have one analong handler thread that will deal with all the idle analog channels for events
+ * the alternative would be for the driver to provide one socket for all of the oob events for all analog channels
+ */
+-static __inline__ int tdmv_api_wait_socket(sng_fd_t fd, int timeout, int *flags)
++static __inline__ int tdmv_api_wait_socket(zap_channel_t *zchan, int timeout, int *flags)
+ {
+
+ #ifdef LIBSANGOMA_VERSION
+ int err;
+- sangoma_wait_obj_t sangoma_wait_obj;
++ sangoma_wait_obj_t *sangoma_wait_obj = zchan->mod_data;
+
+- sangoma_init_wait_obj(&sangoma_wait_obj, fd, 1, 1, *flags, SANGOMA_WAIT_OBJ);
++ sangoma_init_wait_obj(sangoma_wait_obj, zchan->sockfd, 1, 1, 0, SANGOMA_WAIT_OBJ);
+
+- err=sangoma_socket_waitfor_many(&sangoma_wait_obj,1 , timeout);
++ err = sangoma_socket_waitfor_many(&sangoma_wait_obj, 1, timeout);
++
+ if (err > 0) {
+- *flags=sangoma_wait_obj.flags_out;
++ *flags = sangoma_wait_obj.flags_out;
+ }
++
+ return err;
+
+ #else
+@@ -118,7 +120,7 @@
+ int res;
+
+ memset(&pfds[0], 0, sizeof(pfds[0]));
+- pfds[0].fd = fd;
++ pfds[0].fd = zchan->sockfd;
+ pfds[0].events = *flags;
+ res = poll(pfds, 1, timeout);
+ *flags = 0;
+@@ -200,6 +202,15 @@
+
+ if (sockfd != WP_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
+ wanpipe_tdm_api_t tdm_api;
++#ifdef LIBSANGOMA_VERSION
++ sangoma_wait_obj_t *sangoma_wait_obj;
++
++ sangoma_wait_obj = malloc(sizeof(*sangoma_wait_obj));
++ memset(sangoma_wait_obj, 0, sizeof(*sangoma_wait_obj));
++ sangoma_init_wait_obj(sangoma_wait_obj, sockfd, 1, 1, 0, SANGOMA_WAIT_OBJ);
++ chan->mod_data = sangoma_wait_obj;
++#endif
++
+ memset(&tdm_api,0,sizeof(tdm_api));
+
+ chan->physical_span_id = spanno;
+@@ -211,7 +222,7 @@
+
+ dtmf = "software";
+
+- /* FIXME: Handle Error Conditino Check for return code */
++ /* FIXME: Handle Error Condition Check for return code */
+ err= sangoma_tdm_get_hw_coding(chan->sockfd, &tdm_api);
+
+ if (tdm_api.wp_tdm_cmd.hw_tdm_coding) {
+@@ -606,7 +617,7 @@
+ inflags |= POLLPRI;
+ }
+
+- result = tdmv_api_wait_socket(zchan->sockfd, to, &inflags);
++ result = tdmv_api_wait_socket(zchan, to, &inflags);
+
+ *flags = ZAP_NO_FLAGS;
+
+@@ -643,26 +654,30 @@
+ ZIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event)
+ {
+ #ifdef LIBSANGOMA_VERSION
+- sangoma_wait_obj_t pfds[ZAP_MAX_CHANNELS_SPAN];
++ sangoma_wait_obj_t *pfds[ZAP_MAX_CHANNELS_SPAN] = { 0 };
+ #else
+ struct pollfd pfds[ZAP_MAX_CHANNELS_SPAN];
+ #endif
+
+ uint32_t i, j = 0, k = 0, l = 0;
+- int objects=0;
+ int r;
+
+ for(i = 1; i <= span->chan_count; i++) {
+ zap_channel_t *zchan = span->channels[i];
+
++
+ #ifdef LIBSANGOMA_VERSION
+- sangoma_init_wait_obj(&pfds[j], zchan->sockfd , 1, 1, POLLPRI, SANGOMA_WAIT_OBJ);
++ if (!zchan->mod_data) {
++ continue;
++ }
++ pfds[j] = zchan->mod_data;
++
+ #else
+ memset(&pfds[j], 0, sizeof(pfds[j]));
+ pfds[j].fd = span->channels[i]->sockfd;
+ pfds[j].events = POLLPRI;
+ #endif
+- objects++;
++
+ /* The driver probably should be able to do this wink/flash/ringing by itself this is sort of a hack to make it work! */
+
+ if (zap_test_flag(zchan, ZAP_CHANNEL_WINK) || zap_test_flag(zchan, ZAP_CHANNEL_FLASH)) {
+@@ -703,7 +718,7 @@
+ ms = l;
+ }
+ #ifdef LIBSANGOMA_VERSION
+- r = sangoma_socket_waitfor_many(pfds,objects,ms);
++ r = sangoma_socket_waitfor_many(pfds, j, ms);
+ #else
+ r = poll(pfds, j, ms);
+ #endif
+@@ -935,6 +950,15 @@
+ */
+ static ZIO_CHANNEL_DESTROY_FUNCTION(wanpipe_channel_destroy)
+ {
++ sangoma_wait_obj_t *sangoma_wait_obj;
++
++ if (zchan->mod_data) {
++ sangoma_wait_obj = zchan->mod_data;
++ zchan->mod_data = NULL;
++ sangoma_release_wait_obj(sangoma_wait_obj);
++ free(sangoma_wait_obj);
++ }
++
+ if (zchan->sockfd > -1) {
+ close(zchan->sockfd);
+ zchan->sockfd = WP_INVALID_SOCKET;