diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java b/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java
new file mode 100644
index 0000000000000000000000000000000000000000..470ad554d419cd507e77132c104907a35bc0e05f
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java
@@ -0,0 +1,109 @@
+package fi.utu.tech.ooj.exercise2;
+
+/**
+ * Tuote-luokka kuvaa Oy Jekku Ab:n myymää tuotetta.
+ * Luokka sisältää tuotteen nimen, normaalihinnan ja ALV-prosentin.
+ */
+public class Tuote {
+    private String nimi;
+    private double normaalihinta;
+    private double alvProsentti;
+
+    /**
+     * Konstruktori luo uuden Tuote-olion.
+     * 
+     * @param nimi Tuotteen nimi.
+     * @param normaalihinta Tuotteen normaalihinta.
+     * @param alvProsentti Tuotteen ALV-prosentti.
+     */
+    public Tuote(String nimi, double normaalihinta, double alvProsentti) {
+        this.nimi = nimi;
+        this.normaalihinta = normaalihinta;
+        this.alvProsentti = alvProsentti;
+    }
+
+    /**
+     * Metodi palauttaa tuotteen nimen.
+     * 
+     * @return Tuotteen nimi.
+     */
+    public String getNimi() {
+        return nimi;
+    }
+
+    /**
+    * Asettaa tuotteen nimen.
+    * Nimi ei saa olla null eikä tyhjä merkkijono.
+    *
+     * @param nimi Tuotteen nimi.
+    * @throws IllegalArgumentException jos nimi on null tai tyhjä merkkijono.
+    */
+    public void setNimi(String nimi) {
+        if (nimi == null || nimi.isEmpty()) {
+            throw new IllegalArgumentException("Tuotteen nimi ei voi olla null tai tyhjä merkkijono.");
+        }
+        this.nimi = nimi;
+    }
+
+    /**
+     * Metodi palauttaa tuotteen normaalihinnan.
+     * 
+     * @return Tuotteen normaalihinta.
+     */
+    public double getNormaalihinta() {
+        return normaalihinta;
+    }
+
+    /**
+    * Asettaa tuotteen normaalihinnan.
+    * Normaalihinta ei saa olla negatiivinen.
+    *
+    * @param normaalihinta Tuotteen normaalihinta.
+    * @throws IllegalArgumentException jos normaalihinta on negatiivinen.
+    */
+    public void setNormaalihinta(double normaalihinta) {
+        if (normaalihinta < 0) {
+            throw new IllegalArgumentException("Tuotteen normaalihinta ei voi olla negatiivinen.");
+        }
+        this.normaalihinta = normaalihinta;
+    }  
+
+    /**
+     * Metodi palauttaa tuotteen ALV-prosentin.
+     * 
+     * @return Tuotteen ALV-prosentti.
+     */
+    public double getAlvProsentti() {
+        return alvProsentti;
+    }
+
+    /**
+    * Asettaa tuotteen ALV-prosentin.
+    * ALV-prosentti ei saa olla negatiivinen.
+    *
+    * @param alvProsentti Tuotteen ALV-prosentti.
+    * @throws IllegalArgumentException jos alvProsentti on negatiivinen.
+    */
+    public void setAlvProsentti(double alvProsentti) {
+        if (alvProsentti < 0) {
+            throw new IllegalArgumentException("Tuotteen ALV-prosentti ei voi olla negatiivinen.");
+        }
+        this.alvProsentti = alvProsentti;
+    }
+    /**
+    * Metodi palauttaa tuotteen hinnan, johon on lisätty arvonlisäveron mukainen määrä.
+    * 
+    * @return Tuotteen hinta arvonlisäveron kanssa.
+    */
+    public double getHintaAlv() {
+        return normaalihinta * (1 + alvProsentti / 100);
+    }
+}
+
+/*
+ * Perustelut
+ * Tämä luokka on toteutettu pitämään yllä yksittäistä tuotetta ja sen tietoja, kuten nimeä, normaalihintaa ja ALV-prosenttia. 
+ * Setter-metodeilla varmistetaan, että asetetut arvot ovat kelvollisia ja getter-metodeilla voidaan palauttaa tallennetut tiedot.
+ * Konstruktori luo uuden Tuote-olion ja asettaa sille alkuarvot annettujen parametrien mukaan.
+ * Tämän toteutuksen ansiosta Tuote-luokka on helppo käyttää ja ylläpitää, ja siitä on hyötyä esimerkiksi kaupan kassajärjestelmässä, jossa tarvitaan tietoa yksittäisestä tuotteesta ja sen hinnoista.
+ */
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java b/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c7098286d0cf7fe0046b0bf73f32b40fd3adc04
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java
@@ -0,0 +1,89 @@
+package fi.utu.tech.ooj.exercise2;
+
+import java.util.ArrayList;
+
+public class Tuoteluettelo {
+    private ArrayList<Tuote> tuotteet;
+
+    /**
+     * Konstruktori luo uuden tyhjän tuoteluettelon.
+     */
+    public Tuoteluettelo() {
+        this.tuotteet = new ArrayList<Tuote>();
+    }
+
+    /**
+     * Metodi lisää tuotteen tuoteluetteloon.
+     * 
+     * @param tuote Lisättävä tuote.
+     */
+    public void lisaaTuote(Tuote tuote) {
+        this.tuotteet.add(tuote);
+    }
+
+    /**
+     * Metodi poistaa tuotteen tuoteluettelosta.
+     * 
+     * @param tuote Poistettava tuote.
+     */
+    public void poistaTuote(Tuote tuote) {
+        this.tuotteet.remove(tuote);
+    }
+
+    /**
+     * Metodi palauttaa tuoteluettelon tuotteiden lukumäärän.
+     * 
+     * @return Tuotteiden lukumäärä.
+     */
+    public int getTuotteidenLukumaara() {
+        return this.tuotteet.size();
+    }
+
+    /**
+     * Metodi palauttaa tuoteluettelon tuotteet.
+     * 
+     * @return Tuoteluettelon tuotteet.
+     */
+    public ArrayList<Tuote> getTuotteet() {
+        return this.tuotteet;
+    }
+
+    /**
+     * Metodi palauttaa tuoteluettelon tuotteiden yhteishinnan.
+     * 
+     * @return Tuotteiden yhteishinta.
+     */
+    public double getYhteishinta() {
+        double yhteishinta = 0.0;
+
+        for (Tuote tuote : this.tuotteet) {
+            yhteishinta += tuote.getHintaAlv();
+        }
+
+        return yhteishinta;
+    }
+    /**
+    * Etsii tuotteen Tuoteluettelosta nimen perusteella.
+    * 
+    * @param nimi Etsittävän tuotteen nimi.
+    * @return Löydetty Tuote-olio, tai null jos tuotetta ei löydy.
+    */
+    public Tuote haeTuote(String nimi) {
+        for (Tuote tuote : tuotteet) {
+            if (tuote.getNimi().equals(nimi)) {
+                return tuote;
+            }
+        }
+        return null;
+    }
+}
+
+/*
+ * Perustelu
+ * Luokan Tuoteluettelo tarkoitus on hallita joukkoa Tuote-olioita eli tuotteiden tietoja, kuten nimeä, hintaa ja varastosaldoa. Luokka tarjoaa metodit tuotteiden lisäämiseen, poistamiseen ja hakemiseen sekä laskemaan tuotteiden yhteishinnan.
+ * Tämä tekee Tuoteluettelosta kätevän työkalun esimerkiksi kaupan tuotevalikoiman hallinnassa.
+ * Perusteena ArrayListin käytölle Tuoteluettelo-luokassa on sen joustavuus.
+ * ArrayList on dynaaminen tietorakenne, joka mahdollistaa tuoteluettelon sisällön helpomman muokkaamisen, kuten tuotteiden lisäämisen ja poistamisen.
+ * ArrayList mahdollistaa myös helpomman iteroinnin ja käsittelemisen kuin perinteinen taulukko, joka vaatii etukäteen tiedon taulukon koon määrittelemisestä.
+ * 
+ */