diff --git a/configure.ac b/configure.ac
index 9d40693..1c68161 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,6 +35,9 @@ MISSION_CONTROL_REQUIRED=4.61
 ENCHANT_REQUIRED=1.2.0
 ISO_CODES_REQUIRED=0.35
 GEOCLUE_REQUIRED=0.11
+LIBCHAMPLAIN_REQUIRED=0.2.6
+LIBCHAMPLAIN_GTK_REQUIRED=0.2.6
+CLUTTER_GTK_REQUIRED=0.8.2
 
 # Uncomment that to build with deprecated symbols disabled
 #AC_DEFINE(G_DISABLE_DEPRECATED, [], [Disable deprecated GLib symbols])
@@ -230,6 +233,8 @@ if test "x$enable_map" = "xyes" -a "x$have_geoclue" != "xyes"; then
 fi
 
 AM_CONDITIONAL(HAVE_GEOCLUE, test "x$have_geoclue" = "xyes")
+AC_SUBST(GEOCLUE_CFLAGS)
+AC_SUBST(GEOCLUE_LIBS)
 
 # -----------------------------------------------------------
 # Megaphone
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index c0991f4..da67ee6 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -6,6 +6,7 @@ AM_CPPFLAGS =                                           \
 	$(EMPATHY_CFLAGS)				\
 	$(ENCHANT_CFLAGS)				\
 	$(GEOCLUE_CFLAGS)				\
+	$(LIBCHAMPLAIN_CFLAGS)				\
 	$(WARN_CFLAGS)
 
 BUILT_SOURCES = 					\
@@ -60,6 +61,7 @@ libempathy_gtk_la_LIBADD =			\
 	$(EMPATHY_LIBS)				\
 	$(ENCHANT_LIBS)				\
 	$(GEOCLUE_LIBS)				\
+	$(LIBCHAMPLAIN_LIBS)			\
 	$(top_builddir)/libempathy/libempathy.la
 
 libempathy_gtk_la_LDFLAGS =                \
diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h
index 5dfdcc1..0d6547b 100644
--- a/libempathy-gtk/empathy-conf.h
+++ b/libempathy-gtk/empathy-conf.h
@@ -67,6 +67,7 @@ struct _EmpathyConfClass {
 #define EMPATHY_PREFS_UI_SHOW_AVATARS              EMPATHY_PREFS_PATH "/ui/show_avatars"
 #define EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST      EMPATHY_PREFS_PATH "/ui/compact_contact_list"
 #define EMPATHY_PREFS_CONTACTS_SHOW_OFFLINE        EMPATHY_PREFS_PATH "/contacts/show_offline"
+#define EMPATHY_PREFS_CONTACTS_SHOW_MAP            EMPATHY_PREFS_PATH "/contacts/show_map"
 #define EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM      EMPATHY_PREFS_PATH "/contacts/sort_criterium"
 #define EMPATHY_PREFS_HINTS_CLOSE_MAIN_WINDOW      EMPATHY_PREFS_PATH "/hints/close_main_window"
 #define EMPATHY_PREFS_SALUT_ACCOUNT_CREATED        EMPATHY_PREFS_PATH "/accounts/salut_created"
diff --git a/libempathy-gtk/empathy-contact-dialogs.c b/libempathy-gtk/empathy-contact-dialogs.c
index 0b02cea..9ac4d6e 100644
--- a/libempathy-gtk/empathy-contact-dialogs.c
+++ b/libempathy-gtk/empathy-contact-dialogs.c
@@ -207,6 +207,11 @@ empathy_contact_information_dialog_show (EmpathyContact *contact,
 	if (!is_user && edit) {
 		flags |= EMPATHY_CONTACT_WIDGET_EDIT_GROUPS;
 	}
+#if HAVE_LIBCHAMPLAIN
+	if (!is_user && !edit) {
+		flags |= EMPATHY_CONTACT_WIDGET_SHOW_LOCATION;
+	}
+#endif
 	contact_widget = empathy_contact_widget_new (contact, flags);
 	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
 			    contact_widget,
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index b3fbe33..94d9ee9 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -21,19 +21,27 @@
 
 #include <config.h>
 
+#define _GNU_SOURCE
 #include <string.h>
 #include <stdlib.h>
+#include <time.h>
 
 #include <gtk/gtk.h>
 #include <glade/glade.h>
 #include <glib/gi18n-lib.h>
 
+#if HAVE_LIBCHAMPLAIN
+#include <champlain/champlain.h>
+#include <champlain-gtk/champlain-gtk.h>
+#endif
+
 #include <libmissioncontrol/mc-account.h>
 #include <telepathy-glib/util.h>
 
 #include <libempathy/empathy-contact-factory.h>
 #include <libempathy/empathy-contact-manager.h>
 #include <libempathy/empathy-contact-list.h>
+#include <libempathy/empathy-location.h>
 #include <libempathy/empathy-utils.h>
 
 #include "empathy-contact-widget.h"
@@ -70,6 +78,15 @@ typedef struct
   GtkWidget *table_contact;
   GtkWidget *vbox_avatar;
 
+#if HAVE_LIBCHAMPLAIN
+  /* Location */
+  GtkWidget *vbox_location;
+  GtkWidget *label_location;
+  GtkWidget *viewport_map;
+  GtkWidget *map_view_embed;
+  ClutterActor *map_view;
+#endif
+
   /* Groups */
   GtkWidget *vbox_groups;
   GtkWidget *entry_group;
@@ -143,6 +160,9 @@ static void contact_widget_details_setup (EmpathyContactWidget *information);
 static void contact_widget_details_update (EmpathyContactWidget *information);
 static void contact_widget_client_setup (EmpathyContactWidget *information);
 static void contact_widget_client_update (EmpathyContactWidget *information);
+#if HAVE_LIBCHAMPLAIN
+static void contact_widget_location_update (EmpathyContactWidget *information);
+#endif
 
 enum
 {
@@ -177,6 +197,11 @@ empathy_contact_widget_new (EmpathyContact *contact,
        "label_status", &information->label_status,
        "table_contact", &information->table_contact,
        "vbox_avatar", &information->vbox_avatar,
+#if HAVE_LIBCHAMPLAIN
+       "vbox_location", &information->vbox_location,
+       "label_location", &information->label_location,
+       "viewport_map", &information->viewport_map,
+#endif
        "vbox_groups", &information->vbox_groups,
        "entry_group", &information->entry_group,
        "button_group", &information->button_group,
@@ -324,6 +349,9 @@ contact_widget_set_contact (EmpathyContactWidget *information,
   contact_widget_groups_update (information);
   contact_widget_details_update (information);
   contact_widget_client_update (information);
+#if HAVE_LIBCHAMPLAIN
+  contact_widget_location_update (information);
+#endif
 }
 
 static gboolean
@@ -1151,3 +1179,82 @@ contact_widget_client_update (EmpathyContactWidget *information)
 {
   /* FIXME: Needs new telepathy spec */
 }
+
+#if HAVE_LIBCHAMPLAIN
+static void
+contact_widget_location_update (EmpathyContactWidget *information)
+{
+  GHashTable *location;
+  GValue *value;
+  gdouble lat, lon;
+  ClutterActor *marker;
+  ChamplainLayer *layer;
+
+  location = empathy_contact_get_location (information->contact);
+  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+  if (value == NULL)
+    {
+      gtk_widget_hide (information->vbox_location);
+      return;
+    }
+  lat = g_value_get_double (value);
+
+  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LON);
+  if (value == NULL)
+    {
+      gtk_widget_hide (information->vbox_location);
+      return;
+    }
+  lon = g_value_get_double (value);
+
+  value = g_hash_table_lookup (location, EMPATHY_LOCATION_TIMESTAMP);
+  if (value == NULL)
+    gtk_label_set_markup (GTK_LABEL (information->label_location), _("<b>Location</b>"));
+  else
+    {
+      gchar user_date [100];
+      gint64 stamp;
+      struct tm *ptm;
+      time_t time;
+
+      stamp = g_value_get_int64 (value);
+      time = stamp;
+      ptm = gmtime (&time);
+
+      if (strftime (user_date, 100, _("%B %e, %Y at %R UTC"), ptm) > 0)
+        {
+          gchar *text;
+          text = g_strconcat ( _("<b>Location</b> on "), user_date, NULL);
+          gtk_label_set_markup (GTK_LABEL (information->label_location), text);
+          g_free (text);
+        }
+      else
+        gtk_label_set_markup (GTK_LABEL (information->label_location), _("<b>Location</b>"));
+    }
+
+  if (/* information->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP || */
+      information->flags & EMPATHY_CONTACT_WIDGET_SHOW_LOCATION)
+    {
+      information->map_view = champlain_view_new (CHAMPLAIN_VIEW_MODE_KINETIC);
+      information->map_view_embed = champlain_view_embed_new (
+          CHAMPLAIN_VIEW (information->map_view));
+
+      gtk_container_add (GTK_CONTAINER (information->viewport_map),
+          information->map_view_embed);
+      g_object_set (G_OBJECT (information->map_view), "show-license", FALSE,
+          NULL);
+
+      layer = champlain_layer_new ();
+      champlain_view_add_layer (CHAMPLAIN_VIEW (information->map_view), layer);
+
+      marker = champlain_marker_new_with_label (
+          empathy_contact_get_name (information->contact), NULL, NULL, NULL);
+      champlain_marker_set_position (CHAMPLAIN_MARKER (marker), lat, lon);
+      clutter_container_add (CLUTTER_CONTAINER (layer), marker, NULL);
+
+      champlain_view_center_on (CHAMPLAIN_VIEW(information->map_view), lat, lon);
+      gtk_widget_show_all (information->vbox_location);
+    }
+
+}
+#endif
diff --git a/libempathy-gtk/empathy-contact-widget.glade b/libempathy-gtk/empathy-contact-widget.glade
index 721ebe3..20fceb1 100644
--- a/libempathy-gtk/empathy-contact-widget.glade
+++ b/libempathy-gtk/empathy-contact-widget.glade
@@ -7,6 +7,7 @@
     <property name="title" translatable="yes">Contact information</property>
     <child>
       <widget class="GtkVBox" id="vbox_contact_widget">
+        <property name="border_width">5</property>
         <property name="spacing">6</property>
         <child>
           <widget class="GtkVBox" id="vbox_contact">
@@ -53,12 +54,14 @@
                               <placeholder/>
                             </child>
                             <child>
-                              <widget class="GtkLabel" id="label680">
+                              <widget class="GtkLabel" id="label_alias">
                                 <property name="visible">True</property>
                                 <property name="xalign">0</property>
-                                <property name="label" translatable="yes">Account:</property>
+                                <property name="label" translatable="yes">Alias:</property>
                               </widget>
                               <packing>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
                                 <property name="x_options">GTK_FILL</property>
                                 <property name="y_options"></property>
                               </packing>
@@ -77,14 +80,12 @@
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkLabel" id="label_alias">
+                              <widget class="GtkLabel" id="label680">
                                 <property name="visible">True</property>
                                 <property name="xalign">0</property>
-                                <property name="label" translatable="yes">Alias:</property>
+                                <property name="label" translatable="yes">Account:</property>
                               </widget>
                               <packing>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
                                 <property name="x_options">GTK_FILL</property>
                                 <property name="y_options"></property>
                               </packing>
@@ -153,6 +154,48 @@
           </packing>
         </child>
         <child>
+          <widget class="GtkVBox" id="vbox_location">
+            <property name="spacing">6</property>
+            <child>
+              <widget class="GtkLabel" id="label_location">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;Location&lt;/b&gt; at (date)	</property>
+                <property name="use_markup">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <widget class="GtkViewport" id="viewport_map">
+                    <property name="height_request">150</property>
+                    <property name="visible">True</property>
+                    <property name="resize_mode">GTK_RESIZE_QUEUE</property>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
           <widget class="GtkVBox" id="vbox_groups">
             <property name="spacing">6</property>
             <child>
@@ -250,7 +293,7 @@
             </child>
           </widget>
           <packing>
-            <property name="position">1</property>
+            <property name="position">2</property>
           </packing>
         </child>
         <child>
@@ -295,47 +338,47 @@
                           <placeholder/>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label670">
+                          <widget class="GtkLabel" id="label652">
                             <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Fullname:</property>
+                            <property name="label" translatable="yes">Birthday:</property>
                           </widget>
                           <packing>
+                            <property name="top_attach">3</property>
+                            <property name="bottom_attach">4</property>
                             <property name="x_options">GTK_FILL</property>
                             <property name="y_options"></property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label650">
+                          <widget class="GtkLabel" id="label651">
                             <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Email:</property>
+                            <property name="label" translatable="yes">Web site:</property>
                           </widget>
                           <packing>
-                            <property name="top_attach">1</property>
-                            <property name="bottom_attach">2</property>
+                            <property name="top_attach">2</property>
+                            <property name="bottom_attach">3</property>
                             <property name="x_options">GTK_FILL</property>
                             <property name="y_options"></property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label651">
+                          <widget class="GtkLabel" id="label650">
                             <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Web site:</property>
+                            <property name="label" translatable="yes">Email:</property>
                           </widget>
                           <packing>
-                            <property name="top_attach">2</property>
-                            <property name="bottom_attach">3</property>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
                             <property name="x_options">GTK_FILL</property>
                             <property name="y_options"></property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label652">
+                          <widget class="GtkLabel" id="label670">
                             <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Birthday:</property>
+                            <property name="label" translatable="yes">Fullname:</property>
                           </widget>
                           <packing>
-                            <property name="top_attach">3</property>
-                            <property name="bottom_attach">4</property>
                             <property name="x_options">GTK_FILL</property>
                             <property name="y_options"></property>
                           </packing>
@@ -387,7 +430,7 @@
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="position">2</property>
+            <property name="position">3</property>
           </packing>
         </child>
         <child>
@@ -420,37 +463,35 @@
                         <property name="column_spacing">12</property>
                         <property name="row_spacing">6</property>
                         <child>
-                          <widget class="GtkLabel" id="label668">
+                          <widget class="GtkLabel" id="label_os">
+                            <property name="can_focus">True</property>
                             <property name="xalign">0</property>
-                            <property name="yalign">0</property>
-                            <property name="label" translatable="yes">OS:</property>
+                            <property name="xpad">2</property>
+                            <property name="wrap">True</property>
+                            <property name="selectable">True</property>
                           </widget>
                           <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
                             <property name="top_attach">2</property>
                             <property name="bottom_attach">3</property>
-                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options"></property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label667">
+                          <widget class="GtkLabel" id="label_version">
+                            <property name="can_focus">True</property>
                             <property name="xalign">0</property>
-                            <property name="yalign">0</property>
-                            <property name="label" translatable="yes">Version:</property>
+                            <property name="xpad">2</property>
+                            <property name="wrap">True</property>
+                            <property name="selectable">True</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">GTK_FILL</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkLabel" id="label666">
-                            <property name="xalign">0</property>
-                            <property name="yalign">0</property>
-                            <property name="label" translatable="yes">Client:</property>
-                          </widget>
-                          <packing>
-                            <property name="x_options">GTK_FILL</property>
+                            <property name="y_options"></property>
                           </packing>
                         </child>
                         <child>
@@ -468,35 +509,37 @@
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label_version">
-                            <property name="can_focus">True</property>
+                          <widget class="GtkLabel" id="label666">
                             <property name="xalign">0</property>
-                            <property name="xpad">2</property>
-                            <property name="wrap">True</property>
-                            <property name="selectable">True</property>
+                            <property name="yalign">0</property>
+                            <property name="label" translatable="yes">Client:</property>
+                          </widget>
+                          <packing>
+                            <property name="x_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="label667">
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="label" translatable="yes">Version:</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="y_options"></property>
+                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="label_os">
-                            <property name="can_focus">True</property>
+                          <widget class="GtkLabel" id="label668">
                             <property name="xalign">0</property>
-                            <property name="xpad">2</property>
-                            <property name="wrap">True</property>
-                            <property name="selectable">True</property>
+                            <property name="yalign">0</property>
+                            <property name="label" translatable="yes">OS:</property>
                           </widget>
                           <packing>
-                            <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
                             <property name="top_attach">2</property>
                             <property name="bottom_attach">3</property>
-                            <property name="y_options"></property>
+                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                       </widget>
@@ -549,7 +592,7 @@
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="position">3</property>
+            <property name="position">4</property>
           </packing>
         </child>
       </widget>
diff --git a/libempathy-gtk/empathy-contact-widget.h b/libempathy-gtk/empathy-contact-widget.h
index 4ba75e1..b81aec2 100644
--- a/libempathy-gtk/empathy-contact-widget.h
+++ b/libempathy-gtk/empathy-contact-widget.h
@@ -38,6 +38,7 @@ typedef enum
   EMPATHY_CONTACT_WIDGET_EDIT_ID      = 1 << 3,
   EMPATHY_CONTACT_WIDGET_EDIT_GROUPS  = 1 << 4,
   EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP  = 1 << 5,
+  EMPATHY_CONTACT_WIDGET_SHOW_LOCATION  = 1 << 6,
 } EmpathyContactWidgetFlags;
 
 GtkWidget * empathy_contact_widget_new (EmpathyContact *contact,
diff --git a/src/Makefile.am b/src/Makefile.am
index e2c9e24..439e11b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,13 +1,17 @@
 AM_CPPFLAGS =						\
 	-I$(top_srcdir)                          	\
 	$(EMPATHY_CFLAGS)				\
+	$(LIBCHAMPLAIN_CFLAGS)				\
+	$(GEOCLUE_CFLAGS)				\
 	$(WARN_CFLAGS)
 
 LDADD =								\
 	$(top_builddir)/libempathy-gtk/libempathy-gtk.la	\
 	$(top_builddir)/libempathy/libempathy.la		\
 	$(top_builddir)/extensions/libemp-extensions.la		\
-	$(EMPATHY_LIBS)
+	$(EMPATHY_LIBS)						\
+	$(LIBCHAMPLAIN_LIBS)					\
+	$(GEOCLUE_LIBS)
 
 bin_PROGRAMS =			\
 	empathy			\
@@ -53,6 +57,18 @@ glade_DATA = 					\
 	empathy-preferences.glade		\
 	empathy-status-icon.glade
 
+if HAVE_LIBCHAMPLAIN
+icondir = $(datadir)/empathy
+icon_DATA = 					\
+	empathy-map-view-marker.svg
+
+empathy_SOURCES += 				\
+	empathy-map-view.c empathy-map-view.h
+
+glade_DATA += 					\
+	empathy-map-view.glade
+endif 
+
 dist_man_MANS =			\
 	empathy.1
 
@@ -76,7 +92,8 @@ dist_man_MANS =			\
 
 EXTRA_DIST =			\
 	$(autostart_DATA)	\
-	$(glade_DATA)
+	$(glade_DATA)		\
+	$(icon_DATA)
 
 CLEANFILES = $(BUILT_SOURCES)
 
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index cafa5f0..91b74b2 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -54,6 +54,7 @@
 
 #include "empathy-accounts-dialog.h"
 #include "empathy-main-window.h"
+#include "empathy-map-view.h"
 #include "ephy-spinner.h"
 #include "empathy-preferences.h"
 #include "empathy-about-dialog.h"
@@ -179,6 +180,10 @@ static void     main_window_notify_compact_contact_list_cb     (EmpathyConf
 static void     main_window_notify_sort_criterium_cb           (EmpathyConf              *conf,
 								const gchar              *key,
 								EmpathyMainWindow        *window);
+#if HAVE_LIBCHAMPLAIN
+static void     main_window_chat_show_map_cb                   (GtkCheckMenuItem         *item,
+								EmpathyMainWindow        *window);
+#endif 
 
 static void
 main_window_flash_stop (EmpathyMainWindow *window)
@@ -493,6 +498,7 @@ empathy_main_window_show (void)
 	GtkWidget                *sw;
 	GtkWidget                *show_offline_widget;
 	GtkWidget                *ebox;
+	GtkWidget                *show_map_widget;
 	GtkToolItem              *item;
 	gboolean                  show_offline;
 	gboolean                  show_avatars;
@@ -517,6 +523,7 @@ empathy_main_window_show (void)
 				       "main_vbox", &window->main_vbox,
 				       "errors_vbox", &window->errors_vbox,
 				       "chat_show_offline", &show_offline_widget,
+				       "chat_show_map", &show_map_widget,
 				       "room", &window->room,
 				       "room_sep", &window->room_sep,
 				       "room_join_favorites", &window->room_join_favorites,
@@ -539,6 +546,9 @@ empathy_main_window_show (void)
 			      "room_manage_favorites", "activate", main_window_room_manage_favorites_cb,
 			      "chat_add_contact", "activate", main_window_chat_add_contact_cb,
 			      "chat_show_offline", "toggled", main_window_chat_show_offline_cb,
+#if HAVE_LIBCHAMPLAIN
+			      "chat_show_map", "activate", main_window_chat_show_map_cb,
+#endif
 			      "edit", "button-press-event", main_window_edit_button_press_event_cb,
 			      "edit_accounts", "activate", main_window_edit_accounts_cb,
 			      "edit_personal_information", "activate", main_window_edit_personal_information_cb,
@@ -569,6 +579,9 @@ empathy_main_window_show (void)
 	gtk_widget_hide (window->edit_context);
 	gtk_widget_hide (window->edit_context_separator);
 
+#if !HAVE_LIBCHAMPLAIN
+	gtk_widget_hide (show_map_widget);
+#endif 
 	/* Set up presence chooser */
 	window->presence_chooser = empathy_presence_chooser_new ();
 	gtk_widget_show (window->presence_chooser);
@@ -936,6 +949,15 @@ main_window_chat_show_offline_cb (GtkCheckMenuItem  *item,
 	//empathy_sound_set_enabled (TRUE);
 }
 
+#if HAVE_LIBCHAMPLAIN
+static void
+main_window_chat_show_map_cb (GtkCheckMenuItem  *item,
+			      EmpathyMainWindow *window)
+{
+	empathy_map_view_show (window->list_store);
+}
+#endif 
+
 static gboolean
 main_window_edit_button_press_event_cb (GtkWidget         *widget,
 					GdkEventButton    *event,
diff --git a/src/empathy-main-window.glade b/src/empathy-main-window.glade
index 737105d..0097767 100644
--- a/src/empathy-main-window.glade
+++ b/src/empathy-main-window.glade
@@ -51,6 +51,14 @@
                       </widget>
                     </child>
                     <child>
+                      <widget class="GtkImageMenuItem" id="chat_show_map">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Show Contacts _Map</property>
+                        <property name="use_underline">True</property>
+                        <accelerator key="M" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                      </widget>
+                    </child>
+                    <child>
                       <widget class="GtkSeparatorMenuItem" id="separator5">
                         <property name="visible">True</property>
                       </widget>
diff --git a/src/empathy-map-view-marker.svg b/src/empathy-map-view-marker.svg
new file mode 100644
index 0000000..8a22432
--- /dev/null
+++ b/src/empathy-map-view-marker.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="75"
+   height="50"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   version="1.0"
+   sodipodi:docname="empathy-map-view-marker.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3153">
+      <stop
+         style="stop-color:#6c6c6c;stop-opacity:1"
+         offset="0"
+         id="stop3155" />
+      <stop
+         style="stop-color:#bdbdbd;stop-opacity:1"
+         offset="1"
+         id="stop3157" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <filter
+       inkscape:collect="always"
+       id="filter3208"
+       x="-0.05052691"
+       width="1.1010538"
+       y="-0.14783885"
+       height="1.2956777">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="8.6187787"
+         id="feGaussianBlur3210" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3153"
+       id="linearGradient3159"
+       x1="35.099094"
+       y1="41.50539"
+       x2="3.8490961"
+       y2="2.2553883"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4142136"
+     inkscape:cx="23.050276"
+     inkscape:cy="0.071432203"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="827"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:url(#linearGradient3159);fill-opacity:1;stroke:#6c6c6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.09476,1.124408 C 2.473741,1.124408 1.171355,2.426796 1.171355,4.047814 L 1.171355,37.702134 C 1.171355,39.323154 2.473742,40.630163 4.09476,40.630158 L 11.502568,40.630158 L 20.893471,48.802311 C 21.451193,49.360033 22.195233,49.3359 22.697572,48.833561 L 31.744726,40.630158 L 39.147916,40.630158 C 40.768934,40.630158 42.075943,39.323152 42.075939,37.702134 L 42.075939,4.047814 C 42.075939,2.426795 40.768933,1.124408 39.147916,1.124408 L 4.09476,1.124408 z"
+       id="rect2383"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       style="fill:#787878;fill-opacity:0.20276495;filter:url(#filter3208)"
+       d="M 222.78161,195.28963 C 211.81297,194.95482 197.91239,198.42398 191.57965,203.07667 L 65.13994,295.97236 C 58.8072,300.62505 62.51379,304.64546 73.48244,304.98025 L 123.60744,306.51027 L 148.31924,333.09631 C 150.6655,335.62052 159.59415,335.89306 168.35049,333.70774 L 260.57619,310.69109 L 310.66994,312.22015 C 321.63858,312.55496 335.58848,309.07351 341.92119,304.42082 L 468.3609,211.52512 C 474.69365,206.87243 470.93774,202.86434 459.96911,202.52953 L 222.78161,195.28963 z"
+       id="path3186"
+       transform="matrix(0.1477867,0,0,0.1477867,-0.980789,0.501454)" />
+  </g>
+</svg>
diff --git a/src/empathy-map-view.c b/src/empathy-map-view.c
new file mode 100644
index 0000000..e4e1943
--- /dev/null
+++ b/src/empathy-map-view.c
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2008 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc@pierlux.com>
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include <glib/gi18n.h>
+
+#include <champlain/champlain.h>
+#include <champlain-gtk/champlain-gtk.h>
+#include <clutter-gtk/gtk-clutter-embed.h>
+#include <geoclue/geoclue-geocode.h>
+#include <telepathy-glib/util.h>
+
+#include <libempathy/empathy-contact.h>
+#include <libempathy/empathy-utils.h>
+#include <libempathy/empathy-chatroom-manager.h>
+#include <libempathy/empathy-chatroom.h>
+#include <libempathy/empathy-contact-list.h>
+#include <libempathy/empathy-contact-manager.h>
+#include <libempathy/empathy-contact-factory.h>
+#include <libempathy/empathy-location.h>
+#include <libempathy/empathy-status-presets.h>
+
+#include <libempathy-gtk/empathy-contact-dialogs.h>
+#include <libempathy-gtk/empathy-contact-list-store.h>
+#include <libempathy-gtk/empathy-contact-list-view.h>
+#include <libempathy-gtk/empathy-presence-chooser.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
+#include <libempathy-gtk/empathy-geometry.h>
+#include <libempathy-gtk/empathy-conf.h>
+#include <libempathy-gtk/empathy-log-window.h>
+#include <libempathy-gtk/empathy-new-message-dialog.h>
+#include <libempathy-gtk/empathy-gtk-enum-types.h>
+
+#include "empathy-accounts-dialog.h"
+#include "empathy-map-view.h"
+#include "ephy-spinner.h"
+#include "empathy-preferences.h"
+#include "empathy-about-dialog.h"
+#include "empathy-new-chatroom-dialog.h"
+#include "empathy-chatrooms-window.h"
+#include "empathy-event-manager.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_LOCATION
+#include <libempathy/empathy-debug.h>
+
+typedef struct {
+  EmpathyContactListStore *list_store;
+
+  GtkWidget *window;
+  GtkWidget *zoom_in;
+  GtkWidget *zoom_out;
+  ChamplainView *map_view;
+  ChamplainLayer *layer;
+
+} EmpathyMapView;
+
+static void map_view_destroy_cb (GtkWidget *widget,
+    EmpathyMapView *window);
+static gboolean map_view_contacts_foreach (GtkTreeModel *model,
+    GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
+static gboolean map_view_contacts_foreach_disconnect (GtkTreeModel *model,
+    GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
+static void map_view_zoom_in_cb (GtkWidget *widget, EmpathyMapView *window);
+static void map_view_zoom_out_cb (GtkWidget *widget, EmpathyMapView *window);
+static void map_view_contact_location_notify (GObject *gobject,
+    GParamSpec *arg1, gpointer user_data);
+static gchar * get_dup_string (GHashTable *location, gchar *key);
+
+// FIXME: Make it so that only one window can be shown
+GtkWidget *
+empathy_map_view_show (EmpathyContactListStore *list_store)
+{
+  static EmpathyMapView *window = NULL;
+  GladeXML *glade;
+  GtkWidget *sw;
+  GtkWidget *embed;
+  gchar *filename;
+  GtkTreeModel *model;
+
+  /*
+  if (window)
+    {
+      empathy_window_present (GTK_WINDOW (window->window), TRUE);
+      return window->window;
+    }
+  */
+
+  window = g_new0 (EmpathyMapView, 1);
+
+  /* Set up interface */
+  filename = empathy_file_lookup ("empathy-map-view.glade", "src");
+  glade = empathy_glade_get_file (filename, "map_view", NULL, "map_view",
+      &window->window, "zoom_in", &window->zoom_in, "zoom_out",
+      &window->zoom_out, "map_scrolledwindow", &sw, NULL);
+  g_free (filename);
+
+  empathy_glade_connect (glade, window, "map_view", "destroy",
+      map_view_destroy_cb, "zoom_in", "clicked", map_view_zoom_in_cb,
+      "zoom_out", "clicked", map_view_zoom_out_cb, NULL);
+
+  g_object_unref (glade);
+
+  window->list_store = list_store;
+
+  /* Set up map view */
+  window->map_view = CHAMPLAIN_VIEW (champlain_view_new (
+      CHAMPLAIN_VIEW_MODE_KINETIC));
+  g_object_set (G_OBJECT (window->map_view), "zoom-level", 1, NULL);
+  champlain_view_center_on (window->map_view, 36, 0);
+
+  embed = champlain_view_embed_new (window->map_view);
+  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
+     GTK_WIDGET (embed));
+  gtk_widget_show_all (embed);
+
+  window->layer = champlain_layer_new ();
+  champlain_view_add_layer (CHAMPLAIN_VIEW (window->map_view), window->layer);
+
+  /* Set up contact list. */
+  model = GTK_TREE_MODEL (window->list_store);
+  gtk_tree_model_foreach (model, map_view_contacts_foreach, window);
+
+  empathy_window_present (GTK_WINDOW (window->window), TRUE);
+  return window->window;
+}
+
+static gboolean
+map_view_contacts_foreach_disconnect (GtkTreeModel *model,
+                                      GtkTreePath *path,
+                                      GtkTreeIter *iter,
+                                      gpointer user_data)
+{
+  EmpathyContact *contact;
+  guint handle_id;
+
+  gtk_tree_model_get (model, iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT,
+     &contact, -1);
+  if (!contact)
+    return FALSE;
+
+  handle_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (contact), "map-view-handle"));
+
+  g_signal_handler_disconnect (contact, handle_id);
+  return FALSE;
+}
+
+static void
+map_view_destroy_cb (GtkWidget *widget,
+                     EmpathyMapView *window)
+{
+  GtkTreeModel *model;
+
+  /* Set up contact list. */
+  model = GTK_TREE_MODEL (window->list_store);
+  gtk_tree_model_foreach (model, map_view_contacts_foreach_disconnect, window);
+  g_free (window);
+}
+
+#define GEOCODE_SERVICE "org.freedesktop.Geoclue.Providers.Yahoo"
+#define GEOCODE_PATH "/org/freedesktop/Geoclue/Providers/Yahoo"
+
+static void
+map_view_geocode_cb (GeoclueGeocode *geocode,
+                     GeocluePositionFields fields,
+                     double latitude,
+                     double longitude,
+                     double altitude,
+                     GeoclueAccuracy *accuracy,
+                     GError *error,
+                     gpointer userdata)
+{
+  GValue *new_value;
+  gboolean found = FALSE;
+  GHashTable *location = empathy_contact_get_location (EMPATHY_CONTACT (userdata));
+  g_hash_table_ref (location);
+
+  if (error)
+  {
+      return;
+  }
+
+  if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)
+    {
+      new_value = tp_g_value_slice_new (G_TYPE_DOUBLE);
+      g_value_set_double (new_value, longitude);
+      g_hash_table_replace (location, EMPATHY_LOCATION_LON, new_value);
+      DEBUG ("\t - Longitude: %f", longitude);
+    }
+  if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE)
+    {
+      new_value = tp_g_value_slice_new (G_TYPE_DOUBLE);
+      g_value_set_double (new_value, latitude);
+      g_hash_table_replace (location, EMPATHY_LOCATION_LAT, new_value);
+      DEBUG ("\t - Latitude: %f", latitude);
+      found = TRUE;
+    }
+  if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE)
+    {
+      new_value = tp_g_value_slice_new (G_TYPE_DOUBLE);
+      g_value_set_double (new_value, altitude);
+      g_hash_table_replace (location, EMPATHY_LOCATION_ALT, new_value);
+      DEBUG ("\t - Altitude: %f", altitude);
+    }
+
+  //Don't change the accuracy as we used an address to get this position
+  if (found)
+    empathy_contact_set_location (EMPATHY_CONTACT (userdata), location);
+  g_hash_table_unref (location);
+}
+
+
+static gchar *
+get_dup_string (GHashTable *location, gchar *key)
+{
+  GValue *value;
+
+  value = g_hash_table_lookup (location, key);
+  if (value)
+  {
+      return g_value_dup_string (value);
+  }
+  return NULL;
+
+}
+
+static void
+map_view_marker_update (ChamplainMarker *marker,
+                        EmpathyContact *contact)
+{
+  gdouble lon, lat;
+  GValue *value;
+  GHashTable *location = empathy_contact_get_location (contact);
+
+  if (g_hash_table_size (location) == 0)
+  {
+    clutter_actor_hide (CLUTTER_ACTOR (marker));
+    return;
+  }
+
+  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+  if (value == NULL)
+    {
+      GeoclueGeocode * geocode = geoclue_geocode_new (GEOCODE_SERVICE,
+          GEOCODE_PATH);
+      gchar *str;
+
+      GHashTable *address = geoclue_address_details_new();
+      str = get_dup_string (location, EMPATHY_LOCATION_COUNTRY);
+      if (str != NULL)
+        g_hash_table_insert (address, g_strdup ("country"), str);
+
+      str = get_dup_string (location, EMPATHY_LOCATION_POSTAL_CODE);
+      if (str != NULL)
+        g_hash_table_insert (address, g_strdup ("postalcode"), str);
+
+      str = get_dup_string (location, EMPATHY_LOCATION_LOCALITY);
+      if (str != NULL)
+        g_hash_table_insert (address, g_strdup ("locality"), str);
+
+      str = get_dup_string (location, EMPATHY_LOCATION_STREET);
+      if (str != NULL)
+        g_hash_table_insert (address, g_strdup ("street"), str);
+
+      geoclue_geocode_address_to_position_async (geocode, address,
+          map_view_geocode_cb, contact);
+      clutter_actor_hide (CLUTTER_ACTOR (marker));
+      return;
+    }
+  lat = g_value_get_double (value);
+
+  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LON);
+  if (value == NULL)
+    return;
+  lon = g_value_get_double (value);
+
+  clutter_actor_show (CLUTTER_ACTOR (marker));
+  champlain_marker_set_position (marker, lat, lon);
+}
+
+
+static void
+map_view_contact_location_notify (GObject *gobject,
+                                  GParamSpec *arg1,
+                                  gpointer user_data)
+{
+  ChamplainMarker *marker = CHAMPLAIN_MARKER (user_data);
+  EmpathyContact *contact = EMPATHY_CONTACT (gobject);
+  map_view_marker_update (marker, contact);
+}
+
+
+static gboolean
+map_view_contacts_foreach (GtkTreeModel *model,
+                           GtkTreePath *path,
+                           GtkTreeIter *iter,
+                           gpointer user_data)
+{
+  EmpathyMapView *window = (EmpathyMapView*) user_data;
+  EmpathyContact *contact;
+  ClutterActor *marker;
+  ClutterActor *texture;
+  ClutterActor *background;
+  GdkPixbuf *avatar;
+  gchar *filename;
+  guint handle_id;
+
+  gtk_tree_model_get (model, iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT,
+     &contact, -1);
+  if (!contact)
+    return FALSE;
+
+  marker = champlain_marker_new ();
+
+  handle_id = g_signal_connect (contact, "notify::location",
+      G_CALLBACK (map_view_contact_location_notify), marker);
+  g_object_set_data (G_OBJECT (contact), "map-view-handle",
+      GINT_TO_POINTER (handle_id));
+
+
+  filename = empathy_file_lookup ("empathy-map-view-marker.svg", "src");
+  background = clutter_texture_new_from_file (filename, NULL);
+  clutter_container_add (CLUTTER_CONTAINER (marker), background, NULL);
+
+  avatar = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32);
+  if (avatar)
+    {
+      texture = clutter_texture_new ();
+      gtk_clutter_texture_set_from_pixbuf (CLUTTER_TEXTURE (texture), avatar);
+      clutter_actor_set_position (CLUTTER_ACTOR (texture), 5, 5);
+      clutter_container_add (CLUTTER_CONTAINER (marker), texture, NULL);
+    }
+
+  clutter_actor_set_anchor_point (marker, 25, 50);
+  map_view_marker_update (CHAMPLAIN_MARKER (marker), contact);
+
+  clutter_container_add (CLUTTER_CONTAINER (window->layer), marker, NULL);
+
+  g_object_unref (contact);
+  return FALSE;
+}
+
+
+static void
+map_view_zoom_in_cb (GtkWidget *widget,
+                     EmpathyMapView *window)
+{
+  champlain_view_zoom_in (window->map_view);
+}
+
+
+static void
+map_view_zoom_out_cb (GtkWidget *widget,
+                      EmpathyMapView *window)
+{
+  champlain_view_zoom_out (window->map_view);
+}
diff --git a/src/empathy-map-view.glade b/src/empathy-map-view.glade
new file mode 100644
index 0000000..572d1ac
--- /dev/null
+++ b/src/empathy-map-view.glade
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--*- mode: xml -*-->
+<glade-interface>
+  <widget class="GtkWindow" id="map_view">
+    <property name="title" translatable="yes">Contact Map View</property>
+    <property name="role">map_view</property>
+    <property name="window_position">GTK_WIN_POS_CENTER</property>
+    <property name="default_width">512</property>
+    <property name="default_height">384</property>
+    <child>
+      <widget class="GtkVBox" id="main_vbox">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkToolbar" id="toolbar">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkToolButton" id="zoom_in">
+                <property name="visible">True</property>
+                <property name="stock_id">gtk-zoom-in</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="zoom_out">
+                <property name="visible">True</property>
+                <property name="stock_id">gtk-zoom-out</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkScrolledWindow" id="map_scrolledwindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="has_focus">True</property>
+            <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+            <property name="shadow_type">GTK_SHADOW_IN</property>
+            <child>
+              <placeholder/>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/src/empathy-map-view.h b/src/empathy-map-view.h
new file mode 100644
index 0000000..bad93da
--- /dev/null
+++ b/src/empathy-map-view.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc@pierlux.com>
+ */
+
+#ifndef __EMPATHY_MAP_VIEW_H__
+#define __EMPATHY_MAP_VIEW_H__
+
+#include <gtk/gtkwidget.h>
+
+G_BEGIN_DECLS
+
+GtkWidget *empathy_map_view_show (EmpathyContactListStore *list_store);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_MAP_VIEW_H__ */
diff --git a/src/empathy.c b/src/empathy.c
index 0c0b18c..de40a36 100644
--- a/src/empathy.c
+++ b/src/empathy.c
@@ -31,6 +31,10 @@
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 
+#if HAVE_LIBCHAMPLAIN
+#include <clutter-gtk/gtk-clutter-embed.h>
+#endif
+
 #include <libebook/e-book.h>
 
 #include <telepathy-glib/util.h>
@@ -425,6 +429,11 @@ main (int argc, char *argv[])
 		return EXIT_FAILURE;
 	}
 	empathy_gtk_init ();
+
+#if HAVE_LIBCHAMPLAIN
+	gtk_clutter_init(&argc, &argv);
+#endif
+
 	g_set_application_name (PACKAGE_NAME);
 	gtk_window_set_default_icon_name ("empathy");
 	textdomain (GETTEXT_PACKAGE);
