diff --git a/html/assets/css/custom.scss b/html/assets/css/custom.scss
index f3ffa695003cea89955e95d91e0e9efbd4611dbc..4b104d81f293267f2b9e96762d53f3ffdd43c2c6 100644
--- a/html/assets/css/custom.scss
+++ b/html/assets/css/custom.scss
@@ -462,4 +462,20 @@ div.scrollen {
 div.scrollen_team {
   overflow: auto; 
   max-height: 80vh;
+}
+
+.gruppe0 {
+  background: beige !important;
+}
+
+.gruppe1 {
+  background: aliceblue !important;
+}
+
+.gruppe2 {
+  background: lightsteelblue !important;
+}
+
+.gruppe3 {
+  background: lavender !important;
 }
\ No newline at end of file
diff --git a/html/assets/js/script.js b/html/assets/js/script.js
index 37bf6d6ee6f5e5982cdef50ec44488360b13a052..357d37a3bbb249c17c9bc7e2461e3cbf5ed5cf1b 100644
--- a/html/assets/js/script.js
+++ b/html/assets/js/script.js
@@ -4,267 +4,237 @@ const DAY=24*3600*1000;
 
 var Grps=[];
 
+var _e = (el) => ( document.createElement(el) );
+
+var TTTT = [];
 function calculatePartien(saison,date){
 
   $('#partien').append('<h2 class="saison s_'+saison+'">Saison '+saison+'</h2>');
 
-
-  // prüfe ob alle Rundenpartien gespielt und generiere neue Rundenpartien
-  var runde=0;
+  // #######################################################################
+  // Erstelle Partien der Runde 1 ( Hauptrunde ) / Spiel Jeder gegen Jeden
+  var runde=1;
 
   date=new Date(date).getTime();
   var steps=0;
-
-  do {
-    var done=[];
-    runde++;
-
-    // stelle die 4er Gruppen, sowie Startgruppen zusammen
-    Grps=[]
-    if( runde == 1 ){
-      STARTLISTE.forEach(
-        function(g){
-          var G=[];
-          g.forEach(
-            function(v){
-                G.push( TEAMS.filter( (a) => (a.nt == v) )[0] );
-            }
-          );
-          Grps.push(G);
+  var done=[];
+
+  // stelle Gruppen zusammen
+  STARTLISTE.forEach(
+    function(g){
+      var G=[];
+      g.forEach(
+        function(v){
+            G.push( TEAMS.filter( (a) => (a.nt == v) )[0] );
         }
       );
-      //Grps.push( Object.values( TEAMS ).filter( (c) => c.start<=saison ).sort( (a,b) => ( b.nt < a.nt ) ? 1 : -1 ) );
-    } else {
-      while( Tabelle.length > 3 ){
-        Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] );
-      }
+      Grps.push(G);
     }
+  );
 
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Runde '+runde+(( Grps.length == 1 ) ? ' (Endrunde)' : '')+'</h3>';
-    $('#partien').append(tmp);
+  var h3= _e('h3');
+  h3.classList = 'runde s_'+saison+' r_'+runde;
+  h3.innerHTML = 'Runde '+runde+ ' (Hauptrunde)';
+  $('#partien').append(h3);
+  
+  // erzeuge die Partien und prüfe, ob diese bereits gespielt wurden
+  STARTLISTE_PARTIEN.forEach(
+    function(v,i){
+      done.push( grpPartien(date,steps,saison,runde,i+1,v.slice(1)) ); steps+=v[0];
+    }
+  );
 
+  var AFdone = false;
 
-    if( runde == 1 ){
-      STARTLISTE_PARTIEN.forEach(
-        function(v,i){
-          done.push( grpPartien(date,steps,saison,runde,i+1,v.slice(1)) ); steps+=v[0];
+  // ##################################################################################
+  // Erstelle Viertelfinale ( Finalrunde ) / KO-Spiele
+  if( FINALTEAMS == 8 ){
+    if( done.reduce( (a,b) => a && b ) == true ){
+      var Tabelle = calculatePunktestand( saison, runde, false );
+    } else {
+      var Tabelle = [];
+      STARTLISTE.forEach(
+        function(w,g){
+          for( var i = 0; i < FINALTEAMS / STARTLISTE.length; i++ ){
+            Tabelle.push(
+              {
+                'kontinent' : 'dummy',
+                'nt': 'xx',
+                'name': '<i>Gruppe ' + (g+1) + '.'+ (i+1) + '</i>',
+                'link': '',
+                'manager': 'dummy',
+                'start': 27
+              }
+            );
+          }
         }
       );
+    }
+  } else if ( FINALTEAMS > 8 ){
+    if( AFdone ){
     } else {
-      done.push( grpPartien(date,steps,saison,runde,1,[ 1,2, 4,3 ]) ); steps+=STEP;
-      done.push( grpPartien(date,steps,saison,runde,2,[ 1,4, 2,3 ]) ); steps+=STEP;
-      done.push( grpPartien(date,steps,saison,runde,3,[ 3,1, 2,4 ]) ); steps+=STEP;
-      //done.push( grpPartien(date,steps,saison,runde,4,[ 2,1, 3,4 ]) ); steps++;
-      //done.push( grpPartien(date,steps,saison,runde,5,[ 4,1, 3,2 ]) ); steps++;
-      //done.push( grpPartien(date,steps,saison,runde,6,[ 3,1, 4,2 ]) ); steps++;
+      var Tabelle = [];
+      [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16].forEach(
+        function(i){
+          Tabelle.push(
+            {
+              'kontinent' : 'dummy',
+              'nt': 'xx',
+              'name': '<i>AF ' + (i) + '</i>',
+              'link': '',
+              'manager': 'dummy',
+              'start': 27
+            }
+          );
+        }
+      );
     }
-
-  } while( done.reduce( (a,b) => a && b ) == true && Grps.length > 1 );
-
-
-  if( done.reduce( (a,b) => a && b ) == true ){
-
-    var Tabelle = calculatePunktestand( saison, runde, false );
-
-  } else {
-
-    var Tabelle = [
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 1</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 2</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 3</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 4</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 5</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 6</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 7</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Platz 8</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      }
-    ]
-
   }
 
-  Grps.shift();
-  //Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
-
-  Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() , Tabelle.shift() , Tabelle.shift() , Tabelle.shift() ] );
+  if( FINALTEAMS >= 8 ){
+    Grps = [];
+    Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() , Tabelle.shift() , Tabelle.shift() , Tabelle.shift() ] );
 
-  if( FINALTEAMS == 8 ){
     runde='VF';
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Viertelfinale</h3>';
-    $('#partien').append(tmp);
-
+    var h3 = _e('h3');
+    h3.classList = 'runde s_'+saison+' r_'+runde;
+    h3.innerText = 'Viertelfinale';
+    $('#partien').append(h3);
     steps+=FINALS_STEP;
+    var done = [];
     done.push( grpPartien( date,steps,saison,runde, 1, [ 8,1, 7,2, 6,3, 5,4 ] ) );
+    if( done[0].filter((a) => (a == false )).length == 0 ){
+      var VFdone = true;
+      var Tabelle = done[0];
+    } 
+  }
 
+  // ##################################################################################
+  // Erstelle Halbfinale ( Finalrunde ) / KO-Spiele
+  if( FINALTEAMS == 4 ){
     if( done.reduce( (a,b) => a && b ) == true ){
-      Grps.shift(); Grps.push([]);
-
-      var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 1 ) )[0];
-      if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
-      var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 2 ) )[0];
-      if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
-      var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 3 ) )[0];
-      if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
-      var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 4 ) )[0];
-      if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
-
+      var Tabelle = calculatePunktestand( saison, runde, false );
     } else {
-      Grps.shift();
-      var Tabelle = [
-        {
-          'kontinent' : 'dummy',
-          'nt': 'xx',
-          'name': '<i>Sieger VF1</i>',
-          'link': '',
-          'manager': 'dummy',
-          'start': 27
-        },
-        {
-          'kontinent' : 'dummy',
-          'nt': 'xx',
-          'name': '<i>Sieger VF2</i>',
-          'link': '',
-          'manager': 'dummy',
-          'start': 27
-        },
-        {
-          'kontinent' : 'dummy',
-          'nt': 'xx',
-          'name': '<i>Sieger VF3</i>',
-          'link': '',
-          'manager': 'dummy',
-          'start': 27
-        },
-        {
-          'kontinent' : 'dummy',
-          'nt': 'xx',
-          'name': '<i>Sieger VF4</i>',
-          'link': '',
-          'manager': 'dummy',
-          'start': 27
+      var Tabelle = [];
+      STARTLISTE.forEach(
+        function(w,g){
+          for( var i = 0; i < FINALTEAMS / STARTLISTE.length; i++ ){
+            Tabelle.push(
+              {
+                'kontinent' : 'dummy',
+                'nt': 'xx',
+                'name': '<i>Gruppe ' + (g+1) + '.'+ (i+1) + '</i>',
+                'link': '',
+                'manager': 'dummy',
+                'start': 27
+              }
+            );
+          }
         }
-      ];
-      Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
+      );
+    }
+  } else if ( FINALTEAMS > 4 ){
+    if( VFdone ){
+    } else {
+      var Tabelle = [];
+      [1,2,3,4,5,6,7,8].forEach(
+        function(i){
+          Tabelle.push(
+            {
+              'kontinent' : 'dummy',
+              'nt': 'xx',
+              'name': '<i>VF ' + (i) + '</i>',
+              'link': '',
+              'manager': 'dummy',
+              'start': 27
+            }
+          );
+        }
+      );
     }
-
-    FINALTEAMS=4;
-
   }
 
