diff --git addressbook/gui/widgets/e-addressbook-view.c addressbook/gui/widgets/e-addressbook-view.c
index 70c3c23..ac2dc97 100644
--- addressbook/gui/widgets/e-addressbook-view.c
+++ addressbook/gui/widgets/e-addressbook-view.c
@@ -984,12 +984,14 @@ e_addressbook_view_get_selected (EAddressbookView *view)
 
 	list = NULL;
 	selection = e_addressbook_view_get_selection_model (view);
-	e_selection_model_foreach (selection, add_to_list, &list);
+	if (selection != NULL) {
+		e_selection_model_foreach (selection, add_to_list, &list);
 
-	for (iter = list; iter != NULL; iter = iter->next)
-		iter->data = e_addressbook_model_get_contact (
-			view->priv->model, GPOINTER_TO_INT (iter->data));
-	list = g_list_reverse (list);
+		for (iter = list; iter != NULL; iter = iter->next)
+			iter->data = e_addressbook_model_get_contact (
+				view->priv->model, GPOINTER_TO_INT (iter->data));
+		list = g_list_reverse (list);
+	}
 
 	return list;
 }
diff --git calendar/gui/dialogs/Makefile.am calendar/gui/dialogs/Makefile.am
index 0bd89de..89cdbeb 100644
--- calendar/gui/dialogs/Makefile.am
+++ calendar/gui/dialogs/Makefile.am
@@ -25,6 +25,7 @@ ecalendarinclude_HEADERS =	\
 	comp-editor.h		\
 	alarm-dialog.h		\
 	alarm-list-dialog.h	\
+  address-dialog.h  \
 	cal-prefs-dialog.h	\
 	calendar-setup.h	\
 	cancel-comp.h		\
@@ -60,6 +61,8 @@ libcal_dialogs_la_SOURCES =	\
 	alarm-dialog.h		\
 	alarm-list-dialog.c	\
 	alarm-list-dialog.h	\
+  address-dialog.c    \
+  address-dialog.h    \
 	cal-prefs-dialog.c	\
 	cal-prefs-dialog.h	\
 	calendar-setup.c	\
@@ -114,6 +117,7 @@ libcal_dialogs_la_SOURCES =	\
 ui_DATA =				\
 	alarm-dialog.ui		\
 	alarm-list-dialog.ui		\
+  address-dialog.ui \
 	cal-prefs-dialog.ui		\
 	e-delegate-dialog.ui		\
 	event-page.ui		\
