diff --git a/backend/app/crud.py b/backend/app/crud.py
index 54b69a0e13f92cdc6d1f45a34b76bb734626dd1d..b120bc57887bcb22ae5ab1cad640c32b76c94896 100644
--- a/backend/app/crud.py
+++ b/backend/app/crud.py
@@ -429,10 +429,20 @@ def create_survey_response(db: Session, survey_response: schemas.SurveyResponseC
     return db_survey_response
 
 
-def get_survey_responses(db: Session, survey_id: int, skip: int = 0):
+def get_survey_responses(db: Session, sid: str, skip: int = 0):
     return (
         db.query(models.SurveyResponse)
-        .filter(models.SurveyResponse.survey_id == survey_id)
+        .filter(models.SurveyResponse.sid == sid)
         .offset(skip)
         .all()
     )
+
+
+def create_survey_response_info(
+    db: Session, survey_response_info: schemas.SurveyResponseInfoCreate
+):
+    db_survey_response_info = models.SurveyResponseInfo(**survey_response_info.dict())
+    db.add(db_survey_response_info)
+    db.commit()
+    db.refresh(db_survey_response_info)
+    return db_survey_response_info
diff --git a/backend/app/main.py b/backend/app/main.py
index ef199313ab811ecdf8c3d9d8e0d608dd60793685..b429cd5cee715edf24a4307a13f36eef66bb6e26 100644
--- a/backend/app/main.py
+++ b/backend/app/main.py
@@ -1296,15 +1296,28 @@ def get_survey_responses(
     return crud.get_survey_responses(db, survey_id)
 
 
-@surveyRouter.get("/{survey_id}/score", response_model=dict)
+@surveyRouter.post("/info/{survey_id}", status_code=status.HTTP_201_CREATED)
+def create_survey_info(
+    survey_id: int,
+    info: schemas.SurveyResponseInfoCreate,
+    db: Session = Depends(get_db),
+):
+    if not crud.get_survey(db, survey_id):
+        raise HTTPException(status_code=404, detail="Survey not found")
+
+    return crud.create_survey_response_info(db, info)
+
+
+@surveyRouter.get("/{survey_id}/score/{sid}", response_model=dict)
 def get_survey_score(
     survey_id: int,
+    sid: str,
     db: Session = Depends(get_db),
 ):
     if not crud.get_survey(db, survey_id):
         raise HTTPException(status_code=404, detail="Survey not found")
 
-    responses = crud.get_survey_responses(db, survey_id)
+    responses = crud.get_survey_responses(db, sid)
 
     score = 0
     total = 0
@@ -1316,7 +1329,10 @@ def get_survey_score(
         if response.selected_id == question.correct:
             score += 1
 
-    return {"survey_id": survey_id, "score": round((score / total) * 100, 2)}
+    return {
+        "survey_id": survey_id,
+        "score": round((score / total) * 100 if total > 0 else 0, 2),
+    }
 
 
 v1Router.include_router(authRouter)
diff --git a/backend/app/models.py b/backend/app/models.py
index da304ed53dde54ff7d94cc6098b9f704e24272a8..7649e88b786b0353d226aeb158c7c69f021e9a2b 100644
--- a/backend/app/models.py
+++ b/backend/app/models.py
@@ -245,8 +245,9 @@ class SurveyResponse(Base):
     __tablename__ = "survey_responses"
 
     id = Column(Integer, primary_key=True, index=True)
-    uuid = Column(String)
+    code = Column(String)
     sid = Column(String)
+    uid = Column(Integer, ForeignKey("users.id"), default=None)
     created_at = Column(DateTime, default=datetime_aware)
     survey_id = Column(Integer, ForeignKey("survey_surveys.id"))
     group_id = Column(Integer, ForeignKey("survey_groups.id"))
@@ -256,6 +257,17 @@ class SurveyResponse(Base):
     text = Column(String)
 
 
+class SurveyResponseInfo(Base):
+    __tablename__ = "survey_response_info"
+
+    id = Column(Integer, primary_key=True, index=True)
+    sid = Column(String)
+    birthyear = Column(Integer)
+    gender = Column(String)
+    primary_language = Column(String)
+    education = Column(String)
+
+
 class Study(Base):
     __tablename__ = "studies"
     id = Column(Integer, primary_key=True, index=True)
diff --git a/backend/app/schemas.py b/backend/app/schemas.py
index 051e04f70b7330a6ababae4f693641de1555a0fe..8e40e12418700085ffef54ae45a0e16c1eacdf35 100644
--- a/backend/app/schemas.py
+++ b/backend/app/schemas.py
@@ -260,8 +260,9 @@ class SurveySurveyAddGroup(BaseModel):
 
 
 class SurveyResponseCreate(BaseModel):
-    uuid: str
+    code: str
     sid: str
+    uid: int | None = None
     survey_id: int
     group_id: int
     question_id: int
@@ -272,8 +273,9 @@ class SurveyResponseCreate(BaseModel):
 
 class SurveyResponse(BaseModel):
     id: int
-    uuid: str
+    code: str
     sid: str
+    uid: int | None = None
     created_at: NaiveDatetime
     survey_id: int
     group_id: int
@@ -283,6 +285,23 @@ class SurveyResponse(BaseModel):
     text: str | None = None
 
 
+class SurveyResponseInfoCreate(BaseModel):
+    sid: str
+    birthyear: int
+    gender: str
+    primary_language: str
+    education: str
+
+
+class SurveyResponseInfo(BaseModel):
+    id: int
+    sid: str
+    birthyear: int
+    gender: str
+    primary_language: str
+    education: str
+
+
 class Study(BaseModel):
     id: int
     title: str
diff --git a/frontend/src/lang/en.json b/frontend/src/lang/en.json
index 672c159ad9f8b5158f887572ed05389cdd7ca4b7..2ab57bab4f7c261c0cde5e657d5fd869e2912ec5 100644
--- a/frontend/src/lang/en.json
+++ b/frontend/src/lang/en.json
@@ -77,5 +77,33 @@
 			"true": "Yes",
 			"false": "No"
 		}
+	},
+	"button": {
+		"next": "Next"
+	},
+	"surveys": {
+		"complete": "Thank you for participating!",
+		"score": "You got a score of ",
+		"code": "Your code:",
+		"codeIndication": "The instructor should have given you a personal code. If not, please write your email address.",
+		"invalidCode": "Invalid code",
+		"birthYear": "The year you were born",
+		"gender": "What gender do you identify as?",
+		"genders": {
+			"male": "A man",
+			"female": "A women",
+			"other": "Other",
+			"na": "I prefer not to answer"
+		},
+		"homeLanguage": "First language",
+		"education": {
+			"title": "What is the highest grade, degree or level of education you achieved?",
+			"na": "None",
+			"PrimarySchool": "Primary school",
+			"SecondarySchool": "Secondary school/High school",
+			"NonUni": "Non-university degree",
+			"Bachelor": "Bachelor's degree",
+			"Master": "Master's degree or above"
+		}
 	}
 }
