diff --git a/PythonLibs/FlaskBaseApp.py b/PythonLibs/FlaskBaseApp.py
new file mode 100644
index 0000000000000000000000000000000000000000..560680c8e66f22b398307f374844baf0ddfb4425
--- /dev/null
+++ b/PythonLibs/FlaskBaseApp.py
@@ -0,0 +1,94 @@
+import abc
+import json
+import logging
+import os
+from abc import ABC
+from typing import Dict
+
+from flask import Flask, send_from_directory
+from flask import jsonify
+from gevent.pywsgi import WSGIServer
+
+
+class FlaskBaseApp(ABC):
+    def __init__(self, appName: str,
+                 rootDir: str,
+                 logger: logging.Logger,
+                 versionPath='version.json',
+                 settingsPath='../settings.json',
+                 serveFavicon=True,
+                 serveRobotsTxt=False):
+        self._appName = appName
+        self._rootDir = rootDir
+        self._logger = logger
+        self._serveFavicon = serveFavicon
+        self._serveRobotsTxt = serveRobotsTxt
+
+        self._version = self.__parse_version(versionPath)
+        self._settings = self.__parse_settings(settingsPath)
+        self._serverSettings = self._settings['server']
+
+        self._app = None
+
+    @staticmethod
+    def __parse_version(versionPath: str) -> Dict:
+        with open(versionPath, 'r', encoding='UTF-8') as f:
+            version = json.load(f)
+        return version['version']
+
+    @staticmethod
+    def __parse_settings(settingsPath: str) -> Dict:
+        with open(settingsPath, 'r', encoding='UTF-8') as f:
+            return json.load(f)
+
+    def __init_app(self):
+        app = Flask(self._rootDir)
+        app.secret_key = self._serverSettings['secret']
+
+        self.register_blueprints(app)
+
+        @app.route('/version', methods=['GET'])
+        def version():
+            return jsonify(self._version)
+
+        if self._serveFavicon:
+            @app.route('/favicon.ico', methods=['GET'])
+            def favicon():
+                return send_from_directory(os.path.join(app.root_path, 'static'), '../static/favicon.ico',
+                                           mimetype='image/vnd.microsoft.icon')
+
+        if self._serveRobotsTxt:
+            @app.route('/robots.txt', methods=['GET'])
+            def robots():
+                return send_from_directory(os.path.join(app.root_path, 'static'), '../static/robots.txt')
+
+        return app
+
+    @abc.abstractmethod
+    def register_blueprints(self, app):
+        pass
+
+    def start_server(self):
+        self._app = self.__init_app()
+
+        if self._serverSettings['useSSL']:
+            protocol = 'https'
+            http_server = WSGIServer((self._serverSettings['listen'], self._serverSettings['port']),
+                                     self._app,
+                                     keyfile=self._serverSettings['keyfile'],
+                                     certfile=self._serverSettings['certfile'],
+                                     log=self._logger)
+        else:
+            protocol = 'http'
+            http_server = WSGIServer((self._serverSettings['listen'], self._serverSettings['port']),
+                                     self._app,
+                                     log=self._logger)
+
+        self._logger.info('{name} {versionName}({versionCode}) - '
+                          'Listening on {protocol}://{listen}:{port}...'.format(name=self._appName,
+                                                                                versionName=self._version['name'],
+                                                                                versionCode=self._version['code'],
+                                                                                protocol=protocol,
+                                                                                listen=self._serverSettings['listen'],
+                                                                                port=self._serverSettings['port']))
+        http_server.serve_forever()
diff --git a/PythonLibs/__init__.py b/PythonLibs/__init__.py
index 45e31a966228a1bbc98da9e881630f168e5886e0..d5b258d468358149b08c0c75ca4bf9b85b8860b9 100644
--- a/PythonLibs/__init__.py
+++ b/PythonLibs/__init__.py
@@ -1,3 +1,4 @@
 from PythonLibs.DefaultLogger import DefaultLogger
 from PythonLibs.MailHandler import MailHandler
 from PythonLibs.CachedService import CachedService
+from PythonLibs.FlaskBaseApp import FlaskBaseApp
diff --git a/setup.py b/setup.py
index 7da190915c3c7a9acb8d0cde694852788299ce8a..de806c2f13d3fd6e9466e0fa7a2afa30f62a3885 100644
--- a/setup.py
+++ b/setup.py
@@ -13,7 +13,9 @@ setup(
     install_requires=[
     ],
     setup_requires=[
-        'wheel'
+        'wheel',
+        'flask',
+        'gevent'
     ],
     classifiers=[
         'Development Status :: 5 - Production/Stable',