Index: ui/chat.glade
===================================================================
--- ui/chat.glade	(revision 2242)
+++ ui/chat.glade	(working copy)
@@ -116,7 +116,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image235">
+			<widget class="GtkImage" id="image200">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-clear</property>
 			  <property name="icon_size">1</property>
@@ -138,12 +138,39 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkSeparatorMenuItem" id="separator11">
+		    <widget class="GtkSeparatorMenuItem" id="menu_conv_call_separator">
 		      <property name="visible">True</property>
 		    </widget>
 		  </child>
 
 		  <child>
+		    <widget class="GtkImageMenuItem" id="menu_conv_call">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">Start a voice or video conversation with this contact</property>
+		      <property name="label" translatable="yes">Call...</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image201">
+			  <property name="visible">True</property>
+			  <property name="stock">gnome-stock-mic</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separator12">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
 		    <widget class="GtkImageMenuItem" id="menu_conv_log">
 		      <property name="visible">True</property>
 		      <property name="label" translatable="yes">_View Previous Conversations</property>
@@ -151,7 +178,7 @@
 		      <accelerator key="F3" modifiers="0" signal="activate"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image236">
+			<widget class="GtkImage" id="image202">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-justify-left</property>
 			  <property name="icon_size">1</property>
@@ -176,7 +203,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image237">
+			<widget class="GtkImage" id="image203">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -196,7 +223,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image238">
+			<widget class="GtkImage" id="image204">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-info</property>
 			  <property name="icon_size">1</property>
@@ -210,7 +237,7 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkSeparatorMenuItem" id="separator7">
+		    <widget class="GtkSeparatorMenuItem" id="separator11">
 		      <property name="visible">True</property>
 		    </widget>
 		  </child>
@@ -223,7 +250,7 @@
 		      <accelerator key="W" modifiers="GDK_CONTROL_MASK" signal="activate"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image239">
+			<widget class="GtkImage" id="image205">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-close</property>
 			  <property name="icon_size">1</property>
@@ -697,4 +724,429 @@
   </child>
 </widget>
 
+<widget class="GtkWindow" id="call_window">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Conversation with Foobar</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">True</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox10">
+      <property name="border_width">4</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">3</property>
+
+      <child>
+	<widget class="GtkHBox" id="hbox1">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkToggleButton" id="call_toggle_button">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="active">False</property>
+	      <property name="inconsistent">False</property>
+
+	      <child>
+		<widget class="GtkAlignment" id="alignment1">
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xscale">0</property>
+		  <property name="yscale">0</property>
+		  <property name="top_padding">0</property>
+		  <property name="bottom_padding">0</property>
+		  <property name="left_padding">0</property>
+		  <property name="right_padding">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox2">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">2</property>
+
+		      <child>
+			<widget class="GtkImage" id="image182">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-connect</property>
+			  <property name="icon_size">4</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label7">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Call</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="call_status_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Not Talking
+&lt;span size='smaller' &gt;Press Talk to connect&lt;/span&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkTable" id="monitor_container">
+	  <property name="visible">True</property>
+	  <property name="n_rows">2</property>
+	  <property name="n_columns">2</property>
+	  <property name="homogeneous">False</property>
+	  <property name="row_spacing">3</property>
+	  <property name="column_spacing">3</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="audio_output_container">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">3</property>
+
+	      <child>
+		<widget class="GtkImage" id="audio_input_monitor_image">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="stock">gnome-stock-volume</property>
+		  <property name="icon_size">4</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkProgressBar" id="audio_input_monitor">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
+		  <property name="fraction">0</property>
+		  <property name="pulse_step">0.10000000149</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">1</property>
+	      <property name="bottom_attach">2</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="audio_input_container">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">3</property>
+
+	      <child>
+		<widget class="GtkImage" id="audio_output_monitor_image">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="stock">gnome-stock-mic</property>
+		  <property name="icon_size">4</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkProgressBar" id="audio_output_monitor">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
+		  <property name="fraction">0</property>
+		  <property name="pulse_step">0.10000000149</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">1</property>
+	      <property name="bottom_attach">2</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkExpander" id="expander1">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="expanded">False</property>
+	  <property name="spacing">3</property>
+
+	  <child>
+	    <widget class="GtkAlignment" id="alignment2">
+	      <property name="visible">True</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xscale">1</property>
+	      <property name="yscale">1</property>
+	      <property name="top_padding">0</property>
+	      <property name="bottom_padding">0</property>
+	      <property name="left_padding">12</property>
+	      <property name="right_padding">0</property>
+
+	      <child>
+		<widget class="GtkTable" id="table1">
+		  <property name="visible">True</property>
+		  <property name="n_rows">2</property>
+		  <property name="n_columns">2</property>
+		  <property name="homogeneous">False</property>
+		  <property name="row_spacing">3</property>
+		  <property name="column_spacing">3</property>
+
+		  <child>
+		    <widget class="GtkToggleButton" id="in_mute_toggle_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">True</property>
+		      <property name="inconsistent">False</property>
+
+		      <child>
+			<widget class="GtkImage" id="image180">
+			  <property name="visible">True</property>
+			  <property name="stock">gnome-stock-mic</property>
+			  <property name="icon_size">4</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkToggleButton" id="out_mute_toggle_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">True</property>
+		      <property name="inconsistent">False</property>
+
+		      <child>
+			<widget class="GtkImage" id="image181">
+			  <property name="visible">True</property>
+			  <property name="stock">gnome-stock-volume</property>
+			  <property name="icon_size">4</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHScale" id="in_volume_scale">
+		      <property name="visible">True</property>
+		      <property name="sensitive">False</property>
+		      <property name="can_focus">True</property>
+		      <property name="draw_value">False</property>
+		      <property name="value_pos">GTK_POS_TOP</property>
+		      <property name="digits">1</property>
+		      <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+		      <property name="inverted">False</property>
+		      <property name="adjustment">100 0 100 0 0 0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="y_options">fill</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHScale" id="out_volume_scale">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="draw_value">False</property>
+		      <property name="value_pos">GTK_POS_TOP</property>
+		      <property name="digits">1</property>
+		      <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+		      <property name="inverted">False</property>
+		      <property name="adjustment">100 0 100 0 0 0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options">fill</property>
+		    </packing>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label8">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Volume Settings</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">True</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">label_item</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>
Index: src/gossip-contact-list.c
===================================================================
--- src/gossip-contact-list.c	(revision 2242)
+++ src/gossip-contact-list.c	(working copy)
@@ -28,6 +28,7 @@
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <glade/glade.h>
+#include <libgnomeui/gnome-stock-icons.h>
 
 #include <libgossip/gossip-debug.h>
 #include <libgossip/gossip-event.h>
