diff --git a/data/gnome-shell.schemas b/data/gnome-shell.schemas
index 8e5c91f..d9c838f 100644
--- a/data/gnome-shell.schemas
+++ b/data/gnome-shell.schemas
@@ -438,6 +438,20 @@
         </locale>
       </schema>
 
+      <!-- Calendar -->
+      <schema>
+        <key>/schemas/desktop/gnome/shell/calendar/enable_weekdate</key>
+          <applyto>/desktop/gnome/shell/calendar/enable_weekdate</applyto>
+          <owner>gnome-shell</owner>
+          <type>bool</type>
+          <default>false</default>
+          <locale name="C">
+            <short>Show the week date in the calendar</short>
+            <long>
+              Determines whether to or not to display the ISO week date in the calendar.
+            </long>
+          </locale>
+      </schema>
   </schemalist>
 
 </gconfschemafile>
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index 93cb4b3..d618fa5 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -899,6 +899,10 @@ StTooltip {
     padding: 0px 4px 2px 0px;
 }
 
+.calendar-calendarweek {
+    color: #666666;
+}
+
 /* App Switcher */
 #altTabPopup {
     padding: 8px;
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
index 8122e50..09fc712 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -3,10 +3,17 @@
 const Clutter = imports.gi.Clutter;
 const Lang = imports.lang;
 const St = imports.gi.St;
-
+const Pango = imports.gi.Pango;
+const Shell = imports.gi.Shell;
 const Gettext_gtk20 = imports.gettext.domain('gtk20');
 
+const GConf = Shell.GConf.get_default()
+
 const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
