diff --git a/ias/__pycache__/ia_0000001.cpython-37.pyc b/ias/__pycache__/ia_0000001.cpython-37.pyc
index e02aa5a2def2e8e1079fdb021a4b0ed2bd45f74a..b62a8cd8bcd5fa43633b386fde4069f845336e53 100644
Binary files a/ias/__pycache__/ia_0000001.cpython-37.pyc and b/ias/__pycache__/ia_0000001.cpython-37.pyc differ
diff --git a/stadium/ball.pde b/stadium/ball.pde
index 54a698b74197468ec0f86206f07a5b3a0824e628..4775bb5ab87067ecd3414a72a17d6925d91a83a0 100644
--- a/stadium/ball.pde
+++ b/stadium/ball.pde
@@ -3,8 +3,9 @@ class Ball {
   float pos_y;
   float vel_x;
   float vel_y;
+  int linked_to = -1;
   Ball() {
-    this.set_velocity(0,-10);
+    this.set_velocity(0,0);
   }
   void set_position(float pos_x, float pos_y) {
     this.pos_x = pos_x;
@@ -16,6 +17,7 @@ class Ball {
     this.vel_y = vel_y;
   }
   void run(float delta_t) {
+    if(linked_to == -1)
     this.pos_x += this.vel_x*delta_t;
     this.pos_y += this.vel_y*delta_t;
     this.verify_borders();
diff --git a/stadium/game.pde b/stadium/game.pde
index e5c6227afaf10731f080854a6ee0f2117d9691ef..aa3d1474869180a6efb92f5147197de8cb2a3fb9 100644
--- a/stadium/game.pde
+++ b/stadium/game.pde
@@ -3,19 +3,23 @@ class Game {
   Team team_1;
   Team team_2;
   Ball ball;
+
+  int linked_to = -1;
+  float timestamp = 0;
+
   Game() {
     this.team_1 = new Team(1);
     this.team_2 = new Team(2);
     this.ball = new Ball();
   }
   void keep_distance(Player player_1, Player player_2) {
-    
+
     float xm = player_1.get_pos_x()/2.0 + player_2.get_pos_x()/2.0;
     float ym = player_1.get_pos_y()/2.0 + player_2.get_pos_y()/2.0;
     float dx = player_1.get_pos_x() - xm;
     float dy = player_1.get_pos_y() - ym;
     float  n = sqrt(pow(dx, 2)+pow(dy, 2));
-    
+
     if (n < 6) {
       dx *= 6/n;
       dy *= 6/n;
@@ -61,10 +65,70 @@ class Game {
     input[21] = this.ball.get_pos_y();
     return input;
   }
+  void ball_mechanic(float delta_t) {
+    if (this.linked_to == -1) {
+      this.ball.run(delta_t);
+    } else {
+      if (this.linked_to < 5) {
+        float x = this.team_1.players[this.linked_to].opening_x();
+        float y = this.team_1.players[this.linked_to].opening_y();
+        this.ball.set_position(x, y);
+        if (this.team_1.kick_catch != 0) { // kick
+          float vx = this.team_1.kick_catch*cos(this.team_1.players[this.linked_to].get_angle());
+          float vy = this.team_1.kick_catch*sin(this.team_1.players[this.linked_to].get_angle());
+          this.ball.set_velocity(vx, vy);
+          this.team_1.kick_catch = 0;
+          this.linked_to = -1;
+        }
+      } else {
+        float x = this.team_2.players[this.linked_to-5].opening_x();
+        float y = this.team_2.players[this.linked_to-5].opening_y();
+        this.ball.set_position(x, y);
+        if (this.team_2.kick_catch != 0) { //kick
+          float vx = this.team_2.kick_catch*cos(this.team_2.players[this.linked_to-5].get_angle());
+          float vy = this.team_2.kick_catch*sin(this.team_2.players[this.linked_to-5].get_angle());
+          this.ball.set_velocity(vx, vy);
+          this.team_2.kick_catch = 0;
+          this.linked_to = -1;
+        }
+      }
+    }
+    //catch
+    if (this.linked_to == -1 || this.timestamp - millis() > 500) {
+      if (random(1)>0.5) {
+        if (this.team_1.kick_catch != 0) {
+          for (int i=0; i<5; i++) {
+            float dx = this.team_1.players[i].opening_x() - this.ball.get_pos_x();
+            float dy = this.team_1.players[i].opening_y() - this.ball.get_pos_y();
+            float n = sqrt(pow(dx, 2)+pow(dy, 2));
+            if (n<1) {
+              this.team_1.kick_catch = 0;
+              this.linked_to = i;
+              this.timestamp = millis();
+            }
+          }
+        }
+      } else {
+        if (this.team_2.kick_catch != 0) {
+          for (int i=0; i<5; i++) {
+            float dx = this.team_2.players[i].opening_x() - this.ball.get_pos_x();
+            float dy = this.team_2.players[i].opening_y() - this.ball.get_pos_y();
+            float n = sqrt(pow(dx, 2)+pow(dy, 2));
+            if (n<1) {
+              this.team_2.kick_catch = 0;
+              this.linked_to = 5+i;
+              this.timestamp = millis();
+            }
+          }
+        }
+      }
+    }
+  }
   void run(float delta_t) {
-    this.ball.run(delta_t); 
+
     this.team_1.run(delta_t);
     this.team_2.run(delta_t);
+    this.ball_mechanic(delta_t);
     this.verify_colision();
   }
   void show() {
diff --git a/stadium/player.pde b/stadium/player.pde
index 88c9cbc1896d409f80589586b85f5cf3a578b5f8..fad6d174989953bb538173f843af73862d829737 100644
--- a/stadium/player.pde
+++ b/stadium/player.pde
@@ -29,8 +29,8 @@ class Player {
     this.pos_x = pos_x;
     this.pos_y = pos_y;
   }
-  void set_angle(float angle){
-     this.angle = angle; 
+  void set_angle(float angle) {
+    this.angle = angle;
   }
   float get_pos_x() {
     return this.pos_x;
@@ -38,6 +38,15 @@ class Player {
   float get_pos_y() {
     return this.pos_y;
   }
+  float get_angle() {
+    return this.angle;
+  }
+  float opening_x() {
+    return this.get_pos_x()+6*cos(this.angle);
+  }
+  float opening_y() {
+    return this.get_pos_y()+6*sin(this.angle);
+  }
   void verify_borders() {
     if (this.pos_x < -93) {
       this.pos_x = -93;
@@ -57,10 +66,10 @@ class Player {
     this.pos_y += this.vel*sin(angle)*delta_t;
     this.verify_borders();
   }
-  void showPos(){
+  void showPos() {
     textSize(2);
-    fill(255,0,0);
-    text(str(this.pos_x)+","+str(this.pos_y),0,0);
+    fill(255, 0, 0);
+    text(str(this.pos_x)+","+str(this.pos_y), 0, 0);
   }
   void show() {
     noStroke();
diff --git a/stadium/team.pde b/stadium/team.pde
index 5d7cea53d946d902ed5fe5a92e57988ffc34e95d..73fbfb594d5132c07f0fe2be2eea30f5a93f5359 100644
--- a/stadium/team.pde
+++ b/stadium/team.pde
@@ -1,9 +1,10 @@
 class Team {
-  
+
   int team = 1;
   Player[] players = new Player[5];
   int score = 0;
- 
+  float kick_catch = 0;
+
 
   Team(int team) {
     this.team = team;
@@ -19,11 +20,12 @@ class Team {
       this.players[i].set_velocity(output[i*2]);
       this.players[i].set_direction(output[i*2+1]);
     }
+    this.kick_catch = output[10];
   }
   void initialize_players() {
     int s = 1;
-    if(this.team == 2){
-       s = -1; 
+    if (this.team == 2) {
+      s = -1;
     }
     this.players[0].set_position(-80*s, 0);
     this.players[0].set_angle((PI-(s*PI))/2.0);