diff --git a/.gitmodules b/.gitmodules
index 94b4bd3..4ed421c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -13,3 +13,6 @@
 [submodule "src/CrawlTestLvl/CrawlTestLvlAssets"]
 	path = src/CrawlTestLvl/CrawlTestLvlAssets
 	url = ssh://web@quasarapp.ddns.net:2022/QuasarApp/CrawlTestLvlAssets.git
+[submodule "src/CrawlAbstractLvl/CrawlAbstractLevelAssets"]
+	path = src/CrawlAbstractLvl/CrawlAbstractLevelAssets
+	url = ssh://web@quasarapp.ddns.net:2022/QuasarApp/CrawlAbstractLevelAssets.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 13e1f03..8d2882e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -65,6 +65,7 @@ add_subdirectory(submodules/ViewSolutions)
 
 add_subdirectory(src/Core)
 add_subdirectory(src/CrawlTestLvl)
+add_subdirectory(src/CrawlAbstractLvl)
 
 add_subdirectory(src/Client)
 
diff --git a/src/Client/CMakeLists.txt b/src/Client/CMakeLists.txt
index 5842a7b..5cd5c87 100644
--- a/src/Client/CMakeLists.txt
+++ b/src/Client/CMakeLists.txt
@@ -26,7 +26,7 @@ else()
     add_executable(${CURRENT_PROJECT} ${SOURCE_CPP})
 endif()
 
-target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Core TestLvl)
+target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Core TestLvl AbstractLvl)
 
 target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR})
 target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR})
@@ -37,6 +37,7 @@ file(MAKE_DIRECTORY ${TARGET_DIR})
 if (ANDROID)
     set(SNAKE_EXTRA_LIBS "${PROJECT_NAME}Core"
                          TestLvl
+                         AbstractLvl
                          QuasarApp
                          QmlNotyfyService
                          ViewSolutions)
diff --git a/src/Client/languages/de.ts b/src/Client/languages/de.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/de.ts
+++ b/src/Client/languages/de.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/en.ts b/src/Client/languages/en.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/en.ts
+++ b/src/Client/languages/en.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/es.ts b/src/Client/languages/es.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/es.ts
+++ b/src/Client/languages/es.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/fr.ts b/src/Client/languages/fr.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/fr.ts
+++ b/src/Client/languages/fr.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/ja.ts b/src/Client/languages/ja.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/ja.ts
+++ b/src/Client/languages/ja.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/pl.ts b/src/Client/languages/pl.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/pl.ts
+++ b/src/Client/languages/pl.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/ru.ts b/src/Client/languages/ru.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/ru.ts
+++ b/src/Client/languages/ru.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/tr.ts b/src/Client/languages/tr.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/tr.ts
+++ b/src/Client/languages/tr.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/uk.ts b/src/Client/languages/uk.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/uk.ts
+++ b/src/Client/languages/uk.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/languages/zh.ts b/src/Client/languages/zh.ts
index 0dfb53c..44a58e8 100644
--- a/src/Client/languages/zh.ts
+++ b/src/Client/languages/zh.ts
@@ -1,6 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1">
+<context>
+    <name>AbsLvlWorld</name>
+    <message>
+        <source>This a abstract lvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AbstractLvl</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Crawl</name>
     <message>
diff --git a/src/Client/main.cpp b/src/Client/main.cpp
index 3a9bb69..759e784 100644
--- a/src/Client/main.cpp
+++ b/src/Client/main.cpp
@@ -10,6 +10,7 @@
 #include <QQmlContext>
 #include <Crawl/clientapp.h>
 #include <testlvl.h>
