diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/Kirja.java b/src/main/java/fi/utu/tech/ooj/exercise0/Kirja.java
new file mode 100644
index 0000000000000000000000000000000000000000..d46bc6b3fb32fbf485d2976574654f920eb85506
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/Kirja.java
@@ -0,0 +1,40 @@
+package fi.utu.tech.ooj.exercise0;
+public class Kirja {
+    private String kirjanNimi;
+    private String kirjailijanNimi;
+    private int julkaisuVuosi;
+    public Kirja(String kirjanNimi, String kirjailijanNimi, int julkaisuVuosi) {
+        this.kirjanNimi = kirjanNimi;
+        this.kirjailijanNimi = kirjailijanNimi;
+        this.julkaisuVuosi = julkaisuVuosi;
+    };
+
+    public void setKirjanNimi(String kirjanNimi) {
+        this.kirjanNimi = kirjanNimi;
+    }
+
+    public String getKirjanNimi() {
+        return this.kirjanNimi;
+    }
+
+    public void setKirjailijanNimi(String kirjailijanNimi) {
+        this.kirjailijanNimi = kirjailijanNimi;
+    }
+
+    public String getKirjailijanNimi() {
+        return this.kirjailijanNimi;
+    }
+
+    public void setJulkaisuVuosi(int julkaisuVuosi) {
+        this.julkaisuVuosi = julkaisuVuosi;
+    }
+
+    public int getJulkaisuVuosi() {
+        return this.julkaisuVuosi;
+    }
+
+    @Override
+    public String toString() {
+        return "Kirja: " + this.kirjanNimi + "\nKirjailija: " + this.kirjailijanNimi + "\nJulkaisuvuosi: " + this.julkaisuVuosi;
+    }
+}
diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/KirjaKokoelma.java b/src/main/java/fi/utu/tech/ooj/exercise0/KirjaKokoelma.java
new file mode 100644
index 0000000000000000000000000000000000000000..059271e003ce9fa321ef4e2bb5201e96b0aaf11e
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/KirjaKokoelma.java
@@ -0,0 +1,73 @@
+package fi.utu.tech.ooj.exercise0;
+import java.util.ArrayList;
+import java.util.List;
+import java.io.PrintStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class KirjaKokoelma {
+    private String kokoelmanOmistaja;
+    private ArrayList<Kirja> kirjaListaus;
+    public KirjaKokoelma(String kokoelmanOmistaja, ArrayList<Kirja> kirjaListaus) {
+        this.kokoelmanOmistaja = kokoelmanOmistaja;
+        this.kirjaListaus = kirjaListaus;
+    };
+
+    public void setKokoelmanOmistaja(String kokoelmanOmistaja) {
+        this.kokoelmanOmistaja = kokoelmanOmistaja;
+    }
+
+    public String getKokoelmanOmistaja() {
+        return this.kokoelmanOmistaja;
+    }
+
+    public void lisaaKirja(Kirja kirja) {
+        this.kirjaListaus.add(kirja);
+    }
+
+    public ArrayList<Kirja> getKirjaListaus() {
+        return this.kirjaListaus;
+    }
+
+    public void tulostaKokoelma(PrintStream out) {
+        if(this.kirjaListaus.isEmpty()) {
+            out.println("Kirjalistaus on tyhjä!\n");
+        } else {
+            for(Kirja kirja : this.kirjaListaus) {
+                out.println(kirja + "\n");
+            }
+        }
+    }
+    public List<Kirja> etsiKirjat(String hakusana, KirjanTiedot kentta) throws IllegalArgumentException {
+        if((hakusana == null) || (hakusana == "")) {
+            throw new IllegalArgumentException();
+        }
+        Pattern pattern = Pattern.compile(hakusana);
+        String tieto;
+        Matcher matcher;
+        List<Kirja> kirjat = new ArrayList<>();
+        for(Kirja kirja : this.kirjaListaus) {
+            switch(kentta) {
+            case NIMI:
+                tieto = kirja.getKirjanNimi();
+                matcher = pattern.matcher(tieto);
+                break;
+            case KIRJAILIJA:
+                tieto = kirja.getKirjailijanNimi();
+                matcher = pattern.matcher(tieto);
+                break;
+            default:
+                tieto = String.valueOf(kirja.getJulkaisuVuosi());
+                matcher = pattern.matcher(String.valueOf(tieto));
+                break;
+            }
+            if(tieto == null) {
+                throw new IllegalArgumentException();
+            }
+            if(matcher.find()) {
+                kirjat.add(kirja);
+            }
+        }
+        return kirjat;
+    }
+}
diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/KirjaKokoelma.java.orig b/src/main/java/fi/utu/tech/ooj/exercise0/KirjaKokoelma.java.orig
new file mode 100644
index 0000000000000000000000000000000000000000..7ca8cc75713bcef574d5ac1ac333cb95e2ed716b
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/KirjaKokoelma.java.orig
@@ -0,0 +1,70 @@
+package fi.utu.tech.ooj.exercise0;
+import java.util.ArrayList;
+import java.util.List;
+import java.io.PrintStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class KirjaKokoelma {
+    private String kokoelmanOmistaja;
+    private ArrayList<Kirja> kirjaListaus;
+    public KirjaKokoelma(String kokoelmanOmistaja, ArrayList<Kirja> kirjaListaus) {
+        this.kokoelmanOmistaja = kokoelmanOmistaja;
+        this.kirjaListaus = kirjaListaus;
+    };
+
+    public void setKokoelmanOmistaja(String kokoelmanOmistaja) {
+        this.kokoelmanOmistaja = kokoelmanOmistaja;
+    }
+
+    public String getKokoelmanOmistaja() {
+        return this.kokoelmanOmistaja;
+    }
+
+    public void lisaaKirja(Kirja kirja) {
+        this.kirjaListaus.add(kirja);
+    }
+
+    public ArrayList<Kirja> getKirjaListaus() {
+        return this.kirjaListaus;
+    }
+
+    public void tulostaKokoelma(PrintStream out) {
+        if(this.kirjaListaus.isEmpty()) {
+            out.println("Kirjalistaus on tyhjä!");
+        } else {
+            for(Kirja kirja : this.kirjaListaus) {
+                out.print(kirja);
+            }
+        }
+    }
+    public List<Kirja> etsiKirjat(String hakusana, KirjanTiedot kentta) throws IllegalArgumentException {
+        if((hakusana == null) || (hakusana == "")) {
+            throw new IllegalArgumentException();
+        }
+        Pattern pattern = Pattern.compile(hakusana);
+        String tieto;
+        Matcher matcher;
+        List<Kirja> kirjat = new ArrayList<>();
+        for(Kirja kirja : this.kirjaListaus) {
+            switch (kentta) {
+            case NIMI: 
+                tieto = kirja.getKirjanNimi();
+                matcher = pattern.matcher(tieto);
+            case KIRJAILIJA:
+                tieto = kirja.getKirjailijanNimi();
+                matcher = pattern.matcher(tieto);
+                case JULKAISUVUOSI:
+                tieto = String.valueOf(kirja.getJulkaisuVuosi());
+                matcher = pattern.matcher(String.valueOf(tieto));
+        }
+            if(tieto == null) {
+                throw new IllegalArgumentException();
+            }
+            if(matcher.find()) {
+                kirjat.add(kirja);
+            }
+        }
+        return kirjat;
+    }
+}
diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java b/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java
index 6a6422f2c2b63d1777eb2d42074eb08d6da56d3c..8b2ecdd12565b69fbe5efdbf9bce5d0a8ce179a0 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java
@@ -1,8 +1,8 @@
 package fi.utu.tech.ooj.exercise0;
 
 /*
- * Literaaliluokka, joka listaa kirjaa liittyvät tietokentät
- */
+    Literaaliluokka, joka listaa kirjaa liittyvät tietokentät
+*/
 public enum KirjanTiedot {
     NIMI,
     KIRJAILIJA,
diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java.orig b/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java.orig
new file mode 100644
index 0000000000000000000000000000000000000000..6a6422f2c2b63d1777eb2d42074eb08d6da56d3c
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/KirjanTiedot.java.orig
@@ -0,0 +1,10 @@
+package fi.utu.tech.ooj.exercise0;
+
+/*
+ * Literaaliluokka, joka listaa kirjaa liittyvät tietokentät
+ */
+public enum KirjanTiedot {
+    NIMI,
+    KIRJAILIJA,
+    JULKAISUVUOSI
+}
diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/Main.java b/src/main/java/fi/utu/tech/ooj/exercise0/Main.java
index 783d3d0cf21955651017c6638f3eb43bf992a6b9..8b6b172ec7d55c1f5c320a17bc61d285608d2a83 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise0/Main.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/Main.java
@@ -1,7 +1,6 @@
 package fi.utu.tech.ooj.exercise0;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Scanner;
 
@@ -9,42 +8,114 @@ public class Main {
 
 
     /*
-     * Kirjoita tähän tehtävän 4 ratkaisu. Rutiinin signatuuria ei saa muuttaa. Aloita tehtävä poistamalla
-     * kommenttimerkit alla olevan rutiinin rungon ympäriltä.
-     */
-    /*public static ArrayList<String> kysyTietoja(String[] kysyttavat, String lopetusmerkki) {
-
-    }*/
+        Kirjoita tähän tehtävän 4 ratkaisu. Rutiinin signatuuria ei saa muuttaa. Aloita tehtävä poistamalla
+        kommenttimerkit alla olevan rutiinin rungon ympäriltä.
+    */
+    public static ArrayList<String> kysyTietoja(String[] kysyttavat, String lopetusmerkki) {
+        ArrayList<String> vastaukset = new ArrayList<>();
+        Scanner s = new Scanner(System.in);
+        for(String kysymys : kysyttavat) {
+            System.out.print("Anna " + kysymys + ": ");
+            String vastaus = s.nextLine();
+            if(vastaus.equals(lopetusmerkki)) {
+                return vastaukset;
+            }
+            vastaukset.add(vastaus);
+        }
+        return vastaukset;
+    }
 
 
     /*
-     * Kirjoita tähän tehtävän 5 ratkaisu. Rutiinin signatuuria ei saa muuttaa. Aloita tehtävä poistamalla
-     * kommenttimerkit alla olevan rutiinin rungon ympäriltä.
-     */
-
-    /*public static KirjaKokoelma luoKokoelma(String lopetusmerkki) {
-
-    }*/
+        Kirjoita tähän tehtävän 5 ratkaisu. Rutiinin signatuuria ei saa muuttaa. Aloita tehtävä poistamalla
+        kommenttimerkit alla olevan rutiinin rungon ympäriltä.
+    */
+
+    public static KirjaKokoelma luoKokoelma(String lopetusmerkki) {
+        ArrayList<String> kirjanTiedot = new ArrayList<>();
+        ArrayList<Kirja> kirjat = new ArrayList<>();
+        Scanner s = new Scanner(System.in);
+        int lukum = 0;
+        int vuosi;
+        System.out.println("Kyselyn voit lopettaa merkillä: " + lopetusmerkki);
+        System.out.print("Anna kirja kokoelman omistajan nimi: ");
+        String omistaja = s.nextLine();
+        if(omistaja.equals(lopetusmerkki)) {
+            return new KirjaKokoelma("", new ArrayList<>());
+        }
+        System.out.println("\nSeuraavaksi lisätään kokoelmaan kirjoja. Kirjojen lisäys loppuu kun annat merkin: " + lopetusmerkki + "\n");
+        while(true) {
+            System.out.println(++lukum + ". kirja");
+            kirjanTiedot = kysyTietoja(new String[] {"kirjan nimi", "kirjailijan nimi", "julkaisuvuosi"}, lopetusmerkki);
+            if(kirjanTiedot.size() == 3) {
+                try {
+                    vuosi = Integer.valueOf(kirjanTiedot.get(2));
+                } catch(IllegalArgumentException e) {
+                    --lukum;
+                    System.out.println("Julkaisuvuosi vuodessa saa olla vain kokonaislukuja.\n");
+                    continue;
+                }
+                kirjat.add(new Kirja(kirjanTiedot.get(0), kirjanTiedot.get(1), vuosi));
+                System.out.println("Kirja lisätty!:");
+                System.out.println(kirjat.get(kirjat.size() - 1).toString() + "\n");
+            } else {
+                break;
+            }
+        }
+        System.out.println("Kokoelma luotu!\nKirjojen lukumäärä: " + (lukum - 1) + "\n");
+        return new KirjaKokoelma(omistaja, kirjat);
+    }
 
     /**
-     * Main class.
-     *
-     * @param args Command line arguments
-     */
+        Main class.
+
+        @param args Command line arguments
+    */
     public static void main(String[] args) {
+        final String lopetusmerkki = "LOPETA";
         /*
-         * Testin jälkeen alla olevan rivin voi joko kommentoida tai poistaa.
-         */
-        System.out.println("*** Harjoitustyöpohja käynnistyy ***");
-
+            Testin jälkeen alla olevan rivin voi joko kommentoida tai poistaa.
+        */
         //Luo ensin uusi KirjaKokoelma olio, Käytä tehtävän 5 rutiinia
-
-
         //Sen jälkeen tulosta kokoelma näyttöön käyttämällä tehtävän 6 rutiinia
-
-
         //Lopuksi hae jokin kirja kokoelmasta käyttäen tehtävän 7 rutiinia
         //Tulosta hakutulos. Sen voit tehdä suoraan main-metodissa.
-
+        System.out.println("*** Harjoitustyöpohja käynnistyy ***");
+        Scanner s;
+        KirjanTiedot KirjanTieto;
+        KirjaKokoelma kirjaKokoelma = luoKokoelma(lopetusmerkki);
+        KirjaKokoelma loydettyKirjaKokoelma;
+        List<Kirja> loydetytKirjat = new ArrayList<>();
+        kirjaKokoelma.tulostaKokoelma(System.out);
+        s = new Scanner(System.in);
+        while(true) {
+            System.out.println("Voit lopettaa hakumekanismin merkillä: " + lopetusmerkki);
+            System.out.println("Kentät:\nNIMI\nKIRJAILIJA\nJULKAISUVUOSI");
+            System.out.print("Anna kenttä: ");
+            String kentta = s.nextLine();
+            if(kentta.equals(lopetusmerkki)) {
+                break;
+            }
+            try {
+                KirjanTieto = KirjanTiedot.valueOf(kentta);
+                System.out.print("\nAnna regex: ");
+                String regex = s.nextLine();
+                if(regex.equals(lopetusmerkki)) {
+                    break;
+                }
+                loydetytKirjat = kirjaKokoelma.etsiKirjat(regex, KirjanTieto);
+                loydettyKirjaKokoelma = new KirjaKokoelma("EI_OMISTAJAA", new ArrayList<>(loydetytKirjat));
+                if(loydettyKirjaKokoelma.getKirjaListaus().size() != 0) {
+                    System.out.println("Löytyi tasan " + loydettyKirjaKokoelma.getKirjaListaus().size() + " kirjaa.\n");
+                }
+                loydettyKirjaKokoelma.tulostaKokoelma(System.out);
+            } catch(IllegalArgumentException e) {
+                System.out.println("VÄÄRÄ KENTTÄ!\n");
+                continue;
+            }
+            System.out.print("Aloitetaanpas alusta.\n");
+        }
+        s.close();
+        return;
     }
 }
diff --git a/src/main/java/fi/utu/tech/ooj/exercise0/Main.java.orig b/src/main/java/fi/utu/tech/ooj/exercise0/Main.java.orig
new file mode 100644
index 0000000000000000000000000000000000000000..dc19b791a9f5a5805e0dd4a7234dff98b90a7746
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise0/Main.java.orig
@@ -0,0 +1,121 @@
+package fi.utu.tech.ooj.exercise0;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+public class Main {
+
+
+    /*
+        Kirjoita tähän tehtävän 4 ratkaisu. Rutiinin signatuuria ei saa muuttaa. Aloita tehtävä poistamalla
+        kommenttimerkit alla olevan rutiinin rungon ympäriltä.
+    */
+    public static ArrayList<String> kysyTietoja(String[] kysyttavat, String lopetusmerkki) {
+        ArrayList<String> vastaukset = new ArrayList<>();
+        Scanner s = new Scanner(System.in);
+        for(String kysymys : kysyttavat) {
+            System.out.print("Anna " + kysymys + ": ");
+            String vastaus = s.nextLine();
+            if(vastaus.equals(lopetusmerkki)) {
+                return vastaukset;
+            }
+            vastaukset.add(vastaus);
+        }
+        return vastaukset;
+    }
+
+
+    /*
+        Kirjoita tähän tehtävän 5 ratkaisu. Rutiinin signatuuria ei saa muuttaa. Aloita tehtävä poistamalla
+        kommenttimerkit alla olevan rutiinin rungon ympäriltä.
+    */
+
+    public static KirjaKokoelma luoKokoelma(String lopetusmerkki) {
+        ArrayList<String> kirjanTiedot = new ArrayList<>();
+        ArrayList<Kirja> kirjat = new ArrayList<>();
+        Scanner s = new Scanner(System.in);
+        int lukum = 0;
+        int vuosi;
+        System.out.println("Kyselyn voit lopettaa merkillä: " + lopetusmerkki);
+        System.out.print("Anna kirja kokoelman omistajan nimi: ");
+        String omistaja = s.nextLine();
+        if(omistaja.equals(lopetusmerkki)) {
+            return new KirjaKokoelma("", new ArrayList<>());
+        }
+        System.out.println("\nSeuraavaksi lisätään kokoelmaan kirjoja. Kirjojen lisäys loppuu kun annat merkin: " + lopetusmerkki + "\n");
+        while(true) {
+            System.out.println(++lukum + ". kirja");
+            kirjanTiedot = kysyTietoja(new String[] {"kirjan nimi", "kirjailijan nimi", "julkaisuvuosi"}, lopetusmerkki);
+            if(kirjanTiedot.size() == 3) {
+            try {
+                vuosi = Integer.valueOf(kirjanTiedot.get(2));
+            } catch(IllegalArgumentException e) {
+                System.out.println("VÄÄRÄ KENTTÄ!\n");
+                continue;
+            }
+                kirjat.add(new Kirja(kirjanTiedot.get(0), kirjanTiedot.get(1), vuosi));
+                System.out.println("Kirja lisätty!:");
+                System.out.println(kirjat.get(kirjat.size() - 1).toString() + "\n");
+            } else {
+                break;
+            }
+        }
+        System.out.println("Kokoelma luotu!\nKirjojen lukumäärä: " + (lukum - 1) + "\n");
+        return new KirjaKokoelma(omistaja, kirjat);
+    }
+
+    /**
+        Main class.
+
+        @param args Command line arguments
+    */
+    public static void main(String[] args) {
+        final String lopetusmerkki = "LOPETA";
+        /*
+            Testin jälkeen alla olevan rivin voi joko kommentoida tai poistaa.
+        */
+        //Luo ensin uusi KirjaKokoelma olio, Käytä tehtävän 5 rutiinia
+        //Sen jälkeen tulosta kokoelma näyttöön käyttämällä tehtävän 6 rutiinia
+        //Lopuksi hae jokin kirja kokoelmasta käyttäen tehtävän 7 rutiinia
+        //Tulosta hakutulos. Sen voit tehdä suoraan main-metodissa.
+        System.out.println("*** Harjoitustyöpohja käynnistyy ***");
+        Scanner s;
+        KirjanTiedot KirjanTieto;
+        KirjaKokoelma kirjaKokoelma = luoKokoelma(lopetusmerkki);
+        KirjaKokoelma loydettyKirjaKokoelma;
+        List<Kirja> loydetytKirjat = new ArrayList<>();
+        kirjaKokoelma.tulostaKokoelma(System.out);
+        s = new Scanner(System.in);
+        while(true) {
+            System.out.println("Voit lopettaa hakumekanismin merkillä: " + lopetusmerkki);
+            System.out.println("Kentät:\nNIMI\nKIRJAILIJA\nJULKAISUVUOSI");
+            System.out.print("Anna kenttä: ");
+            String kentta = s.nextLine();
+            if(kentta.equals(lopetusmerkki)) {
+                break;
+            }
+            try {
+                KirjanTieto = KirjanTiedot.valueOf(kentta);
+                System.out.print("Anna regex: ");
+                String regex = s.nextLine();
+                if(regex.equals(lopetusmerkki)) {
+                    break;
+                }
+                loydetytKirjat = kirjaKokoelma.etsiKirjat(regex, KirjanTieto);
+                loydettyKirjaKokoelma = new KirjaKokoelma("EI_OMISTAJAA", new ArrayList<>(loydetytKirjat));
+                if(loydettyKirjaKokoelma.getKirjaListaus().size() != 0) {
+                    System.out.println("Löytyi tasan " + loydettyKirjaKokoelma.getKirjaListaus().size() + " kirjaa.");
+                }
+                loydettyKirjaKokoelma.tulostaKokoelma(System.out);
+                System.out.println();
+            } catch(IllegalArgumentException e) {
+                System.out.println("VÄÄRÄ KENTTÄ!\n");
+                continue;
+            }
+            System.out.print("Aloitetaanpas alusta.\n");
+        }
+        s.close();
+        return;
+    }
+}