-  if( FINALTEAMS == 4 ){
-    runde='HF';
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Halbfinale</h3>';
-    $('#partien').append(tmp);
+  if( FINALTEAMS >= 4 ){
+    Grps = [];
+    Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
 
+    runde='HF';
+    var h3 = _e('h3');
+    h3.classList = 'runde s_'+saison+' r_'+runde;
+    h3.innerText = 'Halbfinale';
+    $('#partien').append(h3);
     steps+=FINALS_STEP;
+    var done = [];
     done.push( grpPartien( date,steps,saison,runde, 1, [ 1,4, 2,3 ] ) );
+    if( done[0].filter((a) => (a == false )).length == 0 ){
+      var HFdone = true;
+      var Tabelle = done[0];
+    } 
   }
 
-  steps+=FINALS_STEP;
-
-  if( done.reduce( (a,b) => a && b ) == true ){
-
-    Grps.shift(); Grps.push([]);
-
-    var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 1 ) )[0];
-    if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
-    var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 2 ) )[0];
-    if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
-
-    runde='F'
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
-    $('#partien').append(tmp);
-
-    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
-
-  } else {
-
-    runde='F'
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
-    $('#partien').append(tmp);
-
-    var Tabelle = [
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Sieger HF1</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'nt': 'xx',
-        'name': '<i>Sieger HF2</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      }
-    ];
-
-    Grps.shift();
+  // ##################################################################################
+  // Erstelle Finale ( Finalrunde ) / KO-Spiele
+  if( FINALTEAMS == 2 ){
+    if( done.reduce( (a,b) => a && b ) == true ){
+      var Tabelle = calculatePunktestand( saison, runde, false );
+    } else {
+      var Tabelle = [];
+      STARTLISTE.forEach(
+        function(w,g){
+          for( var i = 0; i < FINALTEAMS / STARTLISTE.length; i++ ){
+            Tabelle.push(
+              {
+                'kontinent' : 'dummy',
+                'nt': 'xx',
+                'name': '<i>Gruppe ' + (g+1) + '.'+ (i+1) + '</i>',
+                'link': '',
+                'manager': 'dummy',
+                'start': 27
+              }
+            );
+          }
+        }
+      );
+    }
+  } else if ( FINALTEAMS > 2 ){
+    if( HFdone ){
+    } else {
+      var Tabelle = [];
+      [1,2].forEach(
+        function(i){
+          Tabelle.push(
+            {
+              'kontinent' : 'dummy',
+              'nt': 'xx',
+              'name': '<i>HF ' + (i) + '</i>',
+              'link': '',
+              'manager': 'dummy',
+              'start': 27
+            }
+          );
+        }
+      );
+    }
+  }
 
+  if( FINALTEAMS >= 2 ){
+    Grps = [];
     Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
 
-    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
-
+    runde='F';
+    var h3 = _e('h3');
+    h3.classList = 'runde s_'+saison+' r_'+runde;
+    h3.innerText = 'Finale';
+    $('#partien').append(h3);
+    steps+=FINALS_STEP;
+    var done = [];
+    done.push( grpPartien( date,steps,saison,runde, 1, [ 1,2 ] ) );
+    if( done[0].filter((a) => (a == false )).length == 0 ){
+      var Fdone = true;
+      var Tabelle = done[0];
+    } 
   }
 
-
 }
 
 var St=0;
