diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -127,6 +127,7 @@ add_executable(${PROGRAM_NAME} WIN32
   src/plotmanager.cpp
   src/numberformat.cpp
   src/updatechecker.cpp
+  src/versionnumber.cpp
   misc/windows_icon.rc
   ${UI_FILES}
   ${RES_FILES}
@@ -170,6 +171,9 @@ set(VERSION_REVISION "0")
 include(GetVersion)
 
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_STRING=\\\"${VERSION_STRING}\\\" ")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_MAJOR=${VERSION_MAJOR} ")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_MINOR=${VERSION_MINOR} ")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_PATCH=${VERSION_PATCH} ")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_REVISION=\\\"${VERSION_REVISION}\\\" ")
 
 # add make run target
diff --git a/src/versionnumber.cpp b/src/versionnumber.cpp
new file mode 100644
--- /dev/null
+++ b/src/versionnumber.cpp
@@ -0,0 +1,103 @@
+/*
+  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 
+
+#include "versionnumber.h"
+
+VersionNumber::VersionNumber(unsigned mj, unsigned mn, unsigned pt)
+{
+    major = mj;
+    minor = mn;
+    patch = pt;
+}
+
+QString VersionNumber::toString() const
+{
+    return QString("%1.%2.%3").arg(major).arg(minor).arg(patch);
+}
+
+bool VersionNumber::extract(const QString& str, VersionNumber& number)
+{
+    QRegularExpression regexp("(?:[-_vV \\t]|^)(?\\d+)"
+                              "(?:\\.(?\\d+))?(?:\\.(?\\d+))?[-_ \\t]?");
+    auto match = regexp.match(str, 0, QRegularExpression::PartialPreferCompleteMatch);
+
+    if (!(match.hasMatch() || match.hasPartialMatch())) return false;
+
+    number.major = match.captured("major").toUInt();
+
+    auto zeroIfNull = [](QString str) -> unsigned
+        {
+            if (str.isNull()) return 0;
+            return str.toUInt();
+        };
+
+    number.minor = zeroIfNull(match.captured("minor"));
+    number.patch = zeroIfNull(match.captured("patch"));
+
+    return true;
+}
+
+bool operator==(const VersionNumber& lhs, const VersionNumber& rhs)
+{
+    return lhs.major == rhs.major &&
+           lhs.minor == rhs.minor &&
+           lhs.patch == rhs.patch;
+}
+
+bool operator<(const VersionNumber& lhs, const VersionNumber& rhs)
+{
+    if (lhs.major < rhs.major)
+    {
+        return true;
+    }
+    else if (lhs.major == rhs.major)
+    {
+        if (lhs.minor < rhs.minor)
+        {
+             return true;
+        }
+        else if (lhs.minor == rhs.minor)
+        {
+            if (lhs.patch < rhs.patch) return true;
+        }
+    }
+    return false;
+}
+
+bool operator>(const VersionNumber& lhs, const VersionNumber& rhs)
+{
+    if (lhs.major > rhs.major)
+    {
+        return true;
+    }
+    else if (lhs.major == rhs.major)
+    {
+        if (lhs.minor > rhs.minor)
+        {
+             return true;
+        }
+        else if (lhs.minor == rhs.minor)
+        {
+            if (lhs.patch > rhs.patch) return true;
+        }
+    }
+    return false;
+}
diff --git a/src/versionnumber.h b/src/versionnumber.h
new file mode 100644
--- /dev/null
+++ b/src/versionnumber.h
@@ -0,0 +1,44 @@
+/*
+  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 .
+*/
+
+#ifndef VERSIONNUMBER_H
+#define VERSIONNUMBER_H
+
+#include 
+
+struct VersionNumber
+{
+    unsigned major = 0;
+    unsigned minor = 0;
+    unsigned patch = 0;
+
+    VersionNumber(unsigned mj=0, unsigned mn=0, unsigned pt=0);
+
+    /// Convert version number to string.
+    QString toString() const;
+
+    /// Extracts the version number from given string.
+    static bool extract(const QString& str, VersionNumber& number);
+};
+
+bool operator==(const VersionNumber& lhs, const VersionNumber& rhs);
+bool operator<(const VersionNumber& lhs, const VersionNumber& rhs);
+bool operator>(const VersionNumber& lhs, const VersionNumber& rhs);
+
+#endif // VERSIONNUMBER_H