diff --git a/i2p2www/downloads.py b/i2p2www/downloads.py
index 07698cbaa541877bc73f49343546321e8a479248..74e285b0ee15465f341d45817b59a2914dceaf78 100644
--- a/i2p2www/downloads.py
+++ b/i2p2www/downloads.py
@@ -8,6 +8,7 @@ from random import randint
 from i2p2www import CURRENT_I2P_VERSION, MIRRORS_FILE
 
 DEFAULT_MIRROR = {
+    'net': 'clearnet',
     'protocol': 'https',
     'domain':   'download.i2p2.de',
     'org':      'sigterm.no',
@@ -15,6 +16,7 @@ DEFAULT_MIRROR = {
 }
 
 DEFAULT_I2P_MIRROR = {
+    'net': 'i2p',
     'protocol': 'http',
     'domain':   'whnxvjwjhzsske5yevyokhskllvtisv5ueokw6yvh6t7zqrpra2q.b32.i2p',
     'org':      'sigterm.no',
@@ -39,13 +41,16 @@ def read_mirrors():
             continue
         if 'protocol' not in obj or 'domain' not in obj or 'path' not in obj:
             continue
+        net=obj['net']
         protocol=obj['protocol']
         domain=obj['domain']
         path=obj['path']
         obj['url']='%s://%s%s' % (protocol, domain, path)
-        if protocol not in ret:
-            ret[protocol]={}
-        ret[protocol][domain]=obj
+        if net not in ret:
+            ret[net]={}
+        if protocol not in ret[net]:
+            ret[net][protocol]={}
+        ret[net][protocol][domain]=obj
     return ret
 
 # List of downloads
@@ -65,29 +70,40 @@ def downloads_debian():
 def downloads_select(version, file):
     mirrors=read_mirrors()
     obj=[]
-    for protocol in mirrors.keys():
+    for net in mirrors.keys():
         a={}
-        a['name']=protocol
-        a['mirrors']=mirrors[protocol]
+        a['key']=net
+        a['name']=net
+        a['protocols']=[]
+        for protocol in mirrors[net].keys():
+            b={}
+            b['key']=protocol
+            b['name']=protocol
+            b['domains']=mirrors[net][protocol]
+            a['protocols'].append(b)
         obj.append(a)
     return render_template('downloads/select.html', mirrors=obj, version=version, file=file)
 
-def downloads_redirect(version, protocol, domain, file):
+def downloads_redirect(version, net, protocol, domain, file):
     mirrors=read_mirrors()
-    if not protocol in mirrors:
+    if not net in mirrors:
         abort(404)
-    mirrors=mirrors[protocol]
+    mirrors=mirrors[net]
     data = {
         'version': version,
         'file': file,
         }
-    if domain:
-        if not domain in mirrors:
-            abort(404)
-        return render_template('downloads/redirect.html',
-                               version=version, protocol=protocol, domain=domain, file=file,
-                               url=mirrors[domain]['url'] % data)
-    randomain = mirrors.keys()[randint(0, len(mirrors) - 1)]
+
+    if not protocol:
+        protocol = mirrors.leys()[randint(0, len(mirrors) - 1)]
+    if not protocol in mirrors:
+        abort(404)
+    mirrors=mirrors[protocol]
+
+    if not domain:
+        domain = mirrors.keys()[randint(0, len(mirrors) - 1)]
+    if not domain in mirrors:
+        abort(404)
     return render_template('downloads/redirect.html',
                            version=version, protocol=protocol, domain=domain, file=file,
-                           url=mirrors[randomain]['url'] % data)
+                           url=mirrors[domain]['url'] % data)
diff --git a/i2p2www/pages/downloads/list.html b/i2p2www/pages/downloads/list.html
index 2bc7c17b43f504f2e5c876c1b018f1eed7b72d0e..4cc86e99f48c6ceaee0746e3f003dd4ff3aa3afc 100644
--- a/i2p2www/pages/downloads/list.html
+++ b/i2p2www/pages/downloads/list.html
@@ -49,12 +49,12 @@ or type <tt>java -version</tt> at your command prompt.
   </div>
   <div class="details">
     <div class="file">
-      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s_windows.exe')) }}">
+      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s_windows.exe')) }}">
         <span class="name">i2pinstall_{{ ver() }}_windows.exe</span><br />
         <span class="mirror">{{ _('Mirror:') }} <img src="{{ url_for('static', filename='images/flags/'+def_mirror.country+'.png') }}" /> {{ def_mirror.org }}</span>
       </a>
       <a class="mirrors" href="{{ get_url('downloads_select', version=ver(), file=ver('i2pinstall_%s_windows.exe')) }}">{{ _('select alternate mirror') }}</a><!--
-   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s_windows.exe.sig')) }}">sig</a>
+   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s_windows.exe.sig')) }}">sig</a>
     </div>
     <div class="hash">
       <code>{{ i2pinstall_windows_hash }}</code>
@@ -71,12 +71,12 @@ or type <tt>java -version</tt> at your command prompt.
   </div>
   <div class="details">
     <div class="file">
-      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar')) }}">
+      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar')) }}">
         <span class="name">i2pinstall_{{ ver() }}.jar</span><br />
         <span class="mirror">{{ _('Mirror:') }} <img src="{{ url_for('static', filename='images/flags/'+def_mirror.country+'.png') }}" /> {{ def_mirror.org }}</span>
       </a>
       <a class="mirrors" href="{{ get_url('downloads_select', version=ver(), file=ver('i2pinstall_%s.jar')) }}">{{ _('select alternate mirror') }}</a><!--
-   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar.sig')) }}">sig</a>
+   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar.sig')) }}">sig</a>
     </div>
     <div class="hash">
       <code>{{ i2pinstall_jar_hash }}</code>
@@ -103,12 +103,12 @@ or type <tt>java -version</tt> at your command prompt.
   </div>
   <div class="details">
     <div class="file">
-      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar')) }}">
+      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar')) }}">
         <span class="name">i2pinstall_{{ ver() }}.jar</span><br />
         <span class="mirror">{{ _('Mirror:') }} <img src="{{ url_for('static', filename='images/flags/'+def_mirror.country+'.png') }}" /> {{ def_mirror.org }}</span>
       </a>
       <a class="mirrors" href="{{ get_url('downloads_select', version=ver(), file=ver('i2pinstall_%s.jar')) }}">{{ _('select alternate mirror') }}</a><!--
-   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar.sig')) }}">sig</a>
+   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pinstall_%s.jar.sig')) }}">sig</a>
     </div>
     <div class="hash">
       <code>{{ i2pinstall_jar_hash }}</code>
@@ -195,12 +195,12 @@ or type <tt>java -version</tt> at your command prompt.
   </div>
   <div class="details">
     <div class="file">
-      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2psource_%s.tar.bz2')) }}">
+      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2psource_%s.tar.bz2')) }}">
         <span class="name">i2psource_{{ ver() }}.tar.bz2</span><br />
         <span class="mirror">{{ _('Mirror:') }} <img src="{{ url_for('static', filename='images/flags/'+def_mirror.country+'.png') }}" /> {{ def_mirror.org }}</span>
       </a>
       <a class="mirrors" href="{{ get_url('downloads_select', version=ver(), file=ver('i2psource_%s.tar.bz2')) }}">{{ _('select alternate mirror') }}</a><!--
-   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2psource_%s.tar.bz2.sig')) }}">sig</a>
+   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2psource_%s.tar.bz2.sig')) }}">sig</a>
     </div>
     <div class="hash">
       <code>{{ i2psource_hash }}</code>
@@ -300,12 +300,12 @@ receive the release.
   </div>
   <div class="details">
     <div class="file">
-      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pupdate_%s.zip')) }}">
+      <a class="default" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pupdate_%s.zip')) }}">
         <span class="name">i2pupdate_{{ ver() }}.zip</span><br />
         <span class="mirror">{{ _('Mirror:') }} <img src="{{ url_for('static', filename='images/flags/'+def_mirror.country+'.png') }}" /> {{ def_mirror.org }}</span>
       </a>
       <a class="mirrors" href="{{ get_url('downloads_select', version=ver(), file=ver('i2pupdate_%s.zip')) }}">{{ _('select alternate mirror') }}</a><!--
-   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pupdate_%s.zip.sig')) }}">sig</a>
+   --><a class="sig" href="{{ url_for('downloads_redirect', version=ver(), net=def_mirror.net, protocol=def_mirror.protocol, domain=def_mirror.domain, file=ver('i2pupdate_%s.zip.sig')) }}">sig</a>
     </div>
     <div class="hash">
       <code>{{ i2pupdate_hash }}</code>
diff --git a/i2p2www/pages/downloads/mirrors b/i2p2www/pages/downloads/mirrors
index 64f672941a56bae92671475b309cb3452b704da6..d34a68480eb32975087aee2338a07ee0824e9af8 100644
--- a/i2p2www/pages/downloads/mirrors
+++ b/i2p2www/pages/downloads/mirrors
@@ -1,9 +1,9 @@
-{"protocol": "https", "domain": "launchpad.net", "path": "/i2p/trunk/%(version)s/+download/%(file)s", "org": "Launchpad", "org_url": "https://launchpad.net", "country": "us"}
-{"protocol": "https", "domain": "download.i2p2.de", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "no"}
-{"protocol": "http", "domain": "whnxvjwjhzsske5yevyokhskllvtisv5ueokw6yvh6t7zqrpra2q.b32.i2p", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "i2p"}
-{"protocol": "http", "domain": "download.i2p2.de", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "no"}
-{"protocol": "http", "domain": "download.i2p2.no", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "no"}
-{"protocol": "https", "domain": "dl.dropboxusercontent.com", "path": "/u/18621288/I2P/%(version)s/%(file)s", "org": "Dropbox", "country": "us"}
-{"protocol": "https", "domain": "googledrive.com", "path": "/host/0B4jHEq5G7_EPWV9UeERwdGplZXc/%(version)s/%(file)s", "org": "Google Drive", "country": "us"}
-#{"protocol": "http", "domain": "download.geti2p.com", "path": "/%(version)s/%(file)s", "org": "aargh", "country": "us"}
-#{"protocol": "http", "domain": "download2.geti2p.com", "path": "/%(version)s/%(file)s", "org": "aargh", "country": "us"}
+{"net": "clearnet", "protocol": "https", "domain": "launchpad.net", "path": "/i2p/trunk/%(version)s/+download/%(file)s", "org": "Launchpad", "org_url": "https://launchpad.net", "country": "us"}
+{"net": "clearnet", "protocol": "https", "domain": "download.i2p2.de", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "no"}
+{"net": "i2p", "protocol": "http", "domain": "whnxvjwjhzsske5yevyokhskllvtisv5ueokw6yvh6t7zqrpra2q.b32.i2p", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no"}
+{"net": "clearnet", "protocol": "http", "domain": "download.i2p2.de", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "no"}
+{"net": "clearnet", "protocol": "http", "domain": "download.i2p2.no", "path": "/releases/%(version)s/%(file)s", "org": "sigterm.no", "country": "no"}
+{"net": "clearnet", "protocol": "https", "domain": "dl.dropboxusercontent.com", "path": "/u/18621288/I2P/%(version)s/%(file)s", "org": "Dropbox", "country": "us"}
+{"net": "clearnet", "protocol": "https", "domain": "googledrive.com", "path": "/host/0B4jHEq5G7_EPWV9UeERwdGplZXc/%(version)s/%(file)s", "org": "Google Drive", "country": "us"}
+#{"net": "clearnet", "protocol": "http", "domain": "download.geti2p.com", "path": "/%(version)s/%(file)s", "org": "aargh", "country": "us"}
+#{"net": "clearnet", "protocol": "http", "domain": "download2.geti2p.com", "path": "/%(version)s/%(file)s", "org": "aargh", "country": "us"}
diff --git a/i2p2www/pages/downloads/select.html b/i2p2www/pages/downloads/select.html
index 9027b12cd29d3faaa46813a7b09ecc18d34522f9..4eb0f7a0a58fd87e9c76c28f8bbc25cdc49d46fb 100644
--- a/i2p2www/pages/downloads/select.html
+++ b/i2p2www/pages/downloads/select.html
@@ -3,13 +3,18 @@
 {% block content %}
 <h1>{{ _('Mirror selection') }}</h1>
 <h2>{{ _('File:') }} /{{ file }}</h2>
-{% for protocol in mirrors -%}
-<div class="protocol">
-  <h3>{{ protocol.name | upper }}</h3>
+{% for net in mirrors -%}
+<div class="net">
+  <h3>{{ net.name | upper }}</h3>
   <ul>
-    <li><a href="{{ url_for('downloads_redirect', version=version, protocol=protocol.name, file=file) }}">{{ _('Any mirror') }}</a></li>
-    {% for domain, mirror in protocol.mirrors.items() -%}
-    <li><img src="{{ url_for('static', filename='images/flags/'+mirror.country+'.png') }}" />&nbsp;{% if mirror.org_url %}<a href="{{ mirror.org_url }}">{% endif %}{{ mirror.org }}{% if mirror.org_url %}</a>{% endif %} <a href="{{ url_for('downloads_redirect', version=version, protocol=protocol.name, domain=domain, file=file) }}">[{{ _('Download') }}]</a> <a href="{{ url_for('downloads_redirect', version=version, protocol=protocol.name, domain=domain, file=file+'.sig') }}">[sig]</a></li>
+    <li><a href="{{ url_for('downloads_redirect', version=version, net=net.key, file=file) }}">{{ _('Any mirror') }}</a></li>
+    {% for protocol in net.protocols -%}
+    <li><a href="{{ url_for('downloads_redirect', version=version, net=net.key, protocol=protocol.key, file=file) }}">{{ protocol.key | upper }}</a>
+    <ul>
+      {% for domain, mirror in protocol.domains.items() -%}
+      <li>{% if mirror.country %}<img src="{{ url_for('static', filename='images/flags/'+mirror.country+'.png') }}" />&nbsp;{% endif %}{% if mirror.org_url %}<a href="{{ mirror.org_url }}">{% endif %}{{ mirror.org }}{% if mirror.org_url %}</a>{% endif %} <a href="{{ url_for('downloads_redirect', version=version, net=net.key, protocol=protocol.key, domain=domain, file=file) }}">[{{ _('Download') }}]</a> <a href="{{ url_for('downloads_redirect', version=version, net=net.key, protocol=protocol.key, domain=domain, file=file+'.sig') }}">[sig]</a></li>
+      {%- endfor %}
+    </ul></li>
     {%- endfor %}
   </ul>
 </div>
diff --git a/i2p2www/pages/global/macros b/i2p2www/pages/global/macros
index 3615014b211084f6cd2d96ab159087fafe1a76af..4c470c8850442f8b4e21d61c106939a5f11ae714 100644
--- a/i2p2www/pages/global/macros
+++ b/i2p2www/pages/global/macros
@@ -9,7 +9,7 @@
 {%- elif request.endpoint == 'meetings_show' -%}{{ url_for('meetings_show', lang=lang, id=id) }}
 {%- elif request.endpoint == 'downloads_debian' -%}{{ url_for('downloads_debian', lang=lang) }}
 {%- elif request.endpoint == 'downloads_select' -%}{{ url_for('downloads_select', lang=lang, version=version, file=file) }}
-{%- elif request.endpoint == 'downloads_redirect' -%}{{ url_for('downloads_redirect', lang=lang, version=version, protocol=protocol, domain=domain, file=file) }}
+{%- elif request.endpoint == 'downloads_redirect' -%}{{ url_for('downloads_redirect', lang=lang, version=version, net=net, protocol=protocol, domain=domain, file=file) }}
 {%- elif request.endpoint == 'static' -%}{{ url_for('static', filename=filename) }}
 {%- elif request.endpoint -%}{{ url_for(request.endpoint, lang=lang) }}
 {%- else -%}{{ url_for('site_show', lang=lang) }}
diff --git a/i2p2www/urls.py b/i2p2www/urls.py
index a46a2f6c3e91e0d16c3b3bd4e891b14153bff3e7..33fa42184117cd16f5aeaf780de41babb3a1924d 100644
--- a/i2p2www/urls.py
+++ b/i2p2www/urls.py
@@ -71,8 +71,9 @@ url('/<lang:lang>/feed/meetings/atom', 'meetings.views.meetings_atom')
 url('/<lang:lang>/download', 'downloads.downloads_list')
 url('/<lang:lang>/download/debian', 'downloads.downloads_debian')
 url('/<lang:lang>/download/<string:version>/<path:file>/mirrors', 'downloads.downloads_select')
-url('/<lang:lang>/download/<string:version>/<string:protocol>/any/<path:file>/download', 'downloads.downloads_redirect', defaults={'domain': None})
-url('/<lang:lang>/download/<string:version>/<string:protocol>/<string:domain>/<path:file>/download', 'downloads.downloads_redirect')
+url('/<lang:lang>/download/<string:version>/<string:net>/any/<path:file>/download', 'downloads.downloads_redirect', defaults={'protocol': None, 'domain': None})
+url('/<lang:lang>/download/<string:version>/<string:net>/<string:protocol>/any/<path:file>/download', 'downloads.downloads_redirect', defaults={'domain': None})
+url('/<lang:lang>/download/<string:version>/<string:net>/<string:protocol>/<string:domain>/<path:file>/download', 'downloads.downloads_redirect')
 
 url('/meeting<int:id>', 'legacy.legacy_meeting')
 url('/meeting<int:id>.html', 'legacy.legacy_meeting')