diff --git a/src/server/sitemap_generator/SitemapGenerator.js b/src/server/sitemap_generator/SitemapGenerator.js
index 7c2524a37656a615720e6962d01168f4021edb4b..6a430ef7398e665b10159cc1e31eb182d1b68981 100644
--- a/src/server/sitemap_generator/SitemapGenerator.js
+++ b/src/server/sitemap_generator/SitemapGenerator.js
@@ -2,23 +2,19 @@ import { backendSearchConfig } from '../sparql/sampo/BackendSearchConfig'
 import { createWriteStream } from 'fs'
 import { resolve } from 'path'
 import { createGzip } from 'zlib'
-// import { Readable } from 'stream'
 import { has } from 'lodash'
 import {
   SitemapAndIndexStream,
   SitemapStream
 } from 'sitemap'
-import { sitemapQuery } from '../sparql/SparqlQueriesGeneral'
 import { runSelectQuery } from '../sparql/SparqlApi'
 
-const outputDir = './src/server/sitemap_generator/sitemap_output'
-const baseURL = 'https://sampo-ui.demo.seco.cs.aalto.fi/en'
-const sitemapURL = 'https://sampo-ui.demo.seco.cs.aalto.fi/sitemap'
+const { sitemapConfig } = backendSearchConfig
 
 const mapURLs = sparqlBindings => {
-  const results = sparqlBindings.map(b => ({
-    url: b.url.value
-  }))
+  const results = sparqlBindings.map(b => {
+    return createSitemapEntry({ path: b.path.value })
+  })
   return results
 }
 
@@ -29,35 +25,33 @@ const getURLs = async resultClasses => {
     // it needs to create a new sitemap file. You merely need to return a stream
     // for it to write the sitemap urls to and the expected url where that sitemap will be hosted
     getSitemapStream: index => {
-      const sitemapStream = new SitemapStream({ hostname: baseURL })
+      const sitemapStream = new SitemapStream({ hostname: sitemapConfig.baseUrl })
       const fileName = `sitemap-${index}.xml.gz`
 
       sitemapStream
         .pipe(createGzip()) // compress the output
-        .pipe(createWriteStream(resolve(`${outputDir}/${fileName}`))) // write it to sitemap-NUMBER.xml.gz
+        .pipe(createWriteStream(resolve(`${sitemapConfig.outputDir}/${fileName}`))) // write it to sitemap-NUMBER.xml.gz
 
-      return [`${sitemapURL}/${fileName}`, sitemapStream]
+      return [`${sitemapConfig.sitemapUrl}/${fileName}`, sitemapStream]
     }
   })
 
   sitemapStream
     .pipe(createGzip()) // compress the output
-    .pipe(createWriteStream(resolve(`${outputDir}/sitemap-index.xml.gz`))) // write it to sitemap-index.xml.gz
+    .pipe(createWriteStream(resolve(`${sitemapConfig.outputDir}/sitemap-index.xml.gz`))) // write it to sitemap-index.xml.gz
 
   // Add portal's main level URLs to sitemap
