diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..98b99a551e28559528e090cbfc676dcff9bd7def
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+# Eclipse
+.classpath
+.project
+.settings/
+ 
+# Intellij
+.idea/
+*.iml
+*.iws
+ 
+# Mac
+.DS_Store
+ 
+# Maven
+log/
+target/
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dbb5b78c935181452519a4755237d89d6d951252
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,79 @@
+<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.efrei</groupId>
+	<artifactId>efrei-lab03</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<name>efrei-lab03</name>
+
+	<packaging>jar</packaging>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.release>21</maven.compiler.release>
+		<JUnit.version>5.11.0</JUnit.version>
+		<log4j.version>2.23.1</log4j.version>
+		<lombok.version>1.18.34</lombok.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>
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>${log4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-api</artifactId>
+			<version>${log4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>${lombok.version}</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.13.0</version>
+				<configuration>
+					<annotationProcessorPaths>
+						<path>
+							<groupId>org.projectlombok</groupId>
+							<artifactId>lombok</artifactId>
+							<version>${lombok.version}</version>
+						</path>
+					</annotationProcessorPaths>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>3.5.0</version>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/src/main/java/cz/vsb/fei/efrei/lab03/AlreadyDeadException.java b/src/main/java/cz/vsb/fei/efrei/lab03/AlreadyDeadException.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd46d7aeebcd7019df8c670885c8f65a50b32195
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/efrei/lab03/AlreadyDeadException.java
@@ -0,0 +1,22 @@
+package cz.vsb.fei.efrei.lab03;
+
+public class AlreadyDeadException extends Exception {
+
+	private static final long serialVersionUID = -7052667091386255519L;
+
+	private Fighter fighter;
+
+	public AlreadyDeadException(Fighter fighter) {
+		this.fighter = fighter;
+	}
+
+	public Fighter getFighter() {
+		return fighter;
+	}
+
+	
+	
+	
+	
+	
+}
diff --git a/src/main/java/cz/vsb/fei/efrei/lab03/DangerWorld.java b/src/main/java/cz/vsb/fei/efrei/lab03/DangerWorld.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ed784a1c675e56e0de06b2c5d29819043c9fea7
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/efrei/lab03/DangerWorld.java
@@ -0,0 +1,41 @@
+package cz.vsb.fei.efrei.lab03;
+
+import java.util.Random;
+import java.util.Scanner;
+
+public class DangerWorld {
+	private static final Random RANDOM = new Random();
+
+	public static void main(String[] args) {
+		Fighter[] fighters = new Fighter[6];
+		try (Scanner s = new Scanner(System.in)) {
+			System.out.println("Type name of monster:");
+			String name = s.next();
+
+			Monster monster = new Monster(name);
+			fighters[0] = monster;
+			fighters[1] = new Monster("King");
+			fighters[2] = new Monster("Queen");
+			fighters[3] = new Monster("Fairy");
+			fighters[4] = new Hero("Shrek");
+			fighters[5] = new Hero("Cinderela");
+
+			int rounds = 100;
+
+			for (int i = 0; i < rounds; i++) {
+				Fighter fighter1 = fighters[RANDOM.nextInt(6)];
+				Fighter fighter2 = fighters[RANDOM.nextInt(6)];
+				try {
+					fighter1.attackedBy(fighter2);
+				} catch (AlreadyDeadException e) {
+					System.out.println(
+							"Ups! Fighter " 
+					+ fighter2.getName()
+					+ " attack already dead "
+					+ fighter1.getName());
+				}
+			}
+		}
+
+	}
+}
diff --git a/src/main/java/cz/vsb/fei/efrei/lab03/Fighter.java b/src/main/java/cz/vsb/fei/efrei/lab03/Fighter.java
new file mode 100644
index 0000000000000000000000000000000000000000..442d9c99fb302fe030ccf31cc4f4d5435df5f5d1
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/efrei/lab03/Fighter.java
@@ -0,0 +1,17 @@
+package cz.vsb.fei.efrei.lab03;
+
+public interface Fighter {
+
+	int getLives();
+
+	public default boolean isAlive() {
+		return getLives() > 0;
+	}
+
+	public void attackedBy(Fighter fighter) throws AlreadyDeadException;
+
+	public String getName();
+
+	public int getStrenght();
+
+}
diff --git a/src/main/java/cz/vsb/fei/efrei/lab03/Hero.java b/src/main/java/cz/vsb/fei/efrei/lab03/Hero.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0d09a385733d7a9cc1fdf5182e57d5b76fd3e73
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/efrei/lab03/Hero.java
@@ -0,0 +1,62 @@
+package cz.vsb.fei.efrei.lab03;
+
+import java.util.Random;
+
+public class Hero implements Fighter{
+
+	private static final Random RANDOM = new Random();
+
+	private String name;
+	private int strenght;
+	private int lives;
+
+	public Hero(String name, int strenght) {
+		if(name == null || name.length() < 2 ||
+				strenght < 30) {
+			throw new IllegalArgumentException(
+					"Sorry wrong arguments!!");
+		}
+		this.name = name;
+		this.strenght = strenght;
+		this.lives = 100;
+	}
+
+	public Hero(String name) {
+		this(name, RANDOM.nextInt(50) + 50);
+	}
+
+	@Override
+	public void attackedBy(Fighter fighter) 
+			throws AlreadyDeadException {
+		if(!isAlive()) {
+			throw new AlreadyDeadException(this);
+		}
+		System.out.println(fighter.getName() + " attack " + getName() + "!");
+		if (RANDOM.nextBoolean()) {
+			System.out.println("Attack was blocked!! Ha. Ha. Ha.");
+			return;
+		}
+		lives -= fighter.getStrenght();
+	}
+
+	@Override
+	public String getName() {
+		return name;
+	}
+
+	@Override
+	public int getStrenght() {
+		return strenght;
+	}
+
+	@Override
+	public int getLives() {
+		return lives;
+	}
+
+	@Override
+	public String toString() {
+		return "Hero " + name + "(" + strenght + ") - has " + lives + " lives.";
+	}
+
+}
diff --git a/src/main/java/cz/vsb/fei/efrei/lab03/Monster.java b/src/main/java/cz/vsb/fei/efrei/lab03/Monster.java
new file mode 100644
index 0000000000000000000000000000000000000000..2817aa6e635985ade1186257835fd257ce038d1c
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/efrei/lab03/Monster.java
@@ -0,0 +1,57 @@
+package cz.vsb.fei.efrei.lab03;
+
+import java.util.Random;
+
+public class Monster implements Fighter {
+
+	private static final Random RANDOM = new Random();
+
+	private String name;
+	private final int strenght;
+	private int lives;
+
+	public Monster(String name, int strenght) {
+		if(name == null || name.length() < 2 ) {
+			throw new IllegalArgumentException(
+					"Too short name");
+		}
+		if(strenght < 10) {
+			throw new IllegalArgumentException(
+					"Monster is too weak!!");
+		}
+		this.name = name;
+		this.strenght = strenght;
+		this.lives = 100;
+	}
+
+	public Monster(String name) {
+		this(name, RANDOM.nextInt(90) + 10);
+	}
+
+	@Override
+	public void attackedBy(Fighter fighter) {
+		System.out.println(fighter.getName() + " attack " + getName() + "!");
+		lives -= fighter.getStrenght();
+	}
+	
+	@Override
+	public String getName() {
+		return name;
+	}
+
+	@Override
+	public int getStrenght() {
+		return strenght;
+	}
+
+	@Override
+	public int getLives() {
+		return lives;
+	}
+
+	@Override
+	public String toString() {
+		return "Monster " + name + "(" + strenght + ") - has " + lives + " lives.";
+	}
+
+}
diff --git a/src/main/java/cz/vsb/fei/efrei/lab03/Utils.java b/src/main/java/cz/vsb/fei/efrei/lab03/Utils.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f2ba2e743f350594a917d3e66493fc989e4a0e1
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/efrei/lab03/Utils.java
@@ -0,0 +1,27 @@
+package cz.vsb.fei.efrei.lab03;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+public class Utils {
+
+	public static final Random RANDOM = new Random();
+	private static List<String> heroNames = Arrays.asList("Captain Freedom", "Iron Blade", "Shadow Hunter",
+			"Silver Hawk", "Mighty Thunder", "Lunar Knight", "Phoenix Blaze", "Stormbreaker", "Star Guardian",
+			"Solar Sentinel", "Dark Raven", "Blaze Falcon", "Crystal Viper", "Lightning Strike", "Firestorm",
+			"Eagle Eye", "Nightshade", "Frostbite", "Wind Whisperer", "Shadow Blaze");
+
+	private static List<String> monsterNames = Arrays.asList("Nightmare Reaper", "Shadow Fiend", "Bonecrusher",
+			"Venomous Hydra", "Doomfang", "Blightbringer", "Void Stalker", "Inferno Drake", "Ghoul King", "Frost Wyrm",
+			"Terrorclaw", "Bloodfeast", "Ravenous Maw", "Storm Serpent", "Hellhound", "Dark Overlord", "Necroshade",
+			"Plaguebeast", "Stone Golem", "Fire Leviathan");
+
+	public String generateHeroName() {
+		return heroNames.get(RANDOM.nextInt(heroNames.size()));
+	}
+	public String generateMonsterName() {
+		return monsterNames.get(RANDOM.nextInt(monsterNames.size()));
+	}
+	
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2940ec7b8de73d7e773eaa9d5f3265fab823321
--- /dev/null
+++ b/src/main/java/module-info.java
@@ -0,0 +1,4 @@
+module cz.vsb.fei.efrei.lab03 {
+	requires static lombok;
+	requires org.apache.logging.log4j;
+}
\ No newline at end of file
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..acb3514078f6fb73f4f09ffd7a172b47f184e961
--- /dev/null
+++ b/src/main/resources/log4j2.xml
@@ -0,0 +1,13 @@
+<Configuration>
+	<Appenders>
+		<Console name="Console">
+			<PatternLayout
+				pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
+		</Console>
+	</Appenders>
+	<Loggers>
+		<Root level="info">
+			<AppenderRef ref="Console"></AppenderRef>
+		</Root>
+	</Loggers>
+</Configuration>
diff --git a/src/test/java/cz/vsb/fei/efrei/lab03/AppTest.java b/src/test/java/cz/vsb/fei/efrei/lab03/AppTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a873db31b1484b731c74ffca71133e8243e8511
--- /dev/null
+++ b/src/test/java/cz/vsb/fei/efrei/lab03/AppTest.java
@@ -0,0 +1,19 @@
+package cz.vsb.fei.efrei.lab03;
+
+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);
+	}
+}