diff --git a/html/26.php b/html/26.php
index ab25f4eb0bf99deb4465f4e99a7c9a32615d4ee5..09056415625dc73f37658ffd927fc2aee1f53a40 100644
--- a/html/26.php
+++ b/html/26.php
@@ -1,184 +1,15 @@
 ---
-saison: '26'
+layout: default
+saison: 26
+saison_now: 27
 date: '2021-10-11'
 ligaspieltag: 17
 step: 1
 finals_step: 2
+startliste:
+  -
+    - bw
+    - cm
+    - is
+    - xx
 ---
-<?php
-
-include_once('functions/db_connect.php');
-include_once('functions/db_methods.php');
-
-$csv=$_POST['csv'];
-$saison='{{ page.saison }}';
-$secret='';
-
-if( !empty($csv) ){
-
-  $secret=$_POST['secret'];
-  $user=db_checkSecret($secret);
-  if( $user ){
-    $C=preg_split('/
-/',$csv);
-    if( trim($C[0]) == 'runde,spieltag,T,H,A,TH,TA,MID' ){
-      foreach( $C as $i=>$v ){
-        if( $i > 0 ) db_addErgebnisse($saison.','.$v,$secret);
-      }
-    } else if( trim($C[0]) == 'MatchID,L,Pos,SpielerID,Spieler,Z+,Z-,T,A,Bk' ) {
-      foreach( $C as $i=>$v ){
-        if( $i > 0 ) db_addStatistik($v,$secret);
-      }
-    } else if( trim($C[0]) == 'TeamID,N,SpielerID,Attr,Spieler,Alter,Pos,S,T,A,Z+,Z-,Zd,Mw' ){
-      foreach( $C as $i=>$v ){
-        if( $i > 0 ) db_addSpieler($v,$secret);
-      }
-    }
-  }
-
-}
-
-?>
-<!DOCTYPE html>
-<html>
-
-<head>
-  <link rel="stylesheet" href="assets/css/custom.css">
-  <script src="assets/js/jquery.min.js"></script>
-  <script src="assets/js/script26.js"></script>
-</head>
-
-<body>
-
-  <script>
-
-    var DATA={{ site.data | jsonify }};
-    var TEAMS=<?=json_encode( db_getFromTeams() )?>;
-    var T2ID={};
-    TEAMS.forEach(
-      function(v){
-        T2ID[v.nt] = v.id;
-      }
-    );
-    var SPIELER=<?=json_encode( db_getFromSpieler() )?>;
-    var ERGEBNISSE=<?=json_encode( db_getFromErgebnisse() )?>;
-    var STAT=<?=json_encode( db_getFromStatistikBySaison($saison))?>;
-    STATISTIK={};
-    STAT.forEach(
-      function(v,i){
-        if( STATISTIK[v.SpielerID] == undefined ) STATISTIK[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'MID' : [] };
-        STATISTIK[v.SpielerID].S++;
-        STATISTIK[v.SpielerID].T+=v.Tore*1;
-        STATISTIK[v.SpielerID].A+=v.Assists*1;
-        STATISTIK[v.SpielerID].Z+=v.Zwk*1;
-        STATISTIK[v.SpielerID].MID.push(v.MID);
-        STATISTIK[v.SpielerID].name=v.name;
-        STATISTIK[v.SpielerID].age=v.age;
-        STATISTIK[v.SpielerID].nt=v.nt;
-      }
-    );
-
-    const STEP={{ page.step | default: '1' }};
-    const FINALS_STEP={{ page.finals_step | default: '0' }};
-    const LIGASPIELTAG={{ page.ligaspieltag | default: '1' }};
-    $(document).ready( function(){
-        calculatePartien('{{ page.saison }}', '{{ page.date }}');
-        calculateTabelle('{{ page.saison }}', '7');
-        calculateTore('{{ page.saison }}');
-        calculateAssists('{{ page.saison }}');
-        calculateZwk('{{ page.saison }}');
-
-        $('h2.tabelle button').on('click',
-          function(){
-            $('h2.tabelle button').toggleClass('active',false);
-            $(this).toggleClass('active',true);
-            $('table.tabelle').toggleClass('d-none',true);
-            $('#tabelle_'+$(this).text().toLowerCase()).toggleClass('d-none',false);
-          }
-        );
-
-      }
-    );
-
-  </script>
-
-  <form method="POST">
-  <div id="copypaste" class="d-none" ondblclick="$(this).toggleClass('d-none')">
-    <button type="submit">update</button>
-    <input type="text" name="secret" placeholder="secret" value="<?=$secret?>">
-    <textarea name="csv"></textarea>
-  </div>
-  </form>
-
-
-  <div id="partien" class="div_left">
-  </div>
-
-  <div class="div_right">
-    <h2 class="tabelle">Tabelle <button>Zweikampf</button><button>Assists</button><button>Tore</button><button class="active">Punktestand</button></h2>
-
-    <table id="tabelle_punktestand" class="tabelle">
-      <thead>
-        <tr>
-          <th>Pl.</th>
-          <th>Sp.</th>
-          <th>Team</th>
-          <th>S/U/N</th>
-          <th>Hist.</th>
-          <th>Tore</th>
-          <th>Dif</th>
-          <th>Pkt.</th>
-        </tr>
-      </thead>
-      <tbody>
-      </tbody>
-    </table>
-
-    <table id="tabelle_tore" class="tabelle d-none">
-      <thead>
-        <tr>
-          <th>Pl.</th>
-          <th>Sp.</th>
-          <th>Name</th>
-          <th>Team</th>
-          <th>T</th>
-        </tr>
-      </thead>
-      <tbody>
-      </tbody>
-    </table>
-
-    <table id="tabelle_assists" class="tabelle d-none">
-      <thead>
-        <tr>
-          <th>Pl.</th>
-          <th>Sp.</th>
-          <th>Name</th>
-          <th>Team</th>
-          <th>A</th>
-        </tr>
-      </thead>
-      <tbody>
-      </tbody>
-    </table>
-
-    <table id="tabelle_zweikampf" class="tabelle d-none">
-      <thead>
-        <tr>
-          <th>Pl.</th>
-          <th>Sp.</th>
-          <th>Name</th>
-          <th>Team</th>
-          <th>A</th>
-        </tr>
-      </thead>
-      <tbody>
-      </tbody>
-    </table>
-
-  </div>
-
-
-</body>
-
-</html>
diff --git a/html/27.html b/html/27.html
deleted file mode 100644
index 358476c0200dadb384129a730477c4d2e32f6fc3..0000000000000000000000000000000000000000
--- a/html/27.html
+++ /dev/null
@@ -1,60 +0,0 @@
----
-saison: '27'
-date: '2021-11-16T10:00Z'
-ligaspieltag: 18
-step: 1
-finals_step: 2
----
-
-<!DOCTYPE html>
-<html>
-
-<head>
-  <link rel="stylesheet" href="assets/css/custom.css">
-  <script src="assets/js/jquery.min.js"></script>
-  <script src="assets/js/script27.js"></script>
-</head>
-
-<body>
-
-  <script>
-
-    var DATA={{ site.data | jsonify }};
-    delete DATA.teams.XX;
-    const STEP={{ page.step | default: '1' }};
-    const FINALS_STEP={{ page.finals_step | default: '0' }};
-    const LIGASPIELTAG={{ page.ligaspieltag | default: '1' }};
-    $(document).ready( function(){
-        calculatePartien('{{ page.saison }}', '{{ page.date }}');
-        calculateTabelle('{{ page.saison }}', '7');
-      }
-    );
-
-  </script>
-
-  <div id="partien" class="div_left">
-  </div>
-
-  <div class="div_right">
-    <h2 class="tabelle">Tabelle</h2>
-    <table id="tabelle" class="tabelle">
-      <thead>
-        <tr>
-          <th>Pl.</th>
-          <th>Sp.</th>
-          <th>Team</th>
-          <th>S/U/N</th>
-          <th>Hist.</th>
-          <th>Tore</th>
-          <th>Dif</th>
-          <th>Pkt.</th>
-        </tr>
-      </thead>
-      <tbody>
-      </tbody>
-    </table>
-  </div>
-
-</body>
-
-</html>
diff --git a/html/27.php b/html/27.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bdc4438e1a9971017271cfe67e45c7d09d40681
--- /dev/null
+++ b/html/27.php
@@ -0,0 +1,30 @@
+---
+layout: default
+saison: 27
+saison_now: 27
+date: '2021-10-16'
+ligaspieltag: 18
+step: 1
+finals_step: 2
+startliste:
+  -
+    - bw
+    - cm
+    - co
+    - cz
+    - fr
+    - hu
+    - is
+    - it
+    - pl
+startliste_partien_pause:
+  - 1
+  - 2
+  - 1
+  - 2
+  - 1
+  - 2
+  - 1
+  - 2
+  - 0
+---
diff --git a/html/_data/ergebnisse/26/1/1.csv b/html/_data/ergebnisse/26/1/1.csv
deleted file mode 100644
index 59728d9880771fb03fb5f01f05a2ba87081d8708..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/1/1.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-11,BW,CM,0,2,885778
-2021-10-11,XX,IS,0,2,0
diff --git a/html/_data/ergebnisse/26/1/2.csv b/html/_data/ergebnisse/26/1/2.csv
deleted file mode 100644
index fb0899a253a8fa38fd51cb7c786d8f8fa9a50290..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/1/2.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-12,BW,XX,2,0,0
-2021-10-12,CM,IS,3,1,885797
diff --git a/html/_data/ergebnisse/26/1/3.csv b/html/_data/ergebnisse/26/1/3.csv
deleted file mode 100644
index f6baa1cb48b7c0fdff396e160f0fe566b154bb21..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/1/3.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-13,BW,IS,0,0,885800
-2021-10-13,CM,XX,2,0,0
diff --git a/html/_data/ergebnisse/26/1/4.csv b/html/_data/ergebnisse/26/1/4.csv
deleted file mode 100644
index 474db4c9032f2ae7796dfcd9d88121f33c06ab10..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/1/4.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-14,CM,BW,0,1,885813
-2021-10-14,IS,XX,2,0,0
diff --git a/html/_data/ergebnisse/26/1/5.csv b/html/_data/ergebnisse/26/1/5.csv
deleted file mode 100644
index 05393245394307005d443127e45e83484727d761..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/1/5.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-15,XX,BW,0,2,0
-2021-10-15,IS,CM,0,2,885837
diff --git a/html/_data/ergebnisse/26/1/6.csv b/html/_data/ergebnisse/26/1/6.csv
deleted file mode 100644
index 0c2e6a1f7a218150fb2a35ac4549eaf89d22c02b..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/1/6.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-16,IS,BW,1,0,885840
-2021-10-16,XX,CM,0,2,0
diff --git a/html/_data/ergebnisse/26/F/1.csv b/html/_data/ergebnisse/26/F/1.csv
deleted file mode 100644
index e921efa382625913a61a4a070dc6e31a5986fe0d..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/F/1.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-24,CM,IS,3,0,885893
diff --git a/html/_data/ergebnisse/26/HF/1.csv b/html/_data/ergebnisse/26/HF/1.csv
deleted file mode 100644
index f2a4dfac423c804b0db20ba770ef1d16986dcc24..0000000000000000000000000000000000000000
--- a/html/_data/ergebnisse/26/HF/1.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-T,H,A,TH,TA,MID
-2021-10-22,CM,XX,2,0,0
-2021-10-22,BW,IS,0,3,885873
diff --git a/html/_data/partien/4.yml b/html/_data/partien/4.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4ec56bac099da42783595545a61baa951a793dc8
--- /dev/null
+++ b/html/_data/partien/4.yml
@@ -0,0 +1,6 @@
+- [ 1, 1,2, 4,3 ]
+- [ 1, 1,4, 2,3 ]
+- [ 1, 1,3, 2,4 ]
+- [ 1, 2,1, 3,4 ]
+- [ 1, 4,1, 3,2 ]
+- [ 1, 3,1, 4,2 ]
diff --git a/html/_data/partien/9.yml b/html/_data/partien/9.yml
new file mode 100644
index 0000000000000000000000000000000000000000..47b70cd30786389d32a3c1f90c0d67d19371d2f6
--- /dev/null
+++ b/html/_data/partien/9.yml
@@ -0,0 +1,9 @@
+- [ 1, 2,9, 3,8, 4,7, 5,6 ]
+- [ 1, 1,2, 9,3, 8,4, 7,5 ]
+- [ 1, 1,3, 4,9, 5,8, 6,7 ]
+- [ 1, 1,4, 2,3, 9,5, 6,8 ]
+- [ 1, 5,1, 2,4, 6,9, 7,8 ]
+- [ 1, 1,6, 2,5, 3,4, 7,9 ]
+- [ 1, 7,1, 6,2, 3,5, 8,9 ]
+- [ 1, 8,1, 2,7, 3,6, 4,5 ]
+- [ 1, 9,1, 8,2, 3,7, 4,6 ]
diff --git a/html/_data/teams/BW.yml b/html/_data/teams/BW.yml
deleted file mode 100644
index a35ca1aefa5ed68568e17170dd3b4ad19e304a92..0000000000000000000000000000000000000000
--- a/html/_data/teams/BW.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Afrika
-id: BW
-name: Botswana (NL)
-link: 'https://ultrasoccer.de/players/?id=1452'
-manager: FC Lampertheim
-start: 26
diff --git a/html/_data/teams/CM.yml b/html/_data/teams/CM.yml
deleted file mode 100644
index 603d759b4a88732c065db5230dc0479cab3d8c21..0000000000000000000000000000000000000000
--- a/html/_data/teams/CM.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Afrika
-id: CM
-name: KAMERUN (NL)
-link: 'https://ultrasoccer.de/players/?id=687'
-manager: lipeco
-start: 26
diff --git a/html/_data/teams/CO.yml b/html/_data/teams/CO.yml
deleted file mode 100644
index 927f003bb6d006287bfd6afb94035c0d3e109889..0000000000000000000000000000000000000000
--- a/html/_data/teams/CO.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Südamerika
-id: CO
-name: Kolumbien (NL)
-link: 'https://ultrasoccer.de/players/?id=1374'
-manager: J..
-start: 27
diff --git a/html/_data/teams/CZ.yml b/html/_data/teams/CZ.yml
deleted file mode 100644
index f809b05b0dc7281e6d6b0ce934a7a883cff54f52..0000000000000000000000000000000000000000
--- a/html/_data/teams/CZ.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Europa
-id: CZ
-name: Tschechien (NL)
-link: 'https://ultrasoccer.de/players/?id=1538'
-manager: Skiller09
-start: 27
diff --git a/html/_data/teams/FR.yml b/html/_data/teams/FR.yml
deleted file mode 100644
index 393772d47f9260bfc751fbb34178a44c4734f465..0000000000000000000000000000000000000000
--- a/html/_data/teams/FR.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Europa
-id: FR
-name: Frankreich (NL)
-link: 'https://ultrasoccer.de/players/?id=2685'
-manager: Schmetterling
-start: 27
diff --git a/html/_data/teams/HU.yml b/html/_data/teams/HU.yml
deleted file mode 100644
index 3ac8db69b091ef59f8cfcd6b12cbeee6811789ec..0000000000000000000000000000000000000000
--- a/html/_data/teams/HU.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Europa
-id: HU
-name: Ungarn (NL)
-link: 'https://ultrasoccer.de/players/?id=2663'
-manager: 'Michel:-)'
-start: 27
diff --git a/html/_data/teams/IS.yml b/html/_data/teams/IS.yml
deleted file mode 100644
index 51ec88c92b7623e7d95b3719807a3b85b6f6798f..0000000000000000000000000000000000000000
--- a/html/_data/teams/IS.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Europa
-id: IS
-name: Island (NL)
-link: 'https://ultrasoccer.de/players/?id=2233'
-manager: Tony Ford
-start: 26
diff --git a/html/_data/teams/IT.yml b/html/_data/teams/IT.yml
deleted file mode 100644
index 947ff375baa8be70b8d9f548410f069278eb84ba..0000000000000000000000000000000000000000
--- a/html/_data/teams/IT.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Europa
-id: IT
-name: Italien (NL)
-link: ''
-manager: Hans Eckenpower
-start: 27
diff --git a/html/_data/teams/PL.yml b/html/_data/teams/PL.yml
deleted file mode 100644
index 5bd41bf2509a59b9fec35b55c074f617d5eb0716..0000000000000000000000000000000000000000
--- a/html/_data/teams/PL.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Europa
-id: PL
-name: Polen (NL)
-link: 'https://ultrasoccer.de/players/?id=1019'
-manager: M. de Biel
-start: 27
diff --git a/html/_data/teams/XX.yml b/html/_data/teams/XX.yml
deleted file mode 100644
index 3efa6497bfef47725075a2cd454f7328dd0b28dd..0000000000000000000000000000000000000000
--- a/html/_data/teams/XX.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-kontinent: Dummy
-id: XX
-name: <i>Dummy (NL)</i>
-link: 'https://ultrasoccer.de/players/?id=2233'
-manager: Dummy
-start: 26
diff --git a/html/_layouts/default.php b/html/_layouts/default.php
new file mode 100644
index 0000000000000000000000000000000000000000..98a564eecce20e85f2beac45df84f803af83fff1
--- /dev/null
+++ b/html/_layouts/default.php
@@ -0,0 +1,208 @@
+<?php
+
+define( 'SAISON', '{{ page.saison }}' );
+define( 'SAISON_NOW', '{{ page.saison_now }}' );
+
+include_once('functions/db_connect.php');
+include_once('functions/db_methods.php');
+
+$csv=$_POST['csv'];
+$secret='';
+
+if( !empty($csv) ){
+
+  $secret=$_POST['secret'];
+  $user=db_checkSecret($secret);
+  if( $user ){
+    $C=preg_split('/
+/',$csv);
+    if( trim($C[0]) == 'runde,spieltag,T,H,A,TH,TA,MID' ){
+      foreach( $C as $i=>$v ){
+        if( $i > 0 ) db_addErgebnisse(SAISON.','.$v,$secret);
+      }
+    } else if( trim($C[0]) == 'MatchID,L,Pos,SpielerID,Spieler,Z+,Z-,T,A,Bk' ) {
+      foreach( $C as $i=>$v ){
+        if( $i > 0 ) db_addStatistik($v,$secret);
+      }
+    } else if( trim($C[0]) == 'TeamID,N,SpielerID,Attr,Spieler,Alter,Pos,S,T,A,Z+,Z-,Zd,Mw' ){
+      foreach( $C as $i=>$v ){
+        if( $i > 0 ) db_addSpieler($v,$secret);
+      }
+    }
+  }
+
+}
+
+?>
+<!DOCTYPE html>
+<html>
+
+<head>
+  <link rel="stylesheet" href="assets/css/custom.css">
+  <script src="assets/js/jquery.min.js"></script>
+  <script src="assets/js/script.js"></script>
+</head>
+
+<body>
+
+  <script>
+
+    var DATA={{ site.data | jsonify }};
+    var TEAMS=<?=json_encode( db_getFromTeams() )?>;
+    var T2ID={};
+    TEAMS.forEach(
+      function(v){
+        T2ID[v.nt] = v.id;
+      }
+    );
+    var STARTLISTE={{ page.startliste | jsonify }}; {% assign startliste_size = page.startliste[0] | size | append: '' %}
+    var STARTLISTE_PARTIEN={{ site.data.partien | map: startliste_size | jsonify  }}[0];
+    var STARTLISTE_PARTIEN_PAUSE={{ page.startliste_partien_pause | jsonify }};
+    if( $.isArray( STARTLISTE_PARTIEN_PAUSE ) ){
+      STARTLISTE_PARTIEN.forEach(
+        function(v,i){
+          if( STARTLISTE_PARTIEN_PAUSE[i] != undefined ){
+            STARTLISTE_PARTIEN[i][0]=STARTLISTE_PARTIEN_PAUSE[i];
+          }
+        }
+      );
+    }
+    var SPIELER=<?=json_encode( db_getFromSpieler() )?>;
+    var ERGEBNISSE=<?=json_encode( db_getFromErgebnisse() )?>;
+    var STAT=<?=json_encode( db_getFromStatistikBySaison(SAISON))?>;
+    STATISTIK={};
+    STAT.forEach(
+      function(v,i){
+        if( STATISTIK[v.SpielerID] == undefined ) STATISTIK[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'MID' : [] };
+        STATISTIK[v.SpielerID].S++;
+        STATISTIK[v.SpielerID].T+=v.Tore*1;
+        STATISTIK[v.SpielerID].A+=v.Assists*1;
+        STATISTIK[v.SpielerID].Z+=v.Zwk*1;
+        STATISTIK[v.SpielerID].MID.push(v.MID);
+        STATISTIK[v.SpielerID].name=v.name;
+        STATISTIK[v.SpielerID].age=v.age*1;
+        STATISTIK[v.SpielerID].age_saison=v.age_saison*1;
+        STATISTIK[v.SpielerID].nt=v.nt;
+      }
+    );
+
+    const STEP={{ page.step | default: '1' }};
+    const FINALS_STEP={{ page.finals_step | default: '0' }};
+    const LIGASPIELTAG={{ page.ligaspieltag | default: '1' }};
+
+    // check ob alle Teams der Startliste in DB vorhanden sind
+    var check=
+    STARTLISTE.map(
+      (a) => (
+        a.map( (b) => ( T2ID[b] != undefined ) )
+      )
+    ).reduce(( c,d ) => ( c && d )).reduce(( e,f ) => ( e && f ));
+
+    if( check ){
+      $(document).ready( function(){
+          calculatePartien('{{ page.saison }}', '{{ page.date }}');
+          calculateTabelle('{{ page.saison }}', '7');
+          calculateTore('{{ page.saison }}');
+          calculateAssists('{{ page.saison }}');
+          calculateZwk('{{ page.saison }}');
+
+          $('h2.tabelle button').on('click',
+            function(){
+              $('h2.tabelle button').toggleClass('active',false);
+              $(this).toggleClass('active',true);
+              $('table.tabelle').toggleClass('d-none',true);
+              $('#tabelle_'+$(this).text().toLowerCase()).toggleClass('d-none',false);
+            }
+          );
+
+        }
+      );
+    } else {
+      alert( 'Error: Nicht alle Teams der Startliste sind in der DB vorhanden!');
+    }
+
+
+
+
+  </script>
+
+  <form method="POST">
+  <div id="copypaste" class="d-none" ondblclick="$(this).toggleClass('d-none')">
+    <button type="submit">update</button>
+    <input type="text" name="secret" placeholder="secret" value="<?=$secret?>">
+    <textarea name="csv"></textarea>
+  </div>
+  </form>
+
+
+  <div id="partien" class="div_left">
+  </div>
+
+  <div class="div_right">
+    <h2 class="tabelle">Tabelle <button>Zweikampf</button><button>Assists</button><button>Tore</button><button class="active">Punktestand</button></h2>
+
+    <table id="tabelle_punktestand" class="tabelle">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Team</th>
+          <th>S/U/N</th>
+          <th>Hist.</th>
+          <th>Tore</th>
+          <th>Dif</th>
+          <th>Pkt.</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+    <table id="tabelle_tore" class="tabelle d-none">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Name</th>
+          <th>Team</th>
+          <th>T</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+    <table id="tabelle_assists" class="tabelle d-none">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Name</th>
+          <th>Team</th>
+          <th>A</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+    <table id="tabelle_zweikampf" class="tabelle d-none">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Name</th>
+          <th>Team</th>
+          <th>A</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+  </div>
+
+
+</body>
+
+</html>
diff --git a/html/assets/js/script.js b/html/assets/js/script.js
index ec5810c13bcd6cd55bdd2f4632fb570ada845628..492e91f8253b243478d239dc6fd9b6621f8681bc 100644
--- a/html/assets/js/script.js
+++ b/html/assets/js/script.js
@@ -1,86 +1,7 @@
+---
+---
 const DAY=24*3600*1000;
 
-function calculateTabelle(saison,runde,show=true){
-
-  $.each( DATA.teams,
-    function( i,v ){
-      //if( v[saison] == undefined )
-      DATA.teams[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( DATA.teams[i].start <= saison )) }
-    }
-  );
-
-  $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ),
-    function(k,z){
-      $.each(z,
-        function(j,w){
-          w.forEach(
-            function( v,i ){
-              if( runde < k || !$.isNumeric(k) ) return;
-              var H=DATA.teams[v.H][saison];
-              var A=DATA.teams[v.A][saison];
-              if( parseInt(v.TH) > parseInt(v.TA) ){
-                H.P+=3;
-                H.Tr.push('S');
-                A.Tr.push('N');
-              } else if( parseInt(v.TH) < parseInt(v.TA) ){
-                A.P+=3;
-                H.Tr.push('N');
-                A.Tr.push('S');
-              } else {
-                H.P+=1;
-                A.P+=1;
-                H.Tr.push('U');
-                A.Tr.push('U');
-              }
-              H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
-              A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
-            }
-          );
-        }
-      );
-    }
-  );
-
-  var Tabelle=Object.values(DATA.teams).filter( (a) => ( a.start <= saison+1 ) )
-  .sort(
-    function(a,b){
-      return a[saison].P < b[saison].P ||
-      ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) ||
-      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) ||
-      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1;
-    }
-  );
-
-  if( !show ){
-    return Tabelle;
-  }
-
-  $('#tabelle tbody').html('');
-
-  Tabelle.forEach(
-    function(v,i){
-      if( ! v[saison].active ) return;
-      var tmp='<td>'+(i+1)+'</td>';
-      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
-      if( t.length == 0 ) t.push(0);
-      tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>';
-      tmp+='<td><img class="flags" src="./images/flags/'+v.id.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.id+'</sup>')+'</a></td>';
-      tmp+='<td>'+
-      v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
-      v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
-      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>'+hist+'</td>';
-      tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
-      tmp+='<td>'+v[saison].Td+'</td>';
-      tmp+='<td>'+v[saison].P+'</td>';
-      $('#tabelle tbody').append('<tr>'+tmp+'</tr>')
-    }
-  );
-
-}
-
-
 var Grps=[];
 
 function calculatePartien(saison,date){
@@ -92,34 +13,97 @@ function calculatePartien(saison,date){
   var runde=0;
 
   date=new Date(date).getTime();
+  var steps=0;
 
   do {
     var done=[];
     runde++;
-    // kalkuliere Tabelle der vergangenen Saison
-    var Tabelle=calculateTabelle( ( parseInt(saison)-(( runde == 1 ) ? 1 : 0 ) ).toString(), ((runde == 1) ? 7 : runde-1 ) , false);
-    // stelle die 4er Gruppen zusammen
+
+    // stelle die 4er Gruppen, sowie Startgruppen zusammen
     Grps=[]
-    while( Tabelle.length > 3 ){
-      Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] );
+    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);
+        }
+      );
+      //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() ] );
+      }
     }
 
     var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Runde '+runde+(( Grps.length == 1 ) ? ' (Endrunde)' : '')+'</h3>';
     $('#partien').append(tmp);