@@ -275,25 +245,33 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){
     alert( 'Error: Einige Teams existieren nicht in der DB' );
     return;
   }
-  var done=true;
-
-  var tmp='';
-  tmp+='<h4 id="r'+runde+'st'+spieltag+'" class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'" ondblclick="getCsv('+saison+',\''+runde+'\','+spieltag+')">Spieltag '+spieltag+'</h4>';
-  tmp+='<table class="partien s_'+saison+' r_'+runde+' t_'+spieltag+'">';
+  
+  var done = ( runde == 'VF' || runde == 'HF' || runde == 'F' ) ? [] : false;
+
+  var h4 = _e('h4');
+  h4.classList = 'spieltag s_'+saison+' r_'+runde+' t_'+spieltag;
+  h4.id = 'r'+runde+'st'+spieltag;
+  $(h4).attr( 'ondblclick', 'getCsv('+saison+',\''+runde+'\','+spieltag+')' );
+  h4.innerText = 'Spieltag '+spieltag;
+  $('#partien').append(h4);
+  var tbl = _e('table');
+  tbl.classList = 'partien s_'+saison+' r_'+runde+' t_'+spieltag;
   var partie=0;
 
-  do {
-    var h1 = Bg.shift()-1;
-    var a1 = Bg.shift()-1;
-    partie++;
-    Grps.forEach(
-      function(v,i){
+  Grps.forEach(
+    function(v,i){
+      var BG = JSON.parse(JSON.stringify(Bg));
+      do {
+        
+        var h1 = BG.shift()-1;
+        var a1 = BG.shift()-1;
+        partie++;
 
         if( h1 == -1 || a1 == -1 ) return;
-
         var ergebnis=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == spieltag && a.H.toLowerCase() == v[h1].nt.toLowerCase() && a.A.toLowerCase() == v[a1].nt.toLowerCase() ) );
 
         if( ergebnis.length == 1 ){
+
           ergebnis=ergebnis[0];
           var th=(( ergebnis.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+ergebnis.MID+'" target="ultrasoccer">'+ergebnis.TH+'</a>' : ergebnis.TH );
           var ta=(( ergebnis.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+ergebnis.MID+'" target="ultrasoccer">'+ergebnis.TA+'</a>' : ergebnis.TA );
@@ -301,32 +279,90 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){
           var st=STAT_SAISON.filter( (a) => ( a.MID == ergebnis.MID )).length == 12;
           ergebnis['partie']=partie;
           if( St != -1 ) St=spieltag;
+          if( runde == 'VF' || runde == 'HF' || runde == 'F' ){
+            done.push( th > ta ? TEAMS.filter((a) => (a.nt == ergebnis.H ))[0] : TEAMS.filter((a) => (a.nt == ergebnis.A ))[0] );
+          } else {
+            done = true;
+          }
+
         } else {
           if( St > 0 ){
             var anker=St;
             setTimeout( function(){ window.location.href='#r'+runde+'st'+anker; },500 );
             St=-1;
           }
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; var st=false; done=false; var match='';
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; var st=false; var match='';
+          if( runde == 'VF' || runde == 'HF' || runde == 'F' ){
+            done.push(false);
+          } else {
+            done = false;
+          }
         }
 
-        tmp+='<tr class="begegnungen h_'+v[h1].nt+' a_'+v[a1].nt+' '+(( st ) ? 'stats' : '')+'">';
-        tmp+='<td>'+dt+'</td>';
-        tmp+='<td data-id="'+v[h1].nt+'"><sup>'+v[h1].nt.toUpperCase()+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+(( v[h1].flag ) ? v[h1].flag : v[h1].nt.toLowerCase())+'.svg"></td>';
-        tmp+='<td> - </td>';
-        tmp+='<td data-id="'+v[a1].nt+'"><img class="flags" src="./images/flags/'+(( v[a1].flag ) ? v[a1].flag : v[a1].nt.toLowerCase())+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].nt.toUpperCase()+'</sup></td>';
-
-        tmp+='<td data-mid="'+(( ergebnis.MID != undefined ) ? ergebnis.MID : '0' )+'">'+th+'</td>';
-        tmp+='<td onmouseenter="showLastResults(\''+v[h1].nt+'\',\''+v[a1].nt+'\')" onmouseleave="hideLastResults()" onclick="ignoreHideLastResults()">:</td>';
-        tmp+='<td>'+ta+'</td>';
-        tmp+='</tr>';
-
-      },spieltag
-    );
-  } while( Bg.length > 0 );
+        var tr = _e('tr');
+        tr.classList = 'begegnungen ' + (( STARTLISTE.length > 1 ) ? 'gruppe' + i : '' ) + ' h_'+v[h1].nt+' a_'+v[a1].nt+' '+(( st ) ? 'stats' : '');
+        var td = _e('td');
+        td.innerHTML = dt;
+        tr.append(td);
+        
+        var td = _e('td');
+        $(td).attr('data-id',v[h1].nt);
+        var sup = _e('sup');
+        sup.innerHTML = v[h1].nt.toUpperCase();
+        td.append(sup);
+
+        var span = _e('span')
+        span.innerHTML = ' '+v[h1].name.replace(/\(NL\)/g,'')+' ';
+        td.append(span);
+
+        var img = _e('img');
+        img.classList = 'flags';
+        img.src = './images/flags/'+(( v[h1].flag ) ? v[h1].flag : v[h1].nt.toLowerCase())+'.svg';
+        td.append(img);
+        tr.append(td);
+        
+        var td = _e('td');
+        td.innerText = ' - ';
+        tr.append(td);
+
+        var td = _e('td');
+        $(td).attr('data-id',v[a1].nt);
+        var img = _e('img');
+        img.classList = 'flags';
+        img.src = './images/flags/'+(( v[a1].flag ) ? v[a1].flag : v[a1].nt.toLowerCase())+'.svg';
+        td.append(img);
+
+        var span = _e('span')
+        span.innerHTML = ' '+v[a1].name.replace(/\(NL\)/g,'')+' ';
+        td.append(span);
+
+        var sup = _e('sup');
+        sup.innerHTML = v[a1].nt.toUpperCase();
+        td.append(sup);
+        tr.append(td);
+
+        var td = _e('td');
+        $(td).attr('data-mid',(( ergebnis.MID != undefined ) ? ergebnis.MID : '0' ) ); 
+        td.innerHTML = th;
+        tr.append(td);
+        
+        var td = _e('td');
+        $(td).attr('onmouseenter', "showLastResults('"+v[h1].nt+"','"+v[a1].nt+"')" );
+        $(td).attr('onmouseleave', 'hideLastResults()');
+        $(td).attr('onclick','ignoreHideLastResults()');
+        td.innerText = ':';
+        tr.append(td);
+        
+        var td = _e('td');
+        td.innerHTML = ta;
+        tr.append(td);
+
+        tbl.append(tr);
+      } while( BG.length > 0 );
+    },spieltag
+  );
 
