diff --git a/crypt-mod-pgp-classic.c b/crypt-mod-pgp-classic.c
index e414a14..ab3cbfa 100644
--- a/crypt-mod-pgp-classic.c
+++ b/crypt-mod-pgp-classic.c
@@ -46,9 +46,9 @@ static int crypt_mod_pgp_application_handler (BODY *m, STATE *s)
   return pgp_application_pgp_handler (m, s);
 }
 
-static char *crypt_mod_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
+static char *crypt_mod_pgp_findkeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 {
-  return pgp_findKeys (to, cc, bcc);
+  return pgp_findKeys (from, to, cc, bcc);
 }
 
 static BODY *crypt_mod_pgp_sign_message (BODY *a)
diff --git a/crypt-mod-smime-classic.c b/crypt-mod-smime-classic.c
index bc0bb75..84c56f8 100644
--- a/crypt-mod-smime-classic.c
+++ b/crypt-mod-smime-classic.c
@@ -46,9 +46,9 @@ static int crypt_mod_smime_application_handler (BODY *m, STATE *s)
   return smime_application_smime_handler (m, s);
 }
 
-static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
+static char *crypt_mod_smime_findkeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 {
-  return smime_findKeys (to, cc, bcc);
+  return smime_findKeys (from, to, cc, bcc);
 }
 
 static BODY *crypt_mod_smime_sign_message (BODY *a)
