diff --git a/.classpath b/.classpath
index 8c39f29e9959a5779e6a1afb652cf9c24e3b6990..58a9ee2332b4b2a398cc8d2f134cef942ed850a3 100644
--- a/.classpath
+++ b/.classpath
@@ -8,5 +8,6 @@
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.fx.ide.jdt.core.JAVAFX_CONTAINER"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/ohj2"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/Kirjalista.jar b/Kirjalista.jar
index 0e11c2c87e52a8234d36bd2609900b569bb8264d..8463797545d1e1cab93946687893a8335db33d9e 100644
Binary files a/Kirjalista.jar and b/Kirjalista.jar differ
diff --git a/build.xml b/build.xml
index aa59b5363e833fada057bb94b556d67a5bc6164b..3ccde9eee5da3105024fb5cafe85e6e189955cad 100644
--- a/build.xml
+++ b/build.xml
@@ -13,9 +13,11 @@
                 <attribute name="Class-Path" value="."/>
             </manifest>
             <fileset dir="${dir.jarfile}/bin"/>
+            <zipfileset excludes="META-INF/*.SF" src="C:/devel/ec2412/eclipse/plugins/org.eclipse.fx.ide.css.jfx8_3.8.0.202204150904.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="C:/devel/jar/Ali.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="C:/devel/jar/fxgui.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="C:/devel/jar/Graphics.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="C:/devel/jar/Music.jar"/>
         </jar>
     </target>
 </project>