diff --git calendar/gui/dialogs/address-dialog.c calendar/gui/dialogs/address-dialog.c
new file mode 100644
index 0000000..a6d603d
--- /dev/null
+++ calendar/gui/dialogs/address-dialog.c
@@ -0,0 +1,153 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ *    Cedric Bosdonnat <cbosdonnat@novell.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#include <gtk/gtk.h>
+#include "e-util/e-util.h"
+#include "address-dialog.h"
+
+typedef struct {
+  GtkBuilder *builder;
+
+  EAddressWestern *address;
+
+  GtkWidget *toplevel;
+
+  GtkWidget *textview_address;
+  GtkWidget *entry_city;
+  GtkWidget *entry_zip;
+  GtkWidget *entry_state;
+  GtkWidget *entry_country;
+  GtkWidget *entry_pobox;
+
+} Dialog;
+
+static void
+address_to_dialog (Dialog *dialog)
+{
+  GtkTextBuffer *buffer;
+
+  /* Check the members of the address */
+  if (dialog->address->street == NULL) dialog->address->street = (gchar*)"";
+  if (dialog->address->locality == NULL) dialog->address->locality = (gchar*)"";
+  if (dialog->address->postal_code == NULL) dialog->address->postal_code = (gchar*)"";
+  if (dialog->address->region == NULL) dialog->address->region = (gchar*)"";
+  if (dialog->address->country == NULL) dialog->address->country = (gchar*)"";
+  if (dialog->address->po_box == NULL) dialog->address->po_box = (gchar*)"";
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->textview_address));
+  gtk_text_buffer_set_text (buffer, dialog->address->street, -1);
+  gtk_entry_set_text (GTK_ENTRY (dialog->entry_city), dialog->address->locality);
+  gtk_entry_set_text (GTK_ENTRY (dialog->entry_zip), dialog->address->postal_code);
+  gtk_entry_set_text (GTK_ENTRY (dialog->entry_state), dialog->address->region);
+  gtk_entry_set_text (GTK_ENTRY (dialog->entry_country), dialog->address->country);
+  gtk_entry_set_text (GTK_ENTRY (dialog->entry_pobox), dialog->address->po_box);
+}
+
+static gchar *
+get_cleaned_str (gchar *str)
+{
+  g_strstrip (str);
+  if (g_strcmp0 (str, "") == 0)
+    return NULL;
+  else
+    return str;
+}
+
+static void
+dialog_to_address(Dialog *dialog)
+{
+  GtkTextBuffer *buffer;
+  GtkTextIter start, end;
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dialog->textview_address));
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+  dialog->address->street = get_cleaned_str (gtk_text_buffer_get_text (buffer, &start, &end, FALSE));
+  dialog->address->locality = get_cleaned_str (g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->entry_city))));
+  dialog->address->postal_code = get_cleaned_str (g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->entry_zip))));
+  dialog->address->region = get_cleaned_str (g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->entry_state))));
+  dialog->address->country = get_cleaned_str (g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->entry_country))));
+  dialog->address->po_box = get_cleaned_str (g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->entry_pobox))));
+}
+
+/* Gets the widgets from the XML file and returns TRUE if they are all available. */
+static gboolean
+get_widgets (Dialog *dialog)
+{
+	dialog->toplevel = e_builder_get_widget (dialog->builder, "address-dialog");
+  if (!dialog->toplevel)
+    return FALSE;
+
+  dialog->textview_address = e_builder_get_widget (dialog->builder, "textview-address");
+  dialog->entry_city = e_builder_get_widget (dialog->builder, "entry-city");
+  dialog->entry_zip = e_builder_get_widget (dialog->builder, "entry-zip");
+  dialog->entry_state = e_builder_get_widget (dialog->builder, "entry-state");
+  dialog->entry_country = e_builder_get_widget (dialog->builder, "entry-country");
+  dialog->entry_pobox = e_builder_get_widget (dialog->builder, "entry-pobox");
+
+  return (dialog->textview_address
+    && dialog->entry_city
+    && dialog->entry_zip
+    && dialog->entry_state
+    && dialog->entry_country
+    && dialog->entry_pobox);
+}
+
+gboolean
+address_dialog_run (GtkWidget *parent, EAddressWestern *address)
+{
+  Dialog dialog;
+  gint response_id;
+
+  if (address != NULL)
+    dialog.address = address;
+  else
+  {
+    EAddressWestern addr;
+    dialog.address = &addr;
+  }
+
+  dialog.builder = gtk_builder_new ();
+  e_load_ui_builder_definition (dialog.builder, "address-dialog.ui");
+
+  if (!get_widgets (&dialog)) {
+    g_object_unref (dialog.builder);
+    return FALSE;
+  }
+
+  address_to_dialog(&dialog);
+	
+  gtk_window_set_icon_name (
+		GTK_WINDOW (dialog.toplevel), "x-office-calendar");
+
+	gtk_window_set_transient_for (GTK_WINDOW (dialog.toplevel),
+				      GTK_WINDOW (parent));
+
+	response_id = gtk_dialog_run (GTK_DIALOG (dialog.toplevel));
+
+  if (response_id == GTK_RESPONSE_OK)
+    dialog_to_address(&dialog);
+	
+  gtk_widget_destroy (dialog.toplevel);
+	g_object_unref (dialog.builder);
+
+	return response_id == GTK_RESPONSE_OK ? TRUE : FALSE;
+}
diff --git calendar/gui/dialogs/address-dialog.h calendar/gui/dialogs/address-dialog.h
new file mode 100644
index 0000000..da64a00
--- /dev/null
+++ calendar/gui/dialogs/address-dialog.h
@@ -0,0 +1,37 @@
+/*
+ *
+ * Evolution calendar - Address input dialog for the calendar component
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ *      Cedric Bosdonnat <cbosdonnat@novell.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifndef ADDRESS_DIALOG_H
+#define ADDRESS_DIALOG_H
+
+#include <libebook/e-address-western.h>
+
+G_BEGIN_DECLS
+
+gboolean address_dialog_run (GtkWidget *parent, EAddressWestern *address);
+
+G_END_DECLS
+
+#endif
diff --git calendar/gui/dialogs/address-dialog.ui calendar/gui/dialogs/address-dialog.ui
new file mode 100644
index 0000000..a8b9d18
--- /dev/null
+++ calendar/gui/dialogs/address-dialog.ui
@@ -0,0 +1,322 @@
+<?xml version="1.0"?>
+<!--*- mode: xml -*-->
+<interface>
+  <object class="GtkDialog" id="address-dialog">
+    <property name="border_width">6</property>
+    <property name="visible">True</property>
+    <property name="title" translatable="yes">Location details</property>
+    <property name="type">GTK_WINDOW_TOPLEVEL</property>
+    <property name="window_position">GTK_WIN_POS_NONE</property>
+    <property name="modal">True</property>
+    <property name="resizable">True</property>
+    <property name="destroy_with_parent">False</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_DIALOG</property>
+    <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+    <property name="focus_on_map">True</property>
+    <property name="urgency_hint">False</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="homogeneous">False</property>
+        <property name="spacing">6</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <object class="GtkButton" id="cancelbutton">
+                <property name="visible">True</property>
+                <property name="can_default">True</property>
+                <property name="can_focus">True</property>
+                <property name="label">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="relief">GTK_RELIEF_NORMAL</property>
+                <property name="focus_on_click">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkButton" id="okbutton">
+                <property name="visible">True</property>
+                <property name="can_default">True</property>
+                <property name="can_focus">True</property>
+                <property name="label">gtk-ok</property>
+                <property name="use_stock">True</property>
+                <property name="relief">GTK_RELIEF_NORMAL</property>
+                <property name="focus_on_click">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">0</property>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox28">
+            <property name="border_width">12</property>
+            <property name="visible">True</property>
+            <property name="homogeneous">False</property>
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Location</property>
+                <property name="use_underline">False</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>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="padding">0</property>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox59">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkTable" id="table-address">
+                    <property name="visible">True</property>
+                    <property name="n_rows">4</property>
+                    <property name="n_columns">4</property>
+                    <property name="column_spacing">6</property>
+                    <property name="row_spacing">6</property>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow-address">
+                        <property name="width_request">193</property>
+                        <property name="height_request">69</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hscrollbar_policy">automatic</property>
+                        <property name="vscrollbar_policy">automatic</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <object class="GtkTextView" id="textview-address">
+                            <property name="height_request">25</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="accepts_tab">False</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options">GTK_FILL</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="entry-city">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label-city">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">_City:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">entry-city</property>
+                        <property name="single_line_mode">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="entry-zip">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label-zip">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">_Zip/Postal Code:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">entry-zip</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_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>
+                      <object class="GtkEntry" id="entry-state">
+                        <property name="width_request">256</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label-state">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">_State/Province:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">entry-state</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</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>
+                      <object class="GtkEntry" id="entry-country">
+                        <property name="width_request">163</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">3</property>
+                        <property name="bottom_attach">4</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label-country">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="ypad">4</property>
+                        <property name="label" translatable="yes">_Country:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">entry-country</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <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>
+                      <object class="GtkEntry" id="entry-pobox">
+                        <property name="width_request">100</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">3</property>
+                        <property name="bottom_attach">4</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label-pobox">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">_PO Box:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">entry-pobox</property>
+                      </object>
+                      <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>
+                      <object class="GtkLabel" id="label-address">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">_Address:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">textview-address</property>
+                      </object>
+                      <packing>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="padding">0</property>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">0</property>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">cancelbutton</action-widget>
+      <action-widget response="-5">okbutton</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git calendar/gui/dialogs/event-page.c calendar/gui/dialogs/event-page.c
index 615ebf1..6c6c92e 100644
--- calendar/gui/dialogs/event-page.c
+++ calendar/gui/dialogs/event-page.c
@@ -54,6 +54,7 @@
 #include "../e-meeting-list-view.h"
 #include "comp-editor.h"
 #include "comp-editor-util.h"
+#include "address-dialog.h"
 #include "../e-alarm-list.h"
 #include "alarm-list-dialog.h"
 #include "event-page.h"
@@ -109,6 +110,8 @@ struct _EventPagePrivate {
 	GtkWidget *location;
 	GtkWidget *location_label;
 
+  GtkWidget *location_details;
+
 	EAccountList *accounts;
 	GList *address_strings;
 	EMeetingAttendee *ia;
@@ -1632,8 +1635,6 @@ event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
 	update_time (EVENT_PAGE (page), dates->start, dates->end);
 }
 
-
-
 static void
 time_sel_changed (GtkComboBox *combo, EventPage *epage)
 {
@@ -1735,6 +1736,58 @@ hour_minute_changed (EventPage *epage)
 }
 
 static void
+location_details_clicked_cb (GtkButton *btn, EventPage *epage)
+{
+	EventPagePrivate *priv;
+  EAddressWestern address;
+  gchar *address_string, *newaddr, *copy;
+  gint str_idx;
+
+	priv = epage->priv;
+
+  address_string = e_dialog_editable_get (priv->location);
+
+  /* Replace the '-' by '\n' for the parse method */
+  str_idx = 0;
+  while (address_string[str_idx] != '\0') {
+    if (address_string[str_idx] == '-') 
+      address_string[str_idx] = '\n';
+    str_idx++;
+  }
+
+  address = *e_address_western_parse (address_string);
+
+  if (address_dialog_run (priv->main, &address)) {
+    newaddr = g_strdup (address.street);
+    if (address.po_box != NULL) {
+      copy = g_strdup (newaddr);
+      newaddr = g_strconcat (copy, "-", address.po_box, NULL);
+      g_free (copy);
+    }
+   
+    if (address.locality != NULL
+        || address.region != NULL
+        || address.postal_code != NULL) {
+      copy = g_strdup (newaddr);
+      newaddr = g_strconcat (copy, "-", address.locality,
+                    ", ", address.region,
+                    " ", address.postal_code,
+                    NULL);
+      g_free (copy);
+    }
+
+    if (address.country != NULL) {
+      copy = g_strdup (newaddr);
+      newaddr = g_strconcat (copy, "-", address.country, NULL );
+      g_free (copy);
+    }
+
+    e_dialog_editable_set (priv->location, newaddr);
+    g_free (newaddr);
+  }
+}
+
+static void
 edit_clicked_cb (GtkButton *btn, EventPage *epage)
 {
 	EventPagePrivate *priv;
@@ -2248,6 +2301,8 @@ get_widgets (EventPage *epage)
 	priv->location = GW ("location");
 	priv->location_label = GW ("location-label");
 
+  priv->location_details = GW ("location-details");
+
 	priv->info_hbox = GW ("generic-info");
 	priv->info_icon = GW ("generic-info-image");
 	priv->info_string = GW ("generic-info-msgs");
@@ -2902,6 +2957,9 @@ init_widgets (EventPage *epage)
 		priv->alarm_list_store, "row-changed",
 		G_CALLBACK (comp_editor_page_changed), epage);
 
