diff --git a/.tx/config b/.tx/config
index 1d7c4551ab04d60cc50d2f00318c26e61e07a1e3..30b4dea74e8b50da255af2fe7c4f5feef5a61e00 100644
--- a/.tx/config
+++ b/.tx/config
@@ -619,21 +619,21 @@ trans.tr_TR = installer/resources/eepsite/docroot/help/index_tr.html
 ;; Text on /console
 ;;
 type = HTML
-source_file = installer/resources/readme/readme.html
+source_file = apps/routerconsole/resources/docs/readme.html
 source_lang = en
-trans.ar = installer/resources/readme/readme_ar.html
-trans.de = installer/resources/readme/readme_de.html
-trans.fr = installer/resources/readme/readme_fr.html
+trans.ar = apps/routerconsole/resources/docs/readme_ar.html
+trans.de = apps/routerconsole/resources/docs/readme_de.html
+trans.fr = apps/routerconsole/resources/docs/readme_fr.html
 ;; Java converts id to in
-trans.id = installer/resources/readme/readme_in.html
-trans.it = installer/resources/readme/readme_it.html
-trans.ja = installer/resources/readme/readme_ja.html
-trans.pl = installer/resources/readme/readme_pl.html
-trans.pt = installer/resources/readme/readme_pt.html
-trans.ro = installer/resources/readme/readme_ro.html
-trans.ru_RU = installer/resources/readme/readme_ru.html
-trans.tr_TR = installer/resources/readme/readme_tr.html
-trans.zh_CN = installer/resources/readme/readme_zh.html
+trans.id = apps/routerconsole/resources/docs/readme_in.html
+trans.it = apps/routerconsole/resources/docs/readme_it.html
+trans.ja = apps/routerconsole/resources/docs/readme_ja.html
+trans.pl = apps/routerconsole/resources/docs/readme_pl.html
+trans.pt = apps/routerconsole/resources/docs/readme_pt.html
+trans.ro = apps/routerconsole/resources/docs/readme_ro.html
+trans.ru_RU = apps/routerconsole/resources/docs/readme_ru.html
+trans.tr_TR = apps/routerconsole/resources/docs/readme_tr.html
+trans.zh_CN = apps/routerconsole/resources/docs/readme_zh.html
 
 [main]
 host = https://www.transifex.com
diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml
index 5b65c97d1da36cf02523fd1f4a2e6b9487ae1896..553fea3b1127b0ceedc71fe0d4d30efddc21c390 100644
--- a/apps/routerconsole/java/build.xml
+++ b/apps/routerconsole/java/build.xml
@@ -140,7 +140,7 @@
         <copy file="src/edu/internet2/ndt/locale/Tcpbw100_msgs_nl_NL.properties" tofile="build/obj/edu/internet2/ndt/locale/Tcpbw100_msgs_nl.properties" />
         <copy file="src/edu/internet2/ndt/locale/Tcpbw100_msgs_pt_BR.properties" tofile="build/obj/edu/internet2/ndt/locale/Tcpbw100_msgs_pt.properties" />
         <copy file="src/edu/internet2/ndt/locale/Tcpbw100_msgs_ru_RU.properties" tofile="build/obj/edu/internet2/ndt/locale/Tcpbw100_msgs_ru.properties" />
-        <jar destfile="./build/routerconsole.jar" basedir="./build/obj" excludes="net/i2p/router/web/helpers/* net/i2p/router/web/servlets/*">
+        <jar destfile="./build/routerconsole.jar" basedir="./build/obj" excludes="net/i2p/router/web/helpers/**/* net/i2p/router/web/servlets/**/* net/i2p/router/web/resources/**/*">
             <manifest>
                 <!-- DTG added in 0.8.4, not in the classpath for very old installs, before we changed wrapper.config to specify * -->
                 <!-- very old installs don't have i2psnark,jstl,standard in the classpath... not added in WebAppConfiguration any more -->
@@ -338,10 +338,13 @@
     <target name="war" depends="precompilejsp, warUpToDate, listChangedFiles2" unless="war.uptodate" >
         <!-- set if unset -->
         <property name="workspace.changes.w.tr" value="" />
-        <!-- Don't include the css in the war, the main build.xml will copy it to docs/themes/console/ -->
         <copy file="../jsp/themes/console/images/favicon.ico" tofile="../jsp/favicon.ico" />