@@ -40,12 +41,14 @@
 #include "gossip-app.h"
 #include "gossip-cell-renderer-expander.h"
 #include "gossip-cell-renderer-text.h"
+#include "gossip-cell-renderer-activatable.h"
 #include "gossip-chat-invite.h"
 #include "gossip-contact-groups.h"
 #include "gossip-contact-info-dialog.h"
 #include "gossip-contact-list.h"
 #include "gossip-edit-contact-dialog.h"
 #include "gossip-ft-window.h"
+#include "gossip-voip-window.h"
 #include "gossip-log-window.h"
 #include "gossip-marshal.h"
 #include "gossip-sound.h"
@@ -222,6 +225,14 @@
 							      GtkTreeModel           *model,
 							      GtkTreeIter            *iter,
 							      GossipContactList      *list);
+static void     contact_list_voip_activated_cb               (GossipCellRendererActivatable *cell,
+							      const gchar            *path_string,
+							      GossipContactList      *list);
+static void     contact_list_voip_cell_data_func           (GtkTreeViewColumn      *tree_column,
+							      GtkCellRenderer        *cell,
+							      GtkTreeModel           *model,
+							      GtkTreeIter            *iter,
+							      GossipContactList      *list);
 static void     contact_list_avatar_cell_data_func           (GtkTreeViewColumn      *tree_column,
 							      GtkCellRenderer        *cell,
 							      GtkTreeModel           *model,
@@ -239,7 +250,8 @@
 							      GossipContactList      *list);
 static GtkWidget *contact_list_get_contact_menu              (GossipContactList      *list,
 							      gboolean                can_send_file,
-							      gboolean                can_show_log);
+							      gboolean                can_show_log,
+							      gboolean                can_voip);
 static gboolean contact_list_button_press_event_cb           (GossipContactList      *list,
 							      GdkEventButton         *event,
 							      gpointer                user_data);
@@ -306,6 +318,7 @@
 	COL_IS_ACTIVE,
 	COL_IS_ONLINE,
 	COL_IS_COMPOSING,
+	COL_CAN_VOIP,
 	COL_COUNT
 };
 