+  /* Location details */
+	g_signal_connect (priv->location_details, "clicked", G_CALLBACK (location_details_clicked_cb), epage);
+
 	/* Timezone changed */
 	g_signal_connect((priv->start_timezone), "changed",
 			    G_CALLBACK (start_timezone_changed_cb), epage);
diff --git calendar/gui/dialogs/event-page.ui calendar/gui/dialogs/event-page.ui
index 061c0b1..4c7e356 100644
--- calendar/gui/dialogs/event-page.ui
+++ calendar/gui/dialogs/event-page.ui
@@ -370,23 +370,44 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkEntry" id="location">
+                  <object class="GtkHBox" id="hbox1">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="editable">True</property>
-                    <property name="visibility">True</property>
-                    <property name="max_length">0</property>
-                    <property name="text" translatable="yes"/>
-                    <property name="has_frame">True</property>
-                    <property name="activates_default">False</property>
+                    <child>
+                      <object class="GtkEntry" id="location">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="editable">True</property>
+                        <property name="visibility">True</property>
+                        <property name="max_length">0</property>
+                        <property name="text" translatable="yes"/>
+                        <property name="has_frame">True</property>
+                        <property name="activates_default">False</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="location-details">
+                        <property name="visible">True</property>
+                        <property name="can_default">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="label" translatable="yes">Details</property>
+                        <property name="use_stock">False</property>
+                        <property name="relief">GTK_RELIEF_NORMAL</property>
+                        <property name="focus_on_click">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="right_attach">2</property>
                     <property name="top_attach">3</property>
                     <property name="bottom_attach">4</property>
