diff --git a/src/common/util.c b/src/common/util.c
index bc821fa592f95eac93265b914509ef2669b2e964..50010bcb433d5d7511e2ee5153be8f82d8fffa66 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1559,6 +1559,33 @@ char *expand_filename(const char *filename)
   }
 }
 
+/**
+ * Rename the file 'from' to the file 'to'.  On unix, this is the same as
+ * rename(2).  On windows, this removes 'to' first if it already exists.
+ * Returns 0 on success.  Returns -1 and sets errno on failure.
+ */
+int replace_file(const char *from, const char *to)
+{
+#ifndef MS_WINDOWS
+  return rename(from,to);
+#else
+  switch(file_status(to)) 
+    {
+    case FN_NOENT:
+      break;
+    case FN_FILE:
+      if (unlink(to)) return -1;
+      break;
+    case FN_ERROR:
+      return -1;
+    case FN_DIR:
+      errno = EISDIR;
+      return -1;
+    }
+  return rename(from,to);
+#endif
+}
+
 /** Return true iff <b>ip</b> (in host order) is an IP reserved to localhost,
  * or reserved for local networks by RFC 1918.
  */
diff --git a/src/common/util.h b/src/common/util.h
index 792d5cffe2eabe24a951b58d6b4e9581c3507b18..0bf0a8c6eddddd335393c388a4f92da23eb9cba8 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -220,6 +220,7 @@ int write_str_to_file(const char *fname, const char *str);
 char *read_file_to_str(const char *filename);
 int parse_line_from_file(char *line, int maxlen, FILE *f, char **key_out, char **value_out);
 char *expand_filename(const char *filename);
+int replace_file(const char *from, const char *to);
 
 int spawn_func(int (*func)(void *), void *data);
 void spawn_exit();