diff --git a/main.c b/main.c
index b3a6193ba593778ea14e4375d17801b05ffd6e30..28d9b562b50743de0252a976c104fb8d2d0ba6f0 100755
--- a/main.c
+++ b/main.c
@@ -8,20 +8,16 @@
 #define SCREEN_WIDTH 1000
 #define SCREEN_HEIGHT 1000
 
-// arbitraire, en secondes ?
-#define DELTA_T 0.125
-
 int main() {
 	srand(time(NULL));
-	struct gfx_context_t *ctxt =
-			gfx_create("Planetary system", SCREEN_WIDTH, SCREEN_HEIGHT);
+	struct gfx_context_t *ctxt = gfx_create("Planetary system", SCREEN_WIDTH, SCREEN_HEIGHT);
 	if (!ctxt) {
 		fprintf(stderr, "Graphics initialization failed!\n");
 		return EXIT_FAILURE;
 	}
 
 	// TODO : create your system
-	system_t sys = create_system(DELTA_T);
+	system_t sys = create_system(0.125);
 	// end : create system
 	while (true) {
 		gfx_present(ctxt);
diff --git a/planet/constants.h b/planet/constants.h
index 9eaf91213947f1ebe65b6e44894db3928cbab9b4..7e90817a807a43b70e356b7d0f990c527a16d8a6 100644
--- a/planet/constants.h
+++ b/planet/constants.h
@@ -5,28 +5,29 @@
 #define G 6.67e-11
 #define M_SOLEIL 1.989e30
 
-// source: CRM
+// mass
 #define M_TERRE     5.9742e24
-// source: wiki
 #define M_MERCURE   3.3011e23
 #define M_VENUS     4.8675e24
 #define M_MARS      6.4171e23
 
+// major axis
 #define A_MERCURE   5.7909e10
 #define A_VENUS     1.0821e11
 #define A_TERRE     1.4960e11
 #define A_MARS      2.2794e11
 
+// excentricity
 #define E_MERCURE   0.205630
 #define E_VENUS     0.006772
 #define E_TERRE     0.0167086
 #define E_MARS      0.0934
 
-//TODO: perihelion
-#define PER_MERCURE
-#define PER_VENUS
-#define PER_TERRE
-#define PER_MARS
+// perihelion
+#define PER_MERCURE 4.60012e10
+#define PER_VENUS   1.07477e11
+#define PER_TERRE   1.47095e11
+#define PER_MARS    2.06700e11
 
 
 #endif //PLANET_CONSTANTS_H
diff --git a/planet/planet.c b/planet/planet.c
index a6cbbd74b069f23780f7814acc763272035886db..362ed761cc4b46f07fc53c16b6b6fbc9a3927252 100755
--- a/planet/planet.c
+++ b/planet/planet.c
@@ -47,7 +47,28 @@ system_t create_system(double delta_t) {
 void show_system(struct gfx_context_t *ctxt, system_t *system);
 
 
-void update_system(system_t *system, double delta_t);
+void update_system(system_t *system, double delta_t) {
+	for (uint32_t i = 0; i < system->nb_planets; ++i) {
+		// apply the effects of the sun
+		vec2 a = vec2_mul((G * system->star.mass) / r_star_2, vec2_normalize(system->planets[i].pos));
+		// apply the effects of all other planets
+		for (uint32_t k = 0; k < system->nb_planets; ++k) {
+			if (k == i) continue;
+			const vec2 r_ik = vec2_sub(system->planets[k].pos, system->planets[i].pos);
+			const vec2 u = vec2_normalize(r_ik);  // unit vector from planet i to planet k
+			// force already divided by system->planets[i].mass to get acceleration
+			const double a_norm = (G * system->planets[k].mass) / vec2_norm_sqr(r_ik);
+			const vec2 a_k = vec2_mul(a_norm, u);
+			a = vec2_add(a, a_k);
+		}
+		// update position
+		vec2 next_pos = vec2_mul(2.0, system->planets[i].pos);
+		next_pos = vec2_sub(next_pos, system->planets[i].prec_pos);
+		next_pos = vec2_add(next_pos, vec2_mul(delta_t * delta_t, a));
+		system->planets[i].prec_pos = system->planets[i].pos;
+		system->planets[i].pos = next_pos;
+	}
+}
 
 
 void free_system(system_t *system);