-  sitemapStream.write({ url: baseURL })
-  sitemapStream.write({ url: `${baseURL}/about` })
-  sitemapStream.write({ url: `${baseURL}/instructions` })
-  sitemapStream.write({ url: `${baseURL}/feedback` })
+  sitemapStream.write(createSitemapEntry({ path: null }))
+  sitemapStream.write(createSitemapEntry({ path: 'about' }))
+  sitemapStream.write(createSitemapEntry({ path: 'instructions' }))
+  sitemapStream.write(createSitemapEntry({ path: 'feedback' }))
 
   // Then process each resultClass
   for (const resultClass of resultClasses) {
     if (resultClass.hasSearchPerspective) {
       // If there is a search perspective, add it's URL to sitemap
       const searchMode = resultClass.searchMode ? resultClass.searchMode : 'faceted-search'
-      sitemapStream.write({
-        url: `${baseURL}/${resultClass.perspectiveID}/${searchMode}`
-      })
+      sitemapStream.write(createSitemapEntry({ path: `${resultClass.perspectiveID}/${searchMode}/table` }))
     }
     const response = await queryInstancePageURLs(resultClass)
     // Add instance page URLs to sitemap
@@ -69,8 +63,9 @@ const getURLs = async resultClasses => {
 
 const queryInstancePageURLs = config => {
   const { endpoint } = config
-  let q = sitemapQuery.replace('<RESULT_CLASS>', config.rdfType)
+  let q = sitemapConfig.sitemapInstancePageQuery.replace('<RESULT_CLASS>', config.rdfType)
   q = q.replace('<PERSPECTIVE>', config.perspectiveID)
+  q = q.replace('<DEFAULT_TAB>', config.instancePageDefaultTab)
   return runSelectQuery({
     query: endpoint.prefixes + q,
     endpoint: endpoint.url,
@@ -86,6 +81,7 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) {
   if (config.includeInSitemap) {
     let rdfType
     let hasSearchPerspective
+    const instancePageDefaultTab = config.instance.defaultTab || 'table'
     if (!has(config, 'facetClass')) {
       rdfType = config.rdfType
       config = backendSearchConfig[config.perspectiveID]
@@ -98,9 +94,22 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) {
       endpoint: config.endpoint,
       perspectiveID: resultClass,
       hasSearchPerspective,
-      rdfType
+      rdfType,
+      instancePageDefaultTab
     })
   }
 }
 
+const createSitemapEntry = ({ path }) => {
+  path = path ? `/${path}` : '' // do not add trailing slash
+  const entry = {
+    url: `${sitemapConfig.baseUrl}/${sitemapConfig.langPrimary}${path}`,
+    links: [
+      { lang: sitemapConfig.langPrimary, url: `${sitemapConfig.baseUrl}/${sitemapConfig.langPrimary}${path}` },
+      { lang: sitemapConfig.langSecondary, url: `${sitemapConfig.baseUrl}/${sitemapConfig.langSecondary}${path}` }
+    ]
+  }
+  return entry
+}
+
 getURLs(resultClasses)
diff --git a/src/server/sparql/SparqlQueriesGeneral.js b/src/server/sparql/SparqlQueriesGeneral.js
index 9b5d864ccc520b1243a08768f7e5a3c552ba0b18..f215c72085deabde15c6b9fd0abff9e352818e1e 100644
--- a/src/server/sparql/SparqlQueriesGeneral.js
+++ b/src/server/sparql/SparqlQueriesGeneral.js
@@ -125,12 +125,12 @@ export const facetValuesRange = `
   }
 `
 
-export const sitemapQuery = `
-  SELECT ?url 
+export const sitemapInstancePageQuery = `
+  SELECT ?path 
   WHERE {
     VALUES ?resultClass { <RESULT_CLASS> }
     ?uri a ?resultClass .
-    BIND(CONCAT("/<PERSPECTIVE>/page/", REPLACE(STR(?uri), "^.*\\\\/(.+)", "$1")) AS ?url)
+    BIND(CONCAT("<PERSPECTIVE>/page/", REPLACE(STR(?uri), "^.*\\\\/(.+)", "$1"), "/<DEFAULT_TAB>") AS ?path)
   }
-  # LIMIT 10
+  # LIMIT 100
 `
diff --git a/src/server/sparql/sampo/BackendSearchConfig.js b/src/server/sparql/sampo/BackendSearchConfig.js
index 302b788655fe30f165146370a7936684509582cd..ffc0df91a0140facd36bac61f0da8ced58e47650 100644
--- a/src/server/sparql/sampo/BackendSearchConfig.js
+++ b/src/server/sparql/sampo/BackendSearchConfig.js
@@ -54,6 +54,7 @@ import {
 import { hellerauMigrationsQuery } from './sparql_queries/SparqlQueriesHellerau'
 import { federatedSearchDatasets } from './sparql_queries/SparqlQueriesFederatedSearch'
 import { fullTextSearchProperties } from './sparql_queries/SparqlQueriesFullText'
+import { sitemapInstancePageQuery } from '../SparqlQueriesGeneral'
 import { makeObjectList } from '../SparqlObjectMapper'
 import {
   mapPlaces,
@@ -257,5 +258,13 @@ export const backendSearchConfig = {
   },
   federatedSearch: {
     datasets: federatedSearchDatasets
+  },
+  sitemapConfig: {
+    baseUrl: 'https://sampo-ui.demo.seco.cs.aalto.fi',
+    langPrimary: 'en',
+    langSecondary: 'fi',
+    outputDir: './src/server/sitemap_generator/sitemap_output',
+    sitemapUrl: 'https://sampo-ui.demo.seco.cs.aalto.fi/sitemap',
+    sitemapInstancePageQuery
   }
 }
diff --git a/src/server/sparql/sampo/perspective_configs/Perspective1Config.js b/src/server/sparql/sampo/perspective_configs/Perspective1Config.js
index b8230865f890433da9fa332ab5d4a59f1a234427..0c44e8cd125b283ccfb9e3580f78f76cb14885b9 100644
--- a/src/server/sparql/sampo/perspective_configs/Perspective1Config.js
+++ b/src/server/sparql/sampo/perspective_configs/Perspective1Config.js
@@ -20,7 +20,8 @@ export const perspective1Config = {
   },
   instance: {
     properties: manuscriptPropertiesInstancePage,
-    relatedInstances: ''
+    relatedInstances: '',
+    defaultTab: 'table'
   },
   facets: {
     prefLabel: {