@@ -357,6 +370,10 @@
 	  N_("_View Previous Conversations"), NULL, N_("View previous conversations with this contact"),
 	  G_CALLBACK (contact_list_action_cb)
 	},
+	{ "Call", GNOME_STOCK_MIC,
+	  N_("_Call"), NULL, N_("Start a voice or video conversation with this contact"),
+	  G_CALLBACK (contact_list_action_cb)
+	},
 };
 
 static guint n_entries = G_N_ELEMENTS (entries);
@@ -365,6 +382,7 @@
 	"<ui>"
 	"  <popup name='Contact'>"
 	"    <menuitem action='Chat'/>"
+	"    <menuitem action='Call'/>"
 	"    <menuitem action='Log'/>"
 	"    <menuitem action='SendFile'/>"
 	"    <separator/>"
@@ -700,6 +718,8 @@
 	/* Get online state now. */
 	now_online = gossip_contact_is_online (contact);
 
+	gossip_debug (DEBUG_DOMAIN, "Contact updated in clist");
+
 	if (!in_list && !should_be_in_list) {
 		/* Nothing to do. */
 		gossip_debug (DEBUG_DOMAIN,
@@ -808,6 +828,9 @@
 		if (is_composing) {
 			pixbuf = pixbuf_composing;
 		}
+		gossip_debug (DEBUG_DOMAIN, "Contact capabilities updated in clist: %s %d",
+				gossip_contact_get_name (contact),
+				gossip_contact_can_voip (contact));
 
 		gtk_tree_store_set (GTK_TREE_STORE (model), l->data,
 				    COL_PIXBUF_STATUS, pixbuf,
@@ -815,6 +838,7 @@
 				    COL_IS_ONLINE, now_online,
 				    COL_NAME, gossip_contact_get_name (contact),
 				    COL_PIXBUF_AVATAR, pixbuf_avatar,
+				    COL_CAN_VOIP, gossip_contact_can_voip (contact),
 				    -1);
 	}
 
@@ -874,6 +898,9 @@
 	g_signal_connect (contact, "notify::type",
 			  G_CALLBACK (contact_list_contact_updated_cb),
 			  list);
+	g_signal_connect (contact, "notify::capabilities",
+			  G_CALLBACK (contact_list_contact_updated_cb),
+			  list);
 
 	has_events = g_hash_table_lookup (priv->flash_table, contact) != NULL;
 
@@ -910,6 +937,10 @@
 	gossip_debug (DEBUG_DOMAIN, "Contact:'%s' groups updated",
 		      gossip_contact_get_name (contact));
 
+	if (!priv->show_offline && !gossip_contact_is_online (contact)) {
+		return;
+	}
+
 	/* We do this to make sure the groups are correct, if not, we
 	 * would have to check the groups already set up for each
 	 * contact and then see what has been updated.
@@ -1168,6 +1199,7 @@
 		}
 
 		gtk_tree_store_append (GTK_TREE_STORE (model), iter_to_set, NULL);
+		gossip_debug (DEBUG_DOMAIN, "Adding contact to list: %s", name);
 		gtk_tree_store_set (GTK_TREE_STORE (model), iter_to_set,
 				    COL_PIXBUF_STATUS, NULL,
 				    COL_NAME, name,
@@ -1241,6 +1273,7 @@
 		}
 
 		gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
+		gossip_debug (DEBUG_DOMAIN, "Adding contact to list: %s %d", gossip_contact_get_name(contact), gossip_contact_can_voip (contact));
 		gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
 				    COL_PIXBUF_STATUS, pixbuf_status,
 				    COL_PIXBUF_AVATAR, pixbuf_avatar,
@@ -1253,6 +1286,7 @@
 				    COL_IS_ACTIVE, FALSE,
 				    COL_IS_ONLINE, gossip_contact_is_online (contact),
 				    COL_IS_COMPOSING, FALSE,
+				    COL_CAN_VOIP, gossip_contact_can_voip (contact),
 				    -1);
 
 		if (pixbuf_avatar) {
@@ -1287,6 +1321,7 @@
 		}
 
 		gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &iter_group);
+		gossip_debug (DEBUG_DOMAIN, "Adding contact to list: %s %d", gossip_contact_get_name(contact), gossip_contact_can_voip (contact));
 		gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
 				    COL_PIXBUF_STATUS, pixbuf_status,
 				    COL_PIXBUF_AVATAR, pixbuf_avatar,
@@ -1299,6 +1334,7 @@
 				    COL_IS_ACTIVE, FALSE,
 				    COL_IS_ONLINE, gossip_contact_is_online (contact),
 				    COL_IS_COMPOSING, FALSE,
+				    COL_CAN_VOIP, gossip_contact_can_voip (contact),
 				    -1);
 
 		if (pixbuf_avatar) {
@@ -1392,7 +1428,8 @@
 				    G_TYPE_BOOLEAN,      /* Is group */
 				    G_TYPE_BOOLEAN,      /* Is active */
 				    G_TYPE_BOOLEAN,      /* Is online */
-				    G_TYPE_BOOLEAN));    /* Is composing */
+				    G_TYPE_BOOLEAN,      /* Is composing */
+				    G_TYPE_BOOLEAN));    /* Can do Voip */
 
 	gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
 					 COL_NAME,
