diff -u -r plasmaclock.orig/calendar.cpp plasmaclock.new/calendar.cpp
--- plasmaclock.orig/calendar.cpp	2013-08-02 19:27:11.998467964 +0800
+++ plasmaclock.new/calendar.cpp	2013-08-02 19:27:48.262647789 +0800
@@ -85,7 +85,7 @@
         {
         }
 
-        void init(const QDate &date = QDate());
+        void init(KConfigGroup *mycg, const QDate &date = QDate());
         void refreshWidgets();
         bool addDateDetailsToDisplay(QString &html, const QDate &date, bool showNoEventsMsg = false);
         void popupMonthsMenu();
@@ -110,18 +110,18 @@
         QGraphicsLinearLayout *layout;
 };
 
-Calendar::Calendar(const QDate &date, QGraphicsWidget *parent)
+Calendar::Calendar(KConfigGroup *mycg, const QDate &date, QGraphicsWidget *parent)
     : QGraphicsWidget(parent),
       d(new CalendarPrivate(this))
 {
-    d->init(date);
+    d->init(mycg, date);
 }
 
-Calendar::Calendar(QGraphicsWidget *parent)
+Calendar::Calendar(KConfigGroup *mycg, QGraphicsWidget *parent)
     : QGraphicsWidget(parent),
       d(new CalendarPrivate(this))
 {
-    d->init();
+    d->init(mycg);
 }
 
 Calendar::~Calendar()
@@ -130,7 +130,7 @@
    delete d;
 }
 
-void CalendarPrivate::init(const QDate &initialDate)
+void CalendarPrivate::init(KConfigGroup *mycg, const QDate &initialDate)
 {
     q->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
 
@@ -139,7 +139,7 @@
     QGraphicsLinearLayout *hLayout = new QGraphicsLinearLayout(layout);
     QGraphicsLinearLayout *layoutTools = new QGraphicsLinearLayout(layout);
 
-    calendarTable = new CalendarTable(q);
+    calendarTable = new CalendarTable(mycg, q);
     calendarTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     QObject::connect(calendarTable, SIGNAL(dateChanged(QDate)), q, SLOT(dateUpdated()));
     QObject::connect(calendarTable, SIGNAL(dateHovered(QDate)), q, SIGNAL(dateHovered(QDate)));
diff -u -r plasmaclock.orig/calendar.h plasmaclock.new/calendar.h
--- plasmaclock.orig/calendar.h	2013-08-02 19:27:11.994467943 +0800
+++ plasmaclock.new/calendar.h	2013-08-02 19:27:52.402668325 +0800
@@ -43,8 +43,8 @@
     Q_OBJECT
 
 public:
-    explicit Calendar(QGraphicsWidget *parent = 0);
-    explicit Calendar(const QDate &, QGraphicsWidget *parent = 0);
+    explicit Calendar(KConfigGroup *mycg, QGraphicsWidget *parent = 0);
+    explicit Calendar(KConfigGroup *mycg, const QDate &, QGraphicsWidget *parent = 0);
     ~Calendar();
 
     CalendarTable *calendarTable() const;
diff -u -r plasmaclock.orig/calendartable.cpp plasmaclock.new/calendartable.cpp
--- plasmaclock.orig/calendartable.cpp	2013-08-02 19:27:11.998467964 +0800
+++ plasmaclock.new/calendartable.cpp	2013-08-02 19:28:02.526718527 +0800
@@ -27,6 +27,7 @@
 #include <QtCore/QTimer>
 #include <QtGui/QPainter>
 #include <QtGui/QWidget>
+#include <QtGui/QMenu>
 #include <QtGui/QGraphicsSceneWheelEvent>
 #include <QtGui/QStyleOptionGraphicsItem>
 
@@ -50,6 +51,7 @@
 #endif
 
 #include <cmath>
+#include <sstream>
 
 namespace Plasma
 {
@@ -103,6 +105,8 @@
             QObject::connect(delayedPopulationTimer, SIGNAL(timeout()), q, SLOT(populateCalendar()));
 
             setDate(initialDate);
+
+            useCustomFirstWeek = false;
         }
 
         ~CalendarTablePrivate()
@@ -392,6 +396,9 @@
         QDate viewStartDate;
         QDate viewEndDate;
 
+        bool useCustomFirstWeek;
+        QDate customFirstWeekDate;
+
         bool displayEvents;
         bool displayHolidays;
         Plasma::DataEngine *calendarDataEngine;
@@ -446,16 +453,18 @@
         QTimer *delayedPopulationTimer;
 };
 
