diff --git a/config/rollover.php b/config/rollover.php
index 5e0368ca..0b0d3281 100644
--- a/config/rollover.php
+++ b/config/rollover.php
@@ -54,6 +54,24 @@
  </script>
  <?
 
+ function roll($currentfairyear, $newfairyear, $table, $fields)
+ {
+	echo "SELECT * FROM $table WHERE year='$currentfairyear'";
+	$q=mysql_query("SELECT * FROM $table WHERE year='$currentfairyear'");
+	echo mysql_error();
+	$names = '`'.join('`,`', $fields).'`';
+	while($r=mysql_fetch_assoc($q)) {
+		$vals = '';
+		foreach($fields as $f) {
+			$vals .= ",'".mysql_escape_string($r[$f])."'";
+		}
+
+		print("INSERT INTO $table(`year`,$names) VALUES ('$newfairyear'$vals)<br/>");
+		mysql_query("INSERT INTO $table(`year`,$names) VALUES ('$newfairyear'$vals)");
+		echo mysql_error();	
+	}
+ }
+
  if($_POST['action']=="rollover" && $_POST['nextfairyear'])
  {
  	$newfairyear=intval($_POST['nextfairyear']);
@@ -226,25 +244,6 @@
 			}
 		}
 
-		echo i18n("Rolling award contacts")."<br />";
-		//award contacts
-		$q=mysql_query("SELECT * FROM award_contacts WHERE year='$currentfairyear'");
-		echo mysql_error();
-		while($r=mysql_fetch_object($q))
-			mysql_query("INSERT INTO award_contacts (award_sponsors_id,salutation,firstname,lastname,position,email,phonehome,phonework,phonecell,fax,notes,year) VALUES (
-				'".mysql_escape_string($r->award_sponsors_id)."',
-				'".mysql_escape_string($r->salutation)."',
-				'".mysql_escape_string($r->firstname)."',
-				'".mysql_escape_string($r->lastname)."',
-				'".mysql_escape_string($r->position)."',
-				'".mysql_escape_string($r->email)."',
-				'".mysql_escape_string($r->phonehome)."',
-				'".mysql_escape_string($r->phonework)."',
-				'".mysql_escape_string($r->phonecell)."',
-				'".mysql_escape_string($r->fax)."',
-				'".mysql_escape_string($r->notes)."',
-				'".mysql_escape_string($newfairyear)."')");
-
 		echo i18n("Rolling award types")."<br />";
 		//award types
 		$q=mysql_query("SELECT * FROM award_types WHERE year='$currentfairyear'");
@@ -303,36 +302,35 @@
 
 		echo i18n("Rolling registration fee items")."<br />";
 		//regfee items
-		$q=mysql_query("SELECT * FROM regfee_items WHERE year='$currentfairyear'");
-		echo mysql_error();
-		while($r=mysql_fetch_object($q))
-			mysql_query("INSERT INTO regfee_items (`year`,`name`,`description`,`cost`,`per`) VALUES (
-				'$newfairyear',
-				'".mysql_escape_string($r->name)."',
-				'".mysql_escape_string($r->description)."',
-				'".mysql_escape_string($r->cost)."',
-				'".mysql_escape_string($r->per)."')");
-
-		echo "<br />";
-		echo "<br />";
+		roll($currentfairyear, $newfairyear, 'regfee_items',
+				array('name','description','cost','per'));
 
 		//volunteer positions
-		$q=mysql_query("SELECT * FROM volunteer_positions WHERE year='$currentfairyear'");
-		echo mysql_error();
-		while($r=mysql_fetch_object($q))
-			mysql_query("INSERT INTO volunteer_positions(`year`,`name`,`desc`,`meet_place`,`start`,`end`) VALUES (
-				'$newfairyear',
-				'".mysql_escape_string($r->name)."',
-				'".mysql_escape_string($r->desc)."',
-				'".mysql_escape_string($r->meet_place)."',
-				'".mysql_escape_string($r->start)."',
-				'".mysql_escape_string($r->end)."')");
-
-		echo "<br />";
-		echo "<br />";
-
+		echo i18n('Rolling volunteer positions')."<br />";
+		roll($currentfairyear, $newfairyear, 'volunteer_positions',
+				array('name','desc','meet_place','start','end'));
 
+		//timeslots and rounds
+		echo i18n('Rolling judging timeslots and rounds')."<br />";
+		$q=mysql_query("SELECT * FROM judges_timeslots WHERE year='$currentfairyear' AND round_id='0'");
+                echo mysql_error();
+		while($r=mysql_fetch_assoc($q)) {
+			$d = $newfairyear - $currentfairyear;
+			mysql_query("INSERT INTO judges_timeslots (`year`,`round_id`,`type`,`date`,`starttime`,`endtime`,`round_name`)
+				VALUES ('$newfairyear','0','{$r['type']}',DATE_ADD('{$r['date']}', INTERVAL $d YEAR),
+					'{$r['starttime']}','{$r['endtime']}','{$r['round_name']}')");
+			echo mysql_error();
+			$round_id = mysql_insert_id();
+			$qq = mysql_query("SELECT * FROM judges_timeslots WHERE round_id='{$r['id']}'");
+			echo mysql_error();
+			while($rr=mysql_fetch_assoc($qq)) {
+				mysql_query("INSERT INTO judges_timeslots (`year`,`round_id`,`type`,`date`,`starttime`,`endtime`)
+						VALUES ('$newfairyear','$round_id','timeslot',DATE_ADD('{$rr['date']}', INTERVAL $d YEAR),
+							'{$rr['starttime']}','{$rr['endtime']}')");
+			}
+		}
 
+		echo "<br /><br />";
 		mysql_query("UPDATE config SET val='$newfairyear' WHERE var='FAIRYEAR' AND year=0");
 		echo happy(i18n("Fair year has been rolled over from %1 to %2",array($currentfairyear,$newfairyear)));
 		send_footer();