diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index 36de31ba405b90b49207154a85dc4d1affb597a1..d1038534f90aa3942b0f5337f6a86232eb657b1a 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -76,6 +76,7 @@ public class I2PSnarkUtil {
     public static final int MAX_CONNECTIONS = 16; // per torrent
     public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
     public static final boolean DEFAULT_USE_DHT = true;
+    public static final String EEPGET_USER_AGENT = "I2PSnark";
 
     public I2PSnarkUtil(I2PAppContext ctx) {
         this(ctx, "i2psnark");
@@ -393,6 +394,7 @@ public class I2PSnarkUtil {
             }
         }
         EepGet get = new I2PSocketEepGet(_context, _manager, retries, out.getAbsolutePath(), fetchURL);
+        get.addHeader("User-Agent", EEPGET_USER_AGENT);
         if (get.fetch(timeout)) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Fetch successful [" + url + "]: size=" + out.length());
@@ -434,6 +436,7 @@ public class I2PSnarkUtil {
         }
         ByteArrayOutputStream out = new ByteArrayOutputStream(initialSize);
         EepGet get = new I2PSocketEepGet(_context, _manager, retries, -1, maxSize, null, out, fetchURL);
+        get.addHeader("User-Agent", EEPGET_USER_AGENT);
         if (get.fetch(timeout)) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Fetch successful [" + url + "]: size=" + out.size());
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java b/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java
index cf2a55c6f4e4f525eedad4b2f8ae3da8482e80fc..270bba2ce5b780369ceb418a32fcd437cf464d4e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java
@@ -18,6 +18,7 @@ import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 import net.i2p.util.SecureFile;
 
+import org.klomp.snark.I2PSnarkUtil;
 import org.klomp.snark.MetaInfo;
 import org.klomp.snark.Snark;
 import org.klomp.snark.SnarkManager;
@@ -130,6 +131,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl
             return null;
         _eepGet = new I2PSocketEepGet(_ctx, manager, RETRIES, out.getAbsolutePath(), _url);
         _eepGet.addStatusListener(this);
+        _eepGet.addHeader("User-Agent", I2PSnarkUtil.EEPGET_USER_AGENT);
         if (_eepGet.fetch()) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Fetch successful [" + _url + "]: size=" + out.length());
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java
index 5b29d9d20b25617a26d3935225d75379e0421eb5..99c81afdd6a48fca9cf65673a5b672ccd82ae48f 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java
@@ -6,6 +6,7 @@ import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.UnknownHostException;
 import java.net.URL;
+import java.util.Locale;
 import java.util.Properties;
 
 import net.i2p.I2PAppContext;
@@ -193,13 +194,17 @@ public class I2PSocketEepGet extends EepGet {
         buf.append("Accept-Encoding: \r\n" +
                    "Cache-control: no-cache\r\n" +
                    "Pragma: no-cache\r\n" +
-                   "User-Agent: " + USER_AGENT + "\r\n" +
                    "Connection: close\r\n");
+        boolean uaOverridden = false;
         if (_extraHeaders != null) {
             for (String hdr : _extraHeaders) {
+                if (hdr.toLowerCase(Locale.US).startsWith("user-agent: "))
+                    uaOverridden = true;
                 buf.append(hdr).append("\r\n");
             }
         }
+        if(!uaOverridden)
+            buf.append("User-Agent: " + USER_AGENT + "\r\n");
         buf.append("\r\n");
         return buf.toString();
     }
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index 92fef09968da7018f5cc8c093a353765d97e2097..97d84f4f79b3bd363337021ed4bd991bb59e61cc 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -1156,14 +1156,18 @@ public class EepGet {
             // we don't want to transparently gunzip it and save it as a .gz file.
             (!path.endsWith(".gz")) && (!path.endsWith(".tgz")))
             buf.append("gzip");
-        buf.append("\r\nUser-Agent: " + USER_AGENT + "\r\n" +
-                   "Connection: close\r\n");
+        buf.append("\r\n");
+        boolean uaOverridden = false;
         if (_extraHeaders != null) {
             for (String hdr : _extraHeaders) {
+                if (hdr.toLowerCase(Locale.US).startsWith("user-agent: "))
+                    uaOverridden = true;
                 buf.append(hdr).append("\r\n");
             }
         }
-        buf.append("\r\n");
+        if(!uaOverridden)
+            buf.append("User-Agent: " + USER_AGENT + "\r\n");
+        buf.append("Connection: close\r\n\r\n");
         if (post)
             buf.append(_postData);
         if (_log.shouldLog(Log.DEBUG))
@@ -1237,6 +1241,9 @@ public class EepGet {
     /**
      *  Add an extra header to the request.
      *  Must be called before fetch().
+     *  Not supported by EepHead.
+     *  As of 0.9.10, If name is User-Agent, this will replace the default User-Agent header.
+     *  Note that headers may be subsequently modified or removed in the I2PTunnel HTTP Client proxy.
      *
      *  @since 0.8.8
      */
@@ -1250,6 +1257,7 @@ public class EepGet {
      *  Add basic authorization header for the proxy.
      *  Only added if the request is going through a proxy.
      *  Must be called before fetch().
+     *  Not supported by EepHead.
      *
      *  @since 0.8.9
      */
diff --git a/core/java/src/net/i2p/util/PartialEepGet.java b/core/java/src/net/i2p/util/PartialEepGet.java
index cc93fbb4805e4a8feb164f9157dee371933aefd2..4f3cf95519676799bbfdfe177ac337352fc3482a 100644
--- a/core/java/src/net/i2p/util/PartialEepGet.java
+++ b/core/java/src/net/i2p/util/PartialEepGet.java
@@ -5,6 +5,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Locale;
 
 import net.i2p.I2PAppContext;
 
@@ -143,16 +144,20 @@ public class PartialEepGet extends EepGet {
         buf.append("\r\n");
 
         buf.append("Cache-control: no-cache\r\n" +
-                   "Pragma: no-cache\r\n");
-        // This will be replaced if we are going through I2PTunnelHTTPClient
-        buf.append("User-Agent: " + USER_AGENT + "\r\n" +
+                   "Pragma: no-cache\r\n" +
                    "Accept-Encoding: \r\n" +
                    "Connection: close\r\n");
+        boolean uaOverridden = false;
         if (_extraHeaders != null) {
             for (String hdr : _extraHeaders) {
+                if (hdr.toLowerCase(Locale.US).startsWith("user-agent: "))
+                    uaOverridden = true;
                 buf.append(hdr).append("\r\n");
             }
         }
+        // This will be replaced if we are going through I2PTunnelHTTPClient
+        if(!uaOverridden)
+            buf.append("User-Agent: " + USER_AGENT + "\r\n");
         buf.append("\r\n");
 
         if (_log.shouldLog(Log.DEBUG))