-CalendarTable::CalendarTable(const QDate &date, QGraphicsWidget *parent)
+CalendarTable::CalendarTable(KConfigGroup *cg, const QDate &date, QGraphicsWidget *parent)
     : QGraphicsWidget(parent), d(new CalendarTablePrivate(this, date))
 {
+    mycg = cg;
     setAcceptHoverEvents(true);
     setCacheMode(QGraphicsItem::DeviceCoordinateCache);
 }
 
-CalendarTable::CalendarTable(QGraphicsWidget *parent)
+CalendarTable::CalendarTable(KConfigGroup *cg, QGraphicsWidget *parent)
     : QGraphicsWidget(parent), d(new CalendarTablePrivate(this))
 {
+    mycg = cg;
     setAcceptHoverEvents(true);
     setCacheMode(QGraphicsItem::DeviceCoordinateCache);
 }
@@ -883,8 +892,30 @@
     update();
 }
 
+void CalendarTable::SetCustomFirstWeek()
+{
+    int row = d->yToRow(d->lastSeenMousePos.y());
+    d->customFirstWeekDate = d->dateFromRowColumn(row, 0);
+    d->useCustomFirstWeek = true;
+    mycg->writeEntry("useCustomFirstWeek", true);
+    mycg->writeEntry("customFirstWeekDate", d->customFirstWeekDate);
+    update();
+}
+
+void CalendarTable::CancelCustomFirstWeek()
+{
+    d->useCustomFirstWeek = false;
+    mycg->writeEntry("useCustomFirstWeek", false);
+    update();
+}
+
 void CalendarTable::applyConfiguration(KConfigGroup cg)
 {
+    d->useCustomFirstWeek = cg.readEntry("useCustomFirstWeek", false);
+    if (d->useCustomFirstWeek) {
+        d->customFirstWeekDate = cg.readEntry("customFirstWeekDate", QDate());
+    }
+
     setCalendar(cg.readEntry("calendarType", "locale"));
     const bool holidays = cg.readEntry("displayHolidays", true);
     clearHolidaysRegions();
@@ -1001,9 +1032,28 @@
     d->lastSeenMousePos = event->pos();
 
     event->accept();
-    QDate date = d->dateFromPoint(event->pos());
-    setDate(date);
-    emit dateSelected(date);
+
+    int weekday_w = cellX(0) - d->centeringSpace;
+    int weekday_y = cellY(0);
+    if ((event->pos().x() < weekday_w) && (event->pos().y() > weekday_y)) {
+        QMenu *menu = new QMenu();
+        QAction *Act_SetCustomFirstWeek;
+        Act_SetCustomFirstWeek = new QAction(tr("&Set this as custom first week"), this);
+        connect(Act_SetCustomFirstWeek, SIGNAL(triggered()), this, SLOT(SetCustomFirstWeek()));
+        menu->addAction(Act_SetCustomFirstWeek);
+        if (d->useCustomFirstWeek) {
+            QAction *Act_CancelCustomFirstWeek;
+            Act_CancelCustomFirstWeek = new QAction(tr("&Cancel custom first week"), this);
+            connect(Act_CancelCustomFirstWeek, SIGNAL(triggered()), this, SLOT(CancelCustomFirstWeek()));
+            menu->addAction(Act_CancelCustomFirstWeek);
+        }
+        menu->exec(QCursor::pos());
+        delete menu;
+    } else {
+        QDate date = d->dateFromPoint(event->pos());
+        setDate(date);
+        emit dateSelected(date);
+    }
 }
 
 void CalendarTable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
@@ -1227,24 +1277,49 @@
                 p->setOpacity(d->opacity);
                 QString weekString;
                 QString accurateWeekString;
