diff -Naur cyrus-imapd-2.1.17/README.autosievefolder cyrus-imapd-2.1.17-autosieve.uncompiled/README.autosievefolder
--- cyrus-imapd-2.1.17/README.autosievefolder	1970-01-01 02:00:00 +0200
+++ cyrus-imapd-2.1.17-autosieve.uncompiled/README.autosievefolder	2005-02-04 18:04:32 +0200
@@ -0,0 +1,42 @@
+Cyrus IMAP autosievefolder patch
+----------------------------------
+
+NOTE : This patch has been created at the University of Athens. For more info, as well 
+as more patches on Cyrus IMAPD server, please visit http://email.uoa.gr 
+
+
+  When the lmtpd daemon receives an email message prior to delivering it to the 
+INBOX folder of the user, checks if the user has specified sieve filters. If the
+user has specified sieve filters the filters are evaluated. If the message matches
+any of the filters the action that is specified in the filter is executed. If the action 
+is FileInto it is stored in the subfolder specified in the filter. If the 
+subfolder doesn't exist then the message is sent to the INBOX folder of the user.
+
+  With this patch if the folder doesn't exist AND the name of the subfolder is 
+specified in the autosievefolders option, OR the anysievefolder is set to 
+yes in the cyrus-imap configuration file then the subfolder is created and the mail 
+is stored there.
+
+
+Check the following options of the imapd.conf file
+==================================================
+
+* anysievefolder : It must be "yes" in order to permit the autocreation of any 
+INBOX subfolder requested by a sieve filter, through the "fileinto" action. (default = no)
+* autosievefolders : It is a "|" separated list of subfolders of INBOX that will be 
+automatically created, if requested by a sieve filter, through the "fileinto" 
+action. (default = null)
+	i.e. autosievefolders: Junk | Spam
+
+WARNING: anysievefolder, takes precedence over autosievefolders . Which means that if 
+anysievefolder is set to "yes", cyrus will create any INBOX subfolder requested, no-matter what the value of autosievefolders is.
+
+
+Things to be done
+=================
+
+1. Support cyrus wildcards in the autosievefolders option. 
+
+
+For more information and updates please visit http://email.uoa.gr/projects/cyrus/autosievefolder
+
diff -Naur cyrus-imapd-2.1.17/imap/lmtpd.c cyrus-imapd-2.1.17-autosieve.uncompiled/imap/lmtpd.c
--- cyrus-imapd-2.1.17/imap/lmtpd.c	2003-10-01 21:20:37 +0300
+++ cyrus-imapd-2.1.17-autosieve.uncompiled/imap/lmtpd.c	2005-02-04 17:57:11 +0200
@@ -148,6 +148,9 @@
 struct lmtp_func mylmtp = { &deliver, &verify_user, &shut_down,
 			    &spoolfile, &removespool, 0, 1, 0 };
 
+static int autosieve_subfolder(char *userid, struct auth_state *auth_state,
+			       char *subfolder);
+
 static void logdupelem();
 static void usage();
 static void setup_sieve();
@@ -692,6 +695,19 @@
                           sd->username, mdata->notifyheader,
                           fc->mailbox, quotaoverride, 0);
 
+    if (ret == IMAP_MAILBOX_NONEXISTENT) {
+    /* if "plus" folder under INBOX, then try to create it */
+        ret = autosieve_subfolder(sd->username, sd->authstate, fc->mailbox);
+
+        if (!ret)
+           ret = deliver_mailbox(md->data, mdata->stage, md->size,
+                          fc->imapflags->flag, fc->imapflags->nflags,
+                          sd->username, sd->authstate, md->id,
+                          sd->username, mdata->notifyheader,
+                          fc->mailbox, quotaoverride, 0);
+
+    }
+
     if (ret == 0) {
 
 	snmp_increment(SIEVE_FILEINTO, 1);
@@ -1498,3 +1514,82 @@
 
     append_removestage(stage);
 }
+
+
+#define SEP '|'
+
+static int autosieve_subfolder(char *userid, struct auth_state *auth_state,
+                              char *subfolder) {
+    char foldername[MAX_MAILBOX_NAME + 1];
+    char option_name_external[MAX_MAILBOX_NAME + 1];
+    char option_name_internal[MAX_MAILBOX_NAME + 1];
+    const char *subf;
+    char *p, *q, *next_subf;
+    int len, r = 0;
+    int createsievefolder = 0;
+
+  
+   /* Check if subfolder or userid are NULL */ 
+   if(subfolder == NULL || userid == NULL) 
+      return IMAP_MAILBOX_NONEXISTENT; 
+
+   /* Translate any separators in user */
+   if (userid) mboxname_hiersep_tointernal(&lmtpd_namespace, userid);
+   r = (*lmtpd_namespace.mboxname_tointernal) (&lmtpd_namespace,
+                                              subfolder, userid, foldername);
+
+   if (r) return IMAP_MAILBOX_BADNAME;
+	  
+   if (config_getswitch("anysievefolder", 0))
+       createsievefolder = 1;
+   else if ((subf = config_getstring("autosievefolders", NULL)) != NULL) {
+       /* Roll through subf */
+       next_subf = (char *) subf;
+       while (*next_subf) {
+            for (p = next_subf ; isspace((int) *p) || *p == SEP ; p++);
+            for (next_subf = p ; *next_subf && *next_subf != SEP ; next_subf++);
+            for (q = next_subf ; q > p && (isspace((int) *q) || *q == SEP || !*q); q--);
+      
+            if (!*p) continue;
+	    
+            len = q - p + 1; 
+
+            /*
+             * This is a preliminary length check based on the assumption
+             * that the *final* internal format will be something
+             * like user.userid.subfolder(s).
+             */
+            if (len > sizeof(option_name_external) - strlen(userid) - 5)
+                  return IMAP_MAILBOX_BADNAME;
+
+            strlcpy(option_name_external, lmtpd_namespace.prefix[NAMESPACE_INBOX], 
+			     sizeof(option_name_external));
+            strncat(option_name_external, p, len);
+
+            r = (*lmtpd_namespace.mboxname_tointernal) (&lmtpd_namespace,
+                                             option_name_external, userid, option_name_internal);
+            if (r) continue;	   
+
+            if (!strcmp(option_name_internal, foldername)) {
+                  createsievefolder = 1;
+	           break;
+            }
+       }              
+   }
+
+   if (createsievefolder) {
+       r = mboxlist_createmailbox(foldername, MAILBOX_FORMAT_NORMAL, NULL,
+                                          1, userid, auth_state, 0, 0, 0);
+       if (!r) {
+           mboxlist_changesub(foldername, userid, auth_state, 1, 1);
+           syslog(LOG_DEBUG, "autosievefolder: User %s, folder %s creation succeeded.",
+                                                  userid, foldername);
+           return 0;
+       } else {
+           syslog(LOG_ERR, "autosievefolder: User %s, folder %s creation failed. %s",
+                                                 userid, foldername, error_message(r));
+           return r;
+       }
+   } else 
+       return IMAP_MAILBOX_NONEXISTENT;
+}
