Fix the wireless settings button for AirPCap devices in the
[obnox/wireshark/wip.git] / gtk / iax2_analysis.c
index 685f4a89882b024217737ea07917fe1c3e55d4a9..75446ed115adaa765a0c93b58b0b3ffa72d19363 100644 (file)
@@ -37,6 +37,8 @@
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
+
+#include <stdio.h>
 #include <math.h>
 #include <string.h>
 #include <locale.h>
 #include <epan/strutil.h>
 
 #include "../util.h"
-#include "../register.h"
 #include "../g711.h"
 #include "../alert_box.h"
 #include "../simple_dialog.h"
 #include "../stat_menu.h"
 #include "../progress_dlg.h"
-#include "../color.h"
 #include "../tempfile.h"
 #include <wsutil/file_util.h>
 
@@ -83,6 +83,9 @@
 #include "gtk/iax2_analysis.h"
 #include "gtk/rtp_stream.h"
 #include "gtk/rtp_stream_dlg.h"
+#include "gtk/utf8_entities.h"
+
+#include "gtk/old-gtk-compat.h"
 
 enum
 {
@@ -99,16 +102,10 @@ enum
 };
 
 /****************************************************************************/
-
-typedef struct column_arrows {
-       GtkWidget *table;
-       GtkWidget *ascend_pm;
-       GtkWidget *descend_pm;
-} column_arrows;
-
 #define NUM_COLS 7
 #define NUM_GRAPH_ITEMS 100000
 #define MAX_YSCALE 16
+#define AUTO_MAX_YSCALE_INDEX 0
 #define AUTO_MAX_YSCALE 0
 #define MAX_GRAPHS 4
 #define GRAPH_FWD_JITTER 0
@@ -118,12 +115,12 @@ typedef struct column_arrows {
 static guint32 yscale_max[MAX_YSCALE] = {AUTO_MAX_YSCALE, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000, 5000000, 10000000, 20000000, 50000000};
 
 #define MAX_PIXELS_PER_TICK 4
-#define DEFAULT_PIXELS_PER_TICK 1
+#define DEFAULT_PIXELS_PER_TICK_INDEX 1
 static guint32 pixels_per_tick[MAX_PIXELS_PER_TICK] = {1, 2, 5, 10};
 static const char *graph_descr[4] = {"Fwd Jitter", "Fwd Difference", "Rvr Jitter", "Rvr Difference"};
 /* unit is in ms */
 #define MAX_TICK_VALUES 5
-#define DEFAULT_TICK_VALUE 1
+#define DEFAULT_TICK_INTERVAL_VALUES_INDEX 1
 static guint tick_interval_values[MAX_TICK_VALUES] = { 1, 10, 100, 1000, 10000 };
 typedef struct _dialog_graph_graph_item_t {
        guint32 value;
@@ -137,27 +134,36 @@ typedef struct _dialog_graph_graph_t {
        gboolean display;
        GtkWidget *display_button;
        int hf_index;
+#if GTK_CHECK_VERSION(3,0,0)
+       GdkRGBA rgba_color;
+#endif
        GdkColor color;
-       GdkGC *gc;
        gchar title[100];
 } dialog_graph_graph_t;
 
 
 typedef struct _dialog_graph_t {
        gboolean needs_redraw;
-       gint32 interval;    /* measurement interval in ms */
+       gint32 interval_index; /* index into tick_interval_values array */
+       gint32 interval;       /* measurement interval in ms */
        guint32 last_interval;
-       guint32 max_interval; /* XXX max_interval and num_items are redundant */
+       guint32 max_interval;  /* XXX max_interval and num_items are redundant */
        guint32 num_items;
        struct _dialog_graph_graph_t graph[MAX_GRAPHS];
        GtkWidget *window;
        GtkWidget *draw_area;
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_surface_t *surface;
+#else
        GdkPixmap *pixmap;
+#endif
        GtkAdjustment *scrollbar_adjustment;
        GtkWidget *scrollbar;
-       int pixmap_width;
-       int pixmap_height;
+       int surface_width;
+       int surface_height;
+       int pixels_per_tick_index; /* index into pixels_per_tick array */
        int pixels_per_tick;
+       int max_y_units_index;     /* index into yscale_max array      */
        int max_y_units;
        double start_time;
 } dialog_graph_t;
@@ -178,9 +184,6 @@ typedef struct _dialog_data_t {
        GtkWidget *save_csv_as_w;
        gint notebook_signal_id;
        dialog_graph_t dialog_graph;
-#ifdef USE_CONVERSATION_GRAPH
-       GtkWidget *graph_window;
-#endif
 } dialog_data_t;
 
 #define OK_TEXT "[ Ok ]"
@@ -192,6 +195,7 @@ typedef enum {
        TAP_RTP_PADDING_ERROR,
        TAP_RTP_SHORT_FRAME,
        TAP_RTP_FILE_OPEN_ERROR,
+       TAP_RTP_FILE_WRITE_ERROR,
        TAP_RTP_NO_DATA
 } error_type_t;
 
@@ -209,8 +213,6 @@ struct _info_direction {
        tap_iax2_save_info_t saveinfo;
 };
 
-#define TMPNAMSIZE 100
-
 #define SILENCE_PCMU   (guint8)0xFF
 #define SILENCE_PCMA   (guint8)0x55
 
@@ -230,16 +232,12 @@ typedef struct _user_data_t {
        struct _info_direction forward;
        struct _info_direction reversed;
 
-       char f_tempname[TMPNAMSIZE];
-       char r_tempname[TMPNAMSIZE];
+       char *f_tempname;
+       char *r_tempname;
 
        /* dialog associated data */
        dialog_data_t dlg;
 
-#ifdef USE_CONVERSATION_GRAPH
-       time_series_t series_fwd;
-       time_series_t series_rev;
-#endif
 } user_data_t;
 
 
@@ -256,16 +254,16 @@ static const gchar *titles[7] =    {
 
 #define SAVE_FORWARD_DIRECTION_MASK 0x01
 #define SAVE_REVERSE_DIRECTION_MASK 0x02
-#define SAVE_BOTH_DIRECTION_MASK       (SAVE_FORWARD_DIRECTION_MASK|SAVE_REVERSE_DIRECTION_MASK)
+#define SAVE_BOTH_DIRECTION_MASK    (SAVE_FORWARD_DIRECTION_MASK|SAVE_REVERSE_DIRECTION_MASK)
 
 #define SAVE_NONE_FORMAT 0
-#define SAVE_WAV_FORMAT        1
-#define SAVE_AU_FORMAT 2
-#define SAVE_SW_FORMAT 3
-#define SAVE_RAW_FORMAT        4
+#define SAVE_WAV_FORMAT         1
+#define SAVE_AU_FORMAT  2
+#define SAVE_SW_FORMAT  3
+#define SAVE_RAW_FORMAT         4
 
 
-static void on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data);
+static void on_refresh_bt_clicked(GtkWidget *bt _U_, gpointer data);
 /****************************************************************************/
 static void enable_graph(dialog_graph_graph_t *dgg)
 {
@@ -344,16 +342,6 @@ iax2_reset(void *user_data_arg)
        /* reset graph info */
        dialog_graph_reset(user_data);
 
-#ifdef USE_CONVERSATION_GRAPH
-       if (user_data->dlg.graph_window != NULL)
-               window_destroy(user_data->dlg.graph_window);
-
-       g_array_free(user_data->series_fwd.value_pairs, TRUE);
-       user_data->series_fwd.value_pairs = g_array_new(FALSE, FALSE, sizeof(value_pair_t));
-
-       g_array_free(user_data->series_rev.value_pairs, TRUE);
-       user_data->series_rev.value_pairs = g_array_new(FALSE, FALSE, sizeof(value_pair_t));
-#endif
 
        /* XXX check for error at fclose? */
        if (user_data->forward.saveinfo.fp != NULL)
@@ -370,40 +358,40 @@ iax2_reset(void *user_data_arg)
 }
 
 /****************************************************************************/
-static int iax2_packet_add_graph(dialog_graph_graph_t *dgg, tap_iax2_stat_t *statinfo, packet_info *pinfo, guint32 value)
+static gboolean iax2_packet_add_graph(dialog_graph_graph_t *dgg, tap_iax2_stat_t *statinfo, packet_info *pinfo, guint32 value)
 {
        dialog_graph_graph_item_t *it;
-       int idx;
+       guint32 idx;
        double rtp_time;
 
        /* we sometimes get called when dgg is disabled.
        this is a bug since the tap listener should be removed first */
        if(!dgg->display){
-               return 0;
+               return FALSE;
        }
 
        dgg->ud->dlg.dialog_graph.needs_redraw=TRUE;
 
        /*
-       * Find which interval this is supposed to to in and store the
+       * Find which interval this is supposed to go in and store the
        * interval index as idx
        */
        if (dgg->ud->dlg.dialog_graph.start_time == -1){ /* it is the first */
                dgg->ud->dlg.dialog_graph.start_time = statinfo->start_time;
        }
-       rtp_time = nstime_to_sec(&pinfo->fd->rel_ts) - dgg->ud->dlg.dialog_graph.start_time;
+       rtp_time = nstime_to_msec(&pinfo->fd->rel_ts) - dgg->ud->dlg.dialog_graph.start_time;
        if(rtp_time<0){
                return FALSE;
        }
-       idx = (guint32)(rtp_time*1000)/dgg->ud->dlg.dialog_graph.interval;
+       idx = (guint32)(rtp_time)/dgg->ud->dlg.dialog_graph.interval;
 
        /* some sanity checks */
-       if((idx<0)||(idx>=NUM_GRAPH_ITEMS)){
+       if(idx>=NUM_GRAPH_ITEMS){
                return FALSE;
        }
 
        /* update num_items */
-       if((guint32)idx > dgg->ud->dlg.dialog_graph.num_items){
+       if(idx > dgg->ud->dlg.dialog_graph.num_items){
                dgg->ud->dlg.dialog_graph.num_items=idx;
                dgg->ud->dlg.dialog_graph.max_interval=idx*dgg->ud->dlg.dialog_graph.interval;
        }
@@ -434,74 +422,74 @@ static void iax2_draw(void *prs _U_)
 
 /* forward declarations */
 static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number,
-                         double delta, double jitter, double bandwidth, gchar *status, 
-                         gchar *timeStr, guint32 pkt_len,gchar *color_str, guint32 flags);
+                       double delta, double jitter, double bandwidth, gchar *status,
+                       gchar *timeStr, guint32 pkt_len,gchar *color_str, guint32 flags);
 
 static int iax2_packet_add_info(GtkWidget *list,user_data_t * user_data,
        tap_iax2_stat_t *statinfo, packet_info *pinfo,
        const struct _iax2_info_t *iax2info);
 
-static int iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
-                                   tap_iax2_stat_t *statinfo,
-                                   packet_info *pinfo,
-                                   const struct _iax2_info_t *iax2info);
+static void iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
+                                   tap_iax2_stat_t *statinfo,
+                                   packet_info *pinfo,
+                                   const struct _iax2_info_t *iax2info);
 
 
 /****************************************************************************/
 /* whenever a IAX2 packet is seen by the tap listener */
-static int iax2_packet(void *user_data_arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *iax2info_arg)
+static gboolean iax2_packet(void *user_data_arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *iax2info_arg)
 {
        user_data_t *user_data = user_data_arg;
        const struct _iax2_info_t *iax2info = iax2info_arg;
-#ifdef USE_CONVERSATION_GRAPH
-       value_pair_t vp;
-#endif
+
        /* we ignore packets that are not displayed */
        if (pinfo->fd->flags.passed_dfilter == 0)
-               return 0;
-               
+               return FALSE;
+
        /* we ignore packets that carry no data */
        if (iax2info->payload_len == 0)
-               return 0;
-               
+               return FALSE;
+
        /* is it the forward direction?  */
        else if (CMP_ADDRESS(&(user_data->ip_src_fwd), &(pinfo->net_src)) == 0
-               && user_data->port_src_fwd == pinfo->srcport
-               && CMP_ADDRESS(&(user_data->ip_dst_fwd), &(pinfo->net_dst)) == 0
-               && user_data->port_dst_fwd == pinfo->destport)  {
-#ifdef USE_CONVERSATION_GRAPH
-               vp.time = ((double)pinfo->fd->rel_secs + (double)pinfo->fd->rel_usecs/1000000);
-               vp.fnumber = pinfo->fd->num;
-               g_array_append_val(user_data->series_fwd.value_pairs, vp);
-#endif
+                && user_data->port_src_fwd == pinfo->srcport
+                && CMP_ADDRESS(&(user_data->ip_dst_fwd), &(pinfo->net_dst)) == 0
+                && user_data->port_dst_fwd == pinfo->destport)  {
                iax2_packet_analyse(&(user_data->forward.statinfo), pinfo, iax2info);
-               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_JITTER]), &(user_data->forward.statinfo), pinfo, (guint32)(user_data->forward.statinfo.jitter*1000000));
-               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_DIFF]), &(user_data->forward.statinfo), pinfo, (guint32)(user_data->forward.statinfo.diff*1000000));
+               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_JITTER]),
+                                     &(user_data->forward.statinfo),
+                                     pinfo,
+                                     (guint32)(user_data->forward.statinfo.jitter*1000000));
+               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_DIFF]),
+                                     &(user_data->forward.statinfo),
+                                     pinfo,
+                                     (guint32)(user_data->forward.statinfo.diff*1000000));
                iax2_packet_add_info(user_data->dlg.list_fwd, user_data,
-                       &(user_data->forward.statinfo), pinfo, iax2info);
+                                    &(user_data->forward.statinfo), pinfo, iax2info);
                iax2_packet_save_payload(&(user_data->forward.saveinfo),
-                       &(user_data->forward.statinfo), pinfo, iax2info);
+                                        &(user_data->forward.statinfo), pinfo, iax2info);
        }
        /* is it the reversed direction? */
        else if (CMP_ADDRESS(&(user_data->ip_src_rev), &(pinfo->net_src)) == 0
-               && user_data->port_src_rev == pinfo->srcport
-               && CMP_ADDRESS(&(user_data->ip_dst_rev), &(pinfo->net_dst)) == 0
-               && user_data->port_dst_rev == pinfo->destport)  {
-#ifdef USE_CONVERSATION_GRAPH
-               vp.time = ((double)pinfo->fd->rel_secs + (double)pinfo->fd->rel_usecs/1000000);
-               vp.fnumber = pinfo->fd->num;
-               g_array_append_val(user_data->series_rev.value_pairs, vp);
-#endif
+                && user_data->port_src_rev == pinfo->srcport
+                && CMP_ADDRESS(&(user_data->ip_dst_rev), &(pinfo->net_dst)) == 0
+                && user_data->port_dst_rev == pinfo->destport)  {
                iax2_packet_analyse(&(user_data->reversed.statinfo), pinfo, iax2info);
-               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_JITTER]), &(user_data->reversed.statinfo), pinfo, (guint32)(user_data->reversed.statinfo.jitter*1000000));
-               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_DIFF]), &(user_data->reversed.statinfo), pinfo, (guint32)(user_data->reversed.statinfo.diff*1000000));
+               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_JITTER]),
+                                     &(user_data->reversed.statinfo),
+                                     pinfo,
+                                     (guint32)(user_data->reversed.statinfo.jitter*1000000));
+               iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_DIFF]),
+                                     &(user_data->reversed.statinfo),
+                                     pinfo,
+                                     (guint32)(user_data->reversed.statinfo.diff*1000000));
                iax2_packet_add_info(user_data->dlg.list_rev, user_data,
-                       &(user_data->reversed.statinfo), pinfo, iax2info);
+                                    &(user_data->reversed.statinfo), pinfo, iax2info);
                iax2_packet_save_payload(&(user_data->reversed.saveinfo),
-                       &(user_data->reversed.statinfo), pinfo, iax2info);
+                                        &(user_data->reversed.statinfo), pinfo, iax2info);
        }
 