+        <mkdir dir="build/obj/net/i2p/router/web/resources" />
+        <copy todir="build/obj/net/i2p/router/web/resources" >
+            <fileset dir="../resources" />
+        </copy>
         <war destfile="build/routerconsole.war" webxml="../jsp/web-out.xml"
-             basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
+             basedir="../jsp/" excludes="web.xml, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
             <manifest>
                 <attribute name="Implementation-Version" value="${full.version}" />
                 <attribute name="Built-By" value="${build.built-by}" />
@@ -351,7 +354,7 @@
                 <attribute name="X-Compile-Source-JDK" value="${javac.version}" />
                 <attribute name="X-Compile-Target-JDK" value="${javac.version}" />
             </manifest>
-            <classes dir="./build/obj" includes="net/i2p/router/web/helpers/* net/i2p/router/web/servlets/*" />
+            <classes dir="./build/obj" includes="net/i2p/router/web/helpers/* net/i2p/router/web/servlets/* net/i2p/router/web/resources/**/*" />
         </war>
         <delete file="../jsp/favicon.ico" />
     </target>
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
index 2200b9af6d3f850397f7c7690be567aa5fb2f6f3..b167682608b44b67dbc7590c3f79e16381f4b6ce 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
@@ -1,6 +1,10 @@
 package net.i2p.router.web;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
 import java.util.Locale;
 
 import net.i2p.util.FileUtil;
