--- libgweather-2.28.0/libgweather/gweather-location.c	2009-10-09 14:02:43.000000000 -0400
+++ libgweather-2.28.0.new/libgweather/gweather-location.c	2009-10-09 13:22:40.000000000 -0400
@@ -646,7 +646,7 @@
 	if (!loc)
 	    return NULL;
 	for (i = 0; loc->zones[i]; i++) {
-	    if (!strcmp (tz_hint, gweather_timezone_get_tzid (loc->zones[i])))
+	    if (gweather_timezone_lookup_tzid (loc->zones[i], tz_hint))
 		return loc->zones[i];
 	}
 	loc = loc->parent;
--- libgweather-2.28.0/libgweather/gweather-timezone.h	2009-08-12 05:00:52.000000000 -0400
+++ libgweather-2.28.0.new/libgweather/gweather-timezone.h	2009-10-09 12:59:25.000000000 -0400
@@ -45,6 +45,9 @@
 
 GWeatherTimezone *gweather_timezone_get_utc        (void);
 
+gboolean          gweather_timezone_lookup_tzid    (GWeatherTimezone *zone,
+                                                    const char *tzid);
+
 G_END_DECLS
 
 #endif /* __GWEATHER_TIMEZONE_H__ */
--- libgweather-2.28.0/libgweather/gweather-timezone.c	2009-10-09 14:02:43.000000000 -0400
+++ libgweather-2.28.0.new/libgweather/gweather-timezone.c	2009-10-09 13:50:06.000000000 -0400
@@ -44,6 +44,7 @@
     char *id, *name;
     int offset, dst_offset;
     gboolean has_dst;
+    GSList *obsoletes;
 
     int ref_count;
 };
@@ -153,9 +154,10 @@
 parse_timezone (GWeatherParser *parser)
 {
     GWeatherTimezone *zone = NULL;
-    char *id = NULL, *name = NULL, *context = NULL;
+    char *id = NULL, *name = NULL, *context = NULL, *obsolete = NULL;
     int offset = 0, dst_offset = 0;
     gboolean has_dst = FALSE;
+    GSList *obsoletes = NULL;
 
     id = (char *) xmlTextReaderGetAttribute (parser->xml, (xmlChar *) "id");
     if (!id) {
@@ -180,6 +182,10 @@
 		context = xmlTextReaderGetAttribute(parser->xml,"msgctxt"); 
 		name = gweather_parser_get_value (parser);
 	    }
+	    else if (!strcmp ((const char *) xmlTextReaderConstName (parser->xml), "obsoletes")) {
+	        obsolete = gweather_parser_get_value (parser);
+	        obsoletes = g_slist_prepend (obsoletes, g_strdup (obsolete));
+	    }
 	    else {
 		if (xmlTextReaderNext (parser->xml) != 1)
 		    break;
@@ -199,6 +206,7 @@
 	zone->offset = offset;
 	zone->has_dst = has_dst;
 	zone->dst_offset = dst_offset;
+	zone->obsoletes = obsoletes;
     }
 
     xmlFree (id);
@@ -285,6 +293,8 @@
     if (!--zone->ref_count) {
 	g_free (zone->id);
 	g_free (zone->name);
+	g_slist_foreach (zone->obsoletes, (GFunc) g_free, NULL);
+	g_slist_free (zone->obsoletes);
 	g_slice_free (GWeatherTimezone, zone);
     }
 }
@@ -323,6 +333,7 @@
     zone->offset = 0;
     zone->has_dst = FALSE;
     zone->dst_offset = 0;
+    zone->obsoletes = NULL;
 
     return zone;
 }
@@ -411,3 +422,21 @@
     return zone->dst_offset;
 }
 
+/**
+ * gweather_timezone_lookup_tzid:
+ * @zone: a #GWeatherTimezone
+ *
+ * Checks if the tzdata identifier @tzid matches @zone.
+ *
+ * Return value: %TRUE if @tzid is found.
+ **/
+gboolean
+gweather_timezone_lookup_tzid (GWeatherTimezone *zone, const char *tzid)
+{
+    g_return_val_if_fail (zone != NULL, FALSE);
+    if (!strcmp (tzid, zone->id))
+        return TRUE;
+    if (g_slist_find (zone->obsoletes, tzid))
+        return TRUE;
+    return FALSE;
+}