-       return 0;
+       return FALSE;
 }
 
 /****************************************************************************/
@@ -509,8 +497,8 @@ static int iax2_packet(void *user_data_arg, packet_info *pinfo, epan_dissect_t *
 /****************************************************************************/
 
 int iax2_packet_analyse(tap_iax2_stat_t *statinfo,
-                              packet_info *pinfo,
-                              const struct _iax2_info_t *iax2info)
+                       packet_info *pinfo,
+                       const struct _iax2_info_t *iax2info)
 {
        double current_time;
        double current_jitter;
@@ -590,7 +578,7 @@ int iax2_packet_analyse(tap_iax2_stat_t *statinfo,
 
        /* TODO: lost packets / duplicated:  we should infer this from timestamp... */
        statinfo->time = current_time;
-       statinfo->timestamp = iax2info->timestamp;
+       statinfo->timestamp = iax2info->timestamp; /* millisecs */
        statinfo->stop_seq_nr = 0;
        statinfo->total_nr++;
 
@@ -598,11 +586,13 @@ int iax2_packet_analyse(tap_iax2_stat_t *statinfo,
 }
 
 
+#if 0
 static const GdkColor COLOR_DEFAULT = {0, 0xffff, 0xffff, 0xffff};
 static const GdkColor COLOR_ERROR = {0, 0xffff, 0xbfff, 0xbfff};
 static const GdkColor COLOR_WARNING = {0, 0xffff, 0xdfff, 0xbfff};
 static const GdkColor COLOR_CN = {0, 0xbfff, 0xbfff, 0xffff};
 static const GdkColor COLOR_FOREGROUND = {0, 0x0000, 0x0000, 0x0000};
+#endif
 
 /****************************************************************************/
 /* adds statistics information from the packet to the list */
@@ -615,7 +605,7 @@ static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
        struct tm *tm_tmp;
        time_t then;
        gchar status[40];
-       GdkColor color = COLOR_DEFAULT;
+       /* GdkColor color = COLOR_DEFAULT; */
        gchar color_str[14];
        then = pinfo->fd->abs_ts.secs;
        msecs = (guint16)(pinfo->fd->abs_ts.nsecs/1000000);
@@ -628,23 +618,23 @@ static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
                tm_tmp->tm_min,
                tm_tmp->tm_sec,
                msecs);
-               
+
        /* Default to using black on white text if nothing below overrides it */
        g_snprintf(color_str,sizeof(color_str),"#ffffffffffff");
 
        if (statinfo->flags & STAT_FLAG_WRONG_SEQ) {
                g_snprintf(status,sizeof(status),"Wrong sequence nr.");
-               color = COLOR_ERROR;
+               /* color = COLOR_ERROR; */
                g_snprintf(color_str,sizeof(color_str),"#ffffbfffbfff");
        }
        else if (statinfo->flags & STAT_FLAG_REG_PT_CHANGE) {
                g_snprintf(status,sizeof(status),"Payload changed to PT=%u", statinfo->pt);
-               color = COLOR_WARNING;
+               /* color = COLOR_WARNING; */
                g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
        }
        else if (statinfo->flags & STAT_FLAG_WRONG_TIMESTAMP) {
                g_snprintf(status,sizeof(status),"Incorrect timestamp");
-               color = COLOR_WARNING;
+               /* color = COLOR_WARNING; */
                g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
        }
        else if ((statinfo->flags & STAT_FLAG_PT_CHANGE)
@@ -653,12 +643,12 @@ static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
                &&  (statinfo->flags & STAT_FLAG_FOLLOW_PT_CN)
                &&  !(statinfo->flags & STAT_FLAG_MARKER)) {
                g_snprintf(status,sizeof(status),"Marker missing?");
-               color = COLOR_WARNING;
+               /* color = COLOR_WARNING; */
                g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
        }
        else {
                if (statinfo->flags & STAT_FLAG_MARKER) {
-                       color = COLOR_WARNING;
+                       /* color = COLOR_WARNING; */
                        g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
                }
                g_snprintf(status,sizeof(status),OK_TEXT);
@@ -666,7 +656,7 @@ static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
        /*  is this the first packet we got in this direction? */
        if (statinfo->flags & STAT_FLAG_FIRST) {
                add_to_list(list, user_data,
-                       pinfo->fd->num, 
+                       pinfo->fd->num,
                        0,
                        0,
                        statinfo->bandwidth,
@@ -677,7 +667,7 @@ static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
        }
        else {
                add_to_list(list, user_data,
-                       pinfo->fd->num, 
+                       pinfo->fd->num,
                        statinfo->delta*1000,
                        statinfo->jitter*1000,
                        statinfo->bandwidth,
@@ -691,10 +681,10 @@ static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
 
 #define MAX_SILENCE_TICKS 1000000
 /****************************************************************************/
-static int iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
-                                   tap_iax2_stat_t *statinfo,
-                                   packet_info *pinfo,
-                                   const struct _iax2_info_t *iax2info)
+static void iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
+                                   tap_iax2_stat_t *statinfo,
+                                   packet_info *pinfo,
+                                   const struct _iax2_info_t *iax2info)
 {
        const guint8 *data;
        size_t nchars;
@@ -712,26 +702,37 @@ static int iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
        /* save the voice information */
        /* if there was already an error, we quit */
        if (saveinfo->saved == FALSE)
-               return 0;
+               return;
 
        /* if the captured length and packet length aren't equal, we quit */
        if (pinfo->fd->pkt_len != pinfo->fd->cap_len) {
                saveinfo->saved = FALSE;
                saveinfo->error_type = TAP_RTP_WRONG_LENGTH;
-               return 0;
+               return;
        }
 
        if (iax2info->payload_len > 0) {
                data = iax2info->payload_data;
-               nchars=fwrite(data, sizeof(unsigned char), iax2info->payload_len, saveinfo->fp);
+               nchars = fwrite(data, sizeof(unsigned char), iax2info->payload_len, saveinfo->fp);
+               if (nchars != iax2info->payload_len) {
+                       /* Write error or short write */
+                       saveinfo->saved = FALSE;
+                       saveinfo->error_type = TAP_RTP_FILE_WRITE_ERROR;
+                       return;
+               }
                saveinfo->count+=iax2info->payload_len;
 
-               fflush(saveinfo->fp);
+               if (fflush(saveinfo->fp) == EOF) {
+                       /* Write error */
+                       saveinfo->saved = FALSE;
+                       saveinfo->error_type = TAP_RTP_FILE_WRITE_ERROR;
+                       return;
+               }
                saveinfo->saved = TRUE;
-               return 0;
+               return;
        }
 
-       return 0;
+       return;
 }
 
 
@@ -742,8 +743,10 @@ static int iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
 
 /****************************************************************************/
 /* close the dialog window and remove the tap listener */
-static void on_destroy(GtkWidget *win _U_, user_data_t *user_data)
+static void on_iax2_window_destroy(GtkWidget *win _U_, gpointer data)
 {
+       user_data_t *user_data = data;
+
        /* remove tap listener */
        protect_thread_critical_region();
        remove_tap_listener(user_data);
@@ -771,136 +774,58 @@ static void on_destroy(GtkWidget *win _U_, user_data_t *user_data)
        if (user_data->dlg.dialog_graph.window != NULL)
                window_destroy(user_data->dlg.dialog_graph.window);
 
-#ifdef USE_CONVERSATION_GRAPH
-       /* destroy graph window if open */
-       if (user_data->dlg.graph_window != NULL)
-               window_destroy(user_data->dlg.graph_window);
-#endif
 
        /* disable the "switch_page" signal in the dlg, otherwise will be called when the windows is destroy and cause an exception using GTK1*/
        /* XXX: Is this still true for GTK2 ???  */
        g_signal_handler_disconnect(user_data->dlg.notebook, user_data->dlg.notebook_signal_id);
 
+       g_free(user_data->f_tempname);
+       g_free(user_data->r_tempname);
        g_free(user_data);
 }
 
 
 /****************************************************************************/
 static void on_notebook_switch_page(GtkNotebook *notebook _U_,
-                                    GtkNotebookPage *page _U_,
-                                    gint page_num _U_,
-                                    user_data_t *user_data _U_)
+                                   gpointer *page _U_,
+                                   gint page_num,
+                                   gpointer data)
 {
+       user_data_t *user_data = data;
+
        user_data->dlg.selected_list =
                (page_num==0) ? user_data->dlg.list_fwd : user_data->dlg.list_rev ;
-               
-       user_data->dlg.selected_list_row = 0;
-}
 
-/****************************************************************************/
-static void on_list_select_row(GtkTreeSelection *selection, 
-                               user_data_t *user_data _U_/*gpointer data */)
-{
-       user_data->dlg.selected_list_sel = selection;
+       user_data->dlg.selected_list_row = 0;
 }
 
-
-#ifdef USE_CONVERSATION_GRAPH
-Note this will not work any more as clist is removed.
 /****************************************************************************/
-/* when the graph window gets destroyed */
-static void on_destroy_graph(GtkWidget *win _U_, user_data_t *user_data _U_)
+static void on_list_select_row(GtkTreeSelection *selection,
+                               gpointer data)
 {
-       /* note that graph window has been destroyed */
-       user_data->dlg.graph_window = NULL;
-}
+       user_data_t *user_data = data;
 
-/****************************************************************************/
-static void graph_selection_callback(value_pair_t vp, user_data_t *user_data)
-{
-       guint row;
-       GtkCList *clist = NULL;
-       if (vp.fnumber != 0) {
-               clist = GTK_CLIST(user_data->dlg.clist_fwd);
-               row = gtk_clist_find_row_from_data(clist,
-                               GUINT_TO_POINTER(vp.fnumber));
-               if (row==-1) {
-                       clist = GTK_CLIST(user_data->dlg.clist_rev);
-                       row = gtk_clist_find_row_from_data(clist,
-                                       GUINT_TO_POINTER(vp.fnumber));
-               }
-               if (row!=-1) {
-                       gtk_notebook_set_current_page(GTK_NOTEBOOK(user_data->dlg.notebook),
-                               (clist == GTK_CLIST(user_data->dlg.clist_fwd)) ? 0 : 1);
-                       gtk_clist_select_row(clist, row, 0);
-                       gtk_clist_moveto(clist, row, 0, 0.5, 0);
-               }
-       }
+       user_data->dlg.selected_list_sel = selection;
 }
 
 
-/****************************************************************************/
-static void on_graph_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data _U_)
-{
-       gchar title1[80];
-       gchar title2[80];
-       GList *list = NULL;
-
-       if (user_data->dlg.graph_window != NULL) {
-               /* There's already a graph window; reactivate it. */
-               reactivate_window(user_data->dlg.graph_window);
-               return;
-       }
-       list = g_list_append(list, &(user_data->series_fwd));
-       list = g_list_append(list, &(user_data->series_rev));
-
-       user_data->series_fwd.color.pixel = 0;
-       user_data->series_fwd.color.red = 0x80ff;
-       user_data->series_fwd.color.green = 0xe0ff;
-       user_data->series_fwd.color.blue = 0xffff;
-       user_data->series_fwd.yvalue = 0.5;
-
-       user_data->series_rev.color.pixel = 0;
-       user_data->series_rev.color.red = 0x60ff;
-       user_data->series_rev.color.green = 0xc0ff;
-       user_data->series_rev.color.blue = 0xffff;
-       user_data->series_rev.yvalue = -0.5;
-
-       g_snprintf(title1, sizeof(title1), "Forward: %s:%u to %s:%u",
-               get_addr_name(&(user_data->ip_src_fwd)),
-               user_data->port_src_fwd,
-               get_addr_name(&(user_data->ip_dst_fwd)),
-               user_data->port_dst_fwd);
-
-       g_snprintf(title2, sizeof(title2), "Reverse: %s:%u to %s:%u",
-               get_addr_name(&(user_data->ip_src_rev)),
-               user_data->port_src_rev,
-               get_addr_name(&(user_data->ip_dst_rev)),
-               user_data->port_dst_rev);
-
-       user_data->dlg.graph_window = show_conversation_graph(list, title1, title2,
-               &graph_selection_callback, user_data);
-       g_signal_connect(user_data->dlg.graph_window, "destroy",
-                       G_CALLBACK(on_destroy_graph), user_data);
-}
-#endif /*USE_CONVERSATION_GRAPH*/
-
 /****************************************************************************/
 static void dialog_graph_set_title(user_data_t* user_data)
 {
-       char            *title;
+       char    *title;
+
        if (!user_data->dlg.dialog_graph.window){
                return;
        }
        title = g_strdup_printf("IAX2 Graph Analysis Forward: %s:%u to %s:%u   Reverse: %s:%u to %s:%u",
-                       get_addr_name(&(user_data->ip_src_fwd)),
-                       user_data->port_src_fwd,
-                       get_addr_name(&(user_data->ip_dst_fwd)),
-                       user_data->port_dst_fwd,
-                       get_addr_name(&(user_data->ip_src_rev)),
-                       user_data->port_src_rev,
-                       get_addr_name(&(user_data->ip_dst_rev)),
-                       user_data->port_dst_rev);
+                               get_addr_name(&(user_data->ip_src_fwd)),
+                               user_data->port_src_fwd,
+                               get_addr_name(&(user_data->ip_dst_fwd)),
+                               user_data->port_dst_fwd,
+                               get_addr_name(&(user_data->ip_src_rev)),
+                               user_data->port_src_rev,
+                               get_addr_name(&(user_data->ip_dst_rev)),
+                               user_data->port_dst_rev);
 
        gtk_window_set_title(GTK_WINDOW(user_data->dlg.dialog_graph.window), title);
        g_free(title);
@@ -930,7 +855,7 @@ static void dialog_graph_reset(user_data_t* user_data)
        for(i=0;i<MAX_GRAPHS;i++){
                /* it is forward */
                if (i<2){
-                       g_snprintf(user_data->dlg.dialog_graph.graph[i].title, 
+                       g_snprintf(user_data->dlg.dialog_graph.graph[i].title,
                                   sizeof (user_data->dlg.dialog_graph.graph[0].title),
                                   "%s: %s:%u to %s:%u",
                        graph_descr[i],
@@ -992,8 +917,11 @@ static void dialog_graph_draw(user_data_t* user_data)
        guint32 bottom_y_border;
        PangoLayout  *layout;
        int label_width, label_height;
+       int label_width_mid, label_height_mid;
        guint32 draw_width, draw_height;
        char label_string[15];
+       GtkAllocation widget_alloc;
+       cairo_t *cr;
 
        /* new variables */
        guint32 num_time_intervals;
@@ -1046,12 +974,20 @@ static void dialog_graph_draw(user_data_t* user_data)
        /*
         * Clear out old plot
         */
-       gdk_draw_rectangle(user_data->dlg.dialog_graph.pixmap,
-                          user_data->dlg.dialog_graph.draw_area->style->white_gc,
-                          TRUE,
-                          0, 0,
-                          user_data->dlg.dialog_graph.draw_area->allocation.width,
-                          user_data->dlg.dialog_graph.draw_area->allocation.height);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_set_source_rgb (cr, 1, 1, 1);
+       gtk_widget_get_allocation(user_data->dlg.dialog_graph.draw_area, &widget_alloc);
+       cairo_rectangle (cr,
+               0,
+               0,
+               widget_alloc.width,
+               widget_alloc.height);
+       cairo_fill (cr);
+       cairo_destroy (cr);
 
 
        /*
@@ -1072,12 +1008,19 @@ static void dialog_graph_draw(user_data_t* user_data)
        /*
         * Calculate size of borders surrounding the plot
         * The border on the right side needs to be adjusted depending
-        * on the width of the text labels. For simplicity we assume that the
-        * top y scale label will be the widest one
+        * on the width of the text labels.
         */
        print_time_scale_string(label_string, sizeof(label_string), max_y);
        layout = gtk_widget_create_pango_layout(user_data->dlg.dialog_graph.draw_area, label_string);
        pango_layout_get_pixel_size(layout, &label_width, &label_height);
+       print_time_scale_string(label_string, sizeof(label_string), max_y*5/10);
+       layout = gtk_widget_create_pango_layout(user_data->dlg.dialog_graph.draw_area, label_string);
+       pango_layout_get_pixel_size(layout, &label_width_mid, &label_height_mid);
+       if (label_width_mid > label_width) {
+               label_width = label_width_mid;
+               label_height = label_height_mid;
+       }
+
        left_x_border=10;
        right_x_border=label_width+20;
        top_y_border=10;
@@ -1087,21 +1030,27 @@ static void dialog_graph_draw(user_data_t* user_data)
        /*
         * Calculate the size of the drawing area for the actual plot
         */
-       draw_width=user_data->dlg.dialog_graph.pixmap_width-right_x_border-left_x_border;
-       draw_height=user_data->dlg.dialog_graph.pixmap_height-top_y_border-bottom_y_border;
+       draw_width=user_data->dlg.dialog_graph.surface_width-right_x_border-left_x_border;
+       draw_height=user_data->dlg.dialog_graph.surface_height-top_y_border-bottom_y_border;
 
 
        /*
         * Draw the y axis and labels
         * (we always draw the y scale with 11 ticks along the axis)
         */
-       gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc,
-               user_data->dlg.dialog_graph.pixmap_width-right_x_border+1,
-               top_y_border,
-               user_data->dlg.dialog_graph.pixmap_width-right_x_border+1,
-               user_data->dlg.dialog_graph.pixmap_height-bottom_y_border);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_set_line_width (cr, 1.0);
+       cairo_move_to(cr, user_data->dlg.dialog_graph.surface_width-right_x_border+1.5, top_y_border+0.5);
+       cairo_line_to(cr, user_data->dlg.dialog_graph.surface_width-right_x_border+1.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+0.5);
+       cairo_stroke(cr);
+       cairo_destroy(cr);
+
        for(i=0;i<=10;i++){
-               int xwidth, lwidth;
+               int xwidth;
 
                xwidth=5;
                if(!(i%5)){
@@ -1109,41 +1058,69 @@ static void dialog_graph_draw(user_data_t* user_data)
                        xwidth=10;
                }
                /* draw the tick */
-               gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+1,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+1+xwidth,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10);
+#if GTK_CHECK_VERSION(2,22,0)
+               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+               cairo_set_line_width (cr, 1.0);
+               cairo_move_to(cr, 
+                       user_data->dlg.dialog_graph.surface_width-right_x_border+1.5, 
+                       user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10+0.5);
+               
+               cairo_line_to(cr, 
+                       user_data->dlg.dialog_graph.surface_width-right_x_border+1.5+xwidth,
+                       user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10+0.5);
+               cairo_stroke(cr);
+               cairo_destroy(cr);
                /* draw the labels */
                if(i==0){
                        print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+15+label_width-lwidth,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10-label_height/2,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               user_data->dlg.dialog_graph.surface_width-right_x_border+15+label_width-lwidth, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10-label_height/2);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
                if(i==5){
                        print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+15+label_width-lwidth,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10-label_height/2,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               user_data->dlg.dialog_graph.surface_width-right_x_border+15+label_width-lwidth, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10-label_height/2);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
                if(i==10){
                        print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+15+label_width-lwidth,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border-draw_height*i/10-label_height/2,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               user_data->dlg.dialog_graph.surface_width-right_x_border+15+label_width-lwidth, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border-draw_height*i/10-label_height/2);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
        }
 
@@ -1165,7 +1142,16 @@ static void dialog_graph_draw(user_data_t* user_data)
 
 /*XXX*/
        /* plot the x-scale */
-       gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc, left_x_border, user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+1, user_data->dlg.dialog_graph.pixmap_width-right_x_border+1, user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+1);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_set_line_width (cr, 1.0);
+       cairo_move_to(cr, left_x_border+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+1.5);
+       cairo_line_to(cr, user_data->dlg.dialog_graph.surface_width-right_x_border+1.5,user_data->dlg.dialog_graph.surface_height-bottom_y_border+1.5);
+       cairo_stroke(cr);
+       cairo_destroy(cr);
 
        if((last_interval/user_data->dlg.dialog_graph.interval)>draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1){
                first_interval=(last_interval/user_data->dlg.dialog_graph.interval)-draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1;
@@ -1200,14 +1186,18 @@ static void dialog_graph_draw(user_data_t* user_data)
                }
 
                x=draw_width+left_x_border-((last_interval-current_interval)/user_data->dlg.dialog_graph.interval)*user_data->dlg.dialog_graph.pixels_per_tick;
-               gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                             x-1-user_data->dlg.dialog_graph.pixels_per_tick/2,
-                             user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+1,
-                             x-1-user_data->dlg.dialog_graph.pixels_per_tick/2,
-                             user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+xlen+1);
+#if GTK_CHECK_VERSION(2,22,0)
+               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+               cairo_set_line_width (cr, 1.0);
+               cairo_move_to(cr, x-1-user_data->dlg.dialog_graph.pixels_per_tick/2+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+1.5);
+               cairo_line_to(cr, x-1-user_data->dlg.dialog_graph.pixels_per_tick/2+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+xlen+1.5);
+               cairo_stroke(cr);
+               cairo_destroy(cr);
 
                if(xlen==17){
-                       int lwidth;
                        if(user_data->dlg.dialog_graph.interval>=1000){
                                g_snprintf(label_string, sizeof(label_string), "%ds", current_interval/1000);
                        } else if(user_data->dlg.dialog_graph.interval>=100){
@@ -1222,11 +1212,17 @@ static void dialog_graph_draw(user_data_t* user_data)
                        }
                        pango_layout_set_text(layout, label_string, -1);
                        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       x-1-user_data->dlg.dialog_graph.pixels_per_tick/2-lwidth/2,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+20,
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                       cairo_move_to (cr, 
+                               x-1-user_data->dlg.dialog_graph.pixels_per_tick/2-lwidth/2, 
+                               user_data->dlg.dialog_graph.surface_height-bottom_y_border+20);
+                       pango_cairo_show_layout (cr, layout);
+                       cairo_destroy (cr);
+                       cr = NULL;
                }
 
        }
