diff --git a/app/Models/Bike.php b/app/Models/Bike.php
new file mode 100644
index 0000000000000000000000000000000000000000..05c406f1ad5065fdd508355e34404aa34f5746ac
--- /dev/null
+++ b/app/Models/Bike.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\HasMany;
+
+/**
+ * @method static create(array $array)
+ */
+class Bike extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'stop_id',
+        'unlocked',
+    ];
+
+    public function stop(): BelongsTo{
+        return $this->belongsTo(Stop::class);
+    }
+
+    public function routes(): HasMany{
+        return $this->hasMany(Route::class);
+    }
+}
diff --git a/app/Models/ElectricBike.php b/app/Models/ElectricBike.php
new file mode 100644
index 0000000000000000000000000000000000000000..8991516c9ecc90fa3e9b6aee3eec9e8241a4c42e
--- /dev/null
+++ b/app/Models/ElectricBike.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class ElectricBike extends Bike
+{
+    use HasFactory;
+    protected $table = 'electric_bikes';
+
+    protected $fillable = [
+        'id',
+        'battery',
+    ];
+}
diff --git a/app/Models/Reward.php b/app/Models/Reward.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b40b1923ef096321fe69d667b3787dc7775a995
--- /dev/null
+++ b/app/Models/Reward.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+
+/**
+ * @method static create(array $array)
+ */
+class Reward extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'title',
+        'description',
+        'user_id',
+        'reward_id',
+    ];
+
+    public function users(): BelongsToMany{
+        return $this->belongsToMany(User::class, 'user_reward')->withTimestamps();
+    }
+}
diff --git a/app/Models/Route.php b/app/Models/Route.php
new file mode 100644
index 0000000000000000000000000000000000000000..987300d4f49784fd77de0ebeaee262d4367febb0
--- /dev/null
+++ b/app/Models/Route.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class Route extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        "user_id",
+        "initial_stop_id",
+        "final_stop_id",
+        "bike_id",
+        "distance",
+        "duration",
+        "points",
+    ];
+
+    public function user(): BelongsTo{
+        return $this->belongsTo(Route::class);
+    }
+
+    public function start(): BelongsTo{
+        return $this->belongsTo(Stop::class,'initial_stop_id');
+    }
+
+    public function end(): BelongsTo{
+        return $this->belongsTo(Stop::class, "final_stop_id");
+    }
+
+    public function bike(): BelongsTo{
+        return $this->belongsTo(Bike::class);
+    }
+}
diff --git a/app/Models/Stop.php b/app/Models/Stop.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a256761eadb23783b69fb544495495482c5101b
--- /dev/null
+++ b/app/Models/Stop.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\HasMany;
+
+/**
+ * @method static create(array $array)
+ */
+class Stop extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        "lng",
+        "lat",
+        "address",
+        "total_spaces"
+    ];
+
+    public function bikes(): HasMany{
+        return $this->hasMany(Bike::class);
+    }
+
+    public function routes(): HasMany{
+        return $this->hasMany(Route::class);
+    }
+
+    public function routesStart(): HasMany{
+        return $this->hasMany(Route::class, "initial_stop_id");
+    }
+    public function routesEnd(): HasMany{
+        return $this->hasMany(Route::class, "final_stop_id");
+    }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
index 89963686eb21407d17eea9a5871d88658ff32d2b..aea9982747212ebf54344dcd3e3e63624f17e195 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -4,10 +4,15 @@ namespace App\Models;
 
 use Illuminate\Contracts\Auth\MustVerifyEmail;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use Illuminate\Notifications\Notifiable;
 use Laravel\Sanctum\HasApiTokens;
 
+/**
+ * @method static create(string[] $array)
+ */
 class User extends Authenticatable
 {
     use HasApiTokens, HasFactory, Notifiable;
@@ -41,4 +46,12 @@ class User extends Authenticatable
     protected $casts = [
         'email_verified_at' => 'datetime',
     ];
+
+    public function routes(): HasMany{
+        return $this->hasMany(Route::class);
+    }
+
+    public function rewards(): BelongsToMany{
+        return $this->belongsToMany(Reward::class, 'user_reward')->withTimestamps();
+    }
 }
