diff --git a/components/susignup-admin.php b/components/susignup-admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b287169deb17d1363f96a833a72bfdd8b7b27ee
--- /dev/null
+++ b/components/susignup-admin.php
@@ -0,0 +1,168 @@
+<?PHP
+/***
+ * SU Signup admin 
+ * Allows us to search the SU api for a given student number and checks if they're a SUCS member.
+ * If they are - allows account renewal
+ * If not - allows signup to be bootstrapped as per susignup component
+ ***/
+
+include("../lib/member_functions.php");
+include("../suapi.inc.php");
+
+//Restrict access to staff. 
+$permission="sucsstaff";
+
+if (isset($session->groups[$permission])) {
+	//Setup smarty magic, step 1
+	$smarty->assign("staff", TRUE);
+
+	if(!isset($_REQUEST['mode'])) {
+		$mode = 'menu';
+	} else {
+		$mode = urldecode($_REQUEST['mode']);
+	}
+
+	//Set up SUCS DB Connection.
+	//Note that $DB is the generic sucssite connection
+	
+	$sucsDB = NewADOConnection('postgres8');
+	$sucsDB->Connect('dbname=sucs user=apache');
+	$sucsDB->SetFetchMode(ADODB_FETCH_ASSOC);
+
+	if ($mode == 'search') {
+		if (empty($_REQUEST['sid']) || empty($_REQUEST['snsubmit'])) {
+			$mode = 'error';
+			$smarty->assign("error_text", "Invalid search request");	
+		}else{
+			$pres=preg_match("/^[0-9]{6}$/",$_REQUEST['sid'],$sid);
+			if ($pres!=1) {
+				$mode = 'error';
+				$smarty->assign("error_text", "Search term doesn't look like a valid student ID");
+			} else {
+				$url = "https://$suapi_user:$suapi_pass@hap.swansea-union.co.uk/memberships/Membership.asmx/IsPersonMember?strCriteria=".$sid[0]."&GroupingId=6613";
+				$apiReq = curl_init();
+				curl_setopt($apiReq, CURLOPT_URL, $url);
+				curl_setopt($apiReq, CURLOPT_RETURNTRANSFER, TRUE);
+
+				$apiResult = curl_exec($apiReq);
+				if ($apiResult === FALSE) {
+					$mode = 'error';
+					$smarty->assign("error_text", "An error occurred communicating with the SUSU API. Please try again later.");
+				}else {
+					// Ostensibly we now have a valid search result from the SU - go to work
+					$xml=new SimpleXMLElement($apiResult);
+					$ismember = $xml[0];
+					if ($ismember=="true") {
+						//Yay, we have a student who has paid and needs to be signed up.
+						//Check they don't have a signup slip already
+						$query = "SELECT transactionid, signupid FROM transactions WHERE cardNumber = ?;";
+						$qres = $sucsDB->Execute($query, $sid);
+						
+						if ($qres->RecordCount()==0) {
+							// No transaction, but might have unused signup slip. If so, retrieve values.
+							$query = "SELECT id, username, password FROM signup WHERE sid=?;";
+							$qres = $sucsDB->Execute($query, array($sid[0]));
+							if ($qres && $qres->RecordCount() > 0) {
+								if ($qres->RecordCount() > 1) {
+									$mode='error';
+									$smarty->assign("error_text", "Student has multiple signup slips in the DB. Bork! Bork! Bork!");
+								} else if (!empty($qres->fields['username'])) {
+									$mode='error';
+									$smarty->assign("error_text", "Student hasn't tried to use the SU signup component (No transaction in DB), but has a previously used Signup Slip with username ".$qres->fields['username'].".<br />Is this a renewal? If not, ask an admin to generate a new signup slip for this student");
+									//TODO: Add option to generate new signup slip?
+								} else {
+									$id = $qres->fields['id'];
+									$pass = $qres->fields['password'];
+								}
+							} else {
+								$pass = make_password();
+								$query = "INSERT INTO signup (password,sid,issuedby) VALUES ( ?, ?, ?) RETURNING id";
+								$attribs[]=addslashes($pass);
+								$attribs[]=$sid[0];
+								$attribs[]='99999'; //SUCS Magic internal use UID
+
+								$id = $sucsDB->Execute($query,$attribs);
+								$id = $id->fields['id'];
+								if (!$id) {
+									$mode="error";
+									$smarty->assign("error_text", "An error occurred generating a signup ID. Report the following message to the admins:<br /><pre>".$sucsDB->ErrorMsg()."</pre>");
+								} else {
+									$smarty->assign('slipid', $id);
+									$smarty->assign('slippass', $pass);
+									$smarty->assign('sid', $sid[0]);
+								}
+							}
+						} else {
+							//Retrieve existing slip
+							$id = $qres->fields['signupid'];
+							$tid = $qres->fields['transactionid'];
+							if (empty($id)) {
+								$pass = make_password();
+								$query = "INSERT INTO signup (password,sid,issuedby) VALUES ( ?, ?, ?) RETURNING id";
+								$attribs[]=addslashes($pass);
+								$attribs[]=$sid[0];
+								$attribs[]='99999'; //SUCS Magic internal use UID
+
+								$qres = $sucsDB->Execute($query,$attribs);
+								if (!$qres) {
+									$mode="error";
+									$smarty->assign("error_text", "An error occurred generating a signup ID. Report the following message to the admins:<br /><pre>".$sucsDB->ErrorMsg()."</pre>");
+								} else {
+									$id = $qres->fields['id'];
+									$query = "UPDATE transactions SET signupid=? WHERE transactionid=?;";
+									$qres = $sucsDB->Execute($query, array($id, $tid));
+									$smarty->assign('slipid', $id);
+									$smarty->assign('slippass', $pass);
+									$smarty->assign('sid', $sid[0]);
+								}
+
+							}else {
+								$query = "SELECT username, password FROM signup WHERE id=?;";
+								$qres = $sucsDB->Execute($query, array($id));
+								if (!$qres) {
+									$mode="error";
+									$smarty->assign("error_text", "The user appears to have generated a signup ID using the SU Signup system (Slip ID: ".$id."), but the password for that slip can't be retrieved.<br />Request assistance.");
+								} else if ($qres->fields['username'] !== NULL) {
+									$mode="error";
+									$smarth->assign("error_text", "This user appears to have completed signup, with username <strong>".$qres->fields['username']."</strong><br />Check that this user exists, and offer to reset their password if necessary.");
+								}
+								$pass = $qres->fields['password'];
+								$smarty->assign('slipid', $id);
+								$smarty->assign('slippass', $pass);
+								$smarty->assign('sid', $sid[0]);
+							}
+						}
+
+						if(!$mode=='error') {
+							//Right, this should be the point where we hand off to signup
+							$smarty->assign('slipid', $id);
+							$smarty->assign('slippass', $pass);
+							$smarty->assign('sid', $sid[0]);
+						}
+
+					}else{
+						$mode='error';
+						$smarty->assign("error_text", "Student does not appear to have paid. Extract fees");
+					}
+				}
+			}
+		}
+	}
+}
+$smarty->assign('title', 'SU Signup Admin');
+$smarty->assign('mode', $mode);
+$body = $smarty->fetch("susignup-admin.tpl");
+$smarty->assign('body', $body);
+$smarty->assign("extra_styles", array("$baseurl/css/susignup-admin.css"));
+
+function su_json_decode($text) {
+	$re1='.*?';
+	$re2='(\\{.*?\\})';
+	if ($c=preg_match_all ("/".$re1.$re2."/is", $text, $matches))
+	{
+		$json_string=$matches[1][0];
+	}else{
+		  return FALSE;
+	}
+	return json_decode($json_string,TRUE);
+} 
diff --git a/templates/susignup-admin.tpl b/templates/susignup-admin.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..ccc1791ae917a90cfb329984e68d3aa9b8c5d4f4
--- /dev/null
+++ b/templates/susignup-admin.tpl
@@ -0,0 +1,66 @@
+{if $staff == TRUE}
+ {if $mode == 'error'}
+	<div class='errorbar'>
+		<strong>Error: </strong> {$error_text}
+	</div>
+ {/if}
+ {if $mode == 'renew'}
+	<div class='errorbar'>
+		<strong>Error: </strong> Not implemented yet
+	</div>
+ {elseif $mode == 'renewals'}
+	<div class='errorbar'>
+		<strong>Error: </strong> Not implemented yet
+	</div>
+ {elseif $mode == 'search'}
+<div style='text-align: center'>
+ <div class='cbb' style='text-align: left'>
+	Student {$sid} appears to have paid, and a signup slip has been generated.<br />
+	The details are:<br />
+	<strong>Slip ID: </strong> {$slipid}<br />
+	<strong>Slip Password: </strong> {$slippass} <br />
+	<form action="https://sucs.org/signup/" method="post">
+		<input type=hidden name="signupid" id="id" value="{$slipid}" />
+		<input type=hidden name="signuppw" id="pass" value="{$slippass}" />
+		<input type=submit name="submit" value="Proceed" />
+	</form>
+ </div>
+</div>
+ {elseif $mode == 'menu' || $mode == 'error'} 
+	<p>
+This component allows staff members to sort out memberships and renewals that have been paid for via the SU payments system. </p>
+<p>Renew an individual member, generate a list of members that look like they've paid via the SU system or begin the signup process for a newbie who doesn't have their transaction ID by selecting the appropriate option below.
+	</p>
+<div style='text-align: center'>
+<div class='susignup-admin-menu cbb'>
+<h3>Renew existing account:</h3>
+Username selector
+Submit Button
+</div>
+<div class='susignup-admin-menu cbb'> 
+<h3>Suggest probable renewals</h3>
+Submit Button
+</div>
+<div class='susignup-admin-menu cbb'>
+<h3>Signup a newbie</h3>
+<form action='{$componentpath}' method='post'>
+	<label for='sid'>Student Number:</label>
+	<input type='text' name='sid' id='sid' maxlength=6 /> 
+	<input type='hidden' name='mode' id='mode' value="search" />
+	<input type='submit' name='snsubmit' id='snsubmit' value="Start" />
+</form>
+</div>
+</div>
+ {else}
+	<div class="errorbar">
+		Invalid mode - {$mode}
+	</div>
+ {/if}
+{else}
+        <div class="errorbar">
+                <div><div><div>
+                        You must be logged in and be a staff member to use this component;
+                </div></div></div>
+        </div>
+{/if}
+