@@ -1240,40 +1236,52 @@ static void dialog_graph_draw(user_data_t* user_data)
         * Draw "x" for Sequence Errors and "m" for Marks
         */
        /* Draw the labels Fwd and Rev */
-       g_strlcpy(label_string, "<-Fwd", sizeof(label_string));
+       g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Fwd",sizeof(label_string));
        pango_layout_set_text(layout, label_string, -1);
        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+33-lwidth,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+3,
-               layout);
-       g_strlcpy(label_string, "<-Rev", sizeof(label_string));
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_move_to (cr, 
+               user_data->dlg.dialog_graph.surface_width-right_x_border+33-lwidth, 
+               user_data->dlg.dialog_graph.surface_height-bottom_y_border+3);
+       pango_cairo_show_layout (cr, layout);
+       cairo_destroy (cr);
+       cr = NULL;
+
+       g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Rev",sizeof(label_string));
        pango_layout_set_text(layout, label_string, -1);
        pango_layout_get_pixel_size(layout, &lwidth, NULL);
-       gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                       user_data->dlg.dialog_graph.pixmap_width-right_x_border+33-lwidth,
-                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+3+9,
-                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_move_to (cr, 
+               user_data->dlg.dialog_graph.surface_width-right_x_border+33-lwidth, 
+               user_data->dlg.dialog_graph.surface_height-bottom_y_border+3+9);
+       pango_cairo_show_layout (cr, layout);
+       cairo_destroy (cr);
+       cr = NULL;
 
        /* Draw the marks */
        for(i=MAX_GRAPHS-1;i>=0;i--){
                guint32 interval;
-               guint32 x_pos, prev_x_pos;
+               guint32 x_pos/*, prev_x_pos*/;
 
                /* XXX for fwd or rev, the flag info for jitter and diff is the same, and here I loop twice */
                if (!user_data->dlg.dialog_graph.graph[i].display){
                        continue;
                }
                /* initialize prev x/y to the low left corner of the graph */
-               prev_x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border;
+               /* prev_x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border; */
 
                for(interval=first_interval+user_data->dlg.dialog_graph.interval;interval<=last_interval;interval+=user_data->dlg.dialog_graph.interval){
                        x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border;
 
                        if(user_data->dlg.dialog_graph.graph[i].items[interval/user_data->dlg.dialog_graph.interval].flags & (STAT_FLAG_WRONG_SEQ|STAT_FLAG_MARKER)){
-                               int lwidth;
                                if (user_data->dlg.dialog_graph.graph[i].items[interval/user_data->dlg.dialog_graph.interval].flags & STAT_FLAG_WRONG_SEQ){
                                        g_strlcpy(label_string, "x", sizeof(label_string));
                                } else {
@@ -1282,14 +1290,20 @@ static void dialog_graph_draw(user_data_t* user_data)
 
                                pango_layout_set_text(layout, label_string, -1);
                                pango_layout_get_pixel_size(layout, &lwidth, NULL);
-                               gdk_draw_layout(user_data->dlg.dialog_graph.pixmap,
-                                       user_data->dlg.dialog_graph.draw_area->style->black_gc,
-                                       x_pos-1-lwidth/2,
-                                       user_data->dlg.dialog_graph.pixmap_height-bottom_y_border+3+7*(i/2),
-                                       layout);
+#if GTK_CHECK_VERSION(2,22,0)
+                               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                               cairo_move_to (cr, 
+                                       x_pos-1-lwidth/2, 
+                                       user_data->dlg.dialog_graph.surface_height-bottom_y_border+3+7*(i/2));
+                               pango_cairo_show_layout (cr, layout);
+                               cairo_destroy (cr);
+                               cr = NULL;
                        }
 
-                       prev_x_pos=x_pos;
+                       /* prev_x_pos=x_pos; */
                }
        }
 
@@ -1300,12 +1314,12 @@ static void dialog_graph_draw(user_data_t* user_data)
         */
        for(i=MAX_GRAPHS-1;i>=0;i--){
                guint32 interval;
-               guint32 x_pos, y_pos, prev_x_pos, prev_y_pos;
+               guint32 x_pos, y_pos, /*prev_x_pos,*/ prev_y_pos;
                if (!user_data->dlg.dialog_graph.graph[i].display){
                        continue;
                }
                /* initialize prev x/y to the low left corner of the graph */
-               prev_x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border;
+               /* prev_x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border; */
                prev_y_pos=draw_height-1+top_y_border;
 
                for(interval=first_interval+user_data->dlg.dialog_graph.interval;interval<=last_interval;interval+=user_data->dlg.dialog_graph.interval){
@@ -1323,40 +1337,53 @@ static void dialog_graph_draw(user_data_t* user_data)
                         */
                        if( (prev_y_pos==0) && (y_pos==0) ){
                                prev_y_pos=y_pos;
-                               prev_x_pos=x_pos;
+                               /* prev_x_pos=x_pos; */
                                continue;
                        }
 
                        if(val){
-                               gdk_draw_line(user_data->dlg.dialog_graph.pixmap, user_data->dlg.dialog_graph.graph[i].gc,
-                               x_pos, draw_height-1+top_y_border,
-                               x_pos, y_pos);
+#if GTK_CHECK_VERSION(2,22,0)
+                               cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+                               cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+                               gdk_cairo_set_source_color (cr, &user_data->dlg.dialog_graph.graph[i].color);
+                               cairo_set_line_width (cr, 1.0);
+                               cairo_move_to(cr, x_pos+0.5, draw_height-1+top_y_border+0.5);
+                               cairo_line_to(cr, x_pos+0.5, y_pos+0.5);
+                               cairo_stroke(cr);
+                               cairo_destroy(cr);
                        }
 
                        prev_y_pos=y_pos;
-                       prev_x_pos=x_pos;
+                       /* prev_x_pos=x_pos; */
                }
        }
 
 
-       gdk_draw_pixmap(user_data->dlg.dialog_graph.draw_area->window,
-                       user_data->dlg.dialog_graph.draw_area->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.dialog_graph.draw_area)],
-                       user_data->dlg.dialog_graph.pixmap,
-                       0, 0,
-                       0, 0,
-                       user_data->dlg.dialog_graph.pixmap_width, user_data->dlg.dialog_graph.pixmap_height);
+       cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.dialog_graph.draw_area));
+
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0); 
+#else
+       gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
+#endif
+       cairo_rectangle (cr, 0, 0, user_data->dlg.dialog_graph.surface_width, user_data->dlg.dialog_graph.surface_height);
+       cairo_fill (cr);
+
+       cairo_destroy (cr);
 
 
        /* update the scrollbar */
-       user_data->dlg.dialog_graph.scrollbar_adjustment->upper=(gfloat) user_data->dlg.dialog_graph.max_interval;
-       user_data->dlg.dialog_graph.scrollbar_adjustment->step_increment=(gfloat) ((last_interval-first_interval)/10);
-       user_data->dlg.dialog_graph.scrollbar_adjustment->page_increment=(gfloat) (last_interval-first_interval);
+       gtk_adjustment_set_upper(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) user_data->dlg.dialog_graph.max_interval);
+       gtk_adjustment_set_step_increment(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) ((last_interval-first_interval)/10));
+       gtk_adjustment_set_page_increment(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) (last_interval-first_interval));
        if((last_interval-first_interval)*100 < user_data->dlg.dialog_graph.max_interval){
-               user_data->dlg.dialog_graph.scrollbar_adjustment->page_size=(gfloat) (user_data->dlg.dialog_graph.max_interval/100);
+               gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) (user_data->dlg.dialog_graph.max_interval/100));
        } else {
-               user_data->dlg.dialog_graph.scrollbar_adjustment->page_size=(gfloat) (last_interval-first_interval);
+               gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment, (gfloat) (last_interval-first_interval));
        }
