diff --git a/kerho/bin/RalliJava/Henkilo.class b/kerho/bin/RalliJava/Henkilo.class
index dceb3beb503b8531c32b6e785c535ded2a34928b..075e1ad374b89ab47b3251c0a0ddeefee73d482c 100644
Binary files a/kerho/bin/RalliJava/Henkilo.class and b/kerho/bin/RalliJava/Henkilo.class differ
diff --git a/kerho/bin/RalliJava/Henkilot.class b/kerho/bin/RalliJava/Henkilot.class
index 4aa4aef19a48b842e56e094154c23f78445581a2..75edad3a3371181932eeee1c4f7d3166892c2a67 100644
Binary files a/kerho/bin/RalliJava/Henkilot.class and b/kerho/bin/RalliJava/Henkilot.class differ
diff --git a/kerho/bin/RalliJava/Ralli.class b/kerho/bin/RalliJava/Ralli.class
index d00ee8801a7c6a95ab2a078af392af1c2060eb2b..0fc36168a0b480ec791a2e1cd74b49c0910e1254 100644
Binary files a/kerho/bin/RalliJava/Ralli.class and b/kerho/bin/RalliJava/Ralli.class differ
diff --git a/kerho/bin/RalliJava/Rallit.class b/kerho/bin/RalliJava/Rallit.class
index ada51a5827284973604ea60f607fb2ef501aed01..7285af94649461203393c4eb58d48e09ff02056c 100644
Binary files a/kerho/bin/RalliJava/Rallit.class and b/kerho/bin/RalliJava/Rallit.class differ
diff --git a/kerho/bin/RalliJava/Rekisteri.class b/kerho/bin/RalliJava/Rekisteri.class
index f50f040b8d1c22eee72461074bed396d551ddc7b..129c925b531495b15dc3a1284d45aa2c3ee93dcc 100644
Binary files a/kerho/bin/RalliJava/Rekisteri.class and b/kerho/bin/RalliJava/Rekisteri.class differ
diff --git a/kerho/bin/RalliJava/SailoException.class b/kerho/bin/RalliJava/SailoException.class
index 0bdb65f2b5fe49194423f15a4f4c27615f3df2a4..81ebc6b05318672c5e1f228aae3dbadd050095b1 100644
Binary files a/kerho/bin/RalliJava/SailoException.class and b/kerho/bin/RalliJava/SailoException.class differ
diff --git a/kerho/bin/RalliJava/test/HenkiloTest.class b/kerho/bin/RalliJava/test/HenkiloTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..1a7a07ad49856e879a24c606d1fb2ee6be817dbc
Binary files /dev/null and b/kerho/bin/RalliJava/test/HenkiloTest.class differ
diff --git a/kerho/bin/RalliJava/test/HenkilotTest.class b/kerho/bin/RalliJava/test/HenkilotTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..0888dfd61eb1043330212aff258d450c7cea1d2b
Binary files /dev/null and b/kerho/bin/RalliJava/test/HenkilotTest.class differ
diff --git a/kerho/bin/application/Main.class b/kerho/bin/application/Main.class
index 3e51077fe58f2e490b5c78d8e648ab216863e9a7..9b57e137721be5b392c06e464365e1f04d3955c8 100644
Binary files a/kerho/bin/application/Main.class and b/kerho/bin/application/Main.class differ
diff --git a/kerho/bin/application/RalliController.class b/kerho/bin/application/RalliController.class
index 5ae638ca7e31336f6d258077af71425512a5fe76..1b3c72ecc35719929000e55f864b68dff6c3bec3 100644
Binary files a/kerho/bin/application/RalliController.class and b/kerho/bin/application/RalliController.class differ
diff --git a/kerho/bin/application/UudenlisaysController.class b/kerho/bin/application/UudenlisaysController.class
index 9034e7dc1912c0fc3e068ecee7617713649d0899..2ab50a320567f86e543525885bf56c5dd6b2dd53 100644
Binary files a/kerho/bin/application/UudenlisaysController.class and b/kerho/bin/application/UudenlisaysController.class differ
diff --git a/kerho/kerho/nimet.dat b/kerho/kerho/nimet.dat
index ce1596a3d783122a5497ef1b73bc997fe65c3abc..8b137891791fe96927ad78e64b0aad7bded08bdc 100644
--- a/kerho/kerho/nimet.dat
+++ b/kerho/kerho/nimet.dat
@@ -1,3 +1 @@
-0|Rovanperä|Oskari|18|Keuruu|Kuopion nopeet|59|41|
-1|Sokka|Oskari|54|Rovaniemi|Rovaniemen nopeet shamaanit|83|17|
-2|Rovanperä|Teemu|59|Seinäjoki|Kuopion nopeet|99|76|
+
diff --git a/kerho/src/RalliJava/Henkilo.java b/kerho/src/RalliJava/Henkilo.java
index ba685607109d27946db135fc6bc9449f72ed6879..39e6ff9ee91c7bfa2f539ecb78ef96422e302755 100644
--- a/kerho/src/RalliJava/Henkilo.java
+++ b/kerho/src/RalliJava/Henkilo.java
@@ -3,6 +3,8 @@ package RalliJava;
 import java.io.PrintStream;
 import java.util.Random;
 