@@ -1488,6 +1525,23 @@
 	gtk_tree_view_column_add_attribute (col, cell,
 					    "is_group", COL_IS_GROUP);
 
+	/* Voip Capability Icon */
+	cell = gossip_cell_renderer_activatable_new ();
+	gtk_tree_view_column_pack_start (col, cell, FALSE);
+	gtk_tree_view_column_set_cell_data_func (
+		col, cell,
+		(GtkTreeCellDataFunc) contact_list_voip_cell_data_func,
+		list, NULL);
+
+	g_object_set (cell,
+		      "visible", FALSE,
+		      NULL);
+
+	g_signal_connect (cell,
+		"path-activated",
+		G_CALLBACK (contact_list_voip_activated_cb),
+		list);
+
 	/* Avatar */
 	cell = gtk_cell_renderer_pixbuf_new ();
 	gtk_tree_view_column_pack_start (col, cell, FALSE);
@@ -1942,6 +1996,69 @@
 }
 
 static void
+contact_list_voip_activated_cb (GossipCellRendererActivatable *cell,
+				    const gchar       *path_string,
+				    GossipContactList *list)
+{
+	GtkTreeModel  *model;
+	GtkTreeIter    iter;
+	GossipContact *contact;
+
+	model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
+	if (!gtk_tree_model_get_iter_from_string (model,
+			&iter,
+			path_string))
+	{
+		g_object_unref (model);
+		return;
+	}
+
+	gtk_tree_model_get (model, &iter,
+			    COL_CONTACT, &contact,
+			    -1);
+
+
+	if (contact)
+	{
+		gossip_voip_window_present (contact, FALSE);
+		g_object_unref (contact);
+	}
+
+	g_object_unref (model);
+}
+
+static void
+contact_list_voip_cell_data_func (GtkTreeViewColumn *tree_column,
+				    GtkCellRenderer   *cell,
+				    GtkTreeModel      *model,
+				    GtkTreeIter       *iter,
+				    GossipContactList *list)
+{
+	gboolean                  is_group;
+	gboolean                  is_active;
+	gboolean                  can_voip;
+
+	gtk_tree_model_get (model, iter,
+			    COL_IS_GROUP, &is_group,
+			    COL_IS_ACTIVE, &is_active,
+			    COL_CAN_VOIP, &can_voip,
+			    -1);
+
+	g_object_set (cell,
+		      "visible", !is_group && can_voip,
+		      NULL);
+
+	if (can_voip) {
+		g_object_set (cell,
+		      "stock-id", GNOME_STOCK_MIC,
+		      "stock-size", GTK_ICON_SIZE_BUTTON,
+		      NULL);
+	}
+
+	contact_list_cell_set_background (list, cell, is_group, is_active);
+}
+
+static void
 contact_list_avatar_cell_data_func (GtkTreeViewColumn *tree_column,
 				    GtkCellRenderer   *cell,
 				    GtkTreeModel      *model,
@@ -2033,7 +2150,8 @@
 static GtkWidget *
 contact_list_get_contact_menu (GossipContactList *list,
 			       gboolean           can_send_file,
-			       gboolean           can_show_log)
+			       gboolean           can_show_log,
+			       gboolean           can_voip)
 {
 	GossipContactListPriv *priv;
 	GtkAction             *action;
@@ -2045,6 +2163,9 @@
 	action = gtk_ui_manager_get_action (priv->ui, "/Contact/Log");
 	gtk_action_set_sensitive (action, can_show_log);
 
+	action = gtk_ui_manager_get_action (priv->ui, "/Contact/Call");
+	gtk_action_set_sensitive (action, can_voip);
+
 	/* FIXME: disable file transfer until finished. */
 	action = gtk_ui_manager_get_action (priv->ui, "/Contact/SendFile");
 	gtk_action_set_visible (action, can_send_file);
@@ -2073,19 +2194,22 @@
 gossip_contact_list_get_contact_menu (GossipContactList *list,
 				      GossipContact     *contact)
 {
-	GtkWidget *menu;
-	gboolean   can_show_log;
-	gboolean   can_send_file;
+	GtkWidget                *menu;
+	gboolean                  can_voip;
+	gboolean                  can_show_log;
+	gboolean                  can_send_file;
 
 	g_return_val_if_fail (GOSSIP_IS_CONTACT_LIST (list), NULL);
 	g_return_val_if_fail (GOSSIP_IS_CONTACT (contact), NULL);
 
+	can_voip = gossip_contact_can_voip (contact);
 	can_show_log = gossip_log_exists_for_contact (contact);
 	can_send_file = FALSE;
 
 	menu = contact_list_get_contact_menu (list,
 					      can_send_file,
-					      can_show_log);
+					      can_show_log,
+					      can_voip);
 	return menu;
 }
 