-       user_data->dlg.dialog_graph.scrollbar_adjustment->value=last_interval-user_data->dlg.dialog_graph.scrollbar_adjustment->page_size;
+       gtk_adjustment_set_value(user_data->dlg.dialog_graph.scrollbar_adjustment, last_interval - gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
        gtk_adjustment_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
        gtk_adjustment_value_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
 
@@ -1371,106 +1398,129 @@ static void dialog_graph_redraw(user_data_t* user_data)
 
 /****************************************************************************/
 
-static void quit(GtkWidget *widget _U_, user_data_t *user_data)
+static void draw_area_destroy_cb(GtkWidget *widget _U_, gpointer data)
 {
+       user_data_t *user_data = data;
+
        user_data->dlg.dialog_graph.window = NULL;
 }
 
 /****************************************************************************/
-static gint expose_event(GtkWidget *widget, GdkEventExpose *event)
+#if GTK_CHECK_VERSION(3,0,0)
+static gboolean draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer data)
 {
-       user_data_t *user_data;
-
-       user_data=(user_data_t *)g_object_get_data(G_OBJECT(widget), "user_data_t");
-       if(!user_data){
-               exit(10); /* !! XXX: should be g_assert or something ? */
-       }
+       user_data_t *user_data = data;
+       GtkAllocation allocation;
 
+       gtk_widget_get_allocation (widget, &allocation);
 
-       gdk_draw_pixmap(widget->window,
-                       widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
-                       user_data->dlg.dialog_graph.pixmap,
-                       event->area.x, event->area.y,
-                       event->area.x, event->area.y,
-                       event->area.width, event->area.height);
+       cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0); 
+       cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+       cairo_fill (cr);
 
        return FALSE;
 }
-
-/****************************************************************************/
-static gint configure_event(GtkWidget *widget, GdkEventConfigure *event _U_)
+#else
+static gboolean draw_area_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
 {
-       user_data_t *user_data;
-       int i;
+       user_data_t *user_data = data;
+       cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
 
-       user_data=(user_data_t *)g_object_get_data(G_OBJECT(widget), "user_data_t");
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0); 
+#else
+       gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
+#endif
+       cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
+       cairo_fill (cr);
 
-       if(!user_data){
-               exit(10);
-       }
+       cairo_destroy (cr);
 
+       return FALSE;
+}
+#endif
+/****************************************************************************/
+static gboolean draw_area_configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
+{
+       user_data_t *user_data = data;
+       GtkAllocation widget_alloc;
+       cairo_t *cr;
+
+#if GTK_CHECK_VERSION(2,22,0)
+       if(user_data->dlg.dialog_graph.surface){
+               g_object_unref(user_data->dlg.dialog_graph.surface);
+               user_data->dlg.dialog_graph.surface=NULL;
+       }
+       gtk_widget_get_allocation(widget, &widget_alloc);
+       user_data->dlg.dialog_graph.surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
+                       CAIRO_CONTENT_COLOR,
+                       widget_alloc.width,
+                       widget_alloc.height);
+#else
        if(user_data->dlg.dialog_graph.pixmap){
-               gdk_pixmap_unref(user_data->dlg.dialog_graph.pixmap);
+               g_object_unref(user_data->dlg.dialog_graph.pixmap);
                user_data->dlg.dialog_graph.pixmap=NULL;
        }
 
-       user_data->dlg.dialog_graph.pixmap=gdk_pixmap_new(widget->window,
-                       widget->allocation.width,
-                       widget->allocation.height,
+       gtk_widget_get_allocation(widget, &widget_alloc);
+       user_data->dlg.dialog_graph.pixmap=gdk_pixmap_new(gtk_widget_get_window(widget),
+                       widget_alloc.width,
+                       widget_alloc.height,
                        -1);
-       user_data->dlg.dialog_graph.pixmap_width=widget->allocation.width;
-       user_data->dlg.dialog_graph.pixmap_height=widget->allocation.height;
-
-       gdk_draw_rectangle(user_data->dlg.dialog_graph.pixmap,
-                       widget->style->white_gc,
-                       TRUE,
-                       0, 0,
-                       widget->allocation.width,
-                       widget->allocation.height);
+#endif
+       user_data->dlg.dialog_graph.surface_width=widget_alloc.width;
+       user_data->dlg.dialog_graph.surface_height=widget_alloc.height;
 
-       /* set up the colors and the GC structs for this pixmap */
-       for(i=0;i<MAX_GRAPHS;i++){
-               user_data->dlg.dialog_graph.graph[i].gc=gdk_gc_new(user_data->dlg.dialog_graph.pixmap);
-               gdk_gc_set_rgb_fg_color(user_data->dlg.dialog_graph.graph[i].gc, &user_data->dlg.dialog_graph.graph[i].color);
-       }
+#if GTK_CHECK_VERSION(2,22,0)
+       cr = cairo_create (user_data->dlg.dialog_graph.surface);
+#else
+       cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
+#endif
+       cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
+       cairo_set_source_rgb (cr, 1, 1, 1);
+       cairo_fill (cr);
+       cairo_destroy (cr);
 
        dialog_graph_redraw(user_data);
        return TRUE;
 }
 
 /****************************************************************************/
-static gint scrollbar_changed(GtkWidget *widget _U_, gpointer data)
+static void scrollbar_changed(GtkWidget *widget _U_, gpointer data)
 {
-        user_data_t *user_data=(user_data_t *)data;
-        guint32 mi;
+       user_data_t *user_data = data;
+       guint32 mi;
 
-        mi=(guint32) (user_data->dlg.dialog_graph.scrollbar_adjustment->value+user_data->dlg.dialog_graph.scrollbar_adjustment->page_size);
-        if(user_data->dlg.dialog_graph.last_interval==mi){
-                return TRUE;
-        }
-        if( (user_data->dlg.dialog_graph.last_interval==0xffffffff)
-        &&  (mi==user_data->dlg.dialog_graph.max_interval) ){
-                return TRUE;
-        }
+       mi=(guint32) (gtk_adjustment_get_value(user_data->dlg.dialog_graph.scrollbar_adjustment) + gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
+       if(user_data->dlg.dialog_graph.last_interval==mi){
+               return;
+       }
+       if( (user_data->dlg.dialog_graph.last_interval==0xffffffff)
+           &&  (mi==user_data->dlg.dialog_graph.max_interval) ){
+               return;
+       }
 
-        user_data->dlg.dialog_graph.last_interval=(mi/user_data->dlg.dialog_graph.interval)*user_data->dlg.dialog_graph.interval;
+       user_data->dlg.dialog_graph.last_interval=(mi/user_data->dlg.dialog_graph.interval)*user_data->dlg.dialog_graph.interval;
 
        dialog_graph_redraw(user_data);
-        return TRUE;
+       return;
 }
 
 /****************************************************************************/
 static void create_draw_area(user_data_t* user_data, GtkWidget *box)
 {
        user_data->dlg.dialog_graph.draw_area=gtk_drawing_area_new();
-       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "destroy", G_CALLBACK(quit), user_data);
-       g_object_set_data(G_OBJECT(user_data->dlg.dialog_graph.draw_area), "user_data_t", user_data);
+       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "destroy", G_CALLBACK(draw_area_destroy_cb), user_data);
 
-       gtk_widget_set_size_request(user_data->dlg.dialog_graph.draw_area, user_data->dlg.dialog_graph.pixmap_width, user_data->dlg.dialog_graph.pixmap_height);
+       gtk_widget_set_size_request(user_data->dlg.dialog_graph.draw_area, user_data->dlg.dialog_graph.surface_width, user_data->dlg.dialog_graph.surface_height);
 
        /* signals needed to handle backing pixmap */
-       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "expose_event", G_CALLBACK(expose_event), NULL);
-       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "configure_event", G_CALLBACK(configure_event), user_data);
+#if GTK_CHECK_VERSION(3,0,0)
+       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "draw", G_CALLBACK(draw_area_draw), user_data);
+#else
+       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "expose_event", G_CALLBACK(draw_area_expose_event), user_data);
+#endif
+       g_signal_connect(user_data->dlg.dialog_graph.draw_area, "configure_event", G_CALLBACK(draw_area_configure_event), user_data);
 
        gtk_widget_show(user_data->dlg.dialog_graph.draw_area);
        gtk_box_pack_start(GTK_BOX(box), user_data->dlg.dialog_graph.draw_area, TRUE, TRUE, 0);
@@ -1494,20 +1544,22 @@ static void disable_graph(dialog_graph_graph_t *dgg)
 }
 
 /****************************************************************************/
-static gint filter_callback(GtkWidget *widget _U_, dialog_graph_graph_t *dgg)
+static void filter_box_display_button_cb(GtkWidget *widget _U_, gpointer data)
 {
+       dialog_graph_graph_t *dgg = data;
+
        /* this graph is not active, just update display and redraw */
        if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dgg->display_button))){
                disable_graph(dgg);
                dialog_graph_redraw(dgg->ud);
-               return 0;
+               return;
        }
 
        enable_graph(dgg);
-       cf_retap_packets(&cfile, FALSE);
+       cf_retap_packets(&cfile);
        dialog_graph_redraw(dgg->ud);
 
-       return 0;
+       return;
 }
 
 /****************************************************************************/
@@ -1527,18 +1579,24 @@ static void create_filter_box(dialog_graph_graph_t *dgg, GtkWidget *box, int num
        gtk_box_pack_start(GTK_BOX(hbox), dgg->display_button, FALSE, FALSE, 0);
        gtk_widget_show(dgg->display_button);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dgg->display_button), dgg->display);
-       g_signal_connect(dgg->display_button, "toggled", G_CALLBACK(filter_callback), dgg);
+       g_signal_connect(dgg->display_button, "toggled", G_CALLBACK(filter_box_display_button_cb), dgg);
 
        label=gtk_label_new(dgg->title);
        gtk_widget_show(label);
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_widget_override_color(label, GTK_STATE_NORMAL, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_ACTIVE, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_PRELIGHT, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_SELECTED, &dgg->rgba_color);
+       gtk_widget_override_color(label, GTK_STATE_INSENSITIVE, &dgg->rgba_color);
+#else
        gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_ACTIVE, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_SELECTED, &dgg->color);
        gtk_widget_modify_fg(label, GTK_STATE_INSENSITIVE, &dgg->color);
-
+#endif
        return;
 }
 
@@ -1572,125 +1630,126 @@ static void create_filter_area(user_data_t* user_data, GtkWidget *box)
 }
 
 /****************************************************************************/
-static void yscale_select(GtkWidget *item, gpointer key)
+static void yscale_select(GtkWidget *item, gpointer data)
 {
-       int val;
-       user_data_t *user_data;
+       user_data_t *user_data = data;
+       int i;
 
-       user_data=(user_data_t *)key;
-       val=(long)g_object_get_data(G_OBJECT(item), "yscale_max");
+       i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
 
-       user_data->dlg.dialog_graph.max_y_units=val;
+       user_data->dlg.dialog_graph.max_y_units_index=i;
+       user_data->dlg.dialog_graph.max_y_units=yscale_max[i];
        dialog_graph_redraw(user_data);
 }
 
 /****************************************************************************/
-static void pixels_per_tick_select(GtkWidget *item, gpointer key)
+static void pixels_per_tick_select(GtkWidget *item, gpointer data)
 {
-       int val;
-       user_data_t *user_data;
+       user_data_t *user_data = data;
+       int i;
 
-       user_data=(user_data_t *)key;
-       val=(long)g_object_get_data(G_OBJECT(item), "pixels_per_tick");
-       user_data->dlg.dialog_graph.pixels_per_tick=val;
+       i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
+
+       user_data->dlg.dialog_graph.pixels_per_tick_index=i;
+       user_data->dlg.dialog_graph.pixels_per_tick=pixels_per_tick[i];
        dialog_graph_redraw(user_data);
 }
 
 /****************************************************************************/
-static void tick_interval_select(GtkWidget *item, gpointer key)
+static void tick_interval_select(GtkWidget *item, gpointer data)
 {
-       int val;
-       user_data_t *user_data;
+       user_data_t *user_data = data;
+       int i;
 
-       user_data=(user_data_t *)key;
-       val=(long)g_object_get_data(G_OBJECT(item), "tick_interval");
+       i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
 
-       user_data->dlg.dialog_graph.interval=val;
-       cf_retap_packets(&cfile, FALSE);
+       user_data->dlg.dialog_graph.interval_index=i;
+       user_data->dlg.dialog_graph.interval=tick_interval_values[i];
+       cf_retap_packets(&cfile);
        dialog_graph_redraw(user_data);
 }
 
 /****************************************************************************/
-static void create_yscale_max_menu_items(user_data_t* user_data, GtkWidget *menu)
+static GtkWidget *
+create_yscale_max_menu_items(user_data_t* user_data)
 {
        char str[15];
-       GtkWidget *menu_item;
+       GtkWidget *combo_box;
        int i;
 
+       combo_box = gtk_combo_box_text_new();
+
        for(i=0;i<MAX_YSCALE;i++){
                if(yscale_max[i]==AUTO_MAX_YSCALE){
-                       g_strlcpy(str,"Auto",15);
+                       g_strlcpy(str,"Auto",sizeof(str));
+               } else if (yscale_max[i] < 1000000) {
+                       g_snprintf(str, sizeof(str), "%u ms", yscale_max[i]/1000);
                } else {
-                   g_snprintf(str, sizeof(str), "%u ms", yscale_max[i]/1000);
+                       g_snprintf(str, sizeof(str), "%u s", yscale_max[i]/1000000);
                }
-               menu_item=gtk_menu_item_new_with_label(str);
-               g_object_set_data(G_OBJECT(menu_item), "yscale_max",
-                               GUINT_TO_POINTER(yscale_max[i]));
-               g_signal_connect(menu_item, "activate", G_CALLBACK(yscale_select), user_data);
-               gtk_widget_show(menu_item);
-               gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+                gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
        }
-       return;
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), user_data->dlg.dialog_graph.max_y_units_index);
+       g_signal_connect(combo_box, "changed", G_CALLBACK(yscale_select), user_data);
+
+       return combo_box;
 }
 
 /****************************************************************************/
-static void create_pixels_per_tick_menu_items(user_data_t* user_data, GtkWidget *menu)
+static GtkWidget *
+create_pixels_per_tick_menu_items(user_data_t *user_data)
 {
        char str[5];
-       GtkWidget *menu_item;
+       GtkWidget *combo_box;
        int i;
 
-       for(i=0;i<MAX_PIXELS_PER_TICK;i++){
-           g_snprintf(str, sizeof(str), "%u", pixels_per_tick[i]);
-               menu_item=gtk_menu_item_new_with_label(str);
+       combo_box = gtk_combo_box_text_new();
 
-               g_object_set_data(G_OBJECT(menu_item), "pixels_per_tick",
-                               GUINT_TO_POINTER(pixels_per_tick[i]));
-               g_signal_connect(menu_item, "activate", G_CALLBACK(pixels_per_tick_select), user_data);
-               gtk_widget_show(menu_item);
-               gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+       for(i=0;i<MAX_PIXELS_PER_TICK;i++){
+               g_snprintf(str, sizeof(str), "%u", pixels_per_tick[i]);
+                gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
        }
-       gtk_menu_set_active(GTK_MENU(menu), DEFAULT_PIXELS_PER_TICK);
-       return;
-}
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), user_data->dlg.dialog_graph.pixels_per_tick_index);
 