-                    <property name="y_padding">3</property>
-                    <property name="y_options"/>
+                    <property name="x_options">fill</property>
+                    <property name="y_options">fill</property>
                   </packing>
                 </child>
                 <child>
diff --git plugins/contacts-map/Makefile.am plugins/contacts-map/Makefile.am
index 2c8a86d..81e9481 100644
--- plugins/contacts-map/Makefile.am
+++ plugins/contacts-map/Makefile.am
@@ -9,6 +9,7 @@ liborg_gnome_contacts_map_la_CPPFLAGS =			\
 	-I$(top_srcdir)/widgets				\
 	$(GNOME_PLATFORM_CFLAGS)			\
 	$(EVOLUTION_ADDRESSBOOK_CFLAGS)			\
+	$(EVOLUTION_CALENDAR_CFLAGS)			\
 	$(CHAMPLAIN_CFLAGS)				\
 	$(GEOCLUE_CFLAGS)
 
@@ -21,9 +22,11 @@ liborg_gnome_contacts_map_la_LDFLAGS = -module -avoid-version $(NO_UNDEFINED)
 liborg_gnome_contacts_map_la_LIBADD =	\
 	$(top_builddir)/e-util/libeutil.la	\
 	$(top_builddir)/shell/libeshell.la	\
+	$(top_builddir)/calendar/gui/libevolution-calendar.la \
 	$(CHAMPLAIN_LIBS)		\
 	$(GEOCLUE_LIBS)			\
 	$(EVOLUTION_ADDRESSBOOK_LIBS)	\
+	$(EVOLUTION_CALENDAR_LIBS)	\
 	$(GNOME_PLATFORM_LIBS)
 
 EXTRA_DIST = org-gnome-contacts-map.eplug.xml
diff --git plugins/contacts-map/contacts-map.c plugins/contacts-map/contacts-map.c
index 8689300..d627cc4 100644
--- plugins/contacts-map/contacts-map.c
+++ plugins/contacts-map/contacts-map.c
@@ -30,87 +30,269 @@
 #include <shell/e-shell-view.h>
 #include <shell/e-shell-window.h>
 
+#include <calendar/gui/gnome-cal.h>
+#include <calendar/gui/e-calendar-view.h>
+#include <addressbook/gui/widgets/e-addressbook-view.h>
+
 /* Plugin entry points */
 
 gboolean addressbook_map_init (GtkUIManager *ui_manager, EShellView *shell_view);
-void action_show_ebook_map (GtkAction *action, EShellView *shell_view);
-void show_map_general (ESourceSelector *selector);
+gboolean calendar_map_init (GtkUIManager *ui_manager, EShellView *shell_view);
 
-/* Implementations */
+/* Helpers */
 
-gboolean
-addressbook_map_init (GtkUIManager *ui_manager, EShellView *shell_view)
+static EAddressWestern *
+get_address_from_event (ECalComponent *comp)
 {
-	EShellWindow *shell_window;
-	GtkActionGroup *action_group;
-	GtkAction *action;
-	GIcon *icon;
-	const gchar *tooltip;
-	const gchar *name;
-	const gchar *label;
+	const gchar *location;
+	gchar *address_string;
+	EAddressWestern *address = NULL;
+	gint str_idx;
+
+	e_cal_component_get_location (comp, &location);
+ 
+  if (location != NULL) {	
+		/* Replace the '-' by '\n' for the parse method */
+		address_string = strdup (location);
+		str_idx = 0;
+		while (address_string[str_idx] != '\0') {
+			if (address_string[str_idx] == '-') 
+				address_string[str_idx] = '\n';
+			str_idx++;
+		}
+		
+		address = e_address_western_parse (location);
 
-	shell_window = e_shell_view_get_shell_window (shell_view);
+		g_free (address_string);
+	}
 
-	name = "contacts-map";
-	label = _("Contacts map");
-	tooltip = _("Show a map of all the contacts");
-	action = gtk_action_new (name, NULL, tooltip, NULL);
-	icon = g_themed_icon_new ("gnome-globe");
-	gtk_action_set_gicon (action, icon);
-	gtk_action_set_label (action, label);
+	return address;
+}
+
+static gboolean 
+is_valid_location (ECalComponent *comp)
+{
+	EAddressWestern *address;
+	gboolean valid = FALSE;
 
-	name = "contacts";
-	action_group = e_shell_window_get_action_group (shell_window, name);
-	gtk_action_group_add_action (action_group, action);
+	address = get_address_from_event (comp);
+  valid = address != NULL && ( 
+			address->locality || address->postal_code || 
+			address->country || address->po_box );
 
-	g_signal_connect (
-			action, "activate",
-			G_CALLBACK (action_show_ebook_map), shell_view);
+	return valid;
+}
 
-	g_object_unref (action);
+static EContactAddress *
+get_contact_address (EContact *contact)
+{
+	EContactAddress * addr;
+	gint i;
+
+	const gint addr_fields[] = {
+		E_CONTACT_ADDRESS_HOME,
+		E_CONTACT_ADDRESS_WORK,
+		E_CONTACT_ADDRESS_OTHER
+	};
+
+	i = 0;
+	addr = NULL;
+	while (!addr && i<G_N_ELEMENTS(addr_fields)) {
+		addr = e_contact_get(contact, addr_fields[i]);
+		i++;
+	}
 
-	return TRUE;
+	return addr;
 }
 
