diff --git a/src/Core/Crawl/groupobject.cpp b/src/Core/Crawl/groupobject.cpp
index f4fa5c3..96e2cc9 100644
--- a/src/Core/Crawl/groupobject.cpp
+++ b/src/Core/Crawl/groupobject.cpp
@@ -22,10 +22,14 @@ void GroupObject::render(unsigned int tbfMsec) {
     for (ClasterItem* object: objects()) {
 
         if (Localpropertys *props = getLocalpropertys(object->guiId())) {
+
             if (!props->_rotation.isNull())
                 object->setRotation(_this->rotation() * props->_rotation);
 
-            object->setposition(_this->position() + props->_position);
+            QVector3D reCalcVectorPs = reCalcPos(props->_position,
+                                              _this->rotation().toEulerAngles());
+
+            object->setposition(_this->position() + reCalcVectorPs);
         }
 
     }
@@ -48,6 +52,31 @@ void GroupObject::updateRotation(int id, const QQuaternion &roatation) {
     _extrapropertys[id]._rotation = roatation;
 }
 
+const QVector3D GroupObject::reCalcPos(const QVector3D& pos, const QVector3D &eulerAngles) const
+{
+    float alha = eulerAngles.z();
+    float beta = eulerAngles.y();
+    float gamma = eulerAngles.x();
+
+    float x = pos.x();
+    float y = pos.y();
+    float z = pos.z();
+
+    float newX = x*(qCos(alha)*qCos(beta)) +
+                 y*(qCos(alha)*qSin(beta)*qSin(gamma) - qSin(alha)*qCos(gamma)) +
+                 z*(qCos(alha)*qSin(beta)*qCos(gamma) + qSin(alha)*qSin(gamma));
+
+    float newY = x*(qSin(alha)*qCos(beta)) +
+                 y*(qSin(alha)*qSin(beta)*qSin(gamma) + qCos(alha)*qCos(gamma)) +
+                 z*(qSin(alha)*qSin(beta)*qCos(gamma) - qCos(alha)*qSin(gamma));
+
+    float newZ = x*(-qSin(beta)) +
+                 y*(qCos(beta)*qSin(gamma)) +
+                 z*(qCos(beta)*qCos(gamma));
+
+    return QVector3D({newX, newY, newZ});
+}
+
 QQuaternion *GroupObject::getLocalrotation(int id) {
     if (_extrapropertys.contains(id)) {
         return &_extrapropertys[id]._rotation;
diff --git a/src/Core/Crawl/groupobject.h b/src/Core/Crawl/groupobject.h
index 63b4a85..f8208d9 100644
--- a/src/Core/Crawl/groupobject.h
+++ b/src/Core/Crawl/groupobject.h
@@ -123,6 +123,8 @@ protected:
 private:
     QHash<int, Localpropertys> _extrapropertys;
 
+    const QVector3D reCalcPos(const QVector3D& pos, const QVector3D& eulerAngles) const;
+
 };
 }
 #endif // GROUPOBJECT_H
diff --git a/src/Core/Crawl/layout.cpp b/src/Core/Crawl/layout.cpp
index b53ee3c..a08db99 100644
--- a/src/Core/Crawl/layout.cpp
+++ b/src/Core/Crawl/layout.cpp
@@ -89,6 +89,7 @@ void Layout::drawSquare() {
     }
 
     int height = qFloor(qSqrt(objects().size()));
+    int width = qFloor(objects().size() / height);
 
     int indObject = 0;
     for (auto idObj = objects().keyBegin(); idObj != objects().keyEnd(); idObj++) {
@@ -96,9 +97,8 @@ void Layout::drawSquare() {
         float x = indObject % height;
         float y = qCeil(indObject  / height);
 
-        GroupObject::updatePosition(*idObj, {x + _distance,
-                                            y + _distance,
-                                            0});
+        GroupObject::updatePosition(*idObj, {(x * _distance) - (height  * _distance / 2),
+                                             (y * _distance) - (width  * _distance / 2), 0});
         indObject++;
 
     }
@@ -113,8 +113,10 @@ void Layout::drawLine() {
     }
 
     float xObject = 0;
-    for (ClasterItem* object: objects()) {
-        GroupObject::updatePosition(object->guiId(), {xObject + _distance, 0, 0});
+    float height = objects().size() * _distance;
+    for (auto idObj = objects().keyBegin(); idObj != objects().keyEnd(); idObj++) {
+
+        GroupObject::updatePosition(*idObj, {(xObject * _distance) - (height/2 * _distance), 0, 0});
 
         xObject++;
     }
diff --git a/src/CrawlAbstractLvl/private/abslvlworld.cpp b/src/CrawlAbstractLvl/private/abslvlworld.cpp
index 5d36d6c..ffb1d8b 100644
--- a/src/CrawlAbstractLvl/private/abslvlworld.cpp
+++ b/src/CrawlAbstractLvl/private/abslvlworld.cpp
@@ -12,6 +12,7 @@
 #include "abslvlworld.h"
 #include <abslvlsnake.h>
 #include "Crawl/iworlditem.h"
+#include "groupobstaclered.h"
 
 #include "Crawl/defaultlight.h"
 
@@ -31,23 +32,23 @@ CRAWL::WorldRule *AbsLvlWorld::initWorldRules() {
 
     return new CRAWL::WorldRule {
 
-        {0,
-            {
-                {registerObject<Baff>(), 10}, {registerObject<CRAWL::DefaultLight>(), 1}
-            }
-        },
-
-        {20,
+        {200,
             {
                 {registerObject<ObstacleBlue>(), 10}, {registerObject<CRAWL::DefaultLight>(), 1}
             }
         },
 
-        {30,
+        {250,
             {
-                {registerObject<ObstacleRed>(), 40}, {registerObject<CRAWL::DefaultLight>(), 1}
+                {registerObject<GroupObstacleRed>(), 1}, {registerObject<CRAWL::DefaultLight>(), 1}
             }
-        }
+        },
+
+//        {30,
+//            {
+//                {registerObject<ObstacleRed>(), 40}, {registerObject<CRAWL::DefaultLight>(), 1}
+//            }
+//        }
 
     };
 }
diff --git a/src/CrawlAbstractLvl/private/groupobstaclered.cpp b/src/CrawlAbstractLvl/private/groupobstaclered.cpp
new file mode 100644
index 0000000..b2b1db6
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/groupobstaclered.cpp
@@ -0,0 +1,37 @@
+//#
+//# 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 "obstaclerebitem.h"
+#include "groupobstaclered.h"
+
+namespace AbstractLvl {
+
+GroupObstacleRed::GroupObstacleRed(): CRAWL::IWorldItem(AUTO_CLASS_NAME) {
+
+    QQuaternion rotation =
+        QQuaternion::fromEulerAngles(QVector3D(0,0,90));
+
+    setDistance(7);
+    setRotation(rotation);
+    changeLayout(CRAWL::LayoutType::LINE);
+
+    for(int i(0); i < 10; i++)   {
+        add(new ObstacleRebItem);
+    }
+
+}
+
+void GroupObstacleRed::render(unsigned int tbfMsec) {
+    Layout::render(tbfMsec);
+    IWorldItem::render(tbfMsec);
+}
+
+void GroupObstacleRed::init() {
+
+}
+
+}
diff --git a/src/CrawlAbstractLvl/private/groupobstaclered.h b/src/CrawlAbstractLvl/private/groupobstaclered.h
new file mode 100644
index 0000000..93d25c0
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/groupobstaclered.h
@@ -0,0 +1,27 @@
+//#
+//# 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 GROUPOBSTACLERED_H
+#define GROUPOBSTACLERED_H
+
+#include "Crawl/layout.h"
+#include "Crawl/clasteritem.h"
+
+namespace AbstractLvl {
+
+class GroupObstacleRed: public CRAWL::Layout, public CRAWL::IWorldItem {
+public:
+    GroupObstacleRed();
+
+    // IRender interface
+public:
+    void render(unsigned int tbfMsec);
+    void init();
+};
+}
+
+#endif // GROUPOBSTACLERED_H
diff --git a/src/CrawlAbstractLvl/private/obstaclerebitem.cpp b/src/CrawlAbstractLvl/private/obstaclerebitem.cpp
new file mode 100644
index 0000000..ff15027
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/obstaclerebitem.cpp
@@ -0,0 +1,20 @@
+//#
+//# 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 "obstaclerebitem.h"
+
+namespace AbstractLvl {
+
+ObstacleRebItem::ObstacleRebItem() {
+
+}
+
+void ObstacleRebItem::render(unsigned int tbfMsec) {
+
+}
+
+}
diff --git a/src/CrawlAbstractLvl/private/obstaclerebitem.h b/src/CrawlAbstractLvl/private/obstaclerebitem.h
new file mode 100644
index 0000000..829dabf
--- /dev/null
+++ b/src/CrawlAbstractLvl/private/obstaclerebitem.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 OBSTACLEREBITEM_H
+#define OBSTACLEREBITEM_H
+
+#include "obstaclered.h"
+
+namespace AbstractLvl {
+
+class ObstacleRebItem: public ObstacleRed {
+public:
+    ObstacleRebItem();
+
+    // IRender interface
+public:
+    void render(unsigned int tbfMsec);
+};
+
+}
+
+#endif // OBSTACLEREBITEM_H
diff --git a/src/CrawlAbstractLvl/private/obstaclered.cpp b/src/CrawlAbstractLvl/private/obstaclered.cpp
index e0d03ac..f52ac5a 100644
--- a/src/CrawlAbstractLvl/private/obstaclered.cpp
+++ b/src/CrawlAbstractLvl/private/obstaclered.cpp
@@ -9,7 +9,7 @@
 
 namespace AbstractLvl {
 
-ObstacleRed::ObstacleRed() : IWorldItem(AUTO_CLASS_NAME) {
+ObstacleRed::ObstacleRed() : CRAWL::ClasterItem(AUTO_CLASS_NAME) {
     setMash("qrc:/mesh/meshes/ObstacleRed.mesh");
     setSize({1,1,1});
     setColor("#ff1927");
diff --git a/src/CrawlAbstractLvl/private/obstaclered.h b/src/CrawlAbstractLvl/private/obstaclered.h
index 24bd915..68130a6 100644
--- a/src/CrawlAbstractLvl/private/obstaclered.h
+++ b/src/CrawlAbstractLvl/private/obstaclered.h
@@ -7,11 +7,11 @@
 
 #ifndef OBJOBSTACLERED_H
 #define OBJOBSTACLERED_H
-#include "Crawl/iworlditem.h"
+#include "Crawl/clasteritem.h"
 
 namespace AbstractLvl {
 
-class ObstacleRed: public CRAWL::IWorldItem {
+class ObstacleRed: public CRAWL::ClasterItem {
 public:
     ObstacleRed();
 
diff --git a/tests/units/groupobjecttest.cpp b/tests/units/groupobjecttest.cpp
index cf60629..806eb12 100644
--- a/tests/units/groupobjecttest.cpp
+++ b/tests/units/groupobjecttest.cpp
@@ -73,14 +73,16 @@ void GroupObjectTest::testBehavior() const {
     QVector3D localPosition = {10,0,0};
     QQuaternion localRotation = QQuaternion::fromEulerAngles(0,5,0);
 
-    object.updatePosition(item.guiId(), localPosition);
     object.updateRotation(item.guiId(), localRotation);
+    object.render(0);
+    // after invoke the render function all positions and rotations should be changed
+    QVERIFY(item.rotation() == (object.rotation() * localRotation));
+
+    object.updatePosition(item.guiId(), localPosition);
+    object.setRotation(QQuaternion::fromEulerAngles(0,0,0));
 
     object.render(0);
-
-    // after invoke the render function all positions and rotations should be changed
     QVERIFY(item.position() == (object.position() + localPosition));
-    QVERIFY(item.rotation() == (object.rotation() * localRotation));
 
 
     object.remove(&item);