+       g_signal_connect(combo_box, "changed", G_CALLBACK(pixels_per_tick_select), user_data);
+
+       return combo_box;
+}
 
 /****************************************************************************/
-static void create_tick_interval_menu_items(user_data_t* user_data, GtkWidget *menu)
+static GtkWidget *
+create_tick_interval_menu_items(user_data_t *user_data)
 {
+       GtkWidget *combo_box;
        char str[15];
-       GtkWidget *menu_item;
        int i;
 
+       combo_box = gtk_combo_box_text_new();
+
        for(i=0;i<MAX_TICK_VALUES;i++){
                if(tick_interval_values[i]>=1000){
-                   g_snprintf(str, sizeof(str), "%u sec", tick_interval_values[i]/1000);
+                       g_snprintf(str, sizeof(str), "%u sec", tick_interval_values[i]/1000);
                } else if(tick_interval_values[i]>=100){
-                   g_snprintf(str, sizeof(str), "0.%1u sec", (tick_interval_values[i]/100)%10);
+                       g_snprintf(str, sizeof(str), "0.%1u sec", (tick_interval_values[i]/100)%10);
                } else if(tick_interval_values[i]>=10){
                        g_snprintf(str, sizeof(str), "0.%02u sec", (tick_interval_values[i]/10)%10);
                } else {
                        g_snprintf(str, sizeof(str), "0.%03u sec", (tick_interval_values[i])%10);
                }
-
-               menu_item=gtk_menu_item_new_with_label(str);
-               g_object_set_data(G_OBJECT(menu_item), "tick_interval",
-                               GUINT_TO_POINTER(tick_interval_values[i]));
-               g_signal_connect(menu_item, "activate", G_CALLBACK(tick_interval_select), (gpointer)user_data);
-               gtk_widget_show(menu_item);
-               gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+                gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
        }
-       gtk_menu_set_active(GTK_MENU(menu), DEFAULT_TICK_VALUE);
-       return;
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), user_data->dlg.dialog_graph.interval_index);
+       g_signal_connect(combo_box, "changed", G_CALLBACK(tick_interval_select), user_data);
+
+       return combo_box;
 }
 
 /****************************************************************************/
-static void create_ctrl_menu(user_data_t* user_data, GtkWidget *box, const char *name, void (*func)(user_data_t* user_data, GtkWidget *menu))
+static void create_ctrl_menu(user_data_t* user_data, GtkWidget *box, const char *name, GtkWidget *(*func)(user_data_t* user_data))
 {
        GtkWidget *hbox;
        GtkWidget *label;
-       GtkWidget *option_menu;
-       GtkWidget *menu;
+       GtkWidget *combo_box;
 
        hbox=gtk_hbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(box), hbox);
@@ -1701,12 +1760,9 @@ static void create_ctrl_menu(user_data_t* user_data, GtkWidget *box, const char
        gtk_widget_show(label);
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
-       option_menu=gtk_option_menu_new();
-       menu=gtk_menu_new();
-       (*func)(user_data, menu);
-       gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), menu);
-       gtk_box_pack_end(GTK_BOX(hbox), option_menu, FALSE, FALSE, 0);
-       gtk_widget_show(option_menu);
+       combo_box = (*func)(user_data);
+       gtk_box_pack_end(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
+       gtk_widget_show(combo_box);
 }
 
 /****************************************************************************/
@@ -1791,8 +1847,10 @@ static void dialog_graph_init_window(user_data_t* user_data)
 
 
 /****************************************************************************/
-static void on_graph_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
+static void on_graph_bt_clicked(GtkWidget *bt _U_, gpointer data)
 {
+       user_data_t *user_data = data;
+
        if (user_data->dlg.dialog_graph.window != NULL) {
                /* There's already a graph window; reactivate it. */
                reactivate_window(user_data->dlg.dialog_graph.window);
@@ -1804,8 +1862,9 @@ static void on_graph_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
 }
 
 /****************************************************************************/
-static void on_goto_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data _U_)
+static void on_goto_bt_clicked(GtkWidget *bt _U_, gpointer data)
 {
+       user_data_t *user_data = data;
        GtkTreeIter iter;
        GtkTreeModel *model;
        GtkTreeSelection *selection;
@@ -1815,7 +1874,7 @@ static void on_goto_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data _U_)
 
        if (selection==NULL)
                return;
-       
+
        if (gtk_tree_selection_get_selected (selection, &model, &iter)){
                gtk_tree_model_get (model, &iter, PACKET_COLUMN, &fnumber, -1);
                cf_goto_frame(&cfile, fnumber);
@@ -1827,8 +1886,9 @@ static void draw_stat(user_data_t *user_data);
 
 /****************************************************************************/
 /* re-dissects all packets */
-static void on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
+static void on_refresh_bt_clicked(GtkWidget *bt _U_, gpointer data)
 {
+       user_data_t *user_data = data;
        GString *error_string;
 
        /* remove tap listener */
@@ -1837,7 +1897,7 @@ static void on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
        unprotect_thread_critical_region();
 
        /* register tap listener */
-       error_string = register_tap_listener("IAX2", user_data, NULL,
+       error_string = register_tap_listener("IAX2", user_data, NULL, 0,
                iax2_reset, iax2_packet, iax2_draw);
        if (error_string != NULL) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
@@ -1846,7 +1906,7 @@ static void on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
        }
 
        /* retap all packets */
-       cf_retap_packets(&cfile, FALSE);
+       cf_retap_packets(&cfile);
 
        /* draw statistics info */
        draw_stat(user_data);
@@ -1854,8 +1914,9 @@ static void on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
 }
 
 /****************************************************************************/
-static void on_next_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data _U_)
+static void on_next_bt_clicked(GtkWidget *bt _U_, gpointer data)
 {
+       user_data_t *user_data = data;
        GtkTreeIter iter;
        GtkTreeModel *model;
        gchar *text;
@@ -1918,7 +1979,7 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
        FILE *fp;
        int j;
 
-       g_dest = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)));
+       g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
 
        /* Perhaps the user specified a directory instead of a file.
         * Check whether they did.
@@ -1926,9 +1987,9 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
        if (test_for_directory(g_dest) == EISDIR) {
                /* It's a directory - set the file selection box to display it. */
                set_last_open_dir(g_dest);
-               g_free(g_dest);
                file_selection_set_current_folder(fc, get_last_open_dir());
                gtk_file_chooser_set_current_name(fc, "");
+               g_free(g_dest);
                return FALSE; /* run the dialog again */
        }
        rev  = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "reversed_rb");
@@ -1936,7 +1997,7 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
        both = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "both_rb");
        user_data = (user_data_t*)g_object_get_data(G_OBJECT(fc), "user_data");
 
-       if (GTK_TOGGLE_BUTTON(forw)->active || GTK_TOGGLE_BUTTON(both)->active) {
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(forw)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
                fp = ws_fopen(g_dest, "w");
                if (fp == NULL) {
                        open_failure_alert_box(g_dest, errno, TRUE);
@@ -1944,7 +2005,7 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                        return TRUE; /* we're done */
                }
 
-               if (GTK_TOGGLE_BUTTON(both)->active) {
+               if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
                        fprintf(fp, "Forward\n");
                        if (ferror(fp)) {
                                write_failure_alert_box(g_dest, errno);
@@ -1956,9 +2017,9 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
 
                for(j = 0; j < NUM_COLS; j++) {
                        if (j == 0) {
-                               fprintf(fp,"%s",titles[j]);
+                               fprintf(fp,"\"%s\"",titles[j]);
                        } else {
-                               fprintf(fp,",%s",titles[j]);
+                               fprintf(fp,",\"%s\"",titles[j]);
                        }
                }
                fprintf(fp,"\n");
@@ -1971,9 +2032,9 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_fwd));
                store = GTK_LIST_STORE(model);
                if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
-                        
+
                        while (more_items) {
-                               gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 
+                               gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
                                                   0, &packet,
                                                   1, &delta,
                                                   2, &jitter,
@@ -1982,13 +2043,13 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                                                   5, &date_str,
                                                   6, &length,
                                                   -1);
-                               fprintf(fp, "%u",packet);
-                               fprintf(fp, ",%.2f", delta);
-                               fprintf(fp, ",%.2f", jitter);
-                               fprintf(fp, ",%.2f", ipbw);
-                               fprintf(fp, ",%s", status_str);
-                               fprintf(fp, ",%s", date_str);
-                               fprintf(fp, ",%u", length);
+                               fprintf(fp, "\"%u\"",packet);
+                               fprintf(fp, ",\"%.2f\"", delta);
+                               fprintf(fp, ",\"%.2f\"", jitter);
+                               fprintf(fp, ",\"%.2f\"", ipbw);
+                               fprintf(fp, ",\"%s\"", status_str);
+                               fprintf(fp, ",\"%s\"", date_str);
+                               fprintf(fp, ",\"%u\"", length);
                                fprintf(fp,"\n");
                                g_free(status_str);
                                g_free(date_str);
@@ -2002,7 +2063,7 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                                more_items = gtk_tree_model_iter_next (model,&iter);
                        }
                }
-               
+
                if (fclose(fp) == EOF) {
                        write_failure_alert_box(g_dest, errno);
                        g_free(g_dest);
@@ -2010,9 +2071,9 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                }
        }
 
-       if (GTK_TOGGLE_BUTTON(rev)->active || GTK_TOGGLE_BUTTON(both)->active) {
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rev)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
 
-               if (GTK_TOGGLE_BUTTON(both)->active) {
+               if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
                        fp = ws_fopen(g_dest, "a");
                        if (fp == NULL) {
                                open_failure_alert_box(g_dest, errno, TRUE);
@@ -2036,9 +2097,9 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                }
                for(j = 0; j < NUM_COLS; j++) {
                        if (j == 0) {
-                               fprintf(fp,"%s",titles[j]);
+                               fprintf(fp,"\"%s\"",titles[j]);
                        } else {
-                               fprintf(fp,",%s",titles[j]);
+                               fprintf(fp,",\"%s\"",titles[j]);
                        }
                }
                fprintf(fp,"\n");
@@ -2055,7 +2116,7 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                        more_items = TRUE;
 
                        while (more_items) {
-                               gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 
+                               gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
                                                   0, &packet,
                                                   1, &delta,
                                                   2, &jitter,
@@ -2064,13 +2125,13 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
                                                   5, &date_str,
                                                   6, &length,
                                                   -1);
-                               fprintf(fp, "%u",packet);
-                               fprintf(fp, ",%.2f", delta);
-                               fprintf(fp, ",%.2f", jitter);
-                               fprintf(fp, ",%.2f", ipbw);
-                               fprintf(fp, ",%s", status_str);
-                               fprintf(fp, ",%s", date_str);
-                               fprintf(fp, ",%u", length);
+                               fprintf(fp, "\"%u\"",packet);
+                               fprintf(fp, ",\"%.2f\"", delta);
+                               fprintf(fp, ",\"%.2f\"", jitter);
+                               fprintf(fp, ",\"%.2f\"", ipbw);
+                               fprintf(fp, ",\"%s\"", status_str);
+                               fprintf(fp, ",\"%s\"", date_str);
+                               fprintf(fp, ",\"%u\"", length);
                                fprintf(fp,"\n");
                                g_free(status_str);
                                g_free(date_str);
@@ -2094,19 +2155,21 @@ static gboolean save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *u
        return TRUE; /* we're done */
 }
 
-static void save_csv_as_destroy_cb(GtkWidget *win _U_, user_data_t *user_data)
+static void save_csv_as_destroy_cb(GtkWidget *win _U_, gpointer data)
 {
+       user_data_t *user_data = data;
+
        user_data->dlg.save_csv_as_w = NULL;
 }
 
 /* when the user wants to save the csv information in a file */
-static void save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
+static void save_csv_as_cb(GtkWidget *bt _U_, gpointer data)
 {
+       user_data_t *user_data = data;
        GtkWidget *vertb;
        GtkWidget *table1;
        GtkWidget *label_format;
        GtkWidget *channels_label;
-       GSList    *channels_group = NULL;
        GtkWidget *forward_rb;
        GtkWidget *reversed_rb;
        GtkWidget *both_rb;
@@ -2118,16 +2181,14 @@ static void save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
                return;
        }
 #endif
-       user_data->dlg.save_csv_as_w = 
-               gtk_file_chooser_dialog_new("Wireshark: Save Data As CSV", 
-                                           GTK_WINDOW(user_data->dlg.notebook), 
+       user_data->dlg.save_csv_as_w =
+               gtk_file_chooser_dialog_new("Wireshark: Save Data As CSV",
+                                           GTK_WINDOW(user_data->dlg.notebook),
                                            GTK_FILE_CHOOSER_ACTION_SAVE,
                                            GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
                                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                            NULL);
-#if GTK_CHECK_VERSION(2,8,0)
        gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(user_data->dlg.save_csv_as_w), TRUE);
-#endif
        gtk_window_set_transient_for(GTK_WINDOW(user_data->dlg.save_csv_as_w),GTK_WINDOW(user_data->dlg.window));
 
        /* Build our "extra widget" to be added to the file chooser widget */
@@ -2157,22 +2218,19 @@ static void save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
                          (GtkAttachOptions) (0), 0, 0);
        gtk_misc_set_alignment (GTK_MISC (channels_label), 0, 0.5f);
 
-       forward_rb = gtk_radio_button_new_with_label (channels_group, "forward    ");
-       channels_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (forward_rb));
+       forward_rb = gtk_radio_button_new_with_label (NULL, "forward    ");
        gtk_widget_show (forward_rb);
        gtk_table_attach (GTK_TABLE (table1), forward_rb, 1, 2, 1, 2,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
 
-       reversed_rb = gtk_radio_button_new_with_label (channels_group, "reversed    ");
-       channels_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (reversed_rb));
+       reversed_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "reversed    ");
        gtk_widget_show (reversed_rb);
        gtk_table_attach (GTK_TABLE (table1), reversed_rb, 2, 3, 1, 2,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
 
-       both_rb = gtk_radio_button_new_with_label (channels_group, "both");
-       channels_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (both_rb));
+       both_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "both");
        gtk_widget_show (both_rb);
        gtk_table_attach (GTK_TABLE (table1), both_rb, 3, 4, 1, 2,
                          (GtkAttachOptions) (GTK_FILL),
@@ -2185,7 +2243,7 @@ static void save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
        g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "both_rb",     both_rb);
        g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "user_data",   user_data);
 