-void
-action_show_ebook_map (GtkAction *action, EShellView *shell_view)
+static void
+show_contacts_map (GList *contacts)
 {
-	EShellSidebar *shell_sidebar;
-	ESourceSelector *selector = NULL;
+	GList *tmp;
+	GArray *addresses;
+	GPtrArray *labels;
+	gboolean single_contact;
+
+	addresses = g_array_new (FALSE, FALSE, sizeof(EContactAddress));
+	labels = g_ptr_array_new ();
+
+	single_contact = g_list_length (contacts) == 1;
+
+	for (tmp = contacts; tmp; tmp = tmp->next) {
+		EContact *contact;
+		EContactAddress *addr;
+		gchar *contact_name;
+
+		contact = tmp->data;
+	 
+	  if (single_contact)	{
+			addr = e_contact_get(contact, E_CONTACT_ADDRESS_HOME);
+			if (addr != NULL) {
+				g_array_append_val (addresses, *addr);
+				g_ptr_array_add (labels, (gpointer)_("Home"));
+			}
+			
+			addr = e_contact_get(contact, E_CONTACT_ADDRESS_WORK);
+			if (addr != NULL) {
+				g_array_append_val (addresses, *addr);
+				g_ptr_array_add (labels, (gpointer)_("Work"));
+			}
 
-	shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
-	g_object_get (shell_sidebar, "selector", &selector, NULL);
-	g_return_if_fail (selector != NULL);
+			addr = e_contact_get(contact, E_CONTACT_ADDRESS_OTHER);
+			if (addr != NULL) {
+				g_array_append_val (addresses, *addr);
+				g_ptr_array_add (labels, (gpointer)_("Other"));
+			}
+		} else {
+			addr = get_contact_address (contact);
+
+			if (addr != NULL) {
+				g_array_append_val (addresses, *addr);
+		
+				contact_name = e_contact_get (contact, E_CONTACT_FULL_NAME);
+				g_ptr_array_add (labels, (gpointer)contact_name);
+			}
+		}
 
-	show_map_general (selector);
+		g_object_unref (contact);
+	}
 
-	g_object_unref (selector);
+	show_map_general (addresses, labels, _("Contacts map"));
+
+	g_array_free (addresses, TRUE);
+	g_ptr_array_free (labels, TRUE);
+}
+
+/* Callbacks */
+
+static void
+show_event_map_cb (GtkAction *action, EShellView *shell_view)
+{
+  EShellWindow *shell_window;
+  EShellContent *shell_content;
+  GnomeCalendar *gcal = NULL;
+  GnomeCalendarViewType view_type;
+  ECalendarView *view;
+ 
+  g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+ 
+  shell_window = e_shell_view_get_shell_window (shell_view);
+  shell_content = e_shell_view_get_shell_content (shell_view);
+ 
+  g_object_get (shell_content, "calendar", &gcal, NULL);
+ 
+  view_type = gnome_calendar_get_view (gcal);
+  view = gnome_calendar_get_calendar_view (gcal, view_type);
+
+  if (view) {
+    GList *selected;
+
+    selected = e_calendar_view_get_selected_events (view);
+    if (selected && selected->data) {
+			ECalComponent *comp;
+			EContactAddress addr;
+			EAddressWestern *location_addr;
+			ECalComponentText summary;
+
+			GArray *addresses;
+			GPtrArray *labels;
+      
+			ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
+
+			addresses = g_array_new (FALSE, FALSE, sizeof(EContactAddress));
+			labels = g_ptr_array_new ();
+
+
+			comp = e_cal_component_new ();
+      e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+
+			location_addr = get_address_from_event (comp);
+			if (location_addr != NULL) {
+				addr = address_western_to_contact_address (*location_addr);
+
+				g_array_append_val (addresses, addr);
+
+				e_cal_component_get_summary (comp, &summary);
+				g_ptr_array_add (labels, (gpointer)summary.value);
+
+				show_map_general (addresses, labels, _("Location"));
+			}
+
+			g_object_unref (comp);
+	
+			g_array_free (addresses, TRUE);
+			g_ptr_array_free (labels, TRUE);
+    }
+
+    g_list_free (selected);
+  }
+}
+
+static void
+update_cal_entries_cb (EShellView *shell_view, gpointer user_data)
+{
+  /* Check if the location can be parsed to an address */
+  EShellWindow *shell_window;
+  GtkActionGroup *action_group;
+  gboolean has_location = FALSE;
+  EShellContent *shell_content;
+  GnomeCalendar *gcal = NULL;
+  GnomeCalendarViewType view_type;
+  ECalendarView *view;
+  GtkAction *action;
+ 
+  g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+ 
+  shell_window = e_shell_view_get_shell_window (shell_view);
+  shell_content = e_shell_view_get_shell_content (shell_view);
+ 
+  g_object_get (shell_content, "calendar", &gcal, NULL);
+ 
+  view_type = gnome_calendar_get_view (gcal);
+  view = gnome_calendar_get_calendar_view (gcal, view_type);
+
+  if (view) {
+    GList *selected;
+
+    selected = e_calendar_view_get_selected_events (view);
+    if (selected && selected->data) {
+			ECalComponent *comp;
+
+      ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
+
+			comp = e_cal_component_new ();
+      e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+
+			has_location = is_valid_location (comp);
+
+			g_object_unref (comp);
+    }
+
+    g_list_free (selected);
+  }
+
+  action_group = e_shell_window_get_action_group (shell_window, "calendar");
+
+	action = gtk_action_group_get_action (action_group, "event-map");
+	g_return_if_fail (action != NULL);
+	gtk_action_set_visible (action, has_location);
 }
 
