--- /dev/null
+--- openntpd-3.9p1/ntpd.h 2006-05-14 07:29:21.000000000 +0200
++++ openntpd-3.9p1new/ntpd.h 2007-02-03 23:51:56.000000000 +0100
+@@ -34,6 +34,7 @@
+ #define NTPD_USER "_ntp"
+ #endif
+ #define CONFFILE SYSCONFDIR "/ntpd.conf"
++#define DRIFTFILE "/var/db/ntpd.drift"
+
+ #define READ_BUF_SIZE 4096
+
+--- openntpd-3.9p1/ntpd.c 2006-05-14 07:29:23.000000000 +0200
++++ openntpd-3.9p1new/ntpd.c 2007-02-04 00:00:36.000000000 +0100
+@@ -45,6 +45,7 @@
+ int dispatch_imsg(struct ntpd_conf *);
+ int ntpd_adjtime(double);
+ void ntpd_settime(double);
++void readfreq(void);
+
+ volatile sig_atomic_t quit = 0;
+ volatile sig_atomic_t reconfig = 0;
+@@ -153,7 +154,8 @@
+ chld_pid = ntp_main(pipe_chld, &conf);
+
+ setproctitle("[priv]");
+-
++ readfreq();
++
+ signal(SIGTERM, sighdlr);
+ signal(SIGINT, sighdlr);
+ signal(SIGCHLD, sighdlr);
+
+--- openntpd-3.9p1/openbsd-compat/port-linux.c 2007-02-03 20:52:20.000000000 +0100
++++ openntpd-3.9p1new/openbsd-compat/port-linux.c 2007-02-04 01:02:16.000000000 +0100
+@@ -33,6 +33,49 @@
+ /* maximum change to skew per adjustment, in PPM */
+ #define MAX_SKEW_DELTA 5.0
+
++void
++writefreq(double d)
++{
++ int r;
++ FILE *fp;
++
++ fp = fopen(DRIFTFILE, "w");
++ if (fp == NULL)
++ {
++ log_warn("opening drift file for writing failed");
++ return;
++ }
++
++ fprintf(fp, "%e\n", d);
++ r = ferror(fp);
++ if (fclose(fp) != 0 || r != 0)
++ {
++ unlink(DRIFTFILE);
++ log_warn("saving freq drift failed");
++ }
++}
++
++void
++readfreq(void)
++{
++ FILE *fp;
++ double d;
++ struct timex tmx;
++
++ fp = fopen(DRIFTFILE, "r");
++ if (fp == NULL)
++ return;
++
++ if (fscanf(fp, "%le", &d) == 1)
++ {
++ tmx.freq = (long)(d * ADJTIMEX_FREQ_SCALE);
++ tmx.modes = ADJ_FREQUENCY;
++ if (adjtimex(&tmx) == -1)
++ log_warn("adjtimex set freq failed");
++ }
++ fclose(fp);
++}
++
+ int
+ _compat_adjtime(const struct timeval *delta, struct timeval *olddelta)
+ {
+@@ -93,6 +136,8 @@
+ tmx.modes = ADJ_FREQUENCY;
+ if (adjtimex(&tmx) == -1)
+ log_warn("adjtimex set freq failed");
++
++ writefreq( tskew );
+ }
+
+ log_debug("interval %0.3lf skew %0.3lf total skew %0.3lf", interval,