diff --git a/src/Kirjalista/Genre.java b/src/Kirjalista/Genre.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce75905182ac803bec0dbc2e0cc9df91888564d9
--- /dev/null
+++ b/src/Kirjalista/Genre.java
@@ -0,0 +1,68 @@
+package Kirjalista;
+
+
+/**
+ * Genre-luokka
+ * - Sisältää genren tiedot
+ * - Muuttaa merkkijonon genren tiedoiksi
+ * - Muuttaa genren tiedot merkkijonoksi
+ */
+public class Genre {
+    
+    private int id = 0;
+    private String nimi = "";
+    
+    private static int seuraavaId = 1;
+    
+    /**
+     * Ottaa merkkijonon ja muuttaa sen genren tiedoiksi, poistaa turhat völilyönnit ja muuttaa
+     * syötteen pieniksi kirjaimiksi
+     * @param mjono Merkkijono, josta kirjan tiedot saadaan
+     * <pre name="test">
+     * Genre g = new Genre();
+     * g.parse("fantasia");
+     * g.toString() === "fantasia";
+     * g.parse("FANTASIA");
+     * g.toString() === "fantasia";
+     * g.parse("  Fantasia   ");
+     * g.toString() === "fantasia";
+     * </pre>
+     */
+    public void parse(String mjono) {
+        this.nimi = mjono.trim().toLowerCase();
+    }
+    
+    
+    /**
+     * Palauttaa genren nimen merkkijonona
+     */
+    @Override
+    public String toString() {
+        return (this.nimi);
+    }
+    
+    
+    /**
+     * Rekisteröi genren antamalla sille id:n, kasvattaa seuraavaId:tä
+     * <pre name="test">
+     *  Genre g1 = new Genre();
+     *  Genre g2 = new Genre();
+     *  g1.rekisteroi();
+     *  g2.rekisteroi();
+     *  g1.getId() === g2.getId() - 1;
+     *  </pre>
+     */
+    public void rekisteroi() {
+        this.id = seuraavaId;
+        seuraavaId++;
+    }
+    
+    
+    /**
+     * palauttaa genren id:n
+     * @return Genren id
+     */
+    public int getId() {
+        return this.id;
+    }
+}
diff --git a/src/Kirjalista/Kirja.java b/src/Kirjalista/Kirja.java
new file mode 100644
index 0000000000000000000000000000000000000000..4028e947f01368b57a9736933d10257bb7c19871
--- /dev/null
+++ b/src/Kirjalista/Kirja.java
@@ -0,0 +1,124 @@
+package Kirjalista;
+
+import java.io.PrintStream;
+import java.util.Random;
+import fi.jyu.mit.ohj2.Mjonot;
+
+
+/**
+ * Kirja-luokka
+ * - Sisältää kirjan tiedot
+ * - Muuttaa merkkijonon kirjan tiedoiksi
+ * - Muuttaa kirjan tiedot merkkijonoksi
+ */
+public class Kirja {
+    private int id = 0;
+    private String nimi = "";
+    private String kirjoittaja  = "";
+    private String kirjasarja = "";
+    private int sivumaara = 0;
+    
+    private static int seuraavaId = 1;
+    
+        
+    /**
+     * Ottaa merkkijonon ja muuttaa sen kirjan tiedoiksi, poistaa turhat välilyönnit
+     * merkkijono muotoa nimi|kirjoittaja|kirjasarja|sivumäärä
+     * @param mjono Merkkijono, josta kirjan tiedot saadaan
+     * <pre name="test">
+     * Kirja k = new Kirja();
+     * k.parse("Hobitti|J.R.R. Tolkien||336");
+     * k.toString() === "Hobitti|J.R.R. Tolkien||336";
+     * 
+     * Kirja k2 = new Kirja();
+     * k2.parse("    Hobitti  |  J.R.R. Tolkien |   |336");
+     * k2.toString() === "Hobitti|J.R.R. Tolkien||336";
+     * 
+     * 
+     * </pre>
+     */
+    public void parse(String mjono) {
+        StringBuilder sb = new StringBuilder(mjono);
+        this.nimi = Mjonot.erota(sb, '|').trim();
+        this.kirjoittaja = Mjonot.erota(sb, '|').trim();
+        this.kirjasarja = Mjonot.erota(sb, '|').trim();
+        this.sivumaara = Mjonot.erotaInt(sb, 0);
+    }
+    
+    
+    /**
+     * Palauttaa kirjan tiedot merkkijonona muodossa id|nimi|kirjoittaja|kirjasarja|sivumäärä
+     */
+    @Override
+    public String toString() {
+        return (this.id + "|" + this.nimi + "|" + this.kirjoittaja + "|" + this.kirjasarja + "|" + this.sivumaara);
+    }
+    
+    
+    /**
+     * Rekisteröi kirjan antamalla sille Id:n. Kasvattaa seuraavaId:tä.
+     *  <pre name="test">
+     *  Kirja k = new Kirja();
+     *  Kirja k2 = new Kirja();
+     *  k.rekisteroi();
+     *  k2.rekisteroi();
+     *  k.getId() === k2.getId() - 1;
+     *  </pre>
+     */
+    public void rekisteroi() {
+        this.id = seuraavaId;
+        seuraavaId++;
+    }
+    
+    
+    /**
+     * Apumetodi, jolla saadaan täytettyä testiarvot kirjalle.
+     */
+    public void esimerkkiKirja() {
+        Random rand = new Random();
+        this.nimi = "Hobitti" + rand.nextInt(10);
+        this.kirjoittaja = "J.R.R. Tolkien";
+        this.kirjasarja = "";
+        this.sivumaara = rand.nextInt(1000);
+    }
+
+    
+    /**
+     * @return palauttaa kirjan id:n
+     */
+    public int getId() {
+        return this.id;
+    }
+    
+    
+    /**
+     * @return Kirjan nimi
+     */
+    public String getNimi() {
+        return this.nimi;
+    }
+    
+    /**
+     * Tulostaa kirjan tiedot
+     * @param out Tietovirta, johon tulostetaan
+     */
+    public void tulosta(PrintStream out) {
+        out.println(this.id + " " + this.nimi + " " + this.kirjoittaja + " " + this.kirjasarja + " " + this.sivumaara);
+    }
+    
+    
+    /**
+     * Testausta varten
+     * @param args ei käytössä
+     */
+    public static void main(String[] args) {
+        Kirja k = new Kirja();
+        k.rekisteroi();
+        k.esimerkkiKirja();
+        k.tulosta(System.out);
+        Kirja k1 = new Kirja();
+        k1.rekisteroi();
+        k1.esimerkkiKirja();
+        k1.tulosta(System.out);
+    }
+}
diff --git a/src/Kirjalista/KirjanGenre.java b/src/Kirjalista/KirjanGenre.java
new file mode 100644
index 0000000000000000000000000000000000000000..8db33122235597cbe656d1a77a59d8ce7f650f60
--- /dev/null
+++ b/src/Kirjalista/KirjanGenre.java
@@ -0,0 +1,67 @@
+package Kirjalista;
+
+
+/**
+ * Liimaa kirjan ja genren yhteen id:n perusteella
+ */
+public class KirjanGenre {
+    private int kirjaId;
+    private int genreId;
+    
+    
+    /**
+     * Luo olion
+     * @param kirja kirja, jonka id tallennetaan
+     * @param genre genre, jonka id tallennetaan
+     * <pre name="test">
+     * Kirja k = new Kirja();
+     * k.rekisteroi();
+     * Kirja k1 = new Kirja();
+     * k1.rekisteroi();
+     * 
+     * Genre g = new Genre();
+     * g.rekisteroi();
+     * Genre g1 = new Genre();
+     * g1.rekisteroi();
+     * 
+     * KirjanGenre kg = new KirjanGenre(k, g);
+     * KirjanGenre kg1 = new KirjanGenre(k1, g1);
+     * KirjanGenre kg2 = new KirjanGenre(k, g1);
+     * 
+     * kg.getKirjaId() === k.getId();
+     * kg1.getKirjaId() === k1.getId();
+     * kg2.getKirjaId() === k.getId();
+     * 
+     * kg.getGenreId() === g.getId();
+     * kg1.getGenreId() === g1.getId();
+     * kg2.getGenreId() === g1.getId();
+     * 
+     * 
+     * </pre>
+     */
+    public KirjanGenre(Kirja kirja, Genre genre) {
+        this.kirjaId = kirja.getId();
+        this.genreId = genre.getId();
+    }
+    
+    
+    /**
+     * Palauttaa kirjan id:n
+     * @return Kirjan id
+     */
+    public int getKirjaId() {
+        return this.kirjaId;
+    }
+    
+    
+    
+    /**
+     * Palauttaa genren id:n
+     * @return Genren id
+     */
+    public int getGenreId() {
+        return this.genreId;
+    }
+}
+
+
diff --git a/src/Kirjalista/Kirjasto.java b/src/Kirjalista/Kirjasto.java
new file mode 100644
index 0000000000000000000000000000000000000000..717b0d442493dde7f388f8aeed4cedadd8f542cc
--- /dev/null
+++ b/src/Kirjalista/Kirjasto.java
@@ -0,0 +1,46 @@
+package Kirjalista;
+
+
+
+/**
+ * Luokka, joka keskustelee käyttöliittymän kanssa 
+ * - Välittää tietoja käyttöliittymän ja kirjojen sekä genrejen välillä
+ */
+public class Kirjasto {
+    private Kirjat kirjat = new Kirjat();
+    //private GenreRelaatio genreRelaatio;
+    //private Genret genret;
+    
+    
+    
+    /**
+     * @param kirja Lisättävä kirja
+     * @throws SailoException Jos kirjaa ei voi lisätä
+     */
+    public void lisaaKirja(Kirja kirja) throws SailoException {
+        kirjat.lisaa(kirja);
+    }
+    
+    
+    /**
+     * @param indeksi Indeksipaikka, josta kirja haetaan
+     * @return Kirja annetussa indeksipaikassa
+     * @throws IndexOutOfBoundsException Jos indeksi laiton
+     */
+    public Kirja haeKirja(int indeksi) throws IndexOutOfBoundsException {
+        return kirjat.hae(indeksi);
+    }
+    
+    
+    /**
+     * @return Kirjojen lukumäärä
+     */
+    public int getKirjaLkm() {
+        return this.kirjat.getLkm();
+    }
+    /*
+    public Genre haeGenre(Kirja kirja) {
+        GenreRelaatio.haeGenret();
+    }
+    */
+}
diff --git a/src/Kirjalista/Kirjat.java b/src/Kirjalista/Kirjat.java
new file mode 100644
index 0000000000000000000000000000000000000000..27f9f8941c89fca5edd0c516af0bbef8e57effca
--- /dev/null
+++ b/src/Kirjalista/Kirjat.java
@@ -0,0 +1,50 @@
+package Kirjalista;
+
+
+/**
+ * Monikkoluokka kirjoille.
+ * - Sisältää taulukon kirjoista
+ * - Lisää ja poistaa kirjoja
+ * - Lukee ja kirjoittaa tiedostoon (sitten joskus)
+ * - Etsii ja lajittelee (sitten joskus)
+ */
+public class Kirjat {
+    private int maxLkm = 8;
+    private int lkm;
+    private Kirja[] alkiot = new Kirja[maxLkm];
+    
+    
+    /**
+     * @param kirja Lisättävä kirja
+     * @throws SailoException Heittää, jos lisääminen ei onnistu
+     */
+    public void lisaa(Kirja kirja) throws SailoException {
+        if (this.lkm >= this.alkiot.length) throw new SailoException("Liikaa alkioita");
+        this.alkiot[this.lkm] = kirja;
+        this.lkm++;
+    }
+    
+    
+
+    /**
+     * Hakee kirjan indeksipaikassa i
+     * @param i Halutun kirjan indeksi
+     * @return viite kirjaan, jonka indeksi on i
+     * @throws IndexOutOfBoundsException jos indeksi liian suuri tai pieni  
+     */
+    public Kirja hae(int i) throws IndexOutOfBoundsException {
+        if (i < 0 || this.lkm <= i)
+            throw new IndexOutOfBoundsException("Laiton indeksi: " + i);
+        return this.alkiot[i];
+    }
+
+    
+    /**
+     * Palauttaa kirjojen lukumäärän
+     * @return kirjojen lukumäärä
+     */
+    public int getLkm() {
+        return this.lkm;
+    }
+
+}
diff --git a/src/Kirjalista/SailoException.java b/src/Kirjalista/SailoException.java
new file mode 100644
index 0000000000000000000000000000000000000000..88aea881a9669a75d321dfe4ff5fca1d866c0349
--- /dev/null
+++ b/src/Kirjalista/SailoException.java
@@ -0,0 +1,20 @@
+package Kirjalista;
+
+/**
+ * Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille.
+ * @author Vesa Lappalainen
+ * @version 1.0, 22.02.2003
+ */
+public class SailoException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * Poikkeuksen muodostaja jolle tuodaan poikkeuksessa
+     * käytettävä viesti
+     * @param viesti Poikkeuksen viesti
+     */
+    public SailoException(String viesti) {
+        super(viesti);
+    }
+}
diff --git a/src/Kirjalista/test/GenreTest.java b/src/Kirjalista/test/GenreTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0353e3cb64ac3e74ea12509605d41a1478006162
--- /dev/null
+++ b/src/Kirjalista/test/GenreTest.java
@@ -0,0 +1,42 @@
+package Kirjalista.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+
+import Kirjalista.Genre;
+
+/**
+ * Test class made by ComTest
+ * @version 2025.02.24 13:41:02 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class GenreTest {
+
+
+
+  // Generated by ComTest BEGIN
+  /** testParse22 */
+  @Test
+  public void testParse22() {    // Genre: 22
+    Genre g = new Genre(); 
+    g.parse("fantasia"); 
+    assertEquals("From: Genre line: 25", "fantasia", g.toString()); 
+    g.parse("FANTASIA"); 
+    assertEquals("From: Genre line: 27", "fantasia", g.toString()); 
+    g.parse("  Fantasia   "); 
+    assertEquals("From: Genre line: 29", "fantasia", g.toString()); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testRekisteroi48 */
+  @Test
+  public void testRekisteroi48() {    // Genre: 48
+    Genre g1 = new Genre(); 
+    Genre g2 = new Genre(); 
+    g1.rekisteroi(); 
+    g2.rekisteroi(); 
+    assertEquals("From: Genre line: 53", g2.getId() - 1, g1.getId()); 
+  } // Generated by ComTest END
+}
\ No newline at end of file
diff --git a/src/Kirjalista/test/KirjaTest.java b/src/Kirjalista/test/KirjaTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..50ed98afd982f7f41891c7ef874d0a225c00a8a1
--- /dev/null
+++ b/src/Kirjalista/test/KirjaTest.java
@@ -0,0 +1,41 @@
+package Kirjalista.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+
+import Kirjalista.Kirja;
+
+/**
+ * Test class made by ComTest
+ * @version 2025.02.24 13:31:16 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class KirjaTest {
+
+
+
+  // Generated by ComTest BEGIN
+  /** testParse26 */
+  @Test
+  public void testParse26() {    // Kirja: 26
+    Kirja k = new Kirja(); 
+    k.parse("Hobitti|J.R.R. Tolkien||336"); 
+    assertEquals("From: Kirja line: 29", "Hobitti|J.R.R. Tolkien||336", k.toString()); 
+    Kirja k2 = new Kirja(); 
+    k2.parse("    Hobitti  |  J.R.R. Tolkien |   |336"); 
+    assertEquals("From: Kirja line: 33", "Hobitti|J.R.R. Tolkien||336", k2.toString()); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testRekisteroi58 */
+  @Test
+  public void testRekisteroi58() {    // Kirja: 58
+    Kirja k = new Kirja(); 
+    Kirja k2 = new Kirja(); 
+    k.rekisteroi(); 
+    k2.rekisteroi(); 
+    assertEquals("From: Kirja line: 63", k2.getId() - 1, k.getId()); 
+  } // Generated by ComTest END
+}
\ No newline at end of file
diff --git a/src/Kirjalista/test/KirjanGenreTest.java b/src/Kirjalista/test/KirjanGenreTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4034012091d731828d9e31c9df49423712b5f307
--- /dev/null
+++ b/src/Kirjalista/test/KirjanGenreTest.java
@@ -0,0 +1,42 @@
+package Kirjalista.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+
+import Kirjalista.Genre;
+import Kirjalista.Kirja;
+import Kirjalista.KirjanGenre;
+
+/**
+ * Test class made by ComTest
+ * @version 2025.02.24 13:51:58 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class KirjanGenreTest {
+
+
+
+  // Generated by ComTest BEGIN
+  /** testKirjanGenre16 */
+  @Test
+  public void testKirjanGenre16() {    // KirjanGenre: 16
+    Kirja k = new Kirja(); 
+    k.rekisteroi(); 
+    Kirja k1 = new Kirja(); 
+    k1.rekisteroi(); 
+    Genre g = new Genre(); 
+    g.rekisteroi(); 
+    Genre g1 = new Genre(); 
+    g1.rekisteroi(); 
+    KirjanGenre kg = new KirjanGenre(k, g); 
+    KirjanGenre kg1 = new KirjanGenre(k1, g1); 
+    KirjanGenre kg2 = new KirjanGenre(k, g1); 
+    assertEquals("From: KirjanGenre line: 31", k.getId(), kg.getKirjaId()); 
+    assertEquals("From: KirjanGenre line: 32", k1.getId(), kg1.getKirjaId());
+    assertEquals("From: KirjanGenre line: 33", k.getId(), kg2.getKirjaId()); 
+    assertEquals("From: KirjanGenre line: 35", g.getId(), kg.getGenreId()); 
+    assertEquals("From: KirjanGenre line: 36", g1.getId(), kg1.getGenreId()); 
+    assertEquals("From: KirjanGenre line: 37", g1.getId(), kg2.getGenreId()); 
+  } // Generated by ComTest END
+}
\ No newline at end of file
diff --git a/src/fxKirjalista/KirjalistaGUIController.java b/src/fxKirjalista/KirjalistaGUIController.java
index 928925d85c384561b82fe891edf11527e7c663f1..da9310028357b3dd071858a322e45b5fc717f6e8 100644
--- a/src/fxKirjalista/KirjalistaGUIController.java
+++ b/src/fxKirjalista/KirjalistaGUIController.java
@@ -1,31 +1,92 @@
 package fxKirjalista;
 