-  tmp+='</table>';
-  $('#partien').append(tmp);
+  $('#partien').append(tbl);
 
   return done;
 }
@@ -430,41 +466,162 @@ function calculatePunktestand(saison,runde,show=true){
 
   var TabelleLast= ( saison > 26 ) ? calculateAllPunktestand()[saison-27] : [];
   var M = calculateAllPunktestand().map((a) => ( a[0].nt ));
-  Tabelle.forEach(
-    function(v,i){
-      var border=SAISON_SETTINGS[saison - 26] == i+1 ? 'dashed ' : '';
-
-      var tmp='<td class="'+border+'">'+(i+1)+'</td>';
-      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
-      var trophy=ERGEBNISSE.filter((a) => ( a.saison==SAISON-1 && a.runde=='F')).map((a) => ( a.TH > a.TA ? a.H : a.A ))[0];
-      trophy = trophy == undefined ? '' : trophy;
-      var master=TabelleLast.length > 0 ? TabelleLast[0].nt : '';
-      if( t.length == 0 ) t.push(0);
-
-
-      var S=t.reduce( (a,b) => a+b );
-      var pokal=ERGEBNISSE.filter((a) => ( ( a.saison*1 < saison || saison == 0 ) && a.runde=='F' && ( parseInt(a.TH) > parseInt(a.TA) && a.H.toLowerCase() == v.nt.toLowerCase() || parseInt(a.TH) < parseInt(a.TA) && a.A.toLowerCase() == v.nt.toLowerCase() ) ) ).length;
-      var finalist=ERGEBNISSE.filter((a) => ( ( a.saison*1 < saison || saison == 0 ) && a.runde=='F' && ( parseInt(a.TH) < parseInt(a.TA) && a.H.toLowerCase() == v.nt.toLowerCase() || parseInt(a.TH) > parseInt(a.TA) && a.A.toLowerCase() == v.nt.toLowerCase() ) ) ).length;
-      var meistertitel=M.filter( (a,i) => ( a == v.nt.toLowerCase() && ( i < saison - 26 || saison == 0 ) ) ).length;
-      var managervoted=Object.values(MANAGERVOTING_WINNER).filter((a) => (a == v.nt)).length;
-
-      tmp+='<td class="'+border+'">'+S+'</td>';
-      tmp+='<td class="'+border+'">'+(( MANAGERVOTING ) ? '<i class="fas fa-thumbs-up'+(( SAISON_TEAMVOTED.reduce((a,b) => (a.concat(b))).indexOf(v.nt) > -1 ) ? ' done" title="Manager dieses Teams hat sein Voting abgegeben!"' : '" title="Manager dieses Teams hat noch kein Voting abgegeben!"' )+' onclick="teamVoting(\''+v.nt+'\')"></i> ' : '') + '<img class="flags" src="./images/flags/'+(( v.flag ) ? v.flag : v.nt.toLowerCase())+'.svg"> <a href="javascript:calculateTeam('+((saison == 0 && false) ? SAISON_NOW : saison)+',\''+v.nt+'\')">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup></a>')+' <a href="'+v.link+'" target="ultrasoccer"><i class="fas fa-link"></i></a>'+(( trophy.toLowerCase() == v.nt.toLowerCase() ) ? ' <i class="fas fa-trophy" title="Amtierender Titelgewinner"></i>' : '') +
-      ' '+(( master.toLowerCase() == v.nt.toLowerCase() ) ? ' <i class="fas fa-crown" title="Amtierender Meister"></i>' : '') +' '+(( v.nt.toLowerCase() == MANAGERVOTING_TEAM ) ? ' <i class="managervoted fas fa-thumbs-up" title="Team der Saison, gewählt von den Managern"></i>' : '') + '</td>';
-      tmp+='<td class="'+border+'">'+((pokal>0) ? pokal : '')+'</td>';
-      tmp+='<td class="'+border+'">'+((meistertitel>0) ? meistertitel : '')+'</td>';
-      tmp+='<td class="'+border+'">'+((finalist>0) ? finalist : '')+'</td>';
-      tmp+='<td class="'+border+'">'+((managervoted>0) ? managervoted : '')+'</td>';
-      tmp+='<td class="'+border+'">'+v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>';
-      tmp+='<td class="'+border+'">'+v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>';
-      tmp+='<td class="'+border+'">'+v[saison].Tr.map( (a) => ( ( a == 'N') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>';
-      var hist=v[saison].Tr.map( (a) => '<'+a+'></'+a+'>' ).slice(-6).join('');
-      tmp+='<td class="'+border+'">'+hist+'</td>';
-      tmp+='<td class="'+border+'">'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
-      tmp+='<td class="'+((v[saison].Td > 0 ) ? 'p' : (v[saison].Td == 0 ) ? 'u' : 'n')+' '+border+'">'+((v[saison].Td > 0 ) ? '+' : '') + v[saison].Td+'</td>';
-      tmp+='<td class="'+((v[saison].Zwk > 0 ) ? 'p' : (v[saison].Zwk == 0 ) ? 'u' : 'n')+' '+border+'">'+(v[saison].Zwk > 0 ? '+' : '')+(v[saison].Zwk / S).toFixed(2) +'</td>';
-      tmp+='<td class="'+border+'">'+v[saison].P+'</td>';
-      $(tabelle).append('<tr>'+tmp+'</tr>');
+
+  STARTLISTE.forEach(
+    function(w,j){
+
+      Tabelle.filter((a) => ( w.indexOf(a.nt) > -1 )).forEach(
+        function(v,i){
+          var border=SAISON_SETTINGS[saison - 26] == i+1 ? 'dashed ' : '';
+          
+          var tr = _e('tr');
+          if( STARTLISTE.length > 1 ) tr.classList = 'gruppe' + j;
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = (i+1);
+          tr.append(td);
+          
+          var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
+          var trophy=ERGEBNISSE.filter((a) => ( a.saison==SAISON-1 && a.runde=='F')).map((a) => ( a.TH > a.TA ? a.H : a.A ))[0];
+          trophy = trophy == undefined ? '' : trophy;
+          var master=TabelleLast.length > 0 ? TabelleLast[0].nt : '';
+          if( t.length == 0 ) t.push(0);
+    
+          var S=t.reduce( (a,b) => a+b );
+          var pokal=ERGEBNISSE.filter((a) => ( ( a.saison*1 < saison || saison == 0 ) && a.runde=='F' && ( parseInt(a.TH) > parseInt(a.TA) && a.H.toLowerCase() == v.nt.toLowerCase() || parseInt(a.TH) < parseInt(a.TA) && a.A.toLowerCase() == v.nt.toLowerCase() ) ) ).length;
+          var finalist=ERGEBNISSE.filter((a) => ( ( a.saison*1 < saison || saison == 0 ) && a.runde=='F' && ( parseInt(a.TH) < parseInt(a.TA) && a.H.toLowerCase() == v.nt.toLowerCase() || parseInt(a.TH) > parseInt(a.TA) && a.A.toLowerCase() == v.nt.toLowerCase() ) ) ).length;
+          var meistertitel=M.filter( (a,i) => ( a == v.nt.toLowerCase() && ( i < saison - 26 || saison == 0 ) ) ).length;
+          var managervoted=Object.values(MANAGERVOTING_WINNER).filter((a) => (a == v.nt)).length;
+    
+          var td = _e('td');
+          td.classList = border;
+          td.innerHTML = S;
+          tr.append(td);
+
+          var td = _e('td');
+          td.classList = border;
+          if( MANAGERVOTING ){
+            var _i = _e('i');
+            _i.classList = 'fas fa-thumbs-up ';
+            $(_i).attr('onclick', "teamVoting('+v.nt+')");
+            if( SAISON_TEAMVOTED.reduce((a,b) => (a.concat(b))).indexOf(v.nt) > -1 ){
+              _i.classList += 'done';
+              _i.title = 'Manager dieses Teams hat sein Voting abgegeben!';
+            } else {
+              _i.title = 'Manager dieses Teams hat noch kein Voting abgegeben!';
+            }
+            td.append(_i);
+          }
+
+          var img = _e('img');
+          img.classList = 'flags';
+          img.src = '/images/flags/'+(( v.flag ) ? v.flag : v.nt.toLowerCase())+'.svg';
+          td.append(img);
+
+          var span = _e('span');
+          span.innerText = ' ';
+          td.append(span);
+
+          var _a = _e('a');
+          _a.href = "javascript:calculateTeam("+((saison == 0 && false) ? SAISON_NOW : saison)+"','"+v.nt+"\')";
+          _a.innerHTML = v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup></a>');
+          td.append(_a);
+
+          var _a = _e('a');
+          _a.href = v.link;
+          _a.target = 'ultrasoccer';
+
+          var _i = _e('i');
+          _i.classList = 'fas fa-link';
+          _a.append(_i);
+          td.append(_a);
+
+          if( trophy.toLowerCase() == v.nt.toLowerCase() ){
+            var _i = _e('i');
+            _i.classList = 'fas fa-trophy';
+            _i.title = 'Amtierender Titelgewinner';
+            td.append(_i);
+          }
+
+          if( master.toLowerCase() == v.nt.toLowerCase() ){
+            var _i = _e('i');
+            _i.classList = 'fas fa-crown';
+            _i.title = 'Amtierender Meister';
+            td.append(_i);
+          }
+
+          if(  v.nt.toLowerCase() == MANAGERVOTING_TEAM ){
+            var _i = _e('i');
+            _i.classList = 'managervoted fas fa-thumbs-up';
+            _i.title = 'Team der Saison, gewählt von den Managern';
+            td.append(_i);
+          }
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = ((pokal>0) ? pokal : '');
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = ((meistertitel>0) ? meistertitel : '');
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = ((finalist>0) ? finalist : '');
+          tr.append(td);
+
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = ((managervoted>0) ? managervoted : '');
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b );
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b );
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = v[saison].Tr.map( (a) => ( ( a == 'N') ? 1 : 0 ) ).reduce( (a,b) => a+b );
+          tr.append(td);
+
+          var td = _e('td');
+          td.classList = border;
+          td.innerHTML = v[saison].Tr.map( (a) => '<'+a+'></'+a+'>' ).slice(-6).join('');
+          tr.append(td);
+
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = v[saison].Tp+'/'+v[saison].Tn;
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border + ' ' + ((v[saison].Td > 0 ) ? 'p' : (v[saison].Td == 0 ) ? 'u' : 'n');
+          td.innerText = ((v[saison].Td > 0 ) ? '+' : '') + v[saison].Td;
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border + ' ' + ((v[saison].Zwk > 0 ) ? 'p' : (v[saison].Zwk == 0 ) ? 'u' : 'n');
+          td.innerText = (v[saison].Zwk > 0 ? '+' : '')+(v[saison].Zwk / S).toFixed(2);
+          tr.append(td);
+          
+          var td = _e('td');
+          td.classList = border;
+          td.innerText = v[saison].P;
+          tr.append(td);
+
+          $(tabelle).append(tr);
+        }
+      );
     }
   );
 
@@ -744,15 +901,52 @@ function showLastResults(H,A){
         teamHflag = teamH[0].flag ? teamH[0].flag : teamH[0].nt;
         var teamA=TEAMS.filter( (a) => ( a.nt == c.A ) );
         teamAflag = teamA[0].flag ? teamA[0].flag : teamA[0].nt;
-        return '<tr>\
-           <td>'+c.saison+'</td>\
-           <td>'+c.runde+'</td>\
-           <td><img class="flags" src="./images/flags/'+(( c.H == H ) ? teamHflag : teamAflag )+'.svg"></td>\
-           <td><img class="flags" src="./images/flags/'+(( c.A == A ) ? teamAflag : teamHflag )+'.svg"></td>\
-           <td><a href="https://ultrasoccer.de/match/?id='+c.MID+'" target="ultrasoccer">'+(( c.H == H ) ? c.TH : c.TA )+'</a></td>\
-           <td>:</td>\
-           <td><a href="https://ultrasoccer.de/match/?id='+c.MID+'" target="ultrasoccer">'+(( c.A == A ) ? c.TA : c.TH )+'</a></td>\
-         </tr>';
+
+        var tr = _e('tr');
+
+        var td = _e('td');
+        td.innerText = c.saison;
+        tr.append(td);
+
+        var td = _e('td');
+        td.innerText = c.runde;
+        tr.append(td);
+
+        var td = _e('td');
+        var img = _e('img');
+        img.classList = 'flags';
+        img.src = './images/flags/'+(( c.H == H ) ? teamHflag : teamAflag )+'.svg';
+        td.append(img);
+        tr.append(td);
+
+        var td = _e('td');
+        var img = _e('img');
+        img.classList = 'flags';
+        img.src = './images/flags/'+(( c.A == A ) ? teamAflag : teamHflag )+'.svg';
+        td.append(img);
+        tr.append(td);
+
+        var td = _e('td');
+        var _a = _e('a');
+        _a.href = 'https://ultrasoccer.de/match/?id='+c.MID;
+        _a.target = 'ultrasoccer';
+        _a.innerText = (( c.H == H ) ? c.TH : c.TA );
+        td.append(_a);
+        tr.append(td);
+
+        var td = _e('td');
+        td.innerText = ':';
+        tr.append(td);
+
+        var td = _e('td');
+        var _a = _e('a');
+        _a.href = 'https://ultrasoccer.de/match/?id='+c.MID;
+        _a.target = 'ultrasoccer';
+        _a.innerText = (( c.A == A ) ? c.TA : c.TH );
+        td.append(_a);
+        tr.append(td);
+
+        return tr;
       }
     )
   );