-                if (calendar()->isValid(cellDate)) {
-                    weekString = calendar()->weekNumberString(cellDate);
-                    accurateWeekString = weekString;
-                    if (calendar()->dayOfWeek(cellDate) != Qt::Monday) {
-                        QDate nextWeekDate = calendar()->addDays(cellDate, d->daysInWeek);
-                        if (calendar()->isValid(nextWeekDate)) {
-                            if (layoutDirection() == Qt::RightToLeft) {
-                                accurateWeekString.prepend("/").prepend(calendar()->weekNumberString(nextWeekDate));
-                            } else {
-                                accurateWeekString.append("/").append(calendar()->weekNumberString(nextWeekDate));
-                            }
+                if (d->useCustomFirstWeek) {
+                    if (calendar()->isValid(cellDate)) {
+                        int yearNumNow;
+                        int weekNow = calendar()->week(cellDate, &yearNumNow);
+                        int yearNumCustomFirstWeek;
+                        int weekCustomFirstWeek = calendar()->week(d->customFirstWeekDate, &yearNumCustomFirstWeek);
+                        if (yearNumNow >= yearNumCustomFirstWeek) {
+                           int weeks = 0;
+                           for (int yearbetween = yearNumCustomFirstWeek; yearbetween < yearNumNow; yearbetween++) {
+                               weeks += calendar()->weeksInYear(yearbetween);
+                           }
+                           weekNow += weeks;
+                           if (weekNow >= weekCustomFirstWeek) {
+                               int weekIndex =  weekNow - weekCustomFirstWeek + 1;
+                               std::stringstream ss;
+                               ss << weekIndex;
+                               std::string str;
+                               ss >> str;
+                               accurateWeekString = QString(QString::fromLocal8Bit(str.c_str()));
+                               weekString = accurateWeekString;
+                           }
                         }
-                        // ensure that weekString is the week number that has the most amout of days in the row
-                        QDate middleWeekDate = calendar()->addDays(cellDate, floor(static_cast<float>(d->daysInWeek / 2)));
-                        if (calendar()->isValid(middleWeekDate)) {
-                            QString middleWeekString = calendar()->weekNumberString(middleWeekDate);
-                            if (weekString != middleWeekString) {
-                                weekString = middleWeekString;
+                    }
+		} else {
+                    if (calendar()->isValid(cellDate)) {
+                        weekString = calendar()->weekNumberString(cellDate);
+                        accurateWeekString = weekString;
+                        if (calendar()->dayOfWeek(cellDate) != Qt::Monday) {
+                            QDate nextWeekDate = calendar()->addDays(cellDate, d->daysInWeek);
+                            if (calendar()->isValid(nextWeekDate)) {
+                                if (layoutDirection() == Qt::RightToLeft) {
+                                    accurateWeekString.prepend("/").prepend(calendar()->weekNumberString(nextWeekDate));
+                                } else {
+                                    accurateWeekString.append("/").append(calendar()->weekNumberString(nextWeekDate));
+                                }
+                            }
+                            // ensure that weekString is the week number that has the most amout of days in the row
+                            QDate middleWeekDate = calendar()->addDays(cellDate, floor(static_cast<float>(d->daysInWeek / 2)));
+                            if (calendar()->isValid(middleWeekDate)) {
+                                QString middleWeekString = calendar()->weekNumberString(middleWeekDate);
+                                if (weekString != middleWeekString) {
+                                    weekString = middleWeekString;
+                                }
                             }
                         }
                     }
diff -u -r plasmaclock.orig/calendartable.h plasmaclock.new/calendartable.h
--- plasmaclock.orig/calendartable.h	2013-08-02 19:27:11.998467964 +0800
+++ plasmaclock.new/calendartable.h	2013-08-02 19:27:59.570703862 +0800
@@ -53,8 +53,8 @@
                     PublicHoliday = 128};
     Q_DECLARE_FLAGS(CellTypes, CellType)
 
-    explicit CalendarTable(QGraphicsWidget *parent = 0);
-    explicit CalendarTable(const QDate &, QGraphicsWidget *parent = 0);
+    explicit CalendarTable(KConfigGroup *cg, QGraphicsWidget *parent = 0);
+    explicit CalendarTable(KConfigGroup *cg, const QDate &, QGraphicsWidget *parent = 0);
     ~CalendarTable();
 
     void setCalendar(const QString &newCalendarType = "locale");
@@ -104,6 +104,8 @@
 
 public Q_SLOTS:
     void dataUpdated(const QString &source, const Plasma::DataEngine::Data &data);
+    void SetCustomFirstWeek();
+    void CancelCustomFirstWeek();
 
 protected:
     int cellX(int weekDay);
@@ -125,6 +127,7 @@
 
     friend class CalendarTablePrivate;
     CalendarTablePrivate* const d;
+    KConfigGroup *mycg;
 
     Q_PRIVATE_SLOT(d, void populateCalendar())
     Q_PRIVATE_SLOT(d, void settingsChanged(int category))
diff -u -r plasmaclock.orig/clockapplet.cpp plasmaclock.new/clockapplet.cpp
--- plasmaclock.orig/clockapplet.cpp	2013-08-02 19:27:11.994467943 +0800
+++ plasmaclock.new/clockapplet.cpp	2013-08-02 19:34:00.736494787 +0800
@@ -95,6 +95,7 @@
     int announceInterval;
     QTime lastTimeSeen;
     bool forceTzDisplay : 1;
+    KConfigGroup mycg;
 
     QDate addTzToTipText(QString &subText, const Plasma::DataEngine::Data &data, const QDate &prevDate, bool highlight)
     {
@@ -130,7 +131,8 @@
     {
         if (q->config().readEntry("ShowCalendarPopup", true)) {
             if (!calendarWidget) {
-                calendarWidget = new Plasma::Calendar();
+                mycg = q->config();
+                calendarWidget = new Plasma::Calendar(&mycg);
                 calendarWidget->setAutomaticUpdateEnabled(false);
                 calendarWidget->setMinimumSize(QSize(230, 220));
             }
