diff --git a/classes/cronlog-renderer.class.php b/classes/cronlog-renderer.class.php
index c13dfa56adecc6b71c61e5078979aa069b5eba94..759acda3781af077e6921cc801a42e39c26c96a0 100644
--- a/classes/cronlog-renderer.class.php
+++ b/classes/cronlog-renderer.class.php
@@ -60,7 +60,7 @@ class cronlogrenderer extends cronlog{
         // Array ( [SCRIPTNAME] => apt-get update [SCRIPTTTL] => 1440 [SCRIPTSTARTTIME] => 2016-06-21 06:00:02, 1466481602 [SCRIPTLABEL] => apt-get [SCRIPTENDTIME] => 2016-06-21 06:00:49, 1466481649 [SCRIPTEXECTIME] => 47 s [SCRIPTRC] => 0 )
         foreach($aData as $sDtakey=>$aEntry){
             if(!$sTblHead){
-                foreach(array('Startzeit', 'Label', 'Server', 'Dauer', 'TTL', 'Exitcode', 'Kommentar' /*, 'Aktionen'*/) as $sKey){
+                foreach(array('Startzeit', 'Label', 'Server', 'Dauer', 'TTL', '$?', 'Expired', 'Status' /*, 'Aktionen'*/) as $sKey){
                     $sTblHead.='<th>'.$sKey.'</th>';
                 }
             }
@@ -69,7 +69,7 @@ class cronlogrenderer extends cronlog{
             $iLast=max(array($iLast, date("U", $aEntry['SCRIPTSTARTTIME'])));
             
             $aErrors=array();
-            $iNextRun=$aEntry['SCRIPTSTARTTIME']+((int)$aEntry['SCRIPTTTL']*1.5*60);
+            $iNextRun=$aEntry['SCRIPTSTARTTIME']+((int)$aEntry['SCRIPTTTL']*60);
             
             if($iNextRun < date("U")){
                 $aErrors[]='outdated';
@@ -90,18 +90,28 @@ class cronlogrenderer extends cronlog{
                 $sClass='message-ok';
             }
             
-            $sHtml.='<tr class="'.$sClass.'" onclick="showFile(\''.$aEntry['logfile'].'\');" title="Klick=['.$aEntry['logfile'].'] anzeigen ">'
+            $sHtml.='<tr onclick="showFile(\''.$aEntry['logfile'].'\');" title="Klick=['.$aEntry['logfile'].'] anzeigen ">'
                     . '<td>'.date("Y-m-d H:i:s", $aEntry['SCRIPTSTARTTIME']).'</td>'
                     // . '<td>'.$aEntry['SCRIPTNAME'].'</td>'
                     . '<td>'.$aEntry['SCRIPTLABEL'].'</td>'
                     . '<td>'.$aEntry['server'].'</td>'
-                    . '<td>'
+                    . '<td'
+                        .($aEntry['SCRIPTEXECTIME']>$this->_iMinTime4Timeline ? ' class="message-warning"' : '' )
+                    . '>'
                         .(int)$aEntry['SCRIPTEXECTIME'].'s'
                         .((int)$aEntry['SCRIPTEXECTIME']>100 ? ' ('.round((int)$aEntry['SCRIPTEXECTIME']/60).'min)' : '') 
                         .'</td>'
                     . '<td>'.$aEntry['SCRIPTTTL'].'</td>'
-                    . '<td>'.$aEntry['SCRIPTRC'].'</td>'
-                    . '<td>'.(count($aErrors) ? 'FEHLER:<br>*'.implode('<br>*', $aErrors) : 'OK').'</td>'
+                    . '<td class="'.($aEntry['SCRIPTRC']>0 ? 'message-error' : 'message-ok' ).'">'
+                        .$aEntry['SCRIPTRC']
+                        .'</td>'
+                    . '<td class="'.($iNextRun < date("U") 
+                            ?  ($iNextRun < date("U") -600 ? 'message-error' : 'message-warning')
+                            : '' ).'">'
+                        . date("Y-m-d H:i", $iNextRun).'</td>'
+                    . '<td class="'.(count($aErrors) ? 'message-error' : '' ).'">'
+                        // .(count($aErrors) ? 'FEHLER:<br>*'.implode('<br>*', $aErrors) : 'OK').'</td>'
+                        .(count($aErrors) ? 'FEHLER' : 'OK').'</td>'
                     // . '<td><button onclick="showFile(\''.$aEntry['logfile'].'\');">Ansehen</button></td>'
                     . '</tr>'
                     ;
@@ -121,7 +131,7 @@ class cronlogrenderer extends cronlog{
                 . ($iErrors ? ' (Fehler: <strong>' . $iErrors.'</strong>... OK: <strong>' . $iOK.'</strong>)' : '')
                 . '<br>'
                 . '</div>'
-            . '<table id="'.$sIdTable.'">'
+            . '<table id="'.$sIdTable.'" class="table-striped">'
             . '<thead><tr>'.$sTblHead.'</tr></thead>'
             . '<tbody>'
                 .$sHtml
@@ -177,7 +187,7 @@ class cronlogrenderer extends cronlog{
         // job=dok-kvm-instances:host=kalium:start=1538358001:end=1538358001:exectime=0:ttl=60:rc=0
         foreach($aData as $aEntry){
             if(!$sTblHead){
-                foreach(array('Startzeit', /*'Ende',*/ 'Label', 'Server', 'Dauer', 'TTL', 'Exitcode') as $sKey){
+                foreach(array('Startzeit', /*'Ende',*/ 'Label', 'Server', 'Dauer', 'TTL', '$?') as $sKey){
                     $sTblHead.='<th>'.$sKey.'</th>';
                 }
             }
@@ -191,17 +201,21 @@ class cronlogrenderer extends cronlog{
                 $iOK++;
             }
             
-            $sHtml.='<tr class="'.$sClass.'">'
+            $sHtml.='<tr>'
                     . '<td>'.date("Y-m-d H:i:s", $aEntry['start']).'</td>'
                     // . '<td>'.date("Y-m-d H:i:s", $aEntry['end']).'</td>'
                     . '<td>'.$aEntry['job'].'</td>'
                     . '<td>'.$aEntry['host'].'</td>'
-                    . '<td>'
+                    . '<td'
+                        .($aEntry['exectime']>$this->_iMinTime4Timeline ? ' class="message-warning"' : '' )
+                    . '>'
                         .$aEntry['exectime'].'s'
                         .($aEntry['exectime']>100 ? ' ('.round($aEntry['exectime']/60).'min)' : '') 
                     . '</td>'
                     . '<td>'.$aEntry['ttl'].'</td>'
-                    . '<td>'.$aEntry['rc'].'</td>'
+                    . '<td class="'
+                        .($aEntry['rc']>0 ? 'message-error': 'message-ok')
+                    . '">'.$aEntry['rc'].'</td>'
                     . '</tr>'
                     ;
         }
@@ -212,7 +226,7 @@ class cronlogrenderer extends cronlog{
         
             . '<h3>History</h3>'
                 . '<p class="hint">'
-                    . 'Von den gestarteten Cronjobs werden die Ausf&uuml;hrungen und deren Exitcode f&uuml;r 6 Tage aufgehoben.'
+                    . 'Von den gestarteten Cronjobs werden die Ausf&uuml;hrungszeiten und deren Exitcode f&uuml;r 6 Tage aufgehoben.'
                 . '</p>'
                 . '<div>'
                 . $this->_renderAccessAndAge($iLast)
@@ -351,7 +365,7 @@ class cronlogrenderer extends cronlog{
               // Create a Timeline
               var timeline = new vis.Timeline(container, items, options);
               
-              // fix: some timelines do not properly wirk ... but I make them visible
+              // fix: some timelines do not properly work ... but I make them visible
               $(\'#'.$sDivId.' .vis-timeline\').css(\'visibility\', \'visible\');
             </script>
             ' : '(kein Graph)<br>')
diff --git a/js/functions.js b/js/functions.js
index fc1af75dee5d4b0ab34a72a4ea03fd45d7cb98c9..0c473c12e4894d736296f9660a696c4e399ee59a 100644
--- a/js/functions.js
+++ b/js/functions.js
@@ -2,6 +2,7 @@
 var sSELECTEDSERVER = '';
 var sACTIVESERVERTAB = 'cronlogs';
 var bSETADDRESSBAR = false;
+var sTABLEFILTER = '';
 
 var iRefreshTime = 60;
 var iRefreshCounter = 0;
@@ -72,8 +73,17 @@ function getPageItem(id, sMoreData, bNoAdressbarUpdate) {
     });
 }
 
+/**
+ * show a timer ad a
+ * @returns {undefined}
+ */
 function refreshTimer() {
-    $('#counter').html('Refresh in '+(iRefreshTime-iRefreshCounter)+' sec'+'<div style="width:'+(100 - (iRefreshCounter/iRefreshTime*100))+'%;">&nbsp;</div>');
+    if(iRefreshCounter==0){
+        $('#counter').html('Refresh in <span>'+(iRefreshTime)+'</span> sec'+'<div style="width:100%;">&nbsp;</div>');
+    } else {
+        $('#counter span').html(iRefreshTime-iRefreshCounter);
+        $('#counter div').css('width', (100 - (iRefreshCounter/iRefreshTime*100))+'%');
+    }
     iRefreshCounter++;
     if(iRefreshCounter>iRefreshTime){
         refreshPage();
@@ -87,6 +97,8 @@ function refreshTimer() {
 function refreshPage() {
     getPageItem('selectserver');
     getPageItem(sACTIVESERVERTAB);
+    window.setTimeout("updateFilterFields();", 500);
+
     iRefreshCounter=0;
 }
 
@@ -103,7 +115,7 @@ function setAdressbar() {
     var url = '?'
             + 'server=' + sSELECTEDSERVER
             + '&tab=' + sACTIVESERVERTAB
-            + '&q=' // + $('#datatable1_filter label input').val()+$('#datatable2_filter label input').val()
+            + '&q=' + sTABLEFILTER// + $('#datatable1_filter label input').val()+$('#datatable2_filter label input').val()
             ;
     window.history.pushState('dummy', 'Title', url);
     // window.location.reload();
@@ -155,6 +167,7 @@ function setTab(oLink,sTabid) {
 function setTabId(sTabid){
     clog("setTabId('"+sTabid+"')");
     sACTIVESERVERTAB = sTabid;
+    sTABLEFILTER = '';
     $('#tabcontent div').each(function () {
         $(this).removeClass('active');
         // $(this).html('Moment...');
@@ -164,25 +177,39 @@ function setTabId(sTabid){
     // setServer(sSELECTEDSERVER);
 }
 
+/**
+ * open overlay and show a file
+ * @param {type} sLogfile
+ * @returns {undefined}
+ */
 function showFile(sLogfile) {
     clog("showFile('"+sLogfile+"')");
     $('#overlay').show();
     sLOGFILE=sLogfile;
     getPageItem('showlog', 'logfile=' + sLOGFILE, true);
 }
+/**
+ * close overlay
+ * @param {type} sLogfile
+ * @returns {undefined}
+ */
 function closeOverlay() {
     $('#overlay').fadeOut(300);
 }
 
-function updateFilterFields(q) {
+/**
+ * update filter field for datatable with value of param q=
+ * @returns {undefined}
+ */
+function updateFilterFields() {
     if ($('#datatable1_filter label input')) {
-        $('#datatable1_filter label input').val(q);
-        $('#datatable1').dataTable().fnFilter(q);
+        $('#datatable1_filter label input').val(sTABLEFILTER);
+        $('#datatable1').dataTable().fnFilter(sTABLEFILTER);
         // $('#datatable1').dataTable().bind('filter', 'setAdressbar()');
     }
     if ($('#datatable2_filter label input')) {
-        $('#datatable2_filter label input').val(q);
-        $('#datatable2').dataTable().fnFilter(q);
+        $('#datatable2_filter label input').val(sTABLEFILTER);
+        $('#datatable2').dataTable().fnFilter(sTABLEFILTER);
         // $('#datatable1').dataTable().bind('filter', 'setAdressbar()');
     }
 }
@@ -207,7 +234,8 @@ $(document).ready(function () {
         setTab(oLink);
     }
     if (q) {
-        window.setTimeout("updateFilterFields('" + q + "');", 500);
+        sTABLEFILTER=q;
+        window.setTimeout("updateFilterFields();", 500);
     }
     bSETADDRESSBAR = true;
     window.setInterval('refreshTimer()', 1000);
diff --git a/main.css b/main.css
index 889264faf992ced4c2c420b0354fbf4ac71e9edc..b9bd23e8b6a97decd0884e08a764e6d61b4a133d 100644
--- a/main.css
+++ b/main.css
@@ -57,17 +57,19 @@ td{padding:0.3em;}
 .log-value{color:#008;}
 pre div:hover{background:rgba(0,0,0,0.1);}
 
-#counter{color:#cde;}
-#counter div{background:#bcd; height: 2px; }
+#counter{color:#cde;border-bottom: 1px solid #eee;}
+#counter div{background:#bcd; height: 2px; transition: width 1s ;}
 /* ----- override datatable defaukts */
 .dataTables_wrapper{clear: none;float: left; margin: auto 1px;}
-table.dataTable tbody tr{background: none;}
-table.dataTable{margin: 0; width: auto; }
-table.dataTable tbody td{padding: 3px;padding: 1px;}
+table.dataTable tbody tr.even{background: #f0f4f8;}
+table.dataTable tbody tr.odd{}
+table.dataTable{margin: 0; width: auto; border-spacing: 1px;}
+table.dataTable tbody td{padding: 3px;}
 
 .message{border: 1px solid rgba(0,0,0,0.1); padding: 1em; float: right;}
-table.dataTable tbody tr.message-ok, .message-ok{background:#cfc; color:#080 !important;}
-table.dataTable tbody tr.message-error, .message-error{background:#fdd; color:#800 !important;}
+table.dataTable tbody tr.message-ok,      .message-ok{background:#cfc; color:#080 !important;}
+table.dataTable tbody tr.message-error,   .message-error{background:#fdd; color:#800 !important;}
+table.dataTable tbody tr.message-warning, .message-warning{background:#fec; color:#876 !important;}
 table.dataTable tbody tr:hover{background:rgba(0,0,0,0.1);}
 
 
@@ -76,3 +78,46 @@ table.dataTable tbody tr:hover{background:rgba(0,0,0,0.1);}
 .vis-item.timeline-result-error{background:#fcc; border-color: #800}
 .vis-item.timeline-result-ok{background:#cfc;border-color: #080}
 
+    /* see http://visjs.org/docs/timeline/#Templates */
+
+  alternating column backgrounds
+  .vis-time-axis .vis-odd {
+    background: #fff;
+  }
+  .vis-time-axis .vis-even {
+    background: #f0f4f8;
+  }
+  .vis-time-axis .vis-grid.vis-saturday,
+  .vis-time-axis .vis-grid.vis-sunday
+  {
+    border-bottom: 4px solid #abc;
+  }
+
+    /* 
+  .vis-h0, .vis-h1,.vis-h2,.vis-h3, .vis-h4, .vis-h5, .vis-h6,.vis-h7,.vis-h18,.vis-h19,.vis-h20,.vis-h21,.vis-h22,.vis-h23{
+    background: #e0e4e8;
+  }
+  .vis-h8, .vis-h9,.vis-h10,.vis-h11, .vis-h12, .vis-h13, .vis-h14,.vis-h15,.vis-h16,.vis-h17{
+    background: #f0f4f8;
+  }
+  alternating column backgrounds
+  .vis-time-axis .vis-odd {
+    background: #fff;
+  }
+  .vis-time-axis .vis-even {
+    background: #f0f4f8;
+  }
+  .vis-time-axis{
+    background: #fea;
+  }
+
+gray background in weekends, white text color 
+  .vis-time-axis .vis-grid.vis-saturday,
+  .vis-time-axis .vis-grid.vis-sunday {
+    background: #ed8 !important;
+  }
+  .vis-time-axis .vis-text.vis-saturday,
+  .vis-time-axis .vis-text.vis-sunday {
+  }
+
+*/