diff --git a/frontend/src/lang/fr.json b/frontend/src/lang/fr.json
index 44aec466a4e1d3fd2831f2b76bec067bdbf057ea..44bb7fd9461344406cb1fdec8f0f17c9b52b2461 100644
--- a/frontend/src/lang/fr.json
+++ b/frontend/src/lang/fr.json
@@ -184,7 +184,39 @@
 		"loginEmail": "Utiliser une adresse e-mail",
 		"invalidEmail": "Adresse e-mail invalide",
 		"complete": "Questionnaire complété. Merci pour votre participation !",
-		"score": "Vous avez obtenu un score de "
+		"score": "Vous avez obtenu un score de ",
+		"code": "Votre code:",
+		"codeIndication": "L'instructeur devrait vous avoir donné un code personnel. Si ce n'est pas le cas, veuillez indiquer votre adresse électronique.",
+		"invalidCode": "Code invalide",
+		"consent": {
+			"title": "Document d’information et consentement éclairé",
+			"intro": "Vous êtes invité·e à participer à une étude scientifique. L'objectif de cette étude est de comprendre comment les tuteurs et les apprenants de langue étrangère interagissent lors de sessions de tutorat en ligne. Les données collectées seront utilisées pour améliorer les outils de tutorat en ligne et pour mieux comprendre les processus cognitifs de part et d'autre.",
+			"participation": "Qu'implique votre participation ?",
+			"participationD": "Si vous acceptez de participer, vous serez invité·e à participer à des sessions de tutorat en ligne avec un tuteur de langue étrangère. Vous serez également invité à remplir des questionnaires avant et après les sessions de tutorat. Les sessions de tutorat seront enregistrées pour analyse ultérieure.</p><p>Nous vous demandons de prévoir de réaliser un minimum de <strong>8 sessions d'une heure</strong> de tutorat (donc 8 heures au total), au cours d'une période de 1 à 3 mois. Vous pouvez bien sûr en réaliser plus si vous le souhaitez. Vous pouvez cependant arrêter de participer à l'étude à tout moment.",
+			"privacy": "Comment seront traitées et conservées vos données ?",
+			"privacyD": "Les données collectées (par exemple, les transcriptions des conversations, les résultats de tests, les mesures de frappe, les informations sur les participants comme l'age ou le genre) seront traitées de manière confidentielle et anonyme. Elles seront conservées après leur anonymisation intégrale et ne pourront être utilisées qu'à des fins scientifiques ou pédagogiques. Elles pourront éventuellement être partagées avec d'autres chercheurs ou enseignants, mais toujours dans ce cadre strictement de recherche ou d'enseignement.",
+			"rights": "Quels sont vos droits ? Participation volontaire et retrait éventuel",
+			"rightsD": "Votre participation à cette étude est volontaire. Vous pouvez à tout moment décider de ne plus participer à l'étude sans avoir à vous justifier. Vous pouvez également demander à ce que vos données soient supprimées à tout moment. Si vous avez des questions ou des préoccupations concernant cette étude, vous pouvez contacter le responsable de l'étude, Serge Bibauw, à l'adresse suivante :",
+			"ok": "J'accepte de participer à l'étude telle que décrite ci-dessus."
+		},
+		"birthYear": "Votre année de naissance",
+		"gender": "A quel genre vous identifiez vous ?",
+		"genders": {
+			"male": "Un homme",
+			"female": "Une femme",
+			"other": "Autre",
+			"na": "Je préfère ne pas répondre"
+		},
+		"homeLanguage": "Première Langue",
+		"education": {
+			"title": "Quel est le grade, le diplôme ou le niveau d'études le plus élevé que vous ayez obtenu ?",
+			"na": "Aucun",
+			"PrimarySchool": "École primaire",
+			"SecondarySchool": "École secondaire",
+			"NonUni": "Diplôme non universitaire",
+			"Bachelor": "Bachelier",
+			"Master": "Master ou diplôme supérieur"
+		}
 	},
 	"users": {
 		"nickname": "Nom",
diff --git a/frontend/src/lib/api/survey.ts b/frontend/src/lib/api/survey.ts
index 47ce425ccec79643ab2e1aff8868974c5f74e74c..a4f3c956e22ab43af33859fa6c9752fe5cc626e5 100644
--- a/frontend/src/lib/api/survey.ts
+++ b/frontend/src/lib/api/survey.ts
@@ -13,8 +13,9 @@ export async function getSurveyAPI(survey_id: number) {
 }
 
 export async function sendSurveyResponseAPI(
-	uuid: string,
+	code: string,
 	sid: string,
+	uid: number | null,
 	survey_id: number,
 	group_id: number,
 	question_id: number,
@@ -23,8 +24,9 @@ export async function sendSurveyResponseAPI(
 	text: string = ''
 ) {
 	const response = await axiosInstance.post(`/surveys/responses`, {
-		uuid,
+		code,
 		sid,
+		uid,
 		survey_id,
 		question_id,
 		group_id,
@@ -41,11 +43,35 @@ export async function sendSurveyResponseAPI(
 	return true;
 }
 
-export async function getSurveyScoreAPI(survey_id: number) {
-	const response = await axiosInstance.get(`/surveys/${survey_id}/score`);
+export async function getSurveyScoreAPI(survey_id: number, sid: string) {
+	const response = await axiosInstance.get(`/surveys/${survey_id}/score/${sid}`);
 	if (response.status !== 200) {
 		toastAlert('Failed to retrieve survey score');
 		return null;
 	}
 	return response.data;
 }
+
+export async function sendSurveyResponseInfoAPI(
+	survey_id: number,
+	sid: string,
+	birthyear: number,
+	gender: string,
+	primary_language: string,
+	education: string
+) {
+	const response = await axiosInstance.post(`/surveys/info/${survey_id}`, {
+		sid,
+		birthyear,
+		gender,
+		primary_language,
+		education
+	});
+
+	if (response.status !== 201) {
+		toastAlert('Failed to send survey response info');
+		return false;
+	}
+
+	return true;
+}
diff --git a/frontend/src/lib/components/sessions/message.svelte b/frontend/src/lib/components/sessions/message.svelte
index 205c780c7dba4ed2e58d7d90b41f3dc4efb8bc6d..cfccf2ef9556ac84c8bf8c1a7a5b5dc234f34445 100644
--- a/frontend/src/lib/components/sessions/message.svelte
+++ b/frontend/src/lib/components/sessions/message.svelte
@@ -181,12 +181,12 @@
 			class="rounded-full"
 		/>
 	</div>
-	<div class="chat-bubble text-black" class:bg-blue-200={isSender} class:bg-gray-300={!isSender}>
+	<div class="chat-bubble text-black" class:bg-blue-50={isSender} class:bg-gray-300={!isSender}>
 		{#if isEdit}
 			<div
 				contenteditable="true"
 				bind:this={contentDiv}
-				class="bg-blue-200 whitespace-pre-wrap min-h-8"
+				class="bg-blue-50 whitespace-pre-wrap min-h-8"
 			>
 				{message.content}
 			</div>
diff --git a/frontend/src/lib/components/surveys/consent.svelte b/frontend/src/lib/components/surveys/consent.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..2a6d54f32f44f00397296d141ae31c2a556629cd
--- /dev/null
+++ b/frontend/src/lib/components/surveys/consent.svelte
@@ -0,0 +1,82 @@
+<script lang="ts">
+	import { locale, t } from '$lib/services/i18n';
+	export let introText: string;
+	export let participation: string;
+	export let participationD: string;
+	export let privacy: string;
+	export let privacyD: string;
+	export let rights: string;
+</script>
+
+<div class="join join-vertical w-full">
+	<div class="join-item">
+		<h2 class="text-xl font-bold text-center">{$t('register.consent.title')}</h2>
+		<p class="m-5">{@html introText}</p>
+	</div>
+	<div class="collapse collapse-arrow join-item border border-base-300">
+		<input type="radio" name="consent-accordion" checked="checked" />
+		<div class="collapse-title font-medium">{participation}</div>
+		<div class="collapse-content"><p>{@html participationD}</p></div>
+	</div>
+	<div class="collapse collapse-arrow join-item border border-base-300">
+		<input type="radio" name="consent-accordion" />
+		<div class="collapse-title font-medium">{privacy}</div>
+		<div class="collapse-content"><p>{@html privacyD}</p></div>
+	</div>
+	<div class="collapse collapse-arrow join-item border border-base-300">
+		<input type="radio" name="consent-accordion" />
+		<div class="collapse-title font-medium">{rights}</div>
+		<div class="collapse-content">
+			<p>
+				{$t('register.consent.rightsD')}
+				<a class="link link-primary" href="mailto:{$t('register.consent.studyData.emailD')}"
+					>{$t('register.consent.studyData.emailD')}</a
+				>.
+			</p>
+		</div>
+	</div>
+	<div class="collapse collapse-arrow join-item border border-base-300">
+		<input type="radio" name="consent-accordion" />
+		<div class="collapse-title font-medium">{$t('register.consent.studyData.title')}</div>
+		<div class="collapse-content">
+			<dl class="text-sm">
+				<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
+					<dt class="font-medium">{$t('register.consent.studyData.study')}</dt>
+					<dd class="text-gray-700 sm:col-span-2">{$t('register.consent.studyData.studyD')}</dd>
+				</div>
+				<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
+					<dt class="font-medium">{$t('register.consent.studyData.project')}</dt>
+					<dd class="text-gray-700 sm:col-span-2">
+						{$t('register.consent.studyData.projectD')}
+					</dd>
+				</div>
+				<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
+					<dt class="font-medium">{$t('register.consent.studyData.university')}</dt>
+					<dd class="text-gray-700 sm:col-span-2">
+						{$t('register.consent.studyData.universityD')}
+					</dd>
+				</div>
+				<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
+					<dt class="font-medium">{$t('register.consent.studyData.address')}</dt>
+					<dd class="text-gray-700 sm:col-span-2">
+						{$t('register.consent.studyData.addressD')}
+					</dd>
+				</div>
+				<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
+					<dt class="font-medium">{$t('register.consent.studyData.person')}</dt>
+					<dd class="text-gray-700 sm:col-span-2">
+						{$t('register.consent.studyData.personD')}
+					</dd>
+				</div>
+				<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
+					<dt class="font-medium">{$t('register.consent.studyData.email')}</dt>
+					<dd class="text-gray-700 sm:col-span-2">
+						<a href="mailto:{$t('register.consent.studyData.emailD')}" class="link"
+							>{$t('register.consent.studyData.emailD')}</a
+						>
+					</dd>
+				</div>
+			</dl>
+		</div>
+	</div>
+</div>
diff --git a/frontend/src/lib/components/surveys/dropdown.svelte b/frontend/src/lib/components/surveys/dropdown.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..915fabf43c644401f40d669c3e7629e32f8c9edb
--- /dev/null
+++ b/frontend/src/lib/components/surveys/dropdown.svelte
@@ -0,0 +1,20 @@
+<script>
+	export let values;
+	export let option;
+	export let placeholder;
+	export let funct;
+</script>
+
+<select
+	class="select select-bordered !ml-0"
+	id="dropdown"
+	name="dropdown"
+	bind:value={option}
+	on:change={() => funct()}
+	required
+>
+	<option value="" disabled selected>{placeholder}</option>
+	{#each values as { value, display }}
+		<option {value}>{display}</option>
+	{/each}
+</select>
diff --git a/frontend/src/routes/register/+page.svelte b/frontend/src/routes/register/+page.svelte
index 7813085befb5c2e7629245c5ce2c925b0502d7bf..1debb565e26144d23e48ac912340039f41815187 100644
--- a/frontend/src/routes/register/+page.svelte
+++ b/frontend/src/routes/register/+page.svelte
@@ -19,6 +19,7 @@
 	import AvailableTutors from '$lib/components/users/availableTutors.svelte';
 	import { browser } from '$app/environment';
 	import { formatToUTCDate } from '$lib/utils/date';
+	import Consent from '$lib/components/surveys/consent.svelte';
 
 	let current_step = 0;
 
@@ -201,78 +202,14 @@
 		</div>
 	{/if}
 	{#if current_step == 1}
-		<div class="join join-vertical w-full">
-			<div class="join-item">
-				<h2 class="text-xl font-bold text-center">{$t('register.consent.title')}</h2>
-				<p class="m-5">{@html $t('register.consent.intro')}</p>
-			</div>
-			<div class="collapse collapse-arrow join-item border border-base-300">
-				<input type="radio" name="consent-accordion" checked="checked" />
-				<div class="collapse-title font-medium">{$t('register.consent.participation')}</div>
-				<div class="collapse-content"><p>{@html $t('register.consent.participationD')}</p></div>
-			</div>
-			<div class="collapse collapse-arrow join-item border border-base-300">
-				<input type="radio" name="consent-accordion" />
-				<div class="collapse-title font-medium">{$t('register.consent.privacy')}</div>
-				<div class="collapse-content"><p>{@html $t('register.consent.privacyD')}</p></div>
-			</div>
-			<div class="collapse collapse-arrow join-item border border-base-300">
-				<input type="radio" name="consent-accordion" />
-				<div class="collapse-title font-medium">{$t('register.consent.rights')}</div>
-				<div class="collapse-content">
-					<p>
-						{$t('register.consent.rightsD')}
-						<a class="link link-primary" href="mailto:{$t('register.consent.studyData.emailD')}"
-							>{$t('register.consent.studyData.emailD')}</a
-						>.
-					</p>
-				</div>
-			</div>
-			<div class="collapse collapse-arrow join-item border border-base-300">
-				<input type="radio" name="consent-accordion" />
-				<div class="collapse-title font-medium">{$t('register.consent.studyData.title')}</div>
-				<div class="collapse-content">
-					<dl class="text-sm">
-						<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
-							<dt class="font-medium">{$t('register.consent.studyData.study')}</dt>
-							<dd class="text-gray-700 sm:col-span-2">{$t('register.consent.studyData.studyD')}</dd>
-						</div>
-						<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
-							<dt class="font-medium">{$t('register.consent.studyData.project')}</dt>
-							<dd class="text-gray-700 sm:col-span-2">
-								{$t('register.consent.studyData.projectD')}
-							</dd>
-						</div>
-						<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
-							<dt class="font-medium">{$t('register.consent.studyData.university')}</dt>
-							<dd class="text-gray-700 sm:col-span-2">
-								{$t('register.consent.studyData.universityD')}
-							</dd>
-						</div>
-						<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
-							<dt class="font-medium">{$t('register.consent.studyData.address')}</dt>
-							<dd class="text-gray-700 sm:col-span-2">
-								{$t('register.consent.studyData.addressD')}
-							</dd>
-						</div>
-						<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
-							<dt class="font-medium">{$t('register.consent.studyData.person')}</dt>
-							<dd class="text-gray-700 sm:col-span-2">
-								{$t('register.consent.studyData.personD')}
-							</dd>
-						</div>
-						<div class="sm:grid sm:grid-cols-3 sm:gap-4 mb-1">
-							<dt class="font-medium">{$t('register.consent.studyData.email')}</dt>
-							<dd class="text-gray-700 sm:col-span-2">
-								<a href="mailto:{$t('register.consent.studyData.emailD')}" class="link"
-									>{$t('register.consent.studyData.emailD')}</a
-								>
-							</dd>
-						</div>
-					</dl>
-				</div>
-			</div>
-		</div>
+		<Consent
+			introText={$t('register.consent.intro')}
+			participation={$t('register.consent.participation')}
+			participationD={$t('register.consent.participationD')}
+			privacy={$t('register.consent.privacy')}
+			privacyD={$t('register.consent.privacyD')}
+			rights={$t('register.consent.rights')}
+		/>
 		<div class="form-control">
 			<button class="button mt-4" on:click={() => current_step++}>
 				{$t('register.consent.ok')}
diff --git a/frontend/src/routes/tests/[id]/+page.svelte b/frontend/src/routes/tests/[id]/+page.svelte
index 23dac4b2118f0d66bfd8dc284db9c07142563af5..5e43c4d2b5f28d27a047c4232746de0ec7a6b5df 100644
--- a/frontend/src/routes/tests/[id]/+page.svelte
+++ b/frontend/src/routes/tests/[id]/+page.svelte
@@ -1,5 +1,5 @@
 <script lang="ts">
-	import { sendSurveyResponseAPI } from '$lib/api/survey';
+	import { sendSurveyResponseAPI, sendSurveyResponseInfoAPI } from '$lib/api/survey';
 	import { getSurveyScoreAPI } from '$lib/api/survey';
 
 	import Survey from '$lib/types/survey.js';
@@ -9,6 +9,10 @@
 	import User from '$lib/types/user.js';
 	import type SurveyGroup from '$lib/types/surveyGroup';
 	import Gapfill from '$lib/components/surveys/gapfill.svelte';
+	import Consent from '$lib/components/surveys/consent.svelte';
+	import Dropdown from '$lib/components/surveys/dropdown.svelte';
+	import config from '$lib/config';
+	import { formatToUTCDate } from '$lib/utils/date';
 
 	export let data;
 
@@ -23,8 +27,11 @@
 		return group.questions.sort(() => Math.random() - 0.5);
 	}
 
-	$: step = user ? 2 : 0;
+	$: step = user ? 1 : 0;
 	$: uuid = user?.email || '';
+	$: uid = user?.id || null;
+	$: code = '';
+	$: subStep = 0;
 
 	let currentGroupId = 0;
 	let currentGroup = survey.groups[currentGroupId];
@@ -38,6 +45,8 @@
 	let displayQuestionOptions: string[] = [...(currentQuestion.options ?? [])];
 	shuffle(displayQuestionOptions);
 	let finalScore: number | null = null;
+	let selectedOption: string;
+	let endSurveyAnswers: { [key: string]: any } = {};
 
 	//source: shuffle function code taken from https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array/18650169#18650169
 	function shuffle(array: string[]) {
@@ -55,8 +64,10 @@
 	function setGroupId(id: number) {
 		currentGroupId = id;
 		currentGroup = survey.groups[currentGroupId];
-		questionsRandomized = getSortedQuestions(currentGroup);
-		setQuestionId(0);
+		if (currentGroup.id < 1100) {
+			questionsRandomized = getSortedQuestions(currentGroup);
+			setQuestionId(0);
+		}
 	}
 
 	function setQuestionId(id: number) {
@@ -73,18 +84,18 @@
 	async function selectOption(option: string) {
 		if (
 			!(await sendSurveyResponseAPI(
-				uuid,
+				code,
 				sid,
+				uid,
 				survey.id,
 				currentGroupId,
 				questionsRandomized[currentQuestionId]['_id'],
-				currentQuestion.options.findIndex((o: string) => o === option),
+				currentQuestion.options.findIndex((o: string) => o === option) + 1,
 				(new Date().getTime() - startTime) / 1000
 			))
 		) {
 			return;
 		}
-		console.log(currentQuestion.options.findIndex((o: string) => o === option));
 		if (currentQuestionId < questionsRandomized.length - 1) {
 			setQuestionId(currentQuestionId + 1);
 			startTime = new Date().getTime();
@@ -126,13 +137,35 @@
 	async function nextGroup() {
 		if (currentGroupId < survey.groups.length - 1) {
 			setGroupId(currentGroupId + 1);
+			//special group id for end of survey questions
+			if (currentGroup.id >= 1100) {
+				const scoreData = await getSurveyScoreAPI(survey.id, sid);
+				if (scoreData) {
+					finalScore = scoreData.score;
+				}
+				step += user ? 2 : 1;
+				return;
+			}
 		} else {
-			const scoreData = await getSurveyScoreAPI(survey.id);
+			const scoreData = await getSurveyScoreAPI(survey.id, sid);
 			if (scoreData) {
 				finalScore = scoreData.score;
 			}
-			step++;
+			step += 2;
+		}
+	}
+
+	function checkCode() {
+		if (!code) {
+			toastWarning(get(t)('surveys.invalidCode'));
+			return;
+		}
+		if (code.length < 3) {
+			toastWarning(get(t)('surveys.invalidCode'));
+			return;
 		}
+
+		step = 2;
 	}
 
 	function checkUUID() {
@@ -163,33 +196,60 @@
 
 		return parts;
 	}
+
+	async function selectAnswer(selection: string, option: string) {
+		endSurveyAnswers[selection] = option;
+		subStep += 1;
+		if (subStep == 4) {
+			await sendSurveyResponseInfoAPI(
+				survey.id,
+				sid,
+				endSurveyAnswers.birthYear,
+				endSurveyAnswers.gender,
+				endSurveyAnswers.primaryLanguage,
+				endSurveyAnswers.education
+			);
+			step += 1;
+		}
+		selectedOption = '';
+		return;
+	}
 </script>
 
 {#if step == 0}
-	<div class="max-w-screen-lg mx-auto text-center mt-8">
-		<div class="text-lg">{@html $t('surveys.loginWarning')}</div>
-		<div class="flex mt-8">
-			<div class="grow border-r-gray-300 border-r py-16">
-				<p class="mb-4">{$t('surveys.loginUser')}</p>
-				<a href="/login?redirect=/tests/{survey.id}" class="button">{$t('button.login')}</a>
-			</div>
-			<div class="grow py-16">
-				<p class="mb-4">{$t('surveys.loginEmail')}</p>
-				<input
-					type="email"
-					placeholder="Email"
-					on:keydown={(e) => e.key === 'Enter' && checkUUID()}
-					class="input block mx-auto"
-					bind:value={uuid}
-				/>
-				<button class="button mt-4 block" on:click={checkUUID}>{$t('button.next')}</button>
-			</div>
+	<div class="max-w-screen-md mx-auto p-5">
+		<Consent
+			introText={$t('register.consent.intro')}
+			participation={$t('register.consent.participation')}
+			participationD={$t('register.consent.participationD')}
+			privacy={$t('register.consent.privacy')}
+			privacyD={$t('register.consent.privacyD')}
+			rights={$t('register.consent.rights')}
+		/>
+		<div class="form-control">
+			<button class="button mt-4" on:click={() => step++}>
+				{$t('register.consent.ok')}
+			</button>
 		</div>
 	</div>
 {:else if step == 1}
-	<div class="max-w-screen-lg mx-auto text-center">
-		<div class="my-16">{@html $t('surveys.introduction')}</div>
-		<button class="button" on:click={() => step++}>{$t('button.next')}</button>
+	<div class="max-w-screen-md mx-auto p-28 flex flex-col items-center min-h-screen">
+		<p class="mb-4 text-lg font-semibold">{$t('surveys.code')}</p>
+		<p class="mb-6 text-sm text-gray-600 text-center">{$t('surveys.codeIndication')}</p>
+		<input
+			type="text"
+			placeholder="Code"
+			class="input block mx-auto w-full max-w-xs border border-gray-300 rounded-md py-2 px-3 text-center"
+			on:keydown={(e) => e.key === 'Enter' && checkCode()}
+			bind:value={code}
+		/>
+		<!-- Button -->
+		<button
+			class="button mt-4 block bg-yellow-500 text-white rounded-md py-2 px-6 hover:bg-yellow-600 transition"
+			on:click={checkCode}
+		>
+			{$t('button.next')}
+		</button>
 	</div>
 {:else if step == 2}
 	{#if type == 'gap'}
@@ -208,7 +268,7 @@
 	{:else}
 		<div class="mx-auto mt-16 text-center">
 			{#if type == 'text'}
-				<pre>{value}</pre>
+				<pre class="text-center font-bold py-4 px-6 m-auto">{value}</pre>
 			{:else if type == 'image'}
 				<img src={value} alt="Question" />
 			{:else if type == 'audio'}
@@ -223,42 +283,158 @@
 			<div class="flex justify-around min-w-[600px] space-x-10">
 				{#each displayQuestionOptions as option (option)}
 					{@const type = option.split(':')[0]}
-					{@const value = option.split(':').slice(1).join(':')}
-					<div
-						class="h-48 w-48 overflow-hidden rounded-lg border border-black"
-						on:click={() => selectOption(option)}
-						role="button"
-						on:keydown={() => selectOption(option)}
-						tabindex="0"
-					>
-						{#if type === 'text'}
-							<span
-								class="flex items-center justify-center h-full w-full text-2xl transition-transform duration-200 ease-in-out transform hover:scale-105"
-							>
-								{value}
-							</span>
-						{:else if type === 'image'}
-							<img
-								src={value}
-								alt="Option {option}"
-								class="object-cover h-full w-full transition-transform duration-200 ease-in-out transform hover:scale-105"
-							/>
-						{:else if type == 'audio'}
-							<audio controls class="w-full" on:click|preventDefault|stopPropagation>
-								<source src={value} type="audio/mpeg" />
-								Your browser does not support the audio element.
-							</audio>
-						{/if}
-					</div>
+					{#if type == 'dropdown'}
+						{@const value = option.split(':')[1].split(', ')}
+						<select
+							class="select select-bordered !ml-0"
+							id="dropdown"
+							name="dropdown"
+							bind:value={option}
+							on:change={() => selectOption(option)}
+							required
+						>
+							{#each value as op}
+								<option value={op}>{op}</option>
+							{/each}
+						</select>
+					{:else if type == 'radio'}
+						{@const value = option.split(':')[1].split(', ')}
+						{#each value as op}
+							<label class="radio-label">
+								<input
+									type="radio"
+									name="dropdown"
+									value={op}
+									on:change={() => selectOption(op)}
+									required
+									class="radio-button"
+								/>
+								{op}
+							</label>
+						{/each}
+					{:else}
+						{@const value = option.split(':').slice(1).join(':')}
+						<div
+							class="h-48 w-48 overflow-hidden rounded-lg border border-black"
+							on:click={() => selectOption(option)}
+							role="button"
+							on:keydown={() => selectOption(option)}
+							tabindex="0"
+						>
+							{#if type === 'text'}
+								<span
+									class="flex items-center justify-center h-full w-full text-2xl transition-transform duration-200 ease-in-out transform hover:scale-105"
+								>
+									{value}
+								</span>
+							{:else if type === 'image'}
+								<img
+									src={value}
+									alt="Option {option}"
+									class="object-cover h-full w-full transition-transform duration-200 ease-in-out transform hover:scale-105"
+								/>
+							{:else if type == 'audio'}
+								<audio controls class="w-full" on:click|preventDefault|stopPropagation>
+									<source src={value} type="audio/mpeg" />
+									Your browser does not support the audio element.
+								</audio>
+							{/if}
+						</div>
+					{/if}
 				{/each}
 			</div>
 		</div>
 	{/if}
-{:else if step == 3}
+{:else if step === 3}
+	{#if currentGroup.id === 1100}
+		{@const genderOptions = [
+			{ value: 'male', label: $t('surveys.genders.male') },
+			{ value: 'female', label: $t('surveys.genders.female') },
+			{ value: 'other', label: $t('surveys.genders.other') },
+			{ value: 'na', label: $t('surveys.genders.na') }
+		]}
+		{#if subStep === 0}
+			<div class="mx-auto mt-16 text-center">
+				<pre class="text-center font-bold py-4 px-6 m-auto">{$t('surveys.birthYear')}</pre>
+				<Dropdown
+					values={Array.from({ length: 82 }, (_, i) => {
+						const year = 1931 + i;
+						return { value: year, display: year };
+					}).reverse()}
+					bind:option={selectedOption}
+					placeholder={$t('surveys.birthYear')}
+					funct={() => selectAnswer('birthYear', selectedOption)}
+				></Dropdown>
+			</div>
+		{:else if subStep === 1}
+			<div class="mx-auto mt-16 text-center">
+				<pre class="text-center font-bold py-4 px-6 m-auto">{$t('surveys.gender')}</pre>
+				<div class="flex flex-col items-center space-y-4">
+					{#each genderOptions as { value, label }}
+						<label class="radio-label flex items-center space-x-2">
+							<input
+								type="radio"
+								name="gender"
+								{value}
+								on:change={() => selectAnswer('gender', value)}
+								required
+								class="radio-button"
+							/>
+							<span>{label}</span>
+						</label>
+					{/each}
+				</div>
+			</div>
+		{:else if subStep === 2}
+			<div class="mx-auto mt-16 text-center">
+				<pre class="text-center font-bold py-4 px-6 m-auto">{$t('surveys.homeLanguage')}</pre>
+				<Dropdown
+					values={Object.entries(config.PRIMARY_LANGUAGE).map(([code, name]) => ({
+						value: code,
+						display: name
+					}))}
+					bind:option={selectedOption}
+					placeholder={$t('surveys.homeLanguage')}
+					funct={() => selectAnswer('primaryLanguage', selectedOption)}
+				></Dropdown>
+			</div>
+		{:else if subStep === 3}
+			<div class="mx-auto mt-16 text-center">
+				<pre class="text-center font-bold py-4 px-6 m-auto">{$t('surveys.education.title')}</pre>
+				<Dropdown
+					values={[
+						{ value: 'na', display: $t('surveys.education.na') },
+						{ value: 'PrimarySchool', display: $t('surveys.education.PrimarySchool') },
+						{ value: 'SecondarySchool', display: $t('surveys.education.SecondarySchool') },
+						{ value: 'NonUni', display: $t('surveys.education.NonUni') },
+						{ value: 'Bachelor', display: $t('surveys.education.Bachelor') },
+						{ value: 'Master', display: $t('surveys.education.Master') }
+					]}
+					bind:option={selectedOption}
+					placeholder={$t('surveys.education.title')}
+					funct={() => selectAnswer('education', selectedOption)}
+				></Dropdown>
+			</div>
+		{/if}
+	{:else}
+		<!--In case special id received not defined, can still keep going-->
+		{(step += 1)}
+	{/if}
+{:else if step == 4}
 	<div class="mx-auto mt-16 text-center">
 		<h1>{$t('surveys.complete')}</h1>
 		{#if finalScore !== null}
 			<p>{$t('surveys.score')} {finalScore} %</p>
 		{/if}
 	</div>
+	{#if user == null}
+		<footer class="mt-auto text-center text-xs py-4">
+			{$t('register.consent.studyData.person')}: {$t('register.consent.studyData.personD')} - {$t(
+				'register.consent.studyData.email'
+			)}:
+			<a href="mailto:{$t('register.consent.studyData.emailD')}" class="link"
+				>{$t('register.consent.studyData.emailD')}</a
+			>
+		</footer>
+	{/if}
 {/if}
diff --git a/scripts/surveys/groups.csv b/scripts/surveys/groups.csv
index 8d9c8aa400ce381ef2542ff194563104e78397b6..ed22a90c908aedc14c604996286f4b925b450cfe 100644
--- a/scripts/surveys/groups.csv
+++ b/scripts/surveys/groups.csv
@@ -1,2 +1,4 @@
 id,title,options
 1,Auditory Picture Vocabulary Test - English,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179
+3,Test,3,4,5
+4,Question,101,102
\ No newline at end of file
diff --git a/scripts/surveys/survey_maker.py b/scripts/surveys/survey_maker.py
index 1d6fc9b7542d1dc04a438afb6076511a836a99bf..eb6c5bd855360f25d315585ff24d7d3818c0cd90 100644
--- a/scripts/surveys/survey_maker.py
+++ b/scripts/surveys/survey_maker.py
@@ -32,15 +32,26 @@ for i, row in df_items.iterrows():
     else:
         print(f"Failed to find corect for item {id_}")
 
-    for j in range(1, 9):
-        op = f"option{j}"
-        if op in row:
-            o[op] = "text:" + row[op]
-        elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/{j}.mp3"):
-            o[op] = f"audio:{REMOTE_ITEMS_FOLDER}/{id_}/{j}.mp3"
-        elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/{j}.jpeg"):
-            o[op] = f"image:{REMOTE_ITEMS_FOLDER}/{id_}/{j}.jpeg"
-
+    if os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_dropdown.txt"):
+        with open(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_dropdown.txt", "r") as file:
+            options = file.read().split(",")
+        options = [option.strip() for option in options]
+        o[f"option1"] = f"dropdown:{', '.join(options)}"
+    elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_radio.txt"):
+        with open(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_radio.txt", "r") as file:
+            options = file.read().split(",")
+        options = [option.strip() for option in options]
+        o[f"option1"] = f"radio:{', '.join(options)}"
+    else:
+        for j in range(1, 9):
+            op = f"option{j}"
+            if op in row:
+                o[op] = "text:" + row[op]
+            elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/{j}.mp3"):
+                o[op] = f"audio:{REMOTE_ITEMS_FOLDER}/{id_}/{j}.mp3"
+            elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/{j}.jpeg"):
+                o[op] = f"image:{REMOTE_ITEMS_FOLDER}/{id_}/{j}.jpeg"
+    # print(o)
 # PARSE GROUPS
 
 groups = []
diff --git a/scripts/surveys/surveys.csv b/scripts/surveys/surveys.csv
index 90ec174f2f7b6c58a343ac540b4d6ac9ca2ae809..d780f21c4957cb3cc0f10881993a7eaee57e7b6a 100644
--- a/scripts/surveys/surveys.csv
+++ b/scripts/surveys/surveys.csv
@@ -1,2 +1,3 @@
 id,title,groups
 1,Title,1
+2,Test,4
\ No newline at end of file