diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 6c8a045b8988a5b37bda4fbe7ef21dd4701cf773..67dbda4aaaa366578f96ae1d7d08a115e3121c21 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: builtin_functions.c,v 1.104 1998/05/06 00:37:09 hubbe Exp $");
+RCSID("$Id: builtin_functions.c,v 1.105 1998/05/07 23:51:00 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "pike_macros.h"
@@ -1490,7 +1490,7 @@ void f_localtime(INT32 args)
 #ifdef HAVE_MKTIME
 static void f_mktime (INT32 args)
 {
-  INT32 sec, min, hour, mday, mon, year, isdst, tz;
+  INT32 sec, min, hour, mday, mon, year, isdst;
   struct tm date;
   struct svalue s;
   struct svalue * r;
@@ -1518,29 +1518,37 @@ static void f_mktime (INT32 args)
     args=8;
   }
 
-  get_all_args("mktime",args, "%i%i%i%i%i%i%i",
-	       &sec, &min, &hour, &mday, &mon, &year, &isdst, &tz);
+  get_all_args("mktime",args, "%i%i%i%i%i%i",
+	       &sec, &min, &hour, &mday, &mon, &year);
 
-  
+  MEMSET(&date, 0, sizeof(date));
   date.tm_sec=sec;
   date.tm_min=min;
   date.tm_hour=hour;
   date.tm_mday=mday;
   date.tm_mon=mon;
   date.tm_year=year;
-  date.tm_isdst=isdst;
+  if(sp[6-args].subtype == NUMBER_NUMBER)
+  {
+    date.tm_isdst=sp[6-args].u.integer;
+  }else{
+    date.tm_isdst=-1;
+  }
 
 #if STRUCT_TM_HAS_GMTOFF
-  date.tm_gmtoff=tz;
+  if(sp[7-args].subtype == NUMBER_NUMBER)
+  {
+    date.tm_gmtoff=sp[7-args].u.intger;
+  }else{
+    time_t tmp=0;
+    data.tm_gmtoff=localtime(&t).tm_gmtoff;
+  }
   retval=mktime(&date);
 #else
 #ifdef HAVE_EXTERNAL_TIMEZONE
-  if(sp[8-args].subtype == NUMBER_NUMBER)
+  if(sp[7-args].subtype == NUMBER_NUMBER)
   {
-    int save_timezone=timezone;
-    timezone=tz;
-    retval=mktime(&date);
-    timezone=save_timezone;
+    retval=mktime(&date) + sp[7-args].u.integer - timezone;
   }else{
     retval=mktime(&date);
   }
@@ -2770,7 +2778,7 @@ void init_builtin_efuns(void)
 #endif
 
 #ifdef HAVE_MKTIME
-  add_efun("mktime",f_mktime,"function(int,int,int,int,int,int,int,int:int)|function(object|mapping:int)",OPT_TRY_OPTIMIZE);
+  add_efun("mktime",f_mktime,"function(int,int,int,int,int,int,int,void|int:int)|function(object|mapping:int)",OPT_TRY_OPTIMIZE);
 #endif
 
 #ifdef DEBUG