diff --git a/database/factories/BikeFactory.php b/database/factories/BikeFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..12ae306c4d54dc0b9168f5f7dfca381dd7b5a9d7
--- /dev/null
+++ b/database/factories/BikeFactory.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Database\Factories;
+
+use Illuminate\Database\Eloquent\Factories\Factory;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Bike>
+ */
+class BikeFactory extends Factory
+{
+    /**
+     * Define the model's default state.
+     *
+     * @return array<string, mixed>
+     */
+    public function definition()
+    {
+        return [
+        ];
+    }
+}
diff --git a/database/factories/RewardFactory.php b/database/factories/RewardFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..59512b6f56594fa9b882a2442a79ae649efdf113
--- /dev/null
+++ b/database/factories/RewardFactory.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Database\Factories;
+
+use Illuminate\Database\Eloquent\Factories\Factory;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Reward>
+ */
+class RewardFactory extends Factory
+{
+    /**
+     * Define the model's default state.
+     *
+     * @return array<string, mixed>
+     */
+    public function definition()
+    {
+        return [
+            //
+        ];
+    }
+}
diff --git a/database/factories/StopFactory.php b/database/factories/StopFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..64c002db49ede211104b71a1810b6e1085103305
--- /dev/null
+++ b/database/factories/StopFactory.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Database\Factories;
+
+use Illuminate\Database\Eloquent\Factories\Factory;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Stop>
+ */
+class StopFactory extends Factory
+{
+    /**
+     * Define the model's default state.
+     *
+     * @return array<string, mixed>
+     */
+    public function definition()
+    {
+        return [
+            'lng' => $this->faker->longitude,
+            'lat' => $this->faker->latitude,
+            'address' => $this->faker->address,
+            'total_spaces' => 10,
+        ];
+    }
+}
diff --git a/database/migrations/2022_06_13_141748_create_stops_table.php b/database/migrations/2022_06_13_141748_create_stops_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..aaae4947d33c64596ea06602269abd20c86c56ba
--- /dev/null
+++ b/database/migrations/2022_06_13_141748_create_stops_table.php
@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('stops', function (Blueprint $table) {
+            $table->id();
+            $table->double("lng");
+            $table->double("lat");
+            $table->string("address");
+            $table->integer("total_spaces");
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('stops');
+    }
+};
diff --git a/database/migrations/2022_06_13_151027_create_bikes_table.php b/database/migrations/2022_06_13_151027_create_bikes_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..705aadf3aab4c15459a871baf8f83029d9027fd8
--- /dev/null
+++ b/database/migrations/2022_06_13_151027_create_bikes_table.php
@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('bikes', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('stop_id')
+                ->index()
+                ->constrained()
+                ->cascadeOnUpdate();
+            $table->boolean('unlocked');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('bikes');
+    }
+};
diff --git a/database/migrations/2022_06_13_153838_create_electric_bikes_table.php b/database/migrations/2022_06_13_153838_create_electric_bikes_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..db6b5b73b5caf8e379b40e3ae2d58610f49de036
--- /dev/null
+++ b/database/migrations/2022_06_13_153838_create_electric_bikes_table.php
@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('electric_bikes', function (Blueprint $table) {
+            $table->id();
+            $table->integer('battery');
+            $table->timestamps();
+
+            $table->foreign('id')->references('id')->on('bikes');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('electric_bikes');
+    }
+};
diff --git a/database/migrations/2022_06_14_151011_create_routes_table.php b/database/migrations/2022_06_14_151011_create_routes_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..51d6e35c0c2649c5fa6426286baeef6404e100b9
--- /dev/null
+++ b/database/migrations/2022_06_14_151011_create_routes_table.php
@@ -0,0 +1,69 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('routes', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('user_id')
+                ->index()
+                ->constrained()
+                ->cascadeOnUpdate()
+                ->cascadeOnDelete();
+
+            $table->bigInteger('initial_stop_id')
+                ->index();
+            $table->foreign('initial_stop_id')
+                ->references('id')
+                ->on('stops')
+                ->onUpdate('cascade')
+                ->onDelete('cascade');
+
+            $table->bigInteger('final_stop_id')
+                ->index()
+                ->nullable();
+            $table->foreign('final_stop_id')
+                ->references('id')
+                ->on('stops')
+                ->onUpdate('cascade')
+                ->onDelete('cascade');
+
+            $table->foreignId('bike_id')
+                ->index()
+                ->constrained()
+                ->cascadeOnUpdate()
+                ->cascadeOnDelete();
+
+            $table->integer('distance')
+                ->nullable();
+            $table->integer('duration')
+                ->nullable();
+            $table->integer('points')
+                ->nullable();
+
+            $table->json('mapbox_response')
+                ->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('routes');
+    }
+};
diff --git a/database/migrations/2022_06_15_144408_create_rewards_table.php b/database/migrations/2022_06_15_144408_create_rewards_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..deebdc13d82e5969780f3d6271f280245a308ef3
--- /dev/null
+++ b/database/migrations/2022_06_15_144408_create_rewards_table.php
@@ -0,0 +1,50 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('rewards', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->string('description');
+            $table->integer('points');
+            $table->integer('total_available');
+            $table->string('image')->nullable();
+            $table->timestamps();
+        });
+
+        Schema::create('user_reward', function (Blueprint $table){
+            $table->id();
+            $table->foreignId('user_id')
+                ->constrained()
+                ->cascadeOnUpdate()
+                ->cascadeOnDelete();
+            $table->foreignId('reward_id')
+                ->constrained()
+                ->cascadeOnUpdate()
+                ->cascadeOnDelete();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('rewards');
+        Schema::dropIfExists('user_reward');
+    }
+};
diff --git a/database/seeders/BikeSeeder.php b/database/seeders/BikeSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..22543e813c4b525d15a0c86a0ebe286d7772b4ad
--- /dev/null
+++ b/database/seeders/BikeSeeder.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Bike;
+use App\Models\ElectricBike;
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class BikeSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $bike = Bike::create([
+            'stop_id' => 1,
+            'unlocked' => false
+        ]);
+        ElectricBike::create([
+            'id' => $bike->id,
+            'battery' => 60
+        ]);
+        Bike::create([
+            'stop_id' => 1,
+            'unlocked' => false
+        ]);
+
+        $bike = Bike::create([
+            'stop_id' => 2,
+            'unlocked' => false
+        ]);
+        ElectricBike::create([
+            'id' => $bike->id,
+            'battery' => 70
+        ]);
+
+        Bike::create([
+            'stop_id' => 3,
+            'unlocked' => false
+        ]);
+    }
+}
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index c1c48a060cf65c15925509e53589835c3bf451d2..88eb4f82d9539a3796eb81912a5ec7801696392d 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -14,11 +14,10 @@ class DatabaseSeeder extends Seeder
      */
     public function run()
     {
-        // \App\Models\User::factory(10)->create();
-
-        // \App\Models\User::factory()->create([
-        //     'name' => 'Test User',
-        //     'email' => 'test@example.com',
-        // ]);
+        $this->call(UserSeeder::class);
+        $this->call(StopSeeder::class);
+        $this->call(BikeSeeder::class);
+        $this->call(RouteSeeder::class);
+        $this->call(RewardSeeder::class);
     }
 }
