diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java
index 7eaa5d5ac226a452d030d2eabf191911e7637d7e..9301c70524ae6aa0d96db1100c41cea490e716c3 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java
@@ -3,6 +3,9 @@ package fi.utu.tech.ooj.exercise3;
 import java.util.Set;
 import java.util.TreeSet;
 
+import java.util.Set;
+import java.util.TreeSet;
+
 abstract class Ajoneuvo {
 
     private String rekisteriNumero;
@@ -37,3 +40,4 @@ abstract class Ajoneuvo {
         return tmp;
     }
 }
+
diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java
index 13d735cebecb2492da4cdc2f967aed46ea347313..8122d9a222a7c0b41abf58079d90f3f298f60cd4 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java
@@ -1,5 +1,7 @@
 package fi.utu.tech.ooj.exercise3;
 
+import java.util.Objects;
+
 public class Kirja {
     private String kirjanNimi;
     private String kirjailijanNimi;
@@ -35,5 +37,35 @@ public class Kirja {
         this.julkaisuVuosi = julkaisuVuosi;
     }
 
+    public Kirja clone(){
+        return new Kirja(
+                kirjanNimi,
+                kirjailijanNimi,
+                julkaisuVuosi
+        );
+    }
+
+
+    @Override
+    public String toString() {
+        return "Kirja{" +
+                "kirjanNimi='" + kirjanNimi + '\'' +
+                ", kirjailijanNimi='" + kirjailijanNimi + '\'' +
+                ", julkaisuVuosi=" + julkaisuVuosi +
+                '}';
+    }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Kirja kirja = (Kirja) o;
+        return julkaisuVuosi == kirja.julkaisuVuosi && kirjanNimi.equals(kirja.kirjanNimi) && kirjailijanNimi.equals(kirja.kirjailijanNimi);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(kirjanNimi, kirjailijanNimi, julkaisuVuosi);
+    }
 }
+
diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java
index 285fd40c2145f3fa3ce10f18412afb657fe48f5e..1da0f5025e6f55dbf054dd36bc508e28e222cf17 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java
@@ -1,17 +1,16 @@
 package fi.utu.tech.ooj.exercise3;
 
