diff --git a/app/modules/ws2p/index.ts b/app/modules/ws2p/index.ts
index a54d265f1a8b3368f99b05333d5e8f83b929ecaa..c91451e46a817b5e3576b2d284ae85c2a1b14219 100644
--- a/app/modules/ws2p/index.ts
+++ b/app/modules/ws2p/index.ts
@@ -16,8 +16,8 @@ export const WS2PDependency = {
     cliOptions: [
       { value: '--ws2p-upnp',                  desc: 'Use UPnP to open remote port.' },
       { value: '--ws2p-noupnp',                desc: 'Do not use UPnP to open remote port.' },
-      { value: '--ws2p-host <host>',           desc: 'Port to listen to.' },
-      { value: '--ws2p-port <port>',           desc: 'Host to listen to.', parser: (val:string) => parseInt(val) },
+      { value: '--ws2p-host <host>',           desc: 'Host to listen to.' },
+      { value: '--ws2p-port <port>',           desc: 'Port to listen to.', parser: (val:string) => parseInt(val) },
       { value: '--ws2p-remote-host <address>', desc: 'Availabily host.' },
       { value: '--ws2p-remote-port <port>',    desc: 'Availabily port.', parser: (val:string) => parseInt(val) },
       { value: '--ws2p-remote-path <path>',    desc: 'Availabily web path.' },
diff --git a/index.ts b/index.ts
index e7e6a32e0194faf11b4035e741684784b0921f66..15903c38a8696907c22b174f13f33c57a3271d6a 100644
--- a/index.ts
+++ b/index.ts
@@ -500,6 +500,7 @@ function commandLineConf(program:any, conf:any = {}) {
   if (cli.currency)                             conf.currency = cli.currency;
   if (cli.server.port)                          conf.port = cli.server.port;
   if (cli.cpu)                                  conf.cpu = Math.max(0.01, Math.min(1.0, cli.cpu));
+  if (cli.nbCores)                              conf.nbCores = Math.max(1, Math.min(ProverConstants.CORES_MAXIMUM_USE_IN_PARALLEL, cli.nbCores));
   if (cli.prefix)                               conf.prefix = Math.max(ProverConstants.MIN_PEER_ID, Math.min(ProverConstants.MAX_PEER_ID, cli.prefix));
   if (cli.logs.http)                            conf.httplogs = true;
   if (cli.logs.nohttp)                          conf.httplogs = false;
diff --git a/release/arch/linux/build-lin.sh b/release/arch/linux/build-lin.sh
index 6abf5c16fa4a80be1b7cf4d0f24143c0c8fbb5d8..585ee00195f9cff1ab89d817584af3e7e4c1bf3f 100644
--- a/release/arch/linux/build-lin.sh
+++ b/release/arch/linux/build-lin.sh
@@ -167,6 +167,19 @@ tar czf "${BIN}/duniter-desktop-${DUNITER_TAG}-linux-x64.tar.gz" * || exit 1
 # Build Debian packages
 # -----------------------
 
+# Parameters
+# 1: Building directory.
+build_extra_desktop() {
+	cp -r "${ROOT}/release/extra/desktop/"* "${1}" || exit 1
+}
+
+# Parameters
+# 1: Building directory.
+build_extra_server() {
+	mkdir -p "${1}/lib/systemd/system" || exit 1
+	cp "${ROOT}/release/extra/systemd/duniter.service" "${1}/lib/systemd/system" || exit 1
+}
+
 # Parameters
 # 1: either "server" or "desktop".
 # 2: package name for Debian.
@@ -174,9 +187,7 @@ build_deb_pack() {
 	rm -rf "${RELEASES}/duniter-x64"
 	mkdir "${RELEASES}/duniter-x64" || exit 1
 	cp -r "${ROOT}/release/extra/debian/package/"* "${RELEASES}/duniter-x64" || exit 1
-	if [[ "${1}" == "desktop" ]]; then
-		cp -r "${ROOT}/release/extra/desktop/"* "${RELEASES}/duniter-x64" || exit 1
-	fi
+	build_extra_${1} "${RELEASES}/duniter-x64"
 	mkdir -p "${RELEASES}/duniter-x64/opt/duniter/" || exit 1
 	chmod 755 "${RELEASES}/duniter-x64/DEBIAN/"post* || exit 1
 	chmod 755 "${RELEASES}/duniter-x64/DEBIAN/"pre* || exit 1
diff --git a/release/extra/debian/package/DEBIAN/postinst b/release/extra/debian/package/DEBIAN/postinst
index dcf677ed0117132e4c5d92fd39f14abb3867d983..ae7ac47e952891759c83eb36105980acc5e22589 100755
--- a/release/extra/debian/package/DEBIAN/postinst
+++ b/release/extra/debian/package/DEBIAN/postinst
@@ -34,6 +34,10 @@ if [[ -d $DUN_SOURCES/node ]]; then
   cd $DUN_SOURCES
   cd node/bin/
   ln -s ../lib/node_modules/npm/bin/npm-cli.js ./npm -f
+  # Add duniter user for service
+  mkdir -p /var/lib/duniter
+  adduser --system --quiet --home /var/lib/duniter --no-create-home --disabled-password --group duniter
+  chown duniter:duniter /var/lib/duniter
 fi
 # Else will execute with environment node
 
diff --git a/release/extra/openrc/duniter.confd b/release/extra/openrc/duniter.confd
new file mode 100644
index 0000000000000000000000000000000000000000..af0c9a3a8c797e81534463b723d4fb7a9112f790
--- /dev/null
+++ b/release/extra/openrc/duniter.confd
@@ -0,0 +1,19 @@
+# File containing crypto keys
+#DUNITER_KEYS=/etc/duniter/keys.yml
+
+# Uncomment the following line to start the web GUI
+#DUNITER_WEB=yes
+
+# Parameters for the web GUI
+#DUNITER_WEB_HOST=localhost
+#DUNITER_WEB_PORT=9220
+
+# User and group of running process
+#DUNITER_GROUP=duniter
+#DUNITER_USER=duniter
+
+# Directory of duniter files
+#DUNITER_HOME=/var/lib/duniter
+
+# Directory of duniter data
+#DUNITER_DATA=duniter_default
diff --git a/release/extra/openrc/duniter.initd b/release/extra/openrc/duniter.initd
new file mode 100644
index 0000000000000000000000000000000000000000..6ce4c3d19c58e57b0b2cd0f0ddebdbde3a9b748c
--- /dev/null
+++ b/release/extra/openrc/duniter.initd
@@ -0,0 +1,50 @@
+#!/sbin/openrc-run
+
+: ${DUNITER_GROUP:=duniter}
+: ${DUNITER_USER:=duniter}
+
+: ${DUNITER_HOME:=/var/lib/duniter}
+: ${DUNITER_DATA:=duniter_default}
+
+command="/usr/bin/duniter"
+if yesno "${DUNITER_WEB}"; then
+	command_args="webstart"
+	if [[ ! -z ${DUNITER_WEB_HOST} ]]; then
+		command_args="${command_args} --webmhost \"${DUNITER_WEB_HOST}\""
+	fi
+	if [[ ! -z ${DUNITER_WEB_PORT} ]]; then
+		command_args="${command_args} --webmport \"${DUNITER_WEB_PORT}\""
+	fi
+else
+	command_args="start"
+fi
+if [[ ! -z ${DUNITER_KEYS} ]] && [[ -r ${DUNITER_KEYS} ]]; then
+	command_args="${command_args} --keyfile \"${DUNITER_KEYS}\""
+fi
+command_args="${command_args} --home \"${DUNITER_HOME}\" --mdb \"${DUNITER_DATA}\" ${DUNITER_SSD_OPTIONS}"
+start_stop_daemon_args="--user \"${DUNITER_USER}\":\"${DUNITER_GROUP}\""
+description="Duniter node"
+
+depend() {
+	need net
+}
+
+status() {
+	if ${command} status --home "${DUNITER_HOME}" --mdb "${DUNITER_DATA}" | grep -q "is running"; then
+		einfo "status: started"
+		return 0
+	else
+		if service_started; then
+			mark_service_stopped
+			eerror "status: crashed"
+			return 32
+		else
+			einfo "status: stopped"
+			return 3
+		fi
+	fi
+}
+
+stop() {
+	${command} stop --home "${DUNITER_HOME}" --mdb "${DUNITER_DATA}"
+}
diff --git a/release/extra/systemd/duniter.service b/release/extra/systemd/duniter.service
new file mode 100644
index 0000000000000000000000000000000000000000..51b819620e3082f915a6529b2e37de487ee5a991
--- /dev/null
+++ b/release/extra/systemd/duniter.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=Duniter node
+After=network.target
+
+[Service]
+# Should be set to web in order to start with web GUI
+Environment="DUNITER_WEB="
+Environment="DUNITER_HOME=/var/lib/duniter"
+Environment="DUNITER_DATA=duniter_default"
+# If using a key file, DUNITER_OPTS can be defined like so:
+#Environment="DUNITER_OPTS=--keyfile /etc/duniter/keys.yml"
+Environment="DUNITER_OPTS="
+Group=duniter
+User=duniter
+Type=forking
+ExecStart=/usr/bin/duniter ${DUNITER_WEB}start --home ${DUNITER_HOME} --mdb ${DUNITER_DATA} $DUNITER_OPTS
+ExecReload=/usr/bin/duniter ${DUNITER_WEB}restart --home ${DUNITER_HOME} --mdb ${DUNITER_DATA} $DUNITER_OPTS
+ExecStop=/usr/bin/duniter stop --home ${DUNITER_HOME} --mdb ${DUNITER_DATA}
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target