@@ -2321,7 +2445,18 @@
 		contact = gossip_contact_list_get_selected (list);
 		contact_list_action_activated (list, contact);
 		g_object_unref (contact);
+		return;
+	}
 
+	if (strcmp (name, "Call") == 0) {
+		GossipContact *contact;
+
+		contact = gossip_contact_list_get_selected (list);
+		if (contact) {
+			gossip_voip_window_present (contact, FALSE);
+			g_object_unref (contact);
+		}
+
 		return;
 	}
 
Index: src/gossip-app.c
===================================================================
--- src/gossip-app.c	(revision 2242)
+++ src/gossip-app.c	(working copy)
@@ -53,6 +53,7 @@
 #include "gossip-chatrooms-window.h"
 #include "gossip-contact-list.h"
 #include "gossip-ft-window.h"
+#include "gossip-voip-window.h"
 #include "gossip-geometry.h"
 #include "gossip-group-chat.h"
 #include "gossip-idle.h"
@@ -271,6 +272,9 @@
 static gchar *         app_session_get_password_cb            (GossipSession            *session,
 							       GossipAccount            *account,
 							       gpointer                  user_data);
+static void            app_session_voip_new_call_cb           (GossipSession            *session,
+							       GossipContact            *contact,
+							       gpointer                  user_data);
 static void            app_accels_load                        (void);
 static void            app_accels_save                        (void);
 static void            app_show_hide_list_cb                  (GtkWidget                *widget,
@@ -445,6 +449,10 @@
 					      app_session_chatroom_auto_connect_cb,
 					      NULL);
 
+	g_signal_handlers_disconnect_by_func (priv->session,
+					      app_session_voip_new_call_cb,
+					      NULL);
+
 	g_signal_handlers_disconnect_by_func (priv->event_manager,
 					      app_event_added_cb,
 					      NULL);
@@ -552,6 +560,10 @@
 			  G_CALLBACK (app_session_chatroom_auto_connect_cb),
 			  NULL);
 
+	g_signal_connect (priv->session, "voip-incoming",
+			  G_CALLBACK (app_session_voip_new_call_cb),
+			  NULL);
+
 	g_signal_connect (priv->event_manager, "event-added",
 			  G_CALLBACK (app_event_added_cb),
 			  NULL);
@@ -1567,6 +1579,14 @@
 	return password;
 }
 
+static void
+app_session_voip_new_call_cb (GossipSession *session,
+			     GossipContact *contact,
+			     gpointer       user_data)
+{
+	gossip_voip_window_present (contact, TRUE);
+}
+
 /*
  * Accels
  */
Index: src/gossip-chat-window.c
===================================================================
--- src/gossip-chat-window.c	(revision 2242)
+++ src/gossip-chat-window.c	(working copy)
@@ -43,6 +43,7 @@
 #include "gossip-app.h"
 #include "gossip-chat-invite.h"
 #include "gossip-chat-window.h"
+#include "gossip-voip-window.h"
 #include "gossip-contact-info-dialog.h"
 #include "gossip-log-window.h"
 #include "gossip-new-chatroom-dialog.h"
@@ -79,6 +80,8 @@
 	/* Menu items. */
 	GtkWidget   *menu_conv_clear;
 	GtkWidget   *menu_conv_insert_smiley;
+	GtkWidget   *menu_conv_call;
+	GtkWidget   *menu_conv_call_separator;
 	GtkWidget   *menu_conv_log;
 	GtkWidget   *menu_conv_separator;
 	GtkWidget   *menu_conv_add_contact;
