diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..68f46d204c62400dfb8d927643e878491ca55e6a
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHandler.java
@@ -0,0 +1,80 @@
+package net.i2p.router.web;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Hash;
+import net.i2p.data.Base64;
+import net.i2p.router.Router;
+import net.i2p.router.peermanager.PeerProfile;
+import net.i2p.util.Log;
+
+/**
+ *
+ */
+public class ConfigPeerHandler extends FormHandler {
+    private String _peer;
+    private String _speed;
+    private String _capacity;
+    
+    protected void processForm() {
+        if ("Save Configuration".equals(_action)) {
+            _context.router().saveConfig();
+            addFormNotice("Settings saved - not really!!!!!");
+        } else if (_action.startsWith("Shitlist")) {
+            Hash h = getHash();
+            if (h != null) {
+                _context.shitlist().shitlistRouterForever(h, "Manually shitlisted via <a href=\"configpeer.jsp\">configpeer.jsp</a>");
+                addFormNotice("Peer " + _peer + " shitlisted forever");
+                return;
+            }
+            addFormError("Invalid peer");
+        } else if (_action.startsWith("Unshitlist")) {
+            Hash h = getHash();
+            if (h != null) {
+                if (_context.shitlist().isShitlisted(h)) {
+                    _context.shitlist().unshitlistRouter(h);
+                    addFormNotice("Peer " + _peer + " unshitlisted");
+                } else
+                    addFormNotice("Peer " + _peer + " is not currently shitlisted");
+                return;
+            }
+            addFormError("Invalid peer");
+        } else if (_action.startsWith("Adjust")) {
+            Hash h = getHash();
+            if (h != null) {
+                PeerProfile prof = _context.profileOrganizer().getProfile(h);
+                if (prof != null) {
+                    try {
+                        prof.setSpeedBonus(Long.parseLong(_speed));
+                    } catch (NumberFormatException nfe) {
+                        addFormError("Bad speed value");
+                    }
+                    try {
+                        prof.setCapacityBonus(Long.parseLong(_capacity));
+                    } catch (NumberFormatException nfe) {
+                        addFormError("Bad capacity value");
+                    }
+                    addFormNotice("Bonuses adjusted for " + _peer);
+                } else
+                    addFormError("No profile exists for " + _peer);
+                return;
+            }
+            addFormError("Invalid peer");
+        } else if (_action.startsWith("Check")) {
+            addFormError("Unsupported");
+        }
+    }
+    
+    private Hash getHash() {
+        if (_peer != null && _peer.length() == 44) {
+            byte[] b = Base64.decode(_peer);
+            if (b != null)
+                return new Hash(b);
+        }
+        return null;
+    }
+
+    public void setPeer(String peer) { _peer = peer; }
+    public void setSpeed(String bonus) { _speed = bonus; }
+    public void setCapacity(String bonus) { _capacity = bonus; }
+}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..647aaa3df7827218e710fe6e2e8e93634d9bb04d
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java
@@ -0,0 +1,24 @@
+package net.i2p.router.web;
+
+import net.i2p.data.DataHelper;
+import net.i2p.router.RouterContext;
+
+public class ConfigPeerHelper {
+    private RouterContext _context;
+    /**
+     * Configure this bean to query a particular router context
+     *
+     * @param contextId begging few characters of the routerHash, or null to pick
+     *                  the first one we come across.
+     */
+    public void setContextId(String contextId) {
+        try {
+            _context = ContextHelper.getContext(contextId);
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+    }
+
+    public ConfigPeerHelper() {}
+    
+}
diff --git a/apps/routerconsole/jsp/confignav.jsp b/apps/routerconsole/jsp/confignav.jsp
index 7ab47f76be1956ccd754f6c1281e9fe5c37eefc7..b6a5ce6df3b5b317799bfa69dc7ef542a0f97bd9 100644
--- a/apps/routerconsole/jsp/confignav.jsp
+++ b/apps/routerconsole/jsp/confignav.jsp
@@ -8,6 +8,8 @@
  %>Tunnels | <% } else { %><a href="configtunnels.jsp">Tunnels</a> | <% }
  if (request.getRequestURI().indexOf("configclients.jsp") != -1) {
  %>Clients | <% } else { %><a href="configclients.jsp">Clients</a> | <% }
