diff --git a/addressbook/gui/component/autocompletion-config.c b/addressbook/gui/component/autocompletion-config.c
index 9773f5b..ebb2381 100644
--- a/addressbook/gui/component/autocompletion-config.c
+++ b/addressbook/gui/component/autocompletion-config.c
@@ -39,6 +39,8 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
+#include "e-util/e-datetime-format.h"
+
 
 typedef struct {
 	EvolutionConfigControl *config_control;
@@ -159,7 +161,7 @@ autocompletion_config_control_new (void)
 {
 	AutocompletionConfig *ac;
 	CORBA_Environment ev;
-	GtkWidget *scrolledwin, *vbox, *itembox, *w;
+	GtkWidget *scrolledwin, *vbox, *itembox, *w, *table;
 
 	ac = g_new0 (AutocompletionConfig, 1);
 
@@ -177,6 +179,11 @@ autocompletion_config_control_new (void)
 	g_signal_connect (w, "toggled", (GCallback)show_address_check_toggled_cb, ac);
 	gtk_box_pack_start (GTK_BOX (itembox), w, FALSE, FALSE, 0);
 
+	itembox = add_section (vbox, _("Date/Time Format"), FALSE);
+	table = gtk_table_new (1, 3, FALSE);
+	gtk_box_pack_start (GTK_BOX (itembox), table, TRUE, TRUE, 0);
+	e_datetime_format_add_setup_widget (table, 0, "addressbook", "table",  DTFormatKindDateTime, _("Table column:"));
+
 	itembox = add_section (vbox, _("Look up in address books"), TRUE);
 
 	ac->source_list =  e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources");
diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c
index 53cd6aa..1884272 100644
--- a/addressbook/gui/widgets/e-addressbook-view.c
+++ b/addressbook/gui/widgets/e-addressbook-view.c
@@ -26,6 +26,7 @@
 #include <glib/gi18n.h>
 #include <table/e-table-scrolled.h>
 #include <table/e-table-model.h>
+#include <table/e-cell-date.h>
 #include <misc/e-gui-utils.h>
 #include <widgets/menus/gal-view-factory-etable.h>
 #include <filter/rule-editor.h>
@@ -1283,18 +1284,26 @@ static void
 create_table_view (EABView *view)
 {
 	ETableModel *adapter;
+	ETableExtras *extras;
+	ECell *cell;
 	GtkWidget *table;
 	gchar *etspecfile;
 
 	adapter = eab_table_adapter_new(view->model);
 
+	extras = e_table_extras_new ();
+
+	/* set proper format component for a default 'date' cell renderer */
+	cell = e_table_extras_get_cell (extras, "date");
+	e_cell_date_set_format_component (E_CELL_DATE (cell), "addressbook");
+
 	/* Here we create the table.  We give it the three pieces of
 	   the table we've created, the header, the model, and the
 	   initial layout.  It does the rest.  */
 	etspecfile = g_build_filename (EVOLUTION_ETSPECDIR,
 				       "e-addressbook-view.etspec",
 				       NULL);
-	table = e_table_scrolled_new_from_spec_file (adapter, NULL, etspecfile, NULL);
+	table = e_table_scrolled_new_from_spec_file (adapter, extras, etspecfile, NULL);
 	g_free (etspecfile);
 
 	view->object = G_OBJECT(adapter);
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.c b/calendar/gui/dialogs/cal-prefs-dialog.c
index 96f91c7..5a4c5ac 100644
--- a/calendar/gui/dialogs/cal-prefs-dialog.c
+++ b/calendar/gui/dialogs/cal-prefs-dialog.c
@@ -31,6 +31,7 @@
 #include "../calendar-config.h"
 #include "cal-prefs-dialog.h"
 #include <widgets/misc/e-dateedit.h>
+#include "e-util/e-datetime-format.h"
 #include <e-util/e-dialog-widgets.h>
 #include <e-util/e-util-private.h>
 #include <glib/gi18n.h>
@@ -765,7 +766,7 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs)
 	ECalConfig *ec;
 	ECalConfigTargetPrefs *target;
 	gint i;
-	GtkWidget *toplevel;
+	GtkWidget *toplevel, *table;
 	GSList *l;
 	const gchar *working_day_names[] = {
 		"sun_button",
@@ -845,6 +846,11 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs)
 	toplevel = e_config_create_widget ((EConfig *)ec);
 	gtk_container_add (GTK_CONTAINER (prefs), toplevel);
 
+	/* date/time format */
+	table = glade_xml_get_widget (gui, "datetime_format_table");
+	e_datetime_format_add_setup_widget (table, 0, "calendar", "table",  DTFormatKindDateTime, _("Time and date:"));
+	e_datetime_format_add_setup_widget (table, 1, "calendar", "table",  DTFormatKindDate, _("Date only:"));
+
 	show_config (prefs);
 	/* FIXME: weakref? */
 	setup_changes (prefs);
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.glade b/calendar/gui/dialogs/cal-prefs-dialog.glade
index 9f2617d..57c17c1 100644
--- a/calendar/gui/dialogs/cal-prefs-dialog.glade
+++ b/calendar/gui/dialogs/cal-prefs-dialog.glade
@@ -1024,6 +1024,85 @@ Days</property>
                 <property name="position">3</property>
               </packing>
             </child>
+
+	    <child>
+	      <widget class="GtkLabel" id="label65">
+		<property name="visible">True</property>
+		<property name="label" translatable="yes">&lt;span weight=&quot;bold&quot;&gt;Date/Time Format&lt;/span&gt;</property>
+		<property name="use_underline">False</property>
+		<property name="use_markup">True</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>
+	      </widget>
+	      <packing>
+		<property name="padding">0</property>
+		<property name="expand">False</property>
+		<property name="fill">False</property>
+	      </packing>
+	    </child>
+
+	    <child>
+	      <widget class="GtkHBox" id="hbox27">
+		<property name="visible">True</property>
+		<property name="homogeneous">False</property>
+		<property name="spacing">12</property>
+
+		<child>
+		  <widget class="GtkLabel" id="label66">
+		    <property name="visible">True</property>
+		    <property name="label" translatable="yes"></property>
+		    <property name="use_underline">False</property>
+		    <property name="use_markup">False</property>
+		    <property name="justify">GTK_JUSTIFY_LEFT</property>
+		    <property name="wrap">False</property>
+		    <property name="selectable">False</property>
+		    <property name="xalign">0.5</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>
+		  </widget>
+		  <packing>
+		    <property name="padding">0</property>
+		    <property name="expand">False</property>
+		    <property name="fill">False</property>
+		  </packing>
+		</child>
+
+		<child>
+		  <widget class="GtkTable" id="datetime_format_table">
+                    <property name="visible">True</property>
+                    <property name="n_rows">1</property>
+                    <property name="n_columns">3</property>
+                    <property name="homogeneous">False</property>
+                    <property name="row_spacing">0</property>
+                    <property name="column_spacing">0</property>
+		  </widget>
+		  <packing>
+		    <property name="padding">0</property>
+		    <property name="expand">True</property>
+		    <property name="fill">True</property>
+		  </packing>
+	        </child>
+	      </widget>
+	      <packing>
+		<property name="padding">0</property>
+		<property name="expand">True</property>
+		<property name="fill">True</property>
+	      </packing>
+	    </child>
           </widget>
           <packing>
             <property name="position">1</property>
diff --git a/calendar/gui/e-cal-list-view.c b/calendar/gui/e-cal-list-view.c
index f62db91..73cea92 100644
--- a/calendar/gui/e-cal-list-view.c
+++ b/calendar/gui/e-cal-list-view.c
@@ -40,6 +40,7 @@
 #include <table/e-cell-toggle.h>
 #include <table/e-cell-text.h>
 #include <table/e-cell-combo.h>
+#include <table/e-cell-date.h>
 #include <misc/e-popup-menu.h>
 #include <misc/e-cell-date-edit.h>
 #include <e-util/e-categories-config.h>
@@ -256,6 +257,11 @@ setup_e_table (ECalListView *cal_list_view)
 	e_table_extras_add_compare (extras, "date-compare",
 				    date_compare_cb);
 
+
+	/* set proper format component for a default 'date' cell renderer */
+	cell = e_table_extras_get_cell (extras, "date");
+	e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar");
+
 	/* Create table view */
 
 	etspecfile = g_build_filename (EVOLUTION_ETSPECDIR,
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
index 9eb53d9..e40d15a 100644
--- a/calendar/gui/e-calendar-table.c
+++ b/calendar/gui/e-calendar-table.c
@@ -42,6 +42,7 @@
 #include <table/e-cell-toggle.h>
 #include <table/e-cell-text.h>
 #include <table/e-cell-combo.h>
+#include <table/e-cell-date.h>
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-util-private.h>
 #include <misc/e-cell-date-edit.h>
@@ -689,6 +690,10 @@ e_calendar_table_init (ECalendarTable *cal_table)
 	e_table_extras_add_pixbuf(extras, "complete", pixbuf);
 	g_object_unref(pixbuf);
 
+	/* set proper format component for a default 'date' cell renderer */
+	cell = e_table_extras_get_cell (extras, "date");
+	e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar");
+
 	/* Create the table */
 
 	etspecfile = g_build_filename (EVOLUTION_ETSPECDIR,
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 8cab14b..d93fc38 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -33,6 +33,7 @@
 #include <libedataserver/e-time-utils.h>
 #include <e-util/e-util.h>
 #include <e-util/e-error.h>
+#include <e-util/e-datetime-format.h>
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-icon-factory.h>
 #include <libecal/e-cal-time-util.h>
@@ -2225,16 +2226,11 @@ tooltip_grab (GtkWidget *tooltip, GdkEventKey *event, ECalendarView *view)
 static gchar *
 get_label (struct icaltimetype *tt, icaltimezone *f_zone, icaltimezone *t_zone)
 {
-        gchar buffer[1000];
         struct tm tmp_tm;
 
 	tmp_tm = icaltimetype_to_tm_with_zone (tt, f_zone, t_zone);
-        e_time_format_date_and_time (&tmp_tm,
-                                     calendar_config_get_24_hour_format (),
-                                     FALSE, FALSE,
-                                     buffer, 1000);
 
-        return g_strdup (buffer);
+	return e_datetime_format_format_tm ("calendar", "table", DTFormatKindDateTime, &tmp_tm);
 }
 
 void
diff --git a/calendar/gui/e-cell-date-edit-text.c b/calendar/gui/e-cell-date-edit-text.c
index efe251a..44880f0 100644
--- a/calendar/gui/e-cell-date-edit-text.c
+++ b/calendar/gui/e-cell-date-edit-text.c
@@ -33,6 +33,7 @@
 #include <libedataserver/e-time-utils.h>
 #include <libedataserver/e-data-server-util.h>
 #include <e-util/e-util.h>
+#include <e-util/e-datetime-format.h>
 #include <libecal/e-cal-time-util.h>
 
 #include "e-cell-date-edit-text.h"
@@ -65,7 +66,6 @@ ecd_get_text (ECellText *cell, ETableModel *model, gint col, gint row)
 	ECellDateEditText *ecd = E_CELL_DATE_EDIT_TEXT (cell);
 	ECellDateEditValue *dv = e_table_model_value_at (model, col, row);
 	struct tm tmp_tm;
-	gchar buffer[64];
 
 	if (!dv)
 		return g_strdup ("");
@@ -76,10 +76,7 @@ ecd_get_text (ECellText *cell, ETableModel *model, gint col, gint row)
 	   it will be set to the current timezone. See set_value(). */
 	tmp_tm = icaltimetype_to_tm_with_zone (&dv->tt, dv->zone, ecd->zone);
 
-	e_time_format_date_and_time (&tmp_tm, ecd->use_24_hour_format,
-				     !dv->tt.is_date, FALSE,
-				     buffer, sizeof (buffer));
-	return g_strdup (buffer);
+	return e_datetime_format_format_tm ("calendar", "table", dv->tt.is_date ? DTFormatKindDate : DTFormatKindDateTime, &tmp_tm);
 }
 
 
diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c
index ea03097..57319e1 100644
--- a/calendar/gui/e-memo-table.c
+++ b/calendar/gui/e-memo-table.c
@@ -41,6 +41,7 @@
 #include <table/e-cell-toggle.h>
 #include <table/e-cell-text.h>
 #include <table/e-cell-combo.h>
+#include <table/e-cell-date.h>
 #include <e-util/e-dialog-utils.h>
 #include <widgets/misc/e-cell-date-edit.h>
 #include <widgets/misc/e-cell-percent.h>
@@ -257,6 +258,10 @@ e_memo_table_init (EMemoTable *memo_table)
 	e_table_extras_add_cell(extras, "icon", cell);
 	e_table_extras_add_pixbuf(extras, "icon", icon_pixbufs[0]);
 
+	/* set proper format component for a default 'date' cell renderer */
+	cell = e_table_extras_get_cell (extras, "date");
+	e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar");
+
 	/* Create the table */
 
 	etspecfile = g_build_filename (EVOLUTION_ETSPECDIR,
diff --git a/e-util/Makefile.am b/e-util/Makefile.am
index f85644b..0787252 100644
--- a/e-util/Makefile.am
+++ b/e-util/Makefile.am
@@ -46,6 +46,7 @@ eutilinclude_HEADERS = 				\
 	e-config.h				\
 	e-corba-utils.h				\
 	e-cursor.h				\
+	e-datetime-format.h			\
 	e-dialog-utils.h			\
 	e-dialog-widgets.h			\
 	e-error.h				\
@@ -86,6 +87,7 @@ libeutil_la_SOURCES =				\
 	e-config.c				\
 	e-corba-utils.c				\
 	e-cursor.c				\
+	e-datetime-format.c			\
 	e-dialog-utils.c			\
 	e-dialog-widgets.c			\
 	e-error.c				\
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index 3a75bfb..3aac5fe 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -63,6 +63,7 @@
 #include <e-util/e-util-private.h>
 
 #include <libedataserver/e-msgport.h>
+#include "e-util/e-datetime-format.h"
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-icon-factory.h>
 
@@ -82,16 +83,6 @@
 #include "widgets/misc/e-attachment-button.h"
 #include "widgets/misc/e-attachment-view.h"
 
-#ifdef G_OS_WIN32
-/* Undefine the similar macro from <pthread.h>,it doesn't check if
- * localtime() returns NULL.
- */
-#undef localtime_r
-
-/* The localtime() in Microsoft's C library is MT-safe */
-#define localtime_r(tp,tmp) (localtime(tp)?(*(tmp)=*localtime(tp),(tmp)):0)
-#endif
-
 #define d(x)
 
 struct _EMFormatHTMLDisplayPrivate {
@@ -954,9 +945,7 @@ static void efhd_message_prefix(EMFormat *emf, CamelStream *stream, CamelMimePar
 {
 	const gchar *flag, *comp, *due;
 	time_t date;
-	gchar due_date[128];
-	struct tm due_tm;
-	gchar *iconpath;
+	gchar *iconpath, *due_date_str;
 
 	if (emf->folder == NULL || emf->uid == NULL
 	    || (flag = camel_folder_get_message_user_tag(emf->folder, emf->uid, "follow-up")) == NULL
@@ -987,10 +976,10 @@ static void efhd_message_prefix(EMFormat *emf, CamelStream *stream, CamelMimePar
 	camel_stream_printf(stream, "<td align=\"left\" width=\"100%%\">");
 
 	if (comp && comp[0]) {
-		date = camel_header_decode_date(comp, NULL);
-		localtime_r(&date, &due_tm);
-		e_utf8_strftime_fix_am_pm(due_date, sizeof (due_date), _("Completed on %B %d, %Y, %l:%M %p"), &due_tm);
-		camel_stream_printf(stream, "%s, %s", flag, due_date);
+		date = camel_header_decode_date (comp, NULL);
+		due_date_str = e_datetime_format_format ("mail", "header", DTFormatKindDateTime, date);
+		camel_stream_printf (stream, "%s, %s %s", flag, _("Completed on"), due_date_str ? due_date_str : "???");
+		g_free (due_date_str);
 	} else if ((due = camel_folder_get_message_user_tag(emf->folder, emf->uid, "due-by")) != NULL && due[0]) {
 		time_t now;
 
@@ -999,9 +988,9 @@ static void efhd_message_prefix(EMFormat *emf, CamelStream *stream, CamelMimePar
 		if (now > date)
 			camel_stream_printf(stream, "<b>%s</b>&nbsp;", _("Overdue:"));
 
-		localtime_r(&date, &due_tm);
-		e_utf8_strftime_fix_am_pm(due_date, sizeof (due_date), _("by %B %d, %Y, %l:%M %p"), &due_tm);
-		camel_stream_printf(stream, "%s %s", flag, due_date);
+		due_date_str = e_datetime_format_format ("mail", "header", DTFormatKindDateTime, date);
+		/* To Translators: the "by" is part of the string, like "Follow-up by Tuesday, January 13, 2009" */
+		camel_stream_printf (stream, "%s %s %s", flag, _("by"), due_date_str ? due_date_str : "???");
 	} else {
 		camel_stream_printf(stream, "%s", flag);
 	}
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 76ab642..52bc6a1 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -43,6 +43,7 @@
 
 #include <libedataserver/e-data-server-util.h>	/* for e_utf8_strftime, what about e_time_format_time? */
 #include <libedataserver/e-time-utils.h>
+#include "e-util/e-datetime-format.h"
 #include "e-util/e-icon-factory.h"
 #include "e-util/e-util-private.h"
 #include "e-util/e-util.h"
@@ -1753,14 +1754,16 @@ efh_format_header(EMFormat *emf, CamelStream *stream, CamelMedium *part, struct
 		gint msg_offset, local_tz;
 		time_t msg_date;
 		struct tm local;
+		gchar *date_str;
 
 		txt = header->value;
 		while (*txt == ' ' || *txt == '\t')
 			txt++;
 
-		/* Show the local timezone equivalent in brackets if the sender is remote */
 		msg_date = camel_header_decode_date(txt, &msg_offset);
-		e_localtime_with_offset(msg_date, &local, &local_tz);
+		e_localtime_with_offset (msg_date, &local, &local_tz);
+
+		date_str = e_datetime_format_format ("mail", "header", DTFormatKindDateTime, msg_date);
 
 		/* Convert message offset to minutes (e.g. -0400 --> -240) */
 		msg_offset = ((msg_offset / 100) * 60) + (msg_offset % 100);
@@ -1768,25 +1771,18 @@ efh_format_header(EMFormat *emf, CamelStream *stream, CamelMedium *part, struct
 		msg_offset -= local_tz / 60;
 
 		if (msg_offset) {
-			gchar buf[256], *html;
-
-			msg_offset += (local.tm_hour * 60) + local.tm_min;
-			if (msg_offset >= (24 * 60) || msg_offset < 0) {
-				/* translators: strftime format for local time equivalent in Date header display, with day */
-				gchar *msg = g_strdup_printf("<I>%s</I>", _(" (%a, %R %Z)"));
-				e_utf8_strftime(buf, sizeof(buf), msg, &local);
-				g_free(msg);
-			} else {
-				/* translators: strftime format for local time equivalent in Date header display, without day */
-				gchar *msg = g_strdup_printf("<I>%s</I>", _(" (%R %Z)"));
-				e_utf8_strftime(buf, sizeof(buf), msg, &local);
-				g_free(msg);
-			}
+			gchar *html;
+
+			html = camel_text_to_html (txt, efh->text_html_flags, 0);
+			txt = value = g_strdup_printf ("%s (<I>%s</I>)", date_str, html);
+
+			g_free (html);
+			g_free (date_str);
 
-			html = camel_text_to_html(txt, efh->text_html_flags, 0);
-			txt = value = g_strdup_printf("%s %s", html, buf);
-			g_free(html);
 			flags |= EM_FORMAT_HTML_HEADER_HTML;
+		} else {
+			/* date_str will be freed at the end */
+			txt = value = date_str;
 		}
 
 		flags |= EM_FORMAT_HEADER_BOLD;
diff --git a/mail/em-mailer-prefs.c b/mail/em-mailer-prefs.c
index a76af74..fe6a58b 100644
--- a/mail/em-mailer-prefs.c
+++ b/mail/em-mailer-prefs.c
@@ -41,6 +41,7 @@
 
 #include "libedataserverui/e-cell-renderer-color.h"
 
+#include "e-util/e-datetime-format.h"
 #include "e-util/e-util-private.h"
 #include "e-util/e-util-labels.h"
 
@@ -1152,7 +1153,7 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs)
 {
 	GSList *header_config_list, *header_add_list, *p;
 	GHashTable *default_header_hash;
-	GtkWidget *toplevel;
+	GtkWidget *toplevel, *table;
 	GtkTreeSelection *selection;
 	GtkCellRenderer *renderer;
 	GtkTreeIter iter;
@@ -1454,6 +1455,11 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs)
 
 	g_slist_free (header_add_list);
 
+	/* date/time format */
+	table = glade_xml_get_widget (gui, "datetime_format_table");
+	e_datetime_format_add_setup_widget (table, 0, "mail", "header", DTFormatKindDateTime, _("Date header:"));
+	e_datetime_format_add_setup_widget (table, 1, "mail", "table",  DTFormatKindDateTime, _("Table column:"));
+
 	/* Junk prefs */
 	prefs->check_incoming = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkCheckIncomingMail"));
 	toggle_button_init (prefs, prefs->check_incoming, FALSE,
diff --git a/mail/mail-config.glade b/mail/mail-config.glade
index f435b95..e7dccf9 100644
--- a/mail/mail-config.glade
+++ b/mail/mail-config.glade
@@ -6408,6 +6408,99 @@ b</property>
 	      <property name="fill">True</property>
 	    </packing>
 	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox210">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label591">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;span weight=&quot;bold&quot;&gt;Date/Time Format&lt;/span&gt;</property>
+		  <property name="use_underline">True</property>
+		  <property name="use_markup">True</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="mnemonic_widget">txtHeaders</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>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox245">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label592">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">6</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>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkTable" id="datetime_format_table">
+		      <property name="visible">True</property>
+		      <property name="n_rows">1</property>
+		      <property name="n_columns">3</property>
+		      <property name="homogeneous">False</property>
+		      <property name="row_spacing">0</property>
+		      <property name="column_spacing">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
 	</widget>
 	<packing>
 	  <property name="tab_expand">False</property>
diff --git a/mail/message-list.c b/mail/message-list.c
index 2d5b34a..8a4ea30 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -1730,7 +1730,8 @@ static ECell * create_composite_cell (gint col)
 		images [i] = states_pixmaps [i + 6].pixbuf;
 	cell_attach = e_cell_toggle_new (0, 2, images);
 
-	cell_date = e_cell_date_new(NULL, GTK_JUSTIFY_RIGHT);
+	cell_date = e_cell_date_new (NULL, GTK_JUSTIFY_RIGHT);
+	e_cell_date_set_format_component (E_CELL_DATE (cell_date), "mail");
 	g_object_set (G_OBJECT (cell_date),
 		      "bold_column", COL_UNREAD,
 		      "color_column", COL_COLOUR,
@@ -1813,6 +1814,7 @@ message_list_create_extras (void)
 
 	/* date cell */
 	cell = e_cell_date_new (NULL, GTK_JUSTIFY_LEFT);
+	e_cell_date_set_format_component (E_CELL_DATE (cell), "mail");
 	g_object_set (G_OBJECT (cell),
 		      "bold_column", COL_UNREAD,
 		      "color_column", COL_COLOUR,
@@ -1846,6 +1848,10 @@ message_list_create_extras (void)
 	cell = create_composite_cell (COL_TO);
 	e_table_extras_add_cell (extras, "render_composite_to", cell);
 
+	/* set proper format component for a default 'date' cell renderer */
+	cell = e_table_extras_get_cell (extras, "date");
+	e_cell_date_set_format_component (E_CELL_DATE (cell), "mail");
+
 	return extras;
 }
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b7a5c19..b0602f9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -179,6 +179,7 @@ composer/mail-composer.error.xml
 data/evolution.desktop.in.in
 data/evolution.keys.in.in
 e-util/e-categories-config.c
+e-util/e-datetime-format.c
 e-util/e-dialog-utils.c
 e-util/e-error.c
 e-util/e-logger.c
diff --git a/widgets/table/e-cell-date.c b/widgets/table/e-cell-date.c
index 6e95a1f..a3989dc 100644
--- a/widgets/table/e-cell-date.c
+++ b/widgets/table/e-cell-date.c
@@ -29,85 +29,29 @@
 
 #include <glib/gi18n.h>
 #include "e-util/e-util.h"
+#include "e-util/e-datetime-format.h"
 #include "misc/e-unicode.h"
 
 #include "e-cell-date.h"
 
 G_DEFINE_TYPE (ECellDate, e_cell_date, E_CELL_TEXT_TYPE)
 
-#ifdef G_OS_WIN32
-/* The localtime() in Microsoft's C library *is* thread-safe */
-#define localtime_r(timep, result)  (localtime (timep) ? memcpy ((result), localtime (timep), sizeof (*(result))) : 0)
-#endif
-
 static gchar *
 ecd_get_text(ECellText *cell, ETableModel *model, gint col, gint row)
 {
 	time_t date = GPOINTER_TO_INT (e_table_model_value_at(model, col, row));
-	time_t nowdate = time(NULL);
-	time_t yesdate;
-	struct tm then, now, yesterday;
-	gchar buf[100];
-	gchar *temp;
-	gboolean done = FALSE;
+	const gchar *fmt_component, *fmt_part = NULL;
 
 	if (date == 0) {
 		return g_strdup (_("?"));
 	}
 
-	tzset ();
-	localtime_r (&date, &then);
-	localtime_r (&nowdate, &now);
-
-	if (nowdate - date < 60 * 60 * 8 && nowdate > date) {
-		e_utf8_strftime_fix_am_pm (buf, 100, _("%l:%M %p"), &then);
-		done = TRUE;
-	}
-
-	if (!done) {
-		if (then.tm_mday == now.tm_mday &&
-		    then.tm_mon == now.tm_mon &&
-		    then.tm_year == now.tm_year) {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("Today %l:%M %p"), &then);
-			done = TRUE;
-		}
-	}
-	if (!done) {
-		yesdate = nowdate - 60 * 60 * 24;
-		localtime_r (&yesdate, &yesterday);
-		if (then.tm_mday == yesterday.tm_mday &&
-		    then.tm_mon == yesterday.tm_mon &&
-		    then.tm_year == yesterday.tm_year) {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("Yesterday %l:%M %p"), &then);
-			done = TRUE;
-		}
-	}
-	if (!done) {
-		gint i;
-		for (i = 2; i < 7; i++) {
-			yesdate = nowdate - 60 * 60 * 24 * i;
-			localtime_r (&yesdate, &yesterday);
-			if (then.tm_mday == yesterday.tm_mday &&
-			    then.tm_mon == yesterday.tm_mon &&
-			    then.tm_year == yesterday.tm_year) {
-				e_utf8_strftime_fix_am_pm (buf, 100, _("%a %l:%M %p"), &then);
-				done = TRUE;
-				break;
-			}
-		}
-	}
-	if (!done) {
-		if (then.tm_year == now.tm_year) {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("%b %d %l:%M %p"), &then);
-		} else {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("%b %d %Y"), &then);
-		}
-	}
-	temp = buf;
-	while ((temp = strstr (temp, "  "))) {
-		memmove (temp, temp + 1, strlen (temp));
-	}
-	return g_strstrip (g_strdup (buf));
+	fmt_component = g_object_get_data ((GObject *) cell, "fmt-component");
+	if (!fmt_component || !*fmt_component)
+		fmt_component = "Default";
+	else
+		fmt_part = "table";
+	return e_datetime_format_format (fmt_component, fmt_part, DTFormatKindDateTime, date);
 }
 
 static void
@@ -165,3 +109,10 @@ e_cell_date_new (const gchar *fontname, GtkJustification justify)
 	return (ECell *) ecd;
 }
 
+void
+e_cell_date_set_format_component (ECellDate *ecd, const gchar *fmt_component)
+{
+	g_return_if_fail (ecd != NULL);
+
+	g_object_set_data_full ((GObject *)ecd, "fmt-component", g_strdup (fmt_component), g_free);
+}
diff --git a/widgets/table/e-cell-date.h b/widgets/table/e-cell-date.h
index 968e387..ec23bd6 100644
--- a/widgets/table/e-cell-date.h
+++ b/widgets/table/e-cell-date.h
@@ -44,6 +44,7 @@ typedef struct {
 
 GType      e_cell_date_get_type (void);
 ECell     *e_cell_date_new      (const gchar *fontname, GtkJustification justify);
+void       e_cell_date_set_format_component (ECellDate *ecd, const gchar *fmt_component);
 
 G_END_DECLS
 