-import java.io.PrintStream;
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Objects;
 
 public class KirjaKokoelma {
 
     private String kokoelmanNimi;
-    private  ArrayList<Kirja>kirjaListaus;
+    private  ArrayList<Kirja> kirjaListaus;
 
     public KirjaKokoelma(String kokoelmanNimi) {
         this.kokoelmanNimi = kokoelmanNimi;
-        this.kirjaListaus = new ArrayList<>();
+        kirjaListaus = new ArrayList<>();
     }
 
     public String getkokoelmanNimi() {
@@ -30,4 +29,36 @@ public class KirjaKokoelma {
         kirjaListaus.add(teos);
     }
 
+    public KirjaKokoelma clone(){
+        KirjaKokoelma output =  new KirjaKokoelma(
+                kokoelmanNimi
+        );
+
+        for(Kirja kirja : kirjaListaus){
+            output.lisaaKirja(kirja.clone());
+        }
+
+        return output;
+    }
+
+    @Override
+    public String toString() {
+        return "KirjaKokoelma{" +
+                "kokoelmanNimi='" + kokoelmanNimi + '\'' +
+                ", kirjaListaus=" + kirjaListaus.toString() +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        KirjaKokoelma that = (KirjaKokoelma) o;
+        return kokoelmanNimi.equals(that.kokoelmanNimi) && kirjaListaus.equals(that.kirjaListaus);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(kokoelmanNimi, kirjaListaus);
+    }
 }
diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java
index 2478ff6351648daef8b963f175230b13d1aa3569..2902377ca2455a55d1db14c2f368f3bd1d12e370 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java
@@ -1,12 +1,10 @@
 package fi.utu.tech.ooj.exercise3;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 public class Kirjasto {
 
+
     private String kirjastonNimi;
     private String osoite;
     private List<KirjaKokoelma> kokoelmat = new ArrayList<>();
@@ -57,5 +55,44 @@ public class Kirjasto {
         sivukirjastot.add(input);
     }
 
+    public Kirjasto clone(){
+        Kirjasto output = new Kirjasto(
+                kirjastonNimi,
+                osoite
+        );
+
+        for(Kirjasto kirjasto : sivukirjastot){
+            output.lisaaSivukirjasto(kirjasto.clone());
+        }
+
+        for(KirjaKokoelma kokoelma : kokoelmat){
+            output.lisaaKokoelma(kokoelma.clone());
+        }
+
+        return output;
+    }
 
+
+    @Override
+    public String toString() {
+        return "Kirjasto{" +
+                "kirjastonNimi='" + kirjastonNimi + '\'' +
+                ", osoite='" + osoite + '\'' +
+                ", kokoelmat=" + kokoelmat.toString() +
+                ", sivukirjastot=" + sivukirjastot.toString() +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Kirjasto kirjasto = (Kirjasto) o;
+        return kirjastonNimi.equals(kirjasto.kirjastonNimi) && osoite.equals(kirjasto.osoite) && kokoelmat.equals(kirjasto.kokoelmat) && sivukirjastot.equals(kirjasto.sivukirjastot);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(kirjastonNimi, osoite, kokoelmat, sivukirjastot);
+    }
 }
diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java b/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java
index 761f6b31ca9f278bd8236d6ccbc78b824f69d57c..e0e73a84119350791c5e4b36c11440fff3dba876 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java
@@ -2,8 +2,6 @@ package fi.utu.tech.ooj.exercise3;
 
 public class KuormaAuto extends Ajoneuvo{
     private int kantavuus;
-
-
     public KuormaAuto(String rekisteriNumero, String omistaja, int lasti) {
         super(rekisteriNumero, omistaja);
         this.kantavuus = lasti;
diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java
index 0c5fb2a608860ddf2225d92690eafd616fb4c96c..61e79b16205b8fba546539c3d87affcaa02cd8b4 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java
@@ -5,24 +5,51 @@ import java.util.HashMap;
 import java.util.HashSet;
 
 public class Main {
+    public static void main(String[] args) {
 
 
-    /**
-     * Main class.
-     *
-     * @param args Command line arguments
-     */
 
+        Kirja k1 = new Kirja(
+                "Kirja 1",
+                "kirjailija",
+                2020
+        );
 
-    public static void main(String[] args) {
-        /*
-         * Testin jälkeen alla olevan rivin voi joko kommentoida tai poistaa.
-         */
-        System.out.println("*** Harjoitustyöpohja käynnistyy ***");
+        Kirja k2 = new Kirja(
+                "Kirja 2",
+                "kirjailija",
+                2020
+        );
+
+        KirjaKokoelma kokoelma = new KirjaKokoelma(
+                "hyvät kirjat"
+        );
+
+
+        Kirjasto turunKirjasto = new Kirjasto(
+                "Turun pääkirjasto",
+                "Linnankatu 2"
+        );
+
+        Kirjasto turunKirjastoAuto = new Kirjasto(
+                "Turun kirjastoauto",
+                "vaihteleva"
+        );
+
+        Kirjasto salonKirjasto = new Kirjasto(
+                "Salon pääkirjasto",
+                "Keskusta"
+        );
+
+        kokoelma.lisaaKirja(k1);
+        kokoelma.lisaaKirja(k2);
+        turunKirjasto.lisaaKokoelma(kokoelma);
+        salonKirjasto.lisaaKokoelma(kokoelma);
+        turunKirjasto.lisaaSivukirjasto(salonKirjasto);
+        turunKirjasto.lisaaSivukirjasto(turunKirjastoAuto);
 
-        HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>();
-        HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>();
-        HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>();
 
+        System.out.println(turunKirjasto.equals(turunKirjasto.clone()));
+        System.out.print(turunKirjasto.toString());
     }
 }
diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava5.txt b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava5.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c0f4ead2d726b9dd6f14ae880106989ea5006529
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava5.txt
@@ -0,0 +1,26 @@
+A)
+
+Palautettu lista on tyyppiä "Set<Z>". Metodissa tyyppiparametri "Z" on rajoitettu niin, että se laajenee "Ajoneuvo"-luokan alatyypeiksi.
+Tämä tarkoittaa sitä, että kaikki "Ajoneuvo"-luokan alatyypit ovat yhteensopivia tyyppiin "Z". Näin ollen "Set<Ajoneuvo>", "Set<HenkiloAuto>" ja "Set<KuormaAuto>" ovat kaikki yhteensopivia.
+
+B)
+
+Henkilöautot ja kuorma-autot voidaan lisätä ajoneuvot-nimiseen listaan, koska ne perivät Ajoneuvo-luokan.
+Tämä on mahdollista, koska periytymisen ansiosta alatyypit ovat yhteensopivia ylätyypin kanssa.
+
+HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>();
+HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>();
+HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>();
+
+// Tämä ONNISTUU
+ajoneuvot.addAll(henkiloautot);
+ajoneuvot.addAll(kuormaautot);
+
+Kuitenkin, et voi sijoittaa henkiloautot-listaa suoraan ajoneuvot-muuttujaan, koska muuttujan ajoneuvot tyyppi ei ole määritelty polymorfisesti yläluokan Ajoneuvo kanssa.
+
+// Tätä EI voi tehdä
+ajoneuvot = henkiloautot;
+
+Jos haluat sijoittaa henkiloautot-listan viittauksen ajoneuvot-muuttujaan, sinun tulee määritellä ajoneuvot-muuttuja siten, että se hyväksyy tyyppirajoituksen.
+HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>();
+