diff --git a/assets/shaders/FrameBuffer-Instanced.frag b/assets/shaders/FrameBuffer-Instanced.frag
index 736ee8af5ef35a1e439fb7f70d95a5bd34f4fac3..2db481d44a28552df09447eaef2b7c0599f25e9f 100644
--- a/assets/shaders/FrameBuffer-Instanced.frag
+++ b/assets/shaders/FrameBuffer-Instanced.frag
@@ -6,21 +6,20 @@ in vec2 Texture;
 
 uniform sampler2D uSampler[32];
 uniform uint uTexturesCount;
-uniform vec3 uClearColor;
 
 void main() {
     vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
     for(uint i = 0; i < uTexturesCount; ++i) {
         vec4 tcolor = texture(uSampler[i], Texture);
-        if(tcolor.r != uClearColor.r) {
+        if(tcolor.r != 0.0) {
             color.r = tcolor.r;
         }
 
-        if(tcolor.g != uClearColor.g) {
+        if(tcolor.g != 0.0) {
             color.g = tcolor.g;
         }
 
-        if(tcolor.b != uClearColor.b) {
+        if(tcolor.b != 0.0) {
             color.b = tcolor.b;
         }
     }
diff --git a/assets/shaders/Sprite.frag b/assets/shaders/Sprite.frag
new file mode 100644
index 0000000000000000000000000000000000000000..31804e3da3883884bfa9d2a1f808344f53aad50b
--- /dev/null
+++ b/assets/shaders/Sprite.frag
@@ -0,0 +1,18 @@
+#version 450 core
+out vec4 FragColor;
+
+uniform sampler2D uSampler[32];
+uniform int uTextures[128];
+uniform vec4 uFrames[128];
+uniform vec2 uSizes[128];
+
+in vec2 Texture;
+flat in int Id;
+
+void main() {
+    vec2 coord = vec2(
+        (uFrames[Id].x / uSizes[Id].x) + (uFrames[Id].z / uSizes[Id].x) *  Texture.x, 
+        (uFrames[Id].y / uSizes[Id].y) + (uFrames[Id].w / uSizes[Id].y) *  Texture.y  
+    );
+    FragColor = texture(uSampler[uTextures[Id]], coord);
+}
\ No newline at end of file
diff --git a/assets/shaders/Sprite.vert b/assets/shaders/Sprite.vert
new file mode 100644
index 0000000000000000000000000000000000000000..fc9545fb6bb83a0f907b7c8a8cd37e03f0adcf98
--- /dev/null
+++ b/assets/shaders/Sprite.vert
@@ -0,0 +1,16 @@
+#version 450 core
+layout (location = 0) in vec2 aPos;
+layout (location = 1) in vec2 aTex;
+
+uniform mat4 uModel[128];
+uniform mat4 uView;
+uniform mat4 uProj;
+
+out vec2 Texture;
+flat out int Id;
+
+void main() {
+    Texture = aTex;
+    Id = gl_InstanceID;
+    gl_Position =  uProj * uView * uModel[gl_InstanceID] * vec4(aPos.x, aPos.y, 0.0, 1.0);
+}
\ No newline at end of file
diff --git a/assets/textures/Neera.png b/assets/textures/Neera.png
new file mode 100644
index 0000000000000000000000000000000000000000..01d777dca4146f5ff1d41da072aa59c744c5cc5b
Binary files /dev/null and b/assets/textures/Neera.png differ
diff --git a/source/engine/graphics/front/engine/Engine.cpp b/source/engine/graphics/front/engine/Engine.cpp
index 75516564d9101baae959c1437d2e1fc32162a120..1984061774f43a1069d8da06c8d834d865f0e36c 100644
--- a/source/engine/graphics/front/engine/Engine.cpp
+++ b/source/engine/graphics/front/engine/Engine.cpp
@@ -4,23 +4,21 @@
 
 namespace megu {
     GraphicEngine::GraphicEngine(Window & window, float w, float h) 
-    : _window(window), _renderer(w, h) {
+    : _window(window), _view(0, 0, w, h) {
         glViewport(0, 0, window.width(), window.height());
-        this->_renderer.setClearColor(NORMALIZE(135.f), NORMALIZE(170.f), NORMALIZE(255.f));
     } 
 
     GraphicEngine::GraphicEngine(Window & window) 
-    : _window(window), _renderer(window.width(), window.height()) {
+    : _window(window), _view(0, 0, window.width(), window.height()) {
         glViewport(0, 0, window.width(), window.height());
-        this->_renderer.setClearColor(NORMALIZE(135.f), NORMALIZE(170.f), NORMALIZE(255.f));
     }
 
-    void GraphicEngine::push(Priority priority, const Renderer & renderer) {
+    void GraphicEngine::push(Priority priority, Renderer & renderer) {
         this->_layers[priority] = std::make_unique<Layer>(renderer);
     }
 
-    void GraphicEngine::push(Priority layer_priority, Priority draw_priority, const DrawGroup & group) {
-        this->_layers[layer_priority]->push(draw_priority, group);
+    void GraphicEngine::push(Priority layer_priority, Priority object_priority, Renderable & object) {
+        this->_layers[layer_priority].get()->push(object_priority, object);
     }
 
     void GraphicEngine::remove(Priority priority) {
@@ -30,13 +28,6 @@ namespace megu {
         }
     }
 
-    void GraphicEngine::remove(Priority layer_priority, Priority draw_priority) {
-        auto it = this->_layers.find(layer_priority);
-        if(it != this->_layers.end()) {
-            it->second->remove(draw_priority);
-        }
-    }
-
     std::optional<std::reference_wrapper<const Layer>> GraphicEngine::get(Priority priority) const {
         const auto it = this->_layers.find(priority);
         if(it != this->_layers.end()) {
@@ -45,37 +36,27 @@ namespace megu {
         return {};
     }
 
-    std::optional<std::reference_wrapper<const DrawGroup>> GraphicEngine::get(Priority layer_priority, Priority draw_priority) const {
-        const auto it = this->_layers.find(layer_priority);
-        if(it != this->_layers.end()) {
-            return it->second->get(draw_priority);
-        }
-        return {};
-    }
-
     void GraphicEngine::step() {
         if(this->_window.isOpen()) {
             // Draw Layers
             TextureArray textures;
             for(auto & [priority, layer] : this->_layers) {
-                if(!layer.get()->empty()) {
-                    const glm::vec2 & dimension = layer->renderer().dimension();
-                    glViewport(0, 0, static_cast<GLsizei>(dimension.x), static_cast<GLsizei>(dimension.y));
-                    textures.push_back(layer->draw(this->_window, textures));
-                }
+                const glm::vec2 & dimension = layer->renderer().dimension();
+                glViewport(0, 0, static_cast<GLsizei>(dimension.x), static_cast<GLsizei>(dimension.y));
+                textures.push_back(layer->draw(this->_window, textures));
             }
 
             // Merge Textures
             FrameBuffer::BindDefaultFrameBuffer();
             glViewport(0, 0, static_cast<GLsizei>(this->_window.width()), static_cast<GLsizei>(this->_window.height()));
-            this->_renderer.render(this->_window, this->_group, textures);
+            glClear(GL_COLOR_BUFFER_BIT);
+            std::any any = 1;
+            this->_module.render(this->_window, this->_view, any, textures);
             this->_window.swapBuffers();
         }
     }
 
     void GraphicEngine::setClearColor(float x, float y, float z) {
-        this->_renderer.setClearColor(x, y, z);
-        this->_group.setClearColor(x, y, z);
         for(auto & [priority, layer] : this->_layers) {
             layer.get()->renderer().setClearColor(x, y, z);
         }
diff --git a/source/engine/graphics/front/engine/Engine.hpp b/source/engine/graphics/front/engine/Engine.hpp
index aa721f03c90e134ca2fc746c1cae78f5a3f2b24c..b9525b45fc0a50808b861fb455fdc63c3c97bdc8 100644
--- a/source/engine/graphics/front/engine/Engine.hpp
+++ b/source/engine/graphics/front/engine/Engine.hpp
@@ -2,10 +2,10 @@
 
 #include <map>
 #include <optional>
-#include <engine/graphics/front/group/DrawGroup.hpp>
-#include <engine/graphics/front/group/FrameBufferGroup.hpp>
 
-#include "Renderer.hpp"
+#include <engine/graphics/front/module/FrameBufferModule.hpp>
+#include <engine/graphics/back/cameras/View.hpp>
+
 #include "Layer.hpp"
 
 namespace megu {
@@ -16,17 +16,14 @@ namespace megu {
             GraphicEngine(Window &);
            ~GraphicEngine() = default;
 
-            void push(Priority, const Renderer &);
-            void push(Priority, Priority, const DrawGroup &);
+            void push(Priority, Renderer &);
+            void push(Priority, Priority, Renderable &);
 
             void remove(Priority);
-            void remove(Priority, Priority);
 
             std::optional<std::reference_wrapper<const Layer>> get(Priority) const;
-            std::optional<std::reference_wrapper<const DrawGroup>> get(Priority, Priority) const;
 
             inline bool empty() const {return this->_layers.empty();}
-            inline const Renderer & renderer() const {return this->_renderer;}
             inline const std::map<Priority, std::unique_ptr<Layer>> & layers() const {return this->_layers;}
     
             void step();
@@ -34,9 +31,9 @@ namespace megu {
 
         private:
             std::map<Priority, std::unique_ptr<Layer>> _layers;
-            Renderer _renderer;
-            FrameBufferGroup _group;
+            FrameBuffer_Module _module;
             Window & _window;
+            View _view;
 
     };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Layer.cpp b/source/engine/graphics/front/engine/Layer.cpp
index 22a78dc175bd00f6b0af360519e1fa1413eaffa6..70130adf418fd169a4768796474d41caad3f46e6 100644
--- a/source/engine/graphics/front/engine/Layer.cpp
+++ b/source/engine/graphics/front/engine/Layer.cpp
@@ -3,37 +3,10 @@
 #include <iostream>
 
 namespace megu {
-    Layer::Layer(const Renderer & renderer) 
-    : _renderer(renderer), 
-      _frameBuffer(static_cast<GLuint>(renderer.dimension().x), static_cast<GLuint>(renderer.dimension().y)) {}
+    Layer::Layer(Renderer & renderer) 
+    : _renderer(renderer), _frameBuffer(static_cast<GLuint>(renderer.dimension().x), static_cast<GLuint>(renderer.dimension().y)) {}
 
-    void Layer::push(Priority priority, const DrawGroup & group) {
-        this->_objects[priority] = &group;
+    void Layer::push(Priority priority, Renderable & object) {
+        this->_objects[typeid(object)].insert(object);
     }
-
-    void Layer::remove(Priority priority) {
-        auto it = this->_objects.find(priority);
-        if(it != this->_objects.end()) {
-            this->_objects.erase(it);
-        }
-    }
-
-    std::optional<std::reference_wrapper<const DrawGroup>> Layer::get(Priority priority) const {
-        const auto it = this->_objects.find(priority);
-        if(it != this->_objects.end()) {
-            return *it->second;
-        }
-        return {};
-    }
-
-    const Texture & Layer::draw(const Window & window, const TextureArray & textures) const {
-        this->_frameBuffer.bind();
-
-        for(auto &[priority, group] : this->_objects) {
-            this->_renderer.render(window, *group, textures);
-        }
-        
-        return this->_frameBuffer.texture();
-    }
-
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Layer.hpp b/source/engine/graphics/front/engine/Layer.hpp
index ee585b73528ea6039528ba75e8da5f28f8048419..a81e881bfe9f18f983adb029405e9ce26a24f87e 100644
--- a/source/engine/graphics/front/engine/Layer.hpp
+++ b/source/engine/graphics/front/engine/Layer.hpp
@@ -2,8 +2,12 @@
 
 #include <map>
 #include <optional>
+#include <typeindex>
+#include <any>
+
 #include <engine/graphics/back/buffers/FrameBuffer.hpp>
-#include <engine/graphics/front/group/DrawGroup.hpp>
+#include <engine/graphics/front/object/Renderable.hpp>
+#include <engine/graphics/utility/reference_sorter.hpp>
 
 #include "Priority.hpp" 
 #include "Renderer.hpp"
@@ -12,22 +16,29 @@ namespace megu {
     class Layer {
         public:
             Layer() = delete;
-            Layer(const Renderer &);
+            Layer(Renderer &);
            ~Layer() = default;
 
-            void push(Priority, const DrawGroup &); 
-            void remove(Priority);
-            std::optional<std::reference_wrapper<const DrawGroup>> get(Priority) const;
-
-            inline bool empty() const {return this->_objects.empty();}
+            
             inline const Renderer & renderer() const {return this->_renderer;}
-            inline const std::map<Priority, DrawGroup const *> & groups() const {return this->_objects;}
 
-            virtual const Texture & draw(const Window &, const TextureArray &) const;
+            void push(Priority, Renderable &);
+
+            const Texture & draw(const Window & w, const TextureArray & a) {
+                this->_frameBuffer.bind();
+                for(const auto & [type, objects] : this->_objects) {
+                    if(!objects.empty()) {
+                        //std::cout << typeid((*objects.begin()).get()).name() << std::endl;
+                        this->_renderer.render(w, (*objects.begin()).get(), a);
+                    }
+                }
+               
+                return this->_frameBuffer.texture();
+            }
 
         private:
-            const Renderer & _renderer;
+            Renderer & _renderer;
             FrameBuffer _frameBuffer;
-            std::map<Priority, DrawGroup const*> _objects;
+            std::map<std::type_index, std::set<std::reference_wrapper<Renderable>>> _objects;
     };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Priority.hpp b/source/engine/graphics/front/engine/Priority.hpp
index 1b628a4f2d219fe993ddeee3f30d789383ecae55..6651bc75358c8e5a6d2ef9d05b653c2275647e0c 100644
--- a/source/engine/graphics/front/engine/Priority.hpp
+++ b/source/engine/graphics/front/engine/Priority.hpp
@@ -11,4 +11,7 @@ namespace megu {
             return p1 != p2 ? p1 > p2 : &p1 > &p2;
         }
     };
+
+    template <class T>
+    using priority_map = std::map<Priority, T>;
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Renderer.cpp b/source/engine/graphics/front/engine/Renderer.cpp
index be10866cb2f79046e64b0621b5cb9c1765d85ac8..edf40a77023012803e22c142a62824b66753e318 100644
--- a/source/engine/graphics/front/engine/Renderer.cpp
+++ b/source/engine/graphics/front/engine/Renderer.cpp
@@ -7,10 +7,6 @@ namespace megu {
         glEnable(GL_BLEND);
     }
 
-    void Renderer::render(const Window & window, const DrawGroup & group, const TextureArray & textures) const {
-        group.draw(window, this->_view, textures);
-    }
-
     void Renderer::clear() const {
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     }
diff --git a/source/engine/graphics/front/engine/Renderer.hpp b/source/engine/graphics/front/engine/Renderer.hpp
index f7624fa2357bbf2e82eefa997d478f09fff1cedb..3115f095a71ef68d75d75c15508a66c5812de351 100644
--- a/source/engine/graphics/front/engine/Renderer.hpp
+++ b/source/engine/graphics/front/engine/Renderer.hpp
@@ -6,7 +6,7 @@
 #include <engine/graphics/back/buffers/FrameBuffer.hpp>
 #include <engine/graphics/back/cameras/View.hpp>
 
-#include <engine/graphics/front/group/DrawGroup.hpp> 
+#include <engine/graphics/front/module/ImageModule.hpp>
 
 namespace megu {
     class Renderer {
@@ -15,7 +15,10 @@ namespace megu {
             Renderer(float, float);
            ~Renderer() = default;
             
-            virtual void render(const Window &, const DrawGroup &, const TextureArray &) const;
+            void render(const Window & w, Renderable & r, const TextureArray & a) {
+                this->clear();
+                r.accept(w, this->_view, this->_module, a);
+            }
 
             const glm::vec2 dimension() const {return this->_view.dimension();}
 
@@ -26,5 +29,6 @@ namespace megu {
 
         private:
             View _view;
+            Image_Module _module;
     };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/DrawGroup.cpp b/source/engine/graphics/front/group/DrawGroup.cpp
deleted file mode 100644
index 75db3f7edf1ea52475a9edbfd61be9d915d5b989..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/DrawGroup.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "DrawGroup.hpp"
-
-namespace megu {
-    
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/DrawGroup.hpp b/source/engine/graphics/front/group/DrawGroup.hpp
deleted file mode 100644
index f2d8ca326a645a91e47960f1367783845c67a0d4..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/DrawGroup.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include <engine/graphics/back/cameras/Camera.hpp>
-#include <engine/graphics/front/engine/TextureArray.hpp>
-#include <engine/io/Window.hpp>
-
-namespace megu {
-    class DrawGroup {
-        public:
-            virtual void draw(const Window &, const Camera &, const TextureArray &) const = 0;
-    };
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/FrameBufferGroup.hpp b/source/engine/graphics/front/group/FrameBufferGroup.hpp
deleted file mode 100644
index 40858d40a627c4e6ea776a4dc4828002156cb064..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/FrameBufferGroup.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-#pragma once
-
-#include <engine/graphics/back/buffers/VertexArray.hpp>
-#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
-#include <engine/graphics/back/shaders/Program.hpp>
-
-#include <engine/graphics/front/group/DrawGroup.hpp>
-
-namespace megu {
-    class FrameBufferGroup : public DrawGroup {
-        public:
-            FrameBufferGroup();
-           ~FrameBufferGroup() = default;
-
-            virtual void draw(const Window &, const Camera &, const TextureArray &) const;
-            inline void setClearColor(float x, float y, float z) {this->_clear = {x, y, z};}
-
-        private:
-            VertexArray _vao;
-            VerticeBuffer _vbo;
-            Program _program;
-            glm::vec3 _clear;
-    };
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/ImageGroup.cpp b/source/engine/graphics/front/group/ImageGroup.cpp
deleted file mode 100644
index 32db99152336298094a7d1329bb0ec24d53416c4..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/ImageGroup.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#include "ImageGroup.hpp"
-
-#include <tuple>
-
-#include <engine/graphics/utility/array_generator.hpp>
-
-namespace megu {
-    ImageGroup::ImageGroup() 
-    : _vbo(this->_vao, Quads::Layout(), Quads::Vertices().size(), megu::EditMode::STATIC) {
-        Source vert("assets/shaders/Image-Instanced-Fat.vert", Source::Categorie::VERTEX);
-        this->_program.attach(vert);
-
-        Source frag("assets/shaders/Texture-Fat.frag", Source::Categorie::FRAGMENT);
-        this->_program.attach(frag);
-
-        this->_program.link();
-
-        this->_vbo << Quads::Vertices();
-
-        vert.release();
-        frag.release();
-    }
-
-    void ImageGroup::add(const Image & image) {
-        this->_images.insert(image);
-    }
-
-    void ImageGroup::update() {
-        std::set<std::reference_wrapper<const Image>, isometric_sorter> source = this->_images;
-        this->_images.clear();
-        for(auto & i : source) {
-            this->_images.insert(i);
-        }
-    }
-
-    void ImageGroup::draw(const Window & window, const Camera & camera, const TextureArray &) const {
-        this->_vao.bind();
-        this->_program.use();
-
-        this->_program.setUniform("uProj", camera.projection());
-        this->_program.setUniform("uView", camera.view());
-
-        std::vector<std::reference_wrapper<const Texture>> textures;
-
-        std::vector<glm::mat4> uModels;
-        std::vector<GLint> uTextures;
-
-        static auto uSampler = array_generator<GLint, 32>().array;
-        this->_program.setUniform("uSampler", uSampler);         
-    
-        for(auto & image : this->_images) {
-            
-            std::vector<std::reference_wrapper<const Texture>>::iterator it = std::find(textures.begin(), textures.end(), image.get().texture());
-            if(it != textures.end()) {
-                uModels.push_back(image.get().transformation().model());
-                uTextures.push_back(static_cast<GLint>(it - textures.begin()));
-            }
-            else {
-                if(textures.size() >= 8 || uModels.size() >= 124) {
-                    this->_program.setUniform("uModel", uModels);
-                    this->_program.setUniform("uTextures", uTextures);
-
-                    glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), static_cast<GLsizei>(uModels.size()));
-
-                    textures.clear();
-                    uModels.clear();
-                    uTextures.clear();
-                }
-                
-                textures.push_back(image.get().texture());  
-                image.get().texture().bind(static_cast<GLint>(textures.size()-1));
-                uTextures.push_back(static_cast<GLint>(textures.size()-1)); 
-                uModels.push_back(image.get().transformation().model());
-            }
-        }
-
-        if(!textures.empty()) {
-            this->_program.setUniform("uModel", uModels);
-            this->_program.setUniform("uTextures", uTextures);
-
-            glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), static_cast<GLsizei>(uModels.size())); 
-        }
-    }
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/ImageGroup.hpp b/source/engine/graphics/front/group/ImageGroup.hpp
deleted file mode 100644
index 4293a7f4142b4fb6e6ca022b239c47114d5f33a5..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/ImageGroup.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#pragma once
-
-#include "DrawGroup.hpp"
-
-
-#include <map>
-#include <list>
-#include <set>
-
-#include <engine/graphics/utility/isometric_sorter.hpp>
-
-#include <engine/graphics/back/buffers/VertexArray.hpp>
-#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
-#include <engine/graphics/back/shaders/Program.hpp>
-
-#include <engine/graphics/front/object/Image.hpp>
-
-namespace megu {
-    class ImageGroup : public DrawGroup {
-        public:
-            ImageGroup();
-           ~ImageGroup() = default;
-
-            void draw(const Window &, const Camera &, const TextureArray &) const override;
-
-            void add(const Image &);
-            void update();
-
-        private:
-            std::set<std::reference_wrapper<const Image>, isometric_sorter> _images;
-            
-            VertexArray _vao;
-            VerticeBuffer _vbo;
-            Program _program;
-    };
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/VertexArrayGroup.cpp b/source/engine/graphics/front/group/VertexArrayGroup.cpp
deleted file mode 100644
index 26c5bda5795e047fa1853a77ee088eb2b1f4eb7f..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/VertexArrayGroup.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "VertexArrayGroup.hpp"
-
-#include <engine/graphics/utility/array_generator.hpp>
-
-namespace megu {
-    VertexArrayGroup::VertexArrayGroup()
-    : _vbo(this->_vao, Quads::Layout(), Quads::Vertices(), megu::EditMode::STATIC) {
-        Source vert("assets/shaders/Grid-Instanced.vert", Source::Categorie::VERTEX);
-        this->_program.attach(vert);
-
-        Source frag("assets/shaders/Grid-Instanced.frag", Source::Categorie::FRAGMENT);
-        this->_program.attach(frag);
-
-        this->_program.link();
-
-        vert.release();
-        frag.release();
-    }
-
-    void VertexArrayGroup::add(const Texture & texture, const VerticesArray & grid) {
-        this->_objects[texture].push_back(grid);
-    }
-
-    void VertexArrayGroup::draw(const Window &, const Camera & camera, const TextureArray &) const {
-        this->_vao.bind();
-        this->_program.use();
-
-        this->_program.setUniform("uProj", camera.projection());
-        this->_program.setUniform("uView", camera.view());
-
-        for(const auto & [texture, grids] : this->_objects) {
-            texture.get().bind(0);
-            for(const auto & grid : grids) {
-                this->_program.setUniform("uModel", grid.get().transformation().model());
-                this->_program.setUniform("uSampler", 0);
-                this->_program.setUniform("uData", static_cast<const void *>(grid.get().vertices().data()), grid.get().size());
-
-                glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), static_cast<GLsizei>(grid.get().size()));
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/VertexArrayGroup.hpp b/source/engine/graphics/front/group/VertexArrayGroup.hpp
deleted file mode 100644
index 65efa658edb1b1780f3e7f4c025296d8a4700367..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/group/VertexArrayGroup.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-
-#include "DrawGroup.hpp"
-
-#include <map>
-#include <optional>
-
-#include <engine/graphics/back/textures/Texture.hpp>
-#include <engine/graphics/back/buffers/VertexArray.hpp>
-#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
-#include <engine/graphics/back/shaders/Program.hpp>
-
-#include <engine/graphics/front/object/VerticesArray.hpp>
-
-#include <engine/graphics/utility/texture_comparator.hpp>
-
-namespace megu {
-    class VertexArrayGroup : public DrawGroup {
-        public:
-            VertexArrayGroup();
-           ~VertexArrayGroup() = default;
-            
-            void add(const Texture &, const VerticesArray &);
-            void draw(const Window &, const Camera &, const TextureArray &) const override;
-
-        private:
-            std::map<std::reference_wrapper<const Texture>, std::vector<std::reference_wrapper<const VerticesArray>>, texture_comparator> _objects;
-
-            VertexArray _vao;
-            VerticeBuffer _vbo;
-            Program _program;
-    };
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/group/FrameBufferGroup.cpp b/source/engine/graphics/front/module/FrameBufferModule.cpp
similarity index 76%
rename from source/engine/graphics/front/group/FrameBufferGroup.cpp
rename to source/engine/graphics/front/module/FrameBufferModule.cpp
index c9052ed04238ca2171840a9ef99cbe1e50529f35..8da4da83ec74d547b6c91f7863170f3af31e65c2 100644
--- a/source/engine/graphics/front/group/FrameBufferGroup.cpp
+++ b/source/engine/graphics/front/module/FrameBufferModule.cpp
@@ -1,12 +1,11 @@
-#include "FrameBufferGroup.hpp"
+#include "FrameBufferModule.hpp"
 
-#include <glm/gtc/matrix_transform.hpp>
 #include <engine/graphics/front/geometry/Plane.hpp>
 #include <engine/graphics/utility/array_generator.hpp>
 
 namespace megu {
-    FrameBufferGroup::FrameBufferGroup() 
-    : _vbo(this->_vao, Plane::Layout(), Plane::Vertices(), megu::EditMode::STATIC), _clear(0.f) {
+    FrameBuffer_Module::FrameBuffer_Module()
+    : _vbo(this->_vao, Plane::Layout(), Plane::Vertices(), megu::EditMode::STATIC) {
         megu::Source vert("assets/shaders/FrameBuffer-Instanced.vert", Source::Categorie::VERTEX);
         this->_program.attach(vert);
 
@@ -19,7 +18,7 @@ namespace megu {
         frag.release();
     }
 
-    void FrameBufferGroup::draw(const Window & window, const Camera & camera, const TextureArray & textures) const {
+    void FrameBuffer_Module::render(const Window & window, const Camera & camera, std::any & any, const TextureArray & textures) {
         this->_program.use();
         this->_vao.bind();
 
@@ -31,7 +30,6 @@ namespace megu {
 
         this->_program.setUniform("uSampler", uSampler);
         this->_program.setUniform("uTexturesCount", static_cast<GLuint>(textures.size()));
-        this->_program.setUniform("uClearColor", this->_clear);
         glDrawArrays(Plane::Primitive(), 0, static_cast<GLsizei>(Plane::Vertices().size()));
     }
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/FrameBufferModule.hpp b/source/engine/graphics/front/module/FrameBufferModule.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..cc90570ad2107ef02bad1441c49d0d3e8c53540e
--- /dev/null
+++ b/source/engine/graphics/front/module/FrameBufferModule.hpp
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <any>
+
+#include <engine/graphics/back/buffers/VertexArray.hpp>
+#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
+#include <engine/graphics/back/shaders/Program.hpp>
+
+#include <engine/graphics/front/object/Image.hpp>
+#include <engine/graphics/utility/module.hpp>
+
+namespace megu {
+    class FrameBuffer_Module : public Module<std::any> {
+       public:
+            FrameBuffer_Module();
+           ~FrameBuffer_Module() = default;
+
+            void render(const Window &, const Camera &, std::any &, const TextureArray &) override;
+
+        private:
+            VertexArray _vao;
+            VerticeBuffer _vbo;
+            Program _program;
+    };
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/ImageModule.cpp b/source/engine/graphics/front/module/ImageModule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c945ac21285718628d0e9eddcabf5e8f8c9e6f41
--- /dev/null
+++ b/source/engine/graphics/front/module/ImageModule.cpp
@@ -0,0 +1,44 @@
+#include "ImageModule.hpp"
+
+#include <engine/graphics/utility/array_generator.hpp>
+
+namespace megu {
+    Image_Module::Image_Module()
+    : _vbo(this->_vao, Quads::Layout(), Quads::Vertices().size(), megu::EditMode::STATIC) {
+        Source vert("assets/shaders/Image-Instanced-Fat.vert", Source::Categorie::VERTEX);
+        this->_program.attach(vert);
+
+        Source frag("assets/shaders/Texture-Fat.frag", Source::Categorie::FRAGMENT);
+        this->_program.attach(frag);
+
+        this->_program.link();
+
+        this->_vbo << Quads::Vertices();
+
+        vert.release();
+        frag.release();
+    }
+
+    void Image_Module::render(const Window &, const Camera & camera, Image & image, const TextureArray &) {
+        this->_vao.bind();
+        this->_program.use();
+        image.texture().bind();
+
+        this->_program.setUniform("uProj", camera.projection());
+        this->_program.setUniform("uView", camera.view());
+
+        static auto uSampler = array_generator<GLint, 32>().array;
+        this->_program.setUniform("uSampler", uSampler);
+
+        std::vector<glm::mat4> uModels;
+        std::vector<GLint> uTextures;
+
+        uModels.push_back(image.transformation().model());
+        uTextures.push_back(0);
+
+        this->_program.setUniform("uModel", uModels);
+        this->_program.setUniform("uTextures", uTextures);
+
+        glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), 1);
+    }
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/ImageModule.hpp b/source/engine/graphics/front/module/ImageModule.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ee339bda17d73e3b763f50aa88a0d81e9f97e728
--- /dev/null
+++ b/source/engine/graphics/front/module/ImageModule.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <engine/graphics/back/buffers/VertexArray.hpp>
+#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
+#include <engine/graphics/back/shaders/Program.hpp>
+
+#include <engine/graphics/front/object/Image.hpp>
+#include <engine/graphics/utility/module.hpp>
+
+namespace megu {
+    class Image_Module : public Module<Image> {
+        public:
+            Image_Module();
+           ~Image_Module() = default;
+
+            void render(const Window &, const Camera &, Image &, const TextureArray &) override;
+
+        private:
+            VertexArray _vao;
+            VerticeBuffer _vbo;
+            Program _program;
+    };
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/object/Image.hpp b/source/engine/graphics/front/object/Image.hpp
index a4f5e5513c73ccce56ef7bddf1348de3e1cd9427..b92f031cb96fbec7c7cd269c770c8965b20be9e0 100644
--- a/source/engine/graphics/front/object/Image.hpp
+++ b/source/engine/graphics/front/object/Image.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "Renderable.hpp"
+
 #include <filesystem>
 #include <glm/vec2.hpp>
 
@@ -10,7 +12,7 @@
 #include <engine/graphics/utility/type.hpp>
 
 namespace megu {
-    class Image {
+    class Image : public Renderable {
         public:
             Image() = default;
             Image(const std::filesystem::path &);
diff --git a/source/engine/graphics/front/object/Renderable.hpp b/source/engine/graphics/front/object/Renderable.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..441a0789a871aafffa935a538bcf40a173ecfa27
--- /dev/null
+++ b/source/engine/graphics/front/object/Renderable.hpp
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <engine/io/Window.hpp>
+#include <engine/graphics/utility/module.hpp>
+#include <engine/graphics/front/engine/TextureArray.hpp>
+
+namespace megu {
+    class Renderable {
+        public:
+            template <class T>
+            void accept(const Window & window, const Camera & camera, Module<T> & modul, const TextureArray & array) {
+                modul.render(window, camera, *static_cast<T *>(this), array);
+            }
+    };
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/object/Sprite.cpp b/source/engine/graphics/front/object/Sprite.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..82283f5648483790dbacfa401700c3ebb0f71339
--- /dev/null
+++ b/source/engine/graphics/front/object/Sprite.cpp
@@ -0,0 +1,14 @@
+#include "Sprite.hpp"
+
+namespace megu {
+    Sprite::Sprite(const Texture & texture)
+    : _frame(0, 0, texture.width(), texture.height()), _texture(texture) {
+        this->_transformation.scale(static_cast<float>(texture.width()), static_cast<float>(texture.height()));
+    }
+
+    Sprite::Sprite(const Texture & texture, const glm::vec4 & frame)
+    : _frame(frame), _texture(texture) {
+        this->_transformation.move(frame.x, frame.y);
+        this->_transformation.scale(frame.z, frame.w);
+    }
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/object/Sprite.hpp b/source/engine/graphics/front/object/Sprite.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..3aab783edff4edb0ca6d2cf6611838b96bc6f53f
--- /dev/null
+++ b/source/engine/graphics/front/object/Sprite.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <engine/graphics/back/geometry/Transformable.hpp>
+#include <engine/graphics/back/textures/Texture.hpp> 
+#include <engine/graphics/front/geometry/Quads.hpp>
+
+
+namespace megu {
+    class Sprite  {
+        public:
+            Sprite(const Texture &);
+            Sprite(const Texture &, const glm::vec4 &);
+
+            inline void setFrame(const glm::vec4 & frame) {this->_frame = frame;}
+
+            inline const glm::vec4      & frame()           const {return this->_frame;}
+            inline const Texture        & texture()         const {return this->_texture;}
+            inline const Quads          & geometry()        const {return this->_geometry;}
+            inline const Transformable  & transformation()  const {return this->_transformation;}
+
+        private:
+            glm::vec4 _frame;
+            Texture _texture;
+            Quads _geometry;
+            Transformable _transformation;
+    };
+}
\ No newline at end of file
diff --git a/source/engine/graphics/utility/isometric_sorter.cpp b/source/engine/graphics/utility/isometric_sorter.cpp
index 94ae8d0dd4ed067ddd8e2656f0c77f05d68d028b..b5667389deb23a52ac29c2818064aab506928b39 100644
--- a/source/engine/graphics/utility/isometric_sorter.cpp
+++ b/source/engine/graphics/utility/isometric_sorter.cpp
@@ -1,6 +1,7 @@
 #include "isometric_sorter.hpp"
 
 #include <engine/graphics/front/object/Image.hpp>
+#include <engine/graphics/front/object/Sprite.hpp>
 
 namespace megu {
     bool isometric_sorter::operator()(const Image & img1, const Image & img2) const {
@@ -18,4 +19,20 @@ namespace megu {
 
         return &img1 > &img2;
     }
+
+    bool isometric_sorter_sprite::operator()(const Sprite & img1, const Sprite & img2) const {
+        if(img1.transformation().z() != img2.transformation().z()) {
+            return img1.transformation().z() > img2.transformation().z();
+        }
+
+        if(img1.transformation().y() != img2.transformation().y()) {
+            return img1.transformation().y() > img2.transformation().y();
+        }
+
+        if(img1.transformation().x() != img2.transformation().x()) {
+            return img1.transformation().x() > img2.transformation().x();
+        }
+
+        return &img1 > &img2;
+    }
 }
\ No newline at end of file
diff --git a/source/engine/graphics/utility/isometric_sorter.hpp b/source/engine/graphics/utility/isometric_sorter.hpp
index 6c840065780ce622b62c10abf40565dd6b80c841..1e3537dcf5461c6b98d4c87fdf293066b9888a2e 100644
--- a/source/engine/graphics/utility/isometric_sorter.hpp
+++ b/source/engine/graphics/utility/isometric_sorter.hpp
@@ -2,9 +2,15 @@
 
 namespace megu {
     class Image;
+    class Sprite;
 
     class isometric_sorter {
         public:
             bool operator()(const Image & img1, const Image & img2) const;
     };
+
+     class isometric_sorter_sprite {
+        public:
+            bool operator()(const Sprite & img1, const Sprite & img2) const;
+    };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/utility/module.hpp b/source/engine/graphics/utility/module.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..7e90914c4f77cb06704e77d6ab8bce3a5a01060a
--- /dev/null
+++ b/source/engine/graphics/utility/module.hpp
@@ -0,0 +1,16 @@
+#pragma once
+
+#include <engine/graphics/back/cameras/Camera.hpp>
+#include <engine/graphics/front/engine/TextureArray.hpp>
+#include <engine/io/Window.hpp>
+
+namespace megu {
+    template <class T>
+    class Module {
+        public:
+            virtual void render(const Window &, const Camera &, T &, const TextureArray &) = 0;
+    };
+
+    template <class ... Ts>
+    class Multi_Module : public Module<Ts> ... {};
+}
\ No newline at end of file
diff --git a/source/engine/graphics/utility/ref_set.hpp b/source/engine/graphics/utility/ref_set.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b394253f12c2b2bc7841c59118c74fd6544bd0ac
--- /dev/null
+++ b/source/engine/graphics/utility/ref_set.hpp
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <set>
+#include "reference_sorter.hpp"
+
+namespace megu {
+    template <class T>
+    using ref_set = std::set<std::reference_wrapper<T>, reference_sorter<T>>;
+}
\ No newline at end of file
diff --git a/source/main.cpp b/source/main.cpp
index 67c44ffcf6fbff4c2726e3bad23ccfcc3162933a..ab619eb05e69b826236624f7848ae536e4a86b1f 100644
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -1,4 +1,5 @@
 #include <iostream>
+#include <thread>
 
 #include <GL/glew.h>
 #include <GLFW/glfw3.h>
@@ -13,10 +14,8 @@
 #include <engine/io/Window.hpp>
 #include <engine/graphics/back/cameras/View.hpp>
 #include <engine/graphics/front/object/Image.hpp>
-#include <engine/graphics/front/group/ImageGroup.hpp>
 #include <engine/graphics/front/engine/Renderer.hpp>
 #include <engine/graphics/front/engine/Engine.hpp>
-#include <engine/graphics/front/group/VertexArrayGroup.hpp>
 #include <engine/graphics/errors.hpp>
 
 const float i_x =  1.f;
@@ -31,12 +30,14 @@ glm::vec2 to_screen_coordinate(const glm::vec2 & tile, float w, float h, float l
     };
 }
 
+/*
 megu::Vertex to_screen_coordinate(int x, int y, unsigned int u, unsigned int v, const megu::Texture & texture) {
     return {{x, y}, {static_cast<float>(u) / static_cast<float>(texture.width()), static_cast<float>(v) / static_cast<float>(texture.height())}};
 }
+*/
 
 //* Isometric : 
-/*
+
 int main(int argc, const char * argv[]) {
     try {
         //? Window
@@ -45,10 +46,6 @@ int main(int argc, const char * argv[]) {
         megu::error::opengl_error::check();
 
         std::cout << "Window Inited" << std::endl;
-
-        //? Group
-        megu::ImageGroup group;
-        megu::ImageGroup group_2;
        
         std::cout << "Group Inited" << std::endl;
 
@@ -117,10 +114,10 @@ int main(int argc, const char * argv[]) {
             ++x;
         }
 
-        for(auto & i : images) {
+        /*for(auto & i : images) {
             group.add(*i);
             i.get()->setSize({32.f, 32.f});
-        }
+        }*/
 
         std::cout << "Images 1 Inited" << std::endl;
 
@@ -159,26 +156,20 @@ int main(int argc, const char * argv[]) {
             ++x_2;
         }
 
-        for(auto & i : images_2) {
+        /*for(auto & i : images_2) {
             group_2.add(*i);
             i.get()->setSize({32.f, 32.f});
-        }
+        }*/
 
         std::cout << "Images 2 Inited" << std::endl;
 
-        //? ImGui
-        //ImGui::CreateContext();
-        //ImGui_ImplOpenGL3_Init();
-        //ImGui_ImplGlfw_InitForOpenGL(window.ptr(), true);
 
         //? Engines
         megu::GraphicEngine engine(window);
         megu::Renderer basic_renderer(360, 360);
 
         engine.push(0, basic_renderer);
-
-        engine.push(0, 0, group);
-        //engine.push(0, 0, group_2);
+        engine.push(0, 0, *images.front());
 
         //? Render Loop
         std::cout << "Render Loop Begin !" << std::endl;
@@ -209,8 +200,10 @@ int main(int argc, const char * argv[]) {
 
     return EXIT_SUCCESS;
 }
-*/
 
+
+//* Tilemap
+/*
 int main(int argc, const char * argv[]) {
     try {
         //? Window
@@ -232,10 +225,10 @@ int main(int argc, const char * argv[]) {
 
         megu::VerticesArray grid_1(megu::Quads::Primitive(), 4);
 
-        /*grid_1[0] = {{0.f,  0.f},  {0.0f,  0.0f}};
-        grid_1[1] = {{16.f, 0.f},  {0.5f,  0.0f}};
-        grid_1[2] = {{16.f, 16.f}, {0.5f,  0.5f}};
-        grid_1[3] = {{0.f,  16.f}, {0.0f,  0.5f}};*/
+        //grid_1[0] = {{0.f,  0.f},  {0.0f,  0.0f}};
+        //grid_1[1] = {{16.f, 0.f},  {0.5f,  0.0f}};
+        //grid_1[2] = {{16.f, 16.f}, {0.5f,  0.5f}};
+        //grid_1[3] = {{0.f,  16.f}, {0.0f,  0.5f}};
 
      
 
@@ -291,6 +284,96 @@ int main(int argc, const char * argv[]) {
         std::cerr << error.what() << std::endl;
     }
 
+    return EXIT_SUCCESS;
+}*/
+
+
+//* Sprite
+/*
+int main(int argc, const char * argv[]) {
+    try {
+        //? Window
+        megu::Window window;
+        window.open("Sprite Window", 360, 360);
+        megu::error::opengl_error::check();
+
+        std::cout << "Window Inited" << std::endl;
+
+        //? Group
+        megu::SpriteGroup group;
+        megu::ImageGroup group_2;
+       
+        std::cout << "Group Inited" << std::endl;
+
+        //? Grids
+
+        megu::Texture texture_1;
+        texture_1.store(megu::TextureBuffer("assets/textures/Neera.png"));
+
+        std::vector<glm::vec4> frames;
+        frames.push_back({0,   0, 51, 98});
+        frames.push_back({51,  0, 51, 98});
+        frames.push_back({102, 0, 51, 98});
+
+        frames.push_back({0,   98, 51, 98});
+        frames.push_back({51,  98, 51, 98});
+        frames.push_back({102, 98, 51, 98});
+
+        megu::Sprite neera(texture_1, frames[0]);
+        megu::Image image(texture_1);
+        //neera.scale(1.f, 1.f);
+
+        
+        group.add(neera);
+        group_2.add(image);
+
+        std::cout << "Sprite created" << std::endl;
+
+        //? Engines
+        megu::GraphicEngine engine(window);
+        megu::Renderer basic_renderer(128, 128);
+
+        engine.push(0, basic_renderer);
+        engine.push(0, 0, group);
+
+        //? Render Loop
+        std::cout << "Render Loop Begin !" << std::endl;
+
+        double previousTime = megu::Window::Time();
+        int frameCount = 0;
+
+        std::thread t([&frames, &window, &neera](){
+            size_t i = 0;
+            while(window.isOpen()) {
+                std::this_thread::sleep_for(std::chrono::milliseconds(30));
+                neera.setFrame(frames[i%frames.size()]);
+                ++i;
+            }
+        });
+
+        while(window.isOpen()) {
+            double currentTime = megu::Window::Time();
+            frameCount++;
+
+            if(currentTime - previousTime >= 1.0) {
+                window.setTitle(std::to_string(frameCount));
+
+                frameCount = 0;
+                previousTime = currentTime;
+            }
+
+            window.pollEvents();
+            engine.step();
+        }
+
+        t.join();
+        std::cout << "Render Loop End !" << std::endl;
+    }
+    catch(std::exception & error) {
+        std::cerr << error.what() << std::endl;
+    }
+
     return EXIT_SUCCESS;
 }
+*/