diff --git a/calendar/backends/weather/e-cal-backend-weather.c b/calendar/backends/weather/e-cal-backend-weather.c
index 52b6a7c..ed6a8ae 100644
--- a/calendar/backends/weather/e-cal-backend-weather.c
+++ b/calendar/backends/weather/e-cal-backend-weather.c
@@ -69,9 +69,6 @@ struct _ECalBackendWeatherPrivate {
 	/* Flags */
 	gboolean opened;
 
-	/* City (for summary) */
-	gchar *city;
-
 	/* Weather source */
 	EWeatherSource *source;
 
@@ -314,7 +311,6 @@ create_weather (ECalBackendWeather *cbw,
                 GWeatherInfo *report,
                 gboolean is_forecast)
 {
-	ECalBackendWeatherPrivate *priv;
 	ECalComponent             *cal_comp;
 	ECalComponentText          comp_summary;
 	icalcomponent             *ical_comp;
@@ -323,19 +319,18 @@ create_weather (ECalBackendWeather *cbw,
 	gchar			  *uid;
 	GSList                    *text_list = NULL;
 	ECalComponentText         *description;
-	gchar                     *tmp;
+	gchar                     *tmp, *city_name;
 	time_t			   update_time;
 	icaltimezone		  *update_zone = NULL;
 	const GWeatherLocation    *location;
 	const GWeatherTimezone    *w_timezone;
+	gdouble tmin = 0.0, tmax = 0.0;
 
 	g_return_val_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw), NULL);
 
 	if (!gweather_info_get_value_update (report, &update_time))
 		return NULL;
 
-	priv = cbw->priv;
-
 	/* create the component and event object */
 	ical_comp = icalcomponent_new (ICAL_VEVENT_COMPONENT);
 	cal_comp = e_cal_component_new ();
@@ -374,28 +369,27 @@ create_weather (ECalBackendWeather *cbw,
 	/* We have to add 1 day to DTEND, as it is not inclusive. */
 	e_cal_component_set_dtend (cal_comp, &dt);
 
-	{
-		gdouble tmin = 0.0, tmax = 0.0;
-
-		if (gweather_info_get_value_temp_min (report, GWEATHER_TEMP_UNIT_DEFAULT, &tmin) &&
-		    gweather_info_get_value_temp_max (report, GWEATHER_TEMP_UNIT_DEFAULT, &tmax) &&
-		    tmin != tmax) {
-			gchar *min, *max;
+	city_name = gweather_info_get_location_name (report);
+	if (gweather_info_get_value_temp_min (report, GWEATHER_TEMP_UNIT_DEFAULT, &tmin) &&
+	    gweather_info_get_value_temp_max (report, GWEATHER_TEMP_UNIT_DEFAULT, &tmax) &&
+	    tmin != tmax) {
+		gchar *min, *max;
 
-			min = gweather_info_get_temp_min (report);
-			max = gweather_info_get_temp_max (report);
-			comp_summary.value = g_strdup_printf ("%s : %s / %s", priv->city, min, max);
+		min = gweather_info_get_temp_min (report);
+		max = gweather_info_get_temp_max (report);
+		comp_summary.value = g_strdup_printf ("%s : %s / %s", city_name, min, max);
 
-			g_free (min); g_free (max);
-		} else {
-			gchar *temp;
+		g_free (min); g_free (max);
+	} else {
+		gchar *temp;
 
-			temp = gweather_info_get_temp (report);
-			comp_summary.value = g_strdup_printf ("%s : %s", priv->city, temp);
+		temp = gweather_info_get_temp (report);
+		comp_summary.value = g_strdup_printf ("%s : %s", city_name, temp);
 
-			g_free (temp);
-		}
+		g_free (temp);
 	}
+	g_free (city_name);
+
 	comp_summary.altrep = NULL;
 	e_cal_component_set_summary (cal_comp, &comp_summary);
 	g_free ((gchar *) comp_summary.value);
@@ -483,27 +477,13 @@ e_cal_backend_weather_open (ECalBackendSync *backend,
 {
 	ECalBackendWeather *cbw;
 	ECalBackendWeatherPrivate *priv;
-	ESource *source;
-	ESourceWeather *extension;
-	const gchar *extension_name;
 	const gchar *cache_dir;
-	gchar *location;
 
 	cbw = E_CAL_BACKEND_WEATHER (backend);
 	priv = cbw->priv;
 
-	source = e_backend_get_source (E_BACKEND (backend));
 	cache_dir = e_cal_backend_get_cache_dir (E_CAL_BACKEND (backend));
 
-	extension_name = E_SOURCE_EXTENSION_WEATHER_BACKEND;
-	extension = e_source_get_extension (source, extension_name);
-
-	g_free (priv->city);
-
-	location = e_source_weather_dup_location (extension);
-	priv->city = g_strdup (strrchr (location, '/') + 1);
-	g_free (location);
-
 	e_cal_backend_set_writable (E_CAL_BACKEND (backend), FALSE);
 
 	if (!priv->store) {
@@ -778,8 +758,6 @@ e_cal_backend_weather_finalize (GObject *object)
 		priv->store = NULL;
 	}
 
-	g_free (priv->city);
-
 	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->finalize (object);
 }
diff --git a/calendar/backends/weather/e-weather-source.c b/calendar/backends/weather/e-weather-source.c
index d835030..8288d99 100644
--- a/calendar/backends/weather/e-weather-source.c
+++ b/calendar/backends/weather/e-weather-source.c
@@ -71,6 +71,37 @@ e_weather_source_init (EWeatherSource *source)
 	source->priv = E_WEATHER_SOURCE_GET_PRIVATE (source);
 }
 
+static GWeatherLocation *
+weather_source_find_location_by_coords (GWeatherLocation *start,
+					gdouble latitude,
+					gdouble longitude)
+{
+	GWeatherLocation *location, **children;
+	gint ii;
+
+	if (!start)
+		return NULL;
+
+	location = start;
+	if (gweather_location_has_coords (location)) {
+		gdouble lat, lon;
+
+		gweather_location_get_coords (location, &lat, &lon);
+
+		if (lat == latitude && lon == longitude)
+			return location;
+	}
+
+	children = gweather_location_get_children (location);
+	for (ii = 0; children[ii]; ii++) {
+		location = weather_source_find_location_by_coords (children[ii], latitude, longitude);
+		if (location)
+			return location;
+	}
+
+	return NULL;
+}
+
 EWeatherSource *
 e_weather_source_new (const gchar *location)
 {
@@ -99,6 +130,18 @@ e_weather_source_new (const gchar *location)
 	tokens = g_strsplit (location, "/", 2);
 
 	glocation = gweather_location_find_by_station_code (world, tokens[0]);
+
+	if (!glocation) {
+		gdouble latitude, longitude;
+		gchar *endptr = NULL;
+
+		latitude = g_ascii_strtod (location, &endptr);
+		if (endptr && *endptr == '/') {
+			longitude = g_ascii_strtod (endptr + 1, NULL);
+			glocation = weather_source_find_location_by_coords (world, latitude, longitude);
+		}
+	}
+
 	if (glocation != NULL)
 		gweather_location_ref (glocation);
 
@@ -109,7 +152,7 @@ e_weather_source_new (const gchar *location)
 		return NULL;
 
 	source = g_object_new (E_TYPE_WEATHER_SOURCE, NULL);
-	source->priv->location = gweather_location_ref (glocation);
+	source->priv->location = glocation;
 
 	return source;
 }
@@ -146,11 +189,12 @@ e_weather_source_parse (EWeatherSource *source,
 		source->priv->info = gweather_info_new (
 			source->priv->location,
 			GWEATHER_FORECAST_LIST);
+		gweather_info_set_enabled_providers (source->priv->info, GWEATHER_PROVIDER_ALL);
 		g_signal_connect (
 			source->priv->info, "updated",
 			G_CALLBACK (weather_source_updated_cb), source);
-	} else {
-		gweather_info_update (source->priv->info);
 	}
+
+	gweather_info_update (source->priv->info);
 }
 
