diff --git a/gst-libs/gst/tag/gstvorbistag.c b/gst-libs/gst/tag/gstvorbistag.c
index 0b3ad57..04b8737 100644
--- a/gst-libs/gst/tag/gstvorbistag.c
+++ b/gst-libs/gst/tag/gstvorbistag.c
@@ -266,37 +266,110 @@ gst_vorbis_tag_add (GstTagList * list, const gchar * tag, const gchar * value)
     }
     default:{
       if (tag_type == GST_TYPE_DATE) {
-        guint y, d = 1, m = 1;
+        guint year, month = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0;
+        gfloat tz_offset = 0;
         gchar *check = (gchar *) value;
+        gboolean is_date_tag, has_time_info = FALSE, has_tz_info = FALSE;
+        
+        is_date_tag = (strcmp (gst_tag, GST_TAG_DATE) == 0);
 
-        y = strtoul (check, &check, 10);
+        year = strtoul (check, &check, 10);
         if (*check == '-') {
           check++;
-          m = strtoul (check, &check, 10);
+          month = strtoul (check, &check, 10);
           if (*check == '-') {
             check++;
-            d = strtoul (check, &check, 10);
+            day = strtoul (check, &check, 10);
           }
         }
 
         /* accept dates like 2007-00-00 and 2007-05-00 */
-        if (y != 0) {
-          if (m == 0 && d == 0)
-            m = d = 1;
-          else if (m != 0 && d == 0)
-            d = 1;
+        if (year != 0) {
+          if (month == 0 && day == 0)
+            month = day = 1;
+          else if (month != 0 && day == 0)
+            day = 1;
         }
 
         /* date might be followed by a time */
-        if ((*check == '\0' || g_ascii_isspace (*check)) && y != 0 &&
-            g_date_valid_dmy (d, m, y)) {
+        if ((*check == 'T' || g_ascii_isspace (*check))) {
+          has_time_info = TRUE;
+          check++;
+          hour = strtoul (check, &check, 10);
+          if (*check == ':') {
+            check++;
+            min = strtoul (check, &check, 10);
+            if (*check == ':') {
+              check++;
+              sec = strtoul (check, &check, 10);
+              if (*check == '.') {
+                guint usec_digits = 0;
+                gint digit_val;
+                
+                check++;
+                while (usec_digits < 6 && 
+                    (digit_val = g_ascii_digit_value (*check)) >= 0) {
+                  usec = usec * 10 + digit_val;
+                  usec_digits++;
+                  check++;
+                }
+                while (usec_digits < 6) {
+                  usec *= 10;
+                  usec_digits++;
+                }
+                g_assert (usec_digits == 6);
+              }
+            }
+          }
+          if (*check == '+' || *check == '-') {
+            gint tz_hour = 0;
+            guint tz_min = 0;
+          
+            has_tz_info = TRUE;
+            tz_hour = strtol (check, &check, 10);
+            if (*check == ':') {
+              check++;
+              tz_min = strtoul (check, &check, 10);
+            }
+            tz_offset = tz_hour + (tz_min / 60.0);
+          } else if (*check == 'Z') {
+            has_tz_info = TRUE;
+            check++;
+          }
+        }
+
+        if ((*check == '\0' || g_ascii_isspace (*check)) && year != 0 &&
+            g_date_valid_dmy (day, month, year)) {
           GDate *date;
 
-          date = g_date_new_dmy (d, m, y);
+          date = g_date_new_dmy (day, month, year);
           gst_tag_list_add (list, GST_TAG_MERGE_APPEND, gst_tag, date, NULL);
           g_date_free (date);
+          
+          if (is_date_tag && has_time_info) {
+            if (hour < 24 && min < 60 && sec <= 60 && usec < 1000000.0 && 
+                tz_offset >= -12.0 && tz_offset <= 12.0) {
+              GstDateTime *datetime;
+            
+              if (has_tz_info) {
+                datetime = gst_date_time_new (tz_offset, year, month, day, hour, 
+                  min, sec + (usec / 1000000.0));
+              } else {
+                datetime = gst_date_time_new_local_time (year, month, day, hour, 
+                  min, sec + (usec / 1000000.0));
+              }
+              if (datetime) {
+                gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_DATE_TIME,
+                  datetime, NULL);
+                gst_date_time_unref (datetime);
+              }
+            } else {
+              GST_DEBUG ("skipping invalid datetime '%s' (%u,%u,%u,%u,%u,%u,%u,%g)", 
+                value, year, month, day, hour, min, sec, usec, tz_offset);
+            }
+          }
         } else {
-          GST_DEBUG ("skipping invalid date '%s' (%u,%u,%u)", value, y, m, d);
+          GST_DEBUG ("skipping invalid date '%s' (%u,%u,%u)", value, year, month, day);
         }
       } else {
         GST_WARNING ("Unhandled tag of type '%s' (%d)",
