diff --git a/CelestialObject.c b/CelestialObject.c
index ea0fedc53bc0429516481295cb7b421160483144..1a5b389f93050ee0c61cea2d870fafbf08d2c113 100644
--- a/CelestialObject.c
+++ b/CelestialObject.c
@@ -9,7 +9,7 @@ CelestialObject *celestial_object_create(double mass, Vector2 position) {
     CelestialObject *object = (CelestialObject*)malloc(sizeof(CelestialObject));
 
     object->mass = mass;
-    // object->previous_position = NULL;
+    object->previous_position = vector2_create_zero();
     object->current_position = position;
 
     return object;
diff --git a/Makefile b/Makefile
index d8a47db4a47df911674645f3cb0713e13feb3172..1e2510a3cb168f3425c6464fde18c7006ce57e95 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 TARGET = main
 CC:=gcc
 # CFLAGS:=-g -Ofast -Wall -Wextra -fsanitize=address -fsanitize=leak -std=gnu11
-CFLAGS:=-fsanitize=address
+# CFLAGS:=-fsanitize=address
 LDFLAGS:=-lm -lSDL2
 VPATH:=gfx
 
diff --git a/SolarSystem.c b/SolarSystem.c
index 1c79cd2150f1c639c8d956e2955849ead4e6c62b..71e63fb6dd2b84167958d589d8de8fd886177914 100644
--- a/SolarSystem.c
+++ b/SolarSystem.c
@@ -8,43 +8,74 @@
 
 #define SCREEN_WIDTH 1000
 #define SCREEN_HEIGHT 1000
+const double G = 6.67430 * 1E-11;
 
 SolarSystem *solar_system_create(double interval) {
     SolarSystem *solar_system = (SolarSystem *)malloc(sizeof(SolarSystem));
 
-    solar_system->objects_length = 2;
+    solar_system->objects_length = 3;
     solar_system->objects = (CelestialObject **)malloc(sizeof(SolarSystem *) * solar_system->objects_length);
+    solar_system->interval = interval;
 
     solar_system->objects[0] = celestial_object_create(1.989 * 1E30, vector2_create(0, 0));
 
     double perihelion_1 = 149.6 * 1E9 * (1 - 0.01671123);
     solar_system->objects[1] = celestial_object_create(5.972 * 1E24, vector2_create(-perihelion_1, 0));
 
-    // const double MARS_MASS = 6.39 * 1E23;
-    // double e_2 = 0.0934;
-    // double semi_major_2 = 227.9 * 1E9;
-    // double perihelion_2 = semi_major_2 * (1 - e_2);
-    // Vector2 *mars_position = vector2_create(-perihelion_2, 0);
-    // solar_system->celestial_objects[2] = celestial_object_create(MARS_MASS, mars_position);
-
-    // const double VENUS_MASS = 4.867 * 1E24;
-    // double e_3 = 0.00678;
-    // double semi_major_3 = 108.2095 * 1E9;
-    // double perihelion_3 = semi_major_3 * (1 - e_3);
-    // Vector2 *venus_position = vector2_create(-perihelion_3, 0);
-    // solar_system->celestial_objects[3] = celestial_object_create(VENUS_MASS, venus_position);
+    double perihelion_2 = 227.9 * 1E9 * (1 - 0.0934);
+    solar_system->objects[2] = celestial_object_create(6.39 * 1E23, vector2_create(-perihelion_2, 0));
 
     return solar_system;
 }
 
+Vector2 gravit(CelestialObject *sun, CelestialObject *b) {
+    Vector2 r = vector2_multiply(b->current_position, -1);
+    double afff = G * sun->mass * b->mass * (1.0 / pow(vector2_norm(r), 3));
+    Vector2 f = vector2_multiply(r, afff);
+    Vector2 a = vector2_multiply(f, 1.0 / b->mass);
+    return a;
+}
+
 void solar_system_update(SolarSystem *solar_system) {
+    for (int32_t i = 1; i < solar_system->objects_length; i += 1) {
+        CelestialObject *object = solar_system->objects[i];
+
+        if (vector2_is_zero(solar_system->objects[i]->previous_position)) {
+            // https://i.ytimg.com/vi/hbEbD1Z_tNQ/maxresdefault.jpg
+
+            CelestialObject *star = solar_system->objects[0];
+            double perihelion_speed = 0;
+
+            if (i == 1) {
+                perihelion_speed = sqrt((G * star->mass * (1 + 0.01671123)) / (149.6 * 1E9 * (1 - 0.01671123)));
+            } else if (i == 2) {
+                perihelion_speed = sqrt((G * star->mass * (1 + 0.0934)) / (227.9 * 1E9 * (1 - 0.0934)));
+                printf("%lf\n", perihelion_speed);
+            }
+
+            Vector2 tmp = object->current_position;
+            Vector2 r = vector2_normalize(vector2_create(-tmp.y, tmp.x));
+            Vector2 v = vector2_multiply(r, perihelion_speed);
+
+            Vector2 current_position = object->current_position;
+            Vector2 new_position = vector2_add(current_position, vector2_multiply(v, solar_system->interval));
+            object->previous_position = object->current_position;
+            object->current_position = new_position;
+        } else {
+            Vector2 new_position = vector2_substract(vector2_multiply(object->current_position, 2), object->previous_position);
+            Vector2 a = gravit(solar_system->objects[0], object);
+            new_position = vector2_add(new_position, vector2_multiply(a, pow(solar_system->interval, 2)));
+            object->previous_position = object->current_position;
+            object->current_position = new_position;
+        }
+    }
 }
 
 void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context) {
     for (uint32_t i = 0; i < solar_system->objects_length; i += 1) {
         CelestialObject *object = solar_system->objects[i];
 
-        Vector2 scaled_position = vector2_multiply(object->current_position, 1.0 / (227.9 * 1E9 * 1.1));
+        Vector2 scaled_position = vector2_multiply(object->current_position, 1.0 / (300 * 1E9));
         scaled_position = vector2_fit_canvas(scaled_position, SCREEN_WIDTH, SCREEN_HEIGHT);
 
         if (i == 0) {
@@ -56,11 +87,7 @@ void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context)
         }
 
         if (i == 2) {
-            draw_full_circle(context, scaled_position.x, scaled_position.y, 8, COLOR_RED);
-        }
-
-        if (i == 3) {
-            draw_full_circle(context, scaled_position.x, scaled_position.y, 15, COLOR_GREEN);
+            draw_full_circle(context, scaled_position.x, scaled_position.y, 10, COLOR_RED);
         }
     }
 }
