diff --git a/Makefile b/Makefile
index 6a002452f..7a1161af6 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ MVNOPTS := -Dmaven.repo.local=`pwd`/maven-repo
 all: build
 
 build:
-	$(MVN) $(MVNOPTS) clean validate install
+	$(MVN) $(MVNOPTS) -DskipTests=true clean validate install
 run: build
 	curl http://localhost:8080/realms/recordkeeping/.well-known/openid-configuration | jq .authorization_endpoint | grep -q /protocol/ || echo "error: Unable to reach Keycloak API.  Is it running and configured?"
 	$(MVN) $(MVNOPTS) -f pom.xml spring-boot:run
diff --git a/pom.xml b/pom.xml
index 1a1772aef..903db4b49 100644
--- a/pom.xml
+++ b/pom.xml
@@ -325,6 +325,73 @@
                     </execution>
                 </executions>
             </plugin>
+	    <plugin>
+              <groupId>org.codehaus.mojo</groupId>
+              <artifactId>rpm-maven-plugin</artifactId>
+              <version>2.3.0</version>
+              <extensions>true</extensions>
+              <executions>
+		<execution>
+		  <goals>
+		    <goal>rpm</goal>
+		  </goals>
+		</execution>
+              </executions>
+              <configuration>
+		<group>Applications/System</group>
+		<name>${project.artifactId}</name>
+		<version>${project.version}</version>
+		<release>1</release>
+		<summary>${project.name}</summary>
+		<description>${project.description}</description>
+		<mappings>
+		  <mapping>
+		    <directory>/var/nikita-noark5-core</directory>
+		    <filemode>755</filemode>
+		    <username>root</username>
+		    <groupname>root</groupname>
+		    <sources>
+                      <source>
+			<location>target/nikita-noark5-core-0.7.jar</location>
+                      </source>
+		    </sources>
+		  </mapping>
+		  <mapping>
+		    <directory>/etc/systemd/system</directory>
+		    <filemode>755</filemode>
+		    <username>root</username>
+		    <groupname>root</groupname>
+		    <sources>
+                      <source>
+			<location>src/main/resources/systemd/nikita-noark5-core.service</location>
+                      </source>
+		    </sources>
+		  </mapping>
+		</mappings>
+		<preinstallScriptlet>
+		  <scriptFile>src/main/resources/preinstall.sh</scriptFile>
+		  <fileEncoding>utf-8</fileEncoding>
+		  <filter>true</filter>
+		</preinstallScriptlet>
+		<postinstallScriptlet>
+		  <scriptFile>src/main/resources/postinstall.sh</scriptFile>
+		  <fileEncoding>utf-8</fileEncoding>
+		  <filter>true</filter>
+		</postinstallScriptlet>
+              </configuration>
+	    </plugin>
+	    <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-jar-plugin</artifactId>
+	      <version>3.2.2</version>
+              <configuration>
+		<archive>
+		  <manifest>
+		    <mainClass>app.N5CoreApp</mainClass>
+		  </manifest>
+		</archive>
+              </configuration>
+	    </plugin>
         </plugins>
     </build>
 </project>