-    // Hinrunde
-    done.push( grpPartien(new Date(date),saison,runde,1,0,1,2,3) );
-    ;
-    done.push( grpPartien(new Date(date+=DAY*STEP),saison,runde,2,0,2,1,3) );
-    done.push( grpPartien(new Date(date+=DAY*STEP),saison,runde,3,0,3,1,2) );
-    // Rückrunde
-    done.push( grpPartien(new Date(date+=DAY*STEP),saison,runde,4,1,0,3,2) );
-    done.push( grpPartien(new Date(date+=DAY*STEP),saison,runde,5,2,0,3,1) );
-    done.push( grpPartien(new Date(date+=DAY*STEP),saison,runde,6,3,0,2,1) );
+
+
+    if( runde == 1 ){
+      STARTLISTE_PARTIEN.forEach(
+        function(v,i){
+          done.push( grpPartien(date,steps,saison,runde,i+1,v.slice(1)) ); steps+=v[0];
+        }
+      );
+    } 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++;
+    }
 
   } while( done.reduce( (a,b) => a && b ) == true && Grps.length > 1 );
 
 
-  var Tabelle = calculateTabelle( saison, runde, false );
+  if( done.reduce( (a,b) => a && b ) == true ){
+
+    var Tabelle = calculateTabelle( 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
+      }
+    ]
+
+  }
 
   Grps.shift();
   Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
