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();
+ }
+}