-void
-show_map_general (ESourceSelector *selector)
+static void
+show_ebook_map_cb (GtkAction *action, EShellView *shell_view)
 {
+	EShellSidebar *shell_sidebar;
+	ESourceSelector *selector = NULL;
+	
 	EBook *book;
 	ESource *primary_source;
 	EBookQuery *query;
-	GList *contacts, *tmp;
+	GList *contacts;
 	gchar *uri;
 
-	GeoclueGeocode *geocoder;
-	GeocluePositionFields fields;
-	GeoclueAccuracy *accuracy;
-
-	gdouble lat = 0;
-	gdouble lng = 0;
-
-	GtkWidget *map_widget;
-	ChamplainView  *view;
-	ChamplainLayer *layer;
-
-	gdouble *min_lat = NULL;
-	gdouble *max_lat = NULL;
-	gdouble *min_lng = NULL;
-	gdouble *max_lng = NULL;
+	shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+	g_object_get (shell_sidebar, "selector", &selector, NULL);
+	g_return_if_fail (selector != NULL);
 
 	primary_source = (ESource*)e_source_selector_peek_primary_selection (selector);
 	uri = e_source_get_uri (primary_source);
@@ -127,95 +309,149 @@ show_map_general (ESourceSelector *selector)
 	e_book_get_contacts (book, query, &contacts, NULL);
 	e_book_query_unref (query);
 
-	init_map (&view, &map_widget);
-	layer = champlain_selection_layer_new ();
+	show_contacts_map (contacts);
+
+	if (contacts != NULL)
+		g_list_free (contacts);
+
+	g_object_unref (selector);
+}
+
+static void
+show_contact_map_cb (GtkAction *action, EShellView *shell_view)
+{
+  EShellWindow *shell_window;
+  EShellContent *shell_content;
+	EAddressbookView *view = NULL;
+  GList *list;
+  
+	g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+ 
+  shell_window = e_shell_view_get_shell_window (shell_view);
+  shell_content = e_shell_view_get_shell_content (shell_view);
+
+  g_object_get (shell_content, "current-view", &view, NULL);
+	
+  g_return_if_fail (view != NULL);
+
+  list = e_addressbook_view_get_selected (view);
+  g_return_if_fail (list != NULL);
+
+	show_contacts_map (list);
+
+  g_list_free (list);
+}
 
