diff --git a/WindowsInstaller/Install Files/AppData/settings.json b/WindowsInstaller/Install Files/AppData/settings.json
new file mode 100755
index 00000000..088afef4
--- /dev/null
+++ b/WindowsInstaller/Install Files/AppData/settings.json
@@ -0,0 +1,3 @@
+{
+ "apiDocumentationEnabled": true
+}
diff --git a/WindowsInstaller/Install Files/log4j2.properties b/WindowsInstaller/Install Files/log4j2.properties
new file mode 100755
index 00000000..fdbf51dd
--- /dev/null
+++ b/WindowsInstaller/Install Files/log4j2.properties
@@ -0,0 +1,70 @@
+rootLogger.level = info
+# On Windows, uncomment next line to set dirname:
+# property.dirname = ${sys:user.home}\\AppData\\Local\\qortal\\
+property.filename = ${sys:log4j2.filenameTemplate:-log.txt}
+
+rootLogger.appenderRef.console.ref = stdout
+rootLogger.appenderRef.rolling.ref = FILE
+
+# Suppress extraneous bitcoinj library output
+logger.bitcoinj.name = org.bitcoinj
+logger.bitcoinj.level = error
+
+# Override HSQLDB logging level to "warn" as too much is logged at "info"
+logger.hsqldb.name = hsqldb.db
+logger.hsqldb.level = warn
+
+# Support optional, per-session HSQLDB debugging
+logger.hsqldbRepository.name = org.qortal.repository.hsqldb
+logger.hsqldbRepository.level = debug
+
+# Suppress extraneous Jersey warning
+logger.jerseyInject.name = org.glassfish.jersey.internal.inject.Providers
+logger.jerseyInject.level = off
+
+# Suppress extraneous Jersey EOF 'errors' (actually remote peers disconnecting early)
+logger.jerseyEOF.name = org.glassfish.jersey.server.internal
+logger.jerseyEOF.level = off
+
+# Suppress extraneous Jetty entries
+# 2019-02-14 11:46:27 INFO ContextHandler:851 - Started o.e.j.s.ServletContextHandler@6949e948{/,null,AVAILABLE}
+# 2019-02-14 11:46:27 INFO AbstractConnector:289 - Started ServerConnector@50ad322b{HTTP/1.1,[http/1.1]}{0.0.0.0:9085}
+# 2019-02-14 11:46:27 INFO Server:374 - jetty-9.4.11.v20180605; built: 2018-06-05T18:24:03.829Z; git: d5fc0523cfa96bfebfbda19606cad384d772f04c; jvm 1.8.0_181-b13
+# 2019-02-14 11:46:27 INFO Server:411 - Started @2539ms
+logger.jetty.name = org.eclipse.jetty
+logger.jetty.level = warn
+# Even more extraneous Jetty output
+# 2019-01-26 02:18:10 WARN ResourceService:718 - java.util.concurrent.TimeoutException: Idle timeout expired: 30000/30000 ms
+logger.jettyRS.name = org.eclipse.jetty.server.ResourceService
+logger.jettyRS.level = error
+
+# Suppress extraneous slf4j entries
+# 2019-02-14 11:46:27 INFO log:193 - Logging initialized @1636ms to org.eclipse.jetty.util.log.Slf4jLog
+logger.slf4j.name = org.slf4j
+logger.slf4j.level = warn
+
+# Suppress extraneous Reflections entry
+# 2019-02-27 10:45:25 WARN Reflections:179 - given scan urls are empty. set urls in the configuration
+logger.orgReflections.name = org.reflections.Reflections
+logger.orgReflections.level = off
+logger.sunReflections.name = sun.reflect.Reflection
+logger.sunReflections.level = off
+
+appender.console.type = Console
+appender.console.name = stdout
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
+appender.console.filter.threshold.type = ThresholdFilter
+appender.console.filter.threshold.level = error
+
+appender.rolling.type = RollingFile
+appender.rolling.name = FILE
+appender.rolling.layout.type = PatternLayout
+appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
+appender.rolling.filePattern = ${dirname:-}${filename}.%i
+appender.rolling.policy.type = SizeBasedTriggeringPolicy
+appender.rolling.policy.size = 4MB
+# Set the immediate flush to true (default)
+# appender.rolling.immediateFlush = true
+# Set the append to true (default), should not overwrite
+# appender.rolling.append=true
diff --git a/WindowsInstaller/Install Files/ntpcfg.bat b/WindowsInstaller/Install Files/ntpcfg.bat
new file mode 100755
index 00000000..e9725808
--- /dev/null
+++ b/WindowsInstaller/Install Files/ntpcfg.bat
@@ -0,0 +1,33 @@
+@echo off
+
+:: BatchGotAdmin
+:-------------------------------------
+REM --> Check for permissions
+>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
+
+REM --> If error flag set, we do not have admin.
+if '%errorlevel%' NEQ '0' (
+ echo Requesting administrative privileges...
+ goto UACPrompt
+) else ( goto gotAdmin )
+
+:UACPrompt
+ echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
+ echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
+
+ "%temp%\getadmin.vbs"
+ exit /B
+
+:gotAdmin
+ if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
+ pushd "%CD%"
+ CD /D "%~dp0"
+:--------------------------------------
+
+net stop "Windows Time"
+
+w32tm /config "/manualpeerlist:pool.ntp.org 0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org cn.pool.ntp.org 0.cn.pool.ntp.org 1.cn.pool.ntp.org 2.cn.pool.ntp.org 3.cn.pool.ntp.org"
+
+net start "Windows Time"
+
+sc config w32time start= auto
diff --git a/WindowsInstaller/Install Files/qortal.jar b/WindowsInstaller/Install Files/qortal.jar
new file mode 100755
index 00000000..167c4f12
Binary files /dev/null and b/WindowsInstaller/Install Files/qortal.jar differ
diff --git a/WindowsInstaller/Qortal.aip b/WindowsInstaller/Qortal.aip
new file mode 100755
index 00000000..21768cfd
--- /dev/null
+++ b/WindowsInstaller/Qortal.aip
@@ -0,0 +1,1268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WindowsInstaller/README.md b/WindowsInstaller/README.md
new file mode 100644
index 00000000..a646cabd
--- /dev/null
+++ b/WindowsInstaller/README.md
@@ -0,0 +1,26 @@
+# Windows installer
+
+## Prerequisites
+
+* AdvancedInstaller v16 or better, and enterprise licence if translations are required
+* Installed AdoptOpenJDK v11 64bit, full JDK *not* JRE
+
+## General build instructions
+
+If this is your first time opening the `qortal.aip` file then you might need to adjust
+configured paths, or create a dummy `D:` drive with the expected layout.
+
+Typical build procedure:
+
+* Overwrite the `qortal.jar` file in `Install-Files\`
+* Open AdvancedInstaller with qortal.aip file
+* If releasing a new version, change version number in:
+ + "Product Information" side menu
+ + "Product Details" side menu entry
+ + "Product Details" tab in "Product Details" pane
+ + "Product Version" entry box
+* Click away to a different side menu entry, e.g. "Resources" -> "Files and Folders"
+* You should be prompted whether to generate a new product key, click "Generate New"
+* Click "Build" button
+* New EXE should be generated in `Qortal-SetupFiles\` folder with correct version number
+
diff --git a/WindowsInstaller/dictionary.ail b/WindowsInstaller/dictionary.ail
new file mode 100755
index 00000000..eaddb48a
--- /dev/null
+++ b/WindowsInstaller/dictionary.ail
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WindowsInstaller/qortal.ico b/WindowsInstaller/qortal.ico
new file mode 100755
index 00000000..b0f8f5fb
Binary files /dev/null and b/WindowsInstaller/qortal.ico differ