@@ -779,20 +973,49 @@ function showLastResults(H,A){
     )
   );
 
-  $('#lastresults table tbody').append(
-  '<tr class="lastresults_summe">\
-   <td colspan="4">Tore</td><\
-   <td>'+d.TH+'</td>\
-   <td>:</td>\
-   <td>'+d.TA+'</td>\
-  </tr>\
-  <tr class="lastresults_summe">\
-   <td colspan="4">S/U/N</td><\
-   <td>'+d.S+'</td>\
-   <td>'+d.U+'</td>\
-   <td>'+d.N+'</td>\
-  </tr>'
-  );
+  var tr = _e('tr');
+  tr.classList = 'lastresults_summe';
+
+  var td = _e('td');
+  td.colspan = 4;
+  td.innerText = 'Tore';
+  tr.append(td);
+
+  var td = _e('td');
+  td.innerText = d.TH;
+  tr.append(td);
+
+  var td = _e('td');
+  td.innerText = ':';
+  tr.append(td);
+
+  var td = _e('td');
+  td.innerText = d.TA;
+  tr.append(td);
+
+  $('#lastresults table tbody').append(tr);
+
+  var tr = _e('tr');
+  tr.classList = 'lastresults_summe';
+
+  var td = _e('td');
+  td.colspan = 4;
+  td.innerText = 'S/U/N';
+  tr.append(td);
+
+  var td = _e('td');
+  td.innerText = d.S;
+  tr.append(td);
+
+  var td = _e('td');
+  td.innerText = d.U;
+  tr.append(td);
+
+  var td = _e('td');
+  td.innerText = d.N;
+  tr.append(td);
+
+  $('#lastresults table tbody').append(tr);
 
 }