@@ -127,101 +111,296 @@ function calculatePartien(saison,date){
   runde='HF';
   var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Halbfinale</h3>';
   $('#partien').append(tmp);
-  done.push( grpPartien(new Date(date+=DAY*FINALS_STEP),saison,runde,1,0,3,1,2) );
+
+  steps+=FINALS_STEP;
+  done.push( grpPartien( date,steps,saison,runde, 1, [ 1,4, 2,3 ] ) );
+  steps+=FINALS_STEP;
 
   if( done.reduce( (a,b) => a && b ) == true ){
+
     Grps.shift(); Grps.push([]);
 
-    var p1=DATA.ergebnisse[saison][runde][1][0];
-    if( p1.TH >= p1.TA ){ Grps[0].push( DATA.teams[p1.H] ); } else { Grps[0].push( DATA.teams[p1.A] ); }
+    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);
 
-    var p2=DATA.ergebnisse[saison][runde][1][1];
-    if( p2.TH >= p2.TA ){ Grps[0].push( DATA.teams[p2.H] ); } else { Grps[0].push( DATA.teams[p2.A] ); }
+    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);
-    done.push( grpPartien(new Date(date+=DAY*FINALS_STEP),saison,runde,1,0,1,-1,-1) );
-  }
 
+    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();
+
+    Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
 