-       g_signal_connect(user_data->dlg.save_csv_as_w, "delete_event", 
+       g_signal_connect(user_data->dlg.save_csv_as_w, "delete_event",
                         G_CALLBACK(window_delete_event_cb), NULL);
        g_signal_connect(user_data->dlg.save_csv_as_w, "destroy",
                         G_CALLBACK(save_csv_as_destroy_cb), user_data);
@@ -2194,17 +2252,17 @@ static void save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
        window_present(user_data->dlg.save_csv_as_w);
 
        /* "Run" the GtkFileChooserDialog.                                              */
-        /* Upon exit: If "Accept" run the OK callback.                                  */
-        /*            If the OK callback returns with a FALSE status, re-run the dialog.*/
-        /*            Destroy the window.                                               */
-        /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must*    */
-        /*      return with a TRUE status so that the dialog window will be destroyed.  */
+       /* Upon exit: If "Accept" run the OK callback.                                  */
+       /*            If the OK callback returns with a FALSE status, re-run the dialog.*/
+       /*            Destroy the window.                                               */
+       /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must*    */
+       /*      return with a TRUE status so that the dialog window will be destroyed.  */
        /*      Trying to re-run the dialog after popping up an alert box will not work */
-        /*       since the user will not be able to dismiss the alert box.              */
+       /*       since the user will not be able to dismiss the alert box.              */
        /*      The (somewhat unfriendly) effect: the user must re-invoke the           */
        /*      GtkFileChooserDialog whenever the OK callback pops up an alert box.     */
        /*                                                                              */
-        /*      ToDo: use GtkFileChooserWidget in a dialog window instead of            */
+       /*      ToDo: use GtkFileChooserWidget in a dialog window instead of            */
        /*            GtkFileChooserDialog.                                             */
        while (gtk_dialog_run(GTK_DIALOG(user_data->dlg.save_csv_as_w)) == GTK_RESPONSE_ACCEPT) {
                if (save_csv_as_ok_cb(NULL, user_data->dlg.save_csv_as_w)) {
@@ -2215,8 +2273,10 @@ static void save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
 }
 
 /****************************************************************************/
-static void save_voice_as_destroy_cb(GtkWidget *win _U_, user_data_t *user_data)
+static void save_voice_as_destroy_cb(GtkWidget *win _U_, gpointer data)
 {
+       user_data_t *user_data = data;
+
        /* Note that we no longer have a Save voice info dialog box. */
        user_data->dlg.save_voice_as_w = NULL;
 }
@@ -2226,7 +2286,7 @@ static void save_voice_as_destroy_cb(GtkWidget *win _U_, user_data_t *user_data)
 /* XXX what about endians here? could go something wrong? */
 static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *user_data)
 {
-       int to_fd, forw_fd, rev_fd, fread = 0, rread = 0, fwritten, rwritten;
+       int to_fd, forw_fd, rev_fd, fread_cnt = 0, rread = 0, fwritten, rwritten;
        gchar f_pd[1] = {0};
        gchar r_pd[1] = {0};
        gint16 sample;
@@ -2236,7 +2296,7 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *
        progdlg_t *progbar;
        guint32 progbar_count, progbar_quantum, progbar_nextstep = 0, count = 0;
        gboolean stop_flag = FALSE;
-       size_t nchars;
+       /*size_t nchars;*/
 
        forw_fd = ws_open(user_data->f_tempname, O_RDONLY | O_BINARY, 0000 /* no creation so don't matter */);
        if (forw_fd < 0)
@@ -2261,31 +2321,73 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *
        {
                /* First we write the .au header. XXX Hope this is endian independant */
                /* the magic word 0x2e736e64 == .snd */
+               /* XXX: Should we be checking for write errors below ? */
                phtonl(pd, 0x2e736e64);
-               nchars=ws_write(to_fd, pd, 4);
+               fwritten = ws_write(to_fd, pd, 4);
+               if ((fwritten < 4) || (fwritten < 0) || (fread_cnt < 0)) {
+                       ws_close(forw_fd);
+                       ws_close(rev_fd);
+                       ws_close(to_fd);
+                       destroy_progress_dlg(progbar);
+                       return FALSE;
+               }
                /* header offset == 24 bytes */
                phtonl(pd, 24);
-               nchars=ws_write(to_fd, pd, 4);
+               fwritten = ws_write(to_fd, pd, 4);
+               if ((fwritten < 4) || (fwritten < 0) || (fread_cnt < 0)) {
+                       ws_close(forw_fd);
+                       ws_close(rev_fd);
+                       ws_close(to_fd);
+                       destroy_progress_dlg(progbar);
+                       return FALSE;
+               }
                /* total length, it is permited to set this to 0xffffffff */
                phtonl(pd, -1);
-               nchars=ws_write(to_fd, pd, 4);
+               fwritten = ws_write(to_fd, pd, 4);
+               if ((fwritten < 4) || (fwritten < 0) || (fread_cnt < 0)) {
+                       ws_close(forw_fd);
+                       ws_close(rev_fd);
+                       ws_close(to_fd);
+                       destroy_progress_dlg(progbar);
+                       return FALSE;
+               }
                /* encoding format == 16-bit linear PCM */
                phtonl(pd, 3);
-               nchars=ws_write(to_fd, pd, 4);
+               fwritten = ws_write(to_fd, pd, 4);
+               if ((fwritten < 4) || (fwritten < 0) || (fread_cnt < 0)) {
+                       ws_close(forw_fd);
+                       ws_close(rev_fd);
+                       ws_close(to_fd);
+                       destroy_progress_dlg(progbar);
+                       return FALSE;
+               }
                /* sample rate == 8000 Hz */
                phtonl(pd, 8000);
-               nchars=ws_write(to_fd, pd, 4);
+               fwritten = ws_write(to_fd, pd, 4);
+               if ((fwritten < 4) || (fwritten < 0) || (fread_cnt < 0)) {
+                       ws_close(forw_fd);
+                       ws_close(rev_fd);
+                       ws_close(to_fd);
+                       destroy_progress_dlg(progbar);
+                       return FALSE;
+               }
                /* channels == 1 */
                phtonl(pd, 1);
-               nchars=ws_write(to_fd, pd, 4);
-
+               fwritten = ws_write(to_fd, pd, 4);
+               if ((fwritten < 4) || (fwritten < 0) || (fread_cnt < 0)) {
+                       ws_close(forw_fd);
+                       ws_close(rev_fd);
+                       ws_close(to_fd);
+                       destroy_progress_dlg(progbar);
+                       return FALSE;
+               }
 
                switch (channels) {
                        /* only forward direction */
                        case SAVE_FORWARD_DIRECTION_MASK: {
                                progbar_count = user_data->forward.saveinfo.count;
                                progbar_quantum = user_data->forward.saveinfo.count/100;
-                               while ((fread = read(forw_fd, f_pd, 1)) > 0) {
+                               while ((fread_cnt = read(forw_fd, f_pd, 1)) > 0) {
                                        if(stop_flag)
                                                break;
                                        if((count > progbar_nextstep) && (count <= progbar_count)) {
@@ -2312,7 +2414,7 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *
                                        }
 
                                        fwritten = ws_write(to_fd, pd, 2);
-                                       if ((fwritten < 2) || (fwritten < 0) || (fread < 0)) {
+                                       if ((fwritten < 2) || (fwritten < 0) || (fread_cnt < 0)) {
                                                ws_close(forw_fd);
                                                ws_close(rev_fd);
                                                ws_close(to_fd);
@@ -2398,11 +2500,11 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *
                                                        *f_pd = SILENCE_PCMA;
                                                        break;
                                                }
-                                               fread = 1;
+                                               fread_cnt = 1;
                                                f_write_silence--;
                                        }
                                        else if(r_write_silence > 0) {
-                                               fread = read(forw_fd, f_pd, 1);
+                                               fread_cnt = read(forw_fd, f_pd, 1);
                                                switch (user_data->reversed.statinfo.reg_pt) {
                                                case AST_FORMAT_ULAW:
                                                        *r_pd = SILENCE_PCMU;
@@ -2415,10 +2517,10 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *
                                                r_write_silence--;
                                        }
                                        else {
-                                               fread = read(forw_fd, f_pd, 1);
+                                               fread_cnt = read(forw_fd, f_pd, 1);
                                                rread = read(rev_fd, r_pd, 1);
                                        }
-                                       if ((rread == 0) && (fread == 0))
+                                       if ((rread == 0) && (fread_cnt == 0))
                                                break;
                                        if ((user_data->forward.statinfo.pt == AST_FORMAT_ULAW) && (user_data->reversed.statinfo.pt == AST_FORMAT_ULAW)){
                                                sample = (ulaw2linear(*r_pd) + ulaw2linear(*f_pd)) / 2;
@@ -2439,7 +2541,7 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *
 
 
                                        rwritten = ws_write(to_fd, pd, 2);
-                                       if ((rwritten < 2) || (rread < 0) || (fread < 0)) {
+                                       if ((rwritten < 2) || (rread < 0) || (fread_cnt < 0)) {
                                                ws_close(forw_fd);
                                                ws_close(rev_fd);
                                                ws_close(to_fd);
@@ -2522,16 +2624,16 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
        user_data_t *user_data;
        gint         channels , format;
 
-       g_dest = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)));
+       g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
 
        /* Perhaps the user specified a directory instead of a file.
           Check whether they did. */
        if (test_for_directory(g_dest) == EISDIR) {
                /* It's a directory - set the file selection box to display it. */
                set_last_open_dir(g_dest);
-               g_free(g_dest);
                file_selection_set_current_folder(fc, get_last_open_dir());
                gtk_file_chooser_set_current_name(fc, "");
+               g_free(g_dest);
                return FALSE; /* run the dialog again */
        }
 
@@ -2555,7 +2657,7 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
        */
 
        /* we can not save in both directions */
-       if ((user_data->forward.saveinfo.saved == FALSE) && (user_data->reversed.saveinfo.saved == FALSE) && (GTK_TOGGLE_BUTTON (both)->active)) {
+       if ((user_data->forward.saveinfo.saved == FALSE) && (user_data->reversed.saveinfo.saved == FALSE) && (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both)))) {
                /* there are many combinations here, we just exit when first matches */
                if ((user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_CODEC) ||
                        (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_CODEC))
@@ -2572,11 +2674,12 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
                else
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                        "Can't save in a file: File I/O problem!");
+               g_free(g_dest);
                return TRUE; /* we're done */
        }
        /* we can not save forward direction */
-       else if ((user_data->forward.saveinfo.saved == FALSE) && ((GTK_TOGGLE_BUTTON (forw)->active) ||
-               (GTK_TOGGLE_BUTTON (both)->active))) {
+       else if ((user_data->forward.saveinfo.saved == FALSE) && ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (forw))) ||
+               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both))))) {
                if (user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                        "Can't save forward direction in a file: Unsupported codec!");
@@ -2589,11 +2692,12 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
                else
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                        "Can't save forward direction in a file: File I/O problem!");
+               g_free(g_dest);
                return TRUE; /* we're done */
        }
        /* we can not save reversed direction */
-       else if ((user_data->reversed.saveinfo.saved == FALSE) && ((GTK_TOGGLE_BUTTON (rev)->active) ||
-               (GTK_TOGGLE_BUTTON (both)->active))) {
+       else if ((user_data->reversed.saveinfo.saved == FALSE) && ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rev))) ||
+               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both))))) {
                if (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                        "Can't save reversed direction in a file: Unsupported codec!");
@@ -2609,28 +2713,29 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
                else
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                        "Can't save reversed direction in a file: File I/O problem!");
+               g_free(g_dest);
                return TRUE; /* we're done */
        }
 
 #if 0
-       if (GTK_TOGGLE_BUTTON (wav)->active)
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (wav)))
                format = SAVE_WAV_FORMAT;
-       else 
+       else
 #endif
-       if (GTK_TOGGLE_BUTTON (au)->active)
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (au)))
                format = SAVE_AU_FORMAT;
 #if 0
-       else if (GTK_TOGGLE_BUTTON (sw)->active)
+       else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sw)))
                format = SAVE_SW_FORMAT;
 #endif
-       else if (GTK_TOGGLE_BUTTON (raw)->active)
+       else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (raw)))
                format = SAVE_RAW_FORMAT;
        else
                format = SAVE_NONE_FORMAT;
 
-       if (GTK_TOGGLE_BUTTON (rev)->active)
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rev)))
                channels = SAVE_REVERSE_DIRECTION_MASK;
-       else if (GTK_TOGGLE_BUTTON (both)->active)
+       else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both)))
                channels = SAVE_BOTH_DIRECTION_MASK;
        else
                channels = SAVE_FORWARD_DIRECTION_MASK;
@@ -2642,17 +2747,20 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
                if ((channels & SAVE_FORWARD_DIRECTION_MASK) && (user_data->forward.statinfo.pt != AST_FORMAT_ALAW) && (user_data->forward.statinfo.pt != AST_FORMAT_ULAW)){
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                                "Can't save in a file: saving in au format supported only for alaw/ulaw streams");
+                       g_free(g_dest);
                        return TRUE; /* we're done */
                }
                if ((channels & SAVE_REVERSE_DIRECTION_MASK) && (user_data->reversed.statinfo.pt != AST_FORMAT_ALAW) && (user_data->reversed.statinfo.pt != AST_FORMAT_ULAW)){
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                                "Can't save in a file: saving in au format supported only for alaw/ulaw streams");
+                       g_free(g_dest);
                        return TRUE; /* we're done */
                }
                /* make sure pt's don't differ */
                if ((channels == SAVE_BOTH_DIRECTION_MASK) && (user_data->forward.statinfo.pt != user_data->reversed.statinfo.pt)){
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                                "Can't save in a file: Forward and reverse direction differ in type");
+                       g_free(g_dest);
                        return TRUE; /* we're done */
                }
        }
@@ -2662,6 +2770,7 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
                if (channels == SAVE_BOTH_DIRECTION_MASK){
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                                "Can't save in a file: Unable to save raw data in both directions");
+                       g_free(g_dest);
                        return TRUE; /* we're done */
                }
        }
@@ -2669,6 +2778,7 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
        {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                        "Can't save in a file: Invalid save format");
+               g_free(g_dest);
                return TRUE; /* we're done */
        }
 
@@ -2686,14 +2796,13 @@ static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
 /****************************************************************************/
 /* when the user wants to save the voice information in a file */
 /* XXX support for different formats is currently commented out */
-static void on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
+static void save_voice_as_cb(GtkWidget *bt _U_, gpointer data)
 {
+       user_data_t *user_data = data;
        GtkWidget *vertb;
        GtkWidget *table1;
        GtkWidget *label_format;
        GtkWidget *channels_label;
-       GSList    *format_group = NULL;
-       GSList    *channels_group = NULL;
        GtkWidget *forward_rb;
        GtkWidget *reversed_rb;
        GtkWidget *both_rb;
@@ -2713,16 +2822,14 @@ static void on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
        }
 #endif
        /* XXX - use file_selection from dlg_utils instead! */
-       user_data->dlg.save_voice_as_w = 
+       user_data->dlg.save_voice_as_w =
                gtk_file_chooser_dialog_new("Wireshark: Save Payload As ...",
                                            GTK_WINDOW(user_data->dlg.notebook),
                                            GTK_FILE_CHOOSER_ACTION_SAVE,
                                            GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
                                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                            NULL);
