extern volatile ulong_t g_numTicks;
 
-typedef void (*timerCallback)(int);
+typedef void (*timerCallback)(int, void*);
 
 void Init_Timer(void);
 
 
 
 typedef struct {
-    int ticks;                           /* timer code decrements this */
-    int id;                              /* unqiue id for this timer even */
-    timerCallback callBack;              /* Queue to wakeup on timer expire */
-    int origTicks;
+  int ticks;                           /* timer code decrements this */
+  int id;                              /* unqiue id for this timer even */
+  timerCallback callBack;              /* Queue to wakeup on timer expire */
+  void * cb_arg;                       /* Argument to add to callback */
+  int origTicks;
+
 } timerEvent;
 
-int Start_Timer_Secs(int seconds, timerCallback cb);
-int Start_Timer_MSecs(int msecs, timerCallback cb);
-int Start_Timer(int ticks, timerCallback);
+int Start_Timer_Secs(int seconds, timerCallback cb, void * arg);
+int Start_Timer_MSecs(int msecs, timerCallback cb, void * arg);
+int Start_Timer(int ticks, timerCallback, void * arg);
 
 double Get_Remaining_Timer_Secs(int id);
 int Get_Remaining_Timer_MSecs(int id);
 
 
 
 static int Packet_Received(struct NE2K_Packet_Info* info, uchar_t *pkt);
-static void periodic_caller(int timer_id);
+static void periodic_caller(int timer_id, void * arg);
 
 void init_socket_layer() {
    int i = 0;
     Init_Ne2k(&Packet_Received);
 
     iflag = Begin_Int_Atomic();
-    Start_Timer(2, periodic_caller);
+    Start_Timer(2, periodic_caller, NULL);
     End_Int_Atomic(iflag);
 
 }
 
 
 
-static void periodic_caller(int timer_id) {
+static void periodic_caller(int timer_id, void * arg) {
   int i;
   //handle the periodic calls of uIP
   
 
     if (pendingTimerEvents[i].ticks == 0) {
       if (timerDebug) Print("timer: event %d expired (%d ticks)\n", 
                            pendingTimerEvents[i].id, pendingTimerEvents[i].origTicks);
-      (pendingTimerEvents[i].callBack)(pendingTimerEvents[i].id);
+      (pendingTimerEvents[i].callBack)(pendingTimerEvents[i].id, pendingTimerEvents[i].cb_arg);
       pendingTimerEvents[i].ticks = pendingTimerEvents[i].origTicks;
     } else {
       pendingTimerEvents[i].ticks--;
 }
 
 
-int Start_Timer_Secs(int seconds, timerCallback cb) {
-  return Start_Timer(seconds * HZ, cb);
+int Start_Timer_Secs(int seconds, timerCallback cb, void * arg) {
+  return Start_Timer(seconds * HZ, cb, arg);
 }
 
 
-int Start_Timer_MSecs(int msecs, timerCallback cb) {
+int Start_Timer_MSecs(int msecs, timerCallback cb, void * arg) {
   msecs += 10 - (msecs % 10);
 
-  return Start_Timer(msecs * (HZ / 1000), cb);
+  return Start_Timer(msecs * (HZ / 1000), cb, arg);
 }
 
 
 
-int Start_Timer(int ticks, timerCallback cb)
+int Start_Timer(int ticks, timerCallback cb, void * arg)
 {
     int ret;
 
        ret = nextEventID++;
        pendingTimerEvents[timeEventCount].id = ret;
        pendingTimerEvents[timeEventCount].callBack = cb;
+       pendingTimerEvents[timeEventCount].cb_arg = arg;
        pendingTimerEvents[timeEventCount].ticks = ticks;
        pendingTimerEvents[timeEventCount].origTicks = ticks;
        timeEventCount++;