diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5ff6309b7199129c1afe4f4ec1906e640bec48c6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aa00ffab7828f4818589659c804ec2cfd99baed3
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..82dbec8ad28463aed32007a93ffc07865ae98968
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7a633f8131a1c91c133b2bfdec811efdfb240dbf
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>fi.utu.alkall</groupId>
+    <artifactId>Olio</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>RELEASE</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>RELEASE</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <dependency>
+        <groupId>org.junit.jupiter</groupId>
+        <artifactId>junit-jupiter-api</artifactId>
+        <version>5.10.2</version>
+        <scope>test</scope>
+    </dependency>
+
+</project>
\ No newline at end of file
diff --git a/src/main/java/fi/utu/alkall/Main.java b/src/main/java/fi/utu/alkall/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5219e360928aac88a69b35588cc73b56dc004b6
--- /dev/null
+++ b/src/main/java/fi/utu/alkall/Main.java
@@ -0,0 +1,17 @@
+package fi.utu.alkall;
+
+//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
+// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
+public class Main {
+    public static void main(String[] args) {
+        //TIP Press <shortcut actionId="ShowIntentionActions"/> with your caret at the highlighted text
+        // to see how IntelliJ IDEA suggests fixing it.
+        System.out.printf("Hello and welcome!");
+
+        for (int i = 1; i <= 5; i++) {
+            //TIP Press <shortcut actionId="Debug"/> to start debugging your code. We have set one <icon src="AllIcons.Debugger.Db_set_breakpoint"/> breakpoint
+            // for you, but you can always add more by pressing <shortcut actionId="ToggleLineBreakpoint"/>.
+            System.out.println("i = " + i);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/fi/utu/alkall/kirjahylly/Kirjahylly.java b/src/main/java/fi/utu/alkall/kirjahylly/Kirjahylly.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f09fc85edb21528202dc29bedb9a46ba0f029bf
--- /dev/null
+++ b/src/main/java/fi/utu/alkall/kirjahylly/Kirjahylly.java
@@ -0,0 +1,63 @@
+package fi.utu.alkall.kirjahylly;
+
+import java.util.ArrayList;
+
+/**
+ * Luokka mallintaa yksinkertaista kirjahyllyä
+ */
+
+public class Kirjahylly {
+    private ArrayList<String> kirjat;
+
+    private int kirjojaHyllyssa = 0;
+
+    public Kirjahylly() {
+        kirjat = new ArrayList<>();
+        kirjojaHyllyssa = 0;
+    }
+
+
+    /**
+     * Lisää yhden kirjan hyllyyn
+     * @param kirja lisättävä kirja
+     */
+    public void lisaaKirja(String kirja) {
+        kirjat.add(kirja);
+    }
+
+    /**
+     * Palauttaa kirjahyllyyn viimeksi lisätyn kirjan
+     * @return viimeksi lisätyn kirjan
+     */
+    public String viimeksiLisatty() {
+        return kirjat.get(0);
+    }
+
+    /**
+     * Palauttaa tiedon siitä onko annettu kirja hyllyssä
+     * @param kirja kirja, jota etsitään
+     * @return <code>true</code>, jos kirjan on hyllyssä, muuten <code>false</code>
+     */
+    public boolean onkoKirjaHyllyssa(String kirja) {
+        for (String k : kirjat) {
+
+            if (k.equals(kirja)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Palautta kirjahyllyssä olevien kirjojen määrän
+     * @return kirjojen määrän hyllyssä
+     */
+
+
+    public int getKirjojaHyllyssa() {
+        return kirjat.size();
+    }
+
+}
diff --git a/src/test/java/fi/utu/alkall/kirjahylly/KirjahyllyTest.java b/src/test/java/fi/utu/alkall/kirjahylly/KirjahyllyTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef5f460186eb9824f2d842ef0d288aa2f24e62c6
--- /dev/null
+++ b/src/test/java/fi/utu/alkall/kirjahylly/KirjahyllyTest.java
@@ -0,0 +1,44 @@
+package fi.utu.alkall.kirjahylly;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+class KirjahyllyTest {
+
+    private Kirjahylly hylly;
+
+    @BeforeEach
+    void setUp() {
+        hylly = new Kirjahylly();
+    }
+
+    @Test
+    void lisaaKirja() {
+        hylly.lisaaKirja("Testikirja");
+        assertEquals(1, hylly.getKirjojaHyllyssa(), "Hyllyssä pitäisi olla yksi kirja lisäyksen jälkeen.");
+    }
+
+    @Test
+    void viimeksiLisatty() {
+        hylly.lisaaKirja("Ensimmäinen kirja");
+        hylly.lisaaKirja("Toinen kirja");
+        assertEquals("Toinen kirja", hylly.viimeksiLisatty(), "Viimeksi lisätyn kirjan pitäisi olla 'Toinen kirja'.");
+    }
+
+    @Test
+    void onkoKirjaHyllyssa() {
+        hylly.lisaaKirja("Kirja hyllyssä");
+        assertTrue(hylly.onkoKirjaHyllyssa("Kirja hyllyssä"), "Kirjan pitäisi löytyä hyllystä.");
+        assertFalse(hylly.onkoKirjaHyllyssa("Kirja ei hyllyssä"), "Kirjaa ei pitäisi löytyä hyllystä, koska sitä ei ole lisätty.");
+    }
+
+    @Test
+    void getKirjojaHyllyssa() {
+        assertEquals(0, hylly.getKirjojaHyllyssa(), "Alussa hyllyssä ei pitäisi olla kirjoja.");
+        hylly.lisaaKirja("Uusi Kirja");
+        assertEquals(1, hylly.getKirjojaHyllyssa(), "Hyllyssä pitäisi olla yksi kirja lisäyksen jälkeen.");
+        hylly.lisaaKirja("Toinen Uusi Kirja");
+        assertEquals(2, hylly.getKirjojaHyllyssa(), "Hyllyssä pitäisi olla kaksi kirjaa lisäysten jälkeen.");
+    }
+}