diff --git a/.gitmodules b/.gitmodules
index 05b9682..18e26d5 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
 [submodule "Remake"]
 	path = Remake
 	url = https://dock-it.dev/GigabiteStudios/Remake.git
+[submodule "src/vendor/box2d"]
+	path = src/vendor/box2d
+	url = https://dock-it.dev/GigabiteStudios/box2d.git
diff --git a/remake.yaml b/remake.yaml
index ce5d9f3..485d314 100644
--- a/remake.yaml
+++ b/remake.yaml
@@ -5,6 +5,8 @@ src_dirs:
   - src/src
   - src/vendor
   - src/include/lua
+  - src/vendor/box2d
+
 
 
 # Include directories (-I)
@@ -13,6 +15,8 @@ include_dirs:
   - src/include/lua
   - src/vendor
   - src/vendor/imgui
+  - src/vendor/box2d/
+
   - C:/msys64/mingw64/include
 
 # Library search paths (-L)
diff --git a/remake/build.log b/remake/build.log
index 748c248..8dab3f7 100644
--- a/remake/build.log
+++ b/remake/build.log
@@ -1,2 +1,141 @@
-[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\Entitys\Object.o src\build\utils\EngineConfig.o src\build\utils\ExceptionHandler.o src\build\utils\FileDialog.o src\build\utils\GameObjectsList.o src\build\utils\Logging.o src\build\utils\Profiler.o src\build\utils\Shader.o src\build\utils\UID.o src\build\utils\utils.o src\build\imgui\imgui.o src\build\imgui\imgui_demo.o src\build\imgui\imgui_draw.o src\build\imgui\imgui_impl_glfw.o src\build\imgui\imgui_impl_opengl3.o src\build\imgui\imgui_tables.o src\build\imgui\imgui_widgets.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto
-[RUN] Executed app.exe successfully.
+[ERROR] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d/ -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Components\PhysicsComponent.cpp -o src\build\Components\PhysicsComponent.o
+cc1plus.exe: warning: C:\msys64\mingw64\lib\libyaml-cpp.a: not a directory
+In file included from C:/msys64/mingw64/include/yaml-cpp/parser.h:13,
+                 from C:/msys64/mingw64/include/yaml-cpp/yaml.h:10,
+                 from src\src\Components\Component.h:5,
+                 from src\src\Components\PhysicsComponent.h:2,
+                 from src\src\Components\PhysicsComponent.cpp:1:
+C:/msys64/mingw64/include/yaml-cpp/dll.h:22:65: note: '#pragma message: Defining YAML_CPP_API for DLL import'
+   22 | #        pragma message( "Defining YAML_CPP_API for DLL import" )
+      |                                                                 ^
+src\src\Components\PhysicsComponent.h:13:21: error: 'b2World' has not been declared
+   13 |     void CreateBody(b2World* world, const glm::vec2& position);
+      |                     ^~~~~~~
+src\src\Components\PhysicsComponent.h:13:43: error: 'glm' does not name a type
+   13 |     void CreateBody(b2World* world, const glm::vec2& position);
+      |                                           ^~~
+src\src\Components\PhysicsComponent.h:13:52: error: expected unqualified-id before '&' token
+   13 |     void CreateBody(b2World* world, const glm::vec2& position);
+      |                                                    ^
+src\src\Components\PhysicsComponent.h:13:52: error: expected ')' before '&' token
+   13 |     void CreateBody(b2World* world, const glm::vec2& position);
+      |                    ~                               ^
+      |                                                    )
+src\src\Components\PhysicsComponent.h:13:52: error: expected ';' at end of member declaration
+   13 |     void CreateBody(b2World* world, const glm::vec2& position);
+      |                                                    ^
+      |                                                     ;
+src\src\Components\PhysicsComponent.h:13:54: error: 'position' does not name a type
+   13 |     void CreateBody(b2World* world, const glm::vec2& position);
+      |                                                      ^~~~~~~~
+src\src\Components\PhysicsComponent.h:16:28: error: 'glm' does not name a type
+   16 |     void SetVelocity(const glm::vec2& vel);
+      |                            ^~~
+src\src\Components\PhysicsComponent.h:16:37: error: expected unqualified-id before '&' token
+   16 |     void SetVelocity(const glm::vec2& vel);
+      |                                     ^
+src\src\Components\PhysicsComponent.h:16:37: error: expected ')' before '&' token
+   16 |     void SetVelocity(const glm::vec2& vel);
+      |                     ~               ^
+      |                                     )
+src\src\Components\PhysicsComponent.h:16:37: error: expected ';' at end of member declaration
+   16 |     void SetVelocity(const glm::vec2& vel);
+      |                                     ^
+      |                                      ;
+src\src\Components\PhysicsComponent.h:16:39: error: 'vel' does not name a type
+   16 |     void SetVelocity(const glm::vec2& vel);
+      |                                       ^~~
+src\src\Components\PhysicsComponent.h:17:5: error: 'glm' does not name a type
+   17 |     glm::vec2 GetVelocity() const;
+      |     ^~~
+src\src\Components\PhysicsComponent.h:29:5: error: 'b2Body' does not name a type; did you mean 'b2BodyId'?
+   29 |     b2Body* body = nullptr;
+      |     ^~~~~~
+      |     b2BodyId
+src\src\Components\PhysicsComponent.h:30:5: error: 'b2World' does not name a type; did you mean 'b2WorldId'?
+   30 |     b2World* world = nullptr;
+      |     ^~~~~~~
+      |     b2WorldId
+src\src\Components\PhysicsComponent.h:26:10: error: 'void PhysicsComponent::OnImGuiInspector()' marked 'override', but does not override
+   26 |     void OnImGuiInspector() override;
+      |          ^~~~~~~~~~~~~~~~
+src\src\Components\PhysicsComponent.cpp: In constructor 'PhysicsComponent::PhysicsComponent(BodyType, float, float)':
+src\src\Components\PhysicsComponent.cpp:6:46: error: no matching function for call to 'Component::Component()'
+    6 |     : type(type), width(width), height(height) {}
+      |                                              ^
+src\src\Components\Component.h:13:5: note: candidate: 'Component::Component(Object*)'
+   13 |     Component(Object* owner) : owner(owner) {}
+      |     ^~~~~~~~~
+src\src\Components\Component.h:13:5: note:   candidate expects 1 argument, 0 provided
+src\src\Components\Component.h:11:7: note: candidate: 'constexpr Component::Component(const Component&)'
+   11 | class Component {
+      |       ^~~~~~~~~
+src\src\Components\Component.h:11:7: note:   candidate expects 1 argument, 0 provided
+src\src\Components\PhysicsComponent.cpp: At global scope:
+src\src\Components\PhysicsComponent.cpp:12:6: error: variable or field 'CreateBody' declared void
+   12 | void PhysicsComponent::CreateBody(b2World* world, const glm::vec2& position) {
+      |      ^~~~~~~~~~~~~~~~
+src\src\Components\PhysicsComponent.cpp:12:35: error: 'b2World' was not declared in this scope; did you mean 'b2WorldId'?
+   12 | void PhysicsComponent::CreateBody(b2World* world, const glm::vec2& position) {
+      |                                   ^~~~~~~
+      |                                   b2WorldId
+src\src\Components\PhysicsComponent.cpp:12:44: error: 'world' was not declared in this scope
+   12 | void PhysicsComponent::CreateBody(b2World* world, const glm::vec2& position) {
+      |                                            ^~~~~
+src\src\Components\PhysicsComponent.cpp:12:51: error: expected primary-expression before 'const'
+   12 | void PhysicsComponent::CreateBody(b2World* world, const glm::vec2& position) {
+      |                                                   ^~~~~
+src\src\Components\PhysicsComponent.cpp: In member function 'void PhysicsComponent::DestroyBody()':
+src\src\Components\PhysicsComponent.cpp:39:9: error: 'body' was not declared in this scope
+   39 |     if (body && world) {
+      |         ^~~~
+src\src\Components\PhysicsComponent.cpp:39:17: error: 'world' was not declared in this scope
+   39 |     if (body && world) {
+      |                 ^~~~~
+src\src\Components\PhysicsComponent.cpp: At global scope:
+src\src\Components\PhysicsComponent.cpp:45:6: error: no declaration matches 'void PhysicsComponent::SetVelocity(const glm::vec2&)'
+   45 | void PhysicsComponent::SetVelocity(const glm::vec2& vel) {
+      |      ^~~~~~~~~~~~~~~~
+src\src\Components\PhysicsComponent.h:16:10: note: candidate is: 'void PhysicsComponent::SetVelocity(...) &'
+   16 |     void SetVelocity(const glm::vec2& vel);
+      |          ^~~~~~~~~~~
+src\src\Components\PhysicsComponent.h:6:7: note: 'class PhysicsComponent' defined here
+    6 | class PhysicsComponent : public Component {
+      |       ^~~~~~~~~~~~~~~~
+src\src\Components\PhysicsComponent.cpp:49:11: error: no declaration matches 'glm::vec2 PhysicsComponent::GetVelocity() const'
+   49 | glm::vec2 PhysicsComponent::GetVelocity() const {
+      |           ^~~~~~~~~~~~~~~~
+src\src\Components\PhysicsComponent.cpp:49:11: note: no functions named 'glm::vec2 PhysicsComponent::GetVelocity() const'
+src\src\Components\PhysicsComponent.h:6:7: note: 'class PhysicsComponent' defined here
+    6 | class PhysicsComponent : public Component {
+      |       ^~~~~~~~~~~~~~~~
+src\src\Components\PhysicsComponent.cpp: In member function 'void PhysicsComponent::SetFriction(float)':
+src\src\Components\PhysicsComponent.cpp:59:9: error: 'body' was not declared in this scope
+   59 |     if (body && body->GetFixtureList())
+      |         ^~~~
+src\src\Components\PhysicsComponent.cpp: In member function 'void PhysicsComponent::SetFixedRotation(bool)':
+src\src\Components\PhysicsComponent.cpp:70:9: error: 'body' was not declared in this scope
+   70 |     if (body)
+      |         ^~~~
+src\src\Components\PhysicsComponent.cpp: In member function 'void PhysicsComponent::SyncFromPhysics()':
+src\src\Components\PhysicsComponent.cpp:75:9: error: 'body' was not declared in this scope
+   75 |     if (body) {
+      |         ^~~~
+src\src\Components\PhysicsComponent.cpp:77:9: error: 'object' was not declared in this scope; did you mean 'Object'?
+   77 |         object->SetLocalPosition({ pos.x, pos.y });
+      |         ^~~~~~
+      |         Object
+src\src\Components\PhysicsComponent.cpp: In member function 'void PhysicsComponent::SyncToPhysics()':
+src\src\Components\PhysicsComponent.cpp:82:9: error: 'body' was not declared in this scope
+   82 |     if (body) {
+      |         ^~~~
+src\src\Components\PhysicsComponent.cpp:83:25: error: 'object' was not declared in this scope; did you mean 'Object'?
+   83 |         glm::vec2 pos = object->GetLocalPosition();
+      |                         ^~~~~~
+      |                         Object
+src\src\Components\PhysicsComponent.cpp: In member function 'void PhysicsComponent::OnImGuiInspector()':
+src\src\Components\PhysicsComponent.cpp:90:21: error: 'GetVelocity' was not declared in this scope; did you mean 'SetVelocity'?
+   90 |     glm::vec2 vel = GetVelocity();
+      |                     ^~~~~~~~~~~
+      |                     SetVelocity
+
diff --git a/src/src/Components/PhysicsComponent.cpp b/src/src/Components/PhysicsComponent.cpp
new file mode 100644
index 0000000..060e8e5
--- /dev/null
+++ b/src/src/Components/PhysicsComponent.cpp
@@ -0,0 +1,99 @@
+#include "PhysicsComponent.h"
+#include "../Entitys/Object.h"
+#include "imgui.h"
+
+PhysicsComponent::PhysicsComponent(BodyType type, float width, float height)
+    : type(type), width(width), height(height) {}
+
+PhysicsComponent::~PhysicsComponent() {
+    DestroyBody();
+}
+
+void PhysicsComponent::CreateBody(b2World* world, const glm::vec2& position) {
+    this->world = world;
+    b2BodyDef def;
+
+    switch (type) {
+        case BodyType::Static:    def.type = b2_staticBody; break;
+        case BodyType::Dynamic:   def.type = b2_dynamicBody; break;
+        case BodyType::Kinematic: def.type = b2_kinematicBody; break;
+    }
+
+    def.position.Set(position.x, position.y);
+    def.fixedRotation = fixedRotation;
+
+    body = world->CreateBody(&def);
+
+    b2PolygonShape box;
+    box.SetAsBox(width * 0.5f, height * 0.5f);
+
+    b2FixtureDef fixtureDef;
+    fixtureDef.shape = &box;
+    fixtureDef.density = density;
+    fixtureDef.friction = friction;
+
+    body->CreateFixture(&fixtureDef);
+}
+
+void PhysicsComponent::DestroyBody() {
+    if (body && world) {
+        world->DestroyBody(body);
+        body = nullptr;
+    }
+}
+
+void PhysicsComponent::SetVelocity(const glm::vec2& vel) {
+    if (body) body->SetLinearVelocity(b2Vec2(vel.x, vel.y));
+}
+
+glm::vec2 PhysicsComponent::GetVelocity() const {
+    if (body) {
+        b2Vec2 v = body->GetLinearVelocity();
+        return { v.x, v.y };
+    }
+    return {};
+}
+
+void PhysicsComponent::SetFriction(float f) {
+    friction = f;
+    if (body && body->GetFixtureList())
+        body->GetFixtureList()->SetFriction(f);
+}
+
+void PhysicsComponent::SetDensity(float d) {
+    density = d;
+    // requires refixture for update
+}
+
+void PhysicsComponent::SetFixedRotation(bool fixed) {
+    fixedRotation = fixed;
+    if (body)
+        body->SetFixedRotation(fixed);
+}
+
+void PhysicsComponent::SyncFromPhysics() {
+    if (body) {
+        b2Vec2 pos = body->GetPosition();
+        object->SetLocalPosition({ pos.x, pos.y });
+    }
+}
+
+void PhysicsComponent::SyncToPhysics() {
+    if (body) {
+        glm::vec2 pos = object->GetLocalPosition();
+        body->SetTransform({ pos.x, pos.y }, body->GetAngle());
+    }
+}
+
+void PhysicsComponent::OnImGuiInspector() {
+    ImGui::Text("Physics Body");
+    glm::vec2 vel = GetVelocity();
+    ImGui::DragFloat2("Velocity", &vel.x);
+    SetVelocity(vel);
+
+    if (ImGui::DragFloat("Friction", &friction, 0.01f, 0.0f, 1.0f))
+        SetFriction(friction);
+
+    if (ImGui::Checkbox("Fixed Rotation", &fixedRotation))
+        SetFixedRotation(fixedRotation);
+}
diff --git a/src/src/Components/PhysicsComponent.h b/src/src/Components/PhysicsComponent.h
new file mode 100644
index 0000000..2c21925
--- /dev/null
+++ b/src/src/Components/PhysicsComponent.h
@@ -0,0 +1,37 @@
+#pragma once
+#include "Component.h"
+#include "box2d/box2d.h"
+#include <memory>
+
+class PhysicsComponent : public Component {
+public:
+    enum class BodyType { Static, Dynamic, Kinematic };
+
+    PhysicsComponent(Object* owner, BodyType type = BodyType::Dynamic, float width = 1.0f, float height = 1.0f);
+
+    ~PhysicsComponent();
+
+    void CreateBody(b2World* world, const glm::vec2& position);
+    void DestroyBody();
+
+    void SetVelocity(const glm::vec2& vel);
+    glm::vec2 GetVelocity() const;
+
+    void SetFriction(float friction);
+    void SetDensity(float density);
+    void SetFixedRotation(bool fixed);
+
+    void SyncFromPhysics();
+    void SyncToPhysics();
+
+    void OnImGuiInspector() override;
+
+private:
+    b2Body* body = nullptr;
+    b2World* world = nullptr;
+    BodyType type;
+    float width, height;
+    float friction = 0.3f;
+    float density = 1.0f;
+    bool fixedRotation = false;
+};
diff --git a/src/vendor/box2d b/src/vendor/box2d
new file mode 160000
index 0000000..3e96863
--- /dev/null
+++ b/src/vendor/box2d
@@ -0,0 +1 @@
+Subproject commit 3e968638a5d0b0ff7ff0dd5a1e8e88844927b2d2