+    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
+
+  }
 
-function grpPartien( date,saison,runde,spieltag,h1,a1,h2,a2 ){
 
+}
+
+function grpPartien( date,steps,saison,runde,spieltag,Bg ){
+  if( Grps.map( (a) => ( a.filter((b) => (b == undefined)).length > 0 ) )[0] ){
+    alert( 'Error: Einige Teams existieren nicht in der DB' );
+    return;
+  }
   var done=true;
 
   var tmp='';
-  tmp+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'">Spieltag '+spieltag+'</h4>';
+  tmp+='<h4 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 partie=0;
 
-  Grps.forEach(
-    function(v,i){
+  do {
+    var h1 = Bg.shift()-1;
+    var a1 = Bg.shift()-1;
+    partie++;
+    Grps.forEach(
+      function(v,i){
+
+        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 );
+          var dt=new Date(ergebnis.T).toJSON().slice(0,10);
+          var st=STAT.filter( (a) => ( a.MID == ergebnis.MID )).length == 12;
+          ergebnis['partie']=partie;
+        } else {
+          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='';
+        }
 
-      if( h1 == -1 || a1 == -1 ) return;
+        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].nt.toLowerCase()+'.svg"></td>';
+        tmp+='<td> - </td>';
+        tmp+='<td data-id="'+v[a1].nt+'"><img class="flags" src="./images/flags/'+v[a1].nt.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].nt.toUpperCase()+'</sup></td>';
 
-      if( DATA.ergebnisse[saison] == undefined ){
-        var th='-'; var ta='-'; var dt='<i>'+new Date(date).toJSON().slice(0,10)+'</i>'; done=false; var match='';
-      } else if( DATA.ergebnisse[saison][runde] == undefined ){
-        var th='-'; var ta='-'; var dt='<i>'+new Date(date).toJSON().slice(0,10)+'</i>'; done=false; var match='';
-      } else if( DATA.ergebnisse[saison][runde][spieltag] == undefined ){
-        var th='-'; var ta='-'; var dt='<i>'+new Date(date).toJSON().slice(0,10)+'</i>'; done=false; var match='';
-      } else {
-        var result=DATA.ergebnisse[saison][runde][spieltag].filter( (a) => ( a.H == v[h1].id && a.A == v[a1].id ) )[0];
+        tmp+='<td data-mid="'+(( ergebnis.MID != undefined ) ? ergebnis.MID : '0' )+'">'+th+'</td>';
+        tmp+='<td>:</td>';
+        tmp+='<td>'+ta+'</td>';
+        tmp+='</tr>';
 
-        var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' );
-        var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' );
-        var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date).toJSON().slice(0,10)+'</i>' );
-        if( result == undefined ) done=false;
       }
+    );
+  } while( Bg.length > 0 );
+
+  tmp+='</table>';
+  $('#partien').append(tmp);
+
+  return done;
+}
+
+function getCsv(saison, runde, spieltag){
+  var tbl=$('.partien.s_'+saison+'.r_'+runde+'.t_'+spieltag)[0];
+  var csv=
+  Object.values(tbl.rows).map(
+    function(v,i){
+      var T=[];
+      T.push( runde );
+      T.push( spieltag );
+      T.push( v.cells[0].innerText.slice(0,10) );
+      T.push( v.cells[1].dataset.id );
+      T.push( v.cells[3].dataset.id );
+      T.push( v.cells[4].innerText );
+      T.push( v.cells[6].innerText );
+      T.push( v.cells[4].dataset.mid );
+      return T;
+    }
+  ).join('\n');
+  $('#copypaste').toggleClass('d-none');
+  $('#copypaste textarea').text('runde,spieltag,T,H,A,TH,TA,MID\n'+csv);
+}
+
+function calculateTabelle(saison,runde,show=true){
+
+  $.each( TEAMS,
+    function( i,v ){
+      //if( v[saison] == undefined )
+      TEAMS[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( TEAMS[i].start <= saison )) }
+    }
+  );
 
