diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19a7a7f5abce9c9ed6a22323441d87b5a83c8c45..9f19078d9a16c30c6b27e2a97efb8de0537c58f6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added
 - Index page for the TAM help center @toberhuber
+- Allow job offers to be imported as draft @dsavvidi
 - Added option to duplicate/copy job offers @dsavvidi
 - Course code and programme are displayed on job offers pages @dsavvidi
 - Added the pay scale to application exports @hpage
diff --git a/src/main/java/nl/tudelft/tam/dto/create/JobOfferCreateDTO.java b/src/main/java/nl/tudelft/tam/dto/create/JobOfferCreateDTO.java
index ddc11da1b650b908d14a80fe15316c72f5712058..27bc543a5299c9692024d5da8d0d775a9bff7b0b 100644
--- a/src/main/java/nl/tudelft/tam/dto/create/JobOfferCreateDTO.java
+++ b/src/main/java/nl/tudelft/tam/dto/create/JobOfferCreateDTO.java
@@ -65,7 +65,7 @@ public class JobOfferCreateDTO extends Create<JobOffer> {
 	private Boolean requireApplicationText = false;
 
 	@Builder.Default
-	private Boolean hidden = false;
+	private Boolean draft = false;
 
 	@Override
 	public Class<JobOffer> clazz() {
diff --git a/src/main/java/nl/tudelft/tam/dto/view/summary/JobOfferSummaryDTO.java b/src/main/java/nl/tudelft/tam/dto/view/summary/JobOfferSummaryDTO.java
index 9682a49108a97170e7a9678c700f799251a00b0f..c2664e4bb287c4b393f2efb2b2a0eb3be631dc17 100644
--- a/src/main/java/nl/tudelft/tam/dto/view/summary/JobOfferSummaryDTO.java
+++ b/src/main/java/nl/tudelft/tam/dto/view/summary/JobOfferSummaryDTO.java
@@ -72,7 +72,7 @@ public class JobOfferSummaryDTO extends View<JobOffer> {
 
 	private Boolean requireApplicationText;
 
-	private Boolean hidden;
+	private Boolean draft;
 
 	@Override
 	public void postApply() {
diff --git a/src/main/java/nl/tudelft/tam/io/ImportHandler.java b/src/main/java/nl/tudelft/tam/io/ImportHandler.java
index f4cb339c1a944f4c784cb3ebdff2dec6c260a4b6..842213de724f39f68302ba522c17fab415aca5f1 100644
--- a/src/main/java/nl/tudelft/tam/io/ImportHandler.java
+++ b/src/main/java/nl/tudelft/tam/io/ImportHandler.java
@@ -48,7 +48,7 @@ public abstract class ImportHandler<E> {
 		for (int i = 0; i < lines.size(); i++) {
 			String[] line = lines.get(i);
 			try {
-				ImportResult<E> result = importLine(line);
+				ImportResult<E> result = importLine(line, i);
 				if (result instanceof ImportResult.Success<E> r) {
 					res.add(r.value());
 				} else if (result instanceof ImportResult.WithWarnings<E> r) {
@@ -77,7 +77,7 @@ public abstract class ImportHandler<E> {
 	 * @param  line The line to import
 	 * @return      The result
 	 */
-	protected abstract ImportResult<E> importLine(String[] line);
+	protected abstract ImportResult<E> importLine(String[] line, int lineNumber);
 
 	/**
 	 * Stops importing the current line and adds an error
diff --git a/src/main/java/nl/tudelft/tam/io/JobOfferImportHandler.java b/src/main/java/nl/tudelft/tam/io/JobOfferImportHandler.java
index 96f182da4fd7a3eee6674840a1ce2b5cc4b52845..86a593d603ec58e85b2cf34c423b6ac6171aee87 100644
--- a/src/main/java/nl/tudelft/tam/io/JobOfferImportHandler.java
+++ b/src/main/java/nl/tudelft/tam/io/JobOfferImportHandler.java
@@ -59,13 +59,15 @@ public class JobOfferImportHandler extends ImportHandler<JobOffer> {
 	}
 
 	@Override
-	protected ImportResult<JobOffer> importLine(String[] line) {
+	protected ImportResult<JobOffer> importLine(String[] line, int lineNumber) {
 		JobOfferCreateDTO job = new JobOfferCreateDTO();
 		List<ImportWarning> warnings = new ArrayList<>();
 
 		// With or without edition info
-		if (line.length != 13 && line.length != 17) {
-			return new ImportResult.Error<>(new SimpleImportError("Wrong amount of entries"));
+		if (line.length != 14 && line.length != 18) {
+			return new ImportResult.Error<>(new SimpleImportError(
+					"Error on line " + lineNumber
+							+ ": Incorrect amount of columns. Did you perhaps use an older version of the template?"));
 		}
 
 		// Try to find edition
@@ -77,20 +79,30 @@ public class JobOfferImportHandler extends ImportHandler<JobOffer> {
 						&& e.getName().equals(editionName))
 				.toList();
 		if (matchingEditions.size() >= 2) {
-			warnings.add(new SimpleImportWarning("Multiple matching editions found, using the first one"));
+			warnings.add(new SimpleImportWarning("Error on line " + lineNumber
+					+ ": Multiple matching editions found, using the first one"));
 		}
 
 		// Parse basic job info
 		LocalDate startDate = parseDate(line[4]).orElseThrow(() -> new ImportLineException(
-				"Start date is not in the correct format, expected: dd-MM-yyyy"));
+				"Error on line " + lineNumber
+						+ ": Column 'Start date' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy"));
 		LocalDate endDate = parseDate(line[5]).orElseThrow(
-				() -> new ImportLineException("End date is not in the correct format, expected: dd-MM-yyyy"));
+				() -> new ImportLineException(
+						"Error on line " + lineNumber
+								+ ": Column 'End date' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy"));
 
 		int maxHours = parseInt(line[7])
-				.orElseThrow(() -> new ImportLineException("Max hours is not a whole number"));
+				.orElseThrow(() -> new ImportLineException(
+						"Error on line " + lineNumber + ": Max hours is not a whole number"));
 		boolean requireApplicationText = parseBoolean(line[9])
 				.orElseThrow(() -> new ImportLineException(
-						"Require response is not in the correct format, expected: yes/no"));
+						"Error on line " + lineNumber
+								+ ": Column 'Require response' contained invalid content. Values allowed are 'yes' or 'no'"));
+		boolean isDraft = parseBoolean(line[12])
+				.orElseThrow(() -> new ImportLineException(
+						"Error on line " + lineNumber
+								+ ": Column 'draft' contained invalid content. Values allowed are 'yes' or 'no'"));
 
 		// Set basic info
 		job.setName(line[2]);
@@ -103,38 +115,45 @@ public class JobOfferImportHandler extends ImportHandler<JobOffer> {
 		job.setRequireApplicationText(requireApplicationText);
 		job.setHiringMessage(line[10]);
 		job.setRejectMessage(line[11]);
-		job.setHidden(false);
+		job.setDraft(isDraft);
 
 		// If there is a deadline, parse and set
-		if (!line[12].isBlank()) {
-			LocalDate deadline = parseDate(line[12]).orElseThrow(() -> new ImportLineException(
-					"Deadline is not in the correct format, expected: dd-MM-yyyy"));
+		if (!line[13].isBlank()) {
+			LocalDate deadline = parseDate(line[13]).orElseThrow(() -> new ImportLineException(
+					"Error on line " + lineNumber
+							+ ": Column 'Deadline' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy"));
 			job.setDeadline(deadline);
 		}
 
 		// Edition info supplied
-		if (line.length == 17) {
-			LocalDateTime editionStart = parseDateTime(line[15]).orElseThrow(() -> new ImportLineException(
-					"Edition start date is not in the correct format, expected: dd-MM-yyyy HH:mm"));
-			LocalDateTime editionEnd = parseDateTime(line[16]).orElseThrow(() -> new ImportLineException(
-					"Edition end date is not in the correct format, expected: dd-MM-yyyy HH:mm"));
+		if (line.length == 18) {
+			LocalDateTime editionStart = parseDateTime(line[16]).orElseThrow(() -> new ImportLineException(
+					"Error on line " + lineNumber
+							+ ": Column 'Edition start date' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy HH:mm"));
+			LocalDateTime editionEnd = parseDateTime(line[17]).orElseThrow(() -> new ImportLineException(
+					"Error on line " + lineNumber
+							+ ": Column 'Edition end date' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy HH:mm"));
 
 			// Need to create edition
 			if (matchingEditions.isEmpty()) {
 				var matchingCourses = courses.stream().filter(c -> c.getCode().equals(courseCode)).toList();
 				if (matchingCourses.size() == 0)
-					error("No courses found matching course code '" + courseCode + "'");
+					error("Error on line " + lineNumber + ": No courses found matching course code '"
+							+ courseCode + "'");
 				if (matchingCourses.size() >= 2)
 					warnings.add(
-							new SimpleImportWarning("Multiple matching courses found, using the first one"));
+							new SimpleImportWarning("Error on line " + lineNumber
+									+ ": Multiple matching courses found, using the first one"));
 				var matchingCohorts = cohorts.stream().filter(
-						c -> c.getProgram().getName().equals(line[14]) && c.getName().equals(line[13]))
+						c -> c.getProgram().getName().equals(line[15]) && c.getName().equals(line[14]))
 						.toList();
 				if (matchingCohorts.size() == 0)
-					error("No cohorts found with name '" + line[13] + "' and programme '" + line[14] + "'");
+					error("Error on line " + lineNumber + ": No cohorts found with name '" + line[14]
+							+ "' and programme '" + line[15] + "'");
 				if (matchingCohorts.size() >= 2)
 					warnings.add(
-							new SimpleImportWarning("Multiple matching cohorts found, using the first one"));
+							new SimpleImportWarning("Error on line " + lineNumber
+									+ ": Multiple matching cohorts found, using the first one"));
 
 				EditionCreateDTO edition = new EditionCreateDTO()
 						.name(editionName)
diff --git a/src/main/java/nl/tudelft/tam/io/TrainingImportHandler.java b/src/main/java/nl/tudelft/tam/io/TrainingImportHandler.java
index 38a00fb15898ba1847533636a8165993f486cb71..2ae5590caeca21dfc6460c32a5cfbbe13a100918 100644
--- a/src/main/java/nl/tudelft/tam/io/TrainingImportHandler.java
+++ b/src/main/java/nl/tudelft/tam/io/TrainingImportHandler.java
@@ -61,28 +61,32 @@ public class TrainingImportHandler extends ImportHandler<TrainingApproval> {
 	}
 
 	@Override
-	protected ImportResult<TrainingApproval> importLine(String[] line) {
+	protected ImportResult<TrainingApproval> importLine(String[] line, int lineNumber) {
 		TrainingApprovalCreateDTO training = new TrainingApprovalCreateDTO();
 		List<ImportWarning> warnings = new ArrayList<>();
 
 		if (line.length != 3) {
-			return new ImportResult.Error<>(new SimpleImportError("Wrong amount of entries"));
+			return new ImportResult.Error<>(
+					new SimpleImportError("Error on line " + lineNumber + ": Wrong amount of entries"));
 		}
 
 		if (line[0] == null || line[0].isEmpty()) {
-			return new ImportResult.Error<>(new SimpleImportError("User identifier is not specified"));
+			return new ImportResult.Error<>(new SimpleImportError(
+					"Error on line " + lineNumber + ": User identifier is not specified"));
 		}
 
 		var personSearchResult = personService.searchForPeople(line[0]);
 
 		if (personSearchResult.isEmpty()) {
 			return new ImportResult.Error<>(
-					new SimpleImportError("User with identifier " + line[0] + " not found"));
+					new SimpleImportError("Error on line " + lineNumber + ": User with identifier " + line[0]
+							+ " not found"));
 		}
 
 		if (personSearchResult.size() > 1) {
 			warnings.add(new SimpleImportWarning(
-					"Multiple users with identifier " + line[0] + " found, using the first one"));
+					"Error on line " + lineNumber + ": Multiple users with identifier " + line[0]
+							+ " found, using the first one"));
 		}
 
 		List<TrainingType> validTrainingTypes = trainingTypeService
@@ -90,19 +94,22 @@ public class TrainingImportHandler extends ImportHandler<TrainingApproval> {
 
 		if (validTrainingTypes.isEmpty()) {
 			return new ImportResult.Error<>(
-					new SimpleImportError("Training type with name " + line[1] + " not found"));
+					new SimpleImportError("Error on line " + lineNumber + ": Training type with name "
+							+ line[1] + " not found"));
 		}
 
 		if (validTrainingTypes.size() > 1) {
 			warnings.add(new SimpleImportWarning(
-					"Multiple training types with name " + line[1] + " found, using the first one"));
+					"Error on line " + lineNumber + ": Multiple training types with name " + line[1]
+							+ " found, using the first one"));
 		}
 
 		if (trainingApprovalService
 				.findByPersonIdAndType(personSearchResult.get(0).getId(), validTrainingTypes.get(0))
 				.isPresent()) {
 			return new ImportResult.Error<>(
-					new SimpleImportError("User " + line[0] + " already completed training " + line[1]));
+					new SimpleImportError("Error on line " + lineNumber + ": User " + line[0]
+							+ " already completed training " + line[1]));
 		}
 
 		training.setPerson(
@@ -110,7 +117,8 @@ public class TrainingImportHandler extends ImportHandler<TrainingApproval> {
 		training.setType(validTrainingTypes.get(0));
 		training.setDatePassed(parseDate(line[2])
 				.orElseThrow(() -> new ImportLineException(
-						"Deadline is not in the correct format, expected: dd-MM-yyyy")));
+						"Error on line " + lineNumber
+								+ ": Deadline is not in the correct format, expected: dd-MM-yyyy")));
 		training.setApprovedBy(new ProfileIdDTO(authorisationService.getAuthPerson().getId()));
 		return warnings.isEmpty() ? new ImportResult.Success<>(converter.apply(training))
 				: new ImportResult.WithWarnings<>(converter.apply(training), warnings);
diff --git a/src/main/java/nl/tudelft/tam/model/JobOffer.java b/src/main/java/nl/tudelft/tam/model/JobOffer.java
index 4afd2d10ee3794b8e9cf8779503a5ae1cdca5985..4a5cacb1c30a3fa230ca209292c406778b5b558f 100644
--- a/src/main/java/nl/tudelft/tam/model/JobOffer.java
+++ b/src/main/java/nl/tudelft/tam/model/JobOffer.java
@@ -122,5 +122,5 @@ public class JobOffer {
 
 	@NotNull
 	@Builder.Default
-	private Boolean hidden = true;
+	private Boolean draft = true;
 }
diff --git a/src/main/java/nl/tudelft/tam/repository/JobOfferRepository.java b/src/main/java/nl/tudelft/tam/repository/JobOfferRepository.java
index 629d27a313148d99c20438d8c1359804a8c1e112..483bdf2835c2710ca83a33ef2ab6c3bcfad36540 100644
--- a/src/main/java/nl/tudelft/tam/repository/JobOfferRepository.java
+++ b/src/main/java/nl/tudelft/tam/repository/JobOfferRepository.java
@@ -41,8 +41,8 @@ public interface JobOfferRepository extends JpaRepository<JobOffer, Long> {
 				.orElseThrow(() -> new ResourceNotFoundException("JobOffer was not found: " + id));
 	}
 
-	@Query("SELECT j FROM JobOffer j WHERE (j.deadline IS NULL OR j.deadline > :date) AND j.hidden = false")
-	List<JobOffer> findAllByDeadlineIsNullOrDeadlineIsAfterAndHiddenIsFalse(@Param("date") LocalDate date);
+	@Query("SELECT j FROM JobOffer j WHERE (j.deadline IS NULL OR j.deadline > :date) AND j.draft = false")
+	List<JobOffer> findAllByDeadlineIsNullOrDeadlineIsAfterAndDraftIsFalse(@Param("date") LocalDate date);
 
 	List<JobOffer> findAllByDeadlineIsBefore(LocalDate date);
 
@@ -52,7 +52,7 @@ public interface JobOfferRepository extends JpaRepository<JobOffer, Long> {
 	 * @return List of job offers
 	 */
 	default List<JobOffer> findAllOpen() {
-		return findAllByDeadlineIsNullOrDeadlineIsAfterAndHiddenIsFalse(LocalDate.now().minusDays(1));
+		return findAllByDeadlineIsNullOrDeadlineIsAfterAndDraftIsFalse(LocalDate.now().minusDays(1));
 	}
 
 	/**
diff --git a/src/main/java/nl/tudelft/tam/security/AuthorisationService.java b/src/main/java/nl/tudelft/tam/security/AuthorisationService.java
index a5c51a1479c119027bacef56f2c9092534e56a83..ed07526adbe67cbf31f584b4df20acd5ac2141cb 100644
--- a/src/main/java/nl/tudelft/tam/security/AuthorisationService.java
+++ b/src/main/java/nl/tudelft/tam/security/AuthorisationService.java
@@ -250,7 +250,7 @@ public class AuthorisationService {
 	public boolean canSubmitApplication(Long offerId) {
 		JobOffer jobOffer = jobOfferService.findByIdOrThrow(offerId);
 		return !applicationService.appExistsFor(getAuthPerson().getId(), offerId) &&
-				!jobOffer.getHidden() &&
+				!jobOffer.getDraft() &&
 				!canManageEdition(jobOffer.getEditionId()) &&
 				(jobOffer.getDeadline() == null || !LocalDate.now().isAfter(jobOffer.getDeadline()));
 	}
diff --git a/src/main/java/nl/tudelft/tam/service/JobOfferService.java b/src/main/java/nl/tudelft/tam/service/JobOfferService.java
index 756a27fa556402024ac41e19577d24cd8659704f..c9fa87bbdf8bd2ea81fcbee5b20b91d1768e2e75 100644
--- a/src/main/java/nl/tudelft/tam/service/JobOfferService.java
+++ b/src/main/java/nl/tudelft/tam/service/JobOfferService.java
@@ -403,14 +403,14 @@ public class JobOfferService {
 	}
 
 	/**
-	 * Toggles the hidden state of a job offer.
+	 * Toggles the draft state of a job offer.
 	 *
 	 * @param id The id of the job offer.
 	 */
 	@Transactional
 	public void toggleHide(Long id) {
 		JobOffer offer = jobOfferRepository.findByIdOrThrow(id);
-		offer.setHidden(!offer.getHidden());
+		offer.setDraft(!offer.getDraft());
 	}
 
 	/**
diff --git a/src/main/java/nl/tudelft/tam/startup/PublishAllJobOffersService.java b/src/main/java/nl/tudelft/tam/startup/PublishAllJobOffersService.java
index 28eda268c62a2b822c28fea9c1836d73c76da68b..b6133c00743b60572adc84d91f65cff4500a8ea1 100644
--- a/src/main/java/nl/tudelft/tam/startup/PublishAllJobOffersService.java
+++ b/src/main/java/nl/tudelft/tam/startup/PublishAllJobOffersService.java
@@ -40,6 +40,6 @@ public class PublishAllJobOffersService {
 	@Transactional
 	@EventListener(ApplicationReadyEvent.class)
 	public void publishAllJobOffers() {
-		jobOfferRepository.findAll().forEach(jobOffer -> jobOffer.setHidden(false));
+		jobOfferRepository.findAll().forEach(jobOffer -> jobOffer.setDraft(false));
 	}
 }
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
index c66f3e1edd7d13d85c47b69de5e8fa53402cabad..93d3db808717215ff935436e4e61321320d6f2af 100644
--- a/src/main/resources/messages.properties
+++ b/src/main/resources/messages.properties
@@ -210,7 +210,7 @@ jobOffer.information Job Information
 jobOffer.import = Import Job Offers
 jobOffer.import.successful = Successfully imported {0} job offer(s).
 jobOffer.import.info = Import bulk job offers via a CSV file. The first line is considered as headers and will not be read. Each job offer should be a separate row, with the following columns in this order:
-jobOffer.import.info.columnOrder = Edition Name, Course Code, Job Offer Description, Contract Name, Contract Start Date, Contract End Date, Contract Baan Code, Max Hours, Job Information, Require Response to Job Information (yes/no), Hiring Message, Rejection Message, Application Deadline
+jobOffer.import.info.columnOrder = Edition Name, Course Code, Job Offer Description, Contract Name, Contract Start Date, Contract End Date, Contract Baan Code, Max Hours, Job Information, Require Response to Job Information (yes/no), Hiring Message, Rejection Message, Draft (yes/no), Application Deadline
 jobOffer.import.info.editionCreate = If you want to create non-existing/new editions, add the following columns in this order:
 jobOffer.import.info.editionCreate.columnOrder = Cohort Name, Program Name, Edition Start Date, Edition End Date
 jobOffer.import.missingEditions = Missing Editions
@@ -232,7 +232,7 @@ jobOffer.addOffer.notFound = No students matching this query found. Try checking
 jobOffer.addOffer.confirm = Confirm Offering to All
 jobOffer.addOffer.confirm.desc = Are you sure you would like to offer a position to the following people:
 jobOffer.hide = Hide Offer
-jobOffer.hide.info = This job offer is hidden. It cannot be seen by students. If this job offer should not be hidden, you can make it visible by pressing 'Publish Offer' below.
+jobOffer.hide.info = This job offer is hidden/draft. It cannot be seen by students. If this job offer should not be hidden, you can make it visible by pressing 'Publish Offer' below.
 jobOffer.share = Share Offer 
 jobOffer.show = Publish Offer
 jobOffer.apply = Apply
diff --git a/src/main/resources/migrations.yaml b/src/main/resources/migrations.yaml
index 3e5a2b1c6702bc88f75035cfddacad1c92e792bb..ee301727204387e20815234a278c8e526351427a 100644
--- a/src/main/resources/migrations.yaml
+++ b/src/main/resources/migrations.yaml
@@ -928,4 +928,13 @@ databaseChangeLog:
                 name: teachers_have_access
                 type: bit
                 defaultValueBoolean: true
-          tableName: tamprogram
\ No newline at end of file
+          tableName: tamprogram
+- changeSet:
+    id: rename-hidden-column
+    author: dsav
+    changes:
+      - renameColumn:
+          newColumnName: draft
+          oldColumnName: hidden
+          columnDataType: bit
+          tableName: job_offer
\ No newline at end of file
diff --git a/src/main/resources/static/import_templates/import_job_offers_template.csv b/src/main/resources/static/import_templates/import_job_offers_template.csv
index af8eac97ca8961987b695e00f56a763535fcb887..70f0c049e510dcfb31a67507a73bea6fd3371b25 100644
--- a/src/main/resources/static/import_templates/import_job_offers_template.csv
+++ b/src/main/resources/static/import_templates/import_job_offers_template.csv
@@ -1,4 +1,4 @@
-Edition Name,Course Code,Job Offer Description,Contract Name,"Contract Start Date (dd-MM-yyyy)","Contract End Date (dd-MM-yyyy)",Contract Baan Code,"Max Hours (per Student, Integer)",Job Information,Require Response to Job Information (yes/no),Hiring Message,Rejection Message,"Application Deadline (dd-MM-yyyy, Leave empty for no deadline)","Cohort Name (Optional, Creates new edition)","Program Name (Optional, Creates new edition)","Edition Start Date (dd-MM-yyyy HH:mm) (Optional, Creates new edition)","Edition End Date (dd-MM-yyyy HH:mm) (Optional, Creates new edition)"
-22/23 Q3,CSE2000,TA,CSE2000-Q3-TA,24-04-2023,30-06-2023,IIT IEP500,90,How many hours are you available,yes,Labs will take place on Mondays and Fridays between 8:45 and 12:45. Please include your availability when sending your application.,"Thank you for applying to TA this course. After careful consideration, we have decided to pursue other candidates whom we feel more closely meet our needs at this time.",15-04-2023,CSE 2022,Bachelor Computer Science and Engineering,01-09-2022 00:00,31-08-2023 23:59
-22/23 Q3,CSE3210,TA,CSE3210-TA,24-04-2023,30-06-2023,IIT IEP507,20,,no,You may be selected for a short 10 minute interview for this position.,"Thank you for applying to be a mentor. After careful consideration, we have decided to pursue other candidates whom we feel more closely meet our needs at this time.",
-23/24 Q1/Q2,CSE1000,Mentor,CSE1000-Mentor,01-09-2023,28-02-2024,IIT IEP501,40,,no,,,01-08-2023,CSE 2023,Bachelor Computer Science and Engineering,01-09-2023 00:00,31-08-2024 23:59
\ No newline at end of file
+Edition Name,Course Code,Job Offer Description,Contract Name,"Contract Start Date (dd-MM-yyyy)","Contract End Date (dd-MM-yyyy)",Contract Baan Code,"Max Hours (per Student, Integer)",Job Information,Require Response to Job Information (yes/no),Hiring Message,Rejection Message,Draft  (yes/no),"Application Deadline (dd-MM-yyyy, Leave empty for no deadline)","Cohort Name (Optional, Creates new edition)","Program Name (Optional, Creates new edition)","Edition Start Date (dd-MM-yyyy HH:mm) (Optional, Creates new edition)","Edition End Date (dd-MM-yyyy HH:mm) (Optional, Creates new edition)"
+22/23 Q3,CSE2000,TA,CSE2000-Q3-TA,24-04-2023,30-06-2023,IIT IEP500,90,How many hours are you available,yes,Labs will take place on Mondays and Fridays between 8:45 and 12:45. Please include your availability when sending your application.,"Thank you for applying to TA this course. After careful consideration, we have decided to pursue other candidates whom we feel more closely meet our needs at this time.",yes,15-04-2023,CSE 2022,Bachelor Computer Science and Engineering,01-09-2022 00:00,31-08-2023 23:59
+22/23 Q3,CSE3210,TA,CSE3210-TA,24-04-2023,30-06-2023,IIT IEP507,20,,no,You may be selected for a short 10 minute interview for this position.,"Thank you for applying to be a mentor. After careful consideration, we have decided to pursue other candidates whom we feel more closely meet our needs at this time.",yes,
+23/24 Q1/Q2,CSE1000,Mentor,CSE1000-Mentor,01-09-2023,28-02-2024,IIT IEP501,40,,no,,,no,01-08-2023,CSE 2023,Bachelor Computer Science and Engineering,01-09-2023 00:00,31-08-2024 23:59
\ No newline at end of file
diff --git a/src/main/resources/templates/job_offer/create.html b/src/main/resources/templates/job_offer/create.html
index 493bbf09d407399a901335fcacf092557d6b7798..daf29f14446a6b97882c5ba8e7cfd85fc815698f 100644
--- a/src/main/resources/templates/job_offer/create.html
+++ b/src/main/resources/templates/job_offer/create.html
@@ -193,9 +193,9 @@
                 <div class="checkbox">
                     <input
                         id="make-draft"
-                        th:checked="${offer?.hidden != null}"
+                        th:checked="${offer?.draft != null}"
                         type="checkbox"
-                        th:name="hidden" />
+                        th:name="draft" />
                     <label for="make-draft" th:text="#{jobOffer.draft}"></label>
                 </div>
                 <div class="flex space-between">
diff --git a/src/main/resources/templates/job_offer/view_many.html b/src/main/resources/templates/job_offer/view_many.html
index ec533f7b8c73025c2c4ee51aad722f46ead21b53..2e14a08cee3001ad047f29ec1930ac6ae4fc2580 100644
--- a/src/main/resources/templates/job_offer/view_many.html
+++ b/src/main/resources/templates/job_offer/view_many.html
@@ -122,7 +122,7 @@
                         </tr>
                         <tr
                             th:each="offer : ${edition.offers}"
-                            th:if="${!offer.hidden}"
+                            th:if="${!offer.draft}"
                             th:with="applicationsTab=false, app=${userApplications.get(offer.id)}, status=${app.getStatus()?.name()}">
                             <td class="fit-content">
                                 <span
diff --git a/src/main/resources/templates/job_offer/view_one.html b/src/main/resources/templates/job_offer/view_one.html
index e321c268d9f94dbed884c73a3c46c49c43ff03e8..e024de7fa0bfbfa5b86a58f67b74ebee1419efc8 100644
--- a/src/main/resources/templates/job_offer/view_one.html
+++ b/src/main/resources/templates/job_offer/view_one.html
@@ -48,7 +48,7 @@
             <h1
                 class="font-800"
                 th:text="|${offer.edition.course.name} (${offer.edition.course.code}) - ${offer.name}|"></h1>
-            <div th:if="${offer.hidden}" class="banner mb-3" data-type="warning">
+            <div th:if="${offer.draft}" class="banner mb-3" data-type="warning">
                 <span class="banner__icon fa-solid fa-warning"></span>
                 <p th:text="#{jobOffer.hide.info}"></p>
             </div>
@@ -75,8 +75,8 @@
                     class="button"
                     data-style="outlined"
                     th:form="toggle-hidden"
-                    th:aria-label="${offer.hidden} ? #{jobOffer.show} : #{jobOffer.hide}"
-                    th:text="${offer.hidden} ? #{jobOffer.show} : #{jobOffer.hide}"></button>
+                    th:aria-label="${offer.draft} ? #{jobOffer.show} : #{jobOffer.hide}"
+                    th:text="${offer.draft} ? #{jobOffer.show} : #{jobOffer.hide}"></button>
                 <button
                     class="button"
                     data-style="outlined"
diff --git a/src/test/java/nl/tudelft/tam/controller/JobOfferControllerTest.java b/src/test/java/nl/tudelft/tam/controller/JobOfferControllerTest.java
index d457bbbcdecb65444ead4f9f716897aab7439d74..4438577969fe471c2ef810172459a5d6b53bfe68 100644
--- a/src/test/java/nl/tudelft/tam/controller/JobOfferControllerTest.java
+++ b/src/test/java/nl/tudelft/tam/controller/JobOfferControllerTest.java
@@ -136,15 +136,15 @@ class JobOfferControllerTest {
 
 		offer1 = JobOfferDetailsDTO.builder().name("offer-1").id(JOFFER_ID_1).editionId(EDITION_ID)
 				.edition(edition)
-				.hidden(false)
+				.draft(false)
 				.deadline(LocalDate.now().plusDays(1)).build();
 		offer2 = JobOfferDetailsDTO.builder().name("offer-2").id(JOFFER_ID_2).editionId(EDITION_ID)
 				.edition(edition)
-				.hidden(false)
+				.draft(false)
 				.deadline(LocalDate.now().plusDays(2)).build();
 		offer1Job = JobOffer.builder().name("offer-1").id(JOFFER_ID_1).editionId(EDITION_ID)
-				.deadline(LocalDate.now().plusDays(1)).hidden(false).build();
-		offer2Job = JobOffer.builder().name("offer-2").id(JOFFER_ID_2).hidden(false).editionId(EDITION_ID)
+				.deadline(LocalDate.now().plusDays(1)).draft(false).build();
+		offer2Job = JobOffer.builder().name("offer-2").id(JOFFER_ID_2).draft(false).editionId(EDITION_ID)
 				.deadline(LocalDate.now().plusDays(2)).build();
 
 		work1 = ExtraWorkSummaryDTO.builder().name("work-1").id(EWORK_ID_1).editionId(EDITION_ID)
diff --git a/src/test/java/nl/tudelft/tam/io/JobOfferImportHandlerTest.java b/src/test/java/nl/tudelft/tam/io/JobOfferImportHandlerTest.java
index 888d18c25e6b073baa4fc5c1885d26eecca6b04a..8d29b645a0ae4647aed844c988af4122381b28ef 100644
--- a/src/test/java/nl/tudelft/tam/io/JobOfferImportHandlerTest.java
+++ b/src/test/java/nl/tudelft/tam/io/JobOfferImportHandlerTest.java
@@ -77,9 +77,9 @@ public class JobOfferImportHandlerTest {
 	@Test
 	void importRegular() {
 		String content = """
-				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023
-				edition,CSE1100,Mentor,Mentor,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023
-				edition 2,CSE1200,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,yes,,,01-01-2023
+				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,yes,01-01-2023
+				edition,CSE1100,Mentor,Mentor,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,no,01-01-2023
+				edition 2,CSE1200,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,yes,,,no,01-01-2023
 				""".stripIndent();
 
 		ImportHandler.Result<JobOffer> res = importHandler
@@ -96,7 +96,7 @@ public class JobOfferImportHandlerTest {
 	@Test
 	void importCreateEdition() {
 		String content = """
-				new edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023,cohort,programme,01-01-2023 00:00,01-01-2024 00:00
+				new edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,no,01-01-2023,cohort,programme,01-01-2023 00:00,01-01-2024 00:00
 				"""
 				.stripIndent();
 
@@ -119,7 +119,7 @@ public class JobOfferImportHandlerTest {
 	@Test
 	void importWrongStartDate() {
 		String content = """
-				edition,CSE1100,TA,TA,2023-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023
+				edition,CSE1100,TA,TA,2023-01-2023,01-01-2024,IIT EIP404,10,,no,,,no,01-01-2023
 				""".stripIndent();
 
 		ImportHandler.Result<JobOffer> res = importHandler
@@ -127,13 +127,14 @@ public class JobOfferImportHandlerTest {
 
 		assertThat(res.errors()).containsKey(1);
 		assertThat(res.errors().get(1)).contains(
-				new SimpleImportError("Start date is not in the correct format, expected: dd-MM-yyyy"));
+				new SimpleImportError(
+						"Error on line 0: Column 'Start date' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy"));
 	}
 
 	@Test
 	void importWrongEndDate() {
 		String content = """
-				edition,CSE1100,TA,TA,01-01-2023,01-16-2024,IIT EIP404,10,,no,,,01-01-2023
+				edition,CSE1100,TA,TA,01-01-2023,01-16-2024,IIT EIP404,10,,no,,,no,01-01-2023
 				""".stripIndent();
 
 		ImportHandler.Result<JobOffer> res = importHandler
@@ -141,26 +142,28 @@ public class JobOfferImportHandlerTest {
 
 		assertThat(res.errors()).containsKey(1);
 		assertThat(res.errors().get(1)).contains(
-				new SimpleImportError("End date is not in the correct format, expected: dd-MM-yyyy"));
+				new SimpleImportError(
+						"Error on line 0: Column 'End date' contained invalid content. Values allowed are expected in the format: dd-MM-yyyy"));
 	}
 
 	@Test
 	void importWrongAmountOfHours() {
 		String content = """
-				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,20.5,,no,,,01-01-2023
+				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,20.5,,no,,,no,01-01-2023
 				""".stripIndent();
 
 		ImportHandler.Result<JobOffer> res = importHandler
 				.importFile(Arrays.stream(content.split("\n")).map(l -> l.split(",")).toList());
 
 		assertThat(res.errors()).containsKey(1);
-		assertThat(res.errors().get(1)).contains(new SimpleImportError("Max hours is not a whole number"));
+		assertThat(res.errors().get(1))
+				.contains(new SimpleImportError("Error on line 0: Max hours is not a whole number"));
 	}
 
 	@Test
 	void importWrongRequireResponse() {
 		String content = """
-				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,20,,aaaaa,,,01-01-2023
+				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,20,,aaaaa,,,no,01-01-2023
 				""".stripIndent();
 
 		ImportHandler.Result<JobOffer> res = importHandler
@@ -168,6 +171,22 @@ public class JobOfferImportHandlerTest {
 
 		assertThat(res.errors()).containsKey(1);
 		assertThat(res.errors().get(1)).contains(
-				new SimpleImportError("Require response is not in the correct format, expected: yes/no"));
+				new SimpleImportError(
+						"Error on line 0: Column 'Require response' contained invalid content. Values allowed are 'yes' or 'no'"));
+	}
+
+	@Test
+	void importWrongDraft() {
+		String content = """
+				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,20,,yes,,,eeeeeeee,01-01-2023
+				""".stripIndent();
+
+		ImportHandler.Result<JobOffer> res = importHandler
+				.importFile(Arrays.stream(content.split("\n")).map(l -> l.split(",")).toList());
+
+		assertThat(res.errors()).containsKey(1);
+		assertThat(res.errors().get(1)).contains(
+				new SimpleImportError(
+						"Error on line 0: Column 'draft' contained invalid content. Values allowed are 'yes' or 'no'"));
 	}
 }
diff --git a/src/test/java/nl/tudelft/tam/io/TrainingImportHandlerTest.java b/src/test/java/nl/tudelft/tam/io/TrainingImportHandlerTest.java
index 1eff473870955da499d5d5e31040a6d76bc8ea1b..ea42d0d5aef52f984a1aae0c8830fa3317515545 100644
--- a/src/test/java/nl/tudelft/tam/io/TrainingImportHandlerTest.java
+++ b/src/test/java/nl/tudelft/tam/io/TrainingImportHandlerTest.java
@@ -129,7 +129,7 @@ class TrainingImportHandlerTest {
 		assertThat(res.warnings()).isEmpty();
 		assertThat(res.errors()).hasSize(1);
 		assertThat(res.result()).hasSize(3);
-		assertThat(res.errors()).containsEntry(4, List.of(new SimpleImportError("Wrong amount of entries")));
+		assertThat(res.errors()).containsEntry(4, List.of(new SimpleImportError("Error on line 3: Wrong amount of entries")));
 		assertThat(res.result().get(0).getType()).isEqualTo(t1);
 		assertThat(res.result().get(0).getDatePassed()).isEqualTo(LocalDate.of(2003, 2, 26));
 		assertThat(res.result().stream().map(x -> x.getPerson().getId()).distinct().toList())
@@ -156,7 +156,7 @@ class TrainingImportHandlerTest {
 		assertThat(res.result()).hasSize(2);
 
 		assertThat(res.errors()).containsEntry(3,
-				List.of(new SimpleImportError("User with identifier csestudent3 not found")));
+				List.of(new SimpleImportError("Error on line 2: User with identifier csestudent3 not found")));
 
 	}
 
@@ -176,7 +176,8 @@ class TrainingImportHandlerTest {
 		assertThat(res.result()).hasSize(1);
 
 		assertThat(res.errors()).containsEntry(2, List
-				.of(new SimpleImportError("Deadline is not in the correct format, expected: dd-MM-yyyy")));
+				.of(new SimpleImportError(
+						"Error on line 1: Deadline is not in the correct format, expected: dd-MM-yyyy")));
 
 	}
 
@@ -197,7 +198,7 @@ class TrainingImportHandlerTest {
 		assertThat(res.errors()).isEmpty();
 		assertThat(res.result()).hasSize(2);
 		assertThat(res.warnings()).containsEntry(1, List.of(new SimpleImportWarning(
-				"Multiple training types with name Regular Training found, using the first one")));
+				"Error on line 0: Multiple training types with name Regular Training found, using the first one")));
 
 	}
 
diff --git a/src/test/java/nl/tudelft/tam/repository/JobOfferRepositoryTest.java b/src/test/java/nl/tudelft/tam/repository/JobOfferRepositoryTest.java
index ab02bb471b961a572d58ffeb4299b91e19cd8ae8..645c3e2876b041763f275f2abacf37b210b0a5ab 100644
--- a/src/test/java/nl/tudelft/tam/repository/JobOfferRepositoryTest.java
+++ b/src/test/java/nl/tudelft/tam/repository/JobOfferRepositoryTest.java
@@ -55,7 +55,7 @@ class JobOfferRepositoryTest {
 				.editionId(41L)
 				.deadline(LocalDate.now().minusDays(1))
 				.contractName("Test")
-				.hidden(true)
+				.draft(true)
 				.contractStartDate(LocalDate.now())
 				.contractEndDate(LocalDate.now().plusWeeks(2))
 				.baanCode("Test JO BAAN CODE")
@@ -66,7 +66,7 @@ class JobOfferRepositoryTest {
 				.id(id2)
 				.editionId(42L)
 				.deadline(LocalDate.now())
-				.hidden(true)
+				.draft(true)
 				.contractName("Test 3")
 				.contractStartDate(LocalDate.now())
 				.contractEndDate(LocalDate.now().plusWeeks(2))
@@ -79,7 +79,7 @@ class JobOfferRepositoryTest {
 				.editionId(43L)
 				.deadline(LocalDate.now().plusDays(1))
 				.contractName("Test 3")
-				.hidden(true)
+				.draft(true)
 				.contractStartDate(LocalDate.now())
 				.contractEndDate(LocalDate.now().plusWeeks(2))
 				.baanCode("Test 3 JO BAAN CODE")
@@ -96,7 +96,7 @@ class JobOfferRepositoryTest {
 	}
 
 	@Test
-	void findAllOpenAndHidden() {
+	void findAllOpenAnddraft() {
 		assert (repository.findAllOpen()).isEmpty();
 		repository.save(jobOffer1);
 		repository.save(jobOffer2);
@@ -106,10 +106,10 @@ class JobOfferRepositoryTest {
 	}
 
 	@Test
-	void findAllOpenAndSomeNotHidden() {
+	void findAllOpenAndSomeNotdraft() {
 		assert (repository.findAllOpen()).isEmpty();
-		jobOffer1.setHidden(false);
-		jobOffer2.setHidden(false);
+		jobOffer1.setDraft(false);
+		jobOffer2.setDraft(false);
 		JobOffer offer_1 = repository.save(jobOffer1);
 		JobOffer offer_2 = repository.save(jobOffer2);
 		JobOffer offer_3 = repository.save(jobOffer3);
diff --git a/src/test/java/nl/tudelft/tam/service/JobOfferServiceTest.java b/src/test/java/nl/tudelft/tam/service/JobOfferServiceTest.java
index d28f728b5db0760cec56d4a40bef9266b9777dfb..994211b5921fb4f3a077168af7faebb035f8bacd 100644
--- a/src/test/java/nl/tudelft/tam/service/JobOfferServiceTest.java
+++ b/src/test/java/nl/tudelft/tam/service/JobOfferServiceTest.java
@@ -193,7 +193,7 @@ class JobOfferServiceTest {
 		when(courseService.getCourseById(anyLong())).thenReturn(new CourseDetailsDTO().program(new ProgramSummaryDTO().id(1L)));
 
 		JobOfferCreateDTO createDTO = JobOfferCreateDTO.builder().editionId(jobOffer1.getEditionId())
-				.hidden(false).maxHours(100).build();
+				.draft(false).maxHours(100).build();
 
 		assertThat(service.newJobOffer(createDTO)).isEqualTo(jobOffer1.getId());
 
@@ -207,7 +207,7 @@ class JobOfferServiceTest {
 		when(courseService.getCourseById(anyLong())).thenReturn(new CourseDetailsDTO().program(new ProgramSummaryDTO().id(1L)));
 
 		JobOfferCreateDTO createDTO = JobOfferCreateDTO.builder().editionId(jobOffer1.getEditionId())
-				.hidden(true).maxHours(100).build();
+				.draft(true).maxHours(100).build();
 
 		assertThat(service.newJobOffer(createDTO)).isEqualTo(jobOffer1.getId());
 
@@ -392,10 +392,10 @@ class JobOfferServiceTest {
 		when(courseService.getCourseById(anyLong())).thenReturn(new CourseDetailsDTO().program(new ProgramSummaryDTO().id(1L)));
 
 		String content = """
-				Edition,Course Code,Job Name,Contract Name,Start Date,End Date,Baancode,Max Hours,Hiring Message,Rejection Message,Deadline
-				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023
-				edition,CSE1100,Mentor,Mentor,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023
-				edition 2,CSE1200,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,01-01-2023
+				Edition,Course Code,Job Name,Contract Name,Start Date,End Date,Baancode,Max Hours,Hiring Message,Rejection Message,Draft,Deadline
+				edition,CSE1100,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,no,01-01-2023
+				edition,CSE1100,Mentor,Mentor,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,yes,01-01-2023
+				edition 2,CSE1200,TA,TA,01-01-2023,01-01-2024,IIT EIP404,10,,no,,,no,01-01-2023
 				"""
 				.stripIndent();
 
@@ -510,15 +510,15 @@ class JobOfferServiceTest {
 		Long id = 1L;
 		JobOffer offer = new JobOffer();
 		offer.setId(id);
-		offer.setHidden(false);
+		offer.setDraft(false);
 
 		when(repository.findByIdOrThrow(id)).thenReturn(offer);
 
 		service.toggleHide(id);
-		assertTrue(offer.getHidden());
+		assertTrue(offer.getDraft());
 
 		service.toggleHide(id);
-		assertFalse(offer.getHidden());
+		assertFalse(offer.getDraft());
 	}
 
 	@Test
diff --git a/src/test/java/nl/tudelft/tam/startup/PublishAllJobOffersTest.java b/src/test/java/nl/tudelft/tam/startup/PublishAllJobOffersTest.java
index 7b7b09e2024d257bf2c0bc4ea9ad4e1dd57b9f7c..1f083dec6bcd520d40870f4fbcfa82a950859d2b 100644
--- a/src/test/java/nl/tudelft/tam/startup/PublishAllJobOffersTest.java
+++ b/src/test/java/nl/tudelft/tam/startup/PublishAllJobOffersTest.java
@@ -53,7 +53,7 @@ public class PublishAllJobOffersTest {
 				.deadline(LocalDate.now().plusDays(7))
 				.editionId(1L)
 				.maxHours(100)
-				.hidden(false)
+				.draft(false)
 				.build();
 
 		jobOffer2 = JobOffer.builder()
@@ -62,7 +62,7 @@ public class PublishAllJobOffersTest {
 				.name("Test-Job-closed")
 				.deadline(LocalDate.now().minusDays(7))
 				.maxHours(100)
-				.hidden(true)
+				.draft(true)
 				.build();
 	}
 
@@ -70,13 +70,13 @@ public class PublishAllJobOffersTest {
 	public void testPublishAllJobOffers() {
 		List<JobOffer> jobOffers = List.of(jobOffer1, jobOffer2);
 		when(jobOfferRepository.findAll()).thenReturn(jobOffers);
-		assertTrue(jobOffer2.getHidden());
+		assertTrue(jobOffer2.getDraft());
 
 		service.publishAllJobOffers();
 
 		verify(jobOfferRepository).findAll();
 
-		assertFalse(jobOffer1.getHidden());
-		assertFalse(jobOffer2.getHidden());
+		assertFalse(jobOffer1.getDraft());
+		assertFalse(jobOffer2.getDraft());
 	}
 }