diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..7f69afd3afc7416f82c934795d8386cce4e5ed5e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+# Eclipse
+.classpath
+.project
+.settings/
+ 
+# Intellij
+.idea/
+*.iml
+*.iws
+ 
+# Mac
+.DS_Store
+ 
+# Maven
+log/
+target/
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..873b812d3715ab124ae35e8b3f859dd4be13d245
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,60 @@
+<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/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>cz.vsb.fei.java2</groupId>
+	<artifactId>lab01-text2asciiart</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<name>lab01-text2asciiart</name>
+
+	<packaging>jar</packaging>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.release>21</maven.compiler.release>
+		<JUnit.version>5.10.1</JUnit.version>
+	</properties>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.junit</groupId>
+				<artifactId>junit-bom</artifactId>
+				<version>${JUnit.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<dependencies>
+		<!-- https://mvnrepository.com/artifact/io.leego/banana -->
+		<dependency>
+			<groupId>io.leego</groupId>
+			<artifactId>banana</artifactId>
+			<version>2.1.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest</artifactId>
+			<version>2.2</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>3.2.1</version>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/src/main/java/cz/vsb/fei/java2/lab01text2asciiart/ConversionException.java b/src/main/java/cz/vsb/fei/java2/lab01text2asciiart/ConversionException.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9d9bc1bd43df9c09e422dab9ded841cac90fb8d
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab01text2asciiart/ConversionException.java
@@ -0,0 +1,11 @@
+package cz.vsb.fei.java2.lab01text2asciiart;
+
+public class ConversionException extends Exception {
+
+	private static final long serialVersionUID = 195515812503598135L;
+
+	public ConversionException(String message) {
+		super(message);
+	}
+
+}
diff --git a/src/main/java/cz/vsb/fei/java2/lab01text2asciiart/Text2AsciiArt.java b/src/main/java/cz/vsb/fei/java2/lab01text2asciiart/Text2AsciiArt.java
new file mode 100644
index 0000000000000000000000000000000000000000..7536e5f5d80c92963178d857d870968345ff7566
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab01text2asciiart/Text2AsciiArt.java
@@ -0,0 +1,34 @@
+package cz.vsb.fei.java2.lab01text2asciiart;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import io.leego.banana.BananaUtils;
+import io.leego.banana.Font;
+
+/**
+ * Class <b>App</b> - extends class Application and it is an entry point of the
+ * program
+ * 
+ * @author Java I
+ */
+public class Text2AsciiArt {
+
+	public String convert(String text) throws ConversionException {
+		return convert(text, Font.STANDARD.getName());
+	}
+
+	public String convert(String text, String fontName) throws ConversionException {
+		Optional<Font> selectedFont = Font.values().stream().filter(font -> Objects.equals(font.getName(), fontName))
+				.findAny();
+		if (selectedFont.isEmpty()) {
+			throw new ConversionException("Uknown font name: " + fontName);
+		}
+		return BananaUtils.bananaify(text, selectedFont.get());
+	}
+
+	public List<String> getAllfontNames() {
+		return Font.values().stream().map(Font::getName).toList();
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff366e99a4e7f4e58b04300fa7f631abd3b27b10
--- /dev/null
+++ b/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module cz.vsb.fei.java2.lab01text2asciiart {
+	requires banana;
+}
\ No newline at end of file
diff --git a/src/test/java/cz/vsb/fei/java2/jez04best/AppTest.java b/src/test/java/cz/vsb/fei/java2/jez04best/AppTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef9c8eb8a77a59f12069857a96dda846a4462310
--- /dev/null
+++ b/src/test/java/cz/vsb/fei/java2/jez04best/AppTest.java
@@ -0,0 +1,19 @@
+package cz.vsb.fei.java2.jez04best;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit test for simple App.
+ */
+class AppTest {
+
+	/**
+	 * Rigorous Test :-)
+	 */
+	@Test
+	void shouldAnswerWithTrue() {
+		assertTrue(true);
+	}
+}
diff --git a/src/test/java/cz/vsb/fei/java2/lab01text2asciiart/Text2AsciiArtTest.java b/src/test/java/cz/vsb/fei/java2/lab01text2asciiart/Text2AsciiArtTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d34bfa437a60d6880d0bbd147d7ac2860ff429b2
--- /dev/null
+++ b/src/test/java/cz/vsb/fei/java2/lab01text2asciiart/Text2AsciiArtTest.java
@@ -0,0 +1,48 @@
+package cz.vsb.fei.java2.lab01text2asciiart;
+
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.emptyOrNullString;
+import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.List;
+
+import org.hamcrest.MatcherAssert;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import io.leego.banana.Font;
+
+class Text2AsciiArtTest {
+
+	Text2AsciiArt text2AsciiArt;
+
+	@BeforeEach
+	void init() {
+		text2AsciiArt = new Text2AsciiArt();
+	}
+
+	@Test
+	void testConvertText() throws ConversionException {
+		MatcherAssert.assertThat(text2AsciiArt.convert("TEST"), not(emptyOrNullString()));
+	}
+
+	@Test
+	void testConvertTextAndFont() throws ConversionException {
+			MatcherAssert.assertThat(text2AsciiArt.convert("TEST", "ANSI Shadow"), not(emptyOrNullString()));
+		}
+
+	@Test
+	void testConvertTextUknownFont(){
+			assertThrows(ConversionException.class, () -> text2AsciiArt.convert("TEST", "uknown font"));
+		}
+
+	@Test
+	void testGetAllfontNames() {
+		List<String> result = text2AsciiArt.getAllfontNames();
+		MatcherAssert.assertThat(result, not(empty()));
+		assertTrue(result.contains(Font.STANDARD.getName()));
+	}
+
+}