diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java b/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java
new file mode 100644
index 0000000000000000000000000000000000000000..9eea12e7ec543f930e618c9f34d360c724eeec58
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java
@@ -0,0 +1,71 @@
+package fi.utu.tech.ooj.exercise2;
+
+import java.util.ArrayList;
+
+public class Lasku {
+    private Asiakas asiakas;
+    private ArrayList<Laskurivi> rivit;
+
+    /**
+     * Konstruktori luo uuden laskun annetulla asiakkaalla ja tyhjillä laskuriveillä.
+     * 
+     * @param asiakas Laskun asiakas.
+     */
+    public Lasku(Asiakas asiakas) {
+        this.asiakas = asiakas;
+        this.rivit = new ArrayList<Laskurivi>();
+    }
+
+    /**
+     * Metodi lisää tuotteen laskun riville.
+     * 
+     * @param tuote Lisättävä tuote.
+     * @param maara Lisättävän tuotteen määrä.
+     */
+    public void lisaaTuote(Tuote tuote, int maara, double alennus) {
+        Laskurivi rivi = new Laskurivi(tuote, maara, alennus);
+        this.rivit.add(rivi);
+    }
+
+    /**
+     * Metodi poistaa tuotteen laskun riviltä.
+     * 
+     * @param rivi Poistettava laskurivi.
+     */
+    public void poistaRivi(Laskurivi rivi) {
+        this.rivit.remove(rivi);
+    }
+
+    /**
+     * Metodi palauttaa laskun kokonaishinnan.
+     * 
+     * @return Laskun kokonaishinta.
+     */
+    public double getKokonaishinta() {
+        double kokonaishinta = 0.0;
+
+        for (Laskurivi rivi : this.rivit) {
+            kokonaishinta += rivi.getRivihinta();
+        }
+
+        return kokonaishinta;
+    }
+
+    /**
+     * Metodi palauttaa laskun asiakkaan.
+     * 
+     * @return Laskun asiakas.
+     */
+    public Asiakas getAsiakas() {
+        return this.asiakas;
+    }
+
+    /**
+     * Metodi palauttaa laskun laskurivit.
+     * 
+     * @return Laskun laskurivit.
+     */
+    public ArrayList<Laskurivi> getRivit() {
+        return this.rivit;
+    }
+}
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java b/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a26dde01c577430a78361c73a54f914eb1e39e6
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java
@@ -0,0 +1,61 @@
+package fi.utu.tech.ooj.exercise2;
+
+/**
+ * Luokka kuvaa yksittäistä riviä laskussa.
+ */
+public class Laskurivi {
+    private Tuote tuote;
+    private int maara;
+    private double alennus;
+
+    /**
+     * Konstruktori luo uuden laskurivin.
+     * 
+     * @param tuote Laskurivin tuote.
+     * @param maara Laskurivin tuotteiden määrä.
+     * @param alennus Laskurivin tuotekohtainen alennus.
+     */
+    public Laskurivi(Tuote tuote, int maara, double alennus) {
+        this.tuote = tuote;
+        this.maara = maara;
+        this.alennus = alennus;
+    }
+
+    /**
+     * Metodi palauttaa laskurivin tuotteen.
+     * 
+     * @return Laskurivin tuote.
+     */
+    public Tuote getTuote() {
+        return this.tuote;
+    }
+
+    /**
+     * Metodi palauttaa laskurivin tuotteiden määrän.
+     * 
+     * @return Laskurivin tuotteiden määrä.
+     */
+    public int getMaara() {
+        return this.maara;
+    }
+
+    /**
+     * Metodi palauttaa laskurivin tuotekohtaisen alennuksen.
+     * 
+     * @return Laskurivin tuotekohtainen alennus.
+     */
+    public double getAlennus() {
+        return this.alennus;
+    }
+
+    /**
+     * Metodi palauttaa laskurivin rivihinnan.
+     * 
+     * @return Laskurivin rivihinta.
+     */
+    public double getRivihinta() {
+        double hinta = this.tuote.getHintaAlv() * this.maara;
+        hinta -= hinta * (this.alennus / 100.0);
+        return hinta;
+    }
+}
\ No newline at end of file