diff --git a/app/Http/Controllers/Api/MeasuresController.php b/app/Http/Controllers/Api/MeasuresController.php
index f1e97e156e8604b0d5df0d08fba8c6b9efce0159..708b02902736f52912f65c22f2441c8a2e6d10b5 100644
--- a/app/Http/Controllers/Api/MeasuresController.php
+++ b/app/Http/Controllers/Api/MeasuresController.php
@@ -20,7 +20,9 @@ class MeasuresController extends Controller
 {
     public function all()
     {
-        return Measure::all();
+        return Measure::all()->map(function(Measure $m) {
+            return $m->withConvertedLevels();
+        });
     }
 
     public function save(MeasureRequest $request, $id = null)
@@ -44,53 +46,39 @@ public function save(MeasureRequest $request, $id = null)
             $measure->name = $data['name'];
             $measure->short_name = $data['short_name'];
 
-            $measure->level1_actual_label = $data['level1_actual_label'];
-            $measure->level1_preconized_label = $data['level1_preconized_label'];
-            $measure->level1_description = $data['level1_description'] ?? null;
-            $measure->level1_difficulty = $data['level1_difficulty'];
-            $measure->level1_cost = $data['level1_cost'];
-            $measure->level1_duration = $data['level1_duration'];
-            $measure->level1_assistance = $data['level1_assistance'];
-            $measure->level1_info = $data['level1_info'] ?? null;
-
-            $measure->level2_actual_label = $data['level2_actual_label'];
-            $measure->level2_preconized_label = $data['level2_preconized_label'];
-            $measure->level2_description = $data['level2_description'] ?? null;
-            $measure->level2_difficulty = $data['level2_difficulty'];
-            $measure->level2_cost = $data['level2_cost'];
-            $measure->level2_duration = $data['level2_duration'];
-            $measure->level2_assistance = $data['level2_assistance'];
-            $measure->level2_info = $data['level2_info'] ?? null;
-
-            $measure->level3_actual_label = $data['level3_actual_label'];
-            $measure->level3_preconized_label = $data['level3_preconized_label'];
-            $measure->level3_description = $data['level3_description'] ?? null;
-            $measure->level3_difficulty = $data['level3_difficulty'] ;
-            $measure->level3_cost = $data['level3_cost'];
-            $measure->level3_duration = $data['level3_duration'] ;
-            $measure->level3_assistance = $data['level3_assistance'] ;
-            $measure->level3_info = $data['level3_info'] ?? null;
-
-            $measure->save();
-            if (isset($data['level1_file'])){
-                $measure->level1_file = $this->storeFileLevel($data['level1_file'],$measure,1);
-            }
-            if (isset($data['level2_file'])) {
-                $measure->level2_file = $this->storeFileLevel($data['level2_file'], $measure, 2);
-            }
-            if (isset($data['level3_file'])) {
-                $measure->level3_file = $this->storeFileLevel($data['level3_file'], $measure, 3);
+            for ($i=0; $i< 3;$i++) {
+                $this->saveLevel($measure, $data, $i);
             }
 
             $measure->save();
 
-            return $measure;
+            return $measure->withConvertedLevels();
         }
 
         abort(403);
     }
 
