diff --git a/ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql b/ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql
new file mode 100644
index 0000000000000000000000000000000000000000..4d88744bee17d4c91082c643a9dad5dd00cc00ce
--- /dev/null
+++ b/ExpressAPI/prisma/migrations/20240703072757_add_sonar_in_result/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE `Result` ADD COLUMN `sonarGatePass` BOOLEAN NULL;
diff --git a/ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql b/ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql
new file mode 100644
index 0000000000000000000000000000000000000000..ecaab699d3b281e92fca1ef81a4711a5985b634b
--- /dev/null
+++ b/ExpressAPI/prisma/migrations/20240703073048_add_allowsonarfailure/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE `Assignment` ADD COLUMN `allowSonarFailure` BOOLEAN NOT NULL DEFAULT true;
diff --git a/ExpressAPI/prisma/schema.prisma b/ExpressAPI/prisma/schema.prisma
index 764785be5cc73ccb019226481cf393ffe853b43f..29ac2434bbe052ed412ef061ba1ca5a82fd077c6 100644
--- a/ExpressAPI/prisma/schema.prisma
+++ b/ExpressAPI/prisma/schema.prisma
@@ -45,11 +45,12 @@ model Assignment {
     published          Boolean  @default(false)
     language           Language @default(other)
 
-    useSonar          Boolean @default(false)
+    useSonar          Boolean  @default(false)
+    allowSonarFailure Boolean  @default(true)
     sonarKey          String?
-    sonarCreationInfo Json?   @db.Json
+    sonarCreationInfo Json?    @db.Json
     sonarGate         String?
-    sonarProfiles     Json?   @db.Json
+    sonarProfiles     Json?    @db.Json
 
     exercises Exercise[]
     staff     User[]
@@ -83,13 +84,14 @@ model Exercise {
 }
 
 model Result {
-    exerciseId String   @db.Char(36)
-    dateTime   DateTime @default(now())
-    success    Boolean
-    exitCode   Int
-    commit     Json     @db.Json
-    results    Json     @db.Json
-    files      Json     @db.Json
+    exerciseId     String   @db.Char(36)
+    dateTime       DateTime @default(now())
+    success        Boolean
+    sonarGatePass  Boolean?
+    exitCode       Int
+    commit         Json     @db.Json
+    results        Json     @db.Json
+    files          Json     @db.Json
 
     exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade, onUpdate: Cascade)
 
diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index a5cce0e9d0f475b19c21724171cc0ba21594a280..f5f7d225d22743b6704bbead19cd6c1840f145f3 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -50,6 +50,11 @@ class AssignmentRoutes implements RoutesManager {
             notEmpty : true,
             isBoolean: true
         },
+        allowSonarFailure: {
+            trim     : true,
+            notEmpty : false,
+            isBoolean: true
+        },
         language: {
             trim    : true,
             notEmpty: true,
@@ -143,9 +148,10 @@ class AssignmentRoutes implements RoutesManager {
 
     private async createAssignment(req: express.Request, res: express.Response) {
         const params: {
-            name: string, members: Array<Gitlab.UserSchema>, template: string, useSonar: string, sonarGate: string, sonarProfiles: string, language: string
+            name: string, members: Array<Gitlab.UserSchema>, template: string, useSonar: string, sonarGate: string, sonarProfiles: string, language: string, allowSonarFailure: string | undefined
         } = req.body;
         const useSonar = params.useSonar === 'true';
+        const allowSonarFailure = params.allowSonarFailure === 'true';
 
         params.members = [ await req.session.profile.gitlabProfile.value, ...params.members ];
         params.members = params.members.removeObjectDuplicates(gitlabUser => gitlabUser.id);
@@ -221,6 +227,7 @@ class AssignmentRoutes implements RoutesManager {
                                                                                                        gitlabLastInfo    : repository as unknown as Prisma.JsonObject,
                                                                                                        gitlabLastInfoDate: new Date(),
                                                                                                        useSonar          : useSonar,
+                                                                                                       allowSonarFailure : allowSonarFailure,
                                                                                                        sonarKey          : sonarProject?.project.key,
                                                                                                        sonarCreationInfo : sonarProject?.project,
                                                                                                        sonarGate         : params.sonarGate,
@@ -242,6 +249,7 @@ class AssignmentRoutes implements RoutesManager {
                                                                                                        }
                                                                                                    }
                                                                                                }), 'Database error') as Assignment;
+                                                                             
 
             req.session.sendResponse(res, StatusCodes.OK, assignment);
         } catch ( error ) {
diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts
index 1762ea7e5c4e23511793c57cabc6efd3037b6509..77921510c49c3b9d409379273937de2dc6859c73 100644
--- a/ExpressAPI/src/routes/ExerciseRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciseRoutes.ts
@@ -64,6 +64,11 @@ class ExerciseRoutes implements RoutesManager {
         archiveBase64: {
             isBase64: true,
             notEmpty: true
+        },
+        sonarGatePass: {
+            trim     : true,
+            notEmpty : false,
+            isBoolean: true
         }
     };
 
@@ -382,17 +387,19 @@ class ExerciseRoutes implements RoutesManager {
     }
 
     private async createResult(req: express.Request, res: express.Response) {
-        const params: { exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, files: Array<IFileDirStat>, archiveBase64: string } = req.body;
+        const params: { exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, files: Array<IFileDirStat>, archiveBase64: string, sonarGatePass: string | undefined } = req.body;
         const exercise: Exercise = req.boundParams.exercise!;
+        const sonarGate = params.sonarGatePass === "true";
 
         const result = await db.result.create({
                                                   data: {
-                                                      exerciseId: exercise.id,
-                                                      exitCode  : params.exitCode,
-                                                      success   : params.results.success!,
-                                                      commit    : params.commit,
-                                                      results   : params.results as unknown as Prisma.JsonObject,
-                                                      files     : params.files
+                                                      exerciseId   : exercise.id,
+                                                      exitCode     : params.exitCode,
+                                                      success      : params.results.success!,
+                                                      sonarGatePass: sonarGate,
+                                                      commit       : params.commit,
+                                                      results      : params.results as unknown as Prisma.JsonObject,
+                                                      files        : params.files
                                                   }
                                               });