diff --git a/src/de/brickedleveleditor/game/levels/LevelPackWriter.java b/src/de/brickedleveleditor/game/levels/LevelPackWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..c242fcb78108e52798568fc509c67d9bdbd73e16
--- /dev/null
+++ b/src/de/brickedleveleditor/game/levels/LevelPackWriter.java
@@ -0,0 +1,52 @@
+package de.brickedleveleditor.game.levels;
+import de.bricked.game.bricks.Brick;
+import de.bricked.game.levels.Level;
+import de.bricked.game.paddle.PaddleSize;
+import de.bricked.game.powerups.PowerUp;
+
+
+import java.util.ArrayList;
+
+public class LevelPackWriter
+{
+    private ArrayList<Level> levels;
+
+    public LevelPackWriter()
+    {
+        levels = new ArrayList<>();
+    }
+
+    public void writePack()
+    {
+
+    }
+
+    private String getBoard(ArrayList<Brick> bricks)
+    {
+        StringBuilder builder = new StringBuilder();
+        for(Brick brick : bricks)
+        {
+            String brickName = brick.getType().getID();
+            String powerupName = "";
+            PowerUp powerUp = brick.getPowerUp();
+            if(powerUp == null)
+            {
+                powerupName = "0";
+            }
+            else
+            {
+                powerupName = String.valueOf(powerUp.getID());
+            }
+            builder.append(brickName + powerupName + " ");
+        }
+        builder.delete(builder.length()-1,builder.length());
+        System.out.println(builder.toString());
+        return builder.toString();
+    }
+
+    public void addLevel(String levelname, String author, int position, int difficulty, int startLives, PaddleSize paddleSize, ArrayList<Brick> bricks)
+    {
+        Level level = new Level(levelname, author, position, difficulty, startLives, paddleSize, getBoard(bricks));
+        levels.add(level);
+    }
+}
diff --git a/src/de/brickedleveleditor/main/Main.java b/src/de/brickedleveleditor/main/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..9eb6bc50cb093993b38fdc548d6785edda84b0f6
--- /dev/null
+++ b/src/de/brickedleveleditor/main/Main.java
@@ -0,0 +1,71 @@
+package de.brickedleveleditor.main;
+
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import de.brickedleveleditor.ui.Controller;
+import javafx.application.Application;
+import javafx.event.EventHandler;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
+import logger.LogLevel;
+import logger.Logger;
+import tools.Worker;
+
+public class Main extends Application
+{
+	public static final ResourceBundle bundle = ResourceBundle.getBundle("de/brickedleveleditor/main/", Locale.GERMANY);
+	
+	@Override
+	public void start(Stage stage)
+	{
+		try
+		{
+			FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/brickedleveleditor/ui/GUI.fxml"));
+			Parent root = (Parent)loader.load();
+
+			Scene scene = new Scene(root, 800, 600);		
+
+			((Controller)loader.getController()).init(stage);
+
+			stage.setTitle(bundle.getString("app.name"));
+			stage.setScene(scene);
+			stage.setResizable(true);
+
+			stage.setOnCloseRequest(new EventHandler<WindowEvent>()
+			{
+				public void handle(WindowEvent we)
+				{
+					Worker.shutdown();
+					System.exit(0);
+				}
+			});
+
+			stage.show();
+		}
+		catch(Exception e)
+		{
+			Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
+		}
+	}
+
+	public static void main(String[] args)
+	{
+		if(Arrays.asList(args).contains("debug"))
+		{
+			Logger.setLevel(LogLevel.ALL);
+			Logger.log(LogLevel.INFO, "Running in Debug Mode");
+			Logger.log(LogLevel.INFO, bundle.getString("app.name") + " - v" + bundle.getString("version.name") + " - (versioncode: " + bundle.getString("version.code") + ") from " + bundle.getString("version.date"));
+		}
+		else
+		{
+			Logger.setLevel(LogLevel.ERROR);
+		}	
+
+		launch(args);
+	}
+}
\ No newline at end of file
diff --git a/src/de/brickedleveleditor/main/_de.properties b/src/de/brickedleveleditor/main/_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5882f88395a5a5ffed32a3892767ab419021dc0b
--- /dev/null
+++ b/src/de/brickedleveleditor/main/_de.properties
@@ -0,0 +1,5 @@
+app.name=Bricked LevelEditor
+version.code=0
+version.name=0.0.0
+version.date=19.10.16
+author=Max Wittig, Robert Goldmann
\ No newline at end of file
diff --git a/src/de/brickedleveleditor/ui/BrickLabel.java b/src/de/brickedleveleditor/ui/BrickLabel.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ef1a69f4d00646837fbf88d47ee011dd63437b3
--- /dev/null
+++ b/src/de/brickedleveleditor/ui/BrickLabel.java
@@ -0,0 +1,52 @@
+package de.brickedleveleditor.ui;
+
+
+import de.bricked.game.bricks.BrickType;
+import de.bricked.game.powerups.PowerUpType;
+import javafx.scene.Node;
+import javafx.scene.control.Label;
+
+public class BrickLabel extends Label
+{
+    private BrickType brickType;
+    private PowerUpType powerUpType;
+
+    public BrickLabel()
+    {
+    }
+
+    public BrickLabel(BrickType brickType, PowerUpType powerUpType)
+    {
+        super(brickType.getID() + powerUpType.getId());
+        this.brickType = brickType;
+        this.powerUpType = powerUpType;
+
+    }
+
+    public BrickLabel(String text, Node graphic)
+    {
+        super(text, graphic);
+    }
+
+    public BrickType getBrickType()
+    {
+        return brickType;
+    }
+
+    public void setBrickType(BrickType brickType)
+    {
+        this.brickType = brickType;
+        setText(this.brickType.getID()+this.powerUpType.getId());
+    }
+
+    public PowerUpType getPowerUpType()
+    {
+        return powerUpType;
+    }
+
+    public void setPowerUpType(PowerUpType powerUpType)
+    {
+        this.powerUpType = powerUpType;
+        setText(this.brickType.getID()+this.powerUpType.getId());
+    }
+}
diff --git a/src/de/brickedleveleditor/ui/Controller.java b/src/de/brickedleveleditor/ui/Controller.java
new file mode 100644
index 0000000000000000000000000000000000000000..017e1e75cec90160fa51d3e5e4c540be64646333
--- /dev/null
+++ b/src/de/brickedleveleditor/ui/Controller.java
@@ -0,0 +1,275 @@
+package de.brickedleveleditor.ui;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import de.bricked.game.bricks.Brick;
+import de.bricked.game.bricks.BrickType;
+import de.bricked.game.powerups.PowerUpType;
+import de.brickedleveleditor.game.levels.LevelPackWriter;
+import de.bricked.game.paddle.PaddleSize;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Label;
+import javafx.scene.control.MenuItem;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.*;
+import javafx.scene.paint.Paint;
+import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
+import logger.LogLevel;
+import logger.Logger;
+import tools.Worker;
+
+public class Controller
+{
+    @FXML
+    private AnchorPane anchorPane;
+    @FXML
+    private VBox sidebarVBox;
+    @FXML
+    private GridPane gridPane;
+    @FXML private MenuItem saveMenuItem;
+    private BrickType[] brickTypes = BrickType.values();
+    private Image currentlySelectedBrickImage;
+    private Image currentlySelectedPowerupImage;
+    private final int WIDTH = 18;
+    private final int HEIGHT = 18;
+
+    public Stage stage;
+    public final ResourceBundle bundle = ResourceBundle.getBundle("de/brickedleveleditor/main/", Locale.GERMANY);
+    private HashMap<BrickType, Image> bricksTextures;
+    private ArrayList<Image> powerupTextures;
+    private LevelPackWriter levelPackWriter;
+
+    public void init(Stage stage)
+    {
+        powerupTextures = new ArrayList<>();
+        levelPackWriter = new LevelPackWriter();
+        gridPane.setMaxSize(50, 50);
+        this.stage = stage;
+        bricksTextures = new HashMap<>();
+        loadPowerupTextures();
+        addPowerupsToVBox();
+        loadBrickTextures();
+        addBricksToVBox();
+        fillGridPaneWithAirBricks();
+        currentlySelectedBrickImage = bricksTextures.get(BrickType.HARD);
+        currentlySelectedPowerupImage = powerupTextures.get(0);
+        stage.setOnCloseRequest(new EventHandler<WindowEvent>()
+        {
+            public void handle(WindowEvent event)
+            {
+                Worker.shutdown();
+                System.exit(0);
+            }
+        });
+
+        saveMenuItem.setOnAction(new EventHandler<ActionEvent>()
+        {
+            @Override
+            public void handle(ActionEvent event)
+            {
+                String levelName = "";
+                String author = "";
+                int position = 0;
+                int difficulty = 1;
+                int startLives = 1;
+                PaddleSize initPadSize = PaddleSize.EXTRA_LARGE;
+                levelPackWriter.addLevel(levelName, author, position, difficulty, startLives, initPadSize, getBrickArrayList());
+            }
+        });
+    }
+
+    private void loadPowerupTextures()
+    {
+        String fileExt = ".png";
+        String rootPath = "de/bricked/resources/textures/powerups/";
+        //powerup[0] means no powerup --> set to null
+        powerupTextures.add(null);
+        for (int i=1; i < PowerUpType.types.length; i++)
+        {
+            File powerupPath = new File(rootPath + PowerUpType.types[i].getId() + fileExt);
+            try
+            {
+                Image image = new Image(powerupPath.getPath());
+                powerupTextures.add(image);
+            }
+            catch (Exception e)
+            {
+                Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
+            }
+        }
+    }
+
+    private void loadBrickTextures()
+    {
+        String fileExt = ".png";
+        String rootPath = "de/bricked/resources/textures/bricks/";
+        for (BrickType brickType : brickTypes)
+        {
+            File brickPath = new File(rootPath + brickType.getTextureIDs()[0] + fileExt);
+            System.out.println(brickPath.getAbsolutePath());
+            try
+            {
+                Image image = new Image(brickPath.getPath());
+                bricksTextures.put(brickType, image);
+            }
+            catch (Exception e)
+            {
+                Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
+            }
+        }
+    }
+
+    private HashMap<Image, BrickType> getReversedBrickHashMap()
+    {
+        HashMap<Image, BrickType> reversedHashMap = new HashMap<Image, BrickType>();
+        for (BrickType key : bricksTextures.keySet())
+        {
+            reversedHashMap.put(bricksTextures.get(key), key);
+        }
+        return reversedHashMap;
+    }
+
+    public ArrayList<Brick> getBrickArrayList()
+    {
+        ArrayList<Brick> bricks = new ArrayList<>();
+        Object[] gridPaneChildren = gridPane.getChildren().toArray();
+        for(int i = 0; i < gridPaneChildren.length; i++)
+        {
+            if(gridPaneChildren[i] instanceof BrickLabel)
+            {
+                BrickLabel currentLabel = (BrickLabel)gridPaneChildren[i];
+                Brick brick = new Brick(currentLabel.getBrickType(),
+                        PowerUpType.getInstance(currentLabel.getPowerUpType()));
+                bricks.add(brick);
+            }
+        }
+        return bricks;
+    }
+
+    private void addBricksToVBox()
+    {
+        for (BrickType brickType : brickTypes)
+        {
+            Label brickLabel = new Label(brickType.toString());
+            brickLabel.setBackground(getBackGroundFromImage(bricksTextures.get(brickType)));
+            brickLabel.setOnMouseClicked(new EventHandler<MouseEvent>()
+            {
+                @Override
+                public void handle(MouseEvent event)
+                {
+                    currentlySelectedBrickImage = bricksTextures.get(brickType);
+                    Logger.log(LogLevel.DEBUG, brickType.toString() + " selected");
+                }
+            });
+            HBox brickHBox = new HBox(brickLabel);
+            sidebarVBox.getChildren().add(brickHBox);
+        }
+    }
+
+    private void addPowerupsToVBox()
+    {
+        for(int i=1; i < powerupTextures.size(); i++)
+        {
+            Image powerupImage = powerupTextures.get(i);
+            Label powerupLabel = new Label(PowerUpType.types[i].toString());
+            powerupLabel.setOnMouseClicked(new EventHandler<MouseEvent>()
+            {
+                @Override
+                public void handle(MouseEvent event)
+                {
+                    currentlySelectedPowerupImage = powerupImage;
+                }
+            });
+            powerupLabel.setBackground(getBackGroundFromImage(powerupTextures.get(i)));
+            HBox powerupHBox = new HBox(powerupLabel);
+            VBox.setMargin(sidebarVBox, new Insets(50, 10, 10, 10));
+            sidebarVBox.getChildren().add(powerupHBox);
+        }
+    }
+
+    private Background getBackGroundFromImage(Image image)
+    {
+        BackgroundImage backgroundImage = new BackgroundImage(image,
+                BackgroundRepeat.NO_REPEAT,BackgroundRepeat.NO_REPEAT,
+                BackgroundPosition.CENTER,BackgroundSize.DEFAULT);
+        Background background = new Background(backgroundImage);
+        return background;
+    }
+
+    private void initGrid()
+    {
+        gridPane.getColumnConstraints().clear();
+        double xPercentage = 1.0 / WIDTH;
+        for (int i = 0; i < WIDTH; i++)
+        {
+            ColumnConstraints c = new ColumnConstraints();
+            c.setPercentWidth(xPercentage * 100);
+            gridPane.getColumnConstraints().add(c);
+        }
+
+        gridPane.getRowConstraints().clear();
+        double yPercentage = 1.0 / HEIGHT;
+        for (int i = 0; i < HEIGHT; i++)
+        {
+            RowConstraints c = new RowConstraints();
+            c.setPercentHeight(yPercentage * 100);
+            gridPane.getRowConstraints().add(c);
+        }
+        gridPane.setGridLinesVisible(true);
+    }
+
+    private void fillGridPaneWithAirBricks()
+    {
+        initGrid();
+        for (int i = 0; i < WIDTH; i++)
+        {
+            for (int k = 0; k < HEIGHT; k++)
+            {
+                BrickType brickType = BrickType.AIR;
+                PowerUpType powerUpType = PowerUpType.NONE;
+                Image image = bricksTextures.get(brickType);
+                BrickLabel label = new BrickLabel(brickType, powerUpType);
+                label.setMinSize(30, 25);
+                label.setBackground(getBackGroundFromImage(image));
+                gridPane.add(label, k, i);
+                label.setAlignment(Pos.CENTER);
+                label.setTextFill(Paint.valueOf("black"));
+
+                label.setOnMouseClicked(new EventHandler<MouseEvent>()
+                {
+                    @Override
+                    public void handle(MouseEvent event)
+                    {
+                        label.setBackground(getBackGroundFromImage(currentlySelectedBrickImage));
+                        label.setPowerUpType(PowerUpType.values()[powerupTextures.indexOf(currentlySelectedPowerupImage)]);
+                        label.setBrickType(getReversedBrickHashMap().get(currentlySelectedBrickImage));
+                    }
+                });
+            }
+        }
+    }
+
+    public void about()
+    {
+        Alert alert = new Alert(AlertType.INFORMATION);
+        alert.setTitle("About " + bundle.getString("app.name"));
+        alert.setHeaderText(bundle.getString("app.name"));
+        alert.setContentText("Version:     " + bundle.getString("version.name") + "\r\nDate:         " + bundle.getString("version.date") + "\r\nAuthors:     " + bundle.getString("author") + "\r\n");
+        Stage dialogStage = (Stage) alert.getDialogPane().getScene().getWindow();
+        dialogStage.centerOnScreen();
+        alert.showAndWait();
+    }
+}
\ No newline at end of file
diff --git a/src/de/brickedleveleditor/ui/GUI.fxml b/src/de/brickedleveleditor/ui/GUI.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..23f129a13b8fad3dbf6a562d6aee370145a4e33a
--- /dev/null
+++ b/src/de/brickedleveleditor/ui/GUI.fxml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.scene.control.Menu?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.MenuItem?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.ColumnConstraints?>
+<?import javafx.scene.layout.GridPane?>
+<?import javafx.scene.layout.RowConstraints?>
+<?import javafx.scene.layout.VBox?>
+
+<AnchorPane fx:id="anchorPane" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.brickedleveleditor.ui.Controller">
+   <children>
+      <MenuBar layoutX="40.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
+        <menus>
+            <Menu mnemonicParsing="false" text="File">
+              <items>
+                <MenuItem fx:id="saveMenuItem" mnemonicParsing="false" text="Save" />
+                  <MenuItem mnemonicParsing="false" text="Unspecified Action" />
+              </items>
+            </Menu>
+          <Menu mnemonicParsing="false" text="Hilfe">
+            <items>
+              <MenuItem mnemonicParsing="false" onAction="#about" text="Über" />
+            </items>
+          </Menu>
+        </menus>
+      </MenuBar>
+      <VBox fx:id="sidebarVBox" alignment="CENTER" layoutX="614.0" layoutY="29.0" prefHeight="572.0" prefWidth="186.0" AnchorPane.bottomAnchor="-1.0" AnchorPane.topAnchor="29.0" />
+      <GridPane fx:id="gridPane" alignment="CENTER" gridLinesVisible="true" layoutX="14.0" layoutY="58.0" prefHeight="526.0" prefWidth="595.0" AnchorPane.bottomAnchor="16.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="191.0" AnchorPane.topAnchor="58.0">
+        <columnConstraints>
+          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+        </columnConstraints>
+        <rowConstraints>
+          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+        </rowConstraints>
+      </GridPane>
+   </children>
+</AnchorPane>