-    public function storeFileLevel($file, $measure,$niveau){
+    private function saveLevel(Measure $measure, $data, $level)
+    {
+        $niveau = $level + 1;
+        if ($data['levels'] && is_array($data['levels']) && count($data['levels']) > $level) {
+            $measure->{'level'.$niveau.'_actual_label'} = $data['levels'][$level]['actual_label'];
+            $measure->{'level'.$niveau.'_preconized_label'} = $data['levels'][$level]['preconized_label'];
+            $measure->{'level'.$niveau.'_description'} = $data['levels'][$level]['description'] ?? null;
+            $measure->{'level'.$niveau.'_difficulty'} = $data['levels'][$level]['difficulty'];
+            $measure->{'level'.$niveau.'_cost'} = $data['levels'][$level]['cost'];
+            $measure->{'level'.$niveau.'_duration'} = $data['levels'][$level]['duration'];
+            $measure->{'level'.$niveau.'_assistance'} = $data['levels'][$level]['assistance'];
+            $measure->{'level'.$niveau.'_info'} = $data['levels'][$level]['info'] ?? null;
+
+            if (isset($data['levels'][$level]['file'])) {
+                $measure->{'level'.$niveau.'_file'} = $this->storeFileLevel($data['levels'][$level]['file'], $measure, $niveau);
+            }
+        }
+    }
+
+    private function storeFileLevel($file, Measure $measure, int $niveau): string
+    {
         // todo mettre le bon contenu dans le fichier
         $image_parts = explode(";base64,", $file);
         $image_type_aux = explode("/", $image_parts[0]);
diff --git a/app/Http/Requests/MeasureRequest.php b/app/Http/Requests/MeasureRequest.php
index c5d7a30acffec45dc2df6fad99f52d4f46f598de..f46a0c798c7a692b5dd95127fd079b3046550305 100644
--- a/app/Http/Requests/MeasureRequest.php
+++ b/app/Http/Requests/MeasureRequest.php
@@ -26,33 +26,16 @@ public function rules()
         return [
             'name' => 'string|required|max:255',
             'short_name' => 'string|required|max:255',
-            'level1_actual_label' => 'string|required|max:255',
-            'level1_preconized_label' => 'string|required|max:255',
-            'level1_file' => 'string|nullable',
-            'level1_description' => 'string|required',
-            'level1_difficulty' => 'int|required',
-            'level1_cost' => 'int|required',
-            'level1_duration' => 'int|required',
-            'level1_assistance' => 'int|required',
-            'level1_info' => 'string|nullable',
-            'level2_actual_label' => 'string|required|max:255',
-            'level2_preconized_label' => 'string|required|max:255',
-            'level2_file' => 'string|nullable',
-            'level2_description' => 'string|required',
-            'level2_difficulty' => 'int|required',
-            'level2_cost' => 'int|required',
-            'level2_duration' => 'int|required',
-            'level2_assistance' => 'int|required',
-            'level2_info' => 'string|nullable',
-            'level3_actual_label' => 'string|required|max:255',
-            'level3_preconized_label' => 'string|required|max:255',
-            'level3_file' => 'string|nullable',
-            'level3_description' => 'string|required',
-            'level3_difficulty' => 'int|required',
-            'level3_cost' => 'int|required',
-            'level3_duration' => 'int|required',
-            'level3_assistance' => 'int|required',
-            'level3_info' => 'string|nullable',
+            'levels' => 'array|min:3|max:3',
+            'levels.*.actual_label' => 'string|required|max:255',
+            'levels.*.preconized_label' => 'string|required|max:255',
+            'levels.*.file' => 'string|nullable',
+            'levels.*.description' => 'string|required',
+            'levels.*.difficulty' => 'int|required',
+            'levels.*.cost' => 'int|required',
+            'levels.*.duration' => 'int|required',
+            'levels.*.assistance' => 'int|required',
+            'levels.*.info' => 'string|nullable',
         ];
     }
 }
diff --git a/app/Models/Measure.php b/app/Models/Measure.php
index 958b959c3311567cee5de698472dfc9c094de9ad..8fc2756b700d011d96ed71ea4ebf468fbdc13ed8 100644
--- a/app/Models/Measure.php
+++ b/app/Models/Measure.php
@@ -44,4 +44,43 @@ class Measure extends Model
 {
     use HasFactory;
     use HasTimestamps;
+
+    protected $casts = [
+        'level1_difficulty' => 'int',
+        'level1_cost' => 'int',
+        'level1_duration' => 'int',
+        'level1_assistance' => 'int',
+        'level2_difficulty' => 'int',
+        'level2_cost' => 'int',
+        'level2_duration' => 'int',
+        'level2_assistance' => 'int',
+        'level3_difficulty' => 'int',
+        'level3_cost' => 'int',
+        'level3_duration' => 'int',
+        'level3_assistance' => 'int',
+    ];
+
+    public function withConvertedLevels(): array
+    {
+        $m = $this->toArray();
+
+        $m['levels'] = [];
+
+        for ($i=0; $i < 3; $i++) {
+            $niveau = $i+1;
+            $m['levels'][$i] = [
+                'actual_label' =>  $this->{'level'.$niveau.'_actual_label'},
+                'preconized_label' =>  $this->{'level'.$niveau.'_preconized_label'},
+                'description' =>  $this->{'level'.$niveau.'_description'},
+                'difficulty' =>  $this->{'level'.$niveau.'_difficulty'},
+                'cost' =>  $this->{'level'.$niveau.'_cost'},
+                'duration' =>  $this->{'level'.$niveau.'_duration'},
+                'assistance' =>  $this->{'level'.$niveau.'_assistance'},
+                'info' =>  $this->{'level'.$niveau.'_info'},
+                'file' =>  $this->{'level'.$niveau.'_file'},
+            ];
+        }
+
+        return $m;
+    }
 }
