diff --git a/src/updatecheckdialog.cpp b/src/updatecheckdialog.cpp
new file mode 100644
--- /dev/null
+++ b/src/updatecheckdialog.cpp
@@ -0,0 +1,105 @@
+/*
+  Copyright © 2017 Hasan Yavuz Özderya
+
+  This file is part of serialplot.
+
+  serialplot is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  serialplot is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with serialplot.  If not, see .
+*/
+
+#include "setting_defines.h"
+#include "updatecheckdialog.h"
+#include "ui_updatecheckdialog.h"
+
+UpdateCheckDialog::UpdateCheckDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::UpdateCheckDialog)
+{
+    ui->setupUi(this);
+
+    // by default start from yesterday, so that we check at first run
+    lastCheck = QDate::currentDate().addDays(-1);
+
+    connect(&updateChecker, &UpdateChecker::checkFailed,
+            [this](QString errorMessage)
+            {
+                lastCheck = QDate::currentDate();
+                ui->label->setText(QString("Update check failed.\n") + errorMessage);
+            });
+
+    connect(&updateChecker, &UpdateChecker::checkFinished,
+            [this](bool found, QString newVersion, QString downloadUrl)
+            {
+                QString text;
+                if (!found)
+                {
+                    text = "There is no update yet.";
+                }
+                else
+                {
+                    show();
+#ifdef UPDATE_TYPE_PKGMAN
+                    text = QString("There is a new version: %1. "
+                                   "Use your package manager to update"
+                                   " or click to download.")\
+                        .arg(newVersion).arg(downloadUrl);
+#else
+                    text = QString("Found update to version %1. Click to download.")\
+                        .arg(newVersion).arg(downloadUrl);
+#endif
+                }
+
+                lastCheck = QDate::currentDate();
+                ui->label->setText(text);
+            });
+}
+
+UpdateCheckDialog::~UpdateCheckDialog()
+{
+    delete ui;
+}
+
+void UpdateCheckDialog::showEvent(QShowEvent *event)
+{
+    updateChecker.checkUpdate();
+    ui->label->setText("Checking update...");
+}
+
+void UpdateCheckDialog::closeEvent(QShowEvent *event)
+{
+    if (updateChecker.isChecking()) updateChecker.cancelCheck();
+}
+
+void UpdateCheckDialog::saveSettings(QSettings* settings)
+{
+    settings->beginGroup(SettingGroup_UpdateCheck);
+    settings->setValue(SG_UpdateCheck_Periodic, ui->cbPeriodic->isChecked());
+    settings->setValue(SG_UpdateCheck_LastCheck, lastCheck.toString(Qt::ISODate));
+    settings->endGroup();
+}
+
+void UpdateCheckDialog::loadSettings(QSettings* settings)
+{
+    settings->beginGroup(SettingGroup_UpdateCheck);
+    ui->cbPeriodic->setChecked(settings->value(SG_UpdateCheck_Periodic,
+                                               ui->cbPeriodic->isChecked()).toBool());
+    auto lastCheckS = settings->value(SG_UpdateCheck_LastCheck, lastCheck.toString(Qt::ISODate)).toString();
+    lastCheck = QDate::fromString(lastCheckS, Qt::ISODate);
+    settings->endGroup();
+
+    // start the periodic update if required
+    if (ui->cbPeriodic->isChecked() && lastCheck < QDate::currentDate())
+    {
+        updateChecker.checkUpdate();
+    }
+}