+#include <abstractlvl.h>
 #include <quasarapp.h>
 
 void initLang() {
@@ -38,6 +39,7 @@ int main(int argc, char *argv[])
     CRAWL::ClientApp client;
 
     client.registerLevel<TestLvl>();
+    client.registerLevel<AbstractLvl>();
 
     if (!client.init(&engine)) {
         return 1;
diff --git a/src/CrawlAbstractLvl/AbsLvlControl.qml b/src/CrawlAbstractLvl/AbsLvlControl.qml
new file mode 100644
index 0000000..7102bb5
--- /dev/null
+++ b/src/CrawlAbstractLvl/AbsLvlControl.qml
@@ -0,0 +1,14 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+import QtQuick 2.15
+import CrawlModule 1.0
+import QtQuick.Layouts 1.15
+
+DefaultMenu {
+
+}
diff --git a/src/CrawlAbstractLvl/AbstractLvl.qrc b/src/CrawlAbstractLvl/AbstractLvl.qrc
new file mode 100644
index 0000000..3f90034
--- /dev/null
+++ b/src/CrawlAbstractLvl/AbstractLvl.qrc
@@ -0,0 +1,5 @@
+<RCC>
+    <qresource prefix="/qml">
+        <file>AbsLvlControl.qml</file>
+    </qresource>
+</RCC>
diff --git a/src/CrawlAbstractLvl/CMakeLists.txt b/src/CrawlAbstractLvl/CMakeLists.txt
new file mode 100644
index 0000000..d9bff71
--- /dev/null
+++ b/src/CrawlAbstractLvl/CMakeLists.txt
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2020-2021 QuasarApp.
+# Distributed under the lgplv3 software license, see the accompanying
+# Everyone is permitted to copy and distribute verbatim copies
+# of this license document, but changing it is not allowed.
+#
+
+cmake_minimum_required(VERSION 3.14)
+set(CURRENT_PROJECT "AbstractLvl")
+
+add_definitions(-DCRAWL_ABSTRACT_LEVEL_LIBRARY)
+
+
+file(GLOB SOURCE_CPP
+    "*.cpp"
+     "private/*.cpp"
+     "*.qrc"
+     "private/*.qrc"
+     "CrawlAbstractLevelAssets/*.qrc"
+)
+
+set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/private")
+
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../Client/modules)
+
+add_library(${CURRENT_PROJECT} ${SOURCE_CPP} ${SOURCE_QRC})
+
+target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Core)
+
+target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR})
+target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR})
+
diff --git a/src/CrawlAbstractLvl/CrawlAbstractLevelAssets b/src/CrawlAbstractLvl/CrawlAbstractLevelAssets
new file mode 160000
index 0000000..07295d0
--- /dev/null
+++ b/src/CrawlAbstractLvl/CrawlAbstractLevelAssets
@@ -0,0 +1 @@
+Subproject commit 07295d0e4ea37e7e17b1eca717b6ab6d1f5c8c60
diff --git a/src/CrawlAbstractLvl/README.md b/src/CrawlAbstractLvl/README.md
new file mode 100644
index 0000000..3dc83f7
--- /dev/null
+++ b/src/CrawlAbstractLvl/README.md
@@ -0,0 +1,13 @@
+# Crawl Abstract lvl
+
+
+# ![CRAWL_BANNER](res/Abstract.jpg)
+
+This level is a tutorial in which you are offered to pass a short level during which tooltips will be shown:
+* How to control a snake.
+* How to interact with game objects.
+
+There are 3 types of objects in the level:
+* Repulsive (blue) will push the snake side away from itself, just like the edges of the card.
+* Destructive (red) destroys the snake.
+* Buff (green) whose function is that it removes all obstacles visible on the screen.
\ No newline at end of file
diff --git a/src/CrawlAbstractLvl/abstractlvl.cpp b/src/CrawlAbstractLvl/abstractlvl.cpp
new file mode 100644
index 0000000..69b9ff7
--- /dev/null
+++ b/src/CrawlAbstractLvl/abstractlvl.cpp
@@ -0,0 +1,18 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "abstractlvl.h"
+#include "abslvlworld.h"
+
+AbstractLvl::AbstractLvl() {
+
+}
+
+CRAWL::IWorld *AbstractLvl::world() {
+    initAbstractLvlResources();
+    return new AbsLvlWorld();
+}
diff --git a/src/CrawlAbstractLvl/abstractlvl.h b/src/CrawlAbstractLvl/abstractlvl.h
new file mode 100644
index 0000000..4c4d527
--- /dev/null
+++ b/src/CrawlAbstractLvl/abstractlvl.h
@@ -0,0 +1,28 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef ABSTRACTLVL_H
+#define ABSTRACTLVL_H
+
+#include <Crawl/ilevel.h>
+#include "abstractlvl_global.h"
+
+inline void initAbstractLvlResources() { Q_INIT_RESOURCE(AbstractLvl);
+                                         Q_INIT_RESOURCE(absLvlRes);}
+/**
+ * @brief The AbstractLvl class This is test lvlv wraper of the crawl
+ */
+class CRAWL_ABSTRACT_LEVEL_EXPORT AbstractLvl: public CRAWL::ILevel {
+public:
+    AbstractLvl();
+
+    // ILevel interface
+public:
+    CRAWL::IWorld *world() override;
+};
+
+#endif // ABSTRACTLVL_H
diff --git a/src/CrawlAbstractLvl/abstractlvl_global.h b/src/CrawlAbstractLvl/abstractlvl_global.h
new file mode 100644
index 0000000..173d722
--- /dev/null
+++ b/src/CrawlAbstractLvl/abstractlvl_global.h
@@ -0,0 +1,12 @@
+#ifndef Crawl_ABSTRACT_LEVEL_GLOBAL_H
+#define Crawl_ABSTRACT_LEVEL_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(CRAWL_ABSTRACT_LEVEL_LIBRARY)
+#  define CRAWL_ABSTRACT_LEVEL_EXPORT Q_DECL_EXPORT
+#else
+#  define CRAWL_ABSTRACT_LEVEL_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // Crawl_ABSTRACT_LEVEL_GLOBAL_H
diff --git a/src/CrawlAbstractLvl/private/abslvlcontrol.cpp b/src/CrawlAbstractLvl/private/abslvlcontrol.cpp
new file mode 100644
index 0000000..5f515a2
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlcontrol.cpp
@@ -0,0 +1,16 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "abslvlcontrol.h"
+
+AbsLvlControl::AbsLvlControl() {
+
+}
+
+QString AbsLvlControl::initQmlView() const {
+    return "qrc:/qml/AbsLvlControl.qml";
+}
diff --git a/src/CrawlAbstractLvl/private/abslvlcontrol.h b/src/CrawlAbstractLvl/private/abslvlcontrol.h
new file mode 100644
index 0000000..d44236a
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlcontrol.h
@@ -0,0 +1,24 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef ABSLVLCONTROL_H
+#define ABSLVLCONTROL_H
+#include "Crawl/defaultcontrol.h"
+
+/**
+ * @brief The AbsLvlControl class This controll support custom camera-ratation functions.
+ */
+class AbsLvlControl: public CRAWL::DefaultControl
+{
+    Q_OBJECT
+public:
+    AbsLvlControl();
+    QString initQmlView() const override;
+
+};
+
+#endif // ABSLVLCONTROL_H
diff --git a/src/CrawlAbstractLvl/private/abslvlsnake.cpp b/src/CrawlAbstractLvl/private/abslvlsnake.cpp
new file mode 100644
index 0000000..bdd5c67
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlsnake.cpp
@@ -0,0 +1,23 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "abslvlsnake.h"
+#include "abslvlsnakeitem.h"
+
+AbsLvlSnake::AbsLvlSnake(): Snake("Snake") {
+    setBreakingForce(50);
+    setAngularVelocity(100);
+    setColor("#90faaa");
+    setMash("qrc:/mesh/meshes/SnakePatternHead.mesh");
+    setSize({2,1,1});
+
+    registerBodyitem<AbsLvlSnakeItem>();
+}
+
+void AbsLvlSnake::onIntersects(const IWorldItem *item) {
+    Q_UNUSED(item);
+}
diff --git a/src/CrawlAbstractLvl/private/abslvlsnake.h b/src/CrawlAbstractLvl/private/abslvlsnake.h
new file mode 100644
index 0000000..7f91e38
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlsnake.h
@@ -0,0 +1,26 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef ABSLVLSNAKE_H
+#define ABSLVLSNAKE_H
+
+#include "Crawl/snake.h"
+
+class AbsLvlSnake : public CRAWL::Snake {
+
+    Q_OBJECT
+
+public:
+    AbsLvlSnake();
+
+    // IWorldItem interface
+protected:
+    void onIntersects(const IWorldItem *item) override;
+
+};
+
+#endif // ABSLVLSNAKE_H
diff --git a/src/CrawlAbstractLvl/private/abslvlsnakeitem.cpp b/src/CrawlAbstractLvl/private/abslvlsnakeitem.cpp
new file mode 100644
index 0000000..1bb6483
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlsnakeitem.cpp
@@ -0,0 +1,19 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "abslvlsnakeitem.h"
+
+AbsLvlSnakeItem::AbsLvlSnakeItem() {
+    setMash("qrc:/mesh/meshes/SnakePatternBody.mesh");
+    setColor("#20aa9a");
+    setSize({1,1,1});
+}
+
+void AbsLvlSnakeItem::onIntersects(const IWorldItem *item) {
+    Q_UNUSED(item);
+
+}
diff --git a/src/CrawlAbstractLvl/private/abslvlsnakeitem.h b/src/CrawlAbstractLvl/private/abslvlsnakeitem.h
new file mode 100644
index 0000000..10143c5
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlsnakeitem.h
@@ -0,0 +1,25 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef ABSLVLSNAKEITEM_H
+#define ABSLVLSNAKEITEM_H
+
+#include "Crawl/snakeitem.h"
+
+class AbsLvlSnakeItem: public CRAWL::SnakeItem {
+
+    Q_OBJECT
+
+public:
+    AbsLvlSnakeItem();
+
+    // IWorldItem interface
+protected:
+    void onIntersects(const IWorldItem *item) override;
+};
+
+#endif // ABSLVLSNAKEITEM_H
diff --git a/src/CrawlAbstractLvl/private/abslvlworld.cpp b/src/CrawlAbstractLvl/private/abslvlworld.cpp
new file mode 100644
index 0000000..3c6e5f5
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlworld.cpp
@@ -0,0 +1,60 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "baff.h"
+#include "obstacleblue.h"
+#include "obstaclered.h"
+#include "abslvlcontrol.h"
+#include "abslvlworld.h"
+#include <abslvlsnake.h>
+#include "Crawl/iworlditem.h"
+
+
+AbsLvlWorld::AbsLvlWorld() {
+
+}
+
+CRAWL::IPlayer *AbsLvlWorld::initPlayer() const {
+    return new AbsLvlSnake();
+}
+
+CRAWL::WorldRule *AbsLvlWorld::initWorldRules() {
+    return new CRAWL::WorldRule {
+        {0, {{registerObject<Baff>(), 1}}},
+        {10, {{registerObject<ObstacleBlue>(), 1}}},
+        {20, {{registerObject<ObstacleRed>(), 1}}}
+    };
+}
+
+QString AbsLvlWorld::initHdrBackGround() const {
+    return "qrc:/hdr/hdr/plate_absLvl.hdr";
+}
+
+QString AbsLvlWorld::description() const {
+    return tr("This a abstract lvl");
+}
+
+QString AbsLvlWorld::imagePreview() const {
+    return "qrc:/hdr/hdr/testHDR.jpg";
+
+}
+
+QString AbsLvlWorld::name() const {
+    return tr("AbstractLvl");
+}
+
+int AbsLvlWorld::costToUnlock() const {
+    return 0;
+}
+
+CRAWL::IControl *AbsLvlWorld::initUserInterface() const {
+    return new AbsLvlControl();
+}
+
+void AbsLvlWorld::initPlayerControl(CRAWL::IControl *control) {
+    return IWorld::initPlayerControl(control);
+}
diff --git a/src/CrawlAbstractLvl/private/abslvlworld.h b/src/CrawlAbstractLvl/private/abslvlworld.h
new file mode 100644
index 0000000..3369bf7
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/abslvlworld.h
@@ -0,0 +1,32 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef ABSLEVELWORLD_H
+#define ABSLEVELWORLD_H
+
+#include "Crawl/iworld.h"
+
+class AbsLvlWorld : public CRAWL::IWorld {
+
+    // IWorld interface
+public:
+
+    AbsLvlWorld();
+
+    CRAWL::IPlayer *initPlayer() const override;
+    CRAWL::WorldRule *initWorldRules() override;
+    QString initHdrBackGround() const override;
+    QString description() const override;
+    QString imagePreview() const override;
+    QString name() const override;
+    int costToUnlock() const override;
+    CRAWL::IControl *initUserInterface() const override;
+    void initPlayerControl(CRAWL::IControl *control) override;
+
+};
+
+#endif // ABSLEVELWORLD_H
diff --git a/src/CrawlAbstractLvl/private/baff.cpp b/src/CrawlAbstractLvl/private/baff.cpp
new file mode 100644
index 0000000..5fb6243
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/baff.cpp
@@ -0,0 +1,18 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "baff.h"
+
+Baff::Baff() : IWorldItem("Baff") {
+    setMash("qrc:/mesh/meshes/Baff.mesh");
+    setSize({1,1,1});
+    setZ(0);
+}
+
+void Baff::onIntersects(const IWorldItem *item) {
+        Q_UNUSED(item);
+}
diff --git a/src/CrawlAbstractLvl/private/baff.h b/src/CrawlAbstractLvl/private/baff.h
new file mode 100644
index 0000000..faad420
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/baff.h
@@ -0,0 +1,22 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef OBJBAFF_H
+#define OBJBAFF_H
+#include "Crawl/iworlditem.h"
+
+
+class Baff: public CRAWL::IWorldItem {
+public:
+    Baff();
+
+    // IWorldItem interface
+protected:
+    void onIntersects(const IWorldItem *item) override;
+};
+
+#endif // OBJBAFF_H
diff --git a/src/CrawlAbstractLvl/private/obstacleblue.cpp b/src/CrawlAbstractLvl/private/obstacleblue.cpp
new file mode 100644
index 0000000..23c4bed
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/obstacleblue.cpp
@@ -0,0 +1,18 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "obstacleblue.h"
+
+ObstacleBlue::ObstacleBlue() : IWorldItem("OstacleBlue") {
+    setMash("qrc:/mesh/meshes/ObstacleBlue.mesh");
+    setSize({1,1,1});
+    setZ(0);
+}
+
+void ObstacleBlue::onIntersects(const IWorldItem *item) {
+        Q_UNUSED(item);
+}
diff --git a/src/CrawlAbstractLvl/private/obstacleblue.h b/src/CrawlAbstractLvl/private/obstacleblue.h
new file mode 100644
index 0000000..7f260ed
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/obstacleblue.h
@@ -0,0 +1,22 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef OBJOBSTACLEBLUE_H
+#define OBJOBSTACLEBLUE_H
+#include "Crawl/iworlditem.h"
+
+
+class ObstacleBlue: public CRAWL::IWorldItem {
+public:
+    ObstacleBlue();
+
+    // IWorldItem interface
+protected:
+    void onIntersects(const IWorldItem *item) override;
+};
+
+#endif // OBJOBSTACLEBLUE_H
diff --git a/src/CrawlAbstractLvl/private/obstaclered.cpp b/src/CrawlAbstractLvl/private/obstaclered.cpp
new file mode 100644
index 0000000..09fbb0a
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/obstaclered.cpp
@@ -0,0 +1,18 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "obstaclered.h"
+
+ObstacleRed::ObstacleRed() : IWorldItem("ObstacleRed") {
+    setMash("qrc:/mesh/meshes/ObstacleRed.mesh");
+    setSize({1,1,1});
+    setZ(0);
+}
+
+void ObstacleRed::onIntersects(const IWorldItem *item) {
+        Q_UNUSED(item);
+}
diff --git a/src/CrawlAbstractLvl/private/obstaclered.h b/src/CrawlAbstractLvl/private/obstaclered.h
new file mode 100644
index 0000000..5d443cd
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/obstaclered.h
@@ -0,0 +1,22 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef OBJOBSTACLERED_H
+#define OBJOBSTACLERED_H
+#include "Crawl/iworlditem.h"
+
+
+class ObstacleRed: public CRAWL::IWorldItem {
+public:
+    ObstacleRed();
+
+    // IWorldItem interface
+protected:
+    void onIntersects(const IWorldItem *item) override;
+};
+
+#endif // OBJOBSTACLERED_H