@@ -139,6 +142,8 @@
 							 GossipChatWindow      *window);
 static void       chat_window_add_contact_activate_cb   (GtkWidget             *menuitem,
 							 GossipChatWindow      *window);
+static void       chat_window_call_activate_cb           (GtkWidget             *menuitem,
+							 GossipChatWindow      *window);
 static void       chat_window_log_activate_cb           (GtkWidget             *menuitem,
 							 GossipChatWindow      *window);
 static void       chat_window_show_contacts_toggled_cb  (GtkWidget             *menuitem,
@@ -290,6 +295,8 @@
 				       "menu_conv", &menu_conv,
 				       "menu_conv_clear", &priv->menu_conv_clear,
 				       "menu_conv_insert_smiley", &priv->menu_conv_insert_smiley,
+				       "menu_conv_call", &priv->menu_conv_call,
+				       "menu_conv_call_separator", &priv->menu_conv_call_separator,
 				       "menu_conv_log", &priv->menu_conv_log,
 				       "menu_conv_separator", &priv->menu_conv_separator,
 				       "menu_conv_add_contact", &priv->menu_conv_add_contact,
@@ -316,6 +323,7 @@
 			      "chat_window", "configure-event", chat_window_configure_event_cb,
 			      "menu_conv", "activate", chat_window_conv_activate_cb,
 			      "menu_conv_clear", "activate", chat_window_clear_activate_cb,
+			      "menu_conv_call", "activate", chat_window_call_activate_cb,
 			      "menu_conv_log", "activate", chat_window_log_activate_cb,
 			      "menu_conv_add_contact", "activate", chat_window_add_contact_activate_cb,
 			      "menu_conv_info", "activate", chat_window_info_activate_cb,
@@ -942,6 +950,22 @@
 }
 
 static void
+chat_window_call_activate_cb (GtkWidget        *menuitem,
+			     GossipChatWindow *window)
+{
+	GossipChatWindowPriv *priv;
+
+	priv = GET_PRIV (window);
+
+	if (!gossip_chat_is_group_chat (priv->current_chat)) {
+		GossipContact *contact;
+
+		contact = gossip_chat_get_contact (priv->current_chat);
+		gossip_voip_window_present (contact, FALSE);
+	}
+}
+
+static void
 chat_window_log_activate_cb (GtkWidget        *menuitem,
 			     GossipChatWindow *window)
 {
@@ -1029,6 +1053,7 @@
 {
 	GossipChatWindowPriv *priv;
 	gboolean              log_exists = FALSE;
+	gboolean              can_voip = FALSE;
 
 	priv = GET_PRIV (window);
 
@@ -1048,9 +1073,13 @@
 		if (contact) {
 			log_exists = gossip_log_exists_for_contact (contact);
 		}
+		can_voip = gossip_contact_can_voip (contact);
 	}
 
 	gtk_widget_set_sensitive (priv->menu_conv_log, log_exists);
+	gossip_debug (DEBUG_DOMAIN, "Show voip menu items: %d", can_voip);
+	g_object_set (priv->menu_conv_call, "visible", can_voip, NULL);
+	g_object_set (priv->menu_conv_call_separator, "visible", can_voip, NULL);
 }
 
 static void
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 2242)
+++ src/Makefile.am	(working copy)
@@ -50,6 +50,7 @@
 	gossip-avatar-image.c		   gossip-avatar-image.h		\
 	gossip-cell-renderer-expander.c    gossip-cell-renderer-expander.h      \
 	gossip-cell-renderer-text.c        gossip-cell-renderer-text.h          \
+	gossip-cell-renderer-activatable.c gossip-cell-renderer-activatable.h   \
 	gossip-chat.c		           gossip-chat.h			\
 	gossip-chat-invite.c	           gossip-chat-invite.h			\
 	gossip-chat-manager.c              gossip-chat-manager.h               	\
@@ -76,6 +77,7 @@
 	gossip-presence-chooser.c          gossip-presence-chooser.h        	\
 	gossip-preferences.c               gossip-preferences.h	        	\
 	gossip-private-chat.c              gossip-private-chat.h               	\
+	gossip-voip-window.c               gossip-voip-window.h               	\
 	gossip-sound.c		           gossip-sound.h			\
 	gossip-stock.c		           gossip-stock.h			\
 	gossip-spell.c                     gossip-spell.h                       \