diff --git a/database/seeders/ElectricBikeSeeder.php b/database/seeders/ElectricBikeSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..b61929b2d9ce96cecbf7e97319d55abf0cd65790
--- /dev/null
+++ b/database/seeders/ElectricBikeSeeder.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Database\Seeders;
+
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class ElectricBikeSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}
diff --git a/database/seeders/RewardSeeder.php b/database/seeders/RewardSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..54727890906059adbb61c5bb1d395b618cfb5ee2
--- /dev/null
+++ b/database/seeders/RewardSeeder.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Reward;
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class RewardSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $reward = Reward::create([
+            'name' => 'Reward 1',
+            'description' => 'A short description',
+            'points' => 100,
+            'total_available' => 5
+        ]);
+        $reward->users()->sync([1,2]);
+        $reward = Reward::create([
+            'name' => 'Reward 2',
+            'description' => 'A short description 2',
+            'points' => 200,
+            'total_available' => 2
+        ]);
+        $reward->users()->sync([1]);
+        Reward::create([
+            'name' => 'Reward 3',
+            'description' => 'A short description 3',
+            'points' => 1000,
+            'total_available' => 1
+        ]);
+        Reward::create([
+            'name' => 'Reward 4',
+            'description' => 'A short description 4',
+            'points' => 4,
+            'total_available' => 10
+        ]);
+        Reward::create([
+            'name' => 'Reward 5',
+            'description' => 'A short description 5',
+            'points' => 500,
+            'total_available' => 5
+        ]);
+    }
+}
diff --git a/database/seeders/RouteSeeder.php b/database/seeders/RouteSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1fd5f2775c38986c39c1f445ef6c7cc6e9db5eb
--- /dev/null
+++ b/database/seeders/RouteSeeder.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Route;
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class RouteSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        Route::create([
+           "user_id" => 1,
+           "initial_stop_id" => 1,
+           "final_stop_id" => 2,
+           "bike_id" => 1,
+           "distance" => 500,
+           "duration" => 1000,
+           "points" => 100,
+           "mapbox_response" => '{"routes":[{"geometry":{"coordinates":[[-4.730855,41.653319],[-4.731204,41.653354],[-4.731172,41.653568],[-4.729951,41.653454],[-4.725932,41.652181],[-4.726006,41.652131],[-4.726499,41.65228]],"type":"LineString"},"legs":[{"summary":"","weight":328,"duration":298,"steps":[],"distance":571.6}],"weight_name":"cyclability","weight":328,"duration":298,"distance":571.6}],"waypoints":[{"distance":0.33309312638707467,"name":"","location":[-4.730855,41.653319]},{"distance":1.4233601888820147,"name":"Plaza de la Fuente Dorada","location":[-4.726499,41.65228]}],"code":"Ok","uuid":"34oyDWtItbRpJKZb00E5_J2jmiJlWLfQagPHfulbhv5_2m0FkCUA0g=="}'
+        ]);
+    }
+}
diff --git a/database/seeders/StopSeeder.php b/database/seeders/StopSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..a38b399028ff2cb187baf8fa9144613220d044bb
--- /dev/null
+++ b/database/seeders/StopSeeder.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Bike;
+use App\Models\Stop;
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class StopSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        Stop::create([
+            "lng"=> -4.731,
+            "lat"=> 41.653,
+            "address"=> "Plaza de Poniente",
+            "total_spaces"=> 10,
+        ]);
+        Stop::create([
+            "lng"=> -4.726,
+            "lat"=> 41.652,
+            "address"=> "Plaza de Fuente Dorada",
+            "total_spaces"=> 10,
+        ]);
+        Stop::create([
+            "lng"=> -4.725,
+            "lat"=> 41.648,
+            "address"=> "Plaza Madrid",
+            "total_spaces"=> 10,
+        ]);
+        Stop::create([
+            "lng"=> -4.729,
+            "lat"=> 41.647,
+            "address"=> "Plaza Zorrilla",
+            "total_spaces"=> 10,
+        ]);
+    }
+}
diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..53bc2192f850407e3505cc0871960cb70735c872
--- /dev/null
+++ b/database/seeders/UserSeeder.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\User;
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class UserSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        User::create([
+            'name' => 'Jorge',
+            'email' => 'jorge@uva.es',
+            'password' => '12345678'
+        ]);
+        User::create([
+            'name' => 'Mario',
+            'email' => 'mario@uva.es',
+            'password' => '12345678'
+        ]);
+    }
+}