diff --git a/Classes/Controller/Ajax/JoblistController.php b/Classes/Controller/Ajax/JoblistController.php
index 320a8ee205cebfa4da721af2a984d006734be1d5..9c58a0535bac2ece19659d2200e1d14c27b66865 100644
--- a/Classes/Controller/Ajax/JoblistController.php
+++ b/Classes/Controller/Ajax/JoblistController.php
@@ -47,7 +47,6 @@ class JoblistController extends AbstractAjaxController {
 	 * Show all job offers and options to manage them
 	 *
 	 * @return void
-	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
 	 * @throws \InvalidArgumentException
 	 */
 	public function filterAction() {
diff --git a/Classes/Controller/JoblistController.php b/Classes/Controller/JoblistController.php
index 0165a4d0c8f03013b1812f12bd74cde2d614f388..b9d7a550dacf917b59b7cb209464300bf9e14794 100644
--- a/Classes/Controller/JoblistController.php
+++ b/Classes/Controller/JoblistController.php
@@ -28,7 +28,6 @@ namespace SGalinski\SgJobs\Controller;
 
 use SGalinski\SgJobs\Domain\Model\JobApplication;
 use SGalinski\SgMail\Service\MailTemplateService;
-use TYPO3\CMS\Core\Exception;
 use TYPO3\CMS\Core\Resource\DuplicationBehavior;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
 use TYPO3\CMS\Core\Utility\File\ExtendedFileUtility;
@@ -41,12 +40,6 @@ use TYPO3\CMS\Extbase\Object\ObjectManager;
  * The joblist plugin controller
  */
 class JoblistController extends ActionController {
-	/**
-	 * @var \TYPO3\CMS\Extbase\Object\ObjectManager
-	 * @inject
-	 */
-	protected $objectManager;
-
 	/**
 	 * @var \SGalinski\SgJobs\Domain\Repository\CompanyRepository
 	 * @inject
@@ -67,7 +60,7 @@ class JoblistController extends ActionController {
 	 * @throws \InvalidArgumentException
 	 */
 	public function indexAction() {
-		$recordPageId = $this->configurationManager->getConfiguration(
+		$recordPageId = (int) $this->configurationManager->getConfiguration(
 			ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK
 		)['persistence']['storagePid'];
 
@@ -79,53 +72,49 @@ class JoblistController extends ActionController {
 	}
 
 	/**
+	 * Renders the application form with an optional job
 	 *
+	 * @param JobApplication $applyData
 	 */
-	public function applyFormAction() {
+	public function applyFormAction(JobApplication $applyData = NULL) {
 		if ($this->request->getOriginalRequest()) {
 			$uploadedFiles = $this->request->getOriginalRequest()->getArguments()['uploadedFiles'];
 			$this->view->assign('uploadedFiles', $uploadedFiles);
 		}
+
 		$jobId = $this->request->getArguments()['jobData']['uid'];
 		if (!empty($jobId)) {
 			$jobData = $this->jobRepository->findByUid($jobId);
 			$this->view->assign('job', $jobData);
 		}
+
 		$allowedMimeTypes = $this->settings['allowedMimeTypes'];
 		$this->view->assign('allowedMimeTypes', $allowedMimeTypes);
 		$allowedFileExtensions = $this->settings['allowedFileExtensions'];
 		$this->view->assign('allowedFileExtensions', $allowedFileExtensions);
+		$this->view->assign('jobApplication', $applyData);
 	}
 
 	/**
+	 * Saves the application send by the applyFormAction
+	 *
 	 * @param JobApplication $applyData
-	 * @return void
-	 * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\InvalidTargetFolderException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\IllegalFileExtensionException
-	 * @throws \TYPO3\CMS\Core\Exception
-	 * @throws \RuntimeException
-	 * @throws \BadFunctionCallException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderWritePermissionsException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\ExistingTargetFolderException
-	 * @throws \Exception
-	 * @throws \InvalidArgumentException
 	 */
 	public function applyAction(JobApplication $applyData) {
-		$this->submitApplicationFiles($GLOBALS['TSFE']->fe_user->id, $applyData);
-		// get an instance of the mail service
-		/** @var MailTemplateService $mailService */
-		$mailService = $this->objectManager->get(
-			MailTemplateService::class, 'application_mail', 'sg_jobs',
-			$this->getApplicationMailMarkers((array) $applyData)
-		);
-		$mailService->setIgnoreMailQueue(TRUE);
-		$mailService->setToAddresses($this->settings['applicationEmail']);
 		try {
-			$mailService->sendEmail();
-		} catch (Exception $exception) {
+			$this->submitApplicationFiles($GLOBALS['TSFE']->fe_user->id, $applyData);
+
+			/** @noinspection PhpMethodParametersCountMismatchInspection */
+			$mailService = $this->objectManager->get(
+				MailTemplateService::class, 'application_mail', 'sg_jobs',
+				$this->getApplicationMailMarkers((array) $applyData)
+			);
+			$mailService->setIgnoreMailQueue(TRUE);
+			$mailService->setToAddresses($this->settings['applicationEmail']);
 
+			$mailService->sendEmail();
+		} catch (\Exception $exception) {
+			// possible errors, because of wrong mails (maybe log that somewhere? Does this makes sense?)
 		}
 	}
 
@@ -133,20 +122,20 @@ class JoblistController extends ActionController {
 	 * Pre-apply action setup, configures model-property mapping and handles file upload
 	 *
 	 * @return void
-	 * @throws \UnexpectedValueException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderWritePermissionsException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception\ExistingTargetFolderException
-	 * @throws \TYPO3\CMS\Core\Resource\Exception
-	 * @throws \InvalidArgumentException
 	 * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentNameException
 	 * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
 	 * @throws \Exception
 	 */
 	protected function initializeApplyAction() {
-		$this->handleFileUpload('coverLetter');
-		$this->handleFileUpload('cv');
-		$this->handleFileUpload('certificates');
+		try {
+			$this->handleFileUpload('coverLetter');
+			$this->handleFileUpload('cv');
+			$this->handleFileUpload('certificates');
+		} catch (\Exception $e) {
+			// possible errors, because of wrong mails
+			// @TODO output them in some way?
+		}
+
 		$propertyMappingConfiguration = $this->arguments->getArgument('applyData')->getPropertyMappingConfiguration();
 		$propertyMappingConfiguration->forProperty('coverLetter')->allowAllProperties();
 		$propertyMappingConfiguration->forProperty('cv')->allowAllProperties();
@@ -157,31 +146,30 @@ class JoblistController extends ActionController {
 	}
 
 	/**
+	 * Assign filter values
+	 *
 	 * @param int $rootPageId
 	 */
 	private function assignFilterValues($rootPageId) {
-		// get all countries
 		$countries = $this->companyRepository->getAllCountries($rootPageId);
 		$this->view->assign('countries', $countries);
 
-		// get all cities
 		$cities = $this->companyRepository->getAllCities($rootPageId);
 		$this->view->assign('cities', $cities);
 
-		// get all cities
 		$companies = $this->companyRepository->getAllCompanyNames($rootPageId);
 		$this->view->assign('companies', $companies);
 
-		// get all areas
 		$areas = $this->jobRepository->getAllAreas($rootPageId);
 		$this->view->assign('areas', $areas);
 
-		// get all areas
 		$functions = $this->jobRepository->getAllFunctions($rootPageId);
 		$this->view->assign('functions', $functions);
 	}
 
 	/**
+	 * Returns the application mail markers
+	 *
 	 * @param array $applyData
 	 * @return array
 	 */
@@ -277,22 +265,26 @@ class JoblistController extends ActionController {
 		}
 		$targetFolder = $storage->getFolder('/Extension/JobApplication/');
 
-		$applicationFile = $storage->createFile($newName . '.txt', $sourceFolder);
-		$applicationFilePath = str_replace(
-				'/', '', $storage->getConfiguration()['basePath']
-			) . $applicationFile->getIdentifier();
+		$applicationFile = $storage->createFile($newName . '.csv', $sourceFolder);
+		$applicationFilePath = str_replace('/', '', $storage->getConfiguration()['basePath']) .
+			$applicationFile->getIdentifier();
 		$this->writeApplicationFile($applicationData, $applicationFilePath, $fileNames);
 
 		$storage->moveFolder($sourceFolder, $targetFolder);
 	}
 
 	/**
+	 * Writes the application files
+	 *
 	 * @param JobApplication $data
 	 * @param string $filePath
+	 * @param array $fileNames
 	 * @throws \RuntimeException
 	 */
 	private function writeApplicationFile(JobApplication $data, $filePath, $fileNames) {
+		$certificateNames = '';
 		$certificatesArr = [];
+		/** @var array[][] $fileNames */
 		if (isset($fileNames['certificates'])) {
 			foreach ($fileNames['certificates'] as $certificateName) {
 				$certificatesArr[] = $certificateName;
@@ -321,10 +313,10 @@ class JoblistController extends ActionController {
 
 		try {
 			$file = fopen($filePath, 'wb+');
-			fputcsv($file, $dataToInsertArr, '|');
+			fputcsv($file, $dataToInsertArr);
 			fclose($file);
-		} catch (\RuntimeException $ex) {
-			throw new \RuntimeException($ex->getMessage());
+		} catch (\RuntimeException $exception) {
+			throw new \RuntimeException($exception->getMessage());
 		}
 	}
 
@@ -338,6 +330,10 @@ class JoblistController extends ActionController {
 	 * @return void
 	 */
 	private function registerUploadField(array &$data, $namespace, $fieldName, $targetDirectory = '1:/_temp_/') {
+		if (!\is_array($_FILES[$namespace])) {
+			return;
+		}
+
 		if (!isset($data['upload'])) {
 			$data['upload'] = [];
 		}
@@ -383,9 +379,7 @@ class JoblistController extends ActionController {
 
 		// Initializing:
 		/** @var \TYPO3\CMS\Core\Utility\File\ExtendedFileUtility $fileProcessor */
-		$fileProcessor = GeneralUtility::makeInstance(
-			ExtendedFileUtility::class
-		);
+		$fileProcessor = GeneralUtility::makeInstance(ExtendedFileUtility::class);
 		$fileProcessor->setActionPermissions(['addFile' => TRUE]);
 		$fileProcessor->setFileExtensionPermissions($this->settings['allowedFileExtensions'], '');
 
@@ -396,9 +390,8 @@ class JoblistController extends ActionController {
 		$result = $fileProcessor->processData();
 
 		$uploadedFiles = [];
-		// Do whatever you want with $result (array of File objects)
-		foreach ($result['upload'] as $files) {
-			/** @var \TYPO3\CMS\Core\Resource\File $file */
+		foreach ((array) $result['upload'] as $files) {
+			/** @var array $files */
 			foreach ($files as $file) {
 				$uploadedFiles[] = $file;
 			}
diff --git a/Classes/Domain/Model/JobApplication.php b/Classes/Domain/Model/JobApplication.php
index 06681294b677a763bf89de6a178734dc8d71135d..82b6d27cbc14f354b1fb3d02f84338b1d45c0eaa 100644
--- a/Classes/Domain/Model/JobApplication.php
+++ b/Classes/Domain/Model/JobApplication.php
@@ -33,16 +33,11 @@ use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
  * The JobApplication model
  */
 class JobApplication extends AbstractEntity {
-	/**
-	 * @var string $jobTitle
-	 * @validate NotEmpty
-	 */
-	protected $jobTitle = '';
 
 	/**
-	 * @var string $jobTitle
+	 * @var \SGalinski\SgJobs\Domain\Model\Job $job
 	 */
-	protected $jobId = '';
+	protected $job = '';
 
 	/**
 	 * @var string $gender
@@ -98,7 +93,7 @@ class JobApplication extends AbstractEntity {
 	protected $education = '';
 
 	/**
-	 * @var string $birthDate
+	 * @var int $birthDate
 	 */
 	protected $birthDate = '';
 
@@ -146,31 +141,17 @@ class JobApplication extends AbstractEntity {
 	}
 
 	/**
-	 * @return string
-	 */
-	public function getJobTitle() {
-		return $this->jobTitle;
-	}
-
-	/**
-	 * @param string $jobTitle
+	 * @return \SGalinski\SgJobs\Domain\Model\Job
 	 */
-	public function setJobTitle(string $jobTitle) {
-		$this->jobTitle = $jobTitle;
+	public function getJob() {
+		return $this->job;
 	}
 
 	/**
-	 * @return string
+	 * @param \SGalinski\SgJobs\Domain\Model\Job $job
 	 */
-	public function getJobId() {
-		return $this->jobId;
-	}
-
-	/**
-	 * @param string $jobId
-	 */
-	public function setJobId(string $jobId) {
-		$this->jobId = $jobId;
+	public function setJob(Job $job) {
+		$this->job = $job;
 	}
 
 	/**
@@ -300,17 +281,17 @@ class JobApplication extends AbstractEntity {
 	}
 
 	/**
-	 * @return string
+	 * @return int
 	 */
 	public function getBirthDate() {
 		return $this->birthDate;
 	}
 
 	/**
-	 * @param string $birthDate
+	 * @param int $birthDate
 	 */
 	public function setBirthDate(string $birthDate) {
-		$this->birthDate = $birthDate;
+		$this->birthDate = (int) $birthDate;
 	}
 
 	/**
@@ -365,7 +346,7 @@ class JobApplication extends AbstractEntity {
 	/**
 	 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $coverLetter
 	 */
-	public function setCoverLetter(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $coverLetter) {
+	public function setCoverLetter(ObjectStorage $coverLetter) {
 		$this->coverLetter = $coverLetter;
 	}
 
@@ -379,7 +360,7 @@ class JobApplication extends AbstractEntity {
 	/**
 	 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $cv
 	 */
-	public function setCV(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $cv) {
+	public function setCV(ObjectStorage $cv) {
 		$this->cv = $cv;
 	}
 
@@ -393,7 +374,7 @@ class JobApplication extends AbstractEntity {
 	/**
 	 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $certificates
 	 */
-	public function setCertificates(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $certificates) {
+	public function setCertificates(ObjectStorage $certificates) {
 		$this->certificates = $certificates;
 	}
 
diff --git a/Classes/Domain/Repository/CompanyRepository.php b/Classes/Domain/Repository/CompanyRepository.php
index de273e795806224b13f8812d6c24fde6685eeb0d..e69c9b1969a66ebe0878e4fc139b6829ccfaa8ed 100644
--- a/Classes/Domain/Repository/CompanyRepository.php
+++ b/Classes/Domain/Repository/CompanyRepository.php
@@ -48,20 +48,20 @@ class CompanyRepository extends Repository {
 	}
 
 	/**
+	 * Returns all countries filtered by page id
+	 *
 	 * @param int $pageUid
-	 * @param array $filters
 	 * @return mixed
 	 */
-	public function getAllCountries($pageUid, array $filters = []) {
+	public function getAllCountries($pageUid) {
 		/** @var DatabaseConnection $db */
 		$db = $GLOBALS['TYPO3_DB'];
 		$result = $db->exec_SELECTquery(
-			'country', 'tx_sgjobs_domain_model_company', 'pid = ' . $pageUid, 'country'
+			'country', 'tx_sgjobs_domain_model_company', 'pid = ' . (int) $pageUid, 'country'
 		)->fetch_all();
 
-		$countryArray = [];
-		$countryArray[] = '';
-		foreach($result as $country) {
+		$countryArray = [''];
+		foreach ($result as $country) {
 			$countryArray[$country[0]] = $country[0];
 		}
 
@@ -69,6 +69,8 @@ class CompanyRepository extends Repository {
 	}
 
 	/**
+	 * Returns all filtered cities
+	 *
 	 * @param int $pageUid
 	 * @param array $filters
 	 * @return mixed
@@ -80,14 +82,10 @@ class CompanyRepository extends Repository {
 		if ($filters['country'] && $filters['country'] !== 0) {
 			$where .= ' AND country = ' . $db->quoteStr($filters['country'], self::TABLENAME);
 		}
+		$result = $db->exec_SELECTquery('city', self::TABLENAME, $where, 'city')->fetch_all();
 
-		$result = $db->exec_SELECTquery(
-			'city', self::TABLENAME, $where, 'city'
-		)->fetch_all();
-
-		$cityArray = [];
-		$cityArray[] = '';
-		foreach($result as $city) {
+		$cityArray = [''];
+		foreach ($result as $city) {
 			$cityArray[$city[0]] = $city[0];
 		}
 
@@ -95,6 +93,8 @@ class CompanyRepository extends Repository {
 	}
 
 	/**
+	 * Returns all companies filtered by page id
+	 *
 	 * @param int $pageUid
 	 * @return mixed
 	 */
@@ -102,12 +102,11 @@ class CompanyRepository extends Repository {
 		/** @var DatabaseConnection $db */
 		$db = $GLOBALS['TYPO3_DB'];
 		$result = $db->exec_SELECTquery(
-			'name', 'tx_sgjobs_domain_model_company', 'pid = ' . $pageUid, 'name'
+			'name', 'tx_sgjobs_domain_model_company', 'pid = ' . (int) $pageUid, 'name'
 		)->fetch_all();
 
-		$namesArray = [];
-		$namesArray[] = '';
-		foreach($result as $name) {
+		$namesArray = [''];
+		foreach ($result as $name) {
 			$namesArray[$name[0]] = $name[0];
 		}
 
diff --git a/Classes/Domain/Repository/JobRepository.php b/Classes/Domain/Repository/JobRepository.php
index 2b90775e6de02b733c78f9d937f4050a7cec1133..7cf489980a2a2120ca10d832ef03fe63ae52dfb2 100644
--- a/Classes/Domain/Repository/JobRepository.php
+++ b/Classes/Domain/Repository/JobRepository.php
@@ -36,7 +36,6 @@ use TYPO3\CMS\Extbase\Persistence\Repository;
  * Job Repository
  */
 class JobRepository extends Repository {
-
 	const TABLENAME = 'tx_sgjobs_domain_model_job';
 
 	/**
@@ -73,14 +72,14 @@ class JobRepository extends Repository {
 
 		$constraints = [];
 
-		if (isset($filters['locations']) && is_array($filters['locations']) && count($filters['locations'])) {
+		if (isset($filters['locations']) && \is_array($filters['locations']) && \count($filters['locations'])) {
 			$locationConstraints = [];
-			foreach ($filters['locations'] as $location) {
+			foreach ((array) $filters['locations'] as $location) {
 				if ((int) $location) {
 					$locationConstraints[] = $query->contains('location', $location);
 				}
 			}
-			if (count($locationConstraints)) {
+			if (\count($locationConstraints)) {
 				$constraints[] = $query->logicalOr($locationConstraints);
 			}
 		}
@@ -94,9 +93,9 @@ class JobRepository extends Repository {
 			$constraints[] = $query->logicalOr($searchConstraints);
 		}
 
-		if (count($constraints) > 1) {
+		if (\count($constraints) > 1) {
 			$query->matching($query->logicalAnd($constraints));
-		} elseif (count($constraints)) {
+		} elseif (\count($constraints)) {
 			$query->matching($constraints[0]);
 		}
 
@@ -104,6 +103,8 @@ class JobRepository extends Repository {
 	}
 
 	/**
+	 * Returns all areas filtered by page id
+	 *
 	 * @param int $pageUid
 	 * @return mixed
 	 */
@@ -114,8 +115,7 @@ class JobRepository extends Repository {
 			'area', 'tx_sgjobs_domain_model_job', 'pid = ' . $pageUid, 'area'
 		)->fetch_all();
 
-		$areaArray = [];
-		$areaArray[] = '';
+		$areaArray = [''];
 		foreach ($result as $area) {
 			$areaArray[$area[0]] = $area[0];
 		}
@@ -124,6 +124,8 @@ class JobRepository extends Repository {
 	}
 
 	/**
+	 * Returns all function filtered by page id
+	 *
 	 * @param int $pageUid
 	 * @return mixed
 	 */
@@ -134,8 +136,7 @@ class JobRepository extends Repository {
 			'job_function', 'tx_sgjobs_domain_model_job', 'pid = ' . $pageUid, 'job_function'
 		)->fetch_all();
 
-		$functionArray = [];
-		$functionArray[] = '';
+		$functionArray = [''];
 		foreach ($result as $function) {
 			$functionArray[$function[0]] = $function[0];
 		}
@@ -144,6 +145,8 @@ class JobRepository extends Repository {
 	}
 
 	/**
+	 * Returns a job filtered by company and page id
+	 *
 	 * @param int $pageUid
 	 * @param array $companyIds
 	 * @return QueryResultInterface
@@ -163,19 +166,19 @@ class JobRepository extends Repository {
 
 		$constraints = [];
 
-		if (isset($companyIds) && is_array($companyIds) && count($companyIds)) {
+		if (isset($companyIds) && \is_array($companyIds) && \count($companyIds)) {
 			$companyConstraints = [];
 			foreach ($companyIds as $companyId) {
 				if ((int) $companyId) {
 					$companyConstraints[] = $query->equals('company', $companyId);
 				}
 			}
-			if (count($companyConstraints)) {
+			if (\count($companyConstraints)) {
 				$constraints[] = $query->logicalOr($companyConstraints);
 			}
 		}
 
-		if (count($constraints)) {
+		if (\count($constraints)) {
 			$query->matching($query->logicalAnd($constraints));
 		}
 
diff --git a/Classes/Service/FrontendFilterService.php b/Classes/Service/FrontendFilterService.php
index 5f64a69a27a97b0887170b26298554cc0d5371c3..1cb8e05b5c5c25f0cdc7ab5775a6305454669421 100644
--- a/Classes/Service/FrontendFilterService.php
+++ b/Classes/Service/FrontendFilterService.php
@@ -274,12 +274,12 @@ class FrontendFilterService {
 			)
 		);
 
-		$functions = $statement->execute()->fetchAll();
+		$jobFunctions = $statement->execute()->fetchAll();
 
 		$result = [];
 		$result[0] = '';
-		foreach ($functions as $function) {
-			$result[$function['function']] = $function['function'];
+		foreach ($jobFunctions as $jobFunction) {
+			$result[$jobFunction['job_function']] = $jobFunction['job_function'];
 		}
 
 		return $result;
diff --git a/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php b/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php
index 5eada181ff3f4d5d87f3b6d0bdbbafea6977d113..aad577ef035de2042efc10667a33db871066d3b8 100644
--- a/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php
+++ b/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php
@@ -1,5 +1,7 @@
 <?php
+
 namespace SGalinski\SgJobs\ViewHelpers;
+
 /***************************************************************
  *  Copyright notice
  *
@@ -25,6 +27,7 @@ namespace SGalinski\SgJobs\ViewHelpers;
  ***************************************************************/
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
+
 /**
  * View helper to render language labels to
  * json array to be used in js applications.
@@ -46,7 +49,7 @@ class InlineLanguageLabelsViewHelper extends AbstractViewHelper {
 	public function render($labels = '', $htmlEscape = FALSE) {
 		$extensionName = $this->controllerContext->getRequest()->getControllerExtensionName();
 		$labels = GeneralUtility::trimExplode(',', $labels, TRUE);
-		$languageArray = array();
+		$languageArray = [];
 		foreach ($labels as $key) {
 			$value = LocalizationUtility::translate($key, $extensionName);
 			$languageArray[$key] = ($htmlEscape ? htmlentities($value) : $value);
diff --git a/Classes/ViewHelpers/SetViewHelper.php b/Classes/ViewHelpers/SetViewHelper.php
index d1b5dfda92bdeacf36c38b7adb8a54ae65700c73..ce0db48296a588a0073ba646ac62b6f188661be5 100644
--- a/Classes/ViewHelpers/SetViewHelper.php
+++ b/Classes/ViewHelpers/SetViewHelper.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace SGalinski\SgJobs\ViewHelpers;
 
 /***************************************************************
diff --git a/Configuration/TCA/tx_sgjobs_domain_model_job.php b/Configuration/TCA/tx_sgjobs_domain_model_job.php
index 10538fafbb0368ce8bf726148ae946a1394b774a..0d2b94d30670d4a5c1b47bb455d1244ec677c460 100644
--- a/Configuration/TCA/tx_sgjobs_domain_model_job.php
+++ b/Configuration/TCA/tx_sgjobs_domain_model_job.php
@@ -31,8 +31,8 @@ return [
 	],
 	'types' => [
 		'1' => [
-			'showitem' => '--palette--;;sysLanguageAndHidden,title, job_id, --palette--;;pallete_title_start,,--palette--;;pallete_area_function,
-			--palette--;;pallete_location_contact, description, --div--; LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tca.qualification_tab, task, qualification, div;;richtext[*]:rte_transform[mode=ts],
+			'showitem' => '--palette--;;sysLanguageAndHidden,title, job_id, --palette--;;palette_title_start,,--palette--;;palette_area_function,
+			--palette--;;palette_location_contact, description, --div--; LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tca.qualification_tab, task, qualification, div;;richtext[*]:rte_transform[mode=ts],
 				--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime',
 		],
 	],
@@ -41,9 +41,9 @@ return [
 			'showitem' => 'sys_language_uid;;;;1-1-1, l10n_diffsource, hidden;;1, ',
 			'canNotCollapse' => 1,
 		],
-		'pallete_title_start' => ['showitem' => 'start_date, alternative_start_date', 'canNotCollapse' => 1],
-		'pallete_area_function' => ['showitem' => 'area, job_function', 'canNotCollapse' => 1],
-		'pallete_location_contact' => ['showitem' => 'company, contact', 'canNotCollapse' => 1]
+		'palette_title_start' => ['showitem' => 'start_date, alternative_start_date', 'canNotCollapse' => 1],
+		'palette_area_function' => ['showitem' => 'area, job_function', 'canNotCollapse' => 1],
+		'palette_location_contact' => ['showitem' => 'company, contact', 'canNotCollapse' => 1]
 	],
 	'columns' => [
 		'sys_language_uid' => [
diff --git a/Configuration/TCA/tx_sgjobs_domain_model_job_application.php b/Configuration/TCA/tx_sgjobs_domain_model_job_application.php
new file mode 100644
index 0000000000000000000000000000000000000000..454097455264efe30c82a97e8fe2a49b09fbe56f
--- /dev/null
+++ b/Configuration/TCA/tx_sgjobs_domain_model_job_application.php
@@ -0,0 +1,321 @@
+<?php
+
+return [
+	'ctrl' => [
+		'title' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application',
+		'label' => 'first_name, last_name',
+		'tstamp' => 'tstamp',
+		'crdate' => 'crdate',
+		'cruser_id' => 'cruser_id',
+		'dividers2tabs' => TRUE,
+		'searchFields' => 'job_id, gender, first_name, last_name, street, city, zip, country, nationality, education, birth_date, phone, mobile, email, message, cover_letter, certificates, cv',
+		'versioningWS' => 2,
+		'versioning_followPages' => TRUE,
+		'origUid' => 't3_origuid',
+		'languageField' => 'sys_language_uid',
+		'transOrigPointerField' => 'l10n_parent',
+		'transOrigDiffSourceField' => 'l10n_diffsource',
+		'delete' => 'deleted',
+		'enablecolumns' => [
+			'disabled' => 'hidden',
+			'starttime' => 'starttime',
+			'endtime' => 'endtime',
+		],
+		'sortby' => 'sorting',
+		'iconfile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath('sg_jobs') .
+			'Resources/Public/Icons/tx_sgjobs_domain_model_job.svg'
+	],
+	'interface' => [
+		'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, pid, job_id, area, job_function, start_date, alternative_start_date,
+		 company, task, qualification, description, contact',
+	],
+	'types' => [
+		'1' => [
+			'showitem' => '--palette--;;sysLanguageAndHidden,job_id, gender, first_name, last_name, street, city, zip, 
+				country, nationality, education, birth_date, phone, mobile, email, message, cover_letter, certificates, cv,
+			 	div;;richtext[*]:rte_transform[mode=ts],
+				--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime',
+		],
+	],
+	'palettes' => [
+		'sysLanguageAndHidden' => [
+			'showitem' => 'sys_language_uid;;;;1-1-1, l10n_diffsource, hidden;;1, ',
+			'canNotCollapse' => 1,
+		]
+	],
+	'columns' => [
+		'sys_language_uid' => [
+			'exclude' => 1,
+			'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.language',
+			'config' => [
+				'type' => 'select',
+				'special' => 'languages',
+			],
+		],
+		'l10n_parent' => [
+			'displayCond' => 'FIELD:sys_language_uid:>:0',
+			'exclude' => 1,
+			'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.l18n_parent',
+			'config' => [
+				'type' => 'select',
+				'items' => [
+					['', 0],
+				],
+				'foreign_table' => 'tx_sgjobs_domain_model_job_application',
+				'foreign_table_where' => 'AND tx_sgjobs_domain_model_job_application.pid=###CURRENT_PID### AND tx_sgjobs_domain_model_job_application.sys_language_uid IN (-1,0)',
+			],
+		],
+		'l10n_diffsource' => [
+			'config' => [
+				'type' => 'passthrough',
+			],
+		],
+		't3ver_label' => [
+			'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.versionLabel',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'max' => 255,
+			]
+		],
+		'pid' => [
+			'exclude' => 0,
+			'label' => 'PID',
+			'config' => [
+				'type' => 'none',
+			]
+		],
+		'hidden' => [
+			'exclude' => 1,
+			'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.hidden',
+			'config' => [
+				'type' => 'check',
+			],
+		],
+		'starttime' => [
+			'exclude' => 1,
+			'l10n_mode' => 'mergeIfNotBlank',
+			'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.starttime',
+			'config' => [
+				'type' => 'input',
+				'size' => 13,
+				'max' => 20,
+				'eval' => 'datetime',
+				'checkbox' => 0,
+				'default' => 0,
+				'range' => [
+					'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
+				],
+			],
+		],
+		'endtime' => [
+			'exclude' => 1,
+			'l10n_mode' => 'mergeIfNotBlank',
+			'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.endtime',
+			'config' => [
+				'type' => 'input',
+				'size' => 13,
+				'max' => 20,
+				'eval' => 'datetime',
+				'checkbox' => 0,
+				'default' => 0,
+				'range' => [
+					'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
+				],
+			],
+		],
+		'job' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.job',
+			'config' => [
+				'type' => 'select',
+				'eval' => 'required',
+				'renderType' => 'selectSingle',
+				'internal_type' => 'db',
+				'foreign_table' => 'tx_sgjobs_domain_model_job',
+				'size' => 1,
+				'maxitems' => 1,
+				'multiple' => 0,
+				'fieldControl' => [
+					'editPopup' => [
+						'disabled' => FALSE,
+					],
+					'addRecord' => [
+						'disabled' => FALSE,
+					]
+				],
+			]
+		],
+		'gender' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.gender',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'first_name' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.first_name',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'last_name' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.last_name',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'street' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.street',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'city' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.city',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'zip' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.zip',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'country' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.country',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'nationality' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.nationality',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'education' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.education',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'birth_date' => [
+			'exclude' => 1,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.birth_date',
+			'config' => [
+				'type' => 'input',
+				'size' => 13,
+				'max' => 20,
+				'eval' => 'date, required',
+				'checkbox' => 0,
+				'range' => [
+					'lower' => mktime(date('m'), date('d'), date('Y'))
+				],
+			],
+		],
+		'phone' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.phone',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'mobile' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.mobile',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'email' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.email',
+			'config' => [
+				'type' => 'input',
+				'size' => 30,
+				'eval' => 'trim, required'
+			],
+		],
+		'message' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.message',
+			'config' => [
+				'type' => 'text',
+				'cols' => 40,
+				'rows' => 10,
+				'eval' => 'required'
+			],
+		],
+		'cover_letter' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.cover_letter',
+			'config' => [
+				'type' => 'group',
+				'internal_type' => 'file',
+				'allowed' => 'pdf, doc',
+				'size' => 1,
+				'uploadfolder' => 'uploads/tx_sgjobs/',
+				'max_size' => 2000,
+				'eval' => 'required'
+			],
+		],
+		'certificates' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.certificates',
+			'config' => [
+				'type' => 'group',
+				'internal_type' => 'file',
+				'allowed' => 'pdf, doc',
+				'size' => 3,
+				'uploadfolder' => 'uploads/tx_sgjobs/',
+				'max_size' => 2000,
+				'eval' => 'required'
+			],
+		],
+		'cv' => [
+			'exclude' => 0,
+			'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.cv',
+			'config' => [
+				'type' => 'group',
+				'internal_type' => 'file',
+				'allowed' => 'pdf, doc',
+				'size' => 1,
+				'uploadfolder' => 'uploads/tx_sgjobs/',
+				'max_size' => 2000,
+				'eval' => 'required'
+			],
+		]
+	],
+];
\ No newline at end of file
diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf
index d677f0f59bce5a8745870727811c1050b6310962..6a8f614d1638cd6bd49a0b455e9b007986b6682c 100644
--- a/Resources/Private/Language/de.locallang_db.xlf
+++ b/Resources/Private/Language/de.locallang_db.xlf
@@ -101,18 +101,14 @@
 			<source>Job offer</source>
 			<target>Stellenanzeige</target>
 		</trans-unit>
-		<trans-unit id="tx_sgjobs_domain_model_job.plugin_options" approved="yes">
-			<source>Joblist plugin options</source>
-			<target>Joblist Plugin-Optionen</target>
+		<trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date" approved="yes">
+			<source>Alternative start date</source>
+			<target>Alternativer Eintrittszeitpunkt</target>
 		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.application_form_page" approved="yes">
 			<source>Page containing the application form</source>
 			<target>Seite, die das Bewerbungs-Formular enthält</target>
 		</trans-unit>
-		<trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date" approved="yes">
-			<source>Alternative start date</source>
-			<target>Alternativer Eintrittszeitpunkt</target>
-		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.area" approved="yes">
 			<source>Area</source>
 			<target>Bereich</target>
@@ -137,6 +133,10 @@
 			<source>Location</source>
 			<target>Arbeitsort</target>
 		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job.plugin_options" approved="yes">
+			<source>Joblist plugin options</source>
+			<target>Joblist Plugin-Optionen</target>
+		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.qualification" approved="yes">
 			<source>Qualification</source>
 			<target>Qualifikation</target>
@@ -161,6 +161,82 @@
 			<source>Job title</source>
 			<target>Stellenbezeichnung</target>
 		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application" approved="yes">
+			<source>Job application</source>
+			<target>Bewerbung</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.birth_date" approved="yes">
+			<source>Birthdate</source>
+			<target>Geburtsdatum</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.certificates" approved="yes">
+			<source>Certificates</source>
+			<target>Zeugnisse</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.city" approved="yes">
+			<source>City</source>
+			<target>Ort</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.country" approved="yes">
+			<source>Country</source>
+			<target>Land</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.cover_letter" approved="yes">
+			<source>Cover letter</source>
+			<target>Motivationsschreiben</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.cv" approved="yes">
+			<source>CV</source>
+			<target>Lebenslauf</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.education" approved="yes">
+			<source>Education</source>
+			<target>Höchster Abschluss</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.email" approved="yes">
+			<source>Email</source>
+			<target>E-Mail</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.first_name" approved="yes">
+			<source>First name</source>
+			<target>Vorname</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.gender" approved="yes">
+			<source>Gender</source>
+			<target>Geschlecht</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.job" approved="yes">
+			<source>Job</source>
+			<target>Stelle</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.last_name" approved="yes">
+			<source>Last name</source>
+			<target>Nachname</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.message" approved="yes">
+			<source>Message</source>
+			<target>Nachricht</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.mobile" approved="yes">
+			<source>Mobile</source>
+			<target>Mobil</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.nationality" approved="yes">
+			<source>Nationality</source>
+			<target>Nationalität</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.phone" approved="yes">
+			<source>Phone</source>
+			<target>Telefon</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.street" approved="yes">
+			<source>Street</source>
+			<target>Strasse</target>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.zip" approved="yes">
+			<source>Zip</source>
+			<target>PLZ</target>
+		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_location" approved="yes">
 			<source>Location</source>
 			<target>Arbeitsort</target>
diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf
index cc41546a6fc48bf3a1cfdb7b335f3d631c912e47..d853bebb0d11001464e3b5aa4320169923968fec 100644
--- a/Resources/Private/Language/locallang_db.xlf
+++ b/Resources/Private/Language/locallang_db.xlf
@@ -78,15 +78,12 @@
 		<trans-unit id="tx_sgjobs_domain_model_job">
 			<source>Job offer</source>
 		</trans-unit>
-		<trans-unit id="tx_sgjobs_domain_model_job.plugin_options">
-			<source>Joblist plugin options</source>
+		<trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date">
+			<source>Alternative start date</source>
 		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.application_form_page">
 			<source>Page containing the application form</source>
 		</trans-unit>
-		<trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date">
-			<source>Alternative start date</source>
-		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.area">
 			<source>Area</source>
 		</trans-unit>
@@ -102,9 +99,15 @@
 		<trans-unit id="tx_sgjobs_domain_model_job.function">
 			<source>Function</source>
 		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job.jobId">
+			<source>Job ID</source>
+		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.location">
 			<source>Location</source>
 		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job.plugin_options">
+			<source>Joblist plugin options</source>
+		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_job.qualification">
 			<source>Qualification</source>
 		</trans-unit>
@@ -123,8 +126,62 @@
 		<trans-unit id="tx_sgjobs_domain_model_job.title">
 			<source>Job title</source>
 		</trans-unit>
-		<trans-unit id="tx_sgjobs_domain_model_job.jobId">
-			<source>Job ID</source>
+		<trans-unit id="tx_sgjobs_domain_model_job_application">
+			<source>Job application</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.birth_date">
+			<source>Birthdate</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.certificates">
+			<source>Certificates</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.city">
+			<source>City</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.country">
+			<source>Country</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.cover_letter">
+			<source>Cover letter</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.cv">
+			<source>CV</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.education">
+			<source>Education</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.email">
+			<source>Email</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.first_name">
+			<source>First name</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.gender">
+			<source>Gender</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.job">
+			<source>Job</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.last_name">
+			<source>Last name</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.message">
+			<source>Message</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.mobile">
+			<source>Mobile</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.nationality">
+			<source>Nationality</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.phone">
+			<source>Phone</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.street">
+			<source>Street</source>
+		</trans-unit>
+		<trans-unit id="tx_sgjobs_domain_model_job_application.zip">
+			<source>Zip</source>
 		</trans-unit>
 		<trans-unit id="tx_sgjobs_domain_model_location">
 			<source>Location</source>
diff --git a/Resources/Private/Partials/Job.html b/Resources/Private/Partials/Job.html
index e984b85ff2941d49fe18f4a709de3b7e79b544e2..466dffa252cd1d3f33e0aa96674b8b2a1a2e319e 100644
--- a/Resources/Private/Partials/Job.html
+++ b/Resources/Private/Partials/Job.html
@@ -25,7 +25,7 @@
 		</tr>
 		<tr>
 			<td>
-				<f:translate key="frontend.function" />
+				<f:translate key="frontend.job_function" />
 			</td>
 			<td>
 				{job.function}
diff --git a/Resources/Private/Templates/Joblist/ApplyForm.html b/Resources/Private/Templates/Joblist/ApplyForm.html
index 918cc165684f6559f9b68681a9fcb83d20c5599a..adcd614f66ab093a3df3d1301c6f943f8915a44f 100644
--- a/Resources/Private/Templates/Joblist/ApplyForm.html
+++ b/Resources/Private/Templates/Joblist/ApplyForm.html
@@ -2,19 +2,14 @@
 
 <f:section name="main">
 	<f:form action="apply" controller="Joblist" method="post" objectName="applyData" object="{applyData}" enctype="multipart/form-data">
-		<f:form.hidden value="{job.jobId}" property="jobId" />
-		<label for="apply-jobTitle"><f:translate key="frontend.apply.title" /></label>
-		<f:form.textfield property="jobTitle" id="apply-jobTitle" data="{}" class="" value="{job.title}" />
-		<f:form.validationResults for="applyData.jobTitle">
-			<f:for each="{validationResults.errors}" as="error">
-				<div class="sg-jobs-validation-error">
-					{error.message}
-				</div>
-			</f:for>
-		</f:form.validationResults>
-		<br />
+		<f:form.hidden value="{job.uid}" property="jobId" />
+
 		<label for="apply-gender"><f:translate key="frontend.apply.gender" /></label>
+<<<<<<< HEAD
 		<f:form.select property="gender" id="apply-gender" data="{}" class="" options="{Male: 'Male', Female: 'Female'}" />
+=======
+		<f:form.select property="gender" id="apply-gender" class="" options="{None: '', Male: 'Male', Female: 'Female'}" />
+>>>>>>> ef0bad6dbd9fd1503cfce001734cb83f277d8404
 		<f:form.validationResults for="applyData.gender">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -24,7 +19,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-firstName"><f:translate key="frontend.apply.first_name" /></label>
-		<f:form.textfield property="firstName" id="apply-firstName" data="{}" class="" />
+		<f:form.textfield property="firstName" id="apply-firstName" class="" />
 		<f:form.validationResults for="applyData.firstName">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -34,7 +29,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-lastName"><f:translate key="frontend.apply.last_name" /></label>
-		<f:form.textfield property="lastName" id="apply-lastName" data="{}" class="" />
+		<f:form.textfield property="lastName" id="apply-lastName" class="" />
 		<f:form.validationResults for="applyData.lastName">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -44,7 +39,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-street"><f:translate key="frontend.apply.street" /></label>
-		<f:form.textfield property="street" id="apply-street" data="{}" class="" />
+		<f:form.textfield property="street" id="apply-street" class="" />
 		<f:form.validationResults for="applyData.street">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -54,7 +49,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-city"><f:translate key="frontend.apply.city" /></label>
-		<f:form.textfield property="city" id="apply-city" data="{}" class="" />
+		<f:form.textfield property="city" id="apply-city" class="" />
 		<f:form.validationResults for="applyData.city">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -64,7 +59,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-zip"><f:translate key="frontend.apply.zip" /></label>
-		<f:form.textfield property="zip" id="apply-zip" data="{}" class="" />
+		<f:form.textfield property="zip" id="apply-zip" class="" />
 		<f:form.validationResults for="applyData.zip">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -72,9 +67,9 @@
 				</div>
 			</f:for>
 		</f:form.validationResults>
-		<br/>
+		<br />
 		<label for="apply-country"><f:translate key="frontend.apply.country" /></label>
-		<f:form.textfield property="country" id="apply-country" data="{}" class="" />
+		<f:form.textfield property="country" id="apply-country" class="" />
 		<f:form.validationResults for="applyData.country">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -84,7 +79,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-nationality"><f:translate key="frontend.apply.nationality" /></label>
-		<f:form.textfield property="nationality" id="apply-nationality" data="{}" class="" />
+		<f:form.textfield property="nationality" id="apply-nationality" class="" />
 		<f:form.validationResults for="applyData.nationality">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -92,9 +87,9 @@
 				</div>
 			</f:for>
 		</f:form.validationResults>
-		<br/>
+		<br />
 		<label for="apply-education"><f:translate key="frontend.apply.education" /></label>
-		<f:form.textfield property="education" id="apply-education" data="{}" class="" />
+		<f:form.textfield property="education" id="apply-education" class="" />
 		<f:form.validationResults for="applyData.education">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -102,9 +97,9 @@
 				</div>
 			</f:for>
 		</f:form.validationResults>
-		<br/>
+		<br />
 		<label for="apply-birthDate"><f:translate key="frontend.apply.birthDate" /></label>
-		<f:form.textfield property="birthDate" id="apply-birthDate" data="{}" class="" />
+		<f:form.textfield property="birthDate" id="apply-birthDate" class="" />
 		<f:form.validationResults for="applyData.birthDate">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -114,7 +109,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-phone"><f:translate key="frontend.apply.phone" /></label>
-		<f:form.textfield property="phone" id="apply-phone" data="{}" class="" />
+		<f:form.textfield property="phone" id="apply-phone" class="" />
 		<f:form.validationResults for="applyData.phone">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -124,7 +119,7 @@
 		</f:form.validationResults>
 		<br />
 		<label for="apply-mobile"><f:translate key="frontend.apply.mobile" /></label>
-		<f:form.textfield property="mobile" id="apply-mobile" data="{}" class="" />
+		<f:form.textfield property="mobile" id="apply-mobile" class="" />
 		<f:form.validationResults for="applyData.mobile">
 			<f:for each="{validationResults.errors}" as="error">
 				<div class="sg-jobs-validation-error">
@@ -191,7 +186,7 @@
 		</f:for>
 		<br />
 		<label for="apply-message"><f:translate key="frontend.apply.message" /></label>
-		<f:form.textarea property="message" id="apply-message" data="{}" class="" />
+		<f:form.textarea property="message" id="apply-message" class="" />
 		<br />
 		<f:form.submit value="{f:translate(key:'frontend.applyNow')}" />
 	</f:form>
diff --git a/ext_tables.php b/ext_tables.php
index 69933a45ef64635c752591be231e409efda88cd0..84245434fc7e375bad63d65c3572e02d41abd666 100644
--- a/ext_tables.php
+++ b/ext_tables.php
@@ -23,6 +23,7 @@ if (TYPO3_MODE === 'BE') {
 	\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_job');
 	\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_contact');
 	\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_company');
+	\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_job_application');
 
 	// Register backend modules
 	\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
diff --git a/ext_tables.sql b/ext_tables.sql
index 79d06be363cb5a003f1eab6834cb7417db690837..683d4cb711df42c87e6d2c08c56083129565d59a 100644
--- a/ext_tables.sql
+++ b/ext_tables.sql
@@ -137,3 +137,60 @@ CREATE TABLE tx_sgjobs_domain_model_contact (
 	KEY t3ver_oid (t3ver_oid,t3ver_wsid),
 	KEY language (l10n_parent,sys_language_uid)
 );
+
+CREATE TABLE tx_sgjobs_domain_model_job_application (
+	uid int(11) NOT NULL auto_increment,
+	pid int(11) DEFAULT '0' NOT NULL,
+
+	-- Custom fields
+	job int(11) unsigned DEFAULT '0' NOT NULL,
+	gender varchar(30) DEFAULT '' NOT NULL,
+	first_name text DEFAULT '' NOT NULL,
+	last_name text DEFAULT '' NOT NULL,
+	street text DEFAULT '' NOT NULL,
+	city text DEFAULT '' NOT NULL,
+	zip text DEFAULT '' NOT NULL,
+	country text DEFAULT '' NOT NULL,
+	nationality text DEFAULT '' NOT NULL,
+	education text DEFAULT '' NOT NULL,
+	birth_date int(11) unsigned DEFAULT '0' NOT NULL,
+	phone text DEFAULT '' NOT NULL,
+	mobile text DEFAULT '' NOT NULL,
+	email text DEFAULT '' NOT NULL,
+	message text DEFAULT '' NOT NULL,
+	cover_letter int(11) unsigned DEFAULT '0' NOT NULL,
+	certificates int(11) unsigned DEFAULT '0' NOT NULL,
+	cv int(11) unsigned DEFAULT '0' NOT NULL,
+
+	-- TYPO3 fields
+	sorting int(11) unsigned DEFAULT '0' NOT NULL,
+	starttime int(11) unsigned DEFAULT '0' NOT NULL,
+	endtime int(11) unsigned DEFAULT '0' NOT NULL,
+	tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+	crdate int(11) unsigned DEFAULT '0' NOT NULL,
+	cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
+	deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
+	hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+
+    -- TYPO3 workspace fields
+	t3ver_oid int(11) DEFAULT '0' NOT NULL,
+	t3ver_id int(11) DEFAULT '0' NOT NULL,
+	t3ver_wsid int(11) DEFAULT '0' NOT NULL,
+	t3ver_label varchar(255) DEFAULT '' NOT NULL,
+	t3ver_state tinyint(4) DEFAULT '0' NOT NULL,
+	t3ver_stage int(11) DEFAULT '0' NOT NULL,
+	t3ver_count int(11) DEFAULT '0' NOT NULL,
+	t3ver_tstamp int(11) DEFAULT '0' NOT NULL,
+	t3ver_move_id int(11) DEFAULT '0' NOT NULL,
+	t3_origuid int(11) DEFAULT '0' NOT NULL,
+
+	-- TYPO3 multi language fields
+	sys_language_uid int(11) DEFAULT '0' NOT NULL,
+	l10n_parent int(11) DEFAULT '0' NOT NULL,
+	l10n_diffsource mediumblob,
+
+	PRIMARY KEY (uid),
+	KEY parent (pid),
+	KEY t3ver_oid (t3ver_oid,t3ver_wsid),
+	KEY language (l10n_parent,sys_language_uid)
+);