diff --git a/tests/Feature/MeasuresControllerTest.php b/tests/Feature/MeasuresControllerTest.php
index 379959d16057f6e8107e54d6a740cb1da7eddeb2..cb32750b1d50764449a9b3b917ca5d0a57326ebc 100644
--- a/tests/Feature/MeasuresControllerTest.php
+++ b/tests/Feature/MeasuresControllerTest.php
@@ -28,7 +28,9 @@ public function testAdminCanGetAll()
 
         $response->assertOk();
 
-        $m = Measure::all();
+        $m = Measure::all()->map(function(Measure $m) {
+            return $m->withConvertedLevels();
+        });
 
         $this->assertEquals($m->toArray(), $response->json());
     }
@@ -49,7 +51,9 @@ public function testUserCanGetAll()
 
         $response->assertOk();
 
-        $m = Measure::all();
+        $m = Measure::all()->map(function(Measure $m) {
+            return $m->withConvertedLevels();
+        });
 
         $this->assertEquals($m->toArray(), $response->json());
     }
@@ -65,34 +69,42 @@ public function testAdminCanUpdateMeasure()
 
         $m = Measure::first()->toArray();
 
-        $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id'],
+        $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id']]),
+        [
             'name' => 'NAME',
             'short_name' => 'SHORT_NAME',
-            'level1_actual_label' => 'LEVEL 1 ACTUAL LABEL',
-            'level1_preconized_label' => 'LEVEL 1 PRECONIZED LABEL',
-            'level1_description' => 1,
-            'level1_difficulty' => 2,
-            'level1_file' => null,
-            'level1_cost' => 3,
-            'level1_duration' => 4,
-            'level1_assistance' => 5,
-            'level2_actual_label' => 'LEVEL 2 ACTUAL LABEL',
-            'level2_preconized_label' => 'LEVEL 2 PRECONIZED LABEL',
-            'level2_description' => 1,
-            'level2_file' => null,
-            'level2_difficulty' => 2,
-            'level2_cost' => 3,
-            'level2_duration' => 4,
-            'level2_assistance' => 5,
-            'level3_actual_label' => 'LEVEL 3 ACTUAL LABEL',
-            'level3_preconized_label' => 'LEVEL 3 PRECONIZED LABEL',
-            'level3_description' => 1,
-            'level3_file' => null,
-            'level3_difficulty' => 2,
-            'level3_cost' => 3,
-            'level3_duration' => 4,
-            'level3_assistance' => 5]
-        ));
+                'levels' => [
+                    [
+                        'actual_label' => 'LEVEL 1 ACTUAL LABEL',
+                        'preconized_label' => 'LEVEL 1 PRECONIZED LABEL',
+                        'description' => "test1",
+                        'difficulty' => 2,
+                        'cost' => 3,
+                        'duration' => 4,
+                        'assistance' => 5,
+                        'file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII',
+                    ],
+                    [
+                        'actual_label' => 'LEVEL 2 ACTUAL LABEL',
+                        'preconized_label' => 'LEVEL 2 PRECONIZED LABEL',
+                        'description' => "test2",
+                        'difficulty' => 2,
+                        'cost' => 3,
+                        'duration' => 4,
+                        'assistance' => 5,
+                    ],
+                    [
+                        'actual_label' => 'LEVEL 3 ACTUAL LABEL',
+                        'preconized_label' => 'LEVEL 3 PRECONIZED LABEL',
+                        'description' => "test3",
+                        'difficulty' => 2,
+                        'cost' => 3,
+                        'duration' => 4,
+                        'assistance' => 5,
+                    ],
+                ]
+            ]
+        );
 
         if ($response->exception) {
             dump($response->exception);
@@ -103,18 +115,17 @@ public function testAdminCanUpdateMeasure()
 
         $m = Measure::find($m['id']);
 
-        $this->assertEquals($m->toArray(), $data);
-        $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['level1_actual_label']);
+        $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['levels'][0]['actual_label']);
         $this->assertEquals('LEVEL 1 ACTUAL LABEL', $m->level1_actual_label);
