diff --git a/luennot/live23/src/fxKerho/KerhoGUIController.java b/luennot/live23/src/fxKerho/KerhoGUIController.java
index 8db47e2bbfb0632676163ed7d7cc32ffcb7135e8..508bc5a97efd8fb4523fded10929322c42cd7901 100644
--- a/luennot/live23/src/fxKerho/KerhoGUIController.java
+++ b/luennot/live23/src/fxKerho/KerhoGUIController.java
@@ -153,6 +153,7 @@ public class KerhoGUIController implements Initializable {
         for (int k=apujasen.ekaKentta(); k<apujasen.getKenttia(); k++) {
             cbKentat.add(apujasen.getKysymys(k));
         }
+        cbKentat.setSelectedIndex(0);
 
         
         chooserJasenet.clear();
diff --git a/luennot/live23/src/kanta/HetuTarkistus.java b/luennot/live23/src/kanta/HetuTarkistus.java
index a7112daa1760bc0f1fee657ee30dbf73f29d6b8d..4a11bbff06d37efce59360f9b9f72429f9fd2e64 100644
--- a/luennot/live23/src/kanta/HetuTarkistus.java
+++ b/luennot/live23/src/kanta/HetuTarkistus.java
@@ -128,5 +128,30 @@ public class HetuTarkistus  {
         String.format("%03d",rand(1,1000));
         return apuhetu + hetunTarkistusMerkki(apuhetu);        
     }
-    
+
+
+    /**
+     * @return avainarvo hetusta
+     * @example
+     * <pre name="test">
+     *    getAvain("010203+111L") === "0030201+111L"
+     *    getAvain("010203-111L") === "1030201-111L"
+     *    getAvain("010203A111L") === "2030201A111L"
+     * </pre>
+     */
+    public static String getAvain(String hetu) {
+        StringBuilder sb = new StringBuilder(hetu);
+        if ( sb.length() < 6 ) return sb.toString(); // TODO mitä palautetaan
+        char c = sb.charAt(4);
+        sb.setCharAt(4,sb.charAt(0));
+        sb.setCharAt(0,c);
+        c = sb.charAt(5);
+        sb.setCharAt(5,sb.charAt(1));
+        sb.setCharAt(1,c);
+        sb.insert(0, '0'); //  - jonon alkuun ja  + < - < A
+        if ( sb.length() < 8 ) return sb.toString(); // jos ei erotinta, mennään ilman sitä
+        if ( sb.charAt(7) == '-')  sb.setCharAt(0,'1');
+        if ( sb.charAt(7) == 'A')  sb.setCharAt(0,'2');
+        return sb.toString();
+    }
 }
diff --git a/luennot/live23/src/kanta/test/HetuTarkistusTest.java b/luennot/live23/src/kanta/test/HetuTarkistusTest.java
index 5c97ba1ee2224882ac20f43fd9692c132c139f1f..f700278f8c76faa318d8e6e13604ee6822e96f87 100644
--- a/luennot/live23/src/kanta/test/HetuTarkistusTest.java
+++ b/luennot/live23/src/kanta/test/HetuTarkistusTest.java
@@ -1,5 +1,6 @@
 package kanta.test;
 // Generated by ComTest BEGIN
+import kanta.*;
 import static org.junit.Assert.*;
 import org.junit.*;
 import static kanta.HetuTarkistus.*;