-      tmp+='<tr class="begegnungen h_'+v[h1].id+' a_'+v[a1].id+'">';
-      tmp+='<td>'+dt+'</td>';
-      tmp+='<td><sup>'+v[h1].id+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].id.toLowerCase()+'.svg"></td>';
-      tmp+='<td> - </td>';
-      tmp+='<td><img class="flags" src="./images/flags/'+v[a1].id.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'<sup>'+v[a1].id+'</sup>')+'</td>';
-
-      tmp+='<td>'+th+'</td>';
-      tmp+='<td>:</td>';
-      tmp+='<td>'+ta+'</td>';
-      tmp+='</tr>';
-
-      if( h2 == -1 || a2 == -1 ) return;
-
-      if( DATA.ergebnisse[saison] == undefined ){
-        var th='-'; var ta='-'; var dt='<i>'+new Date(date).toJSON().slice(0,10)+'</i>'; done=false;
-      } else if( DATA.ergebnisse[saison][runde] == undefined ){
-        var th='-'; var ta='-'; var dt='<i>'+new Date(date).toJSON().slice(0,10)+'</i>'; done=false;
-      } else if( DATA.ergebnisse[saison][runde][spieltag] == undefined ){
-        var th='-'; var ta='-'; var dt='<i>'+new Date(date).toJSON().slice(0,10)+'</i>'; done=false;
+  ERGEBNISSE.filter( (a) => ( a.saison == saison && $.isNumeric(a.runde) && a.runde <= runde  ) ).forEach(
+    function( v,i ){
+      var H=TEAMS.filter( (a) => (a.nt == v.H.toLowerCase()) );
+      var A=TEAMS.filter( (a) => (a.nt == v.A.toLowerCase()) );
+      if( H.length == 0 ){
+        alert('Error: Team mit Code '+v.H+' fehlt!!' );
+        return;
+      }
+      if( A.length == 0 ){
+        alert('Error: Team mit Code '+v.A+' fehlt!!' );
+        return;
+      }
+      H=H[0][saison];
+      A=A[0][saison];
+      //var H=DATA.teams[v.H][saison];
+      //var A=DATA.teams[v.A][saison];
+      if( v.TH == '-' || v.TA == '-' ) return;
+      if( parseInt(v.TH) > parseInt(v.TA) ){
+        H.P+=3;
+        H.Tr.push('S');
+        A.Tr.push('N');
+      } else if( parseInt(v.TH) < parseInt(v.TA) ){
+        A.P+=3;
+        H.Tr.push('N');
+        A.Tr.push('S');
       } else {
-        var result=DATA.ergebnisse[saison][runde][spieltag].filter( (a) => a.H == v[h2].id && a.A == v[a2].id )[0];
-        var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' );
-        var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' );
-        var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date).toJSON().slice(0,10)+'</i>' );
-        if( result == undefined ) done=false;
+        H.P+=1;
+        A.P+=1;
+        H.Tr.push('U');
+        A.Tr.push('U');
       }
+      H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
+      A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
+    }
+  );
 
-      tmp+='<tr class="begegnungen h_'+v[h2].id+' a_'+v[a2].id+'">';
-      tmp+='<td>'+dt+'</td>';
-      tmp+='<td><sup>'+v[h2].id+'</sup> '+v[h2].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h2].id.toLowerCase()+'.svg"></td>';
-      tmp+='<td> - </td>';
-      tmp+='<td><img class="flags" src="./images/flags/'+v[a2].id.toLowerCase()+'.svg"> '+v[a2].name.replace(/\(NL\)/g,'<sup>'+v[a2].id+'</sup>')+'</td>';
-      tmp+='<td>'+th+'</td>';
-      tmp+='<td>:</td>';
-      tmp+='<td>'+ta+'</td>';
-      tmp+='</tr>';
+  var startliste=STARTLISTE.reduce((a,b)=>(a));
+
+  var Tabelle=Object.values(TEAMS).filter( (a) => ( a.start <= saison && startliste.indexOf( a.nt ) > -1 ) )
+  .sort(
+    function(a,b){
+      return a[saison].P < b[saison].P ||
+      ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) ||
+      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) ||
+      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.nt > b.nt ) ? 1 : -1;
+    }
+  );
 
-      //tmp+='<tr><td colspan="7"><hr></td></tr>';
+  if( !show ){
+    return Tabelle;
+  }
 
+  $('#tabelle_punktestand tbody').html('');
 
+  Tabelle.forEach(
+    function(v,i){
+      if( ! v[saison].active ) return;
+      var tmp='<td>'+(i+1)+'</td>';
+      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
+      if( t.length == 0 ) t.push(0);
+      tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>';
+      tmp+='<td><img class="flags" src="./images/flags/'+v.nt.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup>')+'</a></td>';
+      tmp+='<td>'+
+      v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
+      v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
+      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>'+hist+'</td>';
+      tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
+      tmp+='<td>'+v[saison].Td+'</td>';
+      tmp+='<td>'+v[saison].P+'</td>';
+      $('#tabelle_punktestand tbody').append('<tr>'+tmp+'</tr>')
     }
   );
 
-  tmp+='</table>';
-  $('#partien').append(tmp);
+}
 
-  return done;
+function calculateTore(saison){
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].T < b[1].T || ( a[1].T == b[1].T && a[1].S > b[1].S ) ) ).slice(0,10).map(
+    function(v,i){
+      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+      if( team.length == 0 ){
+        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        var team_name='';
+      } else {
+        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
+      }
+
+      return '<td>'+
+      [
+        i+1,
+        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
+        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+(v[1].age+saison*1-v[1].age_saison)+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
+        team_name,
+        v[1].T
+      ].join('</td><td>')+'</td>';
+    }
+  );
+  $('#tabelle_tore tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+}
+
+function calculateAssists(saison){
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].A < b[1].A || ( a[1].A == b[1].A && a[1].S > b[1].S ) ) ).slice(0,10).map(
+    function(v,i){
+      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+      if( team.length == 0 ){
+        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        var team_name='';
+      } else {
+        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
+      }
+
+      return '<td>'+
+      [
+        i+1,
+        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
+        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+(v[1].age+saison*1-v[1].age_saison)+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
+        team_name,
+        v[1].A
+      ].join('</td><td>')+'</td>';
+    }
+  );
+  $('#tabelle_assists tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+}
+
+function calculateZwk(saison){
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].Z < b[1].Z || ( a[1].Z == b[1].Z && a[1].S > b[1].S ) ) ).slice(0,10).map(
+    function(v,i){
+      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+      if( team.length == 0 ){
+        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        var team_name='';
+      } else {
+        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
+      }
+
+      return '<td>'+
+      [
+        i+1,
+        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
+        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+(v[1].age+saison*1-v[1].age_saison)+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
+        team_name,
+        v[1].Z
+      ].join('</td><td>')+'</td>';
+    }
+  );
+
+  $('#tabelle_zweikampf tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
 }
