diff --git a/ajax/add.php b/ajax/add.php
index 5bfee78a573cbdfe32d0228b7306571cd4d9cd05..1fe0f1b202bfa7a62c312b1e21734c15d74fa855 100644
--- a/ajax/add.php
+++ b/ajax/add.php
@@ -11,7 +11,6 @@
  * @param String $dayOfWeek
  * @param string $params
  */
-
 QUI::$Ajax->registerFunction(
     'package_quiqqer_cron_ajax_add',
     function ($cron, $min, $hour, $day, $month, $dayOfWeek, $params) {
diff --git a/ajax/cronservice/getStatus.php b/ajax/cronservice/getStatus.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c5d208f2c87d22b72cc8484b85f0340ceb6f0b2
--- /dev/null
+++ b/ajax/cronservice/getStatus.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * Gets the current Status for this instance
+ *
+ * @return string - Returns the status
+ */
+QUI::$Ajax->registerFunction(
+    'package_quiqqer_cron_ajax_cronservice_getStatus',
+    function () {
+        $CronService = new \QUI\Cron\CronService();
+
+        return $CronService->getStatus();
+    },
+    array(),
+    ''
+);
diff --git a/ajax/cronservice/revokeRegistration.php b/ajax/cronservice/revokeRegistration.php
new file mode 100644
index 0000000000000000000000000000000000000000..99f6f6270fac8d83cfb003452d8802256b726f52
--- /dev/null
+++ b/ajax/cronservice/revokeRegistration.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Revokes a registration on the cronservice server.
+ *
+ */
+QUI::$Ajax->registerFunction(
+    'package_quiqqer_cron_ajax_cronservice_revokeRegistration',
+    function () {
+        $CronService = new \QUI\Cron\CronService();
+        $CronService->revokeRegistration();
+    },
+    array(),
+    ''
+);
diff --git a/ajax/cronservice/sendRegistration.php b/ajax/cronservice/sendRegistration.php
new file mode 100644
index 0000000000000000000000000000000000000000..91ab2b7beff5aad76790d095c97ec7dc2fcff51f
--- /dev/null
+++ b/ajax/cronservice/sendRegistration.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Sends a registration to the cronservice server.
+ *
+ *
+ */
+QUI::$Ajax->registerFunction(
+    'package_quiqqer_cron_ajax_cronservice_sendRegistration',
+    function ($email) {
+        $CronService = new \QUI\Cron\CronService();
+        $CronService->register($email);
+    },
+    array('email'),
+    ''
+);
diff --git a/ajax/delete.php b/ajax/delete.php
index 9c852f526d1663497124936023c0b1fb7acabd4f..69719319dcdab8fb54dcbd283308209897941c94 100644
--- a/ajax/delete.php
+++ b/ajax/delete.php
@@ -5,7 +5,6 @@
  *
  * @param string $ids - json array
  */
-
 QUI::$Ajax->registerFunction(
     'package_quiqqer_cron_ajax_delete',
     function ($ids) {
diff --git a/ajax/edit.php b/ajax/edit.php
index 42b80ba344e3f1337543a3a1856f5dbe2fd67817..f1dd0ac01ba3b4407b0d0071a5d0213cd3d2ac4f 100644
--- a/ajax/edit.php
+++ b/ajax/edit.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Add a cron to the cron list
+ * Edit a cron
  *
  * @param String $cronId
  * @param String $cron
@@ -12,7 +12,6 @@
  * @param String $dayOfWeek
  * @param String $params
  */
-
 QUI::$Ajax->registerFunction(
     'package_quiqqer_cron_ajax_edit',
     function ($cronId, $cron, $min, $hour, $day, $month, $dayOfWeek, $params) {
diff --git a/ajax/execute.php b/ajax/execute.php
index 7988fa931e524b0455d28886c3c763a9e08f55d7..eb0d3443bd2d2eefa1487431eb4b53a724cc4119 100644
--- a/ajax/execute.php
+++ b/ajax/execute.php
@@ -3,14 +3,12 @@
 /**
  * Execute the cron list
  */
-
 QUI::$Ajax->registerFunction(
     'package_quiqqer_cron_ajax_execute',
     function () {
         try {
             $Manager = new QUI\Cron\Manager();
             $Manager->execute();
-
         } catch (QUI\Exception $Exception) {
             QUI\System\Log::addError(
                 'package_quiqqer_cron_ajax_execute() :: ' . $Exception->getMessage()
diff --git a/ajax/getList.php b/ajax/getList.php
index fd9a9524bf0f0a3ebc088e09c6b36326db7182f9..0154af918700661b26169c3fc9c336104b8dfea6 100644
--- a/ajax/getList.php
+++ b/ajax/getList.php
@@ -5,7 +5,6 @@
  *
  * @return array
  */
-
 QUI::$Ajax->registerFunction(
     'package_quiqqer_cron_ajax_getList',
     function () {
diff --git a/ajax/history/get.php b/ajax/history/get.php
index 21ee5dbe8341060c3650b8e8a666b794b99b3394..3661893ab5d6df5d0a7f798a855441d61a351ef3 100644
--- a/ajax/history/get.php
+++ b/ajax/history/get.php
@@ -13,8 +13,8 @@ QUI::$Ajax->registerFunction(
         $params      = json_decode($params, true);
 
         return array(
-            'page' => (int)$params['page'],
-            'data' => $CronManager->getHistoryList($params),
+            'page'  => (int)$params['page'],
+            'data'  => $CronManager->getHistoryList($params),
             'total' => $CronManager->getHistoryCount()
         );
     },
diff --git a/bin/CronServiceWindow.css b/bin/CronServiceWindow.css
new file mode 100644
index 0000000000000000000000000000000000000000..07e20ae99496e3f9c3c4cb35cefa298f442cad16
--- /dev/null
+++ b/bin/CronServiceWindow.css
@@ -0,0 +1,82 @@
+
+.quiqqer-cron-cronservicewindow-btn-openRegistration {
+    margin : 30px auto 0 auto;
+    float  : right;
+}
+
+.quiqqer-cron-cronserviceWindow h2 {
+    font-weight   : normal;
+    margin-bottom : 10px;
+}
+
+.quiqqer-cron-cronservicewindow-title {
+    padding-bottom : 10px;
+    text-align     : center;
+}
+
+.quiqqer-cron-cronservicewindow-title span {
+    clear   : both;
+    display : block;
+}
+
+.quiqqer-cron-cronservicewindow-title .fa {
+    font-size : 60px;
+}
+
+.quiqqer-cron-cronservicewindow-section {
+    margin : 15px auto;
+}
+
+.quiqqer-cron-cronservicewindow-buttons {
+    text-align : center;
+    margin-top : 40px;
+    width      : 100%;
+}
+
+.quiqqer-cron-cronservicewindow-stat-title {
+    font-weight : bold;
+}
+
+.quiqqer-cron-cronservice-table-stats {
+    width : 100%;
+}
+
+.quiqqer-cron-cronservice-table-stats td {
+    width : 50%;
+}
+
+.quiqqer-cron-cronservicewindow-stat-negative {
+    color : red;
+}
+
+.quiqqer-cron-cronservicewindow-stat-positive {
+    color : green;
+}
+
+/* Registration Sheet */
+
+.quiqqer-cron-cronservicewindow-registration {
+    padding : 20px;
+}
+
+.quiqqer-cron-cronservicewindow-registration-title {
+    border-bottom  : 1px solid #eee;
+    padding-bottom : 10px;
+}
+
+.quiqqer-cron-cronservicewindow-registration-lbl-email {
+    font-weight : bold;
+    padding     : 2px;
+    width       : 100%;
+}
+
+.quiqqer-cron-cronservicewindow-registration-txt-email {
+    width      : 100%;
+    margin-top : 6px;
+}
+
+.quiqqer-cron-cronservicewindow-btn-register {
+    margin-top : 20px;
+    float      : right;
+}
+
diff --git a/bin/CronServiceWindow.html b/bin/CronServiceWindow.html
new file mode 100644
index 0000000000000000000000000000000000000000..3d276447969a0f2ce8bfa438ff145abb26ecc9db
--- /dev/null
+++ b/bin/CronServiceWindow.html
@@ -0,0 +1,56 @@
+<h1 class="quiqqer-cron-cronservicewindow-title">
+    <span class="fa fa-cloud"></span>
+    <span>{{cron_window_cronservice_content_title}}</span>
+</h1>
+
+<div class="quiqqer-cron-cronservicewindow-section">
+    <h2>{{cron_window_cronservice_content_about_title}}</h2>
+    <p>
+        {{cron_window_cronservice_content_about_text}}
+    </p>
+</div>
+
+<div class="quiqqer-cron-cronservicewindow-section">
+    <h2>{{cron_window_cronservice_content_status_title}}</h2>
+
+    {{cron_window_cronservice_content_status_text}}
+
+    <table class="quiqqer-cron-cronservice-table-stats">
+        <tr>
+            <td>
+                <span class="quiqqer-cron-cronservicewindow-stat-title">
+                    {{cron_window_cronservice_content_register_lbl_stats_status}}
+                </span>
+            </td>
+            <td>
+                <span class="{{#active}}quiqqer-cron-cronservicewindow-stat-positive{{/active}}{{^active}}quiqqer-cron-cronservicewindow-stat-negative{{/active}}">
+                    {{statusText}}
+                </span>
+            </td>
+        </tr>
+        {{#registered}}
+        <tr>
+            <td>
+                <span class="quiqqer-cron-cronservicewindow-stat-title">
+                    {{cron_window_cronservice_content_register_lbl_stats_errors}}
+                </span>
+            </td>
+            <td>
+                {{statusErrors}}
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <span class="quiqqer-cron-cronservicewindow-stat-title">
+                    {{cron_window_cronservice_content_register_lbl_stats_lastExecution}}
+                </span>
+            </td>
+            <td>
+                {{statusLastExecution}}
+            </td>
+        </tr>
+        {{/registered}}
+    </table>
+</div>
+
+<div class="quiqqer-cron-cronservicewindow-buttons"></div>
\ No newline at end of file
diff --git a/bin/CronServiceWindow.js b/bin/CronServiceWindow.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a10bbcdac6fe0cd84e3904bcf77aaf1e87c99e1
--- /dev/null
+++ b/bin/CronServiceWindow.js
@@ -0,0 +1,220 @@
+/**
+ *
+ */
+define('package/quiqqer/cron/bin/CronServiceWindow', [
+
+    'qui/QUI',
+    'qui/controls/windows/Popup',
+    'qui/controls/buttons/Button',
+    'Mustache',
+    'Locale',
+    'Ajax',
+    'qui/controls/desktop/panels/Sheet',
+
+    'text!package/quiqqer/cron/bin/CronServiceWindow.html',
+    'text!package/quiqqer/cron/bin/CronServiceWindowRegistration.html',
+    'css!package/quiqqer/cron/bin/CronServiceWindow.css'
+
+], function (QUI, QUIPopup, QUIButton, Mustache, QUILocale, QUIAjax, QUISheets, template, registrationTemplate) {
+    "use strict";
+
+    var lg = 'quiqqer/cron';
+
+    return new Class({
+
+        Extends: QUIPopup,
+        Type   : 'package/quiqqer/cron/bin/CronServiceWindow',
+
+        Binds: [
+            '$onSubmit',
+            '$onOpen',
+            'showRegistration'
+        ],
+
+        options: {
+            title    : QUILocale.get(lg, 'cron.window.cronservice.title'),
+            icon     : 'fa fa-cloud',
+            maxWidth : 400,
+            maxHeight: 600,
+            autoclose: false,
+            buttons  : false
+        },
+
+        initialize: function (options) {
+            this.parent(options);
+
+            this.registered = false;
+
+            this.addEvents({
+                onOpen: this.$onOpen
+            });
+        },
+
+        $onOpen: function () {
+            var Content = this.getContent();
+
+            Content.set('html', '');
+            Content.addClass('quiqqer-cron-cronserviceWindow');
+
+            this.refresh();
+        },
+
+        /**
+         * refresh
+         */
+        refresh: function () {
+            var self    = this,
+                Content = this.getContent();
+
+            this.Loader.show();
+
+            QUIAjax.get('package_quiqqer_cron_ajax_cronservice_getStatus', function (result) {
+                var status = result;
+
+                var statusText = QUILocale.get(lg, 'cron.window.cronservice.status.text.unregistered');
+                if (status['status'] == 1) {
+                    statusText = QUILocale.get(lg, 'cron.window.cronservice.status.text.registered');
+                }
+                if (status['status'] == 2) {
+                    statusText = QUILocale.get(lg, 'cron.window.cronservice.status.text.inactive');
+                }
+
+
+                Content.set('html', Mustache.render(template, {
+                    cron_window_cronservice_content_title                           : QUILocale.get(lg, 'cron.window.cronservice.content.title'),
+                    cron_window_cronservice_content_about_title                     : QUILocale.get(lg, 'cron.window.cronservice.content.about.title'),
+                    cron_window_cronservice_content_about_text                      : QUILocale.get(lg, 'cron.window.cronservice.content.about.text'),
+                    cron_window_cronservice_content_status_title                    : QUILocale.get(lg, 'cron.window.cronservice.content.status.title'),
+                    cron_window_cronservice_content_status_text                     : QUILocale.get(lg, 'cron.window.cronservice.content.status.text'),
+                    cron_window_cronservice_content_btn_unregister                  : QUILocale.get(lg, 'cron.window.cronservice.content.register.btn.unregister'),
+                    cron_window_cronservice_content_btn_register                    : QUILocale.get(lg, 'cron.window.cronservice.content.btn.register'),
+                    cron_window_cronservice_content_register_lbl_stats_status       : QUILocale.get(lg, 'cron.window.cronservice.content.register.lbl.stats.status'),
+                    cron_window_cronservice_content_register_lbl_stats_errors       : QUILocale.get(lg, 'cron.window.cronservice.content.register.lbl.stats.errors'),
+                    cron_window_cronservice_content_register_lbl_stats_lastExecution: QUILocale.get(lg, 'cron.window.cronservice.content.register.lbl.stats.lastExecution'),
+                    statusText                                                      : statusText,
+                    status                                                          : status['status'],
+                    statusErrors                                                    : status['current_failures'], //== 0 ? "0": status['errors'].toString(),
+                    statusLastExecution                                             : status['last_execution'],
+                    registered                                                      : (status['status'] != 0),
+                    active                                                          : (status['status'] == 1),
+                    inactive                                                        : (status['status'] == 2)
+                }));
+
+                self.registered = (status['status'] != 0);
+
+                var Buttons = Content.getElement('.quiqqer-cron-cronservicewindow-buttons');
+
+                // get the button text : register or unregister
+                var btnText = QUILocale.get(lg, 'cron.window.cronservice.content.btn.register');
+                if (self.registered) {
+                    btnText = QUILocale.get(lg, 'cron.window.cronservice.content.btn.unregister');
+                }
+
+                new QUIButton({
+                    text     : btnText,
+                    textimage: 'fa fa-arrow-right',
+                    events   : {
+                        onClick: function (Button) {
+                            if (!self.registered) {
+                                self.showRegistration();
+                                return;
+                            }
+                            Button.setAttribute('text', QUILocale.get('quiqqer/cron', 'cron.window.cronservice.content.btn.unregister.confirm'));
+                            if (Button.getAttribute('clickcnt') == 1) {
+                                self.unregister().then(function () {
+                                    self.refresh();
+                                });
+                            }
+                            Button.setAttribute('clickcnt', 1);
+                        }
+                    },
+                    styles   : {
+                        'float': 'none',
+                        margin : '0 auto',
+                        width  : 200
+                    }
+                }).inject(Buttons);
+
+
+                self.Loader.hide();
+            }, {
+                'package': lg,
+                'onError': function () {
+                    self.Loader.hide();
+                }
+            });
+        },
+
+        /**
+         * Opens the registration sheet
+         */
+        showRegistration: function () {
+            var self = this;
+
+            new QUISheets({
+                header : true,
+                icon   : 'fa fa-cloud',
+                title  : QUILocale.get(lg, 'cron.window.cronservice.title'),
+                buttons: false,
+                events : {
+                    onOpen: function (Sheet) {
+                        var Content = Sheet.getContent();
+
+                        Content.set('html', Mustache.render(registrationTemplate, {
+                            cron_window_cronservice_registration_title                : QUILocale.get(lg, 'cron.window.cronservice.registration.title'),
+                            cron_window_cronservice_content_register_txt_email_title  : QUILocale.get(lg, 'cron.window.cronservice.content.register.txt.email.title'),
+                            cron_window_cronservice_content_register_placeholder_email: QUILocale.get(lg, 'cron.window.cronservice.content.register.placeholder.email'),
+                            cron_window_cronservice_content_btn_register              : QUILocale.get(lg, 'cron.window.cronservice.registration.title')
+                        }));
+
+                        var Email = Content.getElement('.quiqqer-cron-cronservicewindow-registration-txt-email');
+
+                        Content.getElement('.quiqqer-cron-cronservicewindow-btn-register').addEvent('click', function () {
+                            self.Loader.show();
+                            self.register(Email.value).then(function () {
+                                self.refresh();
+                                Sheet.destroy();
+                            }).catch(function () {
+                                self.Loader.hide();
+                            });
+                        });
+                    },
+
+                    onClose: function (Sheet) {
+                        Sheet.destroy();
+                    }
+                }
+            }).inject(this.$Elm).show();
+        },
+
+        /**
+         * Register a email to the cron service
+         *
+         * @param {String} email
+         * @returns {Promise}
+         */
+        register: function (email) {
+            return new Promise(function (resolve, reject) {
+                QUIAjax.post('package_quiqqer_cron_ajax_cronservice_sendRegistration', resolve, {
+                    'package': lg,
+                    'email'  : email,
+                    onError  : reject
+                });
+            });
+        },
+
+        /**
+         * Unregister a email to the cron service
+         *
+         * @returns {Promise}
+         */
+        unregister: function () {
+            return new Promise(function (resolve, reject) {
+                QUIAjax.get('package_quiqqer_cron_ajax_cronservice_revokeRegistration', resolve, {
+                    'package': lg,
+                    onError  : reject
+                });
+            });
+        }
+    });
+});
diff --git a/bin/CronServiceWindowRegistration.html b/bin/CronServiceWindowRegistration.html
new file mode 100644
index 0000000000000000000000000000000000000000..1382e6ab701e0b9fd646fa87f3adccadd4d49bd0
--- /dev/null
+++ b/bin/CronServiceWindowRegistration.html
@@ -0,0 +1,25 @@
+<div class="quiqqer-cron-cronservicewindow-registration">
+    <h1 class="quiqqer-cron-cronservicewindow-registration-title">
+        {{cron_window_cronservice_registration_title}}
+    </h1>
+    <form action="" method="POST">
+        <label
+                class="quiqqer-cron-cronservicewindow-registration-lbl-email"
+                for="quiqqer-cron-cronservicewindow-registration-txt-email"
+        >
+            {{cron_window_cronservice_content_register_txt_email_title}}
+        </label>
+        <input
+                id="quiqqer-cron-cronservicewindow-registration-txt-email"
+                type="text"
+                name="email"
+                required="required"
+                placeholder="{{cron_window_cronservice_content_register_placeholder_email}}"
+                class="quiqqer-cron-cronservicewindow-registration-txt-email"
+        />
+        <div class="quiqqer-cron-cronservicewindow-btn-register qui-button">
+            <span class="fa fa-check"></span>
+            <span>{{cron_window_cronservice_content_btn_register}}</span>
+        </div>
+    </form>
+</div>
\ No newline at end of file
diff --git a/bin/CronWindow.js b/bin/CronWindow.js
index 3d7dc78965823102e27ca7cab35b0108349dd873..e2a33146744c071724d77bfe89472f47fb10b9e5 100644
--- a/bin/CronWindow.js
+++ b/bin/CronWindow.js
@@ -32,7 +32,7 @@ define('package/quiqqer/cron/bin/CronWindow', [
 
         options: {
             title    : QUILocale.get('quiqqer/cron', 'cron.window.add.cron.title'),
-            icon     : 'icon-time',
+            icon     : 'fa fa-clock-o',
             maxWidth : 750,
             maxHeight: 500,
 
@@ -40,11 +40,11 @@ define('package/quiqqer/cron/bin/CronWindow', [
 
             cancel_button : {
                 text      : QUILocale.get('quiqqer/system', 'cancel'),
-                textimage : 'icon-remove fa fa-remove'
+                textimage : 'fa fa-remove'
             },
             ok_button : {
                 text      : QUILocale.get('quiqqer/system', 'ok'),
-                textimage : 'icon-ok  fa fa-check'
+                textimage : 'fa fa-check'
             }
         },
 
diff --git a/bin/History.js b/bin/History.js
index 676d34e2bf77d40aee95e935dcb47ca8faebfe76..e82aed978d47fb5b6afff6dcddd120070065bb3d 100644
--- a/bin/History.js
+++ b/bin/History.js
@@ -43,7 +43,7 @@ define('package/quiqqer/cron/bin/History', [
 
         options: {
             title: 'Cron-History',
-            icon : 'icon-long-arrow-right'
+            icon : 'fa fa-long-arrow-right'
         },
 
         initialize: function (options) {
diff --git a/bin/Manager.js b/bin/Manager.js
index 2394285da1d51c56eae42e13fc7191565211a7e9..b7ddb5bb1fec560ca9f0f67a5c9912fe3b836b63 100644
--- a/bin/Manager.js
+++ b/bin/Manager.js
@@ -41,7 +41,7 @@ define('package/quiqqer/cron/bin/Manager', [
 
         options: {
             title: 'Cron-Manager',
-            icon : 'icon-time'
+            icon : 'fa fa-clock-o'
         },
 
         initialize: function (options) {
@@ -81,7 +81,7 @@ define('package/quiqqer/cron/bin/Manager', [
                 for (var i = 0, len = result.length; i < len; i++) {
                     result[i].status = {
                         title : QUILocale.get(lg, 'cron.panel.manager.btn.toggle'),
-                        icon  : result[i].active == 1 ? 'icon-ok' : 'icon-remove',
+                        icon  : result[i].active == 1 ? 'fa fa-check' : 'fa fa-remove',
                         cronId: result[i].id,
                         events: {
                             onClick: toggleCron
@@ -91,7 +91,7 @@ define('package/quiqqer/cron/bin/Manager', [
                     result[i].play = {
                         name  : 'cron-play-button-' + result[i].id,
                         title : QUILocale.get(lg, 'cron.panel.manager.btn.execute'),
-                        icon  : 'icon-play',
+                        icon  : 'fa fa-play',
                         cronId: result[i].id,
                         events: {
                             onClick: execCron
@@ -120,7 +120,7 @@ define('package/quiqqer/cron/bin/Manager', [
                 new QUIButton({
                     name     : 'add',
                     text     : QUILocale.get(lg, 'cron.panel.manager.btn.add'),
-                    textimage: 'icon-plus',
+                    textimage: 'fa fa-plus',
                     events   : {
                         onClick: function () {
                             self.openAddCronWindow();
@@ -135,7 +135,7 @@ define('package/quiqqer/cron/bin/Manager', [
                 new QUIButton({
                     name     : 'edit',
                     text     : QUILocale.get(lg, 'cron.panel.manager.btn.edit'),
-                    textimage: 'icon-pencil',
+                    textimage: 'fa fa-edit',
                     events   : {
                         onClick: function () {
                             self.editMarkedCron();
@@ -148,7 +148,7 @@ define('package/quiqqer/cron/bin/Manager', [
                 new QUIButton({
                     name     : 'delete',
                     text     : QUILocale.get(lg, 'cron.panel.manager.btn.delete'),
-                    textimage: 'icon-trash',
+                    textimage: 'fa fa-trash',
                     events   : {
                         onClick: function () {
                             self.deleteMarkedCrons();
@@ -163,7 +163,7 @@ define('package/quiqqer/cron/bin/Manager', [
                 new QUIButton({
                     name     : 'history',
                     text     : QUILocale.get(lg, 'cron.panel.manager.btn.history'),
-                    textimage: 'icon-long-arrow-right',
+                    textimage: 'fa fa-long-arrow-right',
                     events   : {
                         onClick: function () {
                             self.showHistory();
@@ -176,6 +176,21 @@ define('package/quiqqer/cron/bin/Manager', [
             this.getButtons('delete').disable();
 
 
+            this.addButton(new QUIButtonSeperator());
+            this.addButton(
+                new QUIButton({
+                    name     : 'cronservice',
+                    text     : QUILocale.get(lg, 'cron.panel.manager.btn.cronservice.register'),
+                    textimage: 'fa fa-cloud',
+                    events   : {
+                        onClick: function () {
+                            self.registerCronservice();
+                        }
+                    }
+                })
+            );
+
+
             var Content   = this.getContent(),
 
                 Container = new Element('div', {
@@ -322,7 +337,7 @@ define('package/quiqqer/cron/bin/Manager', [
             });
 
             new QUIConfirm({
-                icon       : 'icon-remove',
+                icon       : 'fa fa-remove',
                 title      : QUILocale.get(lg, 'cron.window.delete.cron.title'),
                 text       : QUILocale.get(lg, 'cron.window.delete.cron.text'),
                 information: QUILocale.get(lg, 'cron.window.delete.cron.information', {
@@ -442,12 +457,12 @@ define('package/quiqqer/cron/bin/Manager', [
             }
 
             for (i = 0, len = buttons.length; i < len; i++) {
-                buttons[i].setAttribute('icon', 'icon-refresh icon-spin');
+                buttons[i].setAttribute('icon', 'fa fa-spinner fa-spin');
             }
 
             Ajax.post('package_quiqqer_cron_ajax_cron_executeCron', function () {
                 for (i = 0, len = buttons.length; i < len; i++) {
-                    buttons[i].setAttribute('icon', 'icon-play');
+                    buttons[i].setAttribute('icon', 'fa fa-play');
                 }
 
             }, {
@@ -465,6 +480,16 @@ define('package/quiqqer/cron/bin/Manager', [
             require(['package/quiqqer/cron/bin/History'], function (Panel) {
                 new Panel().inject(self.getParent());
             });
+        },
+
+        /**
+         * Opens the Cronservice registration
+         */
+        registerCronservice: function () {
+            require(['package/quiqqer/cron/bin/CronServiceWindow'], function (CronServiceWindow) {
+                var csWindow = new CronServiceWindow();
+                csWindow.open();
+            });
         }
     });
 });
\ No newline at end of file
diff --git a/bin/cron.php b/bin/cron.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1058b1debc51c05e1244a05e8df04a23241ad1a
--- /dev/null
+++ b/bin/cron.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * External execution
+ */
+
+define('QUIQQER_SYSTEM', true);
+require dirname(dirname(dirname(dirname(__FILE__)))) . "/header.php";
+
+use \Symfony\Component\HttpFoundation\Response;
+
+$Cron     = new QUI\Cron\Manager();
+$Response = QUI::getGlobalResponse();
+
+
+try {
+    if (!QUI::getUserBySession()->getId()
+        && isset($_GET['username'])
+        && isset($_GET['password'])
+        && isset($_GET['login'])
+    ) {
+        $User = QUI::getUsers()->login(
+            $_GET['username'],
+            $_GET['password']
+        );
+
+        if ($User->getId()) {
+            QUI::getSession()->set('uid', $User->getId());
+
+            QUI\Permissions\Permission::setUser($User);
+        }
+    }
+} catch (QUI\Exception $Exception) {
+    $Response->setStatusCode(Response::HTTP_FORBIDDEN);
+    $Response->send();
+    exit;
+}
+
+try {
+    $Cron->execute();
+
+    $Response->setStatusCode(Response::HTTP_OK);
+    $Response->send();
+} catch (QUI\Exception $Exception) {
+    QUI\System\Log::addAlert($Exception->getMessage(), array(
+        'type' => 'cron execution'
+    ));
+
+    $Response->setStatusCode(Response::HTTP_SERVICE_UNAVAILABLE);
+    $Response->send();
+}
+
+exit;
diff --git a/composer.json b/composer.json
index be9e7736c065b0713a5589181357fbabd1692e42..779bd180dc831050dab1e2da66a6ec9006d08029 100644
--- a/composer.json
+++ b/composer.json
@@ -1,29 +1 @@
-{
-    "name" : "quiqqer/cron",
-    "type" : "quiqqer-module",
-    "description" : "Provided currency calculation and a automtatic cron to get the Euro foreign exchange reference rates.",
-    "version" : "dev-master",
-    "license" : "GPL-2.0+",
-
-    "authors" : [{
-        "name": "Henning Leutz",
-        "email": "leutz@pcsg.de",
-        "homepage": "http://www.pcsg.de",
-        "role": "Developer"
-    }],
-
-    "support" : {
-        "email" : "support@pcsg.de"
-    },
-
-    "require": {
-        "quiqqer/quiqqer" : "*@dev",
-        "mtdowling/cron-expression": "1.0.*"
-    },
-
-    "autoload": {
-        "psr-0" : {
-            "QUI" : "src/"
-        }
-    }
-}
+{"name":"quiqqer\/cron","type":"quiqqer-module","description":"Provided currency calculation and a automtatic cron to get the Euro foreign exchange reference rates.","version":"dev-master","license":"GPL-2.0+","authors":[{"name":"Henning Leutz","email":"leutz@pcsg.de","homepage":"http:\/\/www.pcsg.de","role":"Developer"}],"support":{"email":"support@pcsg.de"},"require":{"quiqqer\/quiqqer":"*@dev","quiqqer\/utils":">=1.4|dev-dev","mtdowling\/cron-expression":"1.0.*"},"autoload":{"psr-0":{"QUI":"src\/"}}}
\ No newline at end of file
diff --git a/cron.xml b/cron.xml
index 94031212a4cc6e8c1809de5e6fc8cfc04849fe70..c315c5c209ee21f1497631f94eafa7a982895a97 100644
--- a/cron.xml
+++ b/cron.xml
@@ -5,6 +5,11 @@
         <description>Ordner für temporäre Daten leeren</description>
     </cron>
 
+    <cron exec="\QUI\Cron\QuiqqerCrons::clearSessions">
+        <title>Sessions säubern</title>
+        <description>Löscht unnötige / abgelaufene Session Dateien</description>
+    </cron>
+
     <cron exec="\QUI\Cron\QuiqqerCrons::clearCache">
         <title>Cache leeren</title>
         <description>Kompletten Cache leeren</description>
@@ -13,8 +18,10 @@
     <cron exec="\QUI\Cron\QuiqqerCrons::clearAdminMediaCache">
         <title>Media Cache der Administration leeren</title>
         <description>
-            Leert die Cachebilder von der Administration.<br />
-            Dies sind zum Beispiel die Vorschaubilder in der Administration.<br />
+            Leert die Cachebilder von der Administration.
+            <br/>
+            Dies sind zum Beispiel die Vorschaubilder in der Administration.
+            <br/>
             Der öffentliche Mediacache wird nicht geleert
         </description>
     </cron>
@@ -32,8 +39,8 @@
             Durchsucht das Projekt und aktiviert oder deaktiviert Seiten je nach Veröffentlichungsdatum.
         </description>
         <params>
-            <param name="project" type="string" />
-            <param name="lang" type="string" />
+            <param name="project" type="string"/>
+            <param name="lang" type="string"/>
         </params>
     </cron>
 
diff --git a/database.xml b/database.xml
index 1e8c91341a462c5f974751df2853ce38daa3a448..daf288184fad34e5dcd36c622ea3ebdc234fba8e 100644
--- a/database.xml
+++ b/database.xml
@@ -21,6 +21,12 @@
             <field type="INT( 11 ) NOT NULL">uid</field>
             <field type="DATETIME NULL">lastexec</field>
         </table>
+
+        <table name="cron_cronservice">
+            <field type="INT( 3 ) NOT NULL">cronid</field>
+            <field type="INT( 11 ) NOT NULL">uid</field>
+            <field type="DATETIME NULL">lastexec</field>
+        </table>
     </global>
 
 </database>
diff --git a/events.xml b/events.xml
index bd16d5686cbbcb241f0e474cdcab7fb3ed11fc04..863282f650c031b69128eba0817018e7926d6e13 100644
--- a/events.xml
+++ b/events.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <events>
-    <event on="onAdminLoad" fire="\QUI\Cron\EventHandler::onAdminLoad" />
-    <event on="onAdminLoadFooter" fire="\QUI\Cron\EventHandler::adminLoadFooter" />
+    <event on="onAdminLoad" fire="\QUI\Cron\EventHandler::onAdminLoad"/>
+    <event on="onAdminLoadFooter" fire="\QUI\Cron\EventHandler::adminLoadFooter"/>
+    <event on="onPackageSetup" fire="\QUI\Cron\EventHandler::onPackageSetup"/>
 </events>
\ No newline at end of file
diff --git a/locale.xml b/locale.xml
index 98b78cfcb35b85a1df737d2acf40d0ae2dc09ee2..a479c7efb574af5ba8ee6623e62e881c3d24d00b 100644
--- a/locale.xml
+++ b/locale.xml
@@ -1,16 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <locales>
+    <groups name="quiqqer/cron" datatype="php,js">
+        <locale name="message.cron.admin.info.24h">
+            <de><![CDATA[In den letzten 24 Stunden wurden keine geplanten Aufgaben ausgeführt.
+                Unter Umständen sind die geplanten Aufgaben fehlerhaft.]]></de>
+            <en><![CDATA[In the past 24 hours no cron was running.
+                It is possible that the Crons will not run properly.]]></en>
+        </locale>
+    </groups>
     <groups name="quiqqer/cron" datatype="php">
         <locale name="message.cron.succesful.executed">
             <de><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt]]></de>
             <en><![CDATA[The Cron ran successfully]]></en>
         </locale>
-        <locale name="message.cron.admin.info.24h">
-            <de><![CDATA[In den letzten 24 Stunden wurde keine geplante Aufgabe ausgeführt.
-                Unter Umständen sind die geplanten Augaben fehlerhaft.]]></de>
-            <en><![CDATA[In the past 24 hours no cron was running.
-                It is possible that the Crons will not run properly.]]></en>
-        </locale>
         <locale name="message.cron.succesful.added">
             <de><![CDATA[Aufgabe erfolgreich hinzugefügt]]></de>
             <en><![CDATA[Cron added successfully]]></en>
@@ -29,8 +31,8 @@
         </locale>
 
         <locale name="settings.title">
-            <de><![CDATA[Cron Einstellungen]]></de>
-            <en><![CDATA[Cron settings]]></en>
+            <de><![CDATA[Cron / Wiederkehrende Aufgaben]]></de>
+            <en><![CDATA[Cron / Recurring tasks]]></en>
         </locale>
         <locale name="settings.cron.title">
             <de><![CDATA[Allgemeine Einstellungen]]></de>
@@ -58,6 +60,22 @@
             <de><![CDATA[Der Administrator bekommt eine Nachricht wenn die Crons die letzten 24h nicht liefen.]]></de>
             <en><![CDATA[The administrator receives a message when the Cron did not run the last 24 hours]]></en>
         </locale>
+        <locale name="exception.registration.empty.domain">
+            <de><![CDATA[Es muss eine Domain angegeben sein]]></de>
+            <en><![CDATA[Domain can not be empty]]></en>
+        </locale>
+        <locale name="exception.registration.empty.email">
+            <de><![CDATA[Es muss eine Email angegeben sein.]]></de>
+            <en><![CDATA[An email must be given.]]></en>
+        </locale>
+        <locale name="exception.registration.empty.packageDir">
+            <de><![CDATA[Konnte den "package" Pfad nicht auslesen!]]></de>
+            <en><![CDATA[Could not parse the "package" folder path.]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.status.text.last_execution.never">
+            <de><![CDATA[Nie]]></de>
+            <en><![CDATA[Never]]></en>
+        </locale>
     </groups>
     <groups name="quiqqer/cron" datatype="js">
         <locale name="cron.id">
@@ -146,10 +164,111 @@
             <de><![CDATA[Aufgabenverlauf]]></de>
             <en><![CDATA[Cron history]]></en>
         </locale>
+        <locale name="cron.panel.manager.btn.cronservice.register">
+            <de><![CDATA[Cronservice]]></de>
+            <en><![CDATA[Cronservice]]></en>
+        </locale>
+
+        <locale name="cron.window.cronservice.title">
+            <de><![CDATA[Cronservice]]></de>
+            <en><![CDATA[Cronservice]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.btn.cancel">
+            <de><![CDATA[Abbrechen]]></de>
+            <en><![CDATA[Cancel]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.btn.register">
+            <de><![CDATA[Registrieren]]></de>
+            <en><![CDATA[Register]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.title">
+            <de><![CDATA[Cronservice]]></de>
+            <en><![CDATA[Cronservice]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.about.title">
+            <de><![CDATA[Was ist das?]]></de>
+            <en><![CDATA[About]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.about.text">
+            <de><![CDATA[Der QUIQQER Cronservice ermöglicht es Crons auf Systemen auszuführen, die nativ keine Crons ausführen können.
+Realisiert wird dies durch einen Server, an dem sich QUIQQER-SYteme anmelden können, welcher wiederrum regelmäßig die Crons der angemeldeten Systeme anstoßt.
+Dies kann vorallem auf Shared-Hostings von großem Nutzen sein.]]></de>
+            <en><![CDATA[The QUIQQER cronservice enables systems withou native cronfunctionality to execute the QUIQQER crons anyway.
+This is works with an external server on which QUIQQER systems can register themselves. This server will start the scheduled crons of all registered QUIQQER systems regularely.
+]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.status.title">
+            <de><![CDATA[Status]]></de>
+            <en><![CDATA[State]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.status.text">
+            <de><![CDATA[Hier können Sie den Status Ihrer Registrierung verfolgen :]]></de>
+            <en><![CDATA[You can check the state of your registration here :]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.btn.register">
+            <de><![CDATA[Registrieren]]></de>
+            <en><![CDATA[Register]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.title">
+            <de><![CDATA[Registrieren]]></de>
+            <en><![CDATA[Register]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.placeholder.email">
+            <de><![CDATA[Email]]></de>
+            <en><![CDATA[Email]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.registration.title">
+            <de><![CDATA[Registration]]></de>
+            <en><![CDATA[Registration]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.txt.email.title">
+            <de><![CDATA[Email]]></de>
+            <en><![CDATA[Email]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.btn.register">
+            <de><![CDATA[Registrieren]]></de>
+            <en><![CDATA[Register]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.btn.unregister">
+            <de><![CDATA[Abmelden]]></de>
+            <en><![CDATA[Unregister]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.status.text.inactive">
+            <de><![CDATA[Inaktiv]]></de>
+            <en><![CDATA[Inactive]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.status.text.registered">
+            <de><![CDATA[Aktiv]]></de>
+            <en><![CDATA[Active]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.status.text.unregistered">
+            <de><![CDATA[Nicht registriert]]></de>
+            <en><![CDATA[Not registered]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.lbl.stats.status">
+            <de><![CDATA[Status: ]]></de>
+            <en><![CDATA[Status: ]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.lbl.stats.errors">
+            <de><![CDATA[Fehlerzahl: ]]></de>
+            <en><![CDATA[Errorcount: ]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.register.lbl.stats.lastExecution">
+            <de><![CDATA[Letzte Ausführung: ]]></de>
+            <en><![CDATA[Last execution: ]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.btn.unregister.confirm">
+            <de><![CDATA[Sind Sie sicher?]]></de>
+            <en><![CDATA[Are you sure?]]></en>
+        </locale>
+        <locale name="cron.window.cronservice.content.btn.unregister">
+            <de><![CDATA[Registrierung entfernen]]></de>
+            <en><![CDATA[Unregister]]></en>
+        </locale>
 
         <locale name="permission.quiqqer.cron._header">
             <de><![CDATA[Aufgaben / Tasks]]></de>
-            <en><![CDATA[Ttasks]]></en>
+            <en><![CDATA[Tasks]]></en>
         </locale>
         <locale name="permission.quiqqer.cron.execute">
             <de><![CDATA[Darf Aufgaben / Tasks ausführen.]]></de>
@@ -175,6 +294,5 @@
             <de><![CDATA[Darf Aufgaben / Tasks deaktivieren.]]></de>
             <en><![CDATA[Can deactivate tasks.]]></en>
         </locale>
-
     </groups>
 </locales>
\ No newline at end of file
diff --git a/menu.xml b/menu.xml
index 99e711399fa40fa0c036228120175e4268525ddb..f317d42deb0c0be35ea431214f926bbe1b320371 100644
--- a/menu.xml
+++ b/menu.xml
@@ -2,7 +2,7 @@
 <menu>
     <item parent="/extras/"
           name="crons"
-          icon="icon-time"
+          icon="fa fa-clock-o"
     >
         Crons
     </item>
@@ -10,7 +10,7 @@
     <item parent="/extras/crons/"
           name="manager"
           require="package/quiqqer/cron/bin/Manager"
-          icon="icon-time"
+          icon="fa fa-clock-o"
     >
         Cron-Manager
     </item>
@@ -18,7 +18,7 @@
     <item parent="/extras/crons/"
           name="history"
           require="package/quiqqer/cron/bin/History"
-          icon="icon-long-arrow-right"
+          icon="fa fa-long-arrow-right"
     >
         Cron-History
     </item>
diff --git a/settings.xml b/settings.xml
index 7a4c4999dcd511c22d1fd1be3fe8d307c9fd5095..c4dc553962bf46969b8f4a69417636657115b4aa 100644
--- a/settings.xml
+++ b/settings.xml
@@ -20,7 +20,7 @@
                 <locale group="quiqqer/cron" var="settings.title" />
             </title>
             <params>
-                <icon>icon-time</icon>
+                <icon>fa fa-clock-o</icon>
             </params>
 
             <categories>
@@ -28,7 +28,7 @@
                     <text>
                         <locale group="quiqqer/cron" var="settings.title" />
                     </text>
-                    <icon>icon-time</icon>
+                    <icon>fa fa-clock-o</icon>
 
                     <settings title="settings" name="settings">
                         <title>
diff --git a/src/QUI/Cron/CronService.php b/src/QUI/Cron/CronService.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d3c0ae39fb7fe9764d2f192dba8e6d7a44ab84a
--- /dev/null
+++ b/src/QUI/Cron/CronService.php
@@ -0,0 +1,260 @@
+<?php
+
+namespace QUI\Cron;
+
+use QUI;
+use QUI\System\Log;
+
+class CronService
+{
+
+    const CRONSERVICE_URL = "https://cron.quiqqer.com";
+
+    private $domain;
+    private $https;
+    private $packageDir;
+
+    /**
+     * CronService constructor.
+     */
+    public function __construct()
+    {
+        $host    = QUI::$Conf->get("globals", "host");
+        $cms_dir = QUI::$Conf->get("globals", "cms_dir");
+        $opt_dir = QUI::$Conf->get("globals", "opt_dir");
+        $url_dir = QUI::$Conf->get("globals", "url_dir");
+
+        // VHost Domain
+        $vhost        = QUI::getProjectManager()->getStandard()->getVHost(true, true);
+
+        // Check if https should be used.
+        if (substr($vhost, 0, 8) == 'https://') {
+            $this->https = true;
+        }
+
+        $this->domain = str_replace("https://", "", $vhost);
+
+        // Read the domain from the config file if no vhost could be detected.
+        if (empty($vhost)) {
+            // Parse Domain and protocol
+            if (strpos($host, "https://") !== false) {
+                $this->https  = true;
+                $this->domain = str_replace("https://", "", $host);
+            } elseif (strpos($host, "http://") !== false) {
+                $this->https  = false;
+                $this->domain = str_replace("http://", "", $host);
+            } else {
+                $this->https  = false;
+                $this->domain = $host;
+            }
+        }
+
+
+        // Parse Package dir
+        $this->packageDir = $url_dir . str_replace($cms_dir, "", $opt_dir);
+    }
+
+    /**
+     * Will register this quiqqer instance.
+     *
+     * @param $email - Email used for communication. Must be valid.
+     */
+    public function register($email)
+    {
+        $this->sendRegistrationRequest($this->domain, $email, $this->packageDir, $this->https);
+    }
+
+    /**
+     * Gets the status of the given domain.
+     *
+     * Returnformat :
+     * array(
+     *       'status'           => 0,  (0=unregistered; 1=active; 2=inactive)
+     *       'current_failures' => int,
+     *       'total_failures'   => int,
+     *       'last_execution'   => string (mysql dateformat | Localized 'never')
+     * )
+     *
+     * @return mixed
+     */
+    public function getStatus()
+    {
+        $status = $this->makeServerAjaxCall('package_pcsg_cronservice_ajax_getStatus', array(
+            'domain' => $this->domain
+        ));
+
+        if (empty($status['last_execution'])) {
+            $status['last_execution'] = QUI::getLocale()->get(
+                'quiqqer/cron',
+                'cron.window.cronservice.status.text.last_execution.never'
+            );
+        }
+
+        return $status;
+    }
+
+    /**
+     * Revoked the registration for this quiqqer instance
+     */
+    public function revokeRegistration()
+    {
+        $token = $this->readRevokeToken();
+
+        $this->makeServerAjaxCall('package_pcsg_cronservice_ajax_revokeRegistration', array(
+            'domain' => $this->domain,
+            'token'  => $token
+        ));
+    }
+
+    /**
+     * Sends an ajax request to the cronservice server.
+     *
+     * @param $domain - The domain to be registered. Example : example.org
+     * @param $email - The Email that should be used for communication.
+     * @param $packageDir - The package url dir
+     * @param $https - wether or not http secure should be used to call the cron.php
+     * @throws Exception
+     */
+    private function sendRegistrationRequest($domain, $email, $packageDir, $https)
+    {
+        if (empty($domain)) {
+            throw new Exception(array("quiqqer/cron", "exception.registration.empty.domain"));
+        }
+
+        if (empty($email)) {
+            throw new Exception(array("quiqqer/cron", "exception.registration.empty.email"));
+        }
+
+        if (empty($packageDir)) {
+            throw new Exception(array("quiqqer/cron", "exception.registration.empty.packageDir"));
+        }
+
+
+        $url = self::CRONSERVICE_URL . "/admin/ajax.php?" .
+            "_rf=" . urlencode("[\"package_pcsg_cronservice_ajax_register\"]") .
+            "&package=" . urlencode("pcsg/cronservice") .
+            "&lang=" . QUI::getUserBySession()->getLang() .
+            "&domain=" . urlencode($domain) .
+            "&email=" . urlencode($email) .
+            "&packageDir=" . urlencode($packageDir) .
+            "&https=" . ($https ? "1" : "0") .
+            "&user=" . QUI::getUserBySession()->getName();
+
+
+        $curl = curl_init();
+        curl_setopt_array($curl, array(
+            CURLOPT_RETURNTRANSFER => 1,
+            CURLOPT_URL            => $url,
+            CURLOPT_USERAGENT      => 'QUIQQER'
+        ));
+
+        $response = curl_exec($curl);
+        $response = substr($response, 9, -10);
+        $data     = json_decode($response, true);
+        if (json_last_error() != JSON_ERROR_NONE) {
+            Log::addDebug($response);
+            throw new Exception(json_last_error_msg());
+        }
+
+        if (!isset($data['package_pcsg_cronservice_ajax_register']['result'])) {
+            throw new Exception("Something went wrong!");
+        }
+
+        $data = $data['package_pcsg_cronservice_ajax_register']['result'];
+        if (!isset($data['status']) || $data['status'] != 1) {
+            Log::addDebug($response);
+            Log::writeRecursive($data);
+            if (isset($data['message'])) {
+                throw new Exception($data['message']);
+            }
+
+            throw new Exception("Something went wrong!");
+        }
+
+
+        $revokeCode = $data['revokeCode'];
+        $this->saveRevokeToken($revokeCode);
+
+        curl_close($curl);
+    }
+
+    /**
+     * Calls the given ajax function on the Cronservice server and returns its output
+     * @param $function - Ajax function name
+     * @param $params - Params to pass
+     * @return mixed
+     * @throws QUI\Exception
+     */
+    private function makeServerAjaxCall($function, $params)
+    {
+        $url = self::CRONSERVICE_URL . "/admin/ajax.php?" .
+            "_rf=" . urlencode('["' . $function . '"]') .
+            "&package=" . urlencode("pcsg/cronservice") .
+            "&lang=" . QUI::getUserBySession()->getLang();
+
+        foreach ($params as $param => $value) {
+            $url .= '&' . $param . '=' . urlencode($value);
+        }
+
+        $curl = curl_init();
+        curl_setopt_array($curl, array(
+            CURLOPT_RETURNTRANSFER => 1,
+            CURLOPT_URL            => $url,
+            CURLOPT_USERAGENT      => 'QUIQQER'
+        ));
+
+        $response = curl_exec($curl);
+
+        curl_close($curl);
+
+        // Process raw ajax response
+        $response = substr($response, 9, -10);
+        $response = json_decode($response, true);
+
+
+        if (isset($response[$function]['Exception'])) {
+            throw new QUI\Exception($response[$function]['Exception']['message']);
+        }
+
+        return $response[$function]['result'];
+    }
+
+    /**
+     * Saves the revoke token into a file
+     * @param $token
+     */
+    private function saveRevokeToken($token)
+    {
+        $varDir   = QUI::getPackage('quiqqer/cron')->getVarDir() . '/cronservice';
+        $fileName = $varDir . '/.revoketoken';
+
+        if (!is_dir($varDir)) {
+            mkdir($varDir, 0700, true);
+        }
+
+        file_put_contents($fileName, $token);
+    }
+
+    /**
+     * Reads the revoke token from the filesystem
+     * @return string
+     * @throws Exception
+     */
+    private function readRevokeToken()
+    {
+        $varDir   = QUI::getPackage('quiqqer/cron')->getVarDir() . '/cronservice';
+        $fileName = $varDir . '/.revoketoken';
+
+        if (!file_exists($fileName)) {
+            throw new Exception("Tokenfile not present");
+        }
+
+        $token = file_get_contents($fileName);
+
+        if ($token === false) {
+            throw new Exception("Could not read tokenfile.");
+        }
+
+        return $token;
+    }
+}
diff --git a/src/QUI/Cron/EventHandler.php b/src/QUI/Cron/EventHandler.php
index f61eed9c6145fbdf856143c1bcbb87c5f3d8e7a0..ef6f2fb8999cbff5f980f79883fe316bbea0814b 100644
--- a/src/QUI/Cron/EventHandler.php
+++ b/src/QUI/Cron/EventHandler.php
@@ -15,6 +15,35 @@ use QUI;
  */
 class EventHandler
 {
+    /**
+     * event: onPackageSetup
+     *
+     * @param QUI\Package\Package $Package
+     */
+    public static function onPackageSetup(QUI\Package\Package $Package)
+    {
+        if ($Package->getName() === 'quiqqer/cron') {
+            self::checkCronTable();
+        }
+    }
+
+    /**
+     * Checks if the table cron is correct
+     *
+     * @return void
+     */
+    protected static function checkCronTable()
+    {
+        $categoryColumn = QUI::getDataBase()->table()->getColumn('cron', 'title');
+
+        if ($categoryColumn['Type'] === 'varchar(1000)') {
+            return;
+        }
+
+        $Stmnt = QUI::getDataBase()->getPDO()->prepare("ALTER TABLE cron MODIFY `title` VARCHAR(1000)");
+        $Stmnt->execute();
+    }
+
     /**
      * event : on admin header loaded
      */
@@ -45,7 +74,7 @@ class EventHandler
         // check last cron execution
         $CronManager = new Manager();
         $result      = $CronManager->getHistoryList(array(
-            'page' => 1,
+            'page'    => 1,
             'perPage' => 1
         ));
 
@@ -97,7 +126,7 @@ class EventHandler
     {
         QUI::getMessagesHandler()->sendAttention(
             QUI::getUserBySession(),
-            QUI::getLocale()->get('quiqqer/cron', 'message.cron.admin.info.24h')
+            QUI::getUserBySession()->getLocale()->get('quiqqer/cron', 'message.cron.admin.info.24h')
         );
     }
 }
diff --git a/src/QUI/Cron/Exception.php b/src/QUI/Cron/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..e185f57b189361eba8fe3d037ef9c16537cd40c8
--- /dev/null
+++ b/src/QUI/Cron/Exception.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace QUI\Cron;
+
+use QUI;
+
+class Exception extends QUI\Exception
+{
+
+}
diff --git a/src/QUI/Cron/Manager.php b/src/QUI/Cron/Manager.php
index f247899b31c4d85c14e72ded7735339ad1b1ffdb..1bb9fb3166452f4764e4e093950b32e690051b24 100644
--- a/src/QUI/Cron/Manager.php
+++ b/src/QUI/Cron/Manager.php
@@ -7,7 +7,7 @@
 namespace QUI\Cron;
 
 use QUI;
-use QUI\Rights\Permission;
+use QUI\Permissions\Permission;
 use Cron\CronExpression;
 
 /**
@@ -51,7 +51,7 @@ class Manager
             $params = array();
         }
 
-        QUI::getDataBase()->insert($this->Table(), array(
+        QUI::getDataBase()->insert($this->table(), array(
             'active'    => 1,
             'exec'      => $cronData['exec'],
             'title'     => $cronData['title'],
@@ -111,12 +111,11 @@ class Manager
             CronExpression::factory(
                 "$min $hour $day $month $dayOfWeek"
             );
-
         } catch (\Exception $Exception) {
             throw new QUI\Exception($Exception->getMessage());
         }
 
-        QUI::getDataBase()->update($this->Table(), array(
+        QUI::getDataBase()->update($this->table(), array(
             'exec'      => $cronData['exec'],
             'title'     => $cronData['title'],
             'min'       => $min,
@@ -147,7 +146,7 @@ class Manager
         Permission::checkPermission('quiqqer.cron.deactivate');
 
         QUI::getDataBase()->update(
-            $this->Table(),
+            $this->table(),
             array('active' => 1),
             array('id' => (int)$cronId)
         );
@@ -163,7 +162,7 @@ class Manager
         Permission::checkPermission('quiqqer.cron.activate');
 
         QUI::getDataBase()->update(
-            $this->Table(),
+            $this->table(),
             array('active' => 0),
             array('id' => (int)$cronId)
         );
@@ -188,7 +187,7 @@ class Manager
                 return;
             }
 
-            $DataBase->delete($this->Table(), array(
+            $DataBase->delete($this->table(), array(
                 'id' => $id
             ));
         }
@@ -237,7 +236,6 @@ class Manager
             // execute cron
             try {
                 $this->executeCron($entry['id']);
-
             } catch (\Exception $Exception) {
                 $message = print_r($entry, true);
                 $message .= "\n" . $Exception->getMessage();
@@ -299,7 +297,7 @@ class Manager
 
 
         QUI::getDataBase()->update(
-            self::Table(),
+            self::table(),
             array('lastexec' => date('Y-m-d H:i:s')),
             array('id' => $cronId)
         );
@@ -346,7 +344,7 @@ class Manager
     public function getCronById($cronId)
     {
         $result = QUI::getDataBase()->fetch(array(
-            'from'  => $this->Table(),
+            'from'  => $this->table(),
             'where' => array(
                 'id' => (int)$cronId
             ),
@@ -406,7 +404,7 @@ class Manager
         ));
 
         $dataOfCron = QUI::getDataBase()->fetch(array(
-            'from' => $this->Table()
+            'from' => $this->table()
         ));
 
         $Users  = QUI::getUsers();
@@ -418,7 +416,6 @@ class Manager
             $crons[$cronData['id']] = $cronData;
         }
 
-
         foreach ($data as $entry) {
             $entry['cronTitle'] = '';
             $entry['username']  = '';
@@ -429,7 +426,6 @@ class Manager
 
             try {
                 $entry['username'] = $Users->get($entry['uid'])->getName();
-
             } catch (QUI\Exception $Exception) {
             }
 
@@ -462,10 +458,29 @@ class Manager
     public function getList()
     {
         return QUI::getDataBase()->fetch(array(
-            'from' => self::Table()
+            'from' => self::table()
         ));
     }
 
+    /**
+     * Checks if a specific cron is already set up
+     *
+     * @param string $cron - cron title
+     * @return bool
+     */
+    public function isCronSetUp($cron)
+    {
+        $list = $this->getList();
+
+        foreach ($list as $entry) {
+            if ($entry['title'] == $cron) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     /**
      * Exist the cron?
      *
@@ -487,7 +502,7 @@ class Manager
      *
      * @return string
      */
-    public static function TABLE()
+    public static function table()
     {
         return QUI_DB_PRFX . 'cron';
     }
@@ -515,7 +530,7 @@ class Manager
             return array();
         }
 
-        $Dom   = QUI\Utils\XML::getDomFromXml($file);
+        $Dom   = QUI\Utils\Text\XML::getDomFromXml($file);
         $crons = $Dom->getElementsByTagName('crons');
 
         if (!$crons || !$crons->length) {
diff --git a/src/QUI/Cron/QuiqqerCrons.php b/src/QUI/Cron/QuiqqerCrons.php
index 83737ea762bbf23f7090e99ed9d7f8198cb97931..bce951b44ec24662965b4b06d0bef23abc162b4f 100644
--- a/src/QUI/Cron/QuiqqerCrons.php
+++ b/src/QUI/Cron/QuiqqerCrons.php
@@ -48,6 +48,34 @@ class QuiqqerCrons
         QUI\Utils\System\File::unlink(VAR_DIR . 'cache/admin/media/');
     }
 
+    /**
+     * delete all unwanted / unneeded sessions
+     */
+    public static function clearSessions()
+    {
+        // clear nativ session storage
+        $sessionDir = VAR_DIR . 'sessions/';
+
+        if (!is_dir($sessionDir)) {
+            return;
+        }
+
+        $sessionFiles = QUI\Utils\System\File::readDir($sessionDir);
+        $maxtime      = 1400;
+
+        if (QUI::conf('session', 'max_life_time')) {
+            $maxtime = (int)QUI::conf('session', 'max_life_time');
+        }
+
+        foreach ($sessionFiles as $sessionFile) {
+            $fmtime = filemtime($sessionDir . $sessionFile);
+
+            if ($fmtime + $maxtime < time()) {
+                unlink($sessionDir . $sessionFile);
+            }
+        }
+    }
+
     /**
      * Check project sites release dates
      * Activate or deactivate sites
@@ -104,7 +132,6 @@ class QuiqqerCrons
                 $Site->deactivate();
 
                 $deactivate[] = (int)$entry['id'];
-
             } catch (QUI\Exception $Exception) {
                 QUI\System\Log::writeException($Exception);
             }
@@ -138,7 +165,6 @@ class QuiqqerCrons
                 $Site->activate();
 
                 $activate[] = (int)$entry['id'];
-
             } catch (QUI\Exception $Exception) {
                 QUI\System\Log::writeException($Exception);
             }