-#if GTK_CHECK_VERSION(2,8,0)
        gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(user_data->dlg.save_voice_as_w), TRUE);
-#endif
        gtk_window_set_transient_for(GTK_WINDOW(user_data->dlg.save_voice_as_w),GTK_WINDOW(user_data->dlg.window));
 
        /* Container for each row of widgets */
@@ -2753,16 +2860,14 @@ static void on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
 
        gtk_misc_set_alignment (GTK_MISC (label_format), 0, 0.5f);
 
-       raw_rb = gtk_radio_button_new_with_label (format_group, ".raw");
-       format_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (raw_rb));
+       raw_rb = gtk_radio_button_new_with_label (NULL, ".raw");
        gtk_widget_show (raw_rb);
        gtk_table_attach (GTK_TABLE (table1), raw_rb, 1, 2, 0, 1,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
 
 
-       au_rb = gtk_radio_button_new_with_label (format_group, ".au");
-       format_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (au_rb));
+       au_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".au");
        gtk_widget_show (au_rb);
        gtk_table_attach (GTK_TABLE (table1), au_rb, 3, 4, 0, 1,
                          (GtkAttachOptions) (GTK_FILL),
@@ -2770,21 +2875,18 @@ static void on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
 
 #if 0
        /* we support .au - ulaw*/
-       wav_rb = gtk_radio_button_new_with_label (format_group, ".wav");
-       format_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (wav_rb));
+       wav_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".wav");
        gtk_widget_show (wav_rb);
        gtk_table_attach (GTK_TABLE (table1), wav_rb, 1, 2, 0, 1,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
 
-       sw_rb = gtk_radio_button_new_with_label (format_group, "8 kHz, 16 bit  ");
-       format_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (sw_rb));
+       sw_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), "8 kHz, 16 bit  ");
        gtk_widget_show (sw_rb);
        gtk_table_attach (GTK_TABLE (table1), sw_rb, 2, 3, 0, 1,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
-       au_rb = gtk_radio_button_new_with_label (format_group, ".au");
-       format_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (au_rb));
+       au_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".au");
        gtk_widget_show (au_rb);
        gtk_table_attach (GTK_TABLE (table1), au_rb, 3, 4, 0, 1,
                          (GtkAttachOptions) (GTK_FILL),
@@ -2798,22 +2900,19 @@ static void on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
                          (GtkAttachOptions) (0), 0, 0);
        gtk_misc_set_alignment (GTK_MISC (channels_label), 0, 0.5f);
 
-       forward_rb = gtk_radio_button_new_with_label (channels_group, "forward    ");
-       channels_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (forward_rb));
+       forward_rb = gtk_radio_button_new_with_label (NULL, "forward    ");
        gtk_widget_show (forward_rb);
        gtk_table_attach (GTK_TABLE (table1), forward_rb, 1, 2, 1, 2,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
 
-       reversed_rb = gtk_radio_button_new_with_label (channels_group, "reversed    ");
-       channels_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (reversed_rb));
+       reversed_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "reversed    ");
        gtk_widget_show (reversed_rb);
        gtk_table_attach (GTK_TABLE (table1), reversed_rb, 2, 3, 1, 2,
                          (GtkAttachOptions) (GTK_FILL),
                          (GtkAttachOptions) (0), 0, 0);
 
-       both_rb = gtk_radio_button_new_with_label (channels_group, "both");
-       channels_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (both_rb));
+       both_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "both");
        gtk_widget_show (both_rb);
        gtk_table_attach (GTK_TABLE (table1), both_rb, 3, 4, 1, 2,
                          (GtkAttachOptions) (GTK_FILL),
@@ -2855,17 +2954,17 @@ static void on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
        window_present(user_data->dlg.save_voice_as_w);
 
        /* "Run" the GtkFileChooserDialog.                                              */
-        /* Upon exit: If "Accept" run the OK callback.                                  */
-        /*            If the OK callback returns with a FALSE status, re-run the dialog.*/
-        /*            Destroy the window.                                               */
-        /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must*    */
-        /*      return with a TRUE status so that the dialog window will be destroyed.  */
+       /* Upon exit: If "Accept" run the OK callback.                                  */
+       /*            If the OK callback returns with a FALSE status, re-run the dialog.*/
+       /*            Destroy the window.                                               */
+       /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must*    */
+       /*      return with a TRUE status so that the dialog window will be destroyed.  */
        /*      Trying to re-run the dialog after popping up an alert box will not work */
-        /*       since the user will not be able to dismiss the alert box.              */
+       /*       since the user will not be able to dismiss the alert box.              */
        /*      The (somewhat unfriendly) effect: the user must re-invoke the           */
        /*      GtkFileChooserDialog whenever the OK callback pops up an alert box.     */
        /*                                                                              */
-        /*      ToDo: use GtkFileChooserWidget in a dialog window instead of            */
+       /*      ToDo: use GtkFileChooserWidget in a dialog window instead of            */
        /*            GtkFileChooserDialog.                                             */
        while (gtk_dialog_run(GTK_DIALOG(user_data->dlg.save_voice_as_w)) == GTK_RESPONSE_ACCEPT) {
                if (save_voice_as_ok_cb(NULL, user_data->dlg.save_voice_as_w)) {
@@ -2901,7 +3000,7 @@ static void draw_stat(user_data_t *user_data)
 
 /****************************************************************************/
 /* append a line to list */
-static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number, 
+static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number,
                        double delta, double jitter, double bandwidth, gchar *status,
                        gchar *timeStr, guint32 pkt_len, gchar *color_str, guint32 flags)
 {
@@ -2913,13 +3012,12 @@ static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number
 
        list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (list))); /* Get store */
 
-       /* Creates a new row at position. iter will be changed to point to this new row. 
+       /* Creates a new row at position. iter will be changed to point to this new row.
         * If position is larger than the number of rows on the list, then the new row will be appended to the list.
         * The row will be filled with the values given to this function.
         * :
         * should generally be preferred when inserting rows in a sorted list store.
         */
-#if GTK_CHECK_VERSION(2,6,0)
        gtk_list_store_insert_with_values( list_store , &user_data->dlg.iter, G_MAXINT,
                             PACKET_COLUMN, number,
                             DELTA_COLUMN, delta,
@@ -2932,20 +3030,6 @@ static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number
                             BACKGROUND_COLOR_COL, (char *)color_str,
                             -1);
 
-#else
-       gtk_list_store_append  (list_store, &user_data->dlg.iter);
-       gtk_list_store_set  (list_store, &user_data->dlg.iter,
-                            PACKET_COLUMN, number,
-                            DELTA_COLUMN, delta,
-                            JITTER_COLUMN, jitter,
-                            IPBW_COLUMN, bandwidth,
-                            STATUS_COLUMN, (char *)status,
-                            DATE_COLUMN,  (char *)timeStr,
-                            LENGTH_COLUMN,     pkt_len,
-                            FOREGROUND_COLOR_COL, NULL,
-                            BACKGROUND_COLOR_COL, (char *)color_str,
-                            -1);
-#endif
        if(flags & STAT_FLAG_FIRST){
                /* Set first row as active */
                gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), &user_data->dlg.iter);
@@ -2957,7 +3041,7 @@ static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number
  */
 
 /* Present floats with two decimals */