@@ -7,7 +8,7 @@ import static kanta.HetuTarkistus.*;
 
 /**
  * Test class made by ComTest
- * @version 2019.01.06 23:46:58 // Generated by ComTest
+ * @version 2024.04.02 22:54:11 // Generated by ComTest
  *
  */
 public class HetuTarkistusTest {
@@ -15,27 +16,64 @@ public class HetuTarkistusTest {
 
 
   // Generated by ComTest BEGIN
-  /** testHetunTarkistusMerkki23 */
+  /** testTarkista28 */
   @Test
-  public void testHetunTarkistusMerkki23() {    // HetuTarkistus: 23
-    assertEquals("From: HetuTarkistus line: 24", 'N', hetunTarkistusMerkki("121212-222")); 
-    assertEquals("From: HetuTarkistus line: 25", 'N', hetunTarkistusMerkki("121212-222S")); 
-    assertEquals("From: HetuTarkistus line: 26", 'N', hetunTarkistusMerkki("121212-222N")); 
-    assertEquals("From: HetuTarkistus line: 27", 'Y', hetunTarkistusMerkki("121212-231Y")); 
-    assertEquals("From: HetuTarkistus line: 28", '7', hetunTarkistusMerkki("311212-2317")); 
-    assertEquals("From: HetuTarkistus line: 29", '7', hetunTarkistusMerkki("311212-2317XY"));  // vaikka on liikaa merkkejä
-    assertEquals("From: HetuTarkistus line: 30", 'F', hetunTarkistusMerkki("999999-9999XY"));  // vaikka on pvm väärin
+  public void testTarkista28() {    // HetuTarkistus: 28
+    HetuTarkistus hetut = new HetuTarkistus(); 
+    assertEquals("From: HetuTarkistus line: 31", "Hetu liian lyhyt", hetut.tarkista("12121")); 
+    assertEquals("From: HetuTarkistus line: 32", "Hetu liian lyhyt", hetut.tarkista("k")); 
+    assertEquals("From: HetuTarkistus line: 33", "Alkuosassa saa olla vain numeroita", hetut.tarkista("12121k")); 
+    assertEquals("From: HetuTarkistus line: 34", null, hetut.tarkista("121212"));  // sallitaan pelkkä syntymäaika
+    assertEquals("From: HetuTarkistus line: 35", "Liian pieni päivämäärä", hetut.tarkista("001212")); 
+    assertEquals("From: HetuTarkistus line: 36", "Liian suuri päivämäärä", hetut.tarkista("321212")); 
+    assertEquals("From: HetuTarkistus line: 37", "Liian suuri päivämäärä", hetut.tarkista("300212")); 
+    assertEquals("From: HetuTarkistus line: 38", "Liian suuri päivämäärä", hetut.tarkista("310412")); 
+    assertEquals("From: HetuTarkistus line: 39", "Liian suuri kuukausi", hetut.tarkista("121312")); 
+    assertEquals("From: HetuTarkistus line: 40", "Liian pieni kuukausi", hetut.tarkista("120012")); 
+    assertEquals("From: HetuTarkistus line: 41", "Väärä erotinmerkki", hetut.tarkista("121212B222Q")); 
+    assertEquals("From: HetuTarkistus line: 42", "Yksilöosassa kirjaimia", hetut.tarkista("121212-2k2Q")); 
+    assertEquals("From: HetuTarkistus line: 43", "Yksilöosa liian lyhyt", hetut.tarkista("121212-2")); 
+    assertEquals("From: HetuTarkistus line: 44", "Yksilöosa liian lyhyt", hetut.tarkista("121212-")); 
+    assertEquals("From: HetuTarkistus line: 45", "Hetu liian pitkä", hetut.tarkista("121212-12345")); 
+    assertEquals("From: HetuTarkistus line: 46", "Tarkistusmerkin kuuluisi olla N", hetut.tarkista("121212-222S")); 
+    assertEquals("From: HetuTarkistus line: 47", null, hetut.tarkista("121212-222N")); 
+    assertEquals("From: HetuTarkistus line: 48", null, hetut.tarkista("121212-231Y")); 
+    assertEquals("From: HetuTarkistus line: 49", null, hetut.tarkista("311212-2317")); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testHetunTarkistusMerkki86 */
+  @Test
+  public void testHetunTarkistusMerkki86() {    // HetuTarkistus: 86
+    assertEquals("From: HetuTarkistus line: 87", 'N', hetunTarkistusMerkki("121212-222")); 
+    assertEquals("From: HetuTarkistus line: 88", 'N', hetunTarkistusMerkki("121212-222S")); 
+    assertEquals("From: HetuTarkistus line: 89", 'N', hetunTarkistusMerkki("121212-222N")); 
+    assertEquals("From: HetuTarkistus line: 90", 'Y', hetunTarkistusMerkki("121212-231Y")); 
+    assertEquals("From: HetuTarkistus line: 91", '7', hetunTarkistusMerkki("311212-2317")); 
+    assertEquals("From: HetuTarkistus line: 92", '7', hetunTarkistusMerkki("311212-2317XY"));  // vaikka on liikaa merkkejä
+    assertEquals("From: HetuTarkistus line: 93", 'F', hetunTarkistusMerkki("999999-9999XY"));  // vaikka on pvm väärin
     try {
-    assertEquals("From: HetuTarkistus line: 31", 'N', hetunTarkistusMerkki("12121A-222S")); 
-    fail("HetuTarkistus: 31 Did not throw NumberFormatException");
+    assertEquals("From: HetuTarkistus line: 94", 'N', hetunTarkistusMerkki("12121A-222S")); 
+    fail("HetuTarkistus: 94 Did not throw NumberFormatException");
     } catch(NumberFormatException _e_){ _e_.getMessage(); }
     try {
-    assertEquals("From: HetuTarkistus line: 32", 'N', hetunTarkistusMerkki("12121A-22")); 
-    fail("HetuTarkistus: 32 Did not throw StringIndexOutOfBoundsException");
+    assertEquals("From: HetuTarkistus line: 95", 'N', hetunTarkistusMerkki("12121A-22")); 
+    fail("HetuTarkistus: 95 Did not throw StringIndexOutOfBoundsException");
     } catch(StringIndexOutOfBoundsException _e_){ _e_.getMessage(); }
     try {
-    assertEquals("From: HetuTarkistus line: 33", 'N', hetunTarkistusMerkki("121")); 
-    fail("HetuTarkistus: 33 Did not throw StringIndexOutOfBoundsException");
+    assertEquals("From: HetuTarkistus line: 96", 'N', hetunTarkistusMerkki("121")); 
+    fail("HetuTarkistus: 96 Did not throw StringIndexOutOfBoundsException");
     } catch(StringIndexOutOfBoundsException _e_){ _e_.getMessage(); }
   } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testGetAvain136 */
+  @Test
+  public void testGetAvain136() {    // HetuTarkistus: 136
+    assertEquals("From: HetuTarkistus line: 137", "0030201+111L", getAvain("010203+111L"));
+    assertEquals("From: HetuTarkistus line: 138", "1030201-111L", getAvain("010203-111L"));
+    assertEquals("From: HetuTarkistus line: 139", "2030201A111L", getAvain("010203A111L"));
+  } // Generated by ComTest END
 }
\ No newline at end of file
diff --git a/luennot/live23/src/kerho/Jasen.java b/luennot/live23/src/kerho/Jasen.java
index 3c5d38b1c212ec972358ff352c925f13e30bc1e0..7c1d2ff9c29b9078254e59d1187680f91bf61b8b 100644
--- a/luennot/live23/src/kerho/Jasen.java
+++ b/luennot/live23/src/kerho/Jasen.java
@@ -48,7 +48,7 @@ public class Jasen implements Tietue, Cloneable {
 
         @Override
         public int compare(Jasen jasen1, Jasen jasen2) {
-            return jasen1.anna(k).compareTo(jasen2.anna(k));
+            return jasen1.getAvain(k).compareTo(jasen2.getAvain(k));
         }
     }
 
@@ -111,7 +111,39 @@ public class Jasen implements Tietue, Cloneable {
         default: return "Äääliö";
         }
     }
-    
+
+
+    /**
+     * Antaa k:n kentän sisällön merkkijonona.  Tavoite:
+     *
+     * Hetun tapauksessa
+     *    311201  => 011231
+     *    121299  => 991212
+     *    Jäsenmaksun tapaukssa
+     *    11.00   =>  000011.00
+     *    9.00    =>  000009.00
+     * @param k monenenko kentän sisältö palautetaan
+     * @return kentän sisältö merkkijonona
+     */
+    public String getAvain(int k) {
+        switch ( k ) {
+            case 0: return "" + tunnusNro;
+            case 1: return "" + nimi.toUpperCase();
+            case 2: return "" + HetuTarkistus.getAvain(hetu); // vaihda vuosi ja pvm keskenään
+            case 3: return "" + katuosoite;
+            case 4: return "" + postinumero;
+            case 5: return "" + postiosoite;
+            case 6: return "" + kotipuhelin;
+            case 7: return "" + tyopuhelin;
+            case 8: return "" + autopuhelin;
+            case 9: return "" + String.format("%4d", liittymisvuosi);
+            case 10: return "" + jmaksu;
+            case 11: return "" + maksu;
+            case 12: return "" + lisatietoja;
+            default: return "Äääliö";
+        }
+    }
+
 
     /**
      * Asettaa nimen ja palautat virheen