diff --git a/lib/counter/GwCounter.h b/lib/counter/GwCounter.h
index 4a66aea..6d4be4f 100644
--- a/lib/counter/GwCounter.h
+++ b/lib/counter/GwCounter.h
@@ -42,17 +42,18 @@ template<class T> class GwCounter{
         }
         int getJsonSize(){
             return JSON_OBJECT_SIZE(4)+JSON_OBJECT_SIZE(okCounter.size()+1)+
-                JSON_OBJECT_SIZE(failCounter.size()+1);
+                JSON_OBJECT_SIZE(failCounter.size()+1)+
+                okCounter.size()*5+failCounter.size()*5;
         }
         void toJson(JsonDocument &json){
             JsonObject jo=json.createNestedObject(name);
-            jo["sumOk"]=globalOk;
-            jo["sumFail"]=globalFail;
-            JsonObject jok=jo.createNestedObject("ok");
+            jo[F("sumOk")]=globalOk;
+            jo[F("sumFail")]=globalFail;
+            JsonObject jok=jo.createNestedObject(F("ok"));
             for (auto it=okCounter.begin();it!=okCounter.end();it++){
                 jok[String(it->first)]=it->second;
             }
-            JsonObject jfail=jo.createNestedObject("fail");
+            JsonObject jfail=jo.createNestedObject(F("fail"));
             for (auto it=failCounter.begin();it!=failCounter.end();it++){
                 jfail[String(it->first)]=it->second;
             }
diff --git a/src/main.cpp b/src/main.cpp
index 79b21ba..4b52b9c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -86,7 +86,7 @@ GwRequestQueue mainQueue(&logger,20);
 GwWebServer webserver(&logger,&mainQueue,80);
 
 GwCounter<unsigned long> countNMEA2KIn("count2Kin");
-GwCounter<unsigned long> countNMEA2KOut("count2kout");
+GwCounter<unsigned long> countNMEA2KOut("count2Kout");
 
 GwCounter<String> countUSBIn("countUSBin");
 GwCounter<String> countUSBOut("countUSBout");
@@ -595,8 +595,8 @@ void SendNMEA0183Message(const tNMEA0183Msg &NMEA0183Msg, int sourceId) {
 }
 
 void handleReceivedNmeaMessage(const char *buf, int sourceId){
-  updateNMEACounter(sourceId,buf,true);
   if (! checkFilter(buf,sourceId,true)) return;
+  updateNMEACounter(sourceId,buf,true);
   if ((sourceId == USB_CHANNEL_ID && n2kFromUSB->asBoolean())||
       (sourceId >= MIN_TCP_CHANNEL_ID && n2kFromTCP->asBoolean())||
       (sourceId == SERIAL1_CHANNEL_ID && n2kFromSerial->asBoolean())
diff --git a/web/index.css b/web/index.css
index 29588fa..d82d7b2 100644
--- a/web/index.css
+++ b/web/index.css
@@ -13,6 +13,16 @@ body{
   #statusPage .even {
       background-color: rgb(211 211 211 / 43%);
   }
+  #statusPageContent {
+    margin-bottom: 0.5em;
+  }
+  .counter-row .value{
+      text-align: right;
+      width: 6em;
+  }
+  .icon-row .label{
+      width: 8.7em;
+  }
   .category .title .label {
       opacity: 1;
       margin-left: 1em;
@@ -50,6 +60,7 @@ body{
       display: flex;
       flex-direction: row;
       flex-wrap: wrap;
+      align-items: center;
   }
   input,select {
       border: 1px solid #808080a1;
diff --git a/web/index.html b/web/index.html
index a4a1f8a..9778541 100644
--- a/web/index.html
+++ b/web/index.html
@@ -20,109 +20,27 @@
   <div class="tab" data-page="dashboardPage">Data</div>
 </div>
 <div id="statusPage" class="tabPage">
-<div class="row">
-  <span class="label">VERSION</span>
-  <span class="value" id="version">---</span>
-  <button class="infoButton" id="converterInfo">?</button> 
-</div>
+  <div id="statusPageContent">
+    <div class="row">
+      <span class="label">VERSION</span>
+      <span class="value" id="version">---</span>
+      <button class="infoButton" id="converterInfo">?</button>
+    </div>
 
-<div class="row even">
-  <span class="label">Access Point IP</span>
-  <span class="value" id="apIp">---</span>
-</div>
-<div class="row ">
-  <span class="label">wifi client connected</span>
-  <span class="value" id="wifiConnected">---</span>
-</div>
-<div class="row even">
-  <span class="label">wifi client IP</span>
-  <span class="value" id="clientIP">---</span>
-</div>
-<div class="row">
-  <span class="label"># NMEA2000 in</span>
-  <span class="value" id="count2Kin.sumOk">---</span>
-</div>
-<div class="row even">
-  <span class="label">NMEA2000 in details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="count2Kin.ok"></span>
-</div>
-<div class="row even msgDetails hidden" id="count2Kin.ok" >
-</div>
-<div class="row">
-  <span class="label"># NMEA2000 out</span>
-  <span class="value" id="count2Kout.sumOk">---</span>
-</div>
-<div class="row even">
-  <span class="label">NMEA2000 out details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="count2Kout.ok"></span>
-</div>
-<div class="row even msgDetails hidden" id="count2Kout.ok" >
-</div>
-<div class="row">
-  <span class="label"># TCP clients</span>
-  <span class="value" id="numClients">---</span>
-</div>
-<div class="row even">
-  <span class="label"># TCP in</span>
-  <span class="value" id="countTCPin.sumOk">---</span>
-</div>
-<div class="row ">
-  <span class="label">TCP in details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="countTCPin.ok"></span>
-</div>
-<div class="row msgDetails hidden" id="countTCPin.ok" >
-</div>
-<div class="row even">
-  <span class="label"># TCP out</span>
-  <span class="value" id="countTCPout.sumOk">---</span>
-</div>
-<div class="row ">
-  <span class="label">TCP out details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="countTCPout.ok"></span>
-</div>
-<div class="row msgDetails hidden" id="countTCPout.ok" >
-</div>
-<div class="row even">
-  <span class="label"># USB in</span>
-  <span class="value" id="countUSBin.sumOk">---</span>
-</div>
-<div class="row ">
-  <span class="label">USB in details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="countUSBin.ok"></span>
-</div>
-<div class="row msgDetails hidden" id="countUSBin.ok" >
-</div>
-<div class="row even">
-  <span class="label"># USB out</span>
-  <span class="value" id="countUSBout.sumOk">---</span>
-</div>
-<div class="row ">
-  <span class="label">USB out details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="countUSBout.ok"></span>
-</div>
-<div class="row msgDetails hidden" id="countUSBout.ok" >
-</div>
-<div class="row even">
-  <span class="label"># Serial in</span>
-  <span class="value" id="countSerialin.sumOk">---</span>
-</div>
-<div class="row ">
-  <span class="label">Serial in details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="countSerialin.ok"></span>
-</div>
-<div class="row msgDetails hidden" id="countSerialin.ok" >
-</div>
-<div class="row even">
-  <span class="label"># Serial out</span>
-  <span class="value" id="countSerialout.sumOk">---</span>
-</div>
-<div class="row ">
-  <span class="label">Serial out details</span>
-  <input type="checkbox" class="showMsgDetails" data-key="countSerialout.ok"></span>
-</div>
-<div class="row msgDetails hidden" id="countSerialout.ok" >
-</div>
-<button id="reset" >Reset</button>
+    <div class="row even">
+      <span class="label">Access Point IP</span>
+      <span class="value" id="apIp">---</span>
+    </div>
+    <div class="row ">
+      <span class="label">wifi client connected</span>
+      <span class="value" id="wifiConnected">---</span>
+    </div>
+    <div class="row even">
+      <span class="label">wifi client IP</span>
+      <span class="value" id="clientIP">---</span>
+    </div>
+  </div>
+  <button id="reset">Reset</button>
 </div>
 <div class="configForm tabPage hidden" id="configPage" >
   <div class="configFormRows">
diff --git a/web/index.js b/web/index.js
index 7bb0c6d..5094f15 100644
--- a/web/index.js
+++ b/web/index.js
@@ -13,8 +13,9 @@ function addEl(type, clazz, parent, text) {
     if (parent) parent.appendChild(el);
     return el;
 }
-function forEl(query, callback) {
-    let all = document.querySelectorAll(query);
+function forEl(query, callback,base) {
+    if (! base) base=document;
+    let all = base.querySelectorAll(query);
     for (let i = 0; i < all.length; i++) {
         callback(all[i]);
     }
@@ -145,6 +146,28 @@ function factoryReset() {
             alertRestart();
         })
 }
+function createCounterDisplay(parent,label,key,isEven){
+    let clazz="row icon-row counter-row";
+    if (isEven) clazz+=" even";
+    let row=addEl('div',clazz,parent);
+    let icon=addEl('span','icon icon-more',row);
+    addEl('span','label',row,label);
+    let value=addEl('span','value',row,'---');
+    value.setAttribute('id',key+".sumOk");
+    let display=addEl('div',clazz+" msgDetails hidden",parent);
+    display.setAttribute('id',key+".ok");
+    row.addEventListener('click',function(ev){
+        let rs=display.classList.toggle('hidden');
+        if (rs){
+            icon.classList.add('icon-more');
+            icon.classList.remove('icon-less');
+        }
+        else{
+            icon.classList.remove('icon-more');
+            icon.classList.add('icon-less');
+        }
+    });
+}
 
 function updateMsgDetails(key, details) {
     forEl('.msgDetails', function (frame) {
@@ -161,8 +184,24 @@ function updateMsgDetails(key, details) {
                 el.textContent = details[k];
             }
         }
+        forEl('.value',function(el){
+            let k=el.getAttribute('data-id');
+            if (k && ! details[k]){
+                el.parentElement.remove();
+            }
+        },frame);
     });
 }
+let counters={
+    count2Kin: 'NMEA2000 in',
+    count2Kout: 'NMEA2000 out',
+    countTCPin: 'TCP in',
+    countTCPout: 'TCP out',
+    countUSBin: 'USB in',
+    countUSBout: 'USB out',
+    countSerialIn: 'Serial in',
+    countSerialOut: 'Serial out'
+}
 function showOverlay(text, isHtml) {
     let el = document.getElementById('overlayContent');
     if (isHtml) {
@@ -477,4 +516,12 @@ window.addEventListener('load', function () {
     }
     loadConfigDefinitions();
     createDashboard();
+    let statusPage=document.getElementById('statusPageContent');
+    if (statusPage){
+        let even=false;
+        for (let c in counters){
+            createCounterDisplay(statusPage,counters[c],c,even);
+            even=!even;
+        }
+    }
 });
\ No newline at end of file