-void
+static void
 iax2_float_data_func (GtkTreeViewColumn *column _U_,
                      GtkCellRenderer   *renderer,
                      GtkTreeModel      *model,
@@ -2966,7 +3050,7 @@ iax2_float_data_func (GtkTreeViewColumn *column _U_,
 {
        gfloat  float_val;
        gchar   buf[20];
-       char *savelocale;
+       char   *savelocale;
 
        /* the col to get data from is in userdata */
        gint float_col = GPOINTER_TO_INT(user_data);
@@ -2993,25 +3077,25 @@ static
 GtkWidget* create_list(user_data_t* user_data)
 {
 
-       GtkListStore *list_store;
-       GtkWidget *list;
+       GtkListStore      *list_store;
+       GtkWidget         *list;
        GtkTreeViewColumn *column;
-       GtkCellRenderer *renderer;
-       GtkTreeSortable *sortable;
-       GtkTreeView     *list_view;
+       GtkCellRenderer   *renderer;
+       GtkTreeSortable   *sortable;
+       GtkTreeView       *list_view;
        GtkTreeSelection  *selection;
 
        /* Create the store */
-       list_store = gtk_list_store_new(N_COLUMN,       /* Total number of columns XXX*/
-                                       G_TYPE_UINT,            /* Packet                               */
+       list_store = gtk_list_store_new(N_COLUMN,       /* Total number of columns XXX  */
+                                       G_TYPE_UINT,    /* Packet                       */
                                        G_TYPE_FLOAT,   /* Delta(ms)                    */
                                        G_TYPE_FLOAT,   /* Jitter(ms)                   */
                                        G_TYPE_FLOAT,   /* IP BW(kbps)                  */
-                                       G_TYPE_STRING,   /* Status                              */
-                                       G_TYPE_STRING,  /* Date                                 */
-                                       G_TYPE_UINT,    /* Length                               */
-                                       G_TYPE_STRING,   /* Foreground color            */
-                                       G_TYPE_STRING);  /* Background color            */
+                                       G_TYPE_STRING,  /* Status                       */
+                                       G_TYPE_STRING,  /* Date                         */
+                                       G_TYPE_UINT,    /* Length                       */
+                                       G_TYPE_STRING,  /* Foreground color             */
+                                       G_TYPE_STRING); /* Background color             */
 
        /* Create a view */
        list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
@@ -3019,10 +3103,8 @@ GtkWidget* create_list(user_data_t* user_data)
        list_view = GTK_TREE_VIEW(list);
        sortable = GTK_TREE_SORTABLE(list_store);
 
-#if GTK_CHECK_VERSION(2,6,0)
        /* Speed up the list display */
        gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-#endif
 
        /* Setup the sortable columns */
        gtk_tree_sortable_set_sort_column_id(sortable, PACKET_COLUMN, GTK_SORT_ASCENDING);
@@ -3031,13 +3113,13 @@ GtkWidget* create_list(user_data_t* user_data)
        /* The view now holds a reference.  We can get rid of our own reference */
        g_object_unref (G_OBJECT (list_store));
 
-       /* 
+       /*
         * Create the first column packet, associating the "text" attribute of the
-        * cell_renderer to the first column of the model 
+        * cell_renderer to the first column of the model
         */
        renderer = gtk_cell_renderer_text_new ();
-       column = gtk_tree_view_column_new_with_attributes ("Packet", renderer, 
-                                                          "text",      PACKET_COLUMN, 
+       column = gtk_tree_view_column_new_with_attributes ("Packet", renderer,
+                                                          "text",      PACKET_COLUMN,
                                                           "foreground", FOREGROUND_COLOR_COL,
                                                           "background", BACKGROUND_COLOR_COL,
                                                           NULL);
@@ -3051,13 +3133,13 @@ GtkWidget* create_list(user_data_t* user_data)
 
        /* Second column.. Delta(ms). */
        renderer = gtk_cell_renderer_text_new ();
-       column = gtk_tree_view_column_new_with_attributes ("Delta(ms)", renderer, 
-                                                          "text", DELTA_COLUMN, 
+       column = gtk_tree_view_column_new_with_attributes ("Delta(ms)", renderer,
+                                                          "text", DELTA_COLUMN,
                                                           "foreground", FOREGROUND_COLOR_COL,
                                                           "background", BACKGROUND_COLOR_COL,
                                                           NULL);
-       
-       gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func, 
+
+       gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func,
                                                GINT_TO_POINTER(DELTA_COLUMN), NULL);
 
        gtk_tree_view_column_set_sort_column_id(column, DELTA_COLUMN);
@@ -3068,13 +3150,13 @@ GtkWidget* create_list(user_data_t* user_data)
 
        /* Third column.. Jitter(ms). */
        renderer = gtk_cell_renderer_text_new ();
-       column = gtk_tree_view_column_new_with_attributes ("Jitter(ms)", renderer, 
-                                                          "text", JITTER_COLUMN, 
+       column = gtk_tree_view_column_new_with_attributes ("Jitter(ms)", renderer,
+                                                          "text", JITTER_COLUMN,
                                                           "foreground", FOREGROUND_COLOR_COL,
                                                           "background", BACKGROUND_COLOR_COL,
                                                           NULL);
 
-       gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func, 
+       gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func,
                                                GINT_TO_POINTER(JITTER_COLUMN), NULL);
 
        gtk_tree_view_column_set_sort_column_id(column, JITTER_COLUMN);
@@ -3085,13 +3167,13 @@ GtkWidget* create_list(user_data_t* user_data)
 
        /* Fourth column.. IP BW(kbps). */
        renderer = gtk_cell_renderer_text_new ();
-       column = gtk_tree_view_column_new_with_attributes ("IP BW(kbps)", renderer, 
-                                                          "text", IPBW_COLUMN, 
+       column = gtk_tree_view_column_new_with_attributes ("IP BW(kbps)", renderer,
+                                                          "text", IPBW_COLUMN,
                                                           "foreground", FOREGROUND_COLOR_COL,
                                                           "background", BACKGROUND_COLOR_COL,
                                                           NULL);
 
-       gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func, 
+       gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func,
                                                GINT_TO_POINTER(IPBW_COLUMN), NULL);
 
        gtk_tree_view_column_set_sort_column_id(column, IPBW_COLUMN);
@@ -3102,7 +3184,7 @@ GtkWidget* create_list(user_data_t* user_data)
 
        /* Fifth column..  Status. */
        renderer = gtk_cell_renderer_text_new ();
-       column = gtk_tree_view_column_new_with_attributes ( "Status", renderer, 
+       column = gtk_tree_view_column_new_with_attributes ( "Status", renderer,
                                                            "text", STATUS_COLUMN,
                                                            "foreground", FOREGROUND_COLOR_COL,
                                                            "background", BACKGROUND_COLOR_COL,
@@ -3115,8 +3197,8 @@ GtkWidget* create_list(user_data_t* user_data)
 
        /* Sixth column.. Length. */
        renderer = gtk_cell_renderer_text_new ();
-       column = gtk_tree_view_column_new_with_attributes ("Length", renderer, 
-                                                          "text", LENGTH_COLUMN, 
+       column = gtk_tree_view_column_new_with_attributes ("Length", renderer,
+                                                          "text", LENGTH_COLUMN,
                                                           "foreground", FOREGROUND_COLOR_COL,
                                                           "background", BACKGROUND_COLOR_COL,
                                                           NULL);
@@ -3159,9 +3241,6 @@ static void create_iax2_dialog(user_data_t* user_data)
        GtkWidget *label;
        GtkWidget *scrolled_window, *scrolled_window_r/*, *frame, *text, *label4, *page_help*/;
        GtkWidget *box4, *voice_bt, *refresh_bt, *goto_bt, *close_bt, *csv_bt, *next_bt;
-#ifdef USE_CONVERSATION_GRAPH
-       GtkWidget *graph_bt;
-#endif
        GtkWidget *graph_bt;
        gchar label_forward[150];
        gchar label_reverse[150];
@@ -3200,7 +3279,7 @@ static void create_iax2_dialog(user_data_t* user_data)
        g_object_set_data(G_OBJECT(window), "notebook", notebook);
 
        user_data->dlg.notebook_signal_id =
-        g_signal_connect(notebook, "switch_page", G_CALLBACK(on_notebook_switch_page), user_data);
+               g_signal_connect(notebook, "switch_page", G_CALLBACK(on_notebook_switch_page), user_data);
 
        /* page for forward connection */
        page = gtk_vbox_new(FALSE, 8);
@@ -3247,8 +3326,8 @@ static void create_iax2_dialog(user_data_t* user_data)
        label = gtk_label_new("  Reversed Direction  ");
        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_r, label);
 
-       /* page for help&about or future */
 #if 0
+       /* page for help&about or future */
        page_help = gtk_hbox_new(FALSE, 5);
        label = gtk_label_new("     Future    ");
        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_help, label);
@@ -3274,7 +3353,7 @@ static void create_iax2_dialog(user_data_t* user_data)
        voice_bt = gtk_button_new_with_label("Save payload...");
        gtk_container_add(GTK_CONTAINER(box4), voice_bt);
        gtk_widget_show(voice_bt);
-       g_signal_connect(voice_bt, "clicked", G_CALLBACK(on_save_bt_clicked), user_data);
+       g_signal_connect(voice_bt, "clicked", G_CALLBACK(save_voice_as_cb), user_data);
 
        csv_bt = gtk_button_new_with_label("Save as CSV...");
        gtk_container_add(GTK_CONTAINER(box4), csv_bt);
@@ -3291,18 +3370,10 @@ static void create_iax2_dialog(user_data_t* user_data)
        gtk_widget_show(goto_bt);
        g_signal_connect(goto_bt, "clicked", G_CALLBACK(on_goto_bt_clicked), user_data);
 
-        graph_bt = gtk_button_new_with_label("Graph");
-       gtk_container_add(GTK_CONTAINER(box4), graph_bt);
-       gtk_widget_show(graph_bt);
-       g_signal_connect(graph_bt, "clicked", G_CALLBACK(on_graph_bt_clicked), user_data);
-
-
-#ifdef USE_CONVERSATION_GRAPH
        graph_bt = gtk_button_new_with_label("Graph");
        gtk_container_add(GTK_CONTAINER(box4), graph_bt);
        gtk_widget_show(graph_bt);
        g_signal_connect(graph_bt, "clicked", G_CALLBACK(on_graph_bt_clicked), user_data);
-#endif
 
        next_bt = gtk_button_new_with_label("Next non-Ok");
        gtk_container_add(GTK_CONTAINER(box4), next_bt);
@@ -3311,12 +3382,16 @@ static void create_iax2_dialog(user_data_t* user_data)
 
        close_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
        gtk_container_add(GTK_CONTAINER(box4), close_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+       gtk_widget_set_can_default(close_bt, TRUE);
+#else
        GTK_WIDGET_SET_FLAGS(close_bt, GTK_CAN_DEFAULT);
+#endif
        gtk_widget_show(close_bt);
        window_set_cancel_button(window, close_bt, window_cancel_button_cb);
 
        g_signal_connect(window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-       g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), user_data);
+       g_signal_connect(window, "destroy", G_CALLBACK(on_iax2_window_destroy), user_data);
 
        gtk_widget_show(window);
        window_present(window);
@@ -3347,18 +3422,18 @@ static gboolean process_node(proto_node *ptree_node, header_field_info *hfinform
        header_field_info     *hfssrc;
        ipv4_addr             *ipv4;
 
-       finfo = PITEM_FINFO(ptree_node);
+       finfo = PNODE_FINFO(ptree_node);
 
        if (hfinformation==(finfo->hfinfo)) {
                hfssrc = proto_registrar_get_byname(proto_field);
                if (hfssrc == NULL) {
                        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                                   "Bad field name!");
+                                     "Bad field name!");
                        return FALSE;
                        }
                for(ptree_node=ptree_node->first_child; ptree_node!=NULL;
                                        ptree_node=ptree_node->next) {
-                       finfo=PITEM_FINFO(ptree_node);
+                       finfo=PNODE_FINFO(ptree_node);
                        if (hfssrc==finfo->hfinfo) {
                                if (hfinformation->type==FT_IPv4) {
                                        ipv4 = fvalue_get(&finfo->value);
@@ -3395,14 +3470,14 @@ static gboolean get_int_value_from_proto_tree(proto_tree *protocol_tree,
        hfinformation = proto_registrar_get_byname(proto_name);
        if (hfinformation == NULL) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                    "Bad proto!");
+                             "Bad proto!");
                return FALSE;
                }
 
        ptree_node = ((proto_node *)protocol_tree)->first_child;
        if (!ptree_node) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                    "No info!");
+                             "No info!");
                return FALSE;
                }
        return process_node(ptree_node, hfinformation, proto_field, p_result);
@@ -3424,12 +3499,22 @@ void iax2_analysis(
        user_data_t *user_data;
        int fd;
        int i;
-       static color_t col[MAX_GRAPHS] = {
-                       {0,     0x0000, 0x0000, 0x0000},
-               {0,     0xffff, 0x0000, 0x0000},
-               {0,     0x0000, 0xffff, 0x0000},
-               {0,     0x0000, 0x0000, 0xffff}
+       static GdkColor col[MAX_GRAPHS] = {
+               {0,     0x0000, 0x0000, 0x0000},
+               {0,     0xffff, 0x0000, 0x0000},
+               {0,     0x0000, 0xffff, 0x0000},
+               {0,     0x0000, 0x0000, 0xffff}
        };
+#if GTK_CHECK_VERSION(3,0,0)
+       static GdkRGBA rgba_col[MAX_GRAPHS] = {
+               {0.0, 0.0,   0.0,   1.0}, /* Black */
+               {1.0, 0.0,   0.1,   1.0}, /* Red */
+               {0.0, 1.0,   0.0,   1.0}, /* Green */
+               {0.0, 0.0,   1.0,   1.0}, /* Blue */
+       };
+#endif
+
+       char *tempname;
 
        /* init */
        user_data = g_malloc(sizeof(user_data_t));
@@ -3446,34 +3531,35 @@ void iax2_analysis(
 
        /* file names for storing sound data */
        /*XXX: check for errors*/
-       fd = create_tempfile(user_data->f_tempname, sizeof(user_data->f_tempname),
-               "ether_iax2_f");
+       fd = create_tempfile(&tempname, "wireshark_iax2_f");
+       user_data->f_tempname = g_strdup(tempname);
        ws_close(fd);
-       fd = create_tempfile(user_data->r_tempname, sizeof(user_data->r_tempname),
-               "ether_iax2_r");
+       fd = create_tempfile(&tempname, "wireshark_iax2_r");
+       user_data->r_tempname = g_strdup(tempname);
        ws_close(fd);
        user_data->forward.saveinfo.fp = NULL;
        user_data->reversed.saveinfo.fp = NULL;
        user_data->dlg.save_voice_as_w = NULL;
        user_data->dlg.save_csv_as_w = NULL;
-        user_data->dlg.dialog_graph.window = NULL;
-
-#ifdef USE_CONVERSATION_GRAPH
-       user_data->dlg.graph_window = NULL;
-       user_data->series_fwd.value_pairs = NULL;
-       user_data->series_rev.value_pairs = NULL;
-#endif
+       user_data->dlg.dialog_graph.window = NULL;
 
        /* init dialog_graph */
        user_data->dlg.dialog_graph.needs_redraw=TRUE;
-       user_data->dlg.dialog_graph.interval=tick_interval_values[DEFAULT_TICK_VALUE];
+       user_data->dlg.dialog_graph.interval_index=DEFAULT_TICK_INTERVAL_VALUES_INDEX;
+       user_data->dlg.dialog_graph.interval=tick_interval_values[DEFAULT_TICK_INTERVAL_VALUES_INDEX];
        user_data->dlg.dialog_graph.draw_area=NULL;
+#if GTK_CHECK_VERSION(2,22,0)
+       user_data->dlg.dialog_graph.surface=NULL;
+#else
        user_data->dlg.dialog_graph.pixmap=NULL;
+#endif
        user_data->dlg.dialog_graph.scrollbar=NULL;
        user_data->dlg.dialog_graph.scrollbar_adjustment=NULL;
-       user_data->dlg.dialog_graph.pixmap_width=500;
-       user_data->dlg.dialog_graph.pixmap_height=200;
-       user_data->dlg.dialog_graph.pixels_per_tick=pixels_per_tick[DEFAULT_PIXELS_PER_TICK];
+       user_data->dlg.dialog_graph.surface_width=500;
+       user_data->dlg.dialog_graph.surface_height=200;
+       user_data->dlg.dialog_graph.pixels_per_tick_index=DEFAULT_PIXELS_PER_TICK_INDEX;
+       user_data->dlg.dialog_graph.pixels_per_tick=pixels_per_tick[DEFAULT_PIXELS_PER_TICK_INDEX];
+       user_data->dlg.dialog_graph.max_y_units_index=AUTO_MAX_YSCALE_INDEX;
        user_data->dlg.dialog_graph.max_y_units=AUTO_MAX_YSCALE;
        user_data->dlg.dialog_graph.last_interval=0xffffffff;
        user_data->dlg.dialog_graph.max_interval=0;
@@ -3481,11 +3567,16 @@ void iax2_analysis(
        user_data->dlg.dialog_graph.start_time = -1;
 
        for(i=0;i<MAX_GRAPHS;i++){
-               user_data->dlg.dialog_graph.graph[i].gc=NULL;
                user_data->dlg.dialog_graph.graph[i].color.pixel=0;
                user_data->dlg.dialog_graph.graph[i].color.red=col[i].red;
                user_data->dlg.dialog_graph.graph[i].color.green=col[i].green;
                user_data->dlg.dialog_graph.graph[i].color.blue=col[i].blue;
+#if GTK_CHECK_VERSION(3,0,0)
+               user_data->dlg.dialog_graph.graph[i].rgba_color.red=rgba_col[i].red;
+               user_data->dlg.dialog_graph.graph[i].rgba_color.green=rgba_col[i].green;
+               user_data->dlg.dialog_graph.graph[i].rgba_color.blue=rgba_col[i].blue;
+               user_data->dlg.dialog_graph.graph[i].rgba_color.alpha=rgba_col[i].alpha;
+#endif
                user_data->dlg.dialog_graph.graph[i].display=TRUE;
                user_data->dlg.dialog_graph.graph[i].display_button=NULL;
                user_data->dlg.dialog_graph.graph[i].ud=user_data;
@@ -3500,7 +3591,11 @@ void iax2_analysis(
 
 /****************************************************************************/
 /* entry point from main menu */
+#ifdef MAIN_MENU_USE_UIMANAGER
+void iax2_analysis_cb(GtkAction *action _U_, gpointer user_data _U_)
+#else
 static void iax2_analysis_cb(GtkWidget *w _U_, gpointer data _U_)
+#endif
 {
        address ip_src_fwd;
        guint16 port_src_fwd;
@@ -3515,9 +3610,7 @@ static void iax2_analysis_cb(GtkWidget *w _U_, gpointer data _U_)
        gchar filter_text[256];
        dfilter_t *sfcode;
        capture_file *cf;
-       epan_dissect_t *edt;
-       gint err;
-       gchar *err_info;
+       epan_dissect_t edt;
        gboolean frame_matched;
        frame_data *fdata;
        GList *strinfo_list;
@@ -3540,50 +3633,45 @@ static void iax2_analysis_cb(GtkWidget *w _U_, gpointer data _U_)
                return; /* if we exit here it's an error */
 
        /* dissect the current frame */
-       if (!wtap_seek_read(cf->wth, fdata->file_off, &cf->pseudo_header,
-           cf->pd, fdata->cap_len, &err, &err_info)) {
-               simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                       cf_read_error_message(err, err_info), cf->filename);
-               return;
-       }
-       edt = epan_dissect_new(TRUE, FALSE);
-       epan_dissect_prime_dfilter(edt, sfcode);
-       epan_dissect_run(edt, &cf->pseudo_header, cf->pd, fdata, NULL);
-       frame_matched = dfilter_apply_edt(sfcode, edt);
+       if (!cf_read_frame(cf, fdata))
+               return; /* error reading the frame */
+       epan_dissect_init(&edt, TRUE, FALSE);
+       epan_dissect_prime_dfilter(&edt, sfcode);
+       epan_dissect_run(&edt, &cf->pseudo_header, cf->pd, fdata, NULL);
 
        /* if it is not an iax2 frame, show an error dialog */
-       frame_matched = dfilter_apply_edt(sfcode, edt);
+       frame_matched = dfilter_apply_edt(sfcode, &edt);
        if (frame_matched != 1) {
-               epan_dissect_free(edt);
+               epan_dissect_cleanup(&edt);
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                    "You didn't choose a IAX2 packet!");
                return;
        }
-       /* check if it is Voice or MiniPacket 
+       /* check if it is Voice or MiniPacket
        if (!get_int_value_from_proto_tree(edt->tree, "iax2", "iax2.call", &ptype)) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                    "Please select a Voice packet!");
                return;
        } */
-       
+
        /* check if it is part of a Call */
-       if (edt->pi.circuit_id == 0) {
+       if (edt.pi.circuit_id == 0) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                    "Please select a Call packet!");
                return;
        }
 
        /* ok, it is a IAX2 frame, so let's get the ip and port values */
-       COPY_ADDRESS(&(ip_src_fwd), &(edt->pi.src))
-       COPY_ADDRESS(&(ip_dst_fwd), &(edt->pi.dst))
-       port_src_fwd = edt->pi.srcport;
-       port_dst_fwd = edt->pi.destport;
+       COPY_ADDRESS(&(ip_src_fwd), &(edt.pi.src))
+       COPY_ADDRESS(&(ip_dst_fwd), &(edt.pi.dst))
+       port_src_fwd = edt.pi.srcport;
+       port_dst_fwd = edt.pi.destport;
 
        /* assume the inverse ip/port combination for the reverse direction */
-       COPY_ADDRESS(&(ip_src_rev), &(edt->pi.dst))
-       COPY_ADDRESS(&(ip_dst_rev), &(edt->pi.src))
-       port_src_rev = edt->pi.destport;
-       port_dst_rev = edt->pi.srcport;
+       COPY_ADDRESS(&(ip_src_rev), &(edt.pi.dst))
+       COPY_ADDRESS(&(ip_dst_rev), &(edt.pi.src))
+       port_src_rev = edt.pi.destport;
+       port_dst_rev = edt.pi.srcport;
 
        /* Scan for rtpstream */
        rtpstream_scan();
@@ -3645,8 +3733,11 @@ register_tap_listener_iax2_analysis(void)
 {
        register_stat_cmd_arg("IAX2", iax2_analysis_init,NULL);
 
-       register_stat_menu_item("IAX2/Stream Analysis...", REGISTER_STAT_GROUP_TELEPHONY,
+#ifdef MAIN_MENU_USE_UIMANAGER
+#else
+       register_stat_menu_item("IA_X2/Stream Analysis...", REGISTER_STAT_GROUP_TELEPHONY,
            iax2_analysis_cb, NULL, NULL, NULL);
+#endif
 }