diff --git a/SolarSystem.h b/SolarSystem.h
index 139a1253eab62d9384826d03221586a926a16978..a9f10107c5a91daaa50c62e2b19881d08c4479fd 100644
--- a/SolarSystem.h
+++ b/SolarSystem.h
@@ -9,6 +9,7 @@
 typedef struct {
     uint32_t objects_length;
     CelestialObject **objects;
+    double interval;
 } SolarSystem;
 
 SolarSystem *solar_system_create(double interval);
diff --git a/Vector2.c b/Vector2.c
index 8e91e99d1fdc5de0117b3110485ae022f356487f..0770586bcb122fb80859f8a33e6a00b29c987728 100644
--- a/Vector2.c
+++ b/Vector2.c
@@ -13,6 +13,10 @@ Vector2 vector2_create_zero() {
     return vector2_create(0, 0);
 }
 
+bool vector2_is_zero(Vector2 v) {
+    return v.x == 0 && v.y == 0;
+}
+
 Vector2 vector2_add(Vector2 a, Vector2 b) {
     return vector2_create(a.x + b.x, a.y + b.y);
 }
diff --git a/Vector2.h b/Vector2.h
index 1045c99ea563cd3b1d9adf3aba97158d673e2176..5193d60d64997442db950d8b138b51541b128827 100644
--- a/Vector2.h
+++ b/Vector2.h
@@ -12,6 +12,7 @@ struct Vector2 {
 
 Vector2 vector2_create(double x, double y);
 Vector2 vector2_create_zero();
+bool vector2_is_zero(Vector2 v);
 Vector2 vector2_add(Vector2 a, Vector2 b);
 Vector2 vector2_substract(Vector2 a, Vector2 b);
 Vector2 vector2_multiply(Vector2 v, double scalar);
diff --git a/main.c b/main.c
index 30429fa7dbb041ffcf01aa71b4ed67ca24129f20..332db2e753df5adbcb048f227a25df5f7b43a309 100644
--- a/main.c
+++ b/main.c
@@ -21,12 +21,13 @@ int main() {
         return EXIT_FAILURE;
     }
 
-    SolarSystem *solar_system = solar_system_create(0);
+    SolarSystem *solar_system = solar_system_create(10000);
 
     while (true) {
         gfx_present(context);
         gfx_clear(context, COLOR_BLACK);
 
+        solar_system_update(solar_system);
         solar_system_draw(solar_system, context);
 
         if (gfx_keypressed() == SDLK_ESCAPE) {