+ if (request.getRequestURI().indexOf("configpeer.jsp") != -1) {
+ %>Peers | <% } else { %><a href="configpeer.jsp">Peers</a> | <% }
  if (request.getRequestURI().indexOf("configlogging.jsp") != -1) {
  %>Logging | <% } else { %><a href="configlogging.jsp">Logging</a> | <% }
  if (request.getRequestURI().indexOf("configstats.jsp") != -1) {
diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..16e624e5f2e10c360da940756e4d0b8eb3ced0bf
--- /dev/null
+++ b/apps/routerconsole/jsp/configpeer.jsp
@@ -0,0 +1,83 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html><head>
+<title>I2P Router Console - config peers</title>
+<link rel="stylesheet" href="default.css" type="text/css" />
+</head><body>
+
+<%@include file="nav.jsp" %>
+<%@include file="summary.jsp" %>
+
+<div class="main" id="main">
+ <%@include file="confignav.jsp" %>
+  
+ <jsp:useBean class="net.i2p.router.web.ConfigPeerHandler" id="formhandler" scope="request" />
+ <jsp:setProperty name="formhandler" property="*" />
+ <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+ <font color="red"><jsp:getProperty name="formhandler" property="errors" /></font>
+ <i><jsp:getProperty name="formhandler" property="notices" /></i>
+ 
+
+
+ <jsp:useBean class="net.i2p.router.web.ConfigPeerHelper" id="peerhelper" scope="request" />
+ <jsp:setProperty name="peerhelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+
+ <% String peer = "";
+    if (request.getParameter("peer") != null)     
+        peer = request.getParameter("peer");
+ %>
+ 
+ <form action="configpeer.jsp" method="POST">
+ <% String prev = System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce");
+    if (prev != null) System.setProperty("net.i2p.router.web.ConfigPeerHandler.noncePrev", prev);
+    System.setProperty("net.i2p.router.web.ConfigPeerHandler.nonce", new java.util.Random().nextLong()+""); %>
+ <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce")%>" />
+ <hr />
+ <p>
+ <a name="sh"> </a>
+ <a name="unsh"> </a>
+ <a name="bonus"> </a>
+ <h2>Manual Peer Controls</h2>
+ Router Hash:
+ <input type="text" size="55" name="peer" value="<%=peer%>" />
+ <h3>Manually Shitlist / Unshitlist a Router</h3>
+ Shitlisting will prevent the participation of this peer in tunnels you create.
+ <p>
+ <input type="submit" name="action" value="Shitlist peer until restart" />
+ <input type="submit" name="action" value="Unshitlist peer" />
+ <% if (! "".equals(peer)) { %>
+    <font color="blue">&lt;---- click to verify action</font>
+ <% } %>
+ </p>
+
+ <h3>Adjust Profile Bonuses</h3>
+ Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers.
+ Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels.
+ Current bonuses are displayed on the <a href="profiles.jsp">profiles page</a>.
+ <p>
+ <% long speed = 0; long capacity = 0;
+    if (! "".equals(peer)) {
+        // get existing bonus values?
+    }
+ %>
+ Speed:
+ <input type="text" size="8" name="speed" value="<%=speed%>" />
+ Capacity:
+ <input type="text" size="8" name="capacity" value="<%=capacity%>" />
+ <input type="submit" name="action" value="Adjust peer bonuses" />
+ </p>
+ </form>
+
+ <hr />
+ <a name="shitlist"> </a>
+ <jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />
+ <jsp:setProperty name="profilesHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+ <jsp:getProperty name="profilesHelper" property="shitlistSummary" />
+
+
+</div>
+
+</body>
+</html>
diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java
index 09a3562fd8bff4c20f4046c78f87523e324cf1bb..1a47a94be8a59306945deb488a9da59f50786751 100644
--- a/router/java/src/net/i2p/router/Shitlist.java
+++ b/router/java/src/net/i2p/router/Shitlist.java
@@ -289,8 +289,7 @@ public class Shitlist {
                 buf.append("<br />\n");
                 buf.append(entry.cause);
             }
-            // future
-            // buf.append(" (<a href=\"configblock.jsp?peer=").append(key.toBase64()).append("#unsh\">unshitlist now</a>)");
+            buf.append(" (<a href=\"configpeer.jsp?peer=").append(key.toBase64()).append("#unsh\">unshitlist now</a>)");
             buf.append("</li>\n");
         }
         buf.append("</ul>\n");
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
index 38590570d3d1baa828921d8193aa985cb4ba9613..eb29b374ea2c741e12c782d6c863b831403f1066 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
@@ -130,11 +130,25 @@ class ProfileOrganizerRenderer {
             }
             
             buf.append("<td align=\"right\">").append(num(prof.getSpeedValue()));
-            //buf.append('/').append(num(prof.getOldSpeedValue()));
-            buf.append("</td>");
-            buf.append("<td align=\"right\">").append(num(prof.getCapacityValue())).append("</td>");
-            buf.append("<td align=\"right\">").append(num(prof.getIntegrationValue())).append("</td>");
-            buf.append("<td>");
+            long bonus = prof.getSpeedBonus();
+            if (bonus != 0) {
+                if (bonus > 0)
+                    buf.append(" (+");
+                else
+                    buf.append(" (");
+                buf.append(bonus).append(')');
+            }
+            buf.append("</td><td align=\"right\">").append(num(prof.getCapacityValue()));
+            bonus = prof.getCapacityBonus();
+            if (bonus != 0) {
+                if (bonus > 0)
+                    buf.append(" (+");
+                else
+                    buf.append(" (");
+                buf.append(bonus).append(')');
+            }
+            buf.append("</td><td align=\"right\">").append(num(prof.getIntegrationValue()));
+            buf.append("</td><td>");
             if (_context.shitlist().isShitlisted(peer)) buf.append("Shitlist");
             if (prof.getIsFailing()) buf.append(" Failing");
             if (_context.commSystem().wasUnreachable(peer)) buf.append(" Unreachable");
@@ -150,7 +164,8 @@ class ProfileOrganizerRenderer {
             //buf.append("<td><a href=\"/profile/").append(prof.getPeer().toBase64().substring(0, 32)).append("\">profile.txt</a> ");
             //buf.append("    <a href=\"#").append(prof.getPeer().toBase64().substring(0, 32)).append("\">netDb</a></td>");
             buf.append("<td nowrap><a href=\"netdb.jsp#").append(peer.toBase64().substring(0,6)).append("\">netDb</a>");
-            buf.append("/<a href=\"dumpprofile.jsp?peer=").append(peer.toBase64().substring(0,6)).append("\">profile</a></td>\n");
+            buf.append("/<a href=\"dumpprofile.jsp?peer=").append(peer.toBase64().substring(0,6)).append("\">profile</a>");
+            buf.append("/<a href=\"configpeer.jsp?peer=").append(peer.toBase64()).append("\">+-</a></td>\n");
             buf.append("</tr>");
         }
         buf.append("</table>");