-        $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['level2_actual_label']);
+        $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['levels'][1]['actual_label']);
         $this->assertEquals('LEVEL 2 ACTUAL LABEL', $m->level2_actual_label);
-        $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['level3_actual_label']);
+        $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['levels'][2]['actual_label']);
         $this->assertEquals('LEVEL 3 ACTUAL LABEL', $m->level3_actual_label);
-        $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['level1_preconized_label']);
+        $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['levels'][0]['preconized_label']);
         $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $m->level1_preconized_label);
-        $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['level2_preconized_label']);
+        $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['levels'][1]['preconized_label']);
         $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $m->level2_preconized_label);
-        $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['level3_preconized_label']);
+        $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['levels'][2]['preconized_label']);
         $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $m->level3_preconized_label);
     }
 
@@ -141,28 +152,39 @@ public function testAdminCanUploadFileToMeasure()
         $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id'],
             'name' => 'name',
             'short_name' => 'SHORT_NAME',
-            'level1_actual_label' => 'LEVEL 1 ACTUAL LABEL',
-            'level1_preconized_label' => 'LEVEL 1 PRECONIZED LABEL',
-            'level1_description' => 1,
-            'level1_difficulty' => 2,
-            'level1_cost' => 3,
-            'level1_duration' => 4,
-            'level1_assistance' => 5,
-            'level1_file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII',
-            'level2_actual_label' => 'LEVEL 2 ACTUAL LABEL',
-            'level2_preconized_label' => 'LEVEL 2 PRECONIZED LABEL',
-            'level2_description' => 1,
-            'level2_difficulty' => 2,
-            'level2_cost' => 3,
-            'level2_duration' => 4,
-            'level2_assistance' => 5,
-            'level3_actual_label' => 'LEVEL 3 ACTUAL LABEL',
-            'level3_preconized_label' => 'LEVEL 3 PRECONIZED LABEL',
-            'level3_description' => 1,
-            'level3_difficulty' => 2,
-            'level3_cost' => 3,
-            'level3_duration' => 4,
-            'level3_assistance' => 5]
+            'levels' => [
+                [
+                    'actual_label' => 'LEVEL 1 ACTUAL LABEL',
+                    'preconized_label' => 'LEVEL 1 PRECONIZED LABEL',
+                    'description' => "test1",
+                    'difficulty' => 2,
+                    'cost' => 3,
+                    'duration' => 4,
+                    'assistance' => 5,
+                    'file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII',
+                ],
+                [
+                    'actual_label' => 'LEVEL 2 ACTUAL LABEL',
+                    'preconized_label' => 'LEVEL 2 PRECONIZED LABEL',
+                    'description' => "test2",
+                    'difficulty' => 2,
+                    'cost' => 3,
+                    'duration' => 4,
+                    'assistance' => 5,
+                ],
+                [
+                    'actual_label' => 'LEVEL 3 ACTUAL LABEL',
+                    'preconized_label' => 'LEVEL 3 PRECONIZED LABEL',
+                    'description' => "test3",
+                    'difficulty' => 2,
+                    'cost' => 3,
+                    'duration' => 4,
+                    'assistance' => 5,
+                ],
+            ]
+
+
+        ]
         ));
 
         if ($response->exception) {
@@ -174,7 +196,7 @@ public function testAdminCanUploadFileToMeasure()
 
         $m = Measure::find($m['id']);
 
-        $this->assertEquals($m->toArray(), $data);
+        $this->assertEquals($m->withConvertedLevels(), $data);
 
         $this->assertTrue(file_exists($fullPath));
 
@@ -182,18 +204,18 @@ public function testAdminCanUploadFileToMeasure()
 
         $this->assertNotNull($file);
 
-        $this->assertEquals('/'.$docName, $data['level1_file']);
-        $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['level1_actual_label']);
+        $this->assertEquals('/'.$docName, $data['levels'][0]['file']);
+        $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['levels'][0]['actual_label']);
         $this->assertEquals('LEVEL 1 ACTUAL LABEL', $m->level1_actual_label);