+const MSECS_IN_WEEK = MSECS_IN_DAY * 7;
+const WEEKDATE_HEADER_WIDTH_MULTIPLICATOR = 3;
+
+const GCONF_ENABLE_WEEKDATE_KEY = "calendar/enable_weekdate";
 
 function _sameDay(dateA, dateB) {
     return (dateA.getDate() == dateB.getDate() &&
@@ -14,6 +21,24 @@ function _sameDay(dateA, dateB) {
             dateA.getYear() == dateB.getYear());
 }
 
+function _getCalendarWeekForDate(date) {
+    let startOfYear = new Date(date.getFullYear(), 0, 1);
+    let sday = startOfYear.getDay();
+    let offset = 4 + (7 * Math.floor(sday * (1/5))) - sday;
+    let firstThursday = new Date(date.getFullYear(), 0, 1 + offset);
+    let weekOfYear = Math.ceil((date.getTime() - firstThursday.getTime()) / MSECS_IN_WEEK);
+    return weekOfYear;
+}
+
+function _getDigitWidth(actor){
+    let context = actor.get_pango_context();
+    let themeNode = actor.get_theme_node();
+    let font = themeNode.get_font();
+    let metrics = context.get_metrics(font, context.get_language());
+    let width = metrics.get_approximate_digit_width();
+    return width;
+}
+
 function Calendar() {
     this._init();
 }
@@ -24,27 +49,33 @@ Calendar.prototype = {
         // GTK+ by preference uses nl_langinfo (NL_TIME_FIRST_WEEKDAY). We probably
         // should add a C function so we can do the full handling.
         this._weekStart = NaN;
-        let weekStartString = Gettext_gtk20.gettext('calendar:week_start:0');
-        if (weekStartString.indexOf('calendar:week_start:') == 0) {
+        this._weekdate = NaN;
+        this._digitWidth != NaN
+
+        GConf.connect('changed', Lang.bind(this, this._onSettingsChange))
+        this._useWeekdate = GConf.get_boolean(GCONF_ENABLE_WEEKDATE_KEY);
+
+        let weekStartString = Gettext_gtk20.gettext("calendar:week_start:0");
+        if (weekStartString.indexOf("calendar:week_start:") == 0) {
             this._weekStart = parseInt(weekStartString.substring(20));
         }
 
         if (isNaN(this._weekStart) || this._weekStart < 0 || this._weekStart > 6) {
-            log('Translation of "calendar:week_start:0" in GTK+ is not correct');
+            log("Translation of 'calendar:week_start:0' in GTK+ is not correct");
             this._weekStart = 0;
         }
 
         // Find the ordering for month/year in the calendar heading
-        switch (Gettext_gtk20.gettext('calendar:MY')) {
-        case 'calendar:MY':
-            this._headerFormat = '%B %Y';
+        switch (Gettext_gtk20.gettext("calendar:MY")) {
+        case "calendar:MY":
+            this._headerFormat = "%B %Y";
             break;
-        case 'calendar:YM':
-            this._headerFormat = '%Y %B';
+        case "calendar:YM":
+            this._headerFormat = "%Y %B";
             break;
         default:
-            log('Translation of "calendar:MY" in GTK+ is not correct');
-            this._headerFormat = '%B %Y';
+            log("Translation of 'calendar:MY' in GTK+ is not correct");
+            this._headerFormat = "%B %Y";
             break;
         }
 
@@ -52,32 +83,44 @@ Calendar.prototype = {
         this.date = new Date();
 
         this.actor = new St.Table({ homogeneous: false,
-                                    style_class: 'calendar',
+                                    style_class: "calendar",
                                     reactive: true });
-
         this.actor.connect('scroll-event',
                            Lang.bind(this, this._onScroll));
 
+        this._buildHeader ();
+        this._update();
+    },
+
+    // Sets the calendar to show a specific date
+    setDate: function(date) {
+        if (!_sameDay(date, this.date)) {
+            this.date = date;
+            this._update();
+        }
+    },
+
+    _buildHeader: function() {
         // Top line of the calendar '<| September 2009 |>'
         this._topBox = new St.BoxLayout();
         this.actor.add(this._topBox,
-                       { row: 0, col: 0, col_span: 7 });
+                       { row: 0, col: 0, col_span: 7 + this._useWeekdate });
 
-        let [backlabel, forwardlabel] = ['&lt;', '&gt;'];
+        let [backlabel, forwardlabel] = ["&lt;", "&gt;"];
         if (St.Widget.get_default_direction () == St.TextDirection.RTL) {
             [backlabel, forwardlabel] = [forwardlabel, backlabel];
         }
 
         let back = new St.Button({ label: backlabel, style_class: 'calendar-change-month'  });
         this._topBox.add(back);
-        back.connect('clicked', Lang.bind(this, this._prevMonth));
+        back.connect("clicked", Lang.bind(this, this._prevMonth));
 
         this._dateLabel = new St.Label();
         this._topBox.add(this._dateLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE });
 
         let forward = new St.Button({ label: forwardlabel, style_class: 'calendar-change-month' });
         this._topBox.add(forward);
-        forward.connect('clicked', Lang.bind(this, this._nextMonth));
+        forward.connect("clicked", Lang.bind(this, this._nextMonth));
 
         // We need to figure out the abbreviated localized names for the days of the week;
         // we do this by just getting the next 7 days starting from right now and then putting
@@ -85,26 +128,43 @@ Calendar.prototype = {
         let iter = new Date(this.date);
         iter.setSeconds(0); // Leap second protection. Hah!
         iter.setHours(12);
+
+        if (this._useWeekdate) {
+            this.actor.connect('realize', Lang.bind(this, this._onStyleChange));
+            this._setWeekdateHeader ();
+        } else if (this._weekdateHeader){
+            this._weekdateHeader.destroy()
+            this._weekdateHeader = null;
+        }
+
         for (let i = 0; i < 7; i++) {
-            this.actor.add(new St.Label({ text: iter.toLocaleFormat('%a') }),
+            this.actor.add(new St.Label({ text: iter.toLocaleFormat("%a") }),
                            { row: 1,
-                             col: (7 + iter.getDay() - this._weekStart) % 7,
+                             col: this._useWeekdate + (7 + iter.getDay() - this._weekStart) % 7,
                              x_fill: false, x_align: St.Align.END });
             iter.setTime(iter.getTime() + MSECS_IN_DAY);
         }
 
         // All the children after this are days, and get removed when we update the calendar
         this._firstDayIndex = this.actor.get_children().length;
+    },
 
-        this._update();
+    _onStyleChange: function(actor, event) {
+        // width of a digit in pango units
+        this._digitWidth = _getDigitWidth(this.actor) / Pango.SCALE;
+        this._setWeekdateHeader();
     },
 
-    // Sets the calendar to show a specific date
-    setDate: function(date) {
-        if (!_sameDay(date, this.date)) {
-            this.date = date;
-            this._update();
-        }
+    _setWeekdateHeader: function() {
+        let weekdateHeader = this._weekdateHeader || new St.Label();
+        if (this._digitWidth) {
+            weekdateHeader.set_width (this._digitWidth * WEEKDATE_HEADER_WIDTH_MULTIPLICATOR);
+        } 
+        this.actor.add(weekdateHeader,
+                          { row: 1,
+                            col: 0,
+                            x_fill: false, x_align: St.Align.MIDDLE });
+        this._weekdateHeader = weekdateHeader;
     },
 
     _onScroll : function(actor, event) {
@@ -116,7 +176,7 @@ Calendar.prototype = {
         case Clutter.ScrollDirection.DOWN:
         case Clutter.ScrollDirection.RIGHT:
             this._nextMonth();
-            break;
+;            break;
         }
     },
 
@@ -140,6 +200,16 @@ Calendar.prototype = {
         this._update();
     },
 
+    _onSettingsChange: function() {
+        let children = this.actor.get_children();
+        for (let i = 0; i < children.length; i++)
+            children[i].destroy();        
+        
+        this._useWeekdate = GConf.get_boolean(GCONF_ENABLE_WEEKDATE_KEY);
+        this._buildHeader();
+        this._update();
+    },
+
     _update: function() {
         this._dateLabel.text = this.date.toLocaleFormat(this._headerFormat);
 
@@ -161,14 +231,22 @@ Calendar.prototype = {
         while (true) {
             let label = new St.Label({ text: iter.getDate().toString() });
             if (_sameDay(now, iter))
-                label.style_class = 'calendar-day calendar-today';
+                label.style_class = "calendar-day calendar-today";
             else if (iter.getMonth() != this.date.getMonth())
-                label.style_class = 'calendar-day calendar-other-month-day';
+                label.style_class = "calendar-day calendar-other-month-day";
             else
-                label.style_class = 'calendar-day';
+                label.style_class = "calendar-day";
             this.actor.add(label,
-                           { row: row, col: (7 + iter.getDay() - this._weekStart) % 7,
+                           { row: row, col: this._useWeekdate + (7 + iter.getDay() - this._weekStart) % 7,
                              x_fill: false, x_align: St.Align.END });
+                
+            if (this._useWeekdate && iter.getDay() == 4) {
+                let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
+                                           style_class: "calendar-day calendar-calendarweek"});
+                this.actor.add(label,
+                              { row: row, col: 0,
+		                        x_fill: false, x_align: St.Align.MIDDLE });
+            }
 
             iter.setTime(iter.getTime() + MSECS_IN_DAY);
             if (iter.getDay() == this._weekStart) {