diff --git a/scripts/www/arkiv.html b/scripts/www/arkiv.html
new file mode 100644
index 000000000..0def2c33b
--- /dev/null
+++ b/scripts/www/arkiv.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<html lang="no">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Arkivverktøy</title>
+    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
+    <style>
+        body { font-family: Arial, sans-serif; margin: 20px; }
+        .container { max-width: 600px; margin: auto; }
+        input, button { margin: 5px 0; padding: 10px; width: 100%; }
+        #results { margin-top: 20px; }
+        .document { padding: 10px; background: #f1f1f1; margin-top: 5px; }
+        .delete-btn { background: red; color: white; border: none; cursor: pointer; }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <h1>Arkivverktøy</h1>
+        <input type="file" id="fileInput">
+        <button onclick="uploadFile()">Last opp</button>
+        <input type="text" id="searchQuery" placeholder="Søk i arkivet">
+        <button onclick="searchDocuments()">Søk</button>
+        <button onclick="exportData('xml')">Eksporter til XML</button>
+        <button onclick="exportData('json')">Eksporter til JSON</button>
+        <button onclick="exportData('xhtml')">Eksporter til XHTML</button>
+        <button onclick="exportData('html5')">Eksporter til HTML5</button>
+        <div id="results"></div>
+    </div>
+
+    <script>
+        let db;
+        
+        // Åpne IndexedDB
+        function openDB() {
+            let request = indexedDB.open("ArchiveDB", 1);
+            request.onupgradeneeded = function(event) {
+                db = event.target.result;
+                if (!db.objectStoreNames.contains("files")) {
+                    db.createObjectStore("files", { keyPath: "name" });
+                }
+            };
+            request.onsuccess = function(event) { db = event.target.result; };
+            request.onerror = function(event) { console.error("IndexedDB error:", event.target.errorCode); };
+        }
+        openDB();
+
+        // Last opp fil
+        function uploadFile() {
+            let file = document.getElementById("fileInput").files[0];
+            if (!file) return alert("Velg en fil.");
+
+            let reader = new FileReader();
+            reader.onload = function(event) {
+                let content = event.target.result;
+                try {
+                    localStorage.setItem(file.name, content);
+                } catch (e) {
+                    saveToIndexedDB(file.name, content);
+                }
+                alert("Fil lastet opp!");
+            };
+            reader.readAsText(file);
+        }
+
+        // Lagre til IndexedDB
+        function saveToIndexedDB(name, content) {
+            let transaction = db.transaction(["files"], "readwrite");
+            let store = transaction.objectStore("files");
+            store.put({ name, content });
+        }
+
+        // Søk i arkivet
+        function searchDocuments() {
+            let query = $("#searchQuery").val().toLowerCase();
+            let resultsDiv = $("#results").empty();
+
+            // Søk i localStorage
+            Object.keys(localStorage).forEach(filename => {
+                let content = localStorage.getItem(filename);
+                if (content.toLowerCase().includes(query)) {
+                    resultsDiv.append(getDocumentHTML(filename, content, "local"));
+                }
+            });
+
+            // Søk i IndexedDB
+            let transaction = db.transaction(["files"], "readonly");
+            let store = transaction.objectStore("files");
+            let request = store.openCursor();
+            request.onsuccess = function(event) {
+                let cursor = event.target.result;
+                if (cursor) {
+                    if (cursor.value.content.toLowerCase().includes(query)) {
+                        resultsDiv.append(getDocumentHTML(cursor.value.name, cursor.value.content, "indexedDB"));
+                    }
+                    cursor.continue();
+                }
+            };
+        }
+
+        // HTML for dokument
+        function getDocumentHTML(name, content, storageType) {
+            return `<div class='document'>
+                        <strong>${name}</strong>
+                        <p>${content}</p>
+                        <button class='delete-btn' onclick="deleteFile('${name}', '${storageType}')">Slett</button>
+                    </div>`;
+        }
+
+        // Slett fil
+        function deleteFile(name, storageType) {
+            if (storageType === "local") {
+                localStorage.removeItem(name);
+            } else {
+                let transaction = db.transaction(["files"], "readwrite");
+                let store = transaction.objectStore("files");
+                store.delete(name);
+            }
+            searchDocuments();
+        }
+
+        // Eksporter data
+        function exportData(type) {
+            let archive = [];
+
+            // Hent fra localStorage
+            Object.keys(localStorage).forEach(filename => {
+                archive.push({ name: filename, content: localStorage.getItem(filename) });
+            });
+
+            // Hent fra IndexedDB
+            let transaction = db.transaction(["files"], "readonly");
+            let store = transaction.objectStore("files");
+            let request = store.openCursor();
+            request.onsuccess = function(event) {
+                let cursor = event.target.result;
+                if (cursor) {
+                    archive.push(cursor.value);
+                    cursor.continue();
+                } else {
+                    generateExportFile(type, archive);
+                }
+            };
+        }
+
+        // Generer eksportfil
+        function generateExportFile(type, archive) {
+            let content = "";
+
+            if (type === "xml") {
+                content = `<?xml version="1.0" encoding="UTF-8"?><arkiv>`;
+                archive.forEach(doc => {
+                    content += `<dokument><navn>${doc.name}</navn><innhold>${doc.content}</innhold></dokument>`;
+                });
+                content += `</arkiv>`;
+            } else if (type === "json") {
+                content = JSON.stringify({ arkiv: archive }, null, 4);
+            } else if (type === "xhtml") {
+                content = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+                    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+                    <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Arkiv</title></head><body><h1>Arkiv</h1>`;
+                archive.forEach(doc => { content += `<div><strong>${doc.name}</strong><p>${doc.content}</p></div>`; });
+                content += `</body></html>`;
+            } else if (type === "html5") {
+                content = `<!DOCTYPE html><html lang="no"><head><meta charset="UTF-8"><title>Arkiv</title></head><body><h1>Arkiv</h1>`;
+                archive.forEach(doc => { content += `<div><strong>${doc.name}</strong><p>${doc.content}</p></div>`; });
+                content += `</body></html>`;
+            }
+
+            let blob = new Blob([content], { type: "text/plain" });
+            let a = document.createElement("a");
+            a.href = URL.createObjectURL(blob);
+            a.download = `arkiv.${type}`;
+            a.click();
+        }
+    </script>
+</body>
+</html>
diff --git a/src/main/resources/postinstall.sh b/src/main/resources/postinstall.sh
new file mode 100644
index 000000000..5f18530ef
--- /dev/null
+++ b/src/main/resources/postinstall.sh
@@ -0,0 +1,4 @@
+if [ $1 -eq 1 ] ; then
+  # Initial installation
+  systemctl enable nikita-noark5-core.service >/dev/null 2>&1 || :
+fi
diff --git a/src/main/resources/preinstall.sh b/src/main/resources/preinstall.sh
new file mode 100644
index 000000000..deed7b0cd
--- /dev/null
+++ b/src/main/resources/preinstall.sh
@@ -0,0 +1,3 @@
+/usr/sbin/useradd -c "Nikita Noark5 Core Application" -U \
+  -s /sbin/nologin -r \
+  -d /var/nikita-noark5-core nikita-noark5-core 2> /dev/null || :
diff --git a/src/main/resources/systemd/nikita-noark5-core.service b/src/main/resources/systemd/nikita-noark5-core.service
new file mode 100755
index 000000000..9efa06f9e
--- /dev/null
+++ b/src/main/resources/systemd/nikita-noark5-core.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Nikita Noark5 Core Application
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/java -jar "/var/nikita-noark5-core/nikita-noark5-core-0.7.jar"
+Restart=on-failure
+User=root
+Group=root
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