diff --git a/crypt-mod.h b/crypt-mod.h
index 08dfa43..ef691e7 100644
--- a/crypt-mod.h
+++ b/crypt-mod.h
@@ -43,7 +43,7 @@ typedef int (*crypt_func_pgp_check_traditional_t) (FILE *fp, BODY *b,
 typedef BODY *(*crypt_func_pgp_traditional_encryptsign_t) (BODY *a, int flags,
                                                            char *keylist);
 typedef BODY *(*crypt_func_pgp_make_key_attachment_t) (char *tempf);
-typedef char *(*crypt_func_findkeys_t) (ADDRESS *to,
+typedef char *(*crypt_func_findkeys_t) (ADDRESS *from, ADDRESS *to,
                                         ADDRESS *cc, ADDRESS *bcc);
 typedef BODY *(*crypt_func_sign_message_t) (BODY *a);
 typedef BODY *(*crypt_func_pgp_encrypt_message_t) (BODY *a, char *keylist,
diff --git a/crypt.c b/crypt.c
index 67d7276..3e95ef8 100644
--- a/crypt.c
+++ b/crypt.c
@@ -707,8 +707,17 @@ void crypt_extract_keys_from_messages (HEADER * h)
 }
 
 
+static ADDRESS *crypt_get_from_if_fcc (HEADER *msg, char *fcc)
+{
+  if (*fcc && query_quadoption (OPT_ENCRYPT_SELF,
+                    _("Do you need to decrypt it yourself later?")) == M_YES)
+  {
+    return msg->env->from;
+  }
+  return NULL;
+}
 
-int crypt_get_keys (HEADER *msg, char **keylist)
+int crypt_get_keys (HEADER *msg, char *fcc, char **keylist)
 {
   /* Do a quick check to make sure that we can find all of the encryption
    * keys if the user has requested this service.
@@ -727,16 +736,16 @@ int crypt_get_keys (HEADER *msg, char **keylist)
      if ((WithCrypto & APPLICATION_PGP)
          && (msg->security & APPLICATION_PGP))
      {
-       if ((*keylist = crypt_pgp_findkeys (msg->env->to, msg->env->cc,
-      			       msg->env->bcc)) == NULL)
+       if ((*keylist = crypt_pgp_findkeys (crypt_get_from_if_fcc(msg,fcc),
+               msg->env->to, msg->env->cc, msg->env->bcc)) == NULL)
            return (-1);
        unset_option (OPTPGPCHECKTRUST);
      }
      if ((WithCrypto & APPLICATION_SMIME)
          && (msg->security & APPLICATION_SMIME))
      {
-       if ((*keylist = crypt_smime_findkeys (msg->env->to, msg->env->cc,
-      				             msg->env->bcc)) == NULL)
+       if ((*keylist = crypt_smime_findkeys (crypt_get_from_if_fcc(msg,fcc),
+               msg->env->to, msg->env->cc, msg->env->bcc)) == NULL)
            return (-1);
      }
   }
diff --git a/cryptglue.c b/cryptglue.c
index ab39f83..1fbfb0c 100644
--- a/cryptglue.c
+++ b/cryptglue.c
@@ -200,10 +200,10 @@ BODY *crypt_pgp_make_key_attachment (char *tempf)
 
 /* This routine attempts to find the keyids of the recipients of a
    message.  It returns NULL if any of the keys can not be found.  */
-char *crypt_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
+char *crypt_pgp_findkeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 {
   if (CRYPT_MOD_CALL_CHECK (PGP, findkeys))
-    return (CRYPT_MOD_CALL (PGP, findkeys)) (to, cc, bcc);
+    return (CRYPT_MOD_CALL (PGP, findkeys)) (from, to, cc, bcc);
 
   return NULL;
 }
@@ -334,10 +334,10 @@ int crypt_smime_verify_sender(HEADER *h)
 
 /* This routine attempts to find the keyids of the recipients of a
    message.  It returns NULL if any of the keys can not be found.  */
-char *crypt_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
+char *crypt_smime_findkeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 {
   if (CRYPT_MOD_CALL_CHECK (SMIME, findkeys))
-    return (CRYPT_MOD_CALL (SMIME, findkeys)) (to, cc, bcc);
+    return (CRYPT_MOD_CALL (SMIME, findkeys)) (from, to, cc, bcc);
 
   return NULL;
 }
diff --git a/init.h b/init.h
index 2674bef..91644df 100644
--- a/init.h
+++ b/init.h
@@ -549,6 +549,14 @@ struct option_t MuttVars[] = {
   ** Useful to avoid the tampering certain mail delivery and transport
   ** agents tend to do with messages.
   */
+  { "crypt_encrypt_self",	DT_QUAD, R_NONE, OPT_ENCRYPT_SELF, M_ASKYES },
+  /*
+  ** .pp
+  ** If set to \fIyes\fP, when encrypting messages and the fcc header field
+  ** is not empty, the sender will be included to the recipient list.
+  ** This applies to the %c specifier in ``$$smime_encrypt_command''
+  ** and to the %r specifier in ``$$pgp_encrypt_only_command''.
+  */
   { "envelope_from_address", DT_ADDR, R_NONE, UL &EnvFrom, 0 },
   /*
   ** .pp
diff --git a/mutt.h b/mutt.h
index 5930e14..1445400 100644
--- a/mutt.h
+++ b/mutt.h
@@ -298,6 +298,10 @@ enum
 #endif
   OPT_SUBJECT,
   OPT_VERIFYSIG,      /* verify PGP signatures */
+
+#if (defined(CRYPT_BACKEND_CLASSIC_PGP) || defined(CRYPT_BACKEND_CLASSIC_SMIME)) || defined (CRYPT_BACKEND_GPGME)
+  OPT_ENCRYPT_SELF,
+#endif
     
   /* THIS MUST BE THE LAST VALUE. */
   OPT_MAX
diff --git a/mutt_crypt.h b/mutt_crypt.h
index db152b0..046aeae 100644
--- a/mutt_crypt.h
+++ b/mutt_crypt.h
@@ -141,7 +141,7 @@ void crypt_extract_keys_from_messages (HEADER *h);
 /* Do a quick check to make sure that we can find all of the
    encryption keys if the user has requested this service. 
    Return the list of keys in KEYLIST. */
-int crypt_get_keys (HEADER *msg, char **keylist);
+int crypt_get_keys (HEADER *msg, char *fcc, char **keylist);
 
 /* Forget a passphrase and display a message. */
 void crypt_forget_passphrase (void);
@@ -197,7 +197,7 @@ BODY *crypt_pgp_make_key_attachment (char *tempf);
 
 /* This routine attempts to find the keyids of the recipients of a
    message.  It returns NULL if any of the keys can not be found.  */
-char *crypt_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
+char *crypt_pgp_findkeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
 
 /* Create a new body with a PGP signed message from A. */
 BODY *crypt_pgp_sign_message (BODY *a);
@@ -246,7 +246,7 @@ char *crypt_smime_ask_for_key (char *prompt, char *mailbox, short public);
 
 /* This routine attempts to find the keyids of the recipients of a
    message.  It returns NULL if any of the keys can not be found.  */
-char *crypt_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
+char *crypt_smime_findkeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
 
 /* fixme: Needs documentation. */
 BODY *crypt_smime_sign_message (BODY *a);
diff --git a/pgp.c b/pgp.c
index 66e9294..9a3f0a5 100644
--- a/pgp.c
+++ b/pgp.c
@@ -1129,7 +1129,7 @@ static short is_numerical_keyid (const char *s)
 /* This routine attempts to find the keyids of the recipients of a message.
  * It returns NULL if any of the keys can not be found.
  */
-char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
+char *pgp_findKeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 {
   char *keyID, *keylist = NULL, *t;
   size_t keylist_size = 0;
@@ -1142,16 +1142,19 @@ char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 
   const char *fqdn = mutt_fqdn (1);
 
-  for (i = 0; i < 3; i++) 
+  for (i = 0; i < 4; i++) 
   {
     switch (i)
     {
-      case 0: p = to; break;
-      case 1: p = cc; break;
-      case 2: p = bcc; break;
+      case 0: p = from; break;
+      case 1: p = to; break;
+      case 2: p = cc; break;
+      case 3: p = bcc; break;
       default: abort ();
     }
-    
+    if (p == NULL)
+      continue;
+
     *last = rfc822_cpy_adr (p);
     while (*last)
       last = &((*last)->next);
diff --git a/pgp.h b/pgp.h
index aa866da..a16d7a8 100644
--- a/pgp.h
+++ b/pgp.h
@@ -49,7 +49,7 @@ pgp_key_t pgp_get_candidates (pgp_ring_t, LIST *);
 pgp_key_t pgp_getkeybyaddr (ADDRESS *, short, pgp_ring_t);
 pgp_key_t pgp_getkeybystr (char *, short, pgp_ring_t);
 
-char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
+char *pgp_findKeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
 
 void pgp_forget_passphrase (void);
 int pgp_application_pgp_handler (BODY *, STATE *);
diff --git a/send.c b/send.c
index 8690a86..23bcbe3 100644
--- a/send.c
+++ b/send.c
@@ -1588,7 +1588,7 @@ main_loop:
       /* save the decrypted attachments */
       clear_content = msg->content;
   
-      if ((crypt_get_keys (msg, &pgpkeylist) == -1) ||
+      if ((crypt_get_keys (msg, fcc, &pgpkeylist) == -1) ||
           mutt_protect (msg, pgpkeylist) == -1)
       {
         msg->content = mutt_remove_multipart (msg->content);
diff --git a/smime.c b/smime.c
index 437b62f..d47e344 100644
--- a/smime.c
+++ b/smime.c
@@ -747,7 +747,7 @@ void smime_getkeys (ENVELOPE *env)
  * It returns NULL if any of the keys can not be found.
  */
 
-char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
+char *smime_findKeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 {
   char *keyID, *keylist = NULL;
   size_t keylist_size = 0;
@@ -759,16 +759,19 @@ char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
 
   const char *fqdn = mutt_fqdn (1);
   
-  for (i = 0; i < 3; i++)
+  for (i = 0; i < 4; i++)
   {
     switch (i)
     {
-      case 0: p = to; break;
-      case 1: p = cc; break;
-      case 2: p = bcc; break;
+      case 0: p = from; break;
+      case 1: p = to; break;
+      case 2: p = cc; break;
+      case 3: p = bcc; break;
       default: abort ();
     }
-    
+    if (p == NULL)
+      continue;
+
     *last = rfc822_cpy_adr (p);
     while (*last)
       last = &((*last)->next);
diff --git a/smime.h b/smime.h
index b2efe61..e0b672d 100644
--- a/smime.h
+++ b/smime.h
@@ -50,7 +50,7 @@ void  smime_getkeys (ENVELOPE *);
 
 char* smime_ask_for_key (char *, char *, short);
 
-char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
+char *smime_findKeys (ADDRESS *from, ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
 
 void  smime_invoke_import (char *, char *);
 
