Index: src/defaults.h
===================================================================
--- src/defaults.h	(revision b2bf8e3b6bff66c0d857cedf4d142262849d0a1a)
+++ src/defaults.h	(revision 278bc7818ff0dbce80337ca38abd43ceaaf101a8)
@@ -45,5 +45,5 @@
 #endif // Q_OS_WINCE
 //! Default for "Save main window state and position"
-#define DEF_SAVEPOS false
+#define DEF_SAVEPOS true
 //! Default for "Use translucency effects in Vista/7"
 #define DEF_USE_TRANSLUCENCY true
@@ -58,4 +58,6 @@
 //! Default for "Fractional random values"
 #define DEF_FRACTIONAL_RANDOM false
+//! Default for "Symmetric tasks mode"
+#define DEF_SYMMETRIC_MODE false
 
 //////// OUTPUT
@@ -67,5 +69,5 @@
 #define DEF_SHOW_MATRIX_LIMIT 15
 //! Default for "Scroll to the end of output after solving"
-#define DEF_SCROLL_TO_END true
+#define DEF_SCROLL_TO_END false
 /*!
  * \def DEF_FONT_FAMILY
Index: src/mainwindow.cpp
===================================================================
--- src/mainwindow.cpp	(revision b2bf8e3b6bff66c0d857cedf4d142262849d0a1a)
+++ src/mainwindow.cpp	(revision 278bc7818ff0dbce80337ca38abd43ceaaf101a8)
@@ -71,4 +71,8 @@
 
 #if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
+	// Centering main window
+QRect rect = geometry();
+	rect.moveCenter(QApplication::desktop()->availableGeometry(this).center());
+	setGeometry(rect);
 	if (settings->value("SavePos", DEF_SAVEPOS).toBool()) {
 		// Loading of saved window state
@@ -77,9 +81,4 @@
 		restoreState(settings->value("State").toByteArray());
 		settings->endGroup();
-	} else {
-		// Centering main window
-QRect rect = geometry();
-		rect.moveCenter(QApplication::desktop()->availableGeometry(this).center());
-		setGeometry(rect);
 	}
 #else
@@ -500,11 +499,20 @@
 
 #ifdef Q_OS_WINCE
+void MainWindow::changeEvent(QEvent *ev)
+{
+	if ((ev->type() == QEvent::ActivationChange) && isActiveWindow())
+		desktopResized(0);
+
+	QWidget::changeEvent(ev);
+}
+
 void MainWindow::desktopResized(int screen)
 {
-	if (screen != 0)
+	if ((screen != 0) || !isActiveWindow())
 		return;
 
 QRect availableGeometry = QApplication::desktop()->availableGeometry(0);
 	if (currentGeometry != availableGeometry) {
+		QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 		/*!
 		 * \hack HACK: This hack checks whether \link QDesktopWidget::availableGeometry() availableGeometry()\endlink's \c top + \c hegiht = \link QDesktopWidget::screenGeometry() screenGeometry()\endlink's \c height.
@@ -519,6 +527,7 @@
 			setGeometry(availableGeometry);
 		}
-	}
-	currentGeometry = availableGeometry;
+		currentGeometry = availableGeometry;
+		QApplication::restoreOverrideCursor();
+	}
 }
 #endif // Q_OS_WINCE
@@ -557,14 +566,18 @@
 		return;
 	}
-	settings->setValue("NumCities", spinCities->value());
-
-	// Saving Main Window state
-	if (settings->value("SavePos", DEF_SAVEPOS).toBool()) {
-		settings->beginGroup("MainWindow");
+	if (!settings->value("SettingsReset", false).toBool()) {
+		settings->setValue("NumCities", spinCities->value());
+
+		// Saving Main Window state
+		if (settings->value("SavePos", DEF_SAVEPOS).toBool()) {
+			settings->beginGroup("MainWindow");
 #if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
-		settings->setValue("Geometry", saveGeometry());
+			settings->setValue("Geometry", saveGeometry());
 #endif // Q_OS_WINCE
-		settings->setValue("State", saveState());
-		settings->endGroup();
+			settings->setValue("State", saveState());
+			settings->endGroup();
+		}
+	} else {
+		settings->remove("SettingsReset");
 	}
 
Index: src/mainwindow.h
===================================================================
--- src/mainwindow.h	(revision b2bf8e3b6bff66c0d857cedf4d142262849d0a1a)
+++ src/mainwindow.h	(revision 278bc7818ff0dbce80337ca38abd43ceaaf101a8)
@@ -72,4 +72,5 @@
 	void dataChanged(const QModelIndex &tl, const QModelIndex &br);
 #ifdef Q_OS_WINCE
+	void changeEvent(QEvent *ev);
 	void desktopResized(int screen);
 #endif // Q_OS_WINCE
Index: src/settingsdialog.cpp
===================================================================
--- src/settingsdialog.cpp	(revision b2bf8e3b6bff66c0d857cedf4d142262849d0a1a)
+++ src/settingsdialog.cpp	(revision 278bc7818ff0dbce80337ca38abd43ceaaf101a8)
@@ -54,4 +54,6 @@
 	scrollArea->setWidgetResizable(true);
 	scrollArea->setWidget(bgWhite);
+#else
+	buttons->insertStretch(buttons->indexOf(buttonHelp) + 1);
 #endif // Q_OS_WINCE
 
@@ -146,5 +148,4 @@
 
 #ifdef Q_OS_WINCE
-	currentGeometry = QApplication::desktop()->availableGeometry(0);
 	// We need to react to SIP show/hide and resize the window appropriately
 	connect(QApplication::desktop(), SIGNAL(workAreaResized(int)), SLOT(desktopResized(int)));
@@ -153,5 +154,4 @@
 	connect(buttonFont,SIGNAL(clicked()),this,SLOT(buttonFontClicked()));
 	connect(buttonColor,SIGNAL(clicked()),this,SLOT(buttonColorClicked()));
-//	setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint);
 	setWindowFlags(windowFlags() ^ Qt::WindowContextHelpButtonHint);
 #if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
@@ -161,4 +161,5 @@
 
 	settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, "TSPSG", "tspsg", this);
+	settings->remove("SettingsReset");
 
 	cbAutosize->setChecked(settings->value("Autosize", DEF_AUTOSIZE).toBool());
@@ -173,4 +174,5 @@
 
 	settings->beginGroup("Task");
+	cbSymmetricMode->setChecked(settings->value("SymmetricMode", DEF_SYMMETRIC_MODE).toBool());
 	spinFractionalAccuracy->setValue(settings->value("FractionalAccuracy", DEF_FRACTIONAL_ACCURACY).toInt());
 	spinRandMin->setMaximum(MAX_RAND_VALUE);
@@ -194,5 +196,7 @@
 	settings->endGroup();
 
+#ifndef Q_OS_WINCE
 	adjustSize();
+#endif // Q_OS_WINCE
 }
 
@@ -230,4 +234,16 @@
 void SettingsDialog::accept()
 {
+	if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
+		if (QMessageBox::question(this, tr("Settings Reset"), tr("Do you really want to <b>reset all application settings to their defaults</b>?"), QMessageBox::RestoreDefaults | QMessageBox::Cancel) == QMessageBox::RestoreDefaults) {
+			_newFont = (font != QFont(DEF_FONT_FAMILY, DEF_FONT_SIZE));
+			_newColor = (color != DEF_FONT_COLOR);
+			settings->remove("");
+			settings->setValue("SettingsReset", true);
+			QDialog::accept();
+			QMessageBox::information(this, tr("Settings Reset"), tr("All settings where successfully reset to their defaults.\nIt is recommended to restart the application now."));
+			return;
+		} else
+			return;
+	}
 #if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
 	settings->setValue("SavePos", cbSaveState->isChecked());
@@ -246,4 +262,5 @@
 
 	settings->beginGroup("Task");
+	settings->setValue("SymmetricMode", cbSymmetricMode->isChecked());
 	settings->setValue("FractionalAccuracy", spinFractionalAccuracy->value());
 	settings->setValue("RandMin", spinRandMin->value());
@@ -293,4 +310,5 @@
 QRect availableGeometry = QApplication::desktop()->availableGeometry(0);
 	if (currentGeometry != availableGeometry) {
+		QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 		/*!
 		 * \hack HACK: This hack checks whether \link QDesktopWidget::availableGeometry() availableGeometry()\endlink's \c top + \c hegiht = \link QDesktopWidget::screenGeometry() screenGeometry()\endlink's \c height.
@@ -305,6 +323,14 @@
 			setGeometry(availableGeometry);
 		}
-	}
-	currentGeometry = availableGeometry;
+		currentGeometry = availableGeometry;
+		QApplication::restoreOverrideCursor();
+	}
+}
+
+void SettingsDialog::showEvent(QShowEvent *ev)
+{
+	desktopResized(0);
+
+	QWidget::showEvent(ev);
 }
 #endif // Q_OS_WINCE
Index: src/settingsdialog.h
===================================================================
--- src/settingsdialog.h	(revision b2bf8e3b6bff66c0d857cedf4d142262849d0a1a)
+++ src/settingsdialog.h	(revision 278bc7818ff0dbce80337ca38abd43ceaaf101a8)
@@ -76,4 +76,5 @@
 #ifdef Q_OS_WINCE
 	void desktopResized(int screen);
+	void showEvent(QShowEvent *ev);
 #endif // Q_OS_WINCE
 	void spinRandMinValueChanged(int val);
Index: src/tspmodel.cpp
===================================================================
--- src/tspmodel.cpp	(revision b2bf8e3b6bff66c0d857cedf4d142262849d0a1a)
+++ src/tspmodel.cpp	(revision 278bc7818ff0dbce80337ca38abd43ceaaf101a8)
@@ -191,11 +191,17 @@
 void CTSPModel::randomize()
 {
-int randMin = settings->value("Task/RandMin",DEF_RAND_MIN).toInt();
-int randMax = settings->value("Task/RandMax",DEF_RAND_MAX).toInt();
-	for (int r = 0; r < nCities; r++)
-		for (int c = 0; c < nCities; c++)
-			if (r != c)
-				table[r][c] = rand(randMin,randMax);
-	emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
+int randMin = settings->value("Task/RandMin", DEF_RAND_MIN).toInt();
+int randMax = settings->value("Task/RandMax", DEF_RAND_MAX).toInt();
+	if (settings->value("Task/SymmetricMode", DEF_SYMMETRIC_MODE).toBool()) {
+		for (int r = 0; r < nCities; r++)
+			for (int c = 0; c < r; c++)
+				table[c][r] = table[r][c] = rand(randMin, randMax);
+	} else {
+		for (int r = 0; r < nCities; r++)
+			for (int c = 0; c < nCities; c++)
+				if (r != c)
+					table[r][c] = rand(randMin, randMax);
+	}
+	emit dataChanged(index(0,0), index(nCities - 1, nCities - 1));
 }
 
@@ -315,6 +321,9 @@
 			if (!ok || tmp < 0)
 				return false;
-			else
+			else {
 				table[index.row()][index.column()] = tmp;
+				if (settings->value("Task/SymmetricMode", DEF_SYMMETRIC_MODE).toBool())
+					table[index.column()][index.row()] = tmp;
+			}
 		}
 		emit dataChanged(index,index);