+import fi.jyu.mit.ohj2.Mjonot;
+
 /**
  * @author idamk
  * @version 12.2.2025
@@ -11,7 +13,7 @@ import java.util.Random;
  */
 public class Henkilo {
     
-    private int     henkilonTunnusNro       = 0;
+    private int     henkilonTunnusNro;
     private String  etunimi            = "";
     private String  sukunimi        = "";
     private int     ika             = 0;
@@ -20,15 +22,28 @@ public class Henkilo {
     private String  seura           = "";
     private String  kotipaikkakunta = "";
     
-    private static int seuraavaNro = 0;
+    private static int seuraavaNro = 1;
     
     
     /**
-     * 
+     * Antaa henkilölle identifioivan tunnusnumeron
+     * @return uusi tunnusnumero
+     * @example
+     * <pre name="test">
+     * Henkilo henkilo1 = new Henkilo();
+     * henkilo1.getHenkilonTunnusNro()===0;
+     * henkilo1.rekisteroi();
+     * Henkilo henkilo2 = new Henkilo();
+     * henkilo2.rekisteroi();
+     * int ht1 = henkilo1.getHenkilonTunnusNro();
+     * int ht2 = henkilo2.getHenkilonTunnusNro();
+     * ht1 === ht2-1;
+     * </pre>
      */
-    public void rekisteroi() {
+    public int rekisteroi() {
         henkilonTunnusNro = seuraavaNro;
         seuraavaNro++;
+        return henkilonTunnusNro;
     }
     
     
@@ -74,6 +89,23 @@ public class Henkilo {
         henkilo.tulosta(System.out);
     }
     
+    /**
+     * selkeä tulostus
+     */
+    public void vastaaKalle() {
+        
+        etunimi = "Kalle";
+        sukunimi = "Rovanperä";
+        ika = 25;
+        kotipaikkakunta = "Jyväskylä";
+        seura = "Toyota Gazoo Racing WRT";
+        rallienMaara = 24;
+        voitetutRallit = 24;
+        
+        Henkilo henkilo = new Henkilo(henkilonTunnusNro, etunimi, sukunimi, ika, kotipaikkakunta, seura, rallienMaara, voitetutRallit);
+        henkilo.tulosta(System.out);
+    }
+    
     
     /**
      * @return tunnusnro
@@ -82,6 +114,16 @@ public class Henkilo {
         return henkilonTunnusNro;
     }
     
+    
+    /**
+     * @param numero numero
+     */
+    public void setHenkilonTunnusNro(int numero) {
+        henkilonTunnusNro = numero;
+        // jos tunnusnumero on varattu, seuraavaa numeroa kasvatetaan yhtä suuremmaksi kuin hlon tunnusnro
+        if (henkilonTunnusNro >= seuraavaNro) seuraavaNro = henkilonTunnusNro + 1;
+    }
+    
     /**
      * Alustaa henkilön
      */
@@ -125,11 +167,27 @@ public class Henkilo {
     
     /**
      * @return henkilön nimi
+     * @example
+     * <pre name="test">
+     *  Henkilo henkilo = new Henkilo();
+     *  henkilo.vastaaKalle();
+     *  henkilo.getNimi() =R= "Kalle Rovanperä";
      */
     public String getNimi() {
         return this.etunimi + " " + this.sukunimi;
     }
     
+    
+    /*
+     * Palauttaa tiedot tiedostoon tallennettavana merkkijonona
+     * @return henkilon tiedot merkkijonona
+     * @example 
+     * <pre name="test">
+     * Henkilo henkilo = new Henkilo();
+     * henkilo.parse("2|Rovanperä|Kalle|");
+     * henkilo.toString().startsWith("2|Rovanperä|Kalle|") === true;
+     * </pre>
+     */
     @Override
     public String toString() {
         return "" + 
@@ -143,6 +201,36 @@ public class Henkilo {
                 voitetutRallit          + "|";
     }
     
+    
+    /**
+     * Pilkkoo henkilötiedot osiin merkkijonosta
+     * Mukana myös setHenkilonTunnusNro() mikä pitää huolen henkilön tunnusnumerosta
+     * @param rivi rivi joka pilkotaan osiin
+     * @example
+     * <pre name="test">
+     * Henkilo henkilo = new Henkilo();
+     * henkilo.parse("2|Rovanperä|Kalle|");
+     * henkilo.getHenkilonTunnusNro()===2;
+     * henkilo.toString().startsWith("2|Rovanperä|Kalle|")===true;
+     * henkilo.rekisteroi();
+     * int ht = henkilo.getHenkilonTunnusNro();
+     * henkilo.parse(""+(ht+20));
+     * henkilo.rekisteroi();
+     * henkilo.getHenkilonTunnusNro() === ht+20+1;
+     * </pre>
+     */
+    public void parse(String rivi) {
+        StringBuffer sb = new StringBuffer(rivi);
+        setHenkilonTunnusNro(Mjonot.erota(sb, '|', getHenkilonTunnusNro())); // seuraavan numeron käsittely
+        sukunimi = Mjonot.erota(sb, '|', sukunimi);
+        etunimi = Mjonot.erota(sb, '|', etunimi);
+        ika = Mjonot.erota(sb, '|', ika);
+        kotipaikkakunta = Mjonot.erota(sb, '|', kotipaikkakunta);
+        seura = Mjonot.erota(sb, '|', seura);
+        rallienMaara = Mjonot.erota(sb, '|', rallienMaara);
+        voitetutRallit = Mjonot.erota(sb, '|', voitetutRallit);
+    }
+    
     /**
      * @param args ei käytössä
      */
diff --git a/kerho/src/RalliJava/Henkilot.java b/kerho/src/RalliJava/Henkilot.java
index 1471cdc5635838bfbf71a161a3b8a869556b6d23..1b0e4297e63c153411415e4475d4811f4469f928 100644
--- a/kerho/src/RalliJava/Henkilot.java
+++ b/kerho/src/RalliJava/Henkilot.java
@@ -3,7 +3,10 @@ package RalliJava;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FileInputStream;
 import java.io.PrintStream;
+import java.util.Scanner;
+//import fi.jyu.mit.ohj2.Mjonot;
 
 //import java.util.ArrayList;
 //import java.util.List;
@@ -32,6 +35,23 @@ public class Henkilot {
     /**
      * @param henkilo lisättävä henkilö
      * @throws SailoException säilö
+     * @example
+     * <pre name="test">
+     * #THROWS SailoException
+     * Henkilot henkilot = new Henkilot();
+     * Henkilo henkilo1 = new Henkilo(), henkilo2 = new Henkilo();
+     * henkilot.getLkm() === 0;
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===1;
+     * henkilot.lisaa(henkilo2); henkilot.getLkm()===2;
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===3;
+     * henkilot.anna(0)===henkilo1;
+     * henkilot.anna(1)===henkilo2;
+     * henkilot.anna(2)===henkilo1;
+     * henkilot.anna(3)===henkilo1; #THROWS IndexOutOfBoundsException
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===4;
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===5;
+     * henkilot.lisaa(henkilo2); #THROWS SailoException
+     * </pre>
      */
     public void lisaa(Henkilo henkilo) throws SailoException {
         if (lkm >= alkiot.length) throw new SailoException("Liikaa alkioita");
@@ -57,6 +77,30 @@ public class Henkilot {
                 throw new SailoException("Tiedosto " + tiedosto.getAbsolutePath());
             }
     }
+    
+    /**
+     * @param hakemisto mistä haetaan
+     * @throws SailoException jos tiedoston lukemisessa jotain ongelmaa
+     */
+    public void lueTiedostosta(String hakemisto) throws SailoException {
+        String tiedostonNimi = hakemisto + "/nimet.dat";
+        File tiedosto = new File(tiedostonNimi);
+        
+        try (Scanner in = new Scanner(new FileInputStream(tiedosto))) {
+            while (in.hasNext() ) { // jos on seuraava olemassa niin luetaan seuraava nimi
+                String s = in.nextLine();
+                if (s == null || "".equals(s) || s.charAt(0) == ';') continue;
+                Henkilo henkilo = new Henkilo();
+                henkilo.parse(s); //TODO: PARSE MJONOT.JYU juttu!!!!!
+                
+                lisaa(henkilo);
+            }
+        } catch (FileNotFoundException e) {
+            throw new SailoException("Ei saa luettua tiedostoa " + tiedostonNimi);
+        }
+        
+    }
+
 
     /**
      * @param rallinTunnusNro tarkasteltavan rallin tunnusnumero
@@ -109,6 +153,13 @@ public class Henkilot {
     public static void main(String[] args) {
         Henkilot henkilot = new Henkilot();
         
+        try {
+            henkilot.lueTiedostosta("kerho");
+        } catch (SailoException ex) {
+            System.err.println(ex.getMessage());
+        }
+        
+        
         Henkilo rovis = new Henkilo();
         Henkilo asunmaa = new Henkilo();
         Henkilo elfyn = new Henkilo();
@@ -123,13 +174,13 @@ public class Henkilot {
         try {
             henkilot.lisaa(rovis);
             henkilot.lisaa(asunmaa);
-            henkilot.lisaa(elfyn);
+            henkilot.lisaa(elfyn); 
             
             System.out.println("==================== Testi ======================");
             
             for (int i = 0; i < henkilot.getLkm(); i++) {
                 Henkilo henkilo = henkilot.anna(i);
-                System.out.println("Henkilo nro: " + i);
+                System.out.println("Henkilo nro: " + (i+1));
                 henkilo.tulosta(System.out);
             }
             
@@ -137,6 +188,7 @@ public class Henkilot {
                 System.err.println("Liikaa alkioita :0"); //kun alkioita enemmän kun MAX sallii
         }
         
+        // tallentaminen hakemistoon "kerho"
         try {
             henkilot.tallenna("kerho");
         } catch (SailoException e) {
diff --git a/kerho/src/RalliJava/Rekisteri.java b/kerho/src/RalliJava/Rekisteri.java
index 5c4e478aeec29312ca336080f02e3af7e8a880a1..14dd529bdac1c1dc2693662203d928238013d8dd 100644
--- a/kerho/src/RalliJava/Rekisteri.java
+++ b/kerho/src/RalliJava/Rekisteri.java
@@ -5,6 +5,8 @@ import java.util.List;
 /**
  * @author idamk
  * @version 25.2.2025
+ * TODO: nimien toistuvuustarkistin
+ * TODO: 
  *
  */
 public class Rekisteri {
@@ -57,6 +59,7 @@ public class Rekisteri {
         return henkilot.anna(i);  
     }
     
+    
     /**
      * @param henkilo Henkilö kenen rallit halutaan tietää
      * @return listan näistä ralleista
diff --git a/kerho/src/RalliJava/test/HenkiloTest.java b/kerho/src/RalliJava/test/HenkiloTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..589f76d98c213bf2ab3b5bd48e855c0774fc3328
--- /dev/null
+++ b/kerho/src/RalliJava/test/HenkiloTest.java
@@ -0,0 +1,67 @@
+package RalliJava.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+import RalliJava.*;
+// Generated by ComTest END
+
+/**
+ * Test class made by ComTest
+ * @version 2025.03.26 10:56:37 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class HenkiloTest {
+
+
+
+  // Generated by ComTest BEGIN
+  /** testRekisteroi32 */
+  @Test
+  public void testRekisteroi32() {    // Henkilo: 32
+    Henkilo henkilo1 = new Henkilo(); 
+    assertEquals("From: Henkilo line: 34", 0, henkilo1.getHenkilonTunnusNro()); 
+    henkilo1.rekisteroi(); 
+    Henkilo henkilo2 = new Henkilo(); 
+    henkilo2.rekisteroi(); 
+    int ht1 = henkilo1.getHenkilonTunnusNro(); 
+    int ht2 = henkilo2.getHenkilonTunnusNro(); 
+    assertEquals("From: Henkilo line: 40", ht2-1, ht1); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testGetNimi171 */
+  @Test
+  public void testGetNimi171() {    // Henkilo: 171
+    Henkilo henkilo = new Henkilo(); 
+    henkilo.vastaaKalle(); 
+    { String _l_=henkilo.getNimi(),_r_="Kalle Rovanperä"; if ( !_l_.matches(_r_) ) fail("From: Henkilo line: 174" + " does not match: ["+ _l_ + "] != [" + _r_ + "]");}; 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testToString185 */
+  @Test
+  public void testToString185() {    // Henkilo: 185
+    Henkilo henkilo = new Henkilo(); 
+    henkilo.parse("2|Rovanperä|Kalle|"); 
+    assertEquals("From: Henkilo line: 188", true, henkilo.toString().startsWith("2|Rovanperä|Kalle|")); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testParse210 */
+  @Test
+  public void testParse210() {    // Henkilo: 210
+    Henkilo henkilo = new Henkilo(); 
+    henkilo.parse("2|Rovanperä|Kalle|"); 
+    assertEquals("From: Henkilo line: 213", 2, henkilo.getHenkilonTunnusNro()); 
+    assertEquals("From: Henkilo line: 214", true, henkilo.toString().startsWith("2|Rovanperä|Kalle|")); 
+    henkilo.rekisteroi(); 
+    int ht = henkilo.getHenkilonTunnusNro(); 
+    henkilo.parse(""+(ht+20)); 
+    henkilo.rekisteroi(); 
+    assertEquals("From: Henkilo line: 219", ht+20+1, henkilo.getHenkilonTunnusNro()); 
+  } // Generated by ComTest END
+}
\ No newline at end of file
diff --git a/kerho/src/RalliJava/test/HenkilotTest.java b/kerho/src/RalliJava/test/HenkilotTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..14c971d315de6569e8c9f4ebbebc1d7c4dae5a16
--- /dev/null
+++ b/kerho/src/RalliJava/test/HenkilotTest.java
@@ -0,0 +1,44 @@
+package RalliJava.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+import RalliJava.*;
+// Generated by ComTest END
+
+/**
+ * Test class made by ComTest
+ * @version 2025.03.26 11:05:27 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class HenkilotTest {
+
+
+  // Generated by ComTest BEGIN
+  /** 
+   * testLisaa39 
+   * @throws SailoException when error
+   */
+  @Test
+  public void testLisaa39() throws SailoException {    // Henkilot: 39
+    Henkilot henkilot = new Henkilot(); 
+    Henkilo henkilo1 = new Henkilo(), henkilo2 = new Henkilo(); 
+    assertEquals("From: Henkilot line: 43", 0, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 44", 1, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo2); assertEquals("From: Henkilot line: 45", 2, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 46", 3, henkilot.getLkm()); 
+    assertEquals("From: Henkilot line: 47", henkilo1, henkilot.anna(0)); 
+    assertEquals("From: Henkilot line: 48", henkilo2, henkilot.anna(1)); 
+    assertEquals("From: Henkilot line: 49", henkilo1, henkilot.anna(2)); 
+    try {
+    assertEquals("From: Henkilot line: 50", henkilo1, henkilot.anna(3)); 
+    fail("Henkilot: 50 Did not throw IndexOutOfBoundsException");
+    } catch(IndexOutOfBoundsException _e_){ _e_.getMessage(); }
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 51", 4, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 52", 5, henkilot.getLkm()); 
+    try {
+    henkilot.lisaa(henkilo2); 
+    fail("Henkilot: 53 Did not throw SailoException");
+    } catch(SailoException _e_){ _e_.getMessage(); }
+  } // Generated by ComTest END
+}
\ No newline at end of file