-	geocoder = NULL;
-	geocoder = get_geocoder ();
-	if (geocoder != NULL) {
-		for (tmp = contacts; tmp; tmp = tmp->next) {
-			GError *error = NULL;
+static void
+update_book_entries_cb (EShellView *shell_view, gpointer user_data)
+{
+  EShellWindow *shell_window;
+  EShellContent *shell_content;
+	EAddressbookView *view = NULL;
+  GList *list, *iter;
+	gboolean has_address = FALSE;
+  GtkActionGroup *action_group;
+  GtkAction *action;
+  
+	g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+ 
+  shell_window = e_shell_view_get_shell_window (shell_view);
+  shell_content = e_shell_view_get_shell_content (shell_view);
+
+  g_object_get (shell_content, "current-view", &view, NULL);
+	
+  g_return_if_fail (view != NULL);
+
+  list = e_addressbook_view_get_selected (view);
+  if (list != NULL) {
+
+		/* Check if there is at least an address in the selection */
+		iter = list;
+		while (iter && !has_address) {
 			EContact *contact;
 			EContactAddress *addr;
-			GHashTable *details;
-			gint i;
-			const gint addr_fields[] = {
-				E_CONTACT_ADDRESS_HOME,
-				E_CONTACT_ADDRESS_WORK,
-				E_CONTACT_ADDRESS_OTHER
-			};
-
-			contact = tmp->data;
-
-			/* Get the lat & lng and add the marker asynchronously */
-			i = 0;
-			addr = NULL;
-			while (!addr && i<G_N_ELEMENTS(addr_fields)) {
-				addr = e_contact_get(contact, addr_fields[i]);
-				i++;
-			}
 
-			details = (GHashTable*) get_geoclue_from_address (addr);
-			fields = geoclue_geocode_address_to_position (geocoder, details,
-					&lat, &lng, NULL, &accuracy, &error);
-
-			if (!error &&
-			    (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) != 0 &&
-			    (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) != 0) {
-				/* Add the marker to the map */
-				add_marker (layer, lat, lng, contact);
-				if (!min_lat) {
-					min_lat = g_malloc (sizeof (gdouble));
-					*min_lat = lat;
-				}
-				if (!max_lat) {
-					max_lat = g_malloc (sizeof(gdouble));
-					*max_lat = lat;
-				}
-				if (!min_lng) {
-					min_lng = g_malloc (sizeof (gdouble));
-					*min_lng = lng;
-				}
-				if (!max_lng) {
-					max_lng = malloc (sizeof (gdouble));
-					*max_lng = lng;
-				}
-
-				/* Store the min/max lat/lng */
-				get_min_max (min_lat, max_lat,
-						min_lng, max_lng, lat, lng);
-			} else if (error) {
-				g_warning ("Error while geocoding: %s\n", error->message);
-				g_error_free (error);
-			}
+			contact = iter->data;
+
+			addr = get_contact_address (contact);
+			has_address = addr != NULL;
 
-			g_hash_table_destroy (details);
 			g_object_unref (contact);
+
+			iter = iter->next;
 		}
+
+		g_list_free (list);
+
+		/* Define action visibility */
+		action_group = e_shell_window_get_action_group (shell_window, "contacts");
+
+		action = gtk_action_group_get_action (action_group, "contact-map");
+		g_return_if_fail (action != NULL);
+		gtk_action_set_visible (action, has_address);
 	}
+}
 
-	champlain_view_add_layer (view, layer);
-	champlain_layer_show (layer);
-	champlain_layer_show_all_markers (CHAMPLAIN_LAYER (layer));
+/* UI initialization */
+
+static GtkActionEntry book_entries[] = {
+  { "contacts-map",
+    "gnome-globe",
+    N_("Contacts map"),
+    NULL,
+    N_("Show a map of all the contacts"),
+    G_CALLBACK (show_ebook_map_cb)
+  },
+	{ "contact-map",
+		"gnome-globe",
+		N_("Show on a map"),
+		NULL,
+		N_("Show the contact on a map"),
+		G_CALLBACK (show_contact_map_cb)
+	}
+};
 
-	create_map_window (map_widget, _("Contacts map"));
+gboolean
+addressbook_map_init (GtkUIManager *ui_manager, EShellView *shell_view)
+{
+	EShellWindow *shell_window;
+	GtkActionGroup *action_group;
 
-	/* Do not ensure something visible is we have nothing */
-	if (min_lat && min_lng && max_lat && max_lng)
-		champlain_view_ensure_visible (view,
-				*min_lat, *min_lng,
-				*max_lat, *max_lng, FALSE);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+  action_group = e_shell_window_get_action_group (shell_window, "contacts");
 
-	g_free (min_lat);
-	g_free (max_lat);
-	g_free (min_lng);
-	g_free (max_lng);
+	gtk_action_group_add_actions (action_group, book_entries,
+          G_N_ELEMENTS (book_entries), shell_view);
 
-	g_object_unref (geocoder);
+  g_signal_connect (shell_view, "update-actions", G_CALLBACK (update_book_entries_cb), NULL);
 
-	if (contacts != NULL)
-		g_list_free (contacts);
+	return TRUE;
+}
 
-	g_object_unref (book);
-	g_free (uri);
+static GtkActionEntry cal_entries[] = {
+  { "event-map",
+    "gnome-globe",
+    N_("Show on a map"),
+    NULL,
+    N_("Show the location on a map"),
+    G_CALLBACK (show_event_map_cb)
+  }
+};
+
+gboolean
+calendar_map_init (GtkUIManager *ui_manager, EShellView *shell_view)
+{
+	EShellWindow *shell_window;
+	GtkActionGroup *action_group;
+
+	shell_window = e_shell_view_get_shell_window (shell_view);
+  action_group = e_shell_window_get_action_group (shell_window, "calendar");
+
+	gtk_action_group_add_actions (action_group, cal_entries,
+          G_N_ELEMENTS (cal_entries), shell_view);
+
+  g_signal_connect (shell_view, "update-actions", G_CALLBACK (update_cal_entries_cb), NULL);
+
+	return TRUE;
 }
+
diff --git plugins/contacts-map/geo-utils.c plugins/contacts-map/geo-utils.c
index 1168e38..c32ede2 100644
--- plugins/contacts-map/geo-utils.c
+++ plugins/contacts-map/geo-utils.c
@@ -41,13 +41,11 @@ get_min_max (gdouble *min_lat, gdouble *max_lat,
 }
 
 void
-add_marker (ChamplainLayer *layer, gdouble lat, gdouble lng, EContact *contact)
+add_marker (ChamplainLayer *layer, gdouble lat, gdouble lng, gchar *label)
 {
 	ClutterActor *marker;
 
-	gchar *contact_name = e_contact_get (contact, E_CONTACT_FULL_NAME);
-	marker = champlain_marker_new_with_text (contact_name, "Serif 8", NULL, NULL);
-	g_free (contact_name);
+	marker = champlain_marker_new_with_text (label, "Serif 8", NULL, NULL);
 
 	champlain_marker_set_use_markup (CHAMPLAIN_MARKER (marker), FALSE);
 	champlain_base_marker_set_position (CHAMPLAIN_BASE_MARKER (marker), lat, lng);
@@ -80,6 +78,21 @@ get_geoclue_from_address (const EContactAddress* addr)
 	return address;
 }
 
+EContactAddress
+address_western_to_contact_address (EAddressWestern western)
+{
+	EContactAddress addr;
+
+  addr.street = western.street;
+  addr.locality = western.locality;
+  addr.region = western.region;
+  addr.country = western.country;
+  addr.po = western.po_box;
+  addr.code = western.postal_code;
+
+	return addr;
+}
+
 void
 init_map (ChamplainView **view, GtkWidget **widget)
 {
@@ -122,3 +135,103 @@ create_map_window (GtkWidget *map_widget, const gchar *title)
 	/* make sure that everything, window and label, are visible */
 	gtk_widget_show_all (window);
 }
+
+void
+show_map_general (GArray *addresses, GPtrArray *labels, const gchar *window_title)
+{
+	GeoclueGeocode *geocoder;
+	GeocluePositionFields fields;
+	GeoclueAccuracy *accuracy;
+
+	gdouble lat = 0;
+	gdouble lng = 0;
+
+	GtkWidget *map_widget;
+	ChamplainView  *view;
+	ChamplainLayer *layer;
+
+	gdouble *min_lat = NULL;
+	gdouble *max_lat = NULL;
+	gdouble *min_lng = NULL;
+	gdouble *max_lng = NULL;
+
+	init_map (&view, &map_widget);
+	layer = champlain_selection_layer_new ();
+
+	geocoder = NULL;
+	geocoder = get_geocoder ();
+	if (geocoder != NULL) {
+		gint i;
+
+		/* Loop over the addresses */
+		for (i = 0; i < addresses->len; i++) {
+			EContactAddress *addr;
+			GHashTable *details;
+			GError *error = NULL;
+			gchar *label = (gchar *)"";
+			
+			addr = &g_array_index (addresses, EContactAddress, i);
+
+			/* Get the label if any */
+			if (i < labels->len) {
+				label = g_ptr_array_index (labels, i);
+			}
+
+			details = (GHashTable*) get_geoclue_from_address (addr);
+			fields = geoclue_geocode_address_to_position (geocoder, details,
+					&lat, &lng, NULL, &accuracy, &error);
+
+			if (!error &&
+			    (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) != 0 &&
+			    (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) != 0) {
+				/* Add the marker to the map */
+				add_marker (layer, lat, lng, label);
+				if (!min_lat) {
+					min_lat = g_malloc (sizeof (gdouble));
+					*min_lat = lat;
+				}
+				if (!max_lat) {
+					max_lat = g_malloc (sizeof(gdouble));
+					*max_lat = lat;
+				}
+				if (!min_lng) {
+					min_lng = g_malloc (sizeof (gdouble));
+					*min_lng = lng;
+				}
+				if (!max_lng) {
+					max_lng = malloc (sizeof (gdouble));
+					*max_lng = lng;
+				}
+
+				/* Store the min/max lat/lng */
+				get_min_max (min_lat, max_lat,
+						min_lng, max_lng, lat, lng);
+			} else if (error) {
+				g_warning ("Error while geocoding: %s\n", error->message);
+				g_error_free (error);
+			}
+
+			g_hash_table_destroy (details);
+
+		}
+  }
+
+	champlain_view_add_layer (view, layer);
+	champlain_layer_show (layer);
+	champlain_layer_show_all_markers (CHAMPLAIN_LAYER (layer));
+
+	create_map_window (map_widget, window_title);
+
+	/* Do not ensure something visible is we have nothing */
+	if (min_lat && min_lng && max_lat && max_lng)
+		champlain_view_ensure_visible (view,
+				*min_lat, *min_lng,
+				*max_lat, *max_lng, FALSE);
+
+	g_free (min_lat);
+	g_free (max_lat);
+	g_free (min_lng);
+	g_free (max_lng);
+
+	g_object_unref (geocoder);
+}
diff --git plugins/contacts-map/geo-utils.h plugins/contacts-map/geo-utils.h
index c830151..c80ef4c 100644
--- plugins/contacts-map/geo-utils.h
+++ plugins/contacts-map/geo-utils.h
@@ -25,6 +25,7 @@
 
 #include <libebook/e-book.h>
 #include <libebook/e-contact.h>
+#include <libebook/e-address-western.h>
 
 #include <geoclue/geoclue-geocode.h>
 #include <champlain/champlain.h>
@@ -41,10 +42,14 @@ GeoclueGeocode *get_geocoder (void);
 void add_marker (
         ChamplainLayer *layer,
         gdouble lat, gdouble lng,
-        EContact *contact);
+        gchar *label);
 
 GHashTable *get_geoclue_from_address (const EContactAddress* addr);
 
+EContactAddress address_western_to_contact_address (EAddressWestern western);
+
 void init_map (ChamplainView **view, GtkWidget **widget);
 
 void create_map_window (GtkWidget *map_widget, const gchar *title);
+
+void show_map_general (GArray *addresses, GPtrArray *labels, const gchar *window_title);
diff --git plugins/contacts-map/org-gnome-contacts-map.eplug.xml plugins/contacts-map/org-gnome-contacts-map.eplug.xml
index e695979..3d5a4b7 100644
--- plugins/contacts-map/org-gnome-contacts-map.eplug.xml
+++ plugins/contacts-map/org-gnome-contacts-map.eplug.xml
@@ -1,19 +1,25 @@
 <?xml version="1.0"?>
 <e-plugin-list>
-    <e-plugin id="org.gnome.evolution.contacts_maps" type="shlib" _name="Map for contacts"
-        location="@PLUGINDIR@/liborg-gnome-contacts-map@SOEXT@">
-        <author name="Cedric Bosdonnat" email="cedric.bosdonnat.ooo@free.fr"/>
-        <_description>Add a map showing the location of contacts when possible.</_description>
-      
-	<hook class="org.gnome.evolution.ui:1.0">
-        <ui-manager id="org.gnome.evolution.contacts" callback="addressbook_map_init">
-          <!-- Add something for contact-popup -->
-          <popup name="address-book-popup">
-            <menuitem action="contacts-map"/>
-          </popup>
-        </ui-manager>
-      </hook>
-
-    </e-plugin>
+  <e-plugin id="org.gnome.evolution.contacts_maps" type="shlib" _name="Map for contacts" location="@PLUGINDIR@/liborg-gnome-contacts-map@SOEXT@">
+    <author name="Cedric Bosdonnat" email="cedric.bosdonnat.ooo@free.fr"/>
+    <_description>Add a map showing the location of contacts when possible.</_description>
+    <hook class="org.gnome.evolution.ui:1.0">
+      <ui-manager id="org.gnome.evolution.contacts" callback="addressbook_map_init">
+        <!-- Add something for contact-popup -->
+        <popup name="address-book-popup">
+          <menuitem action="contacts-map"/>
+        </popup>
+        <popup name="contact-popup">
+          <menuitem action="contact-map"/>
+        </popup>
+      </ui-manager>
+      <ui-manager id="org.gnome.evolution.calendars" callback="calendar_map_init">
+        <popup name="calendar-event-popup">
+          <placeholder name="event-popup-actions">
+            <menuitem action="event-map"/>
+          </placeholder>
+        </popup>
+      </ui-manager>
+    </hook>
+  </e-plugin>
 </e-plugin-list>
-
