simplify flags/page2_flags stuff by using arrays instead
authorKevin P. Fleming <kpfleming@digium.com>
Mon, 27 Mar 2006 04:54:06 +0000 (04:54 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Mon, 27 Mar 2006 04:54:06 +0000 (04:54 +0000)
enhance handle_common_options to be able to set flags in the second set of flags (what used to be page2_flags)
various other minor fixes

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@15187 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 5b94d51..fc3c3eb 100644 (file)
@@ -431,8 +431,7 @@ static int rpeerobjs = 0;           /*!< Realtime peers */
 static int apeerobjs = 0;              /*!< Autocreated peer objects */
 static int regobjs = 0;                        /*!< Registry objects */
 
-static struct ast_flags global_flags = {0};            /*!< global SIP_ flags */
-static struct ast_flags global_flags_page2 = {0};      /*!< more global SIP_ flags */
+static struct ast_flags global_flags[2] = {{0}};       /*!< global SIP_ flags */
 
 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
@@ -622,9 +621,9 @@ struct sip_auth {
 #define SIP_PKT_DEBUG          (1 << 0)        /*!< Debug this packet */
 #define SIP_PKT_WITH_TOTAG     (1 << 1)        /*!< This packet has a to-tag */
 
-#define sipdebug               ast_test_flag(&global_flags_page2, SIP_PAGE2_DEBUG)
-#define sipdebug_config                ast_test_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONFIG)
-#define sipdebug_console       ast_test_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONSOLE)
+#define sipdebug               ast_test_flag(&global_flags[1], SIP_PAGE2_DEBUG)
+#define sipdebug_config                ast_test_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONFIG)
+#define sipdebug_console       ast_test_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONSOLE)
 
 /*! \brief sip_pvt: PVT structures are used for each SIP dialog, ie. a call, a registration, a subscribe  */
 static struct sip_pvt {
@@ -676,8 +675,7 @@ static struct sip_pvt {
        ast_group_t callgroup;                  /*!< Call group */
        ast_group_t pickupgroup;                /*!< Pickup group */
        int lastinvite;                         /*!< Last Cseq of invite */
-       unsigned int flags;                     /*!< SIP_ flags */      
-       struct ast_flags flags_page2;           /*!< SIP PAGE2 flags */
+       struct ast_flags flags[2];              /*!< SIP_ flags */
        int timer_t1;                           /*!< SIP timer T1, ms rtt */
        unsigned int sipoptions;                /*!< Supported SIP sipoptions on the other end */
        int capability;                         /*!< Special capability (codec) */
@@ -776,9 +774,8 @@ struct sip_user {
        struct ast_codec_pref prefs;    /*!< codec prefs */
        ast_group_t callgroup;          /*!< Call group */
        ast_group_t pickupgroup;        /*!< Pickup Group */
-       unsigned int flags;             /*!< SIP flags */       
        unsigned int sipoptions;        /*!< Supported SIP options */
-       struct ast_flags flags_page2;   /*!< SIP_PAGE2 flags */
+       struct ast_flags flags[2];      /*!< SIP_ flags */
        int amaflags;                   /*!< AMA flags for billing */
        int callingpres;                /*!< Calling id presentation */
        int capability;                 /*!< Codec capability */
@@ -819,9 +816,8 @@ struct sip_peer {
        struct ast_codec_pref prefs;    /*!<  codec prefs */
        int lastmsgssent;
        time_t  lastmsgcheck;           /*!<  Last time we checked for MWI */
-       unsigned int flags;             /*!<  SIP flags */      
        unsigned int sipoptions;        /*!<  Supported SIP options */
-       struct ast_flags flags_page2;   /*!<  SIP_PAGE2 flags */
+       struct ast_flags flags[2];      /*!<  SIP_ flags */
        int expire;                     /*!<  When to expire this peer registration */
        int capability;                 /*!<  Codec capability */
        int rtptimeout;                 /*!<  RTP timeout */
@@ -1131,7 +1127,7 @@ static inline int sip_debug_test_pvt(struct sip_pvt *p)
 {
        if (!sipdebug)
                return 0;
-       return sip_debug_test_addr(((ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE) ? &p->recv : &p->sa));
+       return sip_debug_test_addr(ast_test_flag(&p->flags[0], SIP_NAT_ROUTE) ? &p->recv : &p->sa);
 }
 
 
@@ -1141,7 +1137,7 @@ static int __sip_xmit(struct sip_pvt *p, char *data, int len)
        int res;
        char iabuf[INET_ADDRSTRLEN];
 
-       if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
+       if (ast_test_flag(&p->flags[0], SIP_NAT_ROUTE))
                res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
        else
                res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
@@ -1158,7 +1154,7 @@ static void build_via(struct sip_pvt *p)
 {
        char iabuf[INET_ADDRSTRLEN];
        /* Work around buggy UNIDEN UIP200 firmware */
-       const char *rport = ast_test_flag(p, SIP_NAT) & SIP_NAT_RFC3581 ? ";rport" : "";
+       const char *rport = ast_test_flag(&p->flags[0], SIP_NAT) & SIP_NAT_RFC3581 ? ";rport" : "";
 
        /* z9hG4bK is a magic cookie.  See RFC 3261 section 8.1.1.7 */
        ast_string_field_build(p, via, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x%s",
@@ -1282,7 +1278,7 @@ static int retrans_pkt(void *data)
                } 
 
                if (pkt->owner && sip_debug_test_pvt(pkt->owner)) {
-                       if (ast_test_flag(pkt->owner, SIP_NAT) & SIP_NAT_ROUTE)
+                       if (ast_test_flag(&pkt->owner->flags[0], SIP_NAT_ROUTE))
                                ast_verbose("Retransmitting #%d (NAT) to %s:%d:\n%s\n---\n", pkt->retrans, ast_inet_ntoa(iabuf, sizeof(iabuf), pkt->owner->recv.sin_addr), ntohs(pkt->owner->recv.sin_port), pkt->data);
                        else
                                ast_verbose("Retransmitting #%d (no NAT) to %s:%d:\n%s\n---\n", pkt->retrans, ast_inet_ntoa(iabuf, sizeof(iabuf), pkt->owner->sa.sin_addr), ntohs(pkt->owner->sa.sin_port), pkt->data);
@@ -1312,13 +1308,13 @@ static int retrans_pkt(void *data)
                        ast_mutex_lock(&pkt->owner->lock);
                }
                if (pkt->owner->owner) {
-                       ast_set_flag(pkt->owner, SIP_ALREADYGONE);
+                       ast_set_flag(&pkt->owner->flags[0], SIP_ALREADYGONE);
                        ast_log(LOG_WARNING, "Hanging up call %s - no reply to our critical packet.\n", pkt->owner->callid);
                        ast_queue_hangup(pkt->owner->owner);
                        ast_mutex_unlock(&pkt->owner->owner->lock);
                } else {
                        /* If no channel owner, destroy now */
-                       ast_set_flag(pkt->owner, SIP_NEEDDESTROY);      
+                       ast_set_flag(&pkt->owner->flags[0], SIP_NEEDDESTROY);   
                }
        }
        /* In any case, go ahead and remove the packet */
@@ -1556,7 +1552,7 @@ static int send_response(struct sip_pvt *p, struct sip_request *req, enum xmitty
 
        if (sip_debug_test_pvt(p)) {
                char iabuf[INET_ADDRSTRLEN];
-               if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
+               if (ast_test_flag(&p->flags[0], SIP_NAT_ROUTE))
                        ast_verbose("%sTransmitting (NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr), ntohs(p->recv.sin_port), req->data);
                else
                        ast_verbose("%sTransmitting (no NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr), ntohs(p->sa.sin_port), req->data);
@@ -1581,7 +1577,7 @@ static int send_request(struct sip_pvt *p, struct sip_request *req, enum xmittyp
 
        if (sip_debug_test_pvt(p)) {
                char iabuf[INET_ADDRSTRLEN];
-               if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
+               if (ast_test_flag(&p->flags[0], SIP_NAT_ROUTE))
                        ast_verbose("%sTransmitting (NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr), ntohs(p->recv.sin_port), req->data);
                else
                        ast_verbose("%sTransmitting (no NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr), ntohs(p->sa.sin_port), req->data);
@@ -1716,9 +1712,9 @@ static void sip_destroy_peer(struct sip_peer *peer)
                ast_sched_del(sched, peer->pokeexpire);
        register_peer_exten(peer, FALSE);
        ast_free_ha(peer->ha);
-       if (ast_test_flag((&peer->flags_page2), SIP_PAGE2_SELFDESTRUCT))
+       if (ast_test_flag(&peer->flags[1], SIP_PAGE2_SELFDESTRUCT))
                apeerobjs--;
-       else if (ast_test_flag(peer, SIP_REALTIME))
+       else if (ast_test_flag(&peer->flags[0], SIP_REALTIME))
                rpeerobjs--;
        else
                speerobjs--;
@@ -1732,9 +1728,9 @@ static void sip_destroy_peer(struct sip_peer *peer)
 /*! \brief Update peer data in database (if used) */
 static void update_peer(struct sip_peer *p, int expiry)
 {
-       int rtcachefriends = ast_test_flag(&(p->flags_page2), SIP_PAGE2_RTCACHEFRIENDS);
-       if (ast_test_flag((&global_flags_page2), SIP_PAGE2_RTUPDATE) &&
-               (ast_test_flag(p, SIP_REALTIME) || rtcachefriends)) {
+       int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
+       if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTUPDATE) &&
+           (ast_test_flag(&p->flags[0], SIP_REALTIME) || rtcachefriends)) {
                realtime_update_peer(p->name, &p->addr, p->username, rtcachefriends ? p->fullcontact : NULL, expiry);
        }
 }
@@ -1786,16 +1782,16 @@ static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *
        }
 
        /* Peer found in realtime, now build it in memory */
-       peer = build_peer(newpeername, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS));
+       peer = build_peer(newpeername, var, !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS));
        if (!peer) {
                ast_variables_destroy(var);
                return (struct sip_peer *) NULL;
        }
 
-       if (ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
+       if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
                /* Cache peer */
-               ast_copy_flags((&peer->flags_page2),(&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS);
-               if (ast_test_flag((&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR)) {
+               ast_copy_flags(&peer->flags[1],&global_flags[1], SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS);
+               if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTAUTOCLEAR)) {
                        if (peer->expire > -1) {
                                ast_sched_del(sched, peer->expire);
                        }
@@ -1803,7 +1799,7 @@ static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *
                }
                ASTOBJ_CONTAINER_LINK(&peerl,peer);
        } else {
-               ast_set_flag(peer, SIP_REALTIME);
+               ast_set_flag(&peer->flags[0], SIP_REALTIME);
        }
        ast_variables_destroy(var);
 
@@ -1816,7 +1812,7 @@ static int sip_addrcmp(char *name, struct sockaddr_in *sin)
        /* We know name is the first field, so we can cast */
        struct sip_peer *p = (struct sip_peer *) name;
        return  !(!inaddrcmp(&p->addr, sin) || 
-                                       (ast_test_flag(p, SIP_INSECURE_PORT) &&
+                                       (ast_test_flag(&p->flags[0], SIP_INSECURE_PORT) &&
                                        (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr)));
 }
 
@@ -1848,7 +1844,7 @@ static void sip_destroy_user(struct sip_user *user)
                ast_variables_destroy(user->chanvars);
                user->chanvars = NULL;
        }
-       if (ast_test_flag(user, SIP_REALTIME))
+       if (ast_test_flag(&user->flags[0], SIP_REALTIME))
                ruserobjs--;
        else
                suserobjs--;
@@ -1877,22 +1873,22 @@ static struct sip_user *realtime_user(const char *username)
                }
        }
 
-       user = build_user(username, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS));
+       user = build_user(username, var, !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS));
        
        if (!user) {    /* No user found */
                ast_variables_destroy(var);
                return NULL;
        }
 
-       if (ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
-               ast_set_flag((&user->flags_page2), SIP_PAGE2_RTCACHEFRIENDS);
+       if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
+               ast_set_flag(&user->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
                suserobjs++;
                ASTOBJ_CONTAINER_LINK(&userl,user);
        } else {
                /* Move counter from s to r... */
                suserobjs--;
                ruserobjs++;
-               ast_set_flag(user, SIP_REALTIME);
+               ast_set_flag(&user->flags[0], SIP_REALTIME);
        }
        ast_variables_destroy(var);
        return user;
@@ -1931,23 +1927,23 @@ static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer)
                return -1;
        }
 
-       ast_copy_flags(r, peer, SIP_FLAGS_TO_COPY);
-       ast_copy_flags((&r->flags_page2),(&peer->flags_page2), SIP_PAGE2_FLAGS_TO_COPY);
+       ast_copy_flags(&r->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
+       ast_copy_flags(&r->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
        r->capability = peer->capability;
-       if (!ast_test_flag((&r->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && r->vrtp) {
+       if (!ast_test_flag(&r->flags[0], SIP_PAGE2_VIDEOSUPPORT) && r->vrtp) {
                ast_rtp_destroy(r->vrtp);
                r->vrtp = NULL;
        }
        r->prefs = peer->prefs;
        if (r->rtp) {
                if (option_debug)
-                       ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
-               ast_rtp_setnat(r->rtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
+                       ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(&r->flags[0], SIP_NAT) & SIP_NAT_ROUTE));
+               ast_rtp_setnat(r->rtp, (ast_test_flag(&r->flags[0], SIP_NAT) & SIP_NAT_ROUTE));
        }
        if (r->vrtp) {
                if (option_debug)
-                       ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
-               ast_rtp_setnat(r->vrtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
+                       ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(&r->flags[0], SIP_NAT) & SIP_NAT_ROUTE));
+               ast_rtp_setnat(r->vrtp, (ast_test_flag(&r->flags[0], SIP_NAT) & SIP_NAT_ROUTE));
        }
        ast_string_field_set(r, peername, peer->username);
        ast_string_field_set(r, authname, peer->username);
@@ -1986,7 +1982,8 @@ static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer)
        /* Minimum is settable or default to 100 ms */
        if (peer->maxms && peer->lastms)
                r->timer_t1 = peer->lastms < global_t1min ? global_t1min : peer->lastms;
-       if ((ast_test_flag(r, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(r, SIP_DTMF) == SIP_DTMF_AUTO))
+       if ((ast_test_flag(&r->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833) ||
+           (ast_test_flag(&r->flags[0], SIP_DTMF) == SIP_DTMF_AUTO))
                r->noncodeccapability |= AST_RTP_DTMF;
        else
                r->noncodeccapability &= ~AST_RTP_DTMF;
@@ -1995,7 +1992,7 @@ static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer)
        r->rtpholdtimeout = peer->rtpholdtimeout;
        r->rtpkeepalive = peer->rtpkeepalive;
        if (peer->call_limit)
-               ast_set_flag(r, SIP_CALL_LIMIT);
+               ast_set_flag(&r->flags[0], SIP_CALL_LIMIT);
        r->maxcallbitrate = peer->maxcallbitrate;
        
        return 0;
@@ -2133,7 +2130,7 @@ static int sip_call(struct ast_channel *ast, char *dest, int timeout)
        }
        
        res = 0;
-       ast_set_flag(p, SIP_OUTGOING);
+       ast_set_flag(&p->flags[0], SIP_OUTGOING);
 #ifdef OSP_SUPPORT
        if (!p->options->osptoken || !osphandle || (sscanf(osphandle, "%d", &p->osphandle) != 1)) {
                /* Force Disable OSP support */
@@ -2299,7 +2296,7 @@ static int update_call_counter(struct sip_pvt *fup, int event)
 {
        char name[256];
        int *inuse, *call_limit;
-       int outgoing = ast_test_flag(fup, SIP_OUTGOING);
+       int outgoing = ast_test_flag(&fup->flags[0], SIP_OUTGOING);
        struct sip_user *u = NULL;
        struct sip_peer *p = NULL;
 
@@ -2307,7 +2304,7 @@ static int update_call_counter(struct sip_pvt *fup, int event)
                ast_log(LOG_DEBUG, "Updating call counter for %s call\n", outgoing ? "outgoing" : "incoming");
        /* Test if we need to check call limits, in order to avoid 
           realtime lookups if we do not need it */
-       if (!ast_test_flag(fup, SIP_CALL_LIMIT))
+       if (!ast_test_flag(&fup->flags[0], SIP_CALL_LIMIT))
                return 0;
 
        ast_copy_string(name, fup->username, sizeof(name));
@@ -2338,7 +2335,7 @@ static int update_call_counter(struct sip_pvt *fup, int event)
                /* incoming and outgoing affects the inUse counter */
                case DEC_CALL_LIMIT:
                        if ( *inuse > 0 ) {
-                               if (ast_test_flag(fup, SIP_INC_COUNT))
+                               if (ast_test_flag(&fup->flags[0], SIP_INC_COUNT))
                                        (*inuse)--;
                        } else {
                                *inuse = 0;
@@ -2359,7 +2356,7 @@ static int update_call_counter(struct sip_pvt *fup, int event)
                                }
                        }
                        (*inuse)++;
-                       ast_set_flag(fup, SIP_INC_COUNT);
+                       ast_set_flag(&fup->flags[0], SIP_INC_COUNT);
                        if (option_debug > 1 || sipdebug) {
                                ast_log(LOG_DEBUG, "Call %s %s '%s' is %d out of %d\n", outgoing ? "to" : "from", u ? "user":"peer", name, *inuse, *call_limit);
                        }
@@ -2595,9 +2592,9 @@ static int sip_hangup(struct ast_channel *ast)
        ast_set_flag(&locflags, SIP_NEEDDESTROY);       
 
        /* Start the process if it's not already started */
-       if (!ast_test_flag(p, SIP_ALREADYGONE) && !ast_strlen_zero(p->initreq.data)) {
+       if (!ast_test_flag(&p->flags[0], SIP_ALREADYGONE) && !ast_strlen_zero(p->initreq.data)) {
                if (needcancel) {       /* Outgoing call, not up */
-                       if (ast_test_flag(p, SIP_OUTGOING)) {
+                       if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                                /* stop retransmitting an INVITE that has not received a response */
                                __sip_pretend_ack(p);
 
@@ -2627,12 +2624,12 @@ static int sip_hangup(struct ast_channel *ast)
                        } else {
                                /* Note we will need a BYE when this all settles out
                                   but we can't send one while we have "INVITE" outstanding. */
-                               ast_set_flag(p, SIP_PENDINGBYE);        
-                               ast_clear_flag(p, SIP_NEEDREINVITE);    
+                               ast_set_flag(&p->flags[0], SIP_PENDINGBYE);     
+                               ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE); 
                        }
                }
        }
-       ast_copy_flags(p, (&locflags), SIP_NEEDDESTROY);        
+       ast_copy_flags(&p->flags[0], &locflags, SIP_NEEDDESTROY);       
        ast_mutex_unlock(&p->lock);
        return 0;
 }
@@ -2700,9 +2697,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
                        ast_mutex_lock(&p->lock);
                        if (p->rtp) {
                                /* If channel is not up, activate early media session */
-                               if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
+                               if ((ast->_state != AST_STATE_UP) &&
+                                   !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
+                                   !ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                                        transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, XMIT_UNRELIABLE);
-                                       ast_set_flag(p, SIP_PROGRESS_SENT);     
+                                       ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);  
                                }
                                time(&p->lastrtptx);
                                res =  ast_rtp_write(p->rtp, frame);
@@ -2715,9 +2714,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
                        ast_mutex_lock(&p->lock);
                        if (p->vrtp) {
                                /* Activate video early media */
-                               if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
+                               if ((ast->_state != AST_STATE_UP) &&
+                                   !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
+                                   !ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                                        transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, XMIT_UNRELIABLE);
-                                       ast_set_flag(p, SIP_PROGRESS_SENT);     
+                                       ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);  
                                }
                                time(&p->lastrtptx);
                                res =  ast_rtp_write(p->vrtp, frame);
@@ -2760,7 +2761,7 @@ static int sip_senddigit(struct ast_channel *ast, char digit)
        int res = 0;
 
        ast_mutex_lock(&p->lock);
-       switch (ast_test_flag(p, SIP_DTMF)) {
+       switch (ast_test_flag(&p->flags[0], SIP_DTMF)) {
        case SIP_DTMF_INFO:
                transmit_info_with_digit(p, digit);
                break;
@@ -2805,12 +2806,12 @@ static int sip_indicate(struct ast_channel *ast, int condition)
        switch(condition) {
        case AST_CONTROL_RINGING:
                if (ast->_state == AST_STATE_RING) {
-                       if (!ast_test_flag(p, SIP_PROGRESS_SENT) ||
-                           (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) {                             
+                       if (!ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) ||
+                           (ast_test_flag(&p->flags[0], SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) {                          
                                /* Send 180 ringing if out-of-band seems reasonable */
                                transmit_response(p, "180 Ringing", &p->initreq);
-                               ast_set_flag(p, SIP_RINGING);
-                               if (ast_test_flag(p, SIP_PROG_INBAND) != SIP_PROG_INBAND_YES)
+                               ast_set_flag(&p->flags[0], SIP_RINGING);
+                               if (ast_test_flag(&p->flags[0], SIP_PROG_INBAND) != SIP_PROG_INBAND_YES)
                                        break;
                        } else {
                                /* Well, if it's not reasonable, just send in-band */
@@ -2821,7 +2822,7 @@ static int sip_indicate(struct ast_channel *ast, int condition)
        case AST_CONTROL_BUSY:
                if (ast->_state != AST_STATE_UP) {
                        transmit_response(p, "486 Busy Here", &p->initreq);
-                       ast_set_flag(p, SIP_ALREADYGONE);       
+                       ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                        ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
                        break;
                }
@@ -2830,23 +2831,27 @@ static int sip_indicate(struct ast_channel *ast, int condition)
        case AST_CONTROL_CONGESTION:
                if (ast->_state != AST_STATE_UP) {
                        transmit_response(p, "503 Service Unavailable", &p->initreq);
-                       ast_set_flag(p, SIP_ALREADYGONE);       
+                       ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                        ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
                        break;
                }
                res = -1;
                break;
        case AST_CONTROL_PROCEEDING:
-               if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
+               if ((ast->_state != AST_STATE_UP) &&
+                   !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
+                   !ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                        transmit_response(p, "100 Trying", &p->initreq);
                        break;
                }
                res = -1;
                break;
        case AST_CONTROL_PROGRESS:
-               if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
+               if ((ast->_state != AST_STATE_UP) &&
+                   !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
+                   !ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                        transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, XMIT_UNRELIABLE);
-                       ast_set_flag(p, SIP_PROGRESS_SENT);     
+                       ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);  
                        break;
                }
                res = -1;
@@ -2862,7 +2867,7 @@ static int sip_indicate(struct ast_channel *ast, int condition)
                res = -1;
                break;
        case AST_CONTROL_VIDUPDATE:     /* Request a video frame update */
-               if (p->vrtp && !ast_test_flag(p, SIP_NOVIDEO)) {
+               if (p->vrtp && !ast_test_flag(&p->flags[0], SIP_NOVIDEO)) {
                        transmit_info_with_vidupdate(p);
                        /* ast_rtcp_send_h261fur(p->vrtp); */
                        res = 0;
@@ -2923,7 +2928,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
        else
                ast_string_field_build(tmp, name, "SIP/%s-%08x", i->fromdomain, (int)(long)(i));
 
-       if (ast_test_flag(i, SIP_DTMF) ==  SIP_DTMF_INBAND) {
+       if (ast_test_flag(&i->flags[0], SIP_DTMF) ==  SIP_DTMF_INBAND) {
                i->vad = ast_dsp_new();
                ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
                if (global_relaxdtmf)
@@ -3128,7 +3133,8 @@ static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p
                f = &ast_null_frame;
        }
        /* Don't forward RFC2833 if we're not supposed to */
-       if (f && (f->frametype == AST_FRAME_DTMF) && (ast_test_flag(p, SIP_DTMF) != SIP_DTMF_RFC2833))
+       if (f && (f->frametype == AST_FRAME_DTMF) &&
+           (ast_test_flag(&p->flags[0], SIP_DTMF) != SIP_DTMF_RFC2833))
                return &ast_null_frame;
 
        if (p->owner) {
@@ -3141,7 +3147,7 @@ static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p
                                ast_set_read_format(p->owner, p->owner->readformat);
                                ast_set_write_format(p->owner, p->owner->writeformat);
                        }
-                       if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_INBAND) && p->vad) {
+                       if ((ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_INBAND) && p->vad) {
                                f = ast_dsp_process(p->owner, p->vad, f);
                                if (option_debug && f && (f->frametype == AST_FRAME_DTMF)) 
                                        ast_log(LOG_DEBUG, "* Detected inband DTMF '%c'\n", f->subclass);
@@ -3244,8 +3250,8 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
                memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
        }
        
-       ast_copy_flags(p, &global_flags, SIP_FLAGS_TO_COPY);
-       ast_copy_flags((&p->flags_page2),(&global_flags_page2), SIP_PAGE2_FLAGS_TO_COPY);
+       ast_copy_flags(&p->flags[0], &global_flags[0], SIP_FLAGS_TO_COPY);
+       ast_copy_flags(&p->flags[1], &global_flags[1], SIP_PAGE2_FLAGS_TO_COPY);
 
        p->branch = thread_safe_rand(); 
        make_our_tag(p->tag, sizeof(p->tag));
@@ -3254,10 +3260,11 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
 
        if (sip_methods[intended_method].need_rtp) {
                p->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
-               if (ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT))
+               if (ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT))
                        p->vrtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
-               if (!p->rtp || (ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && !p->vrtp)) {
-                       ast_log(LOG_WARNING, "Unable to create RTP audio %s session: %s\n", ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) ? "and video" : "", strerror(errno));
+               if (!p->rtp || (ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && !p->vrtp)) {
+                       ast_log(LOG_WARNING, "Unable to create RTP audio %s session: %s\n",
+                               ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) ? "and video" : "", strerror(errno));
                        ast_mutex_destroy(&p->lock);
                        if (p->chanvars) {
                                ast_variables_destroy(p->chanvars);
@@ -3277,12 +3284,12 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
 
        if (useglobal_nat && sin) {
                /* Setup NAT structure according to global settings if we have an address */
-               ast_copy_flags(p, &global_flags, SIP_NAT);
+               ast_copy_flags(&p->flags[0], &global_flags[0], SIP_NAT);
                memcpy(&p->recv, sin, sizeof(p->recv));
                if (p->rtp)
-                       ast_rtp_setnat(p->rtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
+                       ast_rtp_setnat(p->rtp, ast_test_flag(&p->flags[0], SIP_NAT_ROUTE));
                if (p->vrtp)
-                       ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
+                       ast_rtp_setnat(p->vrtp, ast_test_flag(&p->flags[0], SIP_NAT_ROUTE));
        }
 
        if (p->method != SIP_REGISTER)
@@ -3295,7 +3302,8 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
        /* Assign default music on hold class */
        ast_string_field_set(p, musicclass, default_musicclass);
        p->capability = global_capability;
-       if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
+       if ((ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833) ||
+           (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO))
                p->noncodeccapability |= AST_RTP_DTMF;
        ast_string_field_set(p, context, default_context);
 
@@ -3637,7 +3645,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
                return -1;
        }
        sdpLineNum_iterator_init(&iterator);
-       ast_set_flag(p, SIP_NOVIDEO);   
+       ast_set_flag(&p->flags[0], SIP_NOVIDEO);        
        while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
                int found = 0;
                if ((sscanf(m, "audio %d/%d RTP/AVP %n", &x, &y, &len) == 2) ||
@@ -3663,7 +3671,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
 
                if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
                        found = 1;
-                       ast_clear_flag(p, SIP_NOVIDEO); 
+                       ast_clear_flag(&p->flags[0], SIP_NOVIDEO);      
                        vportno = x;
                        /* Scan through the RTP payload types specified in a "m=" line: */
                        codecs = m + len;
@@ -3768,13 +3776,13 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
        p->peercapability = (peercapability | vpeercapability);
        p->noncodeccapability = noncodeccapability & peernoncodeccapability;
        
-       if (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO) {
-               ast_clear_flag(p, SIP_DTMF);
+       if (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO) {
+               ast_clear_flag(&p->flags[0], SIP_DTMF);
                if (p->noncodeccapability & AST_RTP_DTMF) {
                        /* XXX Would it be reasonable to drop the DSP at this point? XXX */
-                       ast_set_flag(p, SIP_DTMF_RFC2833);
+                       ast_set_flag(&p->flags[0], SIP_DTMF_RFC2833);
                } else {
-                       ast_set_flag(p, SIP_DTMF_INBAND);
+                       ast_set_flag(&p->flags[0], SIP_DTMF_INBAND);
                }
        }
        
@@ -3835,7 +3843,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
        if (sin.sin_addr.s_addr && !sendonly) {
                append_history(p, "Unhold", "%s", req->data);
 
-               if (global_callevents && ast_test_flag(p, SIP_CALL_ONHOLD)) {
+               if (global_callevents && ast_test_flag(&p->flags[0], SIP_CALL_ONHOLD)) {
                        manager_event(EVENT_FLAG_CALL, "Unhold",
                                "Channel: %s\r\n"
                                "Uniqueid: %s\r\n",
@@ -3843,19 +3851,19 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
                                p->owner->uniqueid);
 
                }
-               ast_clear_flag(p, SIP_CALL_ONHOLD);
+               ast_clear_flag(&p->flags[0], SIP_CALL_ONHOLD);
        } else {
                /* No address for RTP, we're on hold */
                append_history(p, "Hold", "%s", req->data);
 
-               if (global_callevents && !ast_test_flag(p, SIP_CALL_ONHOLD)) {
+               if (global_callevents && !ast_test_flag(&p->flags[0], SIP_CALL_ONHOLD)) {
                        manager_event(EVENT_FLAG_CALL, "Hold",
                                "Channel: %s\r\n"
                                "Uniqueid: %s\r\n",
                                p->owner->name, 
                                p->owner->uniqueid);
                }
-               ast_set_flag(p, SIP_CALL_ONHOLD);
+               ast_set_flag(&p->flags[0], SIP_CALL_ONHOLD);
        }
 
        return 0;
@@ -4006,7 +4014,7 @@ static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct s
                                if (rport && *(rport+6) == '=') 
                                        rport = NULL;           /* We already have a parameter to rport */
 
-                               if (rport && (ast_test_flag(p, SIP_NAT) == SIP_NAT_ALWAYS)) {
+                               if (rport && (ast_test_flag(&p->flags[0], SIP_NAT) == SIP_NAT_ALWAYS)) {
                                        /* We need to add received port - rport */
                                        ast_copy_string(tmp, oh, sizeof(tmp));
 
@@ -4182,9 +4190,9 @@ static int respprep(struct sip_request *resp, struct sip_pvt *p, const char *msg
        if (!strcasestr(ot, "tag=") && strncmp(msg, "100", 3)) {
                /* Add the proper tag if we don't have it already.  If they have specified
                   their tag, use it.  Otherwise, use our own tag */
-               if (!ast_strlen_zero(p->theirtag) && ast_test_flag(p, SIP_OUTGOING))
+               if (!ast_strlen_zero(p->theirtag) && ast_test_flag(&p->flags[0], SIP_OUTGOING))
                        snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
-               else if (p->tag && !ast_test_flag(p, SIP_OUTGOING))
+               else if (p->tag && !ast_test_flag(&p->flags[0], SIP_OUTGOING))
                        snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->tag);
                else {
                        ast_copy_string(newto, ot, sizeof(newto));
@@ -4263,7 +4271,7 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, in
                c = p->uri;
        } else {
                /* We have no URI, use To: or From:  header as URI (depending on direction) */
-               ast_copy_string(stripped, get_header(orig, (ast_test_flag(p, SIP_OUTGOING)) ? "To" : "From"),
+               ast_copy_string(stripped, get_header(orig, (ast_test_flag(&p->flags[0], SIP_OUTGOING)) ? "To" : "From"),
                                sizeof(stripped));
                c = get_in_brackets(stripped);
                n = strchr(c, ';');
@@ -4291,16 +4299,16 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, in
        if (!strcasestr(ot, "tag=") && sipmethod != SIP_CANCEL) {
                /* Add the proper tag if we don't have it already.  If they have specified
                   their tag, use it.  Otherwise, use our own tag */
-               if (ast_test_flag(p, SIP_OUTGOING) && !ast_strlen_zero(p->theirtag))
+               if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && !ast_strlen_zero(p->theirtag))
                        snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
-               else if (!ast_test_flag(p, SIP_OUTGOING))
+               else if (!ast_test_flag(&p->flags[0], SIP_OUTGOING))
                        snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->tag);
                else
                        snprintf(newto, sizeof(newto), "%s", ot);
                ot = newto;
        }
 
-       if (ast_test_flag(p, SIP_OUTGOING)) {
+       if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                add_header(req, "From", of);
                add_header(req, "To", ot);
        } else {
@@ -4588,7 +4596,9 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
        snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, ast_inet_ntoa(iabuf, sizeof(iabuf), dest.sin_addr));
        snprintf(s, sizeof(s), "s=session\r\n");
        snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", ast_inet_ntoa(iabuf, sizeof(iabuf), dest.sin_addr));
-       if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+       if ((p->vrtp) &&
+           (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
+           (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
                snprintf(b, sizeof(b), "b=CT:%d\r\n", p->maxcallbitrate);       
        snprintf(t, sizeof(t), "t=0 0\r\n");
 
@@ -4635,7 +4645,9 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
        }
 
        /* Now send any other common codecs, and non-codec formats: */
-       for (x = 1; x <= ((ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
+       for (x = 1;
+            x <= ((ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO);
+            x <<= 1) {
                if (!(capability & x))
                        continue;
 
@@ -4673,7 +4685,9 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
        ast_build_string(&m_video_next, &m_video_left, "\r\n");
 
        len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m_audio) + strlen(a_audio);
-       if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+       if ((p->vrtp) &&
+           (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
+           (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
                len += strlen(m_video) + strlen(a_video) + strlen(b);
 
        add_header(resp, "Content-Type", "application/sdp");
@@ -4682,12 +4696,16 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
        add_line(resp, o);
        add_line(resp, s);
        add_line(resp, c);
-       if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+       if ((p->vrtp) &&
+           (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
+           (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
                add_line(resp, b);
        add_line(resp, t);
        add_line(resp, m_audio);
        add_line(resp, a_audio);
-       if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
+       if ((p->vrtp) &&
+           (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
+           (capability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
                add_line(resp, m_video);
                add_line(resp, a_video);
        }
@@ -4791,7 +4809,7 @@ static int determine_firstline_parts( struct sip_request *req )
 static int transmit_reinvite_with_sdp(struct sip_pvt *p)
 {
        struct sip_request req;
-       if (ast_test_flag(p, SIP_REINVITE_UPDATE))
+       if (ast_test_flag(&p->flags[0], SIP_REINVITE_UPDATE))
                reqprep(&req, p, SIP_UPDATE, 0, 1);
        else 
                reqprep(&req, p, SIP_INVITE, 0, 1);
@@ -4806,7 +4824,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p)
        if (sip_debug_test_pvt(p))
                ast_verbose("%d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
        p->lastinvite = p->ocseq;
-       ast_set_flag(p, SIP_OUTGOING);
+       ast_set_flag(&p->flags[0], SIP_OUTGOING);
        return send_request(p, &req, 1, p->ocseq);
 }
 
@@ -4932,7 +4950,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
        int x;
        char urioptions[256]="";
 
-       if (ast_test_flag(p, SIP_USEREQPHONE)) {
+       if (ast_test_flag(&p->flags[0], SIP_USEREQPHONE)) {
                char onlydigits = TRUE;
                x=0;
 
@@ -4964,7 +4982,8 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
                n = p->owner->cid.cid_name;
        }
        /* if we are not sending RPID and user wants his callerid restricted */
-       if (!ast_test_flag(p, SIP_SENDRPID) && ((p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED)) {
+       if (!ast_test_flag(&p->flags[0], SIP_SENDRPID) &&
+           ((p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED)) {
                l = CALLERID_UNKNOWN;
                n = l;
        }
@@ -5037,7 +5056,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
        /* SLD: FIXME?: do Route: here too?  I think not cos this is the first request.
         * OTOH, then we won't have anything in p->route anyway */
        /* Build Remote Party-ID and From */
-       if (ast_test_flag(p, SIP_SENDRPID) && (sipmethod == SIP_INVITE)) {
+       if (ast_test_flag(&p->flags[0], SIP_SENDRPID) && (sipmethod == SIP_INVITE)) {
                build_rpid(p);
                add_header(req, "From", p->rpid_from);
        } else {
@@ -5482,7 +5501,7 @@ static int sip_reg_timeout(void *data)
                if (p->registry)
                        ASTOBJ_UNREF(p->registry, sip_registry_destroy);
                r->call = NULL;
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                /* Pretend to ACK anything just in case */
                __sip_pretend_ack(p);
        }
@@ -5562,7 +5581,7 @@ static int transmit_register(struct sip_registry *r, int sipmethod, char *auth,
                ast_string_field_set(r, callid, p->callid);
                if (r->portno)
                        p->sa.sin_port = htons(r->portno);
-               ast_set_flag(p, SIP_OUTGOING);  /* Registration is outgoing call */
+               ast_set_flag(&p->flags[0], SIP_OUTGOING);       /* Registration is outgoing call */
                r->call=p;                      /* Save pointer to SIP packet */
                p->registry = ASTOBJ_REF(r);    /* Add pointer to registry in packet */
                if (!ast_strlen_zero(r->secret))        /* Secret (password) */
@@ -5707,7 +5726,7 @@ static int transmit_refer(struct sip_pvt *p, const char *dest)
        char *of, *c;
        char referto[256];
 
-       if (ast_test_flag(p, SIP_OUTGOING)) 
+       if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) 
                of = get_header(&p->initreq, "To");
        else
                of = get_header(&p->initreq, "From");
@@ -5807,8 +5826,8 @@ static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int seqn
 /*! \brief Remove registration data from realtime database and AST/DB when registration expires */
 static void destroy_association(struct sip_peer *peer)
 {
-       if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE)) {
-               if (ast_test_flag(&(peer->flags_page2), SIP_PAGE2_RT_FROMCONTACT)) {
+       if (!ast_test_flag(&global_flags[1], SIP_PAGE2_IGNOREREGEXPIRE)) {
+               if (ast_test_flag(&peer->flags[1], SIP_PAGE2_RT_FROMCONTACT)) {
                        ast_update_realtime("sippeers", "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "username", "", NULL);
                } else {
                        ast_db_del("SIP/Registry", peer->name);
@@ -5829,7 +5848,8 @@ static int expire_register(void *data)
        register_peer_exten(peer, FALSE);
        peer->expire = -1;
        ast_device_state_changed("SIP/%s", peer->name);
-       if (ast_test_flag((&peer->flags_page2), SIP_PAGE2_SELFDESTRUCT) || ast_test_flag((&peer->flags_page2), SIP_PAGE2_RTAUTOCLEAR)) {
+       if (ast_test_flag(&peer->flags[1], SIP_PAGE2_SELFDESTRUCT) ||
+           ast_test_flag(&peer->flags[1], SIP_PAGE2_RTAUTOCLEAR)) {
                peer = ASTOBJ_CONTAINER_UNLINK(&peerl, peer);
                ASTOBJ_UNREF(peer, sip_destroy_peer);
        }
@@ -5857,7 +5877,7 @@ static void reg_source_db(struct sip_peer *peer)
        int port;
        char *scan, *addr, *port_str, *expiry_str, *username, *contact;
 
-       if (ast_test_flag(&(peer->flags_page2), SIP_PAGE2_RT_FROMCONTACT)) 
+       if (ast_test_flag(&peer->flags[1], SIP_PAGE2_RT_FROMCONTACT)) 
                return;
        if (ast_db_get("SIP/Registry", peer->name, data, sizeof(data)))
                return;
@@ -5958,7 +5978,7 @@ static int parse_ok_contact(struct sip_pvt *pvt, struct sip_request *req)
 
        memcpy(&oldsin, &pvt->sa, sizeof(oldsin));
 
-       if (!(ast_test_flag(pvt, SIP_NAT) & SIP_NAT_ROUTE)) {
+       if (!ast_test_flag(&pvt->flags[0], SIP_NAT_ROUTE)) {
                /* XXX This could block for a long time XXX */
                /* We should only do this if it's a name, not an IP */
                hp = ast_gethostbyname(n, &ahp);
@@ -6081,7 +6101,7 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
        } else
                port = DEFAULT_SIP_PORT;
        memcpy(&oldsin, &p->addr, sizeof(oldsin));
-       if (!(ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)) {
+       if (!ast_test_flag(&p->flags[0], SIP_NAT_ROUTE)) {
                /* XXX This could block for a long time XXX */
                hp = ast_gethostbyname(n, &ahp);
                if (!hp)  {
@@ -6108,13 +6128,13 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
                expiry = max_expiry;
        if (expiry < min_expiry)
                expiry = min_expiry;
-       if (!ast_test_flag(p, SIP_REALTIME))
+       if (!ast_test_flag(&p->flags[0], SIP_REALTIME))
                p->expire = ast_sched_add(sched, (expiry + 10) * 1000, expire_register, p);
        else
                p->expire = -1;
        pvt->expiry = expiry;
        snprintf(data, sizeof(data), "%s:%d:%d:%s:%s", ast_inet_ntoa(iabuf, sizeof(iabuf), p->addr.sin_addr), ntohs(p->addr.sin_port), expiry, p->username, p->fullcontact);
-       if (!ast_test_flag((&p->flags_page2), SIP_PAGE2_RT_FROMCONTACT)) 
+       if (!ast_test_flag(&p->flags[1], SIP_PAGE2_RT_FROMCONTACT)) 
                ast_db_put("SIP/Registry", p->name, data);
        manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: SIP/%s\r\nPeerStatus: Registered\r\n", p->name);
        if (inaddrcmp(&p->addr, &oldsin)) {
@@ -6298,7 +6318,7 @@ static int check_auth(struct sip_pvt *p, struct sip_request *req, const char *us
        /* Always OK if no secret */
        if (ast_strlen_zero(secret) && ast_strlen_zero(md5secret)
 #ifdef OSP_SUPPORT
-           && !ast_test_flag(p, SIP_OSPAUTH)
+           && !ast_test_flag(&p->flags[0], SIP_OSPAUTH)
            && global_allowguest != 2
 #endif
                )
@@ -6317,7 +6337,7 @@ static int check_auth(struct sip_pvt *p, struct sip_request *req, const char *us
                if (option_debug)
                        ast_log (LOG_DEBUG, "Checking OSP Authentication!\n");
                osptoken = get_header (req, "P-OSP-Auth-Token");
-               switch (ast_test_flag (p, SIP_OSPAUTH)) {
+               switch (ast_test_flag(&p->flags[0], SIP_OSPAUTH)) {
                        case SIP_OSPAUTH_NO:
                                break;
                        case SIP_OSPAUTH_GATEWAY:
@@ -6561,10 +6581,10 @@ static int register_verify(struct sip_pvt *p, struct sockaddr_in *sin, struct si
                        ASTOBJ_UNREF(peer, sip_destroy_peer);
        }
        if (peer) {
-               if (!ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)) {
+               if (!ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC)) {
                        ast_log(LOG_ERROR, "Peer '%s' is trying to register, but not configured as host=dynamic\n", peer->name);
                } else {
-                       ast_copy_flags(p, peer, SIP_NAT);
+                       ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_NAT);
                        transmit_response(p, "100 Trying", req);
                        if (!(res = check_auth(p, req, peer->name, peer->secret, peer->md5secret, SIP_REGISTER, uri, XMIT_UNRELIABLE, ignore))) {
                                sip_cancel_destroy(p);
@@ -6996,7 +7016,7 @@ static int check_via(struct sip_pvt *p, struct sip_request *req)
        /* Check for rport */
        c = strstr(via, ";rport");
        if (c && (c[6] != '=')) /* rport query, not answer */
-               ast_set_flag(p, SIP_NAT_ROUTE);
+               ast_set_flag(&p->flags[0], SIP_NAT_ROUTE);
 
        c = strchr(via, ';');
        if (c) 
@@ -7024,7 +7044,7 @@ static int check_via(struct sip_pvt *p, struct sip_request *req)
                p->sa.sin_port = htons(pt ? atoi(pt) : DEFAULT_SIP_PORT);
 
                if (sip_debug_test_pvt(p)) {
-                       c = (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE) ? "NAT" : "non-NAT";
+                       c = (ast_test_flag(&p->flags[0], SIP_NAT) & SIP_NAT_ROUTE) ? "NAT" : "non-NAT";
                        ast_verbose("Sending to %s : %d (%s)\n", ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr), ntohs(p->sa.sin_port), c);
                }
        }
@@ -7122,6 +7142,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
        char calleridname[50];
        int debug=sip_debug_test_addr(sin);
        struct ast_variable *tmpvar = NULL, *v = NULL;
+       int usenatroute;
 
        /* Terminate URI */
        t = uri;
@@ -7184,8 +7205,8 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
 
        /* Find user based on user name in the from header */
        if (user && ast_apply_ha(user->ha, sin)) {
-               ast_copy_flags(p, user, SIP_FLAGS_TO_COPY);
-               ast_copy_flags(p, &user->flags_page2, SIP_PAGE2_FLAGS_TO_COPY);
+               ast_copy_flags(&p->flags[0], &user->flags[0], SIP_FLAGS_TO_COPY);
+               ast_copy_flags(&p->flags[1], &user->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
                /* copy channel vars */
                for (v = user->chanvars ; v ; v = v->next) {
                        if ((tmpvar = ast_variable_new(v->name, v->value))) {
@@ -7195,7 +7216,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                }
                p->prefs = user->prefs;
                /* replace callerid if rpid found, and not restricted */
-               if (!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) {
+               if (!ast_strlen_zero(rpid_num) && ast_test_flag(&p->flags[0], SIP_TRUSTRPID)) {
                        char *tmp;
                        if (*calleridname)
                                ast_string_field_set(p, cid_name, calleridname);
@@ -7208,27 +7229,30 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                        }
                }
 
+               
+               usenatroute = ast_test_flag(&p->flags[0], SIP_NAT_ROUTE);
+
                if (p->rtp) {
                        if (option_debug)
-                               ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
-                       ast_rtp_setnat(p->rtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
+                               ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", usenatroute);
+                       ast_rtp_setnat(p->rtp, usenatroute);
                }
                if (p->vrtp) {
                        if (option_debug)
-                               ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
-                       ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
+                               ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", usenatroute);
+                       ast_rtp_setnat(p->vrtp, usenatroute);
                }
                if (!(res = check_auth(p, req, user->name, user->secret, user->md5secret, sipmethod, uri, reliable, ignore))) {
                        sip_cancel_destroy(p);
-                       ast_copy_flags(p, user, SIP_FLAGS_TO_COPY);
-                       ast_copy_flags((&p->flags_page2),(&user->flags_page2), SIP_PAGE2_FLAGS_TO_COPY);
+                       ast_copy_flags(&p->flags[0], &user->flags[1], SIP_FLAGS_TO_COPY);
+                       ast_copy_flags(&p->flags[1], &user->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
                        /* Copy SIP extensions profile from INVITE */
                        if (p->sipoptions)
                                user->sipoptions = p->sipoptions;
 
                        /* If we have a call limit, set flag */
                        if (user->call_limit)
-                               ast_set_flag(p, SIP_CALL_LIMIT);
+                               ast_set_flag(&p->flags[0], SIP_CALL_LIMIT);
                        if (!ast_strlen_zero(user->context))
                                ast_string_field_set(p, context, user->context);
                        if (!ast_strlen_zero(user->cid_num) && !ast_strlen_zero(p->cid_num)) {
@@ -7256,13 +7280,14 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                        p->capability = user->capability;
                        p->jointcapability = user->capability;
                        p->maxcallbitrate = user->maxcallbitrate;
-                       if (!ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
+                       if (!ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
                                ast_rtp_destroy(p->vrtp);
                                p->vrtp = NULL;
                        }
                        if (p->peercapability)
                                p->jointcapability &= p->peercapability;
-                       if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
+                       if ((ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833) ||
+                           (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO))
                                p->noncodeccapability |= AST_RTP_DTMF;
                        else
                                p->noncodeccapability &= ~AST_RTP_DTMF;
@@ -7294,14 +7319,15 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                        if (debug)
                                ast_verbose("Found peer '%s'\n", peer->name);
                        /* Take the peer */
-                       ast_copy_flags(p, peer, SIP_FLAGS_TO_COPY);
+                       ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
+                       ast_copy_flags(&p->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
 
                        /* Copy SIP extensions profile to peer */
                        if (p->sipoptions)
                                peer->sipoptions = p->sipoptions;
 
                        /* replace callerid if rpid found, and not restricted */
-                       if (!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) {
+                       if (!ast_strlen_zero(rpid_num) && ast_test_flag(&p->flags[0], SIP_TRUSTRPID)) {
                                char *tmp = ast_strdupa(rpid_num);
                                if (*calleridname)
                                        ast_string_field_set(p, cid_name, calleridname);
@@ -7312,13 +7338,14 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                                        ast_string_field_set(p, cid_num, rpid_num);
                                }
                        }
+                       usenatroute = ast_test_flag(&p->flags[0], SIP_NAT_ROUTE);
                        if (p->rtp) {
-                               ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
-                               ast_rtp_setnat(p->rtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
+                               ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", usenatroute);
+                               ast_rtp_setnat(p->rtp, usenatroute);
                        }
                        if (p->vrtp) {
-                               ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
-                               ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
+                               ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", usenatroute);
+                               ast_rtp_setnat(p->vrtp, usenatroute);
                        }
                        ast_string_field_set(p, peersecret, peer->secret);
                        ast_string_field_set(p, peermd5secret, peer->md5secret);
@@ -7326,16 +7353,17 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                        p->callingpres = peer->callingpres;
                        if (peer->maxms && peer->lastms)
                                p->timer_t1 = peer->lastms;
-                       if (ast_test_flag(peer, SIP_INSECURE_INVITE)) {
+                       if (ast_test_flag(&peer->flags[0], SIP_INSECURE_INVITE)) {
                                /* Pretend there is no required authentication */
                                ast_string_field_free(p, peersecret);
                                ast_string_field_free(p, peermd5secret);
                        }
                        if (!(res = check_auth(p, req, peer->name, p->peersecret, p->peermd5secret, sipmethod, uri, reliable, ignore))) {
-                               ast_copy_flags(p, peer, SIP_FLAGS_TO_COPY);
+                               ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
+                               ast_copy_flags(&p->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
                                /* If we have a call limit, set flag */
                                if (peer->call_limit)
-                                       ast_set_flag(p, SIP_CALL_LIMIT);
+                                       ast_set_flag(&p->flags[0], SIP_CALL_LIMIT);
                                ast_string_field_set(p, peername, peer->name);
                                ast_string_field_set(p, authname, peer->name);
 
@@ -7380,11 +7408,12 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                                if (p->peercapability)
                                        p->jointcapability &= p->peercapability;
                                p->maxcallbitrate = peer->maxcallbitrate;
-                               if (!ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
+                               if (!ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
                                        ast_rtp_destroy(p->vrtp);
                                        p->vrtp = NULL;
                                }
-                               if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
+                               if ((ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833) ||
+                                   (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO))
                                        p->noncodeccapability |= AST_RTP_DTMF;
                                else
                                        p->noncodeccapability &= ~AST_RTP_DTMF;
@@ -7399,7 +7428,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                                res = -1;  /* we don't want any guests, authentication will fail */
 #ifdef OSP_SUPPORT                     
                        else if (global_allowguest == 2) {
-                               ast_copy_flags(p, &global_flags, SIP_OSPAUTH);
+                               ast_copy_flags(&p->flags[0], &global_flags[0], SIP_OSPAUTH);
                                res = check_auth(p, req, "", "", "", sipmethod, uri, reliable, ignore); 
                        }
 #endif
@@ -7454,14 +7483,14 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req)
        content_type = get_header(req, "Content-Type");
        if (strcmp(content_type, "text/plain")) { /* No text/plain attachment */
                transmit_response(p, "415 Unsupported Media Type", req); /* Good enough, or? */
-               ast_set_flag(p, SIP_NEEDDESTROY);
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
                return;
        }
 
        if (get_msg_text(buf, sizeof(buf), req)) {
                ast_log(LOG_WARNING, "Unable to retrieve text from %s\n", p->callid);
                transmit_response(p, "202 Accepted", req);
-               ast_set_flag(p, SIP_NEEDDESTROY);
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
                return;
        }
 
@@ -7480,7 +7509,7 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req)
                ast_log(LOG_WARNING,"Received message to %s from %s, dropped it...\n  Content-Type:%s\n  Message: %s\n", get_header(req,"To"), get_header(req,"From"), content_type, buf);
                transmit_response(p, "405 Method Not Allowed", req); /* Good enough, or? */
        }
-       ast_set_flag(p, SIP_NEEDDESTROY);
+       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
        return;
 }
 
@@ -7608,7 +7637,7 @@ static int sip_show_users(int fd, int argc, char *argv[])
                        iterator->accountcode,
                        iterator->context,
                        iterator->ha ? "Yes" : "No",
-                       nat2str(ast_test_flag(iterator, SIP_NAT)));
+                       nat2str(ast_test_flag(&iterator->flags[0], SIP_NAT)));
                ASTOBJ_UNLOCK(iterator);
        } while (0)
        );
@@ -7736,21 +7765,21 @@ static int _sip_show_peers(int fd, int *total, struct mansession *s, struct mess
                
                snprintf(srch, sizeof(srch), FORMAT, name,
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "(Unspecified)",
-                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? " D " : "   ",     /* Dynamic or not? */
-                       (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? " N " : "   ",     /* NAT=yes? */
+                       ast_test_flag(&iterator->flags[1], SIP_PAGE2_DYNAMIC) ? " D " : "   ",  /* Dynamic or not? */
+                       ast_test_flag(&iterator->flags[0], SIP_NAT_ROUTE) ? " N " : "   ",      /* NAT=yes? */
                        iterator->ha ? " A " : "   ",   /* permit/deny */
                        ntohs(iterator->addr.sin_port), status,
-                       realtimepeers ? (ast_test_flag(iterator, SIP_REALTIME) ? "Cached RT":"") : "");
+                       realtimepeers ? (ast_test_flag(&iterator->flags[0], SIP_REALTIME) ? "Cached RT":"") : "");
 
                if (!s)  {/* Normal CLI list */
                        ast_cli(fd, FORMAT, name, 
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "(Unspecified)",
-                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? " D " : "   ",     /* Dynamic or not? */
-                       (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? " N " : "   ",     /* NAT=yes? */
+                       ast_test_flag(&iterator->flags[1], SIP_PAGE2_DYNAMIC) ? " D " : "   ",  /* Dynamic or not? */
+                       ast_test_flag(&iterator->flags[0], SIP_NAT_ROUTE) ? " N " : "   ",      /* NAT=yes? */
                        iterator->ha ? " A " : "   ",       /* permit/deny */
                        
                        ntohs(iterator->addr.sin_port), status,
-                       realtimepeers ? (ast_test_flag(iterator, SIP_REALTIME) ? "Cached RT":"") : "");
+                       realtimepeers ? (ast_test_flag(&iterator->flags[0], SIP_REALTIME) ? "Cached RT":"") : "");
                } else {        /* Manager format */
                        /* The names here need to be the same as other channels */
                        astman_append(s, 
@@ -7770,12 +7799,12 @@ static int _sip_show_peers(int fd, int *total, struct mansession *s, struct mess
                        iterator->name, 
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "-none-",
                        ntohs(iterator->addr.sin_port), 
-                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? "yes" : "no",      /* Dynamic or not? */
-                       (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? "yes" : "no",      /* NAT=yes? */
-                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_VIDEOSUPPORT) ? "yes" : "no", /* VIDEOSUPPORT=yes? */
+                       ast_test_flag(&iterator->flags[1], SIP_PAGE2_DYNAMIC) ? "yes" : "no",   /* Dynamic or not? */
+                       ast_test_flag(&iterator->flags[0], SIP_NAT_ROUTE) ? "yes" : "no",       /* NAT=yes? */
+                       ast_test_flag(&iterator->flags[1], SIP_PAGE2_VIDEOSUPPORT) ? "yes" : "no",      /* VIDEOSUPPORT=yes? */
                        iterator->ha ? "yes" : "no",       /* permit/deny */
                        status,
-                       realtimepeers ? (ast_test_flag(iterator, SIP_REALTIME) ? "yes":"no") : "no");
+                       realtimepeers ? (ast_test_flag(&iterator->flags[0], SIP_REALTIME) ? "yes":"no") : "no");
                }
 
                ASTOBJ_UNLOCK(iterator);
@@ -7932,7 +7961,7 @@ static int sip_prune_realtime(int fd, int argc, char *argv[])
                                        ASTOBJ_UNLOCK(iterator);
                                        continue;
                                };
-                               if (ast_test_flag((&iterator->flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
+                               if (ast_test_flag(&iterator->flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
                                        ASTOBJ_MARK(iterator);
                                        pruned++;
                                }
@@ -7955,7 +7984,7 @@ static int sip_prune_realtime(int fd, int argc, char *argv[])
                                        ASTOBJ_UNLOCK(iterator);
                                        continue;
                                };
-                               if (ast_test_flag((&iterator->flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
+                               if (ast_test_flag(&iterator->flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
                                        ASTOBJ_MARK(iterator);
                                        pruned++;
                                }
@@ -7971,7 +8000,7 @@ static int sip_prune_realtime(int fd, int argc, char *argv[])
        } else {
                if (prunepeer) {
                        if ((peer = ASTOBJ_CONTAINER_FIND_UNLINK(&peerl, name))) {
-                               if (!ast_test_flag((&peer->flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
+                               if (!ast_test_flag(&peer->flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
                                        ast_cli(fd, "Peer '%s' is not a Realtime peer, cannot be pruned.\n", name);
                                        ASTOBJ_CONTAINER_LINK(&peerl, peer);
                                } else
@@ -7982,7 +8011,7 @@ static int sip_prune_realtime(int fd, int argc, char *argv[])
                }
                if (pruneuser) {
                        if ((user = ASTOBJ_CONTAINER_FIND_UNLINK(&userl, name))) {
-                               if (!ast_test_flag((&user->flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
+                               if (!ast_test_flag(&user->flags[1], SIP_PAGE2_RTCACHEFRIENDS)) {
                                        ast_cli(fd, "User '%s' is not a Realtime user, cannot be pruned.\n", name);
                                        ASTOBJ_CONTAINER_LINK(&userl, user);
                                } else
@@ -8121,7 +8150,7 @@ static int _sip_show_peer(int type, int fd, struct mansession *s, struct message
                ast_cli(fd,"\n\n");
                ast_cli(fd, "  * Name       : %s\n", peer->name);
                if (realtimepeers) {    /* Realtime is enabled */
-                       ast_cli(fd, "  Realtime peer: %s\n", ast_test_flag(peer, SIP_REALTIME) ? "Yes, cached" : "No");
+                       ast_cli(fd, "  Realtime peer: %s\n", ast_test_flag(&peer->flags[0], SIP_REALTIME) ? "Yes, cached" : "No");
                }
                ast_cli(fd, "  Secret       : %s\n", ast_strlen_zero(peer->secret)?"<Not set>":"<Set>");
                ast_cli(fd, "  MD5Secret    : %s\n", ast_strlen_zero(peer->md5secret)?"<Not set>":"<Set>");
@@ -8150,24 +8179,24 @@ static int _sip_show_peer(int type, int fd, struct mansession *s, struct message
                ast_cli(fd, "  VM Extension : %s\n", peer->vmexten);
                ast_cli(fd, "  LastMsgsSent : %d\n", peer->lastmsgssent);
                ast_cli(fd, "  Call limit   : %d\n", peer->call_limit);
-               ast_cli(fd, "  Dynamic      : %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)?"Yes":"No"));
+               ast_cli(fd, "  Dynamic      : %s\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC)?"Yes":"No"));
                ast_cli(fd, "  Callerid     : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
                ast_cli(fd, "  MaxCallBR    : %dkbps\n", peer->maxcallbitrate);
                ast_cli(fd, "  Expire       : %d\n", peer->expire);
-               ast_cli(fd, "  Insecure     : %s\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
-               ast_cli(fd, "  Nat          : %s\n", nat2str(ast_test_flag(peer, SIP_NAT)));
+               ast_cli(fd, "  Insecure     : %s\n", insecure2str(ast_test_flag(&peer->flags[0], SIP_INSECURE_PORT), ast_test_flag(&peer->flags[0], SIP_INSECURE_INVITE)));
+               ast_cli(fd, "  Nat          : %s\n", nat2str(ast_test_flag(&peer->flags[0], SIP_NAT)));
                ast_cli(fd, "  ACL          : %s\n", (peer->ha?"Yes":"No"));
-               ast_cli(fd, "  CanReinvite  : %s\n", (ast_test_flag(peer, SIP_CAN_REINVITE)?"Yes":"No"));
-               ast_cli(fd, "  PromiscRedir : %s\n", (ast_test_flag(peer, SIP_PROMISCREDIR)?"Yes":"No"));
-               ast_cli(fd, "  User=Phone   : %s\n", (ast_test_flag(peer, SIP_USEREQPHONE)?"Yes":"No"));
-               ast_cli(fd, "  Video Support: %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT)?"Yes":"No"));
-               ast_cli(fd, "  Trust RPID   : %s\n", (ast_test_flag(peer, SIP_TRUSTRPID) ? "Yes" : "No"));
-               ast_cli(fd, "  Send RPID    : %s\n", (ast_test_flag(peer, SIP_SENDRPID) ? "Yes" : "No"));
-               ast_cli(fd, "  Subscriptions: %s\n", ast_test_flag(&peer->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE) ? "Yes" : "No");
-               ast_cli(fd, "  Overlap dial : %s\n", ast_test_flag(&peer->flags_page2, SIP_PAGE2_ALLOWOVERLAP) ? "Yes" : "No");
+               ast_cli(fd, "  CanReinvite  : %s\n", ast_test_flag(&peer->flags[0], SIP_CAN_REINVITE)?"Yes":"No");
+               ast_cli(fd, "  PromiscRedir : %s\n", ast_test_flag(&peer->flags[0], SIP_PROMISCREDIR)?"Yes":"No");
+               ast_cli(fd, "  User=Phone   : %s\n", ast_test_flag(&peer->flags[0], SIP_USEREQPHONE)?"Yes":"No");
+               ast_cli(fd, "  Video Support: %s\n", ast_test_flag(&peer->flags[1], SIP_PAGE2_VIDEOSUPPORT)?"Yes":"No");
+               ast_cli(fd, "  Trust RPID   : %s\n", ast_test_flag(&peer->flags[0], SIP_TRUSTRPID) ? "Yes" : "No");
+               ast_cli(fd, "  Send RPID    : %s\n", ast_test_flag(&peer->flags[0], SIP_SENDRPID) ? "Yes" : "No");
+               ast_cli(fd, "  Subscriptions: %s\n", ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE) ? "Yes" : "No");
+               ast_cli(fd, "  Overlap dial : %s\n", ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWOVERLAP) ? "Yes" : "No");
 
                /* - is enumerated */
-               ast_cli(fd, "  DTMFmode     : %s\n", dtmfmode2str(ast_test_flag(peer, SIP_DTMF)));
+               ast_cli(fd, "  DTMFmode     : %s\n", dtmfmode2str(ast_test_flag(&peer->flags[0], SIP_DTMF)));
                ast_cli(fd, "  LastMsg      : %d\n", peer->lastmsg);
                ast_cli(fd, "  ToHost       : %s\n", peer->tohost);
                ast_cli(fd, "  Addr->IP     : %s Port %d\n",  peer->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port));
@@ -8233,19 +8262,19 @@ static int _sip_show_peer(int type, int fd, struct mansession *s, struct message
                astman_append(s, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
                astman_append(s, "Call limit: %d\r\n", peer->call_limit);
                astman_append(s, "MaxCallBR: %dkbps\r\n", peer->maxcallbitrate);
-               astman_append(s, "Dynamic: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)?"Y":"N"));
+               astman_append(s, "Dynamic: %s\r\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC)?"Y":"N"));
                astman_append(s, "Callerid: %s\r\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, ""));
                astman_append(s, "RegExpire: %ld seconds\r\n", ast_sched_when(sched,peer->expire));
-               astman_append(s, "SIP-AuthInsecure: %s\r\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
-               astman_append(s, "SIP-NatSupport: %s\r\n", nat2str(ast_test_flag(peer, SIP_NAT)));
+               astman_append(s, "SIP-AuthInsecure: %s\r\n", insecure2str(ast_test_flag(&peer->flags[0], SIP_INSECURE_PORT), ast_test_flag(&peer->flags[0], SIP_INSECURE_INVITE)));
+               astman_append(s, "SIP-NatSupport: %s\r\n", nat2str(ast_test_flag(&peer->flags[0], SIP_NAT)));
                astman_append(s, "ACL: %s\r\n", (peer->ha?"Y":"N"));
-               astman_append(s, "SIP-CanReinvite: %s\r\n", (ast_test_flag(peer, SIP_CAN_REINVITE)?"Y":"N"));
-               astman_append(s, "SIP-PromiscRedir: %s\r\n", (ast_test_flag(peer, SIP_PROMISCREDIR)?"Y":"N"));
-               astman_append(s, "SIP-UserPhone: %s\r\n", (ast_test_flag(peer, SIP_USEREQPHONE)?"Y":"N"));
-               astman_append(s, "SIP-VideoSupport: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT)?"Y":"N"));
+               astman_append(s, "SIP-CanReinvite: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_CAN_REINVITE)?"Y":"N"));
+               astman_append(s, "SIP-PromiscRedir: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_PROMISCREDIR)?"Y":"N"));
+               astman_append(s, "SIP-UserPhone: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_USEREQPHONE)?"Y":"N"));
+               astman_append(s, "SIP-VideoSupport: %s\r\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_VIDEOSUPPORT)?"Y":"N"));
 
                /* - is enumerated */
-               astman_append(s, "SIP-DTMFmode %s\r\n", dtmfmode2str(ast_test_flag(peer, SIP_DTMF)));
+               astman_append(s, "SIP-DTMFmode %s\r\n", dtmfmode2str(ast_test_flag(&peer->flags[0], SIP_DTMF)));
                astman_append(s, "SIPLastMsg: %d\r\n", peer->lastmsg);
                astman_append(s, "ToHost: %s\r\n", peer->tohost);
                astman_append(s, "Address-IP: %s\r\nAddress-Port: %d\r\n",  peer->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), peer->addr.sin_addr) : "", ntohs(peer->addr.sin_port));
@@ -8391,15 +8420,15 @@ static int sip_show_settings(int fd, int argc, char *argv[])
        ast_cli(fd, "----------------\n");
        ast_cli(fd, "  SIP Port:               %d\n", ntohs(bindaddr.sin_port));
        ast_cli(fd, "  Bindaddress:            %s\n", ast_inet_ntoa(tmp, sizeof(tmp), bindaddr.sin_addr));
-       ast_cli(fd, "  Videosupport:           %s\n", ast_test_flag((&global_flags_page2), SIP_PAGE2_VIDEOSUPPORT) ? "Yes" : "No");
+       ast_cli(fd, "  Videosupport:           %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_VIDEOSUPPORT) ? "Yes" : "No");
        ast_cli(fd, "  AutoCreatePeer:         %s\n", autocreatepeer ? "Yes" : "No");
        ast_cli(fd, "  Allow unknown access:   %s\n", global_allowguest ? "Yes" : "No");
-       ast_cli(fd, "  Allow subscriptions:    %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE) ? "Yes" : "No");
-       ast_cli(fd, "  Allow overlap dialing:  %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP) ? "Yes" : "No");
-       ast_cli(fd, "  Promsic. redir:         %s\n", ast_test_flag(&global_flags, SIP_PROMISCREDIR) ? "Yes" : "No");
+       ast_cli(fd, "  Allow subscriptions:    %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWSUBSCRIBE) ? "Yes" : "No");
+       ast_cli(fd, "  Allow overlap dialing:  %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP) ? "Yes" : "No");
+       ast_cli(fd, "  Promsic. redir:         %s\n", ast_test_flag(&global_flags[0], SIP_PROMISCREDIR) ? "Yes" : "No");
        ast_cli(fd, "  SIP domain support:     %s\n", AST_LIST_EMPTY(&domain_list) ? "No" : "Yes");
        ast_cli(fd, "  Call to non-local dom.: %s\n", allow_external_domains ? "Yes" : "No");
-       ast_cli(fd, "  URI user is phone no:   %s\n", ast_test_flag(&global_flags, SIP_USEREQPHONE) ? "Yes" : "No");
+       ast_cli(fd, "  URI user is phone no:   %s\n", ast_test_flag(&global_flags[0], SIP_USEREQPHONE) ? "Yes" : "No");
        ast_cli(fd, "  Our auth realm          %s\n", global_realm);
        ast_cli(fd, "  Realm. auth:            %s\n", authl ? "Yes": "No");
        ast_cli(fd, "  User Agent:             %s\n", global_useragent);
@@ -8443,11 +8472,11 @@ static int sip_show_settings(int fd, int argc, char *argv[])
        ast_cli(fd, "\nDefault Settings:\n");
        ast_cli(fd, "-----------------\n");
        ast_cli(fd, "  Context:                %s\n", default_context);
-       ast_cli(fd, "  Nat:                    %s\n", nat2str(ast_test_flag(&global_flags, SIP_NAT)));
-       ast_cli(fd, "  DTMF:                   %s\n", dtmfmode2str(ast_test_flag(&global_flags, SIP_DTMF)));
+       ast_cli(fd, "  Nat:                    %s\n", nat2str(ast_test_flag(&global_flags[0], SIP_NAT)));
+       ast_cli(fd, "  DTMF:                   %s\n", dtmfmode2str(ast_test_flag(&global_flags[0], SIP_DTMF)));
        ast_cli(fd, "  Qualify:                %d\n", default_qualify);
-       ast_cli(fd, "  Use ClientCode:         %s\n", ast_test_flag(&global_flags, SIP_USECLIENTCODE) ? "Yes" : "No");
-       ast_cli(fd, "  Progress inband:        %s\n", (ast_test_flag(&global_flags, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER) ? "Never" : (ast_test_flag(&global_flags, SIP_PROG_INBAND) == SIP_PROG_INBAND_NO) ? "No" : "Yes" );
+       ast_cli(fd, "  Use ClientCode:         %s\n", ast_test_flag(&global_flags[0], SIP_USECLIENTCODE) ? "Yes" : "No");
+       ast_cli(fd, "  Progress inband:        %s\n", (ast_test_flag(&global_flags[0], SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER) ? "Never" : (ast_test_flag(&global_flags[0], SIP_PROG_INBAND) == SIP_PROG_INBAND_NO) ? "No" : "Yes" );
        ast_cli(fd, "  Language:               %s\n", ast_strlen_zero(default_language) ? "(Defaults to English)" : default_language);
        ast_cli(fd, "  Musicclass:             %s\n", default_musicclass);
        ast_cli(fd, "  Voice Mail Extension:   %s\n", default_vmexten);
@@ -8458,9 +8487,9 @@ static int sip_show_settings(int fd, int argc, char *argv[])
                ast_cli(fd, "----------------------\n");
                ast_cli(fd, "  Realtime Peers:         %s\n", realtimepeers ? "Yes" : "No");
                ast_cli(fd, "  Realtime Users:         %s\n", realtimeusers ? "Yes" : "No");
-               ast_cli(fd, "  Cache Friends:          %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_RTCACHEFRIENDS) ? "Yes" : "No");
-               ast_cli(fd, "  Update:                 %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_RTUPDATE) ? "Yes" : "No");
-               ast_cli(fd, "  Ignore Reg. Expire:     %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_IGNOREREGEXPIRE) ? "Yes" : "No");
+               ast_cli(fd, "  Cache Friends:          %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS) ? "Yes" : "No");
+               ast_cli(fd, "  Update:                 %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_RTUPDATE) ? "Yes" : "No");
+               ast_cli(fd, "  Ignore Reg. Expire:     %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_IGNOREREGEXPIRE) ? "Yes" : "No");
                ast_cli(fd, "  Auto Clear:             %d\n", global_rtautoclear);
        }
        ast_cli(fd, "\n----\n");
@@ -8529,8 +8558,8 @@ static int __sip_show_channels(int fd, int argc, char *argv[], int subscriptions
                                cur->callid, 
                                cur->ocseq, cur->icseq, 
                                ast_getformatname(cur->owner ? cur->owner->nativeformats : 0), 
-                               ast_test_flag(cur, SIP_CALL_ONHOLD) ? "Yes" : "No",
-                               ast_test_flag(cur, SIP_NEEDDESTROY) ? "(d)" : "",
+                               ast_test_flag(&cur->flags[0], SIP_CALL_ONHOLD) ? "Yes" : "No",
+                               ast_test_flag(&cur->flags[0], SIP_NEEDDESTROY) ? "(d)" : "",
                                cur->lastmsg );
                        numchans++;
                }
@@ -8585,7 +8614,7 @@ static char *complete_sip_peer(const char *word, const int state, int flags2)
        ASTOBJ_CONTAINER_TRAVERSE(&peerl, !result, do {
                /* locking of the object is not required because only the name and flags are being compared */
                if (!strncasecmp(word, iterator->name, wordlen)) {
-                       if (flags2 && !ast_test_flag((&iterator->flags_page2), flags2))
+                       if (flags2 && !ast_test_flag(&iterator->flags[1], flags2))
                                continue;
                        if (++which > state) {
                                result = ast_strdup(iterator->name);
@@ -8623,7 +8652,7 @@ static char *complete_sip_user(const char *word, int state, int flags2)
        ASTOBJ_CONTAINER_TRAVERSE(&userl, !result, do {
                /* locking of the object is not required because only the name and flags are being compared */
                if (!strncasecmp(word, iterator->name, wordlen)) {
-                       if (flags2 && !ast_test_flag(&(iterator->flags_page2), flags2))
+                       if (flags2 && !ast_test_flag(&iterator->flags[1], flags2))
                                continue;
                        if (++which > state) {
                                result = ast_strdup(iterator->name);
@@ -8710,7 +8739,7 @@ static int sip_show_channel(int fd, int argc, char *argv[])
                                ast_cli(fd, "  * Subscription (type: %s)\n", subscription_type2str(cur->subscribed));
                        else
                                ast_cli(fd, "  * SIP Call\n");
-                       ast_cli(fd, "  Direction:              %s\n", ast_test_flag(cur, SIP_OUTGOING)?"Outgoing":"Incoming");
+                       ast_cli(fd, "  Direction:              %s\n", ast_test_flag(&cur->flags[0], SIP_OUTGOING)?"Outgoing":"Incoming");
                        ast_cli(fd, "  Call-ID:                %s\n", cur->callid);
                        ast_cli(fd, "  Our Codec Capability:   %d\n", cur->capability);
                        ast_cli(fd, "  Non-Codec Capability:   %d\n", cur->noncodeccapability);
@@ -8719,7 +8748,7 @@ static int sip_show_channel(int fd, int argc, char *argv[])
                        ast_cli(fd, "  Format                  %s\n", ast_getformatname(cur->owner ? cur->owner->nativeformats : 0) );
                        ast_cli(fd, "  Theoretical Address:    %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), cur->sa.sin_addr), ntohs(cur->sa.sin_port));
                        ast_cli(fd, "  Received Address:       %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), cur->recv.sin_addr), ntohs(cur->recv.sin_port));
-                       ast_cli(fd, "  NAT Support:            %s\n", nat2str(ast_test_flag(cur, SIP_NAT)));
+                       ast_cli(fd, "  NAT Support:            %s\n", nat2str(ast_test_flag(&cur->flags[0], SIP_NAT)));
                        ast_cli(fd, "  Audio IP:               %s %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), cur->redirip.sin_addr.s_addr ? cur->redirip.sin_addr : cur->ourip), cur->redirip.sin_addr.s_addr ? "(Outside bridge)" : "(local)" );
                        ast_cli(fd, "  Our Tag:                %s\n", cur->tag);
                        ast_cli(fd, "  Their Tag:              %s\n", cur->theirtag);
@@ -8732,11 +8761,11 @@ static int sip_show_channel(int fd, int argc, char *argv[])
                                ast_cli(fd, "  Original uri:           %s\n", cur->uri);
                        if (!ast_strlen_zero(cur->cid_num))
                                ast_cli(fd, "  Caller-ID:              %s\n", cur->cid_num);
-                       ast_cli(fd, "  Need Destroy:           %d\n", ast_test_flag(cur, SIP_NEEDDESTROY));
+                       ast_cli(fd, "  Need Destroy:           %d\n", ast_test_flag(&cur->flags[0], SIP_NEEDDESTROY));
                        ast_cli(fd, "  Last Message:           %s\n", cur->lastmsg);
-                       ast_cli(fd, "  Promiscuous Redir:      %s\n", ast_test_flag(cur, SIP_PROMISCREDIR) ? "Yes" : "No");
+                       ast_cli(fd, "  Promiscuous Redir:      %s\n", ast_test_flag(&cur->flags[0], SIP_PROMISCREDIR) ? "Yes" : "No");
                        ast_cli(fd, "  Route:                  %s\n", cur->route ? cur->route->hop : "N/A");
-                       ast_cli(fd, "  DTMF Mode:              %s\n", dtmfmode2str(ast_test_flag(cur, SIP_DTMF)));
+                       ast_cli(fd, "  DTMF Mode:              %s\n", dtmfmode2str(ast_test_flag(&cur->flags[0], SIP_DTMF)));
                        ast_cli(fd, "  SIP Options:            ");
                        if (cur->sipoptions) {
                                int x;
@@ -8842,7 +8871,7 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
        
                if (!p->owner) {        /* not a PBX call */
                        transmit_response(p, "481 Call leg/transaction does not exist", req);
-                       ast_set_flag(p, SIP_NEEDDESTROY);
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
                        return;
                }
 
@@ -8891,7 +8920,7 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
                return;
        } else if (!ast_strlen_zero(c = get_header(req, "X-ClientCode"))) {
                /* Client code (from SNOM phone) */
-               if (ast_test_flag(p, SIP_USECLIENTCODE)) {
+               if (ast_test_flag(&p->flags[0], SIP_USECLIENTCODE)) {
                        if (p->owner && p->owner->cdr)
                                ast_cdr_setuserfield(p->owner, c);
                        if (p->owner && ast_bridged_channel(p->owner) && ast_bridged_channel(p->owner)->cdr)
@@ -8937,7 +8966,7 @@ static int sip_do_debug_ip(int fd, int argc, char *argv[])
        else
                ast_cli(fd, "SIP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), debugaddr.sin_addr), port);
 
-       ast_set_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONSOLE);
+       ast_set_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONSOLE);
 
        return RESULT_SUCCESS;
 }
@@ -8956,7 +8985,7 @@ static int sip_do_debug_peer(int fd, int argc, char *argv[])
                        memcpy(&debugaddr.sin_addr, &peer->addr.sin_addr, sizeof(debugaddr.sin_addr));
                        debugaddr.sin_port = peer->addr.sin_port;
                        ast_cli(fd, "SIP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), debugaddr.sin_addr), ntohs(debugaddr.sin_port));
-                       ast_set_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONSOLE);
+                       ast_set_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONSOLE);
                } else
                        ast_cli(fd, "Unable to get IP address of peer '%s'\n", argv[3]);
                ASTOBJ_UNREF(peer,sip_destroy_peer);
@@ -8978,7 +9007,7 @@ static int sip_do_debug(int fd, int argc, char *argv[])
                        return sip_do_debug_peer(fd, argc, argv);
                else return RESULT_SHOWUSAGE;
        }
-       ast_set_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONSOLE);
+       ast_set_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONSOLE);
        memset(&debugaddr, 0, sizeof(debugaddr));
        if (oldsipdebug)
                ast_cli(fd, "SIP Debugging re-enabled\n");
@@ -9072,7 +9101,7 @@ static int sip_no_debug(int fd, int argc, char *argv[])
 {
        if (argc != 3)
                return RESULT_SHOWUSAGE;
-       ast_clear_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONSOLE);
+       ast_clear_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONSOLE);
        ast_cli(fd, "SIP Debugging Disabled\n");
        return RESULT_SUCCESS;
 }
@@ -9473,7 +9502,7 @@ static int function_sippeer(struct ast_channel *chan, char *cmd, char *data, cha
        } else  if (!strcasecmp(colname, "expire")) {
                snprintf(buf, len, "%d", peer->expire);
        } else  if (!strcasecmp(colname, "dynamic")) {
-               ast_copy_string(buf, (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) ? "yes" : "no"), len);
+               ast_copy_string(buf, (ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC) ? "yes" : "no"), len);
        } else  if (!strcasecmp(colname, "callerid_name")) {
                ast_copy_string(buf, peer->cid_name, len);
        } else  if (!strcasecmp(colname, "callerid_num")) {
@@ -9605,7 +9634,7 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req)
        e = strchr(s, ';');
        if (e)
                *e = '\0';
-       if (ast_test_flag(p, SIP_PROMISCREDIR)) {
+       if (ast_test_flag(&p->flags[0], SIP_PROMISCREDIR)) {
                if (!strncasecmp(s, "sip:", 4))
                        s += 4;
                e = strchr(s, '/');
@@ -9642,22 +9671,22 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req)
 static void check_pendings(struct sip_pvt *p)
 {
        /* Go ahead and send bye at this point */
-       if (ast_test_flag(p, SIP_PENDINGBYE)) {
+       if (ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
                transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1);
-               ast_set_flag(p, SIP_NEEDDESTROY);       
-               ast_clear_flag(p, SIP_NEEDREINVITE);    
-       } else if (ast_test_flag(p, SIP_NEEDREINVITE)) {
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
+               ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE); 
+       } else if (ast_test_flag(&p->flags[0], SIP_NEEDREINVITE)) {
                ast_log(LOG_DEBUG, "Sending pending reinvite on '%s'\n", p->callid);
                /* Didn't get to reinvite yet, so do it now */
                transmit_reinvite_with_sdp(p);
-               ast_clear_flag(p, SIP_NEEDREINVITE);    
+               ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE); 
        }
 }
 
 /*! \brief  handle_response_invite: Handle SIP response in dialogue */
 static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, struct sip_request *req, int ignore, int seqno)
 {
-       int outgoing = ast_test_flag(p, SIP_OUTGOING);
+       int outgoing = ast_test_flag(&p->flags[0], SIP_OUTGOING);
        
        if (option_debug > 3) {
                int reinvite = (p->owner && p->owner->_state == AST_STATE_UP);
@@ -9667,7 +9696,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                        ast_log(LOG_DEBUG, "SIP response %d to standard invite\n", resp);
        }
 
-       if (ast_test_flag(p, SIP_ALREADYGONE)) { /* This call is already gone */
+       if (ast_test_flag(&p->flags[0], SIP_ALREADYGONE)) { /* This call is already gone */
                ast_log(LOG_DEBUG, "Got response on call that is already terminated: %s (ignoring)\n", p->callid);
                return;
        }
@@ -9733,7 +9762,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                                  by sending CANCEL */
                        /* THIS NEEDS TO BE CHECKED: OEJ */
                        if (!ignore)
-                               ast_set_flag(p, SIP_PENDINGBYE);        
+                               ast_set_flag(&p->flags[0], SIP_PENDINGBYE);     
                }
                /* If I understand this right, the branch is different for a non-200 ACK only */
                transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, 1);
@@ -9753,8 +9782,8 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                        char *authorization = (resp == 401 ? "Authorization" : "Proxy-Authorization");
                        if ((p->authtries == MAX_AUTHTRIES) || do_proxy_auth(p, req, authenticate, authorization, SIP_INVITE, 1)) {
                                ast_log(LOG_NOTICE, "Failed to authenticate on INVITE to '%s'\n", get_header(&p->initreq, "From"));
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
-                               ast_set_flag(p, SIP_ALREADYGONE);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
+                               ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                                if (p->owner)
                                        ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                        }
@@ -9766,14 +9795,14 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                ast_log(LOG_WARNING, "Forbidden - wrong password on authentication for INVITE to '%s'\n", get_header(&p->initreq, "From"));
                if (!ignore && p->owner)
                        ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
-               ast_set_flag(p, SIP_NEEDDESTROY);       
-               ast_set_flag(p, SIP_ALREADYGONE);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
+               ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                break;
        case 404: /* Not found */
                transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, 0);
                if (p->owner && !ignore)
                        ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
-               ast_set_flag(p, SIP_ALREADYGONE);       
+               ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                break;
        case 481: /* Call leg does not exist */
                /* Could be REFER or INVITE */
@@ -9803,7 +9832,7 @@ static int handle_response_register(struct sip_pvt *p, int resp, char *rest, str
        case 401:       /* Unauthorized */
                if ((p->authtries == MAX_AUTHTRIES) || do_register_auth(p, req, "WWW-Authenticate", "Authorization")) {
                        ast_log(LOG_NOTICE, "Failed to authenticate on REGISTER to '%s@%s' (Tries %d)\n", p->registry->username, p->registry->hostname, p->authtries);
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        }
                break;
        case 403:       /* Forbidden */
@@ -9811,34 +9840,34 @@ static int handle_response_register(struct sip_pvt *p, int resp, char *rest, str
                if (global_regattempts_max)
                        p->registry->regattempts = global_regattempts_max+1;
                ast_sched_del(sched, r->timeout);
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                break;
        case 404:       /* Not found */
                ast_log(LOG_WARNING, "Got 404 Not found on SIP register to service %s@%s, giving up\n", p->registry->username,p->registry->hostname);
                if (global_regattempts_max)
                        p->registry->regattempts = global_regattempts_max+1;
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                r->call = NULL;
                ast_sched_del(sched, r->timeout);
                break;
        case 407:       /* Proxy auth */
                if ((p->authtries == MAX_AUTHTRIES) || do_register_auth(p, req, "Proxy-Authenticate", "Proxy-Authorization")) {
                        ast_log(LOG_NOTICE, "Failed to authenticate on REGISTER to '%s' (tries '%d')\n", get_header(&p->initreq, "From"), p->authtries);
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                }
                break;
        case 479:       /* SER: Not able to process the URI - address is wrong in register*/
                ast_log(LOG_WARNING, "Got error 479 on register to %s@%s, giving up (check config)\n", p->registry->username,p->registry->hostname);
                if (global_regattempts_max)
                        p->registry->regattempts = global_regattempts_max+1;
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                r->call = NULL;
                ast_sched_del(sched, r->timeout);
                break;
        case 200:       /* 200 OK */
                if (!r) {
                        ast_log(LOG_WARNING, "Got 200 OK on REGISTER that isn't a register\n");
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        return 0;
                }
 
@@ -9855,7 +9884,7 @@ static int handle_response_register(struct sip_pvt *p, int resp, char *rest, str
                p->registry = NULL;
                /* Let this one hang around until we have all the responses */
                sip_scheddestroy(p, 32000);
-               /* ast_set_flag(p, SIP_NEEDDESTROY);    */
+               /* ast_set_flag(&p->flags[0], SIP_NEEDDESTROY); */
 
                /* set us up for re-registering */
                /* figure out how long we got registered for */
@@ -9953,7 +9982,7 @@ static int handle_response_peerpoke(struct sip_pvt *p, int resp, char *rest, str
                        ast_sched_del(sched, peer->pokeexpire);
                if (sipmethod == SIP_INVITE)    /* Does this really happen? */
                        transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, 0);
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
 
                /* Try again eventually */
                if ((peer->lastms < 0)  || (peer->lastms > peer->maxms))
@@ -10004,7 +10033,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                   need to hang around for something more "definitive" */
 
                res = handle_response_peerpoke(p, resp, rest, req, ignore, seqno, sipmethod);
-       } else if (ast_test_flag(p, SIP_OUTGOING)) {
+       } else if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                /* Acknowledge sequence number */
                if (p->initid > -1) {
                        /* Don't auto congest anymore since we've gotten something useful back */
@@ -10028,7 +10057,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                        p->authtries = 0;       /* Reset authentication counter */
                        if (sipmethod == SIP_MESSAGE) {
                                /* We successfully transmitted a message */
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        } else if (sipmethod == SIP_NOTIFY) {
                                /* They got the notify, this is the end */
                                if (p->owner) {
@@ -10036,7 +10065,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                        ast_queue_hangup(p->owner);
                                } else {
                                        if (p->subscribed == NONE) {
-                                               ast_set_flag(p, SIP_NEEDDESTROY); 
+                                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY); 
                                        }
                                }
                        } else if (sipmethod == SIP_INVITE) {
@@ -10052,7 +10081,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                res = handle_response_register(p, resp, rest, req, ignore, seqno);
                        } else {
                                ast_log(LOG_WARNING, "Got authentication request (401) on unknown %s to '%s'\n", sip_methods[sipmethod].text, get_header(req, "To"));
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        }
                        break;
                case 403: /* Forbidden - we failed authentication */
@@ -10079,15 +10108,15 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                if (ast_strlen_zero(p->authname))
                                        ast_log(LOG_WARNING, "Asked to authenticate %s, to %s:%d but we have no matching peer!\n",
                                                        msg, ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr), ntohs(p->recv.sin_port));
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                if ((p->authtries == MAX_AUTHTRIES) || do_proxy_auth(p, req, "Proxy-Authenticate", "Proxy-Authorization", sipmethod, 0)) {
                                        ast_log(LOG_NOTICE, "Failed to authenticate on %s to '%s'\n", msg, get_header(&p->initreq, "From"));
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                }
                        } else if (p->registry && sipmethod == SIP_REGISTER) {
                                res = handle_response_register(p, resp, rest, req, ignore, seqno);
                        } else  /* We can't handle this, giving up in a bad way */
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
 
                        break;
                case 491: /* Pending */
@@ -10105,7 +10134,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                /* Fatal response */
                                if ((option_verbose > 2) && (resp != 487))
                                        ast_verbose(VERBOSE_PREFIX_3 "Got SIP response %d \"%s\" back from %s\n", resp, rest, ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr));
-                               ast_set_flag(p, SIP_ALREADYGONE);       
+                               ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                                if (p->rtp) {
                                        /* Immediately stop RTP */
                                        ast_rtp_stop(p->rtp);
@@ -10160,9 +10189,9 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                /* ACK on invite */
                                if (sipmethod == SIP_INVITE) 
                                        transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, 0);
-                               ast_set_flag(p, SIP_ALREADYGONE);       
+                               ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                                if (!p->owner)
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        } else if ((resp >= 100) && (resp < 200)) {
                                if (sipmethod == SIP_INVITE) {
                                        sip_cancel_destroy(p);
@@ -10198,7 +10227,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                ast_log(LOG_DEBUG, "Got 200 OK on CANCEL\n");
                        } else if (sipmethod == SIP_MESSAGE)
                                /* We successfully transmitted a message */
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        break;
                case 401:       /* www-auth */
                case 407:
@@ -10214,7 +10243,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                }
                                if ((p->authtries == MAX_AUTHTRIES) || do_proxy_auth(p, req, auth, auth2, sipmethod, 0)) {
                                        ast_log(LOG_NOTICE, "Failed to authenticate on %s to '%s'\n", msg, get_header(&p->initreq, "From"));
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                }
                        } else if (sipmethod == SIP_INVITE) {
                                handle_response_invite(p, resp, rest, req, ignore, seqno);
@@ -10454,7 +10483,7 @@ static int handle_request_options(struct sip_pvt *p, struct sip_request *req, in
        /* Destroy if this OPTIONS was the opening request, but not if
           it's in the middle of a normal call flow. */
        if (!p->lastinvite)
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
 
        return res;
 }
@@ -10483,7 +10512,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        transmit_response_with_unsupported(p, "420 Bad extension", req, required);
                        ast_log(LOG_WARNING,"Received SIP INVITE with unsupported required extension: %s\n", required);
                        if (!p->lastinvite)
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        return -1;
                        
                }
@@ -10492,7 +10521,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
        /* Check if this is a loop */
        /* This happens since we do not properly support SIP domain
           handling yet... -oej */
-       if (ast_test_flag(p, SIP_OUTGOING) && p->owner && (p->owner->_state != AST_STATE_UP)) {
+       if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && p->owner && (p->owner->_state != AST_STATE_UP)) {
                /* This is a call to ourself.  Send ourselves an error code and stop
                   processing immediately, as SIP really has no good mechanism for
                   being able to call yourself */
@@ -10506,7 +10535,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        ast_verbose("Using INVITE request as basis request - %s\n", p->callid);
                sip_cancel_destroy(p);
                /* This call is no longer outgoing if it ever was */
-               ast_clear_flag(p, SIP_OUTGOING);
+               ast_clear_flag(&p->flags[0], SIP_OUTGOING);
                /* This also counts as a pending invite */
                p->pendinginvite = seqno;
                copy_request(&p->initreq, req);
@@ -10517,7 +10546,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                if (process_sdp(p, req)) {
                                        transmit_response(p, "488 Not acceptable here", req);
                                        if (!p->lastinvite)
-                                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                        return -1;
                                }
                        } else {
@@ -10536,7 +10565,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                if (res < 0) { /* Something failed in authentication */
                        ast_log(LOG_NOTICE, "Failed to authenticate user %s\n", get_header(req, "From"));
                        transmit_response_reliable(p, "403 Forbidden", req);
-                       ast_set_flag(p, SIP_NEEDDESTROY);
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
                        ast_string_field_free(p, theirtag);
                        return 0;
                }
@@ -10546,7 +10575,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        if (process_sdp(p, req)) {
                                /* Unacceptable codecs */
                                transmit_response_reliable(p, "488 Not acceptable here", req);
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                return -1;
                        }
                } else {
@@ -10571,7 +10600,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        if (res < 0) {
                                ast_log(LOG_NOTICE, "Failed to place call for user %s, too many calls\n", p->username);
                                transmit_response_reliable(p, "480 Temporarily Unavailable (Call limit) ", req);
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        }
                        return 0;
                }
@@ -10581,14 +10610,14 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                build_contact(p);                       /* Build our contact header */
 
                if (gotdest) {
-                       if (gotdest == 1 && ast_test_flag(&p->flags_page2, SIP_PAGE2_ALLOWOVERLAP)) {
+                       if (gotdest == 1 && ast_test_flag(&p->flags[1], SIP_PAGE2_ALLOWOVERLAP)) {
                                transmit_response_reliable(p, "484 Address Incomplete", req);
                                update_call_counter(p, DEC_CALL_LIMIT);
                        } else {
                                transmit_response_reliable(p, "404 Not Found", req);
                                update_call_counter(p, DEC_CALL_LIMIT);
                        }
-                       ast_set_flag(p, SIP_NEEDDESTROY);               
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);            
                } else {
                        /* If no extension was specified, use the s one */
                        if (ast_strlen_zero(p->exten))
@@ -10666,7 +10695,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                                transmit_response(p, "503 Unavailable", req);
                                        else
                                                transmit_response_reliable(p, "503 Unavailable", req);
-                                       ast_set_flag(p, SIP_ALREADYGONE);       
+                                       ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                                        /* Unlock locks so ast_hangup can do its magic */
                                        ast_mutex_unlock(&p->lock);
                                        c->hangupcause = AST_CAUSE_CALL_REJECTED;
@@ -10697,20 +10726,20 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        transmit_response(p, "100 Trying", req);
                }
        } else {
-               if (p && !ast_test_flag(p, SIP_NEEDDESTROY) && !ignore) {
+               if (p && !ast_test_flag(&p->flags[0], SIP_NEEDDESTROY) && !ignore) {
                        if (!p->jointcapability) {
                                if (ignore)
                                        transmit_response(p, "488 Not Acceptable Here (codec error)", req);
                                else
                                        transmit_response_reliable(p, "488 Not Acceptable Here (codec error)", req);
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        } else {
                                ast_log(LOG_NOTICE, "Unable to create/find channel\n");
                                if (ignore)
                                        transmit_response(p, "503 Unavailable", req);
                                else
                                        transmit_response_reliable(p, "503 Unavailable", req);
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        }
                }
        }
@@ -10730,7 +10759,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                ast_string_field_set(p, context, default_context);
        res = get_refer_info(p, req);
        if (res > 0) {
-               if (ast_test_flag(&p->flags_page2, SIP_PAGE2_ALLOWOVERLAP)) 
+               if (ast_test_flag(&p->flags[1], SIP_PAGE2_ALLOWOVERLAP)) 
                        transmit_response_with_allow(p, "484 Address Incomplete", req, 1);
                else
                        transmit_response_with_allow(p, "404 Not Found", req, 1);
@@ -10746,7 +10775,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                                        ast_mutex_unlock(&p->refer_call->owner->lock);
                                ast_mutex_unlock(&p->refer_call->lock);
                                p->refer_call = NULL;
-                               ast_set_flag(p, SIP_GOTREFER);  
+                               ast_set_flag(&p->flags[0], SIP_GOTREFER);       
                        } else {
                                ast_log(LOG_DEBUG,"202 Accepted (blind)\n");
                                c = p->owner;
@@ -10774,14 +10803,14 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                                                ast_queue_hangup(p->owner);
                                        }
                                }
-                               ast_set_flag(p, SIP_GOTREFER);  
+                               ast_set_flag(&p->flags[0], SIP_GOTREFER);       
                        }
                        transmit_response(p, "202 Accepted", req);
                        transmit_notify_with_sipfrag(p, seqno);
                        /* Always increment on a BYE */
                        if (!nobye) {
                                transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1);
-                               ast_set_flag(p, SIP_ALREADYGONE);       
+                               ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
                        }
                }
        }
@@ -10792,7 +10821,7 @@ static int handle_request_cancel(struct sip_pvt *p, struct sip_request *req, int
 {
                
        check_via(p, req);
-       ast_set_flag(p, SIP_ALREADYGONE);       
+       ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
        if (p->rtp) {
                /* Immediately stop RTP */
                ast_rtp_stop(p->rtp);
@@ -10804,7 +10833,7 @@ static int handle_request_cancel(struct sip_pvt *p, struct sip_request *req, int
        if (p->owner)
                ast_queue_hangup(p->owner);
        else
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
        if (p->initreq.len > 0) {
                if (!ignore)
                        transmit_response_reliable(p, "487 Request Terminated", &p->initreq);
@@ -10824,12 +10853,12 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req, int de
        struct ast_channel *bridged_to;
        char iabuf[INET_ADDRSTRLEN];
        
-       if (p->pendinginvite && !ast_test_flag(p, SIP_OUTGOING) && !ignore)
+       if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !ignore)
                transmit_response_reliable(p, "487 Request Terminated", &p->initreq);
 
        copy_request(&p->initreq, req);
        check_via(p, req);
-       ast_set_flag(p, SIP_ALREADYGONE);       
+       ast_set_flag(&p->flags[0], SIP_ALREADYGONE);    
        if (p->rtp) {
                /* Immediately stop RTP */
                ast_rtp_stop(p->rtp);
@@ -10863,7 +10892,7 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req, int de
        } else if (p->owner)
                ast_queue_hangup(p->owner);
        else
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
        transmit_response(p, "200 OK", req);
 
        return 1;
@@ -10908,9 +10937,8 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
        */
        if (!global_allowsubscribe) {
                transmit_response(p, "403 Forbidden (policy)", req);
-               ast_set_flag(p, SIP_NEEDDESTROY);       
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                return 0;
-
        }
 
        if (!ignore && !p->initreq.headers) {
@@ -10918,7 +10946,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                if (debug)
                        ast_verbose("Using latest SUBSCRIBE request as basis request\n");
                /* This call is no longer outgoing if it ever was */
-               ast_clear_flag(p, SIP_OUTGOING);
+               ast_clear_flag(&p->flags[0], SIP_OUTGOING);
                copy_request(&p->initreq, req);
                check_via(p, req);
        } else if (debug && ignore)
@@ -10949,15 +10977,15 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                if (res) {
                        if (res < 0) {
                                ast_log(LOG_NOTICE, "Failed to authenticate user %s for SUBSCRIBE\n", get_header(req, "From"));
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        }
                        return 0;
                }
 
                /* Check if this user/peer is allowed to subscribe at all */
-               if (! ast_test_flag(&p->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE)) {
+               if (! ast_test_flag(&p->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE)) {
                        transmit_response(p, "403 Forbidden (policy)", req);
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        return 0;
                }
 
@@ -10971,7 +10999,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                build_contact(p);
                if (gotdest) {
                        transmit_response(p, "404 Not Found", req);
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                } else {
 
                        /* Initialize tag for new subscriptions */      
@@ -10995,7 +11023,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                                } else {
                                        /* Can't find a format for events that we know about */
                                        transmit_response(p, "489 Bad Event", req);
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                        return 0;
                                }
                        } else if (!strcmp(event, "message-summary") && !strcmp(accept, "application/simple-message-summary")) {
@@ -11015,17 +11043,17 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                                */
                                if (!ast_strlen_zero(mailbox)) {
                                        transmit_response(p, "200 OK", req);
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                } else {
                                        transmit_response(p, "404 Not found", req);
-                                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                }
                                return 0;
                        } else { /* At this point, Asterisk does not understand the specified event */
                                transmit_response(p, "489 Bad Event", req);
                                if (option_debug > 1)
                                        ast_log(LOG_DEBUG, "Received SIP subscribe for unknown event package: %s\n", event);
-                               ast_set_flag(p, SIP_NEEDDESTROY);       
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                                return 0;
                        }
                        if (p->subscribed != NONE)
@@ -11035,7 +11063,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
 
        if (!ignore && p)
                p->lastinvite = seqno;
-       if (p && !ast_test_flag(p, SIP_NEEDDESTROY)) {
+       if (p && !ast_test_flag(&p->flags[0], SIP_NEEDDESTROY)) {
                p->expiry = atoi(get_header(req, "Expires"));
 
                /* check if the requested expiry-time is within the approved limits from sip.conf */
@@ -11054,7 +11082,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                if ((firststate = ast_extension_state(NULL, p->context, p->exten)) < 0) {
                        ast_log(LOG_ERROR, "Got SUBSCRIBE for extensions without hint. Please add hint to %s in context %s\n", p->exten, p->context);
                        transmit_response(p, "404 Not found", req);
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        return 0;
                } else {
                        struct sip_pvt *p_old;
@@ -11080,7 +11108,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                                if (!strcmp(p_old->username, p->username)) {
                                        if (!strcmp(p_old->exten, p->exten) &&
                                            !strcmp(p_old->context, p->context)) {
-                                               ast_set_flag(p_old, SIP_NEEDDESTROY);
+                                               ast_set_flag(&p_old->flags[0], SIP_NEEDDESTROY);
                                                ast_mutex_unlock(&p_old->lock);
                                                break;
                                        }
@@ -11090,7 +11118,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                        ast_mutex_unlock(&iflock);
                }
                if (!p->expiry)
-                       ast_set_flag(p, SIP_NEEDDESTROY);
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
        }
        return 1;
 }
@@ -11154,7 +11182,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
        }
        if (error) {
                if (!p->initreq.header) /* New call */
-                       ast_set_flag(p, SIP_NEEDDESTROY);       /* Make sure we destroy this dialog */
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    /* Make sure we destroy this dialog */
                return -1;
        }
        /* Get the command XXX */
@@ -11172,7 +11200,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                /* Response to our request -- Do some sanity checks */  
                if (!p->initreq.headers) {
                        ast_log(LOG_DEBUG, "That's odd...  Got a response on a call we dont know about. Cseq %d Cmd %s\n", seqno, cmd);
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                        return 0;
                } else if (p->ocseq && (p->ocseq < seqno)) {
                        ast_log(LOG_DEBUG, "Ignoring out of order response %d (expecting %d)\n", seqno, p->ocseq);
@@ -11209,7 +11237,10 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                if (req->method != SIP_ACK)
                        transmit_response(p, "503 Server error", req);  /* We must respond according to RFC 3261 sec 12.2 */
                return -1;
-       } else if (p->icseq && (p->icseq == seqno) && req->method != SIP_ACK &&(p->method != SIP_CANCEL|| ast_test_flag(p, SIP_ALREADYGONE))) {
+       } else if (p->icseq &&
+                  p->icseq == seqno &&
+                  req->method != SIP_ACK &&
+                  (p->method != SIP_CANCEL || ast_test_flag(&p->flags[0], SIP_ALREADYGONE))) {
                /* ignore means "don't do anything with it" but still have to 
                   respond appropriately.  We do this if we receive a repeat of
                   the last sequence number  */
@@ -11245,7 +11276,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                                /* Will cease to exist after ACK */
                        } else {
                                transmit_response(p, "481 Call/Transaction Does Not Exist", req);
-                               ast_set_flag(p, SIP_NEEDDESTROY);
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
                        }
                        return res;
                }
@@ -11291,7 +11322,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                        look into this someday XXX */
                transmit_response(p, "200 OK", req);
                if (!p->lastinvite) 
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                break;
        case SIP_ACK:
                /* Make sure we don't ignore this */
@@ -11305,7 +11336,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                        check_pendings(p);
                }
                if (!p->lastinvite && ast_strlen_zero(p->randdata))
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                break;
        default:
                transmit_response_with_allow(p, "501 Method Not Implemented", req, 0);
@@ -11313,7 +11344,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                        cmd, ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr));
                /* If this is some new method, and we don't have a call, destroy it now */
                if (!p->initreq.headers)
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                break;
        }
        return res;
@@ -11438,7 +11469,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer)
        build_via(p);
        build_callid_pvt(p);
        /* Send MWI */
-       ast_set_flag(p, SIP_OUTGOING);
+       ast_set_flag(&p->flags[0], SIP_OUTGOING);
        transmit_notify_with_mwi(p, newmsgs, oldmsgs, peer->vmexten);
        sip_scheddestroy(p, 15000);
        return 0;
@@ -11513,7 +11544,7 @@ restartsearch:
                                }
                        }
                        /* If we have sessions that needs to be destroyed, do it now */
-                       if (ast_test_flag(sip, SIP_NEEDDESTROY) && !sip->packets && !sip->owner) {
+                       if (ast_test_flag(&sip->flags[0], SIP_NEEDDESTROY) && !sip->packets && !sip->owner) {
                                ast_mutex_unlock(&sip->lock);
                                __sip_destroy(sip, 1);
                                goto restartsearch;
@@ -11669,7 +11700,7 @@ static int sip_poke_peer(struct sip_peer *peer)
        if (peer->pokeexpire > -1)
                ast_sched_del(sched, peer->pokeexpire);
        p->peerpoke = peer;
-       ast_set_flag(p, SIP_OUTGOING);
+       ast_set_flag(&p->flags[0], SIP_OUTGOING);
 #ifdef VOCAL_DATA_HACK
        ast_copy_string(p->username, "__VOCAL_DATA_SHOULD_READ_THE_SIP_SPEC__", sizeof(p->username));
        transmit_invite(p, SIP_INVITE, 0, 2);
@@ -11824,63 +11855,69 @@ static struct ast_channel *sip_request_call(const char *type, int format, void *
        return tmpc;
 }
 
-/*! \brief Handle flag-type options common to users and peers */
+/*!
+  \brief Handle flag-type options common to users and peers
+  \param flags array of two struct ast_flags
+  \param mask array of two struct ast_flags
+  \param v linked list of config variables to process
+  \returns non-zero if any config options were handled, zero otherwise
+*/
 static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask, struct ast_variable *v)
 {
        int res = 0;
 
        if (!strcasecmp(v->name, "trustrpid")) {
-               ast_set_flag(mask, SIP_TRUSTRPID);
-               ast_set2_flag(flags, ast_true(v->value), SIP_TRUSTRPID);
+               ast_set_flag(&mask[0], SIP_TRUSTRPID);
+               ast_set2_flag(&flags[0], ast_true(v->value), SIP_TRUSTRPID);
                res = 1;
        } else if (!strcasecmp(v->name, "sendrpid")) {
-               ast_set_flag(mask, SIP_SENDRPID);
-               ast_set2_flag(flags, ast_true(v->value), SIP_SENDRPID);
+               ast_set_flag(&mask[0], SIP_SENDRPID);
+               ast_set2_flag(&flags[0], ast_true(v->value), SIP_SENDRPID);
                res = 1;
        } else if (!strcasecmp(v->name, "useclientcode")) {
-               ast_set_flag(mask, SIP_USECLIENTCODE);
-               ast_set2_flag(flags, ast_true(v->value), SIP_USECLIENTCODE);
+               ast_set_flag(&mask[0], SIP_USECLIENTCODE);
+               ast_set2_flag(&flags[0], ast_true(v->value), SIP_USECLIENTCODE);
                res = 1;
        } else if (!strcasecmp(v->name, "dtmfmode")) {
-               ast_set_flag(mask, SIP_DTMF);
-               ast_clear_flag(flags, SIP_DTMF);
+               ast_set_flag(&mask[0], SIP_DTMF);
+               ast_clear_flag(&flags[0], SIP_DTMF);
                if (!strcasecmp(v->value, "inband"))
-                       ast_set_flag(flags, SIP_DTMF_INBAND);
+                       ast_set_flag(&flags[0], SIP_DTMF_INBAND);
                else if (!strcasecmp(v->value, "rfc2833"))
-                       ast_set_flag(flags, SIP_DTMF_RFC2833);
+                       ast_set_flag(&flags[0], SIP_DTMF_RFC2833);
                else if (!strcasecmp(v->value, "info"))
-                       ast_set_flag(flags, SIP_DTMF_INFO);
+                       ast_set_flag(&flags[0], SIP_DTMF_INFO);
                else if (!strcasecmp(v->value, "auto"))
-                       ast_set_flag(flags, SIP_DTMF_AUTO);
+                       ast_set_flag(&flags[0], SIP_DTMF_AUTO);
                else {
                        ast_log(LOG_WARNING, "Unknown dtmf mode '%s' on line %d, using rfc2833\n", v->value, v->lineno);
-                       ast_set_flag(flags, SIP_DTMF_RFC2833);
+                       ast_set_flag(&flags[0], SIP_DTMF_RFC2833);
                }
        } else if (!strcasecmp(v->name, "nat")) {
-               ast_set_flag(mask, SIP_NAT);
-               ast_clear_flag(flags, SIP_NAT);
+               ast_set_flag(&mask[0], SIP_NAT);
+               ast_clear_flag(&flags[0], SIP_NAT);
                if (!strcasecmp(v->value, "never"))
-                       ast_set_flag(flags, SIP_NAT_NEVER);
+                       ast_set_flag(&flags[0], SIP_NAT_NEVER);
                else if (!strcasecmp(v->value, "route"))
-                       ast_set_flag(flags, SIP_NAT_ROUTE);
+                       ast_set_flag(&flags[0], SIP_NAT_ROUTE);
                else if (ast_true(v->value))
-                       ast_set_flag(flags, SIP_NAT_ALWAYS);
+                       ast_set_flag(&flags[0], SIP_NAT_ALWAYS);
                else
-                       ast_set_flag(flags, SIP_NAT_RFC3581);
+                       ast_set_flag(&flags[0], SIP_NAT_RFC3581);
        } else if (!strcasecmp(v->name, "canreinvite")) {
-               ast_set_flag(mask, SIP_REINVITE);
-               ast_clear_flag(flags, SIP_REINVITE);
+               ast_set_flag(&mask[0], SIP_REINVITE);
+               ast_clear_flag(&flags[0], SIP_REINVITE);
                if (!strcasecmp(v->value, "update"))
-                       ast_set_flag(flags, SIP_REINVITE_UPDATE | SIP_CAN_REINVITE);
+                       ast_set_flag(&flags[0], SIP_REINVITE_UPDATE | SIP_CAN_REINVITE);
                else
-                       ast_set2_flag(flags, ast_true(v->value), SIP_CAN_REINVITE);
+                       ast_set2_flag(&flags[0], ast_true(v->value), SIP_CAN_REINVITE);
        } else if (!strcasecmp(v->name, "insecure")) {
-               ast_set_flag(mask, SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
-               ast_clear_flag(flags, SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
+               ast_set_flag(&mask[0], SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
+               ast_clear_flag(&flags[0], SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
                if (!strcasecmp(v->value, "very"))
-                       ast_set_flag(flags, SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
+                       ast_set_flag(&flags[0], SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
                else if (ast_true(v->value))
-                       ast_set_flag(flags, SIP_INSECURE_PORT);
+                       ast_set_flag(&flags[0], SIP_INSECURE_PORT);
                else if (!ast_false(v->value)) {
                        char buf[64];
                        char *word, *next;
@@ -11889,20 +11926,20 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask
                        next = buf;
                        while ((word = strsep(&next, ","))) {
                                if (!strcasecmp(word, "port"))
-                                       ast_set_flag(flags, SIP_INSECURE_PORT);
+                                       ast_set_flag(&flags[0], SIP_INSECURE_PORT);
                                else if (!strcasecmp(word, "invite"))
-                                       ast_set_flag(flags, SIP_INSECURE_INVITE);
+                                       ast_set_flag(&flags[0], SIP_INSECURE_INVITE);
                                else
                                        ast_log(LOG_WARNING, "Unknown insecure mode '%s' on line %d\n", v->value, v->lineno);
                        }
                }
        } else if (!strcasecmp(v->name, "progressinband")) {
-               ast_set_flag(mask, SIP_PROG_INBAND);
-               ast_clear_flag(flags, SIP_PROG_INBAND);
+               ast_set_flag(&mask[0], SIP_PROG_INBAND);
+               ast_clear_flag(&flags[0], SIP_PROG_INBAND);
                if (ast_true(v->value))
-                       ast_set_flag(flags, SIP_PROG_INBAND_YES);
+                       ast_set_flag(&flags[0], SIP_PROG_INBAND_YES);
                else if (strcasecmp(v->value, "never"))
-                       ast_set_flag(flags, SIP_PROG_INBAND_NO);
+                       ast_set_flag(&flags[0], SIP_PROG_INBAND_NO);
        } else if (!strcasecmp(v->name, "allowguest")) {
 #ifdef OSP_SUPPORT
                if (!strcasecmp(v->value, "osp"))
@@ -11915,19 +11952,28 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask
                                global_allowguest = 0;
 #ifdef OSP_SUPPORT
        } else if (!strcasecmp(v->name, "ospauth")) {
-               ast_set_flag(mask, SIP_OSPAUTH);
-               ast_clear_flag(flags, SIP_OSPAUTH);
+               ast_set_flag(&mask[0], SIP_OSPAUTH);
+               ast_clear_flag(&flags[0], SIP_OSPAUTH);
                if (!strcasecmp(v->value, "proxy"))
-                       ast_set_flag(flags, SIP_OSPAUTH_PROXY);
+                       ast_set_flag(&flags[0], SIP_OSPAUTH_PROXY);
                else if (!strcasecmp(v->value, "gateway"))
-                       ast_set_flag(flags, SIP_OSPAUTH_GATEWAY);
+                       ast_set_flag(&flags[0], SIP_OSPAUTH_GATEWAY);
                else if(!strcasecmp (v->value, "exclusive"))
-                       ast_set_flag(flags, SIP_OSPAUTH_EXCLUSIVE);
+                       ast_set_flag(&flags[0], SIP_OSPAUTH_EXCLUSIVE);
 #endif
        } else if (!strcasecmp(v->name, "promiscredir")) {
-               ast_set_flag(mask, SIP_PROMISCREDIR);
-               ast_set2_flag(flags, ast_true(v->value), SIP_PROMISCREDIR);
+               ast_set_flag(&mask[0], SIP_PROMISCREDIR);
+               ast_set2_flag(&flags[0], ast_true(v->value), SIP_PROMISCREDIR);
                res = 1;
+       } else if (!strcasecmp(v->name, "videosupport")) {
+               ast_set_flag(&mask[1], SIP_PAGE2_VIDEOSUPPORT);
+               ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_VIDEOSUPPORT);
+       } else if (!strcasecmp(v->name, "allowoverlap")) {
+               ast_set_flag(&mask[1], SIP_PAGE2_ALLOWOVERLAP);
+               ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_ALLOWOVERLAP);
+       } else if (!strcasecmp(v->name, "allowsubscribe")) {
+               ast_set_flag(&mask[1], SIP_PAGE2_ALLOWSUBSCRIBE);
+               ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_ALLOWSUBSCRIBE);
        }
 
        return res;
@@ -12096,8 +12142,8 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
        struct ast_ha *oldha = NULL;
        char *varname = NULL, *varval = NULL;
        struct ast_variable *tmpvar = NULL;
-       struct ast_flags userflags = {(0)};
-       struct ast_flags mask = {(0)};
+       struct ast_flags userflags[2] = {{(0)}};
+       struct ast_flags mask[2] = {{(0)}};
 
 
        if (!(user = ast_calloc(1, sizeof(*user))))
@@ -12108,8 +12154,8 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
        ast_copy_string(user->name, name, sizeof(user->name));
        oldha = user->ha;
        user->ha = NULL;
-       ast_copy_flags(user, &global_flags, SIP_FLAGS_TO_COPY);
-       ast_copy_flags(user, &global_flags_page2, SIP_PAGE2_FLAGS_TO_COPY);
+       ast_copy_flags(&user->flags[0], &global_flags[0], SIP_FLAGS_TO_COPY);
+       ast_copy_flags(&user->flags[1], &global_flags[1], SIP_PAGE2_FLAGS_TO_COPY);
        user->capability = global_capability;
        user->prefs = default_prefs;
        /* set default context */
@@ -12117,7 +12163,7 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
        strcpy(user->language, default_language);
        strcpy(user->musicclass, default_musicclass);
        for (; v; v = v->next) {
-               if (handle_common_options(&userflags, &mask, v))
+               if (handle_common_options(&userflags[0], &mask[0], v))
                        continue;
 
                if (!strcasecmp(v->name, "context")) {
@@ -12153,17 +12199,6 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
                        ast_copy_string(user->musicclass, v->value, sizeof(user->musicclass));
                } else if (!strcasecmp(v->name, "accountcode")) {
                        ast_copy_string(user->accountcode, v->value, sizeof(user->accountcode));
-               } else if (!strcasecmp(v->name, "allowsubscribe")) {
-                       if (ast_true(v->value)) {
-                               global_allowsubscribe = TRUE;   /* No global ban any more */
-                               ast_set_flag(&user->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
-                       } else
-                               ast_clear_flag(&user->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
-               } else if (!strcasecmp(v->name, "allowoverlap")) {
-                       if (ast_true(v->value)) {
-                               ast_set_flag(&user->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
-                       } else
-                               ast_clear_flag(&user->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
                } else if (!strcasecmp(v->name, "call-limit")) {
                        user->call_limit = atoi(v->value);
                        if (user->call_limit < 0)
@@ -12187,16 +12222,12 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
                        user->maxcallbitrate = atoi(v->value);
                        if (user->maxcallbitrate < 0)
                                user->maxcallbitrate = default_maxcallbitrate;
-               } else if (!strcasecmp(v->name, "videosupport")) {
-                       if (ast_test_flag((&global_flags_page2), SIP_PAGE2_VIDEOSUPPORT)) {
-                               if (ast_true(v->value))
-                                       ast_set_flag((&user->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
-                               else
-                                       ast_clear_flag((&user->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
-                       }
                }
        }
-       ast_copy_flags(user, &userflags, mask.flags);
+       ast_copy_flags(&user->flags[0], &userflags[0], mask[0].flags);
+       ast_copy_flags(&user->flags[1], &userflags[1], mask[1].flags);
+       if (ast_test_flag(&user->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE))
+               global_allowsubscribe = TRUE;   /* No global ban any more */
        ast_free_ha(oldha);
        return user;
 }
@@ -12212,9 +12243,8 @@ static void set_peer_defaults(struct sip_peer *peer)
                peer->pokeexpire = -1;
                peer->addr.sin_port = htons(DEFAULT_SIP_PORT);
        }
-       ast_copy_flags((&peer->flags_page2), &global_flags_page2, SIP_PAGE2_FLAGS_TO_COPY);
-       ast_copy_flags(peer, &global_flags, SIP_FLAGS_TO_COPY);
-       ast_copy_flags(&peer->flags_page2, &global_flags_page2, SIP_PAGE2_FLAGS_TO_COPY);
+       ast_copy_flags(&peer->flags[0], &global_flags[0], SIP_FLAGS_TO_COPY);
+       ast_copy_flags(&peer->flags[1], &global_flags[1], SIP_PAGE2_FLAGS_TO_COPY);
        strcpy(peer->context, default_context);
        strcpy(peer->subscribecontext, default_subscribecontext);
        strcpy(peer->language, default_language);
@@ -12227,7 +12257,6 @@ static void set_peer_defaults(struct sip_peer *peer)
        peer->rtpholdtimeout = global_rtpholdtimeout;
        peer->rtpkeepalive = global_rtpkeepalive;
        strcpy(peer->vmexten, default_vmexten);
-       ast_copy_flags(peer, &global_flags, SIP_USEREQPHONE);
        peer->secret[0] = '\0';
        peer->md5secret[0] = '\0';
        peer->cid_num[0] = '\0';
@@ -12256,8 +12285,8 @@ static struct sip_peer *temp_peer(const char *name)
 
        ast_copy_string(peer->name, name, sizeof(peer->name));
 
-       ast_set_flag((&peer->flags_page2), SIP_PAGE2_SELFDESTRUCT);
-       ast_set_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC);
+       ast_set_flag(&peer->flags[1], SIP_PAGE2_SELFDESTRUCT);
+       ast_set_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC);
        peer->prefs = default_prefs;
        reg_source_db(peer);
 
@@ -12275,8 +12304,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
        time_t regseconds = 0;
        char *varname = NULL, *varval = NULL;
        struct ast_variable *tmpvar = NULL;
-       struct ast_flags peerflags = {(0)};
-       struct ast_flags mask = {(0)};
+       struct ast_flags peerflags[2] = {{(0)}};
+       struct ast_flags mask[2] = {{(0)}};
 
 
        if (!realtime)
@@ -12315,7 +12344,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                peer->chanvars = NULL;
        }
        for (; v; v = v->next) {
-               if (handle_common_options(&peerflags, &mask, v))
+               if (handle_common_options(&peerflags[0], &mask[0], v))
                        continue;
 
                if (realtime && !strcasecmp(v->name, "regseconds")) {
@@ -12326,7 +12355,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                        ast_copy_string(peer->name, v->value, sizeof(peer->name));
                else if (realtime && !strcasecmp(v->name, "fullcontact")) {
                        ast_copy_string(peer->fullcontact, v->value, sizeof(peer->fullcontact));
-                       ast_set_flag((&peer->flags_page2), SIP_PAGE2_RT_FROMCONTACT);
+                       ast_set_flag(&peer->flags[1], SIP_PAGE2_RT_FROMCONTACT);
                } else if (!strcasecmp(v->name, "secret")) 
                        ast_copy_string(peer->secret, v->value, sizeof(peer->secret));
                else if (!strcasecmp(v->name, "md5secret")) 
@@ -12339,37 +12368,19 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                        ast_copy_string(peer->context, v->value, sizeof(peer->context));
                } else if (!strcasecmp(v->name, "subscribecontext")) {
                        ast_copy_string(peer->subscribecontext, v->value, sizeof(peer->subscribecontext));
-               } else if (!strcasecmp(v->name, "allowsubscribe")) {
-                       if (ast_true(v->value)) {
-                               global_allowsubscribe = TRUE;   /* No global ban any more */
-                               ast_set_flag(&peer->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
-                       } else
-                               ast_clear_flag(&peer->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
-               } else if (!strcasecmp(v->name, "allowoverlap")) {
-                       if (ast_true(v->value)) {
-                               ast_set_flag(&peer->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
-                       } else
-                               ast_clear_flag(&peer->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
-               } else if (!strcasecmp(v->name, "fromdomain"))
+               } else if (!strcasecmp(v->name, "fromdomain")) {
                        ast_copy_string(peer->fromdomain, v->value, sizeof(peer->fromdomain));
-               else if (!strcasecmp(v->name, "usereqphone"))
-                       ast_set2_flag(peer, ast_true(v->value), SIP_USEREQPHONE);
-               else if (!strcasecmp(v->name, "videosupport")) {
-                       if (ast_test_flag((&global_flags_page2), SIP_PAGE2_VIDEOSUPPORT)) {
-                               if (ast_true(v->value))
-                                       ast_set_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
-                               else
-                                       ast_clear_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
-                       }
-               } else if (!strcasecmp(v->name, "fromuser"))
+               } else if (!strcasecmp(v->name, "usereqphone")) {
+                       ast_set2_flag(&peer->flags[0], ast_true(v->value), SIP_USEREQPHONE);
+               } else if (!strcasecmp(v->name, "fromuser")) {
                        ast_copy_string(peer->fromuser, v->value, sizeof(peer->fromuser));
-               else if (!strcasecmp(v->name, "host") || !strcasecmp(v->name, "outboundproxy")) {
+               } else if (!strcasecmp(v->name, "host") || !strcasecmp(v->name, "outboundproxy")) {
                        if (!strcasecmp(v->value, "dynamic")) {
                                if (!strcasecmp(v->name, "outboundproxy") || obproxyfound) {
                                        ast_log(LOG_WARNING, "You can't have a dynamic outbound proxy, you big silly head at line %d.\n", v->lineno);
                                } else {
                                        /* They'll register with us */
-                                       ast_set_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC);
+                                       ast_set_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC);
                                        if (!found) {
                                                /* Initialize stuff iff we're not found, otherwise
                                                   we keep going with what we had */
@@ -12386,7 +12397,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                                if (peer->expire > -1)
                                        ast_sched_del(sched, peer->expire);
                                peer->expire = -1;
-                               ast_clear_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC);
+                               ast_clear_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC);
                                if (!obproxyfound || !strcasecmp(v->name, "outboundproxy")) {
                                        if (ast_get_ip_or_srv(&peer->addr, v->value, "_sip._udp")) {
                                                ASTOBJ_UNREF(peer, sip_destroy_peer);
@@ -12409,7 +12420,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                } else if (!strcasecmp(v->name, "permit") || !strcasecmp(v->name, "deny")) {
                        peer->ha = ast_append_ha(v->name, v->value, peer->ha);
                } else if (!strcasecmp(v->name, "port")) {
-                       if (!realtime && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC))
+                       if (!realtime && ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC))
                                peer->defaddr.sin_port = htons(atoi(v->value));
                        else
                                peer->addr.sin_port = htons(atoi(v->value));
@@ -12491,7 +12502,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                                peer->maxcallbitrate = default_maxcallbitrate;
                }
        }
-       if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) && realtime) {
+       if (!ast_test_flag(&global_flags[1], SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC) && realtime) {
                time_t nowtime;
 
                time(&nowtime);
@@ -12502,8 +12513,11 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                                ast_log(LOG_DEBUG, "Bah, we're expired (%d/%d/%d)!\n", (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
                }
        }
-       ast_copy_flags(peer, &peerflags, mask.flags);
-       if (!found && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) && !ast_test_flag(peer, SIP_REALTIME))
+       ast_copy_flags(&peer->flags[0], &peerflags[0], mask[0].flags);
+       ast_copy_flags(&peer->flags[1], &peerflags[1], mask[1].flags);
+       if (ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE))
+               global_allowsubscribe = TRUE;   /* No global ban any more */
+       if (!found && ast_test_flag(&peer->flags[1], SIP_PAGE2_DYNAMIC) && !ast_test_flag(&peer->flags[0], SIP_REALTIME))
                reg_source_db(peer);
        ASTOBJ_UNMARK(peer);
        ast_free_ha(oldha);
@@ -12527,7 +12541,7 @@ static int reload_config(enum channelreloadreason reason)
        struct hostent *hp;
        int format;
        char iabuf[INET_ADDRSTRLEN];
-       struct ast_flags dummy;
+       struct ast_flags dummy[2];
        int auto_sip_domains = FALSE;
        struct sockaddr_in old_bindaddr = bindaddr;
        int registry_count = 0, peer_count = 0, user_count = 0;
@@ -12543,10 +12557,10 @@ static int reload_config(enum channelreloadreason reason)
        
        /* Clear all flags before setting default values */
        /* Preserve debugging settings for console */
-       ast_copy_flags((&debugflag), (&global_flags_page2), SIP_PAGE2_DEBUG_CONSOLE);
-       ast_clear_flag(&global_flags, AST_FLAGS_ALL);
-       ast_clear_flag(&global_flags_page2, AST_FLAGS_ALL);
-       ast_copy_flags((&global_flags_page2), (&debugflag), SIP_PAGE2_DEBUG_CONSOLE);
+       ast_copy_flags(&debugflag, &global_flags[1], SIP_PAGE2_DEBUG_CONSOLE);
+       ast_clear_flag(&global_flags[0], AST_FLAGS_ALL);
+       ast_clear_flag(&global_flags[1], AST_FLAGS_ALL);
+       ast_copy_flags(&global_flags[1], &debugflag, SIP_PAGE2_DEBUG_CONSOLE);
 
        /* Reset IP addresses  */
        memset(&bindaddr, 0, sizeof(bindaddr));
@@ -12568,7 +12582,7 @@ static int reload_config(enum channelreloadreason reason)
        global_regcontext[0] = '\0';
        expiry = DEFAULT_EXPIRY;
        global_notifyringing = DEFAULT_NOTIFYRINGING;
-       global_allowsubscribe = TRUE;
+       global_allowsubscribe = FALSE;
        ast_copy_string(global_useragent, DEFAULT_USERAGENT, sizeof(global_useragent));
        ast_copy_string(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime));
        ast_copy_string(global_realm, DEFAULT_REALM, sizeof(global_realm));
@@ -12584,11 +12598,9 @@ static int reload_config(enum channelreloadreason reason)
        global_rtpholdtimeout = 0;
        global_rtpkeepalive = 0;
        global_rtautoclear = 120;
-       global_allowsubscribe = TRUE;                                   /* Global flag, default = TRUE */
-       ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);    /* Default for peers, users: TRUE */
-       ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP);      /* Default for peers, users: TRUE */
-
-       ast_set_flag(&global_flags_page2, SIP_PAGE2_RTUPDATE);
+       ast_set_flag(&global_flags[1], SIP_PAGE2_ALLOWSUBSCRIBE);       /* Default for peers, users: TRUE */
+       ast_set_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP);         /* Default for peers, users: TRUE */
+       ast_set_flag(&global_flags[1], SIP_PAGE2_RTUPDATE);
 
        /* Initialize some reasonable defaults at SIP reload (used both for channel and as default for peers and users */
        ast_copy_string(default_context, DEFAULT_CONTEXT, sizeof(default_context));
@@ -12599,24 +12611,24 @@ static int reload_config(enum channelreloadreason reason)
        default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE;
        ast_copy_string(default_musicclass, DEFAULT_MUSICCLASS, sizeof(default_musicclass));
        ast_copy_string(default_vmexten, DEFAULT_VMEXTEN, sizeof(default_vmexten));
-       ast_set_flag(&global_flags, SIP_DTMF_RFC2833);                  /*!< Default DTMF setting: RFC2833 */
-       ast_set_flag(&global_flags, SIP_NAT_RFC3581);                   /*!< NAT support if requested by device with rport */
-       ast_set_flag(&global_flags, SIP_CAN_REINVITE);                  /*!< Allow re-invites */
+       ast_set_flag(&global_flags[0], SIP_DTMF_RFC2833);                       /*!< Default DTMF setting: RFC2833 */
+       ast_set_flag(&global_flags[0], SIP_NAT_RFC3581);                        /*!< NAT support if requested by device with rport */
+       ast_set_flag(&global_flags[0], SIP_CAN_REINVITE);                       /*!< Allow re-invites */
 
        /* Debugging settings, always default to off */
        dumphistory = FALSE;
        recordhistory = FALSE;
-       ast_clear_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONFIG);
+       ast_clear_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONFIG);
 
        /* Misc settings for the channel */
        global_relaxdtmf = FALSE;
        global_callevents = FALSE;
        global_t1min = DEFAULT_T1MIN;           
-       ast_clear_flag(&global_flags_page2, SIP_PAGE2_VIDEOSUPPORT);
+       ast_clear_flag(&global_flags[1], SIP_PAGE2_VIDEOSUPPORT);
 
        /* Read the [general] config section of sip.conf (or from realtime config) */
        for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
-               if (handle_common_options(&global_flags, &dummy, v))
+               if (handle_common_options(&global_flags[0], &dummy[0], v))
                        continue;
 
                /* Create the interface list */
@@ -12628,11 +12640,11 @@ static int reload_config(enum channelreloadreason reason)
                        ast_copy_string(global_useragent, v->value, sizeof(global_useragent));
                        ast_log(LOG_DEBUG, "Setting SIP channel User-Agent Name to %s\n", global_useragent);
                } else if (!strcasecmp(v->name, "rtcachefriends")) {
-                       ast_set2_flag((&global_flags_page2), ast_true(v->value), SIP_PAGE2_RTCACHEFRIENDS);     
+                       ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_RTCACHEFRIENDS);  
                } else if (!strcasecmp(v->name, "rtupdate")) {
-                       ast_set2_flag((&global_flags_page2), ast_true(v->value), SIP_PAGE2_RTUPDATE);   
+                       ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_RTUPDATE);        
                } else if (!strcasecmp(v->name, "ignoreregexpire")) {
-                       ast_set2_flag((&global_flags_page2), ast_true(v->value), SIP_PAGE2_IGNOREREGEXPIRE);    
+                       ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_IGNOREREGEXPIRE); 
                } else if (!strcasecmp(v->name, "t1min")) {
                        global_t1min = atoi(v->value);
                } else if (!strcasecmp(v->name, "rtautoclear")) {
@@ -12641,9 +12653,9 @@ static int reload_config(enum channelreloadreason reason)
                                global_rtautoclear = i;
                        else
                                i = 0;
-                       ast_set2_flag((&global_flags_page2), i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR);
+                       ast_set2_flag(&global_flags[1], i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR);
                } else if (!strcasecmp(v->name, "usereqphone")) {
-                       ast_set2_flag((&global_flags), ast_true(v->value), SIP_USEREQPHONE);    
+                       ast_set2_flag(&global_flags[0], ast_true(v->value), SIP_USEREQPHONE);   
                } else if (!strcasecmp(v->name, "relaxdtmf")) {
                        global_relaxdtmf = ast_true(v->value);
                } else if (!strcasecmp(v->name, "checkmwi")) {
@@ -12668,8 +12680,6 @@ static int reload_config(enum channelreloadreason reason)
                                ast_log(LOG_WARNING, "'%s' is not a valid RTP keepalive time at line %d.  Using default.\n", v->value, v->lineno);
                                global_rtpkeepalive = 0;
                        }
-               } else if (!strcasecmp(v->name, "videosupport")) {
-                       ast_set2_flag((&global_flags_page2), ast_true(v->value), SIP_PAGE2_VIDEOSUPPORT);       
                } else if (!strcasecmp(v->name, "compactheaders")) {
                        compactheaders = ast_true(v->value);
                } else if (!strcasecmp(v->name, "notifymimetype")) {
@@ -12716,7 +12726,7 @@ static int reload_config(enum channelreloadreason reason)
                                default_expiry = DEFAULT_DEFAULT_EXPIRY;
                } else if (!strcasecmp(v->name, "sipdebug")) {
                        if (ast_true(v->value))
-                               ast_set_flag(&global_flags_page2, SIP_PAGE2_DEBUG_CONFIG);
+                               ast_set_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONFIG);
                } else if (!strcasecmp(v->name, "dumphistory")) {
                        dumphistory = ast_true(v->value);
                } else if (!strcasecmp(v->name, "recordhistory")) {
@@ -12763,24 +12773,6 @@ static int reload_config(enum channelreloadreason reason)
                        ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, 1);
                } else if (!strcasecmp(v->name, "disallow")) {
                        ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, 0);
-               } else if (!strcasecmp(v->name, "allowsubscribe")) {
-                       if (ast_true(v->value)) {
-                               ast_log(LOG_DEBUG, "Turning on global subscription support!\n");
-                               global_allowsubscribe = TRUE;
-                               ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
-                       } else {
-                               global_allowsubscribe = FALSE;
-                               ast_log(LOG_DEBUG, "Turning off global subscription support!\n");
-                               ast_clear_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
-                       }
-               } else if (!strcasecmp(v->name, "allowoverlap")) {
-                       if (ast_true(v->value)) {
-                               ast_log(LOG_DEBUG, "Turning on global overlap support!\n");
-                               ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP);
-                       } else {
-                               ast_log(LOG_DEBUG, "Turning off global overlap support!\n");
-                               ast_clear_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP);
-                       }
                } else if (!strcasecmp(v->name, "allowexternaldomains")) {
                        allow_external_domains = ast_true(v->value);
                } else if (!strcasecmp(v->name, "autodomain")) {
@@ -12978,7 +12970,7 @@ static struct ast_rtp *sip_get_rtp_peer(struct ast_channel *chan)
        if (!p)
                return NULL;
        ast_mutex_lock(&p->lock);
-       if (p->rtp && ast_test_flag(p, SIP_CAN_REINVITE))
+       if (p->rtp && ast_test_flag(&p->flags[0], SIP_CAN_REINVITE))
                rtp =  p->rtp;
        ast_mutex_unlock(&p->lock);
        return rtp;
@@ -12994,7 +12986,7 @@ static struct ast_rtp *sip_get_vrtp_peer(struct ast_channel *chan)
                return NULL;
 
        ast_mutex_lock(&p->lock);
-       if (p->vrtp && ast_test_flag(p, SIP_CAN_REINVITE))
+       if (p->vrtp && ast_test_flag(&p->flags[0], SIP_CAN_REINVITE))
                rtp = p->vrtp;
        ast_mutex_unlock(&p->lock);
        return rtp;
@@ -13009,7 +13001,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc
        if (!p) 
                return -1;
        ast_mutex_lock(&p->lock);
-       if (ast_test_flag(p, SIP_ALREADYGONE)) {
+       if (ast_test_flag(&p->flags[0], SIP_ALREADYGONE)) {
                /* If we're destroyed, don't bother */
                ast_mutex_unlock(&p->lock);
                return 0;
@@ -13023,19 +13015,19 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc
        else
                memset(&p->vredirip, 0, sizeof(p->vredirip));
        p->redircodecs = codecs;
-       if (!ast_test_flag(p, SIP_GOTREFER)) {
+       if (!ast_test_flag(&p->flags[0], SIP_GOTREFER)) {
                if (!p->pendinginvite) {
                        if (option_debug > 2) {
                                char iabuf[INET_ADDRSTRLEN];
                                ast_log(LOG_DEBUG, "Sending reinvite on SIP '%s' - It's audio soon redirected to IP %s\n", p->callid, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp ? p->redirip.sin_addr : p->ourip));
                        }
                        transmit_reinvite_with_sdp(p);
-               } else if (!ast_test_flag(p, SIP_PENDINGBYE)) {
+               } else if (!ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
                        if (option_debug > 2) {
                                char iabuf[INET_ADDRSTRLEN];
                                ast_log(LOG_DEBUG, "Deferring reinvite on SIP '%s' - It's audio will be redirected to IP %s\n", p->callid, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp ? p->redirip.sin_addr : p->ourip));
                        }
-                       ast_set_flag(p, SIP_NEEDREINVITE);      
+                       ast_set_flag(&p->flags[0], SIP_NEEDREINVITE);   
                }
        }
        /* Reset lastrtprx timer */
@@ -13085,17 +13077,17 @@ static int sip_dtmfmode(struct ast_channel *chan, void *data)
        }
        ast_mutex_lock(&p->lock);
        if (!strcasecmp(mode,"info")) {
-               ast_clear_flag(p, SIP_DTMF);
-               ast_set_flag(p, SIP_DTMF_INFO);
+               ast_clear_flag(&p->flags[0], SIP_DTMF);
+               ast_set_flag(&p->flags[0], SIP_DTMF_INFO);
        } else if (!strcasecmp(mode,"rfc2833")) {
-               ast_clear_flag(p, SIP_DTMF);
-               ast_set_flag(p, SIP_DTMF_RFC2833);
+               ast_clear_flag(&p->flags[0], SIP_DTMF);
+               ast_set_flag(&p->flags[0], SIP_DTMF_RFC2833);
        } else if (!strcasecmp(mode,"inband")) { 
-               ast_clear_flag(p, SIP_DTMF);
-               ast_set_flag(p, SIP_DTMF_INBAND);
+               ast_clear_flag(&p->flags[0], SIP_DTMF);
+               ast_set_flag(&p->flags[0], SIP_DTMF_INBAND);
        } else
                ast_log(LOG_WARNING, "I don't know about this dtmf mode: %s\n",mode);
-       if (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_INBAND) {
+       if (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_INBAND) {
                if (!p->vad) {
                        p->vad = ast_dsp_new();
                        ast_dsp_set_features(p->vad, DSP_FEATURE_DTMF_DETECT);
@@ -13199,7 +13191,7 @@ static int sip_sipredirect(struct sip_pvt *p, const char *dest)
        transmit_response_reliable(p, "302 Moved Temporarily", &p->initreq);
 
        /* this is all that we want to send to that SIP device */
-       ast_set_flag(p, SIP_ALREADYGONE);
+       ast_set_flag(&p->flags[0], SIP_ALREADYGONE);
 
        /* hangup here */
        return -1;