+import java.io.PrintStream;
+import java.net.URL;
 import java.util.Optional;
+import java.util.ResourceBundle;
 
+import Kirjalista.Kirja;
+import Kirjalista.Kirjasto;
 import fi.jyu.mit.fxgui.Dialogs;
-import fi.jyu.mit.fxgui.ModalController;
+import fi.jyu.mit.fxgui.ListChooser;
+import fi.jyu.mit.fxgui.TextAreaOutputStream;
 import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.fxml.Initializable;
+import javafx.scene.Scene;
 import javafx.scene.control.Alert;
 import javafx.scene.control.ButtonBar.ButtonData;
+import javafx.scene.layout.Pane;
 import javafx.scene.control.ButtonType;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.TextArea;
+import javafx.scene.text.Font;
+import javafx.stage.Modality;
+import javafx.stage.Stage;
+
 
 /**
  * Ohjelman pääikkunan käsittelijä
  */
-public class KirjalistaGUIController {
-
+public class KirjalistaGUIController implements Initializable {
+    
+    @FXML private ListChooser<Kirja> chooserKirjat;
+    @FXML private ScrollPane paneKirja;
+    
     /**
      * Kirjan lisäys
      */
     @FXML void handleLisaaKirja() {
-        ModalController.showModal(KirjalistaGUIController.class.getResource("LisaaView.fxml"), "Kirja", null, "");
+        try {
+            Stage lisaaStage = new Stage();
+            lisaaStage.initModality(Modality.APPLICATION_MODAL);
+            
+            final FXMLLoader ldr = new FXMLLoader(getClass().getResource("LisaaView.fxml"));
+            final Pane root = (Pane)ldr.load();
+            
+            final LisaaController lisaaCtrl = (LisaaController) ldr.getController();
+            final Scene scene = new Scene(root);
+            scene.getStylesheets().add(getClass().getResource("kirjalista.css").toExternalForm());
+            lisaaStage.setScene(scene);
+            lisaaStage.setTitle("Lisää kirja");
+            
+            lisaaCtrl.setIsanta(this);
+            lisaaCtrl.setKirjasto(this.kirjasto);
+
+            lisaaStage.show();
+
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+
     }
 
     /**
      * Kirjan muokkaus
      */
     @FXML void handleMuokkaaKirja() {
-        ModalController.showModal(KirjalistaGUIController.class.getResource("MuokkaaView.fxml"), "Kirja", null, "");
+        try {
+            Stage muokkaaStage = new Stage();
+            muokkaaStage.initModality(Modality.APPLICATION_MODAL);
+            
+            final FXMLLoader ldr = new FXMLLoader(getClass().getResource("MuokkaaView.fxml"));
+            final Pane root = (Pane)ldr.load();
+            
+            final MuokkaaController muokkaaCtrl = (MuokkaaController) ldr.getController();
+            final Scene scene = new Scene(root);
+            scene.getStylesheets().add(getClass().getResource("kirjalista.css").toExternalForm());
+            muokkaaStage.setScene(scene);
+            muokkaaStage.setTitle("Muokkaa kirjaa");
+            
+            muokkaaCtrl.setIsanta(this);
+            muokkaaCtrl.setKirjasto(this.kirjasto);
+
+            muokkaaStage.show();
+
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+
     }
 
     /**
@@ -66,6 +127,11 @@ public class KirjalistaGUIController {
     }
 
     
+// ============================================================================    
+    
+    private Kirjasto kirjasto;
+    private Kirja valittuKirja;
+    private TextArea areaKirja = new TextArea();
     
     /**
      * Luo näytölle dialogin, joka kysyy vahvistusta kirjan poistamiseksi
@@ -84,4 +150,68 @@ public class KirjalistaGUIController {
         Optional<ButtonType> result = alert.showAndWait();
         if ( result.get() == buttonTypeYes ) Dialogs.showMessageDialog("Vielä ei osata poistaa");
     }
+
+    
+    /**
+     * Asettaa controllerille viitteen kirjasto-olioon
+     * @param kirjasto Kirjasto-luokan olio, johon viite asetetaan
+     */
+    public void setKirjasto(Kirjasto kirjasto) {
+        this.kirjasto = kirjasto;
+    }
+    
+    
+    /**
+     * Hakee lisätyn kirjan sen id:n perusteella ja lisää sen näyttöön
+     * @param idnro Kirjan id
+     */
+    public void hae(int idnro) {
+        chooserKirjat.clear();
+        
+        int index = 0;
+        for (int i = 0; i < kirjasto.getKirjaLkm(); i++) {
+            Kirja kirja = kirjasto.haeKirja(i);
+            if (kirja.getId() == idnro) index = i;
+            chooserKirjat.add(kirja.getNimi(), kirja);
+        }
+        chooserKirjat.setSelectedIndex(index);
+    }
+    
+    
+    /**
+     * Näyttää listasta valitun kirjan tiedot, 
+     * tilapäisesti yhteen isoon edit-kenttään
+     */
+    protected void naytaJasen() {
+        valittuKirja = chooserKirjat.getSelectedObject();
+
+        if (valittuKirja == null) return;
+
+        areaKirja.setText("");
+        try (PrintStream os = TextAreaOutputStream.getTextPrintStream(areaKirja)) {
+            valittuKirja.tulosta(os);
+        }
+    }
+    
+    /**
+     * Tekee tarvittavat muut alustukset, nyt vaihdetaan GridPanen tilalle
+     * yksi iso tekstikenttä, johon voidaan tulostaa jäsenten tiedot.
+     * Alustetaan myös jäsenlistan kuuntelija 
+     */
+    protected void alusta() {
+        paneKirja.setContent(areaKirja);
+        areaKirja.setFont(new Font("Courier New", 12));
+        paneKirja.setFitToHeight(true);
+        
+        chooserKirjat.clear();
+        chooserKirjat.addSelectionListener(e -> naytaJasen());
+    }
+
+    @Override
+    public void initialize(URL arg0, ResourceBundle arg1) {
+        alusta();
+        
+    }
+
+
 }
diff --git a/src/fxKirjalista/KirjalistaGUIView.fxml b/src/fxKirjalista/KirjalistaGUIView.fxml
index 7d695b9c9a2f7c84f18be0aee1fb2803f89fb5d4..79299c07d0a6094ab045562be5962d1bce7a288b 100644
--- a/src/fxKirjalista/KirjalistaGUIView.fxml
+++ b/src/fxKirjalista/KirjalistaGUIView.fxml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+<?import fi.jyu.mit.fxgui.ListChooser?>
 <?import javafx.geometry.Insets?>
 <?import javafx.scene.control.Button?>
 <?import javafx.scene.control.Label?>
@@ -26,7 +27,7 @@
                   <Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
                </VBox.margin>
             </Label>
-            <ScrollPane prefHeight="383.0" prefWidth="274.0">
+            <ScrollPane fx:id="paneKirja" prefHeight="383.0" prefWidth="274.0">
               <content>
                 <AnchorPane prefHeight="303.0" prefWidth="237.0">
                      <children>
@@ -41,6 +42,7 @@
                             <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                               <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                               <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                           </rowConstraints>
                            <children>
                               <Label text="Nimi:">
@@ -93,6 +95,16 @@
                                     <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                                  </GridPane.margin>
                               </TextField>
+                              <Label text="Sivumäärä" GridPane.rowIndex="5">
+                                 <GridPane.margin>
+                                    <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
+                                 </GridPane.margin>
+                              </Label>
+                              <TextField text="336" GridPane.columnIndex="1" GridPane.rowIndex="5">
+                                 <GridPane.margin>
+                                    <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
+                                 </GridPane.margin>
+                              </TextField>
                            </children>
                         </GridPane>
                      </children>
@@ -131,21 +143,7 @@
               <content>
                 <AnchorPane prefHeight="336.0" prefWidth="267.0">
                      <children>
-                        <Label text="Hobitti">
-                           <padding>
-                              <Insets bottom="5.0" left="5.0" right="150.0" top="5.0" />
-                           </padding>
-                        </Label>
-                        <Label layoutY="28.0" prefHeight="27.0" prefWidth="284.0" text="Taru sormusten herrasta">
-                           <padding>
-                              <Insets bottom="5.0" left="5.0" right="150.0" top="5.0" />
-                           </padding>
-                        </Label>
-                        <Label layoutY="56.0" text="Java-ohjelmointi">
-                           <padding>
-                              <Insets bottom="5.0" left="5.0" right="150.0" top="5.0" />
-                           </padding>
-                        </Label>
+                        <ListChooser fx:id="chooserKirjat" prefHeight="254.0" prefWidth="284.0" rivit="Hobitti&#10;Taru sormusten herrasta&#10;Java-ohjelmointi&#10;" />
                      </children>
                   </AnchorPane>
               </content>
diff --git a/src/fxKirjalista/KirjalistaMain.java b/src/fxKirjalista/KirjalistaMain.java
index 0fd5821cdc0069d14a89a12af49834416d3fe004..ae34e3f7a1f2afbb8c232babbfd472b46ec68311 100644
--- a/src/fxKirjalista/KirjalistaMain.java
+++ b/src/fxKirjalista/KirjalistaMain.java
@@ -1,5 +1,6 @@
 package fxKirjalista;
 
+import Kirjalista.Kirjasto;
 import javafx.application.Application;
 import javafx.stage.Stage;
 import javafx.scene.Scene;
@@ -12,7 +13,7 @@ import javafx.fxml.FXMLLoader;
  * @version 23.1.2025
  *
  */
-public class KirjalistaMain extends Application {
+public class KirjalistaMain extends Application {    
     @Override
     public void start(Stage primaryStage) {
         try {
@@ -20,12 +21,16 @@ public class KirjalistaMain extends Application {
             final FXMLLoader ldr = new FXMLLoader(getClass().getResource("KirjalistaGUIView.fxml"));
             final Pane root = (Pane)ldr.load();
             
-            // final KirjalistaGUIController kirjalistaCtrl = (KirjalistaGUIController) ldr.getController();
+            final KirjalistaGUIController kirjalistaCtrl = (KirjalistaGUIController) ldr.getController();
             final Scene scene = new Scene(root);
             scene.getStylesheets().add(getClass().getResource("kirjalista.css").toExternalForm());
             primaryStage.setScene(scene);
             primaryStage.setTitle("Kirjalista");
             
+            Kirjasto kirjasto = new Kirjasto();
+            kirjalistaCtrl.setKirjasto(kirjasto);
+            
+            
             primaryStage.show();
 
         } catch(Exception e) {
diff --git a/src/fxKirjalista/LisaaController.java b/src/fxKirjalista/LisaaController.java
index dabb379c9a66df45aca1b5f314b907c571bed1f7..7cd6a71d90eb9934681aaf6c92afba05e4b965f6 100644
--- a/src/fxKirjalista/LisaaController.java
+++ b/src/fxKirjalista/LisaaController.java
@@ -1,5 +1,8 @@
 package fxKirjalista;
 
+import Kirjalista.Kirja;
+import Kirjalista.Kirjasto;
+import Kirjalista.SailoException;
 import fi.jyu.mit.fxgui.ComboBoxChooser;
 import javafx.fxml.FXML;
 import javafx.scene.control.TextField;
@@ -13,24 +16,26 @@ import fi.jyu.mit.fxgui.ModalControllerInterface;
  */
 public class LisaaController implements ModalControllerInterface<String> {
 
+  
     @FXML private ComboBoxChooser<?> comboboxGenre;
-
     @FXML private TextField textKirjailija;
-
     @FXML private TextField textNimi;
-
     @FXML private TextField textSarja;
-
     @FXML private TextField textSivu;
-
     @FXML private TextField textVuosi;
+
+    private Kirjasto kirjasto;
+    
+    private KirjalistaGUIController isanta;
     
     @FXML void handleJasenLisatty() {
-        // TODO:
+        uusiKirja();
     }
-    
+
+
     @FXML void handleOK() {
-        Dialogs.showMessageDialog("Vielä ei osata lisätä");
+        uusiKirja();
+        //Dialogs.showMessageDialog("Vielä ei osata lisätä");
         ModalController.closeStage(textNimi);
 
     }
@@ -44,7 +49,6 @@ public class LisaaController implements ModalControllerInterface<String> {
     @Override
     public void handleShown() {
         // TODO Auto-generated method stub
-        
     }
 
     @Override
@@ -52,6 +56,45 @@ public class LisaaController implements ModalControllerInterface<String> {
         // TODO Auto-generated method stub
         
     }
+
+    
+    
+    /**
+     * Asettaa controllerille viitteen kirjasto-olioon
+     * @param kirjasto Kirjasto-luokan olio, johon viite asetetaan
+     */
+    public void setKirjasto(Kirjasto kirjasto) {
+        this.kirjasto = kirjasto;
+    }
+    
+    
     
+    /**
+     * Asettaa olion "isännäksi" kirjalistan pääikkunan kontrollerin, jotta
+     * keskustelu kontrollerien välillä helpompaa
+     * @param isanta Pääikkunan kontrolleri
+     */
+    public void setIsanta(KirjalistaGUIController isanta) {
+        this.isanta = isanta;
+    }
+    
+    
+    /**
+     * Luo kirjan ja antaa sille id:n. Pyrkii lisäämään sen kirjat-olion
+     * taulukkoon ja antaa virheen, jos ei onnistu.
+     */
+    protected void uusiKirja() {
+        Kirja uusi = new Kirja();
+        uusi.esimerkkiKirja();
+        uusi.rekisteroi();
+        try {
+            kirjasto.lisaaKirja(uusi);
+        } catch (SailoException e) {
+            Dialogs.showMessageDialog("Ongelma " + e.getMessage());
+            return;
+        }
+        isanta.hae(uusi.getId());
+    
+    }
     
 }
diff --git a/src/fxKirjalista/MuokkaaController.java b/src/fxKirjalista/MuokkaaController.java
index 80a652f4cb224dc3718d9b47631c610b9cd505ec..79b659a44bcb63014a5323fa7d220c76d6b8a241 100644
--- a/src/fxKirjalista/MuokkaaController.java
+++ b/src/fxKirjalista/MuokkaaController.java
@@ -1,5 +1,6 @@
 package fxKirjalista;
 
+import Kirjalista.Kirjasto;
 import fi.jyu.mit.fxgui.ComboBoxChooser;
 import javafx.fxml.FXML;
 import javafx.scene.control.TextField;
@@ -8,7 +9,7 @@ import fi.jyu.mit.fxgui.ModalController;
 import fi.jyu.mit.fxgui.ModalControllerInterface;
 
 /**
- * 
+ * Kontrolleri muokkausdialogille
  */
 public class MuokkaaController implements ModalControllerInterface<String> {
 
@@ -23,10 +24,10 @@ public class MuokkaaController implements ModalControllerInterface<String> {
     @FXML private TextField textSivu;
 
     @FXML private TextField textVuosi;
-    
-    @FXML void handleJasenLisatty() {
-        // TODO:
-    }
+
+    private Kirjasto kirjasto;
+
+    private KirjalistaGUIController isanta;
     
     @FXML void handleOK() {
         Dialogs.showMessageDialog("Vielä ei osata muokata");
@@ -58,5 +59,16 @@ public class MuokkaaController implements ModalControllerInterface<String> {
         
     }
     
+    /**
+     * Asettaa controllerille viitteen kirjasto-olioon
+     * @param kirjasto Kirjasto-luokan olio, johon viite asetetaan
+     */
+    public void setKirjasto(Kirjasto kirjasto) {
+        this.kirjasto = kirjasto;
+    }
+
+    public void setIsanta(KirjalistaGUIController isanta) {
+        this.isanta = isanta;
+    }
     
 }