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..65445d6b45657b0366fdc56add5d185a92964b43
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,76 @@
+<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>lab03</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<name>lab03</name>
+
+	<packaging>jar</packaging>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.release>21</maven.compiler.release>
+		<JavaFX.version>22-ea+16</JavaFX.version>
+		<JUnit.version>5.10.1</JUnit.version>
+		<log4j.version>2.22.1</log4j.version>
+		<lombok.version>1.18.30</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.openjfx</groupId>
+			<artifactId>javafx-controls</artifactId>
+			<version>${JavaFX.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.openjfx</groupId>
+			<artifactId>javafx-fxml</artifactId>
+			<version>${JavaFX.version}</version>
+		</dependency>
+		<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>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>3.2.1</version>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/src/main/java/cz/vsb/fei/java2/lab03/App.java b/src/main/java/cz/vsb/fei/java2/lab03/App.java
new file mode 100644
index 0000000000000000000000000000000000000000..d21c415cf98d866559467c3c36d7094ba1cde246
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab03/App.java
@@ -0,0 +1,52 @@
+package cz.vsb.fei.java2.lab03;
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Scene;
+import javafx.scene.layout.BorderPane;
+import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
+import lombok.extern.log4j.Log4j2;
+
+/**
+ *  Class <b>App</b> - extends class Application and it is an entry point of the program
+ * @author     Java I
+ */
+@Log4j2
+public class App extends Application {
+
+	public static void main(String[] args) {
+		log.info("Launching JavaFX application.");
+		launch(args);
+	}
+	
+	private AppController controller;
+
+	@Override
+	public void start(Stage primaryStage) {
+		try {
+			//Construct a main window with a canvas.  
+			
+			FXMLLoader loader = new FXMLLoader(this.getClass().getResource("AppWindow.fxml"));
+			
+			BorderPane root = loader.load();
+			
+			Scene scene = new Scene(root);
+			
+			
+			primaryStage.setScene(scene);
+			primaryStage.setTitle("Hello word app");
+			primaryStage.show();
+			controller = loader.getController();
+			
+			//Exit program when main window is closed
+			primaryStage.setOnCloseRequest(this::exitProgram);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void exitProgram(WindowEvent evt) {
+		System.exit(0);
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/cz/vsb/fei/java2/lab03/AppController.java b/src/main/java/cz/vsb/fei/java2/lab03/AppController.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b613391501a607dc2cbb64f3a24e0062fc16137
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab03/AppController.java
@@ -0,0 +1,20 @@
+package cz.vsb.fei.java2.lab03;
+
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.control.MenuItem;
+
+public class AppController {
+
+	@FXML
+	private Label infoLabel;
+
+	@FXML
+	private void menuPressed(ActionEvent event) {
+		if(event.getSource() instanceof MenuItem menuItem) {
+			infoLabel.setText("Selected menu: " + menuItem.getText());
+		}
+	}
+
+}
diff --git a/src/main/java/cz/vsb/fei/java2/lab03/ColorPoint.java b/src/main/java/cz/vsb/fei/java2/lab03/ColorPoint.java
new file mode 100644
index 0000000000000000000000000000000000000000..16722be7c127a830ba28d9e80be9ad1a13a2ec1d
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab03/ColorPoint.java
@@ -0,0 +1,14 @@
+package cz.vsb.fei.java2.lab03;
+
+import javafx.scene.paint.Color;
+
+public class ColorPoint extends Point {
+
+	private Color color;
+
+	public ColorPoint(double x, double y, Color color) {
+		super(x, y);
+		this.color = color;
+	}
+
+}
diff --git a/src/main/java/cz/vsb/fei/java2/lab03/NutritionFacts.java b/src/main/java/cz/vsb/fei/java2/lab03/NutritionFacts.java
new file mode 100644
index 0000000000000000000000000000000000000000..7752e368e6faa98dd80ec363ee187647edb4d322
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab03/NutritionFacts.java
@@ -0,0 +1,37 @@
+package cz.vsb.fei.java2.lab03;
+
+public class NutritionFacts {
+	private final int servingSize;// (mL)required
+	private final int servings;// (per container) required
+	private final int calories;// (per serving)optional
+	private final int fat;// (g/serving)optional
+	private final int sodium;// (mg/serving)optional
+	private final int carbohydrate; // (g/serving) optional
+
+	public NutritionFacts(int servingSize, int servings) {
+		this(servingSize, servings, 0);
+	}
+
+	public NutritionFacts(int servingSize, int servings, int calories) {
+		this(servingSize, servings, calories, 0);
+	}
+
+	public NutritionFacts(int servingSize, int servings, int calories, int fat) {
+		this(servingSize, servings, calories, fat, 0);
+	}
+
+	public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
+		this(servingSize, servings, calories, fat, sodium, 0);
+	}
+
+	public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
+		this.servingSize = servingSize;
+		this.servings = servings;
+		this.calories = calories;
+		this.fat = fat;
+		this.sodium = sodium;
+		this.carbohydrate = carbohydrate;
+	}
+}
+
+
diff --git a/src/main/java/cz/vsb/fei/java2/lab03/Point.java b/src/main/java/cz/vsb/fei/java2/lab03/Point.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc34fbc39a6d8595ffac0dd749a78ab7ecb26c44
--- /dev/null
+++ b/src/main/java/cz/vsb/fei/java2/lab03/Point.java
@@ -0,0 +1,14 @@
+package cz.vsb.fei.java2.lab03;
+
+public class Point {
+
+	private double x;
+
+	private double y;
+
+	public Point(double x, double y) {
+		this.x = x;
+		this.y = y;
+	}
+
+}
\ 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..5627ddda633302cd3f3fbb5c90e901d1cb8b3ec2
--- /dev/null
+++ b/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module cz.vsb.fei.java2.lab03 {
+    requires transitive javafx.controls;
+    requires javafx.fxml;
+	requires lombok;
+	requires org.apache.logging.log4j;
+    opens cz.vsb.fei.java2.lab03 to javafx.fxml;
+    exports cz.vsb.fei.java2.lab03;
+}
\ No newline at end of file
diff --git a/src/main/resources/cz/vsb/fei/java2/lab03/AppWindow.fxml b/src/main/resources/cz/vsb/fei/java2/lab03/AppWindow.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..6a81cb714392da4f95140ab76f55e0edcfc5e83c
--- /dev/null
+++ b/src/main/resources/cz/vsb/fei/java2/lab03/AppWindow.fxml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Copyright (c) 2015, 2019, Gluon and/or its affiliates.
+  All rights reserved. Use is subject to license terms.
+
+  This file is available and licensed under the following license:
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  - Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the distribution.
+  - Neither the name of Oracle Corporation nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.Menu?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.MenuItem?>
+<?import javafx.scene.control.SeparatorMenuItem?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.text.Font?>
+
+
+<BorderPane minHeight="400.0" minWidth="640.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.vsb.fei.java2.lab03.AppController">
+   <top>
+    <MenuBar BorderPane.alignment="CENTER">
+      <menus>
+        <Menu mnemonicParsing="false" text="File">
+          <items>
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="New" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Open…" />
+            <Menu mnemonicParsing="false" text="Open Recent" />
+            <SeparatorMenuItem mnemonicParsing="false" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Close" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Save" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Save As…" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Revert" />
+            <SeparatorMenuItem mnemonicParsing="false" onAction="#menuPressed" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Preferences…" />
+            <SeparatorMenuItem mnemonicParsing="false" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Quit" />
+          </items>
+        </Menu>
+        <Menu mnemonicParsing="false" text="Edit">
+          <items>
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Undo" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Redo" />
+            <SeparatorMenuItem mnemonicParsing="false" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Cut" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Copy" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Paste" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Delete" />
+            <SeparatorMenuItem mnemonicParsing="false" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Select All" />
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="Unselect All" />
+          </items>
+        </Menu>
+        <Menu mnemonicParsing="false" text="Help">
+          <items>
+            <MenuItem mnemonicParsing="false" onAction="#menuPressed" text="About MyHelloApp" />
+          </items>
+        </Menu>
+      </menus>
+    </MenuBar>
+   </top>
+   <center>
+  <Label fx:id="infoLabel" alignment="CENTER" style="&#10;" text="Drag components from Library here…" textAlignment="CENTER" textFill="#9f9f9f" wrapText="false" BorderPane.alignment="CENTER">
+    <font>
+      <Font size="18.0" />
+    </font>
+  </Label>
+   </center>
+</BorderPane>
diff --git a/src/main/resources/cz/vsb/fei/java2/lab03/application.css b/src/main/resources/cz/vsb/fei/java2/lab03/application.css
new file mode 100644
index 0000000000000000000000000000000000000000..83d6f3343843c65d5dfaf3fedb97b6494c19113d
--- /dev/null
+++ b/src/main/resources/cz/vsb/fei/java2/lab03/application.css
@@ -0,0 +1 @@
+/* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */
\ 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/java2/lab03/AppTest.java b/src/test/java/cz/vsb/fei/java2/lab03/AppTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c5b55442aaa2533bdec783ede49af509283f191
--- /dev/null
+++ b/src/test/java/cz/vsb/fei/java2/lab03/AppTest.java
@@ -0,0 +1,19 @@
+package cz.vsb.fei.java2.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);
+	}
+}