diff --git a/ChangeLog b/ChangeLog
index d13f21d4..683cd1c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 2006-01-17 Colin O'Flynn <coflynn@newae.com>
     * main.c: Fixed a typo in safemode variable names, fixed bug 15113
     * avrdude.conf.in : Added BS2 and pagel to M162, Patch 4766
+    * main.c, stk500v2.c: Added patch 4804 from eolson@mit.edu
+                          Which stops sck from being writtend needlessly
 
 2006-01-13  Joerg Wunsch <j@uriah.heep.sax.de>
 
diff --git a/main.c b/main.c
index 65049839..bbb350b3 100644
--- a/main.c
+++ b/main.c
@@ -101,7 +101,7 @@ void usage(void)
  "Options:\n"
  "  -p <partno>                Required. Specify AVR device.\n"
  "  -b <baudrate>              Override RS-232 baud rate.\n"
- "  -B <bitclock>              Specify JTAG bit clock period (us).\n"
+ "  -B <bitclock>              Specify JTAG/STK500v2 bit clock period (us).\n"
  "  -C <config-file>           Specify location of configuration file.\n"
  "  -c <programmer>            Specify programmer type.\n"
  "  -D                         Disable auto erase for flash memory\n"
@@ -1129,6 +1129,7 @@ int main(int argc, char * argv [])
     if (verbose) {
       fprintf(stderr, "%sSetting bit clk period: %.1f\n", progbuf, bitclock);
     }
+
     pgm->bitclock = bitclock * 1e-6;
   }
 
diff --git a/stk500v2.c b/stk500v2.c
index 21b91e62..f42f897c 100644
--- a/stk500v2.c
+++ b/stk500v2.c
@@ -508,6 +508,11 @@ static int stk500v2_open(PROGRAMMER * pgm, char * port)
 
   stk500v2_drain(pgm, 0);
 
+  if (pgm->bitclock != 0.0) {
+    if (pgm->set_sck_period(pgm, pgm->bitclock) != 0)
+      return -1;
+  }
+
   return 0;
 }
 
@@ -940,8 +945,7 @@ static int stk500v2_getparm(PROGRAMMER * pgm, unsigned char parm, unsigned char
   return 0;
 }
 
-
-static int stk500v2_setparm(PROGRAMMER * pgm, unsigned char parm, unsigned char value)
+static int stk500v2_setparm_real(PROGRAMMER * pgm, unsigned char parm, unsigned char value)
 {
   unsigned char buf[32];
 
@@ -958,6 +962,23 @@ static int stk500v2_setparm(PROGRAMMER * pgm, unsigned char parm, unsigned char
   return 0;
 }
 
+static int stk500v2_setparm(PROGRAMMER * pgm, unsigned char parm, unsigned char value)
+{
+  unsigned char current_value;
+  int res;
+
+  res = stk500v2_getparm(pgm, parm, &current_value);
+  if (res < 0)
+    fprintf(stderr, "%s: Unable to get parameter 0x%02x\n", progname, parm);
+
+  // don't issue a write if the correct value is already set.
+  if (value == current_value) {
+    fprintf(stderr, "%s: Skipping paramter write; parameter value already set.\n", progname);
+    return 0;
+  }
+
+  return stk500v2_setparm_real(pgm, parm, value);
+}
 
 static void stk500v2_display(PROGRAMMER * pgm, char * p)
 {