diff --git a/IConfig/IConfigOptions.cpp b/IConfig/IConfigOptions.cpp
index 9a83886..572d928 100644
--- a/IConfig/IConfigOptions.cpp
+++ b/IConfig/IConfigOptions.cpp
@@ -63,24 +63,26 @@ IConfigOptions::~IConfigOptions()
 bool IConfigOptions::isChanged() const
 {
 	bool changed = cf_ShowOptions != ui->chkShowOptions->isChecked()
-					|| cf_Reconnect != ui->chkReconnect->isChecked()
-					|| cf_RejoinChannelsOnConnect != ui->chkRejoinConnect->isChecked()
-					|| cf_ShowWhoisActiveWindow != ui->chkWhoisActive->isChecked()
-					|| cf_ShowModeInMessage != ui->chkShowModeMsg->isChecked()
-					|| cf_TrayNotify != ui->chkTrayNotify->isChecked()
-					|| cf_TrayNotifyDelay != ui->edTrayDelay->value()
-					|| cf_ShowTimestamp != ui->chkTimestamp->isChecked()
-					|| cf_TimestampFormat != ui->edTimestamp->text()
-					|| cf_QuitMessage != ui->edQuit->text()
-					|| cf_Font.family() != ui->edFont->currentFont().family()
-					|| cf_FontSize != ui->edFontSize->value()
-					|| cf_BgImageEnabled != ui->chkEnableBgImage->isChecked()
-					|| cf_BgImagePath != ui->edImage->text()
-					// TODO background image scaling combo box
-					|| cf_BgImageOpacity != ui->hsImageOpacity->value()
-					|| cf_SSLSelfSigned != ui->chkSSLSelfsigned->isChecked()
-					|| cf_SSLExpired != ui->chkSSLExpired->isChecked()
-					|| cf_SSLCNMismatch != ui->chkSSLCNMismatch->isChecked();
+                || cf_Reconnect != ui->chkReconnect->isChecked()
+                || cf_RejoinChannelsOnConnect != ui->chkRejoinConnect->isChecked()
+                || cf_ShowWhoisActiveWindow != ui->chkWhoisActive->isChecked()
+                || cf_ShowModeInMessage != ui->chkShowModeMsg->isChecked()
+                || cf_TrayNotify != ui->chkTrayNotify->isChecked()
+                || cf_TrayNotifyDelay != ui->edTrayDelay->value()
+                || cf_ShowTimestamp != ui->chkTimestamp->isChecked()
+                || cf_TimestampFormat != ui->edTimestamp->text()
+                || cf_ManualKeepaliveEnabled != ui->chkManualKeepalive->isChecked()
+                || cf_ManualKeepalive != ui->edManualKeepalive->value()
+                || cf_QuitMessage != ui->edQuit->text()
+                || cf_Font.family() != ui->edFont->currentFont().family()
+                || cf_FontSize != ui->edFontSize->value()
+                || cf_BgImageEnabled != ui->chkEnableBgImage->isChecked()
+                || cf_BgImagePath != ui->edImage->text()
+                // TODO background image scaling combo box
+                || cf_BgImageOpacity != ui->hsImageOpacity->value()
+                || cf_SSLSelfSigned != ui->chkSSLSelfsigned->isChecked()
+                || cf_SSLExpired != ui->chkSSLExpired->isChecked()
+                || cf_SSLCNMismatch != ui->chkSSLCNMismatch->isChecked();
 
 	if (changed)
 		return true;
@@ -90,27 +92,29 @@ bool IConfigOptions::isChanged() const
 
 void IConfigOptions::save()
 {
-	ConfigMgr& conf = ConfigMgr::instance();
-	conf.setCommon("ShowOptions", QString::number(ui->chkShowOptions->isChecked()));
-	conf.setCommon("Reconnect", QString::number(ui->chkReconnect->isChecked()));
-	conf.setCommon("RejoinChannelsOnConnect", QString::number(ui->chkRejoinConnect->isChecked()));
-	conf.setCommon("ShowWhoisActiveWindow", QString::number(ui->chkWhoisActive->isChecked()));
-	conf.setCommon("ShowModeInMessage", QString::number(ui->chkShowModeMsg->isChecked()));
-	conf.setCommon("TrayNotify", QString::number(ui->chkTrayNotify->isChecked()));
-	conf.setCommon("TrayNotifyDelay", QString::number(ui->edTrayDelay->value()));
-	conf.setCommon("ShowTimestamp", QString::number(ui->chkTimestamp->isChecked()));
-	conf.setCommon("TimestampFormat", ui->edTimestamp->text());
-	conf.setCommon("QuitMessage", ui->edQuit->text());
-	conf.setCommon("Font", ui->edFont->currentFont().family());
-	conf.setCommon("FontSize", QString::number(ui->edFontSize->value()));
-	conf.setCommon("BgImageEnabled", QString::number(ui->chkEnableBgImage->isChecked()));
-	conf.setCommon("BgImagePath", ui->edImage->text());
-	conf.setCommon("BgImageOpacity", QString::number(ui->hsImageOpacity->value()));
-	conf.setCommon("SSLSelfsigned", QString::number(ui->chkSSLSelfsigned->isChecked()));
-	conf.setCommon("SSLExpired", QString::number(ui->chkSSLExpired->isChecked()));
-	conf.setCommon("SSLCNMismatch", QString::number(ui->chkSSLCNMismatch->isChecked()));
-	reload();
-	colorCfg->save();
+    ConfigMgr& conf = ConfigMgr::instance();
+    conf.setCommon("ShowOptions", QString::number(ui->chkShowOptions->isChecked()));
+    conf.setCommon("Reconnect", QString::number(ui->chkReconnect->isChecked()));
+    conf.setCommon("RejoinChannelsOnConnect", QString::number(ui->chkRejoinConnect->isChecked()));
+    conf.setCommon("ShowWhoisActiveWindow", QString::number(ui->chkWhoisActive->isChecked()));
+    conf.setCommon("ShowModeInMessage", QString::number(ui->chkShowModeMsg->isChecked()));
+    conf.setCommon("TrayNotify", QString::number(ui->chkTrayNotify->isChecked()));
+    conf.setCommon("TrayNotifyDelay", QString::number(ui->edTrayDelay->value()));
+    conf.setCommon("ShowTimestamp", QString::number(ui->chkTimestamp->isChecked()));
+    conf.setCommon("TimestampFormat", ui->edTimestamp->text());
+    conf.setCommon("ManualKeepaliveEnabled", QString::number(ui->chkManualKeepalive->isChecked()));
+    conf.setCommon("ManualKeepalive", QString::number(ui->edManualKeepalive->value()));
+    conf.setCommon("QuitMessage", ui->edQuit->text());
+    conf.setCommon("Font", ui->edFont->currentFont().family());
+    conf.setCommon("FontSize", QString::number(ui->edFontSize->value()));
+    conf.setCommon("BgImageEnabled", QString::number(ui->chkEnableBgImage->isChecked()));
+    conf.setCommon("BgImagePath", ui->edImage->text());
+    conf.setCommon("BgImageOpacity", QString::number(ui->hsImageOpacity->value()));
+    conf.setCommon("SSLSelfsigned", QString::number(ui->chkSSLSelfsigned->isChecked()));
+    conf.setCommon("SSLExpired", QString::number(ui->chkSSLExpired->isChecked()));
+    conf.setCommon("SSLCNMismatch", QString::number(ui->chkSSLCNMismatch->isChecked()));
+    reload();
+    colorCfg->save();
 }
 
 void IConfigOptions::reset()
@@ -124,6 +128,8 @@ void IConfigOptions::reset()
 	ui->edTrayDelay->setValue(cf_TrayNotifyDelay);
 	ui->chkTimestamp->setChecked(cf_ShowTimestamp);
 	ui->edTimestamp->setText(cf_TimestampFormat);
+	ui->chkManualKeepalive->setChecked(cf_ManualKeepaliveEnabled);
+	ui->edManualKeepalive->setValue(cf_ManualKeepalive);
 	ui->edQuit->setText(cf_QuitMessage);
 	ui->edFont->setCurrentFont(cf_Font);
 	ui->edFontSize->setValue(cf_FontSize);
@@ -155,8 +161,10 @@ void IConfigOptions::reload()
 	cf_TrayNotify = conf.common("TrayNotify").toInt();
 	cf_TrayNotifyDelay = conf.common("TrayNotifyDelay").toInt();
 	cf_ShowTimestamp = conf.common("ShowTimestamp").toInt();
-	cf_TimestampFormat = conf.common("TimestampFormat");
-	cf_QuitMessage = conf.common("QuitMessage");
+    cf_TimestampFormat = conf.common("TimestampFormat");
+    cf_ManualKeepaliveEnabled = conf.common("ManualKeepaliveEnabled").toInt();
+    cf_ManualKeepalive = conf.common("ManualKeepalive").toInt();
+    cf_QuitMessage = conf.common("QuitMessage");
 	cf_Font = conf.common("Font");
 	cf_FontSize = conf.common("FontSize").toInt();
 	cf_BgImageEnabled = conf.common("BgImageEnabled").toInt();
diff --git a/IConfig/IConfigOptions.h b/IConfig/IConfigOptions.h
index 0933c6e..13df438 100644
--- a/IConfig/IConfigOptions.h
+++ b/IConfig/IConfigOptions.h
@@ -42,7 +42,6 @@ public:
 
 private slots:
 	void on_chkSSLExpired_toggled(bool checked);
-
 	void on_btnImageBrowse_clicked();
 
 private:
@@ -59,6 +58,8 @@ private:
 	int cf_TrayNotifyDelay;
 	bool cf_ShowTimestamp;
 	QString cf_TimestampFormat;
+    bool cf_ManualKeepaliveEnabled;
+	int cf_ManualKeepalive;
 	QString cf_QuitMessage;
 	QFont cf_Font;
 	int cf_FontSize;
diff --git a/IConfig/IConfigOptions.ui b/IConfig/IConfigOptions.ui
index dbb2d31..6ce4078 100644
--- a/IConfig/IConfigOptions.ui
+++ b/IConfig/IConfigOptions.ui
@@ -120,6 +120,43 @@
          </item>
         </layout>
        </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_8">
+         <item>
+          <widget class="QCheckBox" name="chkManualKeepalive">
+           <property name="text">
+            <string>Manual keep-alive</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QSpinBox" name="edManualKeepalive">
+           <property name="suffix">
+            <string> sec</string>
+           </property>
+           <property name="minimum">
+            <number>10</number>
+           </property>
+           <property name="maximum">
+            <number>120</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_5">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
        <item>
         <widget class="QLabel" name="label">
          <property name="text">
@@ -364,6 +401,8 @@
   <tabstop>edTrayDelay</tabstop>
   <tabstop>chkTimestamp</tabstop>
   <tabstop>edTimestamp</tabstop>
+  <tabstop>chkManualKeepalive</tabstop>
+  <tabstop>edManualKeepalive</tabstop>
   <tabstop>edQuit</tabstop>
   <tabstop>edFont</tabstop>
   <tabstop>edFontSize</tabstop>
diff --git a/IdealIRC/ConfigMgr.cpp b/IdealIRC/ConfigMgr.cpp
index 2b3f7ae..fd0da29 100644
--- a/IdealIRC/ConfigMgr.cpp
+++ b/IdealIRC/ConfigMgr.cpp
@@ -166,6 +166,8 @@ void ConfigMgr::loadCommon(IniFile& ini)
 	commonData.insert("TrayNotifyDelay", ini.value("Common", "TrayNotifyDelay", "5"));
 	commonData.insert("ShowTimestamp", ini.value("Common", "ShowTimestamp", "1"));
 	commonData.insert("TimestampFormat", ini.value("Common", "TimestampFormat", "[HH:mm]"));
+    commonData.insert("ManualKeepaliveEnabled", ini.value("Common", "ManualKeepaliveEnabled", "0"));
+    commonData.insert("ManualKeepalive", ini.value("Common", "ManualKeepalive", "10"));
 	commonData.insert("QuitMessage", ini.value("Common", "QuitMessage"));
 	commonData.insert("Font", ini.value("Common", "Font", defaultFontName));
 	commonData.insert("FontSize", ini.value("Common", "FontSize", "12"));
diff --git a/IdealIRC/IdealIRC.cpp b/IdealIRC/IdealIRC.cpp
index 467fba9..1bc99f5 100644
--- a/IdealIRC/IdealIRC.cpp
+++ b/IdealIRC/IdealIRC.cpp
@@ -214,7 +214,11 @@ void IdealIRC::connectToServer(bool newStatus)
 	con.setIdent(username.toStdString());
 	con.setNickname(nickname.toStdString());
 
-	const auto cfgSSLExcept_Expired = conf.common("SSLExpired");
+	bool manualKeepaliveEnabled = conf.common("ManualKeepaliveEnabled").toInt();
+    int manualKeepalive = manualKeepaliveEnabled ? conf.common("ManualKeepalive").toInt() : 0;
+    con.setManualKeepalive(std::chrono::seconds(manualKeepalive));
+    
+    const auto cfgSSLExcept_Expired = conf.common("SSLExpired");
 	const auto cfgSSLExcept_Selfsigned = conf.common("SSLSelfsigned");
 	const auto cfgSSLExcept_CNMismatch = conf.common("SSLCNMismatch");
 	con.exceptSSL_Expired(cfgSSLExcept_Expired == "1");