-        $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['level2_actual_label']);
+        $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['levels'][1]['actual_label']);
         $this->assertEquals('LEVEL 2 ACTUAL LABEL', $m->level2_actual_label);
-        $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['level3_actual_label']);
+        $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['levels'][2]['actual_label']);
         $this->assertEquals('LEVEL 3 ACTUAL LABEL', $m->level3_actual_label);
-        $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['level1_preconized_label']);
+        $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['levels'][0]['preconized_label']);
         $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $m->level1_preconized_label);
-        $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['level2_preconized_label']);
+        $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['levels'][1]['preconized_label']);
         $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $m->level2_preconized_label);
-        $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['level3_preconized_label']);
+        $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['levels'][2]['preconized_label']);
         $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $m->level3_preconized_label);
     }
 
@@ -212,27 +234,37 @@ public function testNonAdminCannotUpdateMeasure()
         $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id'],
                 'name' => 'NAME',
                 'short_name' => 'SHORT_NAME',
-                'level1_actual_label' => 'LEVEL 1 ACTUAL LABEL',
-                'level1_preconized_label' => 'LEVEL 1 PRECONIZED LABEL',
-                'level1_description' => 1,
-                'level1_difficulty' => 2,
-                'level1_cost' => 3,
-                'level1_duration' => 4,
-                'level1_assistance' => 5,
-                'level2_actual_label' => 'LEVEL 2 ACTUAL LABEL',
-                'level2_preconized_label' => 'LEVEL 2 PRECONIZED LABEL',
-                'level2_description' => 1,
-                'level2_difficulty' => 2,
-                'level2_cost' => 3,
-                'level2_duration' => 4,
-                'level2_assistance' => 5,
-                'level3_actual_label' => 'LEVEL 3 ACTUAL LABEL',
-                'level3_preconized_label' => 'LEVEL 3 PRECONIZED LABEL',
-                'level3_description' => 1,
-                'level3_difficulty' => 2,
-                'level3_cost' => 3,
-                'level3_duration' => 4,
-                'level3_assistance' => 5]
+                'levels' => [
+                    [
+                        'actual_label' => 'LEVEL 1 ACTUAL LABEL',
+                        'preconized_label' => 'LEVEL 1 PRECONIZED LABEL',
+                        'description' => 1,
+                        'difficulty' => 2,
+                        'cost' => 3,
+                        'duration' => 4,
+                        'assistance' => 5,
+                        'file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII',
+                    ],
+                    [
+                        'actual_label' => 'LEVEL 2 ACTUAL LABEL',
+                        'preconized_label' => 'LEVEL 2 PRECONIZED LABEL',
+                        'description' => 1,
+                        'difficulty' => 2,
+                        'cost' => 3,
+                        'duration' => 4,
+                        'assistance' => 5,
+                    ],
+                    [
+                        'actual_label' => 'LEVEL 3 ACTUAL LABEL',
+                        'preconized_label' => 'LEVEL 3 PRECONIZED LABEL',
+                        'description' => 1,
+                        'difficulty' => 2,
+                        'cost' => 3,
+                        'duration' => 4,
+                        'assistance' => 5,
+                    ],
+                ]
+            ]
         ));
 
         $response->assertStatus(403);