@@ -12,12 +16,16 @@ public class ContentHelper extends HelperBase {
     private String _lang;
     
     /**
-     * Caution, use absolute paths only, do not assume files are in CWD
+     * Caution, use absolute paths only for getContent() and getTextContent(),
+     * do not assume files are in CWD.
+     * Use relative path for getResource().
      */
     public void setPage(String page) { _page = page; }
+
     public void setStartAtBeginning(String moo) { 
         _startAtBeginning = Boolean.parseBoolean(moo); 
     }
+
     public void setLang(String l) {
 /*****
         if((_lang == null || !_lang.equals(l)) && (l != null)) {
@@ -106,4 +114,61 @@ public class ContentHelper extends HelperBase {
             return newname;
         return _page;
     }
+
+    /**
+     * Convert file.ext to file_lang.ext if it exists.
+     * Get lang from the cgi lang param, then properties, then from the default locale.
+     * _context must be set to check the property.
+     * @return "" on error
+     * @since 0.9.49
+     */
+    public String getResource() {
+        if (_page == null || _page.contains(".."))
+            return "";
+        String lang = _lang;
+        String page = null;
+        int lastdot = _page.lastIndexOf('.');
+        if (lastdot <= 0) {
+            page = _page;
+        } else {
+            if (lang == null || lang.length() <= 0) {
+                if (_context != null)
+                    lang = _context.getProperty(Messages.PROP_LANG);
+                if (lang == null || lang.length() <= 0) {
+                    lang = Locale.getDefault().getLanguage();
+                    if (lang == null || lang.length() <= 0)
+                        page = _page;
+                }
+            }
+        }
+        if (page == null) {
+            if (lang.equals("en"))
+                page = _page;
+            else
+                page = _page.substring(0, lastdot) + '_' + lang + _page.substring(lastdot);
+        }
+        InputStream is = ContentHelper.class.getResourceAsStream("/net/i2p/router/web/resources/" + page);
+        if (is == null) {
+            is = ContentHelper.class.getResourceAsStream("/net/i2p/router/web/resources/" + _page);
+            if (is == null)
+                return "";
+        }
+        BufferedReader in = null;
+        StringBuilder buf = new StringBuilder(20000);
+        try {
+            in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+            String line = null;
+            int i = 0;
+            while ( (line = in.readLine()) != null) {
+                buf.append(line);
+                if (_maxLines > 0 && ++i >= _maxLines)
+                    break;
+            }
+        } catch (IOException ioe) {
+        } finally {
+            if (in != null) try { in.close(); } catch (IOException ioe) {}
+            try { is.close(); } catch (IOException ioe) {}
+        }
+        return buf.toString();
+    }
 }
diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp
index 446e51b85cd5b991f8932a6dd245df5033e608aa..497ac0c8fa25b0cdaf4e5195499d12755ab35848 100644
--- a/apps/routerconsole/jsp/console.jsp
+++ b/apps/routerconsole/jsp/console.jsp
@@ -34,8 +34,8 @@
   <h2><%=intl._t("Welcome to I2P")%></h2>
  </div>
  <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %>
- <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
+ <jsp:setProperty name="contenthelper" property="page" value="docs/readme.html" />
  <jsp:setProperty name="contenthelper" property="maxLines" value="300" />
  <jsp:setProperty name="contenthelper" property="contextId" value="<%=i2pcontextId%>" />
- <jsp:getProperty name="contenthelper" property="content" />
+ <jsp:getProperty name="contenthelper" property="resource" />
 </div></body></html>
diff --git a/installer/resources/readme/readme.html b/apps/routerconsole/resources/docs/readme.html
similarity index 100%
rename from installer/resources/readme/readme.html
rename to apps/routerconsole/resources/docs/readme.html
diff --git a/installer/resources/readme/readme_ar.html b/apps/routerconsole/resources/docs/readme_ar.html
similarity index 100%
rename from installer/resources/readme/readme_ar.html
rename to apps/routerconsole/resources/docs/readme_ar.html
diff --git a/installer/resources/readme/readme_de.html b/apps/routerconsole/resources/docs/readme_de.html
similarity index 100%
rename from installer/resources/readme/readme_de.html
rename to apps/routerconsole/resources/docs/readme_de.html
diff --git a/installer/resources/readme/readme_es.html b/apps/routerconsole/resources/docs/readme_es.html
similarity index 100%
rename from installer/resources/readme/readme_es.html
rename to apps/routerconsole/resources/docs/readme_es.html
diff --git a/installer/resources/readme/readme_fr.html b/apps/routerconsole/resources/docs/readme_fr.html
similarity index 100%
rename from installer/resources/readme/readme_fr.html
rename to apps/routerconsole/resources/docs/readme_fr.html
diff --git a/installer/resources/readme/readme_in.html b/apps/routerconsole/resources/docs/readme_in.html
similarity index 100%
rename from installer/resources/readme/readme_in.html
rename to apps/routerconsole/resources/docs/readme_in.html
diff --git a/installer/resources/readme/readme_it.html b/apps/routerconsole/resources/docs/readme_it.html
similarity index 100%
rename from installer/resources/readme/readme_it.html
rename to apps/routerconsole/resources/docs/readme_it.html
diff --git a/installer/resources/readme/readme_ja.html b/apps/routerconsole/resources/docs/readme_ja.html
similarity index 100%
rename from installer/resources/readme/readme_ja.html
rename to apps/routerconsole/resources/docs/readme_ja.html
diff --git a/installer/resources/readme/readme_nl.html b/apps/routerconsole/resources/docs/readme_nl.html
similarity index 100%
rename from installer/resources/readme/readme_nl.html
rename to apps/routerconsole/resources/docs/readme_nl.html
diff --git a/installer/resources/readme/readme_pl.html b/apps/routerconsole/resources/docs/readme_pl.html
similarity index 100%
rename from installer/resources/readme/readme_pl.html
rename to apps/routerconsole/resources/docs/readme_pl.html
diff --git a/installer/resources/readme/readme_pt.html b/apps/routerconsole/resources/docs/readme_pt.html
similarity index 100%
rename from installer/resources/readme/readme_pt.html
rename to apps/routerconsole/resources/docs/readme_pt.html
diff --git a/installer/resources/readme/readme_ro.html b/apps/routerconsole/resources/docs/readme_ro.html
similarity index 100%
rename from installer/resources/readme/readme_ro.html
rename to apps/routerconsole/resources/docs/readme_ro.html
diff --git a/installer/resources/readme/readme_ru.html b/apps/routerconsole/resources/docs/readme_ru.html
similarity index 100%
rename from installer/resources/readme/readme_ru.html
rename to apps/routerconsole/resources/docs/readme_ru.html
diff --git a/installer/resources/readme/readme_sv.html b/apps/routerconsole/resources/docs/readme_sv.html
similarity index 100%
rename from installer/resources/readme/readme_sv.html
rename to apps/routerconsole/resources/docs/readme_sv.html
diff --git a/installer/resources/readme/readme_tr.html b/apps/routerconsole/resources/docs/readme_tr.html
similarity index 100%
rename from installer/resources/readme/readme_tr.html
rename to apps/routerconsole/resources/docs/readme_tr.html
diff --git a/installer/resources/readme/readme_zh.html b/apps/routerconsole/resources/docs/readme_zh.html
similarity index 100%
rename from installer/resources/readme/readme_zh.html
rename to apps/routerconsole/resources/docs/readme_zh.html
diff --git a/build.xml b/build.xml
index 86d19bfb1448bf96186717f0db539439edc6acb7..8ba43b50a9b6f69e5d49869675e93ab1a93ce553 100644
--- a/build.xml
+++ b/build.xml
@@ -1650,19 +1650,16 @@
         <delete dir="./pkg-mavencentral" />
     </target>
 
-    <!-- readme and proxy error page files, initialNews.xml files, GeoIP files, and flag icons -->
+    <!-- initialNews.xml files, GeoIP files, and flag icons -->
     <target name="prepConsoleDocs" depends="prepConsoleDocUpdates, prepgeoupdate" >
         <copy todir="pkg-temp/docs/initialNews/">
           <fileset dir="installer/resources/initialNews/" />
         </copy>
-        <!-- ensure the proxy files have the correct line endings -->
-        <fixcrlf srcdir="pkg-temp/docs" includes="*.ht" encoding="utf8" eol="crlf" />
     </target>
 
-    <!-- readme files -->
+    <!-- flag icons -->
     <target name="prepConsoleDocUpdates">
         <copy todir="pkg-temp/docs/" >
-          <fileset dir="installer/resources/readme/" includes="readme*.html" />
           <!--
                As of 0.9.36:
                All new and changed flags must go in the flags16x11/ dir,
@@ -3094,7 +3091,6 @@
 			<!-- config.txt is in installer/resources/portable -->
 		<mkdir dir="pkg-temp/docs" />
 			<copy file="installer/resources/initialNews/initialNews.xml" tofile="pkg-temp/docs/news.xml" overwrite="true" />
-			<copy file="installer/resources/readme/readme.html" tofile="pkg-temp/docs/readme.html" />
 			<copy file="installer/resources/startconsole.html" todir="pkg-temp/docs/" />
 			<copy file="installer/resources/start.ico" todir="pkg-temp/docs/" />
 			<copy file="installer/resources/console.ico" todir="pkg-temp/docs/" />
diff --git a/tests/scripts/checkutf8.sh b/tests/scripts/checkutf8.sh
index ccec33502c117cef6569f4b0968e49a332716001..47754c2422b5aee081a3aa1e14f7479151096fa0 100755
--- a/tests/scripts/checkutf8.sh
+++ b/tests/scripts/checkutf8.sh
@@ -16,8 +16,10 @@ DIRS="\
   apps/routerconsole/locale \
   apps/routerconsole/locale-news \
   apps/routerconsole/locale-countries \
+  apps/routerconsole/resources/docs \
   apps/i2ptunnel/locale \
   apps/i2ptunnel/locale-proxy \
+  apps/i2ptunnel/resources/proxy \
   apps/i2psnark/locale \
   apps/ministreaming/locale \
   apps/susidns/locale \
@@ -26,8 +28,6 @@ DIRS="\
   debian/po \
   installer/resources/eepsite/docroot/help \
   installer/resources/initialNews \
-  installer/resources/proxy \
-  installer/resources/readme \
   apps/routerconsole/jsp \
   apps/i2ptunnel/jsp \
   apps/susidns/src/jsp"
diff --git a/tests/scripts/checkxml.sh b/tests/scripts/checkxml.sh
index b04e72780df099041067d3be8ba61a63ae65a56d..a276b8142f032ae76f9caaf185b506f9b8c33d90 100755
--- a/tests/scripts/checkxml.sh
+++ b/tests/scripts/checkxml.sh
@@ -63,6 +63,7 @@ HTMLFILES="\
 ./apps/BOB/src/net/i2p/BOB/package.html \
 ./apps/desktopgui/src/net/i2p/desktopgui/package.html \
 ./apps/ministreaming/java/src/net/i2p/client/streaming/package.html \
+./apps/routerconsole/resources/docs/readme*.html \
 ./apps/susimail/src/index.html \
 ./core/java/src/net/i2p/client/datagram/package.html \
 ./core/java/src/net/i2p/client/naming/package.html \
@@ -78,7 +79,6 @@ HTMLFILES="\
 ./installer/resources/eepsite/docroot/help/index*.html \
 ./installer/resources/eepsite/docroot/help/pagetemplate.html \
 ./installer/resources/eepsite/docroot/index.html \
-./installer/resources/readme/readme*.html \
 ./installer/resources/small/toolbar.html \
 ./installer/resources/startconsole.html \
 ./router/java/src/net/i2p/data/i2np/package.html \