--- /dev/null
+diff -Naur cyrus-imapd-2.2.12/imap/append.c cyrus-imapd-2.2.12.cvs/imap/append.c
+--- cyrus-imapd-2.2.12/imap/append.c 2004-05-22 05:45:48.000000000 +0200
++++ cyrus-imapd-2.2.12.cvs/imap/append.c 2005-06-03 07:10:24.000000000 +0200
+@@ -1,5 +1,5 @@
+ /* append.c -- Routines for appending messages to a mailbox
+- * $Id: append.c,v 1.107 2004/05/22 03:45:48 rjs3 Exp $
++ * $Id: append.c,v 1.108 2005/06/02 15:47:50 ken3 Exp $
+ *
+ * Copyright (c)1998, 2000 Carnegie Mellon University. All rights reserved.
+ *
+@@ -801,7 +801,8 @@
+ int append_copy(struct mailbox *mailbox,
+ struct appendstate *as,
+ int nummsg,
+- struct copymsg *copymsg)
++ struct copymsg *copymsg,
++ int nolink)
+ {
+ struct mailbox *append_mailbox = &as->m;
+ int msg;
+@@ -845,7 +846,7 @@
+ mailbox_message_get_fname(mailbox, copymsg[msg].uid, fnamebuf,
+ sizeof(fnamebuf));
+ /* Link/copy message file */
+- r = mailbox_copyfile(fnamebuf, fname, 0);
++ r = mailbox_copyfile(fnamebuf, fname, nolink);
+ if (r) goto fail;
+
+ /* Write out cache info, copy other info */
+diff -Naur cyrus-imapd-2.2.12/imap/append.h cyrus-imapd-2.2.12.cvs/imap/append.h
+--- cyrus-imapd-2.2.12/imap/append.h 2004-01-22 22:17:07.000000000 +0100
++++ cyrus-imapd-2.2.12.cvs/imap/append.h 2005-06-03 07:10:24.000000000 +0200
+@@ -1,5 +1,5 @@
+ /* append.h -- Description of messages to be copied
+- * $Id: append.h,v 1.26 2004/01/22 21:17:07 ken3 Exp $
++ * $Id: append.h,v 1.27 2005/06/02 15:47:51 ken3 Exp $
+ *
+ * Copyright (c) 1998, 2000 Carnegie Mellon University. All rights reserved.
+ *
+@@ -137,7 +137,7 @@
+
+ extern int append_copy(struct mailbox *mailbox,
+ struct appendstate *append_mailbox,
+- int nummsg, struct copymsg *copymsg);
++ int nummsg, struct copymsg *copymsg, int nolink);
+
+ extern int append_collectnews(struct appendstate *mailbox,
+ const char *group, unsigned long feeduid);
+diff -Naur cyrus-imapd-2.2.12/imap/imapd.c cyrus-imapd-2.2.12.cvs/imap/imapd.c
+--- cyrus-imapd-2.2.12/imap/imapd.c 2005-02-14 07:39:55.000000000 +0100
++++ cyrus-imapd-2.2.12.cvs/imap/imapd.c 2005-06-03 07:11:52.000000000 +0200
+@@ -38,7 +38,7 @@
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+-/* $Id: imapd.c,v 1.490 2005/02/14 06:39:55 shadow Exp $ */
++/* $Id: imapd.c,v 1.493 2005/06/02 15:47:51 ken3 Exp $ */
+
+ #include <config.h>
+
+@@ -3593,7 +3593,7 @@
+ imapd_userid, mailboxname);
+ if (!r) {
+ r = index_copy(imapd_mailbox, sequence, usinguid, mailboxname,
+- ©uid);
++ ©uid, !config_getswitch(IMAPOPT_SINGLEINSTANCESTORE));
+ }
+
+ index_check(imapd_mailbox, usinguid, 0);
+diff -Naur cyrus-imapd-2.2.12/imap/imapd.h cyrus-imapd-2.2.12.cvs/imap/imapd.h
+--- cyrus-imapd-2.2.12/imap/imapd.h 2004-06-22 23:36:18.000000000 +0200
++++ cyrus-imapd-2.2.12.cvs/imap/imapd.h 2005-06-03 07:10:24.000000000 +0200
+@@ -1,5 +1,5 @@
+ /* imapd.h -- Common state for IMAP daemon
+- * $Id: imapd.h,v 1.61 2004/06/22 21:36:18 rjs3 Exp $
++ * $Id: imapd.h,v 1.62 2005/06/02 15:47:57 ken3 Exp $
+ *
+ * Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.
+ *
+@@ -249,7 +249,7 @@
+ extern int index_thread(struct mailbox *mailbox, int algorithm,
+ struct searchargs *searchargs, int usinguid);
+ extern int index_copy(struct mailbox *mailbox, char *sequence,
+- int usinguid, char *name, char **copyuidp);
++ int usinguid, char *name, char **copyuidp, int nolink);
+ extern int index_status(struct mailbox *mailbox, char *name,
+ int statusitems);
+
+diff -Naur cyrus-imapd-2.2.12/imap/index.c cyrus-imapd-2.2.12.cvs/imap/index.c
+--- cyrus-imapd-2.2.12/imap/index.c 2005-02-14 17:42:08.000000000 +0100
++++ cyrus-imapd-2.2.12.cvs/imap/index.c 2005-06-03 07:13:04.000000000 +0200
+@@ -41,7 +41,7 @@
+ *
+ */
+ /*
+- * $Id: index.c,v 1.213 2005/02/14 16:42:08 shadow Exp $
++ * $Id: index.c,v 1.218 2005/06/02 15:47:58 ken3 Exp $
+ */
+ #include <config.h>
+
+@@ -1145,7 +1145,8 @@
+ char *sequence,
+ int usinguid,
+ char *name,
+- char **copyuidp)
++ char **copyuidp,
++ int nolink)
+ {
+ static struct copyargs copyargs;
+ int i;
+@@ -1176,7 +1177,7 @@
+ if (r) return r;
+
+ r = append_copy(mailbox, &append_mailbox, copyargs.nummsg,
+- copyargs.copymsg);
++ copyargs.copymsg, nolink);
+ if (!r) append_commit(&append_mailbox, totalsize,
+ &uidvalidity, &startuid, &num);
+ if (!r) {
+diff -Naur cyrus-imapd-2.2.12/lib/imapoptions cyrus-imapd-2.2.12.cvs/lib/imapoptions
+--- cyrus-imapd-2.2.12/lib/imapoptions 2004-07-21 21:07:45.000000000 +0200
++++ cyrus-imapd-2.2.12.cvs/lib/imapoptions 2005-06-03 07:14:07.000000000 +0200
+@@ -42,7 +42,7 @@
+ .\" AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ .\"
+-.\" $Id: imapoptions,v 1.30 2004/07/21 19:07:45 rjs3 Exp $
++.\" $Id: imapoptions,v 1.33 2005/06/02 15:47:59 ken3 Exp $
+ .SH NAME
+ imapd.conf \- IMAP configuration file
+ .SH DESCRIPTION
+@@ -753,9 +753,9 @@
+ directories: ~user/.sieve. */
+
+ { "singleinstancestore", 1, SWITCH }
+-/* If enabled, lmtpd and nntpd attempt to only write one copy of a message per
+- partition and create hard links, resulting in a potentially large
+- disk savings. */
++/* If enabled, imapd, lmtpd and nntpd attempt to only write one copy
++ of a message per partition and create hard links, resulting in a
++ potentially large disk savings. */
+
+ { "skiplist_unsafe", 0, SWITCH }
+ /* If enabled, this option forces the skiplist cyrusdb backend to