diff --git a/html/assets/js/script26.js b/html/assets/js/script26.js
deleted file mode 100644
index 8d668ae351ff61219c8ace72c2d830b89f96d982..0000000000000000000000000000000000000000
--- a/html/assets/js/script26.js
+++ /dev/null
@@ -1,453 +0,0 @@
-const DAY=24*3600*1000;
-
-var Grps=[];
-
-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;
-
-  date=new Date(date).getTime();
-  var steps=0;
-
-  do {
-    var done=[];
-    runde++;
-    // kalkuliere Tabelle der vergangenen Saison
-    var Tabelle=calculateTabelle( ( parseInt(saison)-(( runde == 1 ) ? 0 : 0 ) ).toString(), ((runde == 1) ? 7 : runde-1 ) , false);
-    // stelle die 4er Gruppen zusammen
-
-    Grps=[]
-    if( runde == 1 ){
-      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() ] );
-      }
-    }
-
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Runde '+runde+(( Grps.length == 1 ) ? ' (Endrunde)' : '')+'</h3>';
-    $('#partien').append(tmp);
-
-
-    if( runde == 1 ){
-
-      done.push( grpPartien(date,steps,saison,runde,1,[ 1,2, 4,3 ]) ); steps++;
-      done.push( grpPartien(date,steps,saison,runde,2,[ 1,4, 2,3 ]) ); steps++;
-      done.push( grpPartien(date,steps,saison,runde,3,[ 1,3, 2,4 ]) ); steps++;
-      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++;
-
-    }
-
-  } while( done.reduce( (a,b) => a && b ) == true && Grps.length > 1 );
-
-
-  if( done.reduce( (a,b) => a && b ) == true ){
-
-    var Tabelle = calculateTabelle( 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
-      }
-    ]
-
-  }
-
-  Grps.shift();
-  Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
-
-  runde='HF';
-  var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Halbfinale</h3>';
-  $('#partien').append(tmp);
-
-  steps+=FINALS_STEP;
-  done.push( grpPartien( date,steps,saison,runde, 1, [ 1,4, 2,3 ] ) );
-  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();
-
-    Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
-
-
-
-    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
-
-  }
-
-
-}
-
-
-function grpPartien( date,steps,saison,runde,spieltag,Bg ){
-
-  var done=true;
-
-  var tmp='';
-  tmp+='<h4 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 partie=0;
-
-  do {
-    var h1 = Bg.shift()-1;
-    var a1 = Bg.shift()-1;
-    partie++;
-
-    Grps.forEach(
-      function(v,i){
-
-        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 );
-          var dt=new Date(ergebnis.T).toJSON().slice(0,10);
-          var st=STAT.filter( (a) => ( a.MID == ergebnis.MID )).length == 12;
-          ergebnis['partie']=partie;
-        } else {
-          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='';
-        }
-
-
-        /*
-
-        if( DATA.ergebnisse[saison] == undefined ){
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
-        } else if( DATA.ergebnisse[saison][runde] == undefined ){
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
-        } else if( DATA.ergebnisse[saison][runde][spieltag] == undefined ){
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
-        } else {
-          var result=DATA.ergebnisse[saison][runde][spieltag].filter( (a) => ( a.H == v[h1].id && a.A == v[a1].id ) )[0];
-
-          var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' );
-          var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' );
-          var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i>' );
-          if( result == undefined ){
-            done=false;
-          } else if( result.TA == '-' || result.TH == '-' ){
-            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].nt.toLowerCase()+'.svg"></td>';
-        tmp+='<td> - </td>';
-        tmp+='<td data-id="'+v[a1].nt+'"><img class="flags" src="./images/flags/'+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>:</td>';
-        tmp+='<td>'+ta+'</td>';
-        tmp+='</tr>';
-
-      }
-    );
-  } while( Bg.length > 0 );
-
-  tmp+='</table>';
-  $('#partien').append(tmp);
-
-  return done;
-}
-
-
-function getCsv(saison, runde, spieltag){
-  var tbl=$('.partien.s_'+saison+'.r_'+runde+'.t_'+spieltag)[0];
-  var csv=
-  Object.values(tbl.rows).map(
-    function(v,i){
-      var T=[];
-      T.push( runde );
-      T.push( spieltag );
-      T.push( v.cells[0].innerText.slice(0,10) );
-      T.push( v.cells[1].dataset.id );
-      T.push( v.cells[3].dataset.id );
-      T.push( v.cells[4].innerText );
-      T.push( v.cells[6].innerText );
-      T.push( v.cells[4].dataset.mid );
-      return T;
-    }
-  ).join('\n');
-  $('#copypaste').toggleClass('d-none');
-  $('#copypaste textarea').text('runde,spieltag,T,H,A,TH,TA,MID\n'+csv);
-}
-
-function calculateTabelle(saison,runde,show=true){
-
-  $.each( TEAMS,
-    function( i,v ){
-      //if( v[saison] == undefined )
-      TEAMS[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( TEAMS[i].start <= saison )) }
-    }
-  );
-
-  ERGEBNISSE.filter( (a) => ( a.saison == saison && $.isNumeric(a.runde) && a.runde <= runde  ) ).forEach(
-    function( v,i ){
-      var H=TEAMS.filter( (a) => (a.nt == v.H.toLowerCase()) );
-      var A=TEAMS.filter( (a) => (a.nt == v.A.toLowerCase()) );
-      if( H.length == 0 ){
-        alert('Error: Team mit Code '+v.H+' fehlt!!' );
-        return;
-      }
-      if( A.length == 0 ){
-        alert('Error: Team mit Code '+v.A+' fehlt!!' );
-        return;
-      }
-      H=H[0][saison];
-      A=A[0][saison];
-      //var H=DATA.teams[v.H][saison];
-      //var A=DATA.teams[v.A][saison];
-      if( v.TH == '-' || v.TA == '-' ) return;
-      if( parseInt(v.TH) > parseInt(v.TA) ){
-        H.P+=3;
-        H.Tr.push('S');
-        A.Tr.push('N');
-      } else if( parseInt(v.TH) < parseInt(v.TA) ){
-        A.P+=3;
-        H.Tr.push('N');
-        A.Tr.push('S');
-      } else {
-        H.P+=1;
-        A.P+=1;
-        H.Tr.push('U');
-        A.Tr.push('U');
-      }
-      H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
-      A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
-    }
-  );
-
-
-  /*
-
-  $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ),
-    function(k,z){
-      $.each(z,
-        function(j,w){
-          w.forEach(
-            function( v,i ){
-              if( runde < k || !$.isNumeric(k) ) return;
-              var H=DATA.teams[v.H][saison];
-              var A=DATA.teams[v.A][saison];
-              if( v.TH == '-' || v.TA == '-' ) return;
-              if( parseInt(v.TH) > parseInt(v.TA) ){
-                H.P+=3;
-                H.Tr.push('S');
-                A.Tr.push('N');
-              } else if( parseInt(v.TH) < parseInt(v.TA) ){
-                A.P+=3;
-                H.Tr.push('N');
-                A.Tr.push('S');
-              } else {
-                H.P+=1;
-                A.P+=1;
-                H.Tr.push('U');
-                A.Tr.push('U');
-              }
-              H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
-              A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
-            }
-          );
-        }
-      );
-    }
-  );
-  */
-
-  var Tabelle=Object.values(TEAMS).filter( (a) => ( a.start <= saison ) )
-  .sort(
-    function(a,b){
-      return a[saison].P < b[saison].P ||
-      ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) ||
-      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) ||
-      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1;
-    }
-  );
-
-  if( !show ){
-    return Tabelle;
-  }
-
-  $('#tabelle_punktestand tbody').html('');
-
-  Tabelle.forEach(
-    function(v,i){
-      if( ! v[saison].active ) return;
-      var tmp='<td>'+(i+1)+'</td>';
-      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
-      if( t.length == 0 ) t.push(0);
-      tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>';
-      tmp+='<td><img class="flags" src="./images/flags/'+v.nt.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup>')+'</a></td>';
-      tmp+='<td>'+
-      v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
-      v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
-      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>'+hist+'</td>';
-      tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
-      tmp+='<td>'+v[saison].Td+'</td>';
-      tmp+='<td>'+v[saison].P+'</td>';
-      $('#tabelle_punktestand tbody').append('<tr>'+tmp+'</tr>')
-    }
-  );
-
-}
-
-function calculateTore(saison){
-  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].T < b[1].T || ( a[1].T == b[1].T && a[1].S > b[1].S ) ) ).slice(0,10).map(
-    function(v,i){
-      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
-      if( team.length == 0 ){
-        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
-        var team_name='';
-      } else {
-        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
-      }
-
-      return '<td>'+
-      [
-        i+1,
-        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
-        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
-        team_name,
-        v[1].T
-      ].join('</td><td>')+'</td>';
-    }
-  );
-  $('#tabelle_tore tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
-}
-
-function calculateAssists(saison){
-  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].A < b[1].A || ( a[1].A == b[1].A && a[1].S > b[1].S ) ) ).slice(0,10).map(
-    function(v,i){
-      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
-      if( team.length == 0 ){
-        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
-        var team_name='';
-      } else {
-        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
-      }
-
-      return '<td>'+
-      [
-        i+1,
-        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
-        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
-        team_name,
-        v[1].A
-      ].join('</td><td>')+'</td>';
-    }
-  );
-  $('#tabelle_assists tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
-}
-
-function calculateZwk(saison){
-  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].Z < b[1].Z || ( a[1].Z == b[1].Z && a[1].S > b[1].S ) ) ).slice(0,10).map(
-    function(v,i){
-      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
-      if( team.length == 0 ){
-        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
-        var team_name='';
-      } else {
-        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
-      }
-
-      return '<td>'+
-      [
-        i+1,
-        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
-        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
-        team_name,
-        v[1].Z
-      ].join('</td><td>')+'</td>';
-    }
-  );
-
-  $('#tabelle_zweikampf tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
-}
diff --git a/html/assets/js/script27.js b/html/assets/js/script27.js
deleted file mode 100644
index 9130dbba2dbeac80b56f5dd6a2194149d05b02fd..0000000000000000000000000000000000000000
--- a/html/assets/js/script27.js
+++ /dev/null
@@ -1,291 +0,0 @@
-const DAY=24*3600*1000;
-
-function calculateTabelle(saison,runde,show=true){
-
-  $.each( DATA.teams,
-    function( i,v ){
-      //if( v[saison] == undefined )
-      DATA.teams[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( DATA.teams[i].start <= saison )) }
-    }
-  );
-
-  $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ),
-    function(k,z){
-      $.each(z,
-        function(j,w){
-          w.forEach(
-            function( v,i ){
-              if( runde < k || !$.isNumeric(k) ) return;
-              var H=DATA.teams[v.H][saison];
-              var A=DATA.teams[v.A][saison];
-              if( parseInt(v.TH) > parseInt(v.TA) ){
-                H.P+=3;
-                H.Tr.push('S');
-                A.Tr.push('N');
-              } else if( parseInt(v.TH) < parseInt(v.TA) ){
-                A.P+=3;
-                H.Tr.push('N');
-                A.Tr.push('S');
-              } else {
-                H.P+=1;
-                A.P+=1;
-                H.Tr.push('U');
-                A.Tr.push('U');
-              }
-              H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
-              A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
-            }
-          );
-        }
-      );
-    }
-  );
-
-  var Tabelle=Object.values(DATA.teams).filter( (a) => ( a.start <= saison+1 ) )
-  .sort(
-    function(a,b){
-      return a[saison].P < b[saison].P ||
-      ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) ||
-      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) ||
-      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1;
-    }
-  );
-
-  if( !show ){
-    return Tabelle;
-  }
-
-  $('#tabelle tbody').html('');
-
-  Tabelle.forEach(
-    function(v,i){
-      if( ! v[saison].active ) return;
-      var tmp='<td>'+(i+1)+'</td>';
-      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
-      if( t.length == 0 ) t.push(0);
-      tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>';
-      tmp+='<td><img class="flags" src="./images/flags/'+v.id.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.id+'</sup>')+'</a></td>';
-      tmp+='<td>'+
-      v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
-      v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
-      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>'+hist+'</td>';
-      tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
-      tmp+='<td>'+v[saison].Td+'</td>';
-      tmp+='<td>'+v[saison].P+'</td>';
-      $('#tabelle tbody').append('<tr>'+tmp+'</tr>')
-    }
-  );
-
-}
-
-
-var Grps=[];
-
-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;
-
-  date=new Date(date).getTime();
-  var steps=0;
-
-  do {
-    var done=[];
-    runde++;
-    // kalkuliere Tabelle der vergangenen Saison
-    var Tabelle=calculateTabelle( ( parseInt(saison)-(( runde == 1 ) ? 0 : 0 ) ).toString(), ((runde == 1) ? 7 : runde-1 ) , false);
-    // stelle die 4er Gruppen zusammen
-
-    Grps=[]
-    if( runde == 1 ){
-      Grps.push( Object.values( DATA.teams ).sort( (a,b) => ( b.id < a.id ) ? 1 : -1 ) );
-    } else {
-      while( Tabelle.length > 3 ){
-        Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] );
-      }
-    }
-
-    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Runde '+runde+(( Grps.length == 1 ) ? ' (Endrunde)' : '')+'</h3>';
-    $('#partien').append(tmp);
-
-
-    if( runde == 1 ){
-
-      done.push( grpPartien(date,steps,saison,runde,1,[ 2,9, 3,8, 4,7, 5,6 ]) ); steps++;
-      done.push( grpPartien(date,steps,saison,runde,2,[ 1,2, 9,3, 8,4, 7,5 ]) ); steps+=2;
-      done.push( grpPartien(date,steps,saison,runde,3,[ 1,3, 4,9, 5,8, 6,7 ]) ); steps++;
-      done.push( grpPartien(date,steps,saison,runde,4,[ 1,4, 2,3, 9,5, 6,8 ]) ); steps+=2;
-      done.push( grpPartien(date,steps,saison,runde,5,[ 5,1, 2,4, 6,9, 7,8 ]) ); steps++;
-      done.push( grpPartien(date,steps,saison,runde,6,[ 1,6, 2,5, 3,4, 7,9 ]) ); steps+=2;
-      done.push( grpPartien(date,steps,saison,runde,7,[ 7,1, 6,2, 3,5, 8,9 ]) ); steps++;
-      done.push( grpPartien(date,steps,saison,runde,8,[ 8,1, 2,7, 3,6, 4,5 ]) ); steps+=2;
-      done.push( grpPartien(date,steps,saison,runde,9,[ 9,1, 8,2, 3,7, 4,6 ]) );
-
-    }
-
-  } while( done.reduce( (a,b) => a && b ) == true && Grps.length > 1 );
-
-  if( done.reduce( (a,b) => a && b ) == true ){
-
-    var Tabelle = calculateTabelle( saison, runde, false );
-
-  } else {
-
-    var Tabelle = [
-      {
-        'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Platz 1</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Platz 2</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Platz 3</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Platz 4</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      }
-    ]
-
-  }
-
-  Grps.shift();
-  Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
-
-  runde='HF';
-  var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Halbfinale</h3>';
-  $('#partien').append(tmp);
-
-  steps+=FINALS_STEP;
-  done.push( grpPartien( date,steps,saison,runde, 1, [ 1,4, 2,3 ] ) );
-  steps+=FINALS_STEP;
-
-  if( done.reduce( (a,b) => a && b ) == true ){
-    Grps.shift(); Grps.push([]);
-
-    var p1=DATA.ergebnisse[saison][runde][1][0];
-    if( p1.TH >= p1.TA ){ Grps[0].push( DATA.teams[p1.H] ); } else { Grps[0].push( DATA.teams[p1.A] ); }
-
-    var p2=DATA.ergebnisse[saison][runde][1][1];
-    if( p2.TH >= p2.TA ){ Grps[0].push( DATA.teams[p2.H] ); } else { Grps[0].push( DATA.teams[p2.A] ); }
-
-
-    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',
-        'id': 'XX',
-        'name': '<i>Sieger 1/4</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      },
-      {
-        'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Sieger 2/3</i>',
-        'link': '',
-        'manager': 'dummy',
-        'start': 27
-      }
-    ];
-
-    Grps.shift();
-
-    Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
-
-    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
-
-  }
-
-
-}
-
-
-function grpPartien( date,steps,saison,runde,spieltag,Bg ){
-
-  var done=true;
-
-  var tmp='';
-  tmp+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'">Spieltag '+spieltag+'</h4>';
-  tmp+='<table class="partien s_'+saison+' r_'+runde+' t_'+spieltag+'">';
-
-  do {
-    var h1 = Bg.shift()-1;
-    var a1 = Bg.shift()-1;
-    Grps.forEach(
-      function(v,i){
-
-        if( h1 == -1 || a1 == -1 ) return;
-
-        if( DATA.ergebnisse[saison] == undefined ){
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
-        } else if( DATA.ergebnisse[saison][runde] == undefined ){
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
-        } else if( DATA.ergebnisse[saison][runde][spieltag] == undefined ){
-          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
-        } else {
-          var result=DATA.ergebnisse[saison][runde][spieltag].filter( (a) => ( a.H == v[h1].id && a.A == v[a1].id ) )[0];
-
-          var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' );
-          var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' );
-          var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i>' );
-          if( result == undefined ) done=false;
-        }
-
-        tmp+='<tr class="begegnungen h_'+v[h1].id+' a_'+v[a1].id+'">';
-        tmp+='<td>'+dt+'</td>';
-        tmp+='<td><sup>'+v[h1].id+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].id.toLowerCase()+'.svg"></td>';
-        tmp+='<td> - </td>';
-        tmp+='<td><img class="flags" src="./images/flags/'+v[a1].id.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].id+'</sup></td>';
-
-        tmp+='<td>'+th+'</td>';
-        tmp+='<td>:</td>';
-        tmp+='<td>'+ta+'</td>';
-        tmp+='</tr>';
-
-      }
-    );
-  } while( Bg.length > 0 );
-
-
-  tmp+='</table>';
-  $('#partien').append(tmp);
-
-  return done;
-}
diff --git a/html/functions/db_methods.php b/html/functions/db_methods.php
index 11bbedcd6db3450e1bfe84975cb44624b7d09d41..8d3bc10e33c20564ad2aa535e804e0b988c3d4d7 100644
--- a/html/functions/db_methods.php
+++ b/html/functions/db_methods.php
@@ -48,6 +48,10 @@ function db_addPartie( $csv ){
 function db_addErgebnisse( $csv, $secret ){
 
   $C=preg_split('/,/',$csv);
+
+  if( !is_numeric($C[6]) || !is_numeric($C[7]) ){
+    return db_removeErgebnisse( $csv, $secret );
+  }
   $C[1]='"'.$C[1].'"';
   $C[3]='"'.$C[3].'"';
   $C[4]='"'.$C[4].'"';
@@ -60,10 +64,7 @@ function db_addErgebnisse( $csv, $secret ){
 
   $csv=implode($C,',');
 
-
-
   $db=new db;
-
   $sql = "REPLACE INTO Ergebnisse VALUES ( ".$csv." )";
 
   if ( $db->query( $sql ) === TRUE) {
@@ -92,6 +93,7 @@ function db_addSpieler( $csv, $secret ){
   unset($C[12]);
   unset($C[13]);
 
+  $C[]=SAISON_NOW;
   $user=db_checkSecret($secret);
   if( empty( $user ) ) return false;
 
@@ -146,6 +148,31 @@ function db_addStatistik( $csv, $secret ){
   return $result;
 }
 
+function db_removeErgebnisse( $csv, $secret ){
+
+  $C=preg_split('/,/',$csv);
+
+  $user=db_checkSecret($secret);
+  if( empty( $user ) ) return false;
+
+  $db=new db;
+  $sql = "DELETE FROM Ergebnisse WHERE
+          saison=".$C[0]."
+          AND runde='".$C[1]."'
+          AND spieltag=".$C[2]."
+          AND H='".$C[4]."'
+          AND A='".$C[5]."'";
+
+  if ( $db->query( $sql ) === TRUE) {
+      // success
+      $result=array( 'success' => true, 'message' => 'Ergebnis erfolgreich entfernt!', 'data' => [] );
+  } else {
+      echo 'SQL-Error: '.$sql.'<br>';
+  }
+
+  unset($db);
+  return $result;
+}
 
 function db_checkSecret($secret){
 
@@ -242,7 +269,7 @@ function db_getFromStatistikBySaison($saison){
           WHERE Ergebnisse.saison = '.$saison.'
           GROUP BY SpielerID, MID';
   */
-  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.age, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos - Statistik.Zneg AS "Zwk" FROM Statistik
+  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.age, Spieler.age_saison, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos - Statistik.Zneg AS "Zwk" FROM Statistik
           INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID
           LEFT JOIN Spieler     ON Spieler.id = Statistik.SpielerID
           LEFT JOIN Teams       ON Teams.id = Spieler.teamID
@@ -263,170 +290,4 @@ function db_getFromStatistikBySaison($saison){
 
 }
 
-function db_updateListSetStatus( $n, $status ){
-  $db=new db;
-
-  $sql = "UPDATE stargate_list SET status='".$status."' WHERE n=".$n;
-
-  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
-      // success
-      $result=array('success' => true, 'message' => 'orderlist status successfully set!', 'n' => $n, 'status' => $status );
-  } else {
-      // check if already exists
-      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-}
-function db_updateListSetSupporterTxhash( $n, $supporter, $txhash ){
-  $db=new db;
-
-  $sql = "UPDATE stargate_list SET supporter=".$supporter.", txhash=0x".$txhash." WHERE n=".$n;
-
-  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
-      // success
-      $result=array('success' => true, 'message' => 'orderlist supporter successfully set!', 'n' => $n, 'supporter' => $supporter );
-  } else {
-      // check if already exists
-      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-}
-function db_updateMembersSetLatitudeLongitudeByMemberSignature($member, $latitude, $longitude, $location, $default_currency, $signature ){
-
-  $db=new db;
-
-  $sql = "UPDATE stargate_members SET latitude=".$latitude.", longitude=".$longitude.", location='".$location."', default_currency='".$default_currency."', signature=0x".bin2hex(base64_decode($signature)).", status='active' WHERE ( status='active' OR status='init' ) AND id=".$member;
-
-  if ($db->query($sql) === TRUE) {
-      // success
-      $result=array('success' => true, 'message' => 'member profile updated successfully!');
-  } else {
-      // error return false
-      $result=array('success' => false, 'message' => 'member profile could not be updated!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-
-}
-function db_updateMembersSetSessionkey($member, $sessionkey ){
-
-  $db=new db;
-
-  $sql = "UPDATE stargate_members SET sessionkey=0x".$sessionkey." WHERE ( status='active' OR status='init' ) AND id=".$member;
-
-  if ($db->query($sql) === TRUE) {
-      // success
-      $result=array('success' => true, 'message' => 'member sessionkey updated successfully!');
-  } else {
-      // error return false
-      $result=array('success' => false, 'message' => 'member sessionkey could not be updated!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-
-}
-function db_updateMembersSetToken( $member, $token ){
-
-  $db=new db;
-  $m=db_getFromMembersById($member);
-  if( regex( $m['status'], 'init|active') ){
-    if( $m['session_expiration'] > time() ){
-      $result=array('success' => true, 'message' => 'member token updated successfully!', 'token' => $m['token'] );
-    } else {
-      $sql = "UPDATE stargate_members SET token='".$token."', session_expiration=UNIX_TIMESTAMP()+".SESSION_EXPIRATION." WHERE ( status='active' OR status='init' ) AND id=".$member;
-      if ($db->query($sql) === TRUE) {
-          // success
-          $result=array('success' => true, 'message' => 'member token updated successfully!', 'token' => $token );
-      } else {
-          // error return false
-          $result=array('success' => false, 'message' => 'member token could not be updated!', 'info' => $sql );
-      }
-    }
-  } else {
-    $result=array('success' => false, 'message' => 'member not active', 'status' => $m['status'] );
-  }
-
-  unset($db);
-  return $result;
-
-}
-
-function db_updateMessagesSetReceipientStatus( $m, $receipient, $receipient_status ){
-
-  $db=new db;
-
-  $sql = "UPDATE stargate_messages SET receipient_status='".$receipient_status."' WHERE receipient=".$receipient." AND m=".$m;
-
-  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
-      // success
-      $result=array('success' => true, 'message' => 'message successfully marked as read!', 'm' => $m, 'status' => $receipient_status );
-  } else {
-      // check if already exists
-      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-}
-function db_updateMessagesSetTxhash( $sender_address, $amount, $txhash ){
-
-  $db=new db;
-
-  $sender=db_getFromMembersByFairAddress($sender_address);
-  $msg=db_getFromMessagesBySenderAmount($sender['id'], $amount);
-  if( count( $msg ) != 1 ){
-    return array('success' => false, 'message' => 'message tx on blockchain does not match with database!', 'info' => '' );
-  }
-
-  $sql = "UPDATE stargate_messages SET txhash=0x".$txhash." WHERE m=".$msg['m']." AND fee=".$amount." AND txhash IS NULL";
-
-  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
-      // success
-      $result=array('success' => true, 'message' => 'message successfully marked as read!', 'm' => $m, 'status' => $receipient_status );
-  } else {
-      // check if already exists
-      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-}
-function db_updateMessages( $n, $sender, $receipient, $message, $signature, $fee, $txhash ){
-
-  $db=new db;
-
-  $signature_hex=bin2hex( base64_decode($signature) );
-  $sql = "UPDATE stargate_messages SET n".(empty( $n ) ? "=NULL" : "='".$n."'").", message='".$message."', signature=0x".$signature_hex.", txhash=0x".$txhash." WHERE sender=".$sender." AND receipient=".$receipient." AND message IS NULL AND fee=".$fee;
-
-  if ( $db->query($sql) === TRUE) {
-      // success
-      $result=array('success' => true, 'message' => 'message successfully saved!', 'data' => db_getFromMessagesByTxhash($txhash) );
-  } else {
-      // check if already exists
-      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
-  }
-
-  unset($db);
-  return $result;
-}
-
-
-function db_removeFromFairauth(){
-  $db=new db;
-
-  $sql = 'DELETE FROM stargate_fairauth WHERE CAST(tstamp as date) < CAST( NOW() as date)';
-  $result = $db->query($sql);
-
-  if( ! $result ) return 0;
-
-  return true;
-}
-
-
 ?>
diff --git a/html/index.php b/html/index.php
index b3f91a0331a1ec8b1aef8ed766b351e53d1ad69c..c6b1d4fcddf4d588df45156694e13f313f5cf9fa 100644
--- a/html/index.php
+++ b/html/index.php
@@ -1,5 +1,5 @@
 ---
 ---
 <html>
-<meta http-equiv="refresh" content="0;URL=./27.html">
+<meta http-equiv="refresh" content="0;URL=./27.php">
 </html>