diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php
index e89fa232983b14f3c0188aef9fd3a4334ca10423..3c5b09db5e85f9d9cdc8be0c223ffc3fb345e6e5 100644
--- a/Classes/Controller/BackendController.php
+++ b/Classes/Controller/BackendController.php
@@ -73,6 +73,10 @@ class BackendController extends ActionController {
 
 			// create docheader + buttons
 			$pageInfo = BackendUtility::readPageAccess($pageUid, $GLOBALS['BE_USER']->getPagePermsClause(1));
+			if ($pageInfo === FALSE) {
+				$pageInfo = ['uid' => $pageUid];
+			}
+
 			$this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class);
 			$this->docHeaderComponent->setMetaInformation($pageInfo);
 			BackendService::makeButtons($this->docHeaderComponent, $this->request);
@@ -91,14 +95,15 @@ class BackendController extends ActionController {
 			/** @var QueryResultInterface $companies */
 			$companies = $this->companyRepository->findByPid($pageUid);
 			$this->view->assign('locationOptions', $companies);
+			$this->view->assign('typo3Version', VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version));
 
 			if ($totalJobCount || $companies->count()) {
 				$this->view->assign('jobs', $jobs);
 				$this->view->assign('filters', $filters);
 				$this->view->assign('pageUid', $pageUid);
-				$this->view->assign('typo3Version', VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version));
 			} else {
 				$this->view->assign('noRecords', 1);
+				$this->view->assign('isAdmin', $GLOBALS['BE_USER']->isAdmin());
 				$this->addFlashMessage(
 					LocalizationUtility::translate('backend.notice.noRecords', 'SgJobs'), '', FlashMessage::INFO
 				);
diff --git a/Classes/SignalSlot/SitemapSignalSlot.php b/Classes/SignalSlot/SitemapSignalSlot.php
new file mode 100644
index 0000000000000000000000000000000000000000..a6ce4eb1048a1665a181b8758ff63a0540375328
--- /dev/null
+++ b/Classes/SignalSlot/SitemapSignalSlot.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace SGalinski\SgJobs\SignalSlot;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) sgalinski Internet Services (https://www.sgalinski.de)
+ *
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
+use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
+use TYPO3\CMS\Extbase\Object\ObjectManager;
+use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
+
+/**
+ * Signal functions regarding sg_seo sitemap generation
+ */
+class SitemapSignalSlot {
+	const PLUGIN_NAME = 'sgjobs_jobapplication';
+
+	/**
+	 * @var UriBuilder
+	 */
+	protected $uriBuilder;
+
+	/**
+	 * Before the sitemap is generated
+	 *
+	 * @param array $pageList
+	 * @throws \TYPO3\CMS\Core\Error\Http\ServiceUnavailableException
+	 */
+	public function beforeSitemapGeneration(array &$pageList) {
+		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
+		$request = $objectManager->get(\TYPO3\CMS\Extbase\Mvc\Web\Request::class);
+		$request->setRequestUri(GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL'));
+		$request->setBaseUri(GeneralUtility::getIndpEnv('TYPO3_SITE_URL'));
+
+		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
+		$contentObjectRenderer = $objectManager->get(ContentObjectRenderer::class);
+
+		$configurationManager = $objectManager->get(ConfigurationManager::class);
+		$configurationManager->setContentObject($contentObjectRenderer);
+		$this->uriBuilder = $objectManager->get(UriBuilder::class);
+		$this->uriBuilder->injectConfigurationManager($configurationManager);
+
+		// find sites where job detail plugin is added
+		$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
+		$databaseResource = $queryBuilder->select('pid', 'pages')
+			->from('tt_content')
+			->where(
+				$queryBuilder->expr()->andX(
+					$queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter('list')),
+					$queryBuilder->expr()->eq('list_type', $queryBuilder->createNamedParameter(self::PLUGIN_NAME))
+				)
+			)
+			->execute();
+
+		$rows = $databaseResource->fetchAll();
+
+		foreach ($rows as $row) {
+			$jobs = $this->getJobsByPid($row['pages']);
+
+			foreach ($jobs as $job) {
+				$url = $this->uriBuilder->reset()->setTargetPageUid($row['pid'])->setArguments(
+					['tx_sgjobs_jobapplication' => ['jobId' => $job['uid']]]
+				)->setCreateAbsoluteUri(TRUE)->buildFrontendUri();
+
+				$pageList[] = [
+					'url' => $url,
+					'title' => ''
+				];
+			}
+		}
+	}
+
+	/**
+	 * Get all jobs stored on specific page ids
+	 *
+	 * @param string $pageList
+	 * @return array|null
+	 */
+	private function getJobsByPid($pageList) {
+		$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
+		$databaseResource = $queryBuilder->select('*')
+			->from('tx_sgjobs_domain_model_job')
+			->where($queryBuilder->expr()->in('pid', $queryBuilder->createNamedParameter($pageList)))
+			->execute();
+
+		return $databaseResource->fetchAll();
+	}
+}
diff --git a/Configuration/TCA/tx_sgjobs_domain_model_contact.php b/Configuration/TCA/tx_sgjobs_domain_model_contact.php
index 571705b136d9a6c5665368a55044142f6270a08e..d2ddba753f4846afca4fd374c490081e97da3fe7 100644
--- a/Configuration/TCA/tx_sgjobs_domain_model_contact.php
+++ b/Configuration/TCA/tx_sgjobs_domain_model_contact.php
@@ -4,6 +4,8 @@ return [
 	'ctrl' => [
 		'title' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_contact',
 		'label' => 'last_name',
+		'label_alt' => 'email, city',
+		'label_alt_force' => 1,
 		'tstamp' => 'tstamp',
 		'crdate' => 'crdate',
 		'cruser_id' => 'cruser_id',
diff --git a/Configuration/TCA/tx_sgjobs_domain_model_job.php b/Configuration/TCA/tx_sgjobs_domain_model_job.php
index 0b8dc7c0a4f12c2b694001f5ea8cba4f93adc2e7..8903c2ad564817a1fbc23f1aeb94e47e6c750421 100644
--- a/Configuration/TCA/tx_sgjobs_domain_model_job.php
+++ b/Configuration/TCA/tx_sgjobs_domain_model_job.php
@@ -133,7 +133,7 @@ return [
 			'config' => [
 				'type' => 'input',
 				'size' => 30,
-				'eval' => 'trim, required'
+				'eval' => 'trim, required, unique'
 			],
 		],
 		'job_id' => [
diff --git a/Resources/Private/Backend/Templates/Index.html b/Resources/Private/Backend/Templates/Index.html
index 329a0a81fbac098949e6df3853cccf82cfc6b92b..9dd2e2e28183fd0f36efc31c1b83a744383e9dbe 100644
--- a/Resources/Private/Backend/Templates/Index.html
+++ b/Resources/Private/Backend/Templates/Index.html
@@ -53,7 +53,9 @@
 		</f:then>
 		<f:else>
 			<f:render partial="SelectRoot" arguments="{pages: pages}" />
-			<f:render partial="CreateJob" arguments="{pageUid:pageUid}" />
+			<f:if condition="{isAdmin}">
+				<f:render partial="CreateJob" arguments="{pageUid:pageUid}" />
+			</f:if>
 		</f:else>
 	</f:if>
 
diff --git a/composer.json b/composer.json
index 7720dbdb5e79c32504ee3e647aab9d77ab7342b5..78a79790b71ca0191a939735287796ba5250265e 100644
--- a/composer.json
+++ b/composer.json
@@ -6,7 +6,7 @@
 	"license": [
 		"GPL-2.0-or-later"
 	],
-	"version": "1.15.0",
+	"version": "1.18.1",
 	"support": {
 		"issues": "https://gitlab.sgalinski.de/typo3/sg_jobs"
 	},
diff --git a/ext_emconf.php b/ext_emconf.php
index f2807e35070512953818cba09ca9a7b694cc2529..6f562458cde7aa0ea3451841f8e26fa70664002a 100644
--- a/ext_emconf.php
+++ b/ext_emconf.php
@@ -4,7 +4,7 @@ $EM_CONF[$_EXTKEY] = array (
 	'title' => 'Jobs',
 	'description' => 'Manage and display your Job offers.',
 	'category' => 'plugin',
-	'version' => '1.15.0',
+	'version' => '1.18.1',
 	'state' => 'stable',
 	'uploadfolder' => FALSE,
 	'createDirs' => '',
diff --git a/ext_localconf.php b/ext_localconf.php
index 453b380433459e7814744111b9cefda7a8fec69a..d09161b4d05dd3885cd8a52b361b3c9e9722b94d 100644
--- a/ext_localconf.php
+++ b/ext_localconf.php
@@ -62,3 +62,15 @@ if (TYPO3_MODE === 'BE') {
 
 // register mail templates
 $GLOBALS['sgmail']['sg_jobs']['ApplicationMail'] = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('sg_jobs') . '/Configuration/SgMail/ApplicationMail.php';
+
+// signal slot for sg_seo integration
+/** @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher */
+$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
+	\TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class
+);
+$signalSlotDispatcher->connect(
+	\SGalinski\SgSeo\Generator\PagesSitemapGenerator::class,
+	'accessPageList',
+	\SGalinski\SgJobs\SignalSlot\SitemapSignalSlot::class,
+	'beforeSitemapGeneration'
+);