diff -c -r sendmail-8.13.0/sendmail/parseaddr.c sendmail-8.13.0-lmtp/sendmail/parseaddr.c
*** sendmail-8.13.0/sendmail/parseaddr.c	Tue May 18 16:01:54 2004
--- sendmail-8.13.0-lmtp/sendmail/parseaddr.c	Mon Jul 26 22:26:43 2004
***************
*** 2120,2126 ****
  	if (a->q_host != NULL && !bitnset(M_HST_UPPER, m->m_flags))
  		makelower(a->q_host);
  	if (!bitnset(M_USR_UPPER, m->m_flags))
! 		makelower(a->q_user);
  
  	if (tTd(24, 6))
  	{
--- 2120,2129 ----
  	if (a->q_host != NULL && !bitnset(M_HST_UPPER, m->m_flags))
  		makelower(a->q_host);
  	if (!bitnset(M_USR_UPPER, m->m_flags))
! 		if (bitnset(M_PLUSSED_USER, m->m_flags))
! 		       makelowerplus(a->q_user);
! 		else
! 		       makelower(a->q_user);
  
  	if (tTd(24, 6))
  	{
diff -c -r sendmail-8.13.0/sendmail/recipient.c sendmail-8.13.0-lmtp/sendmail/recipient.c
*** sendmail-8.13.0/sendmail/recipient.c	Mon Oct  6 16:37:56 2003
--- sendmail-8.13.0-lmtp/sendmail/recipient.c	Wed Jul 21 21:38:23 2004
***************
*** 952,957 ****
--- 952,968 ----
  		SM_MBDB_T user;
  		int status;
  
+ 		/*
+ 		**  If we are supporting plussed users, scan for a plus sign
+ 		**  and replace it with a null character.
+ 		*/
+ 
+ 		if (bitnset(M_PLUSSED_USER, m->m_flags))
+ 		{
+ 		    for (p = buf; *p != '\0' && *p != '+'; p++);
+ 		    *p = '\0';
+ 		}
+ 
  		/* warning -- finduser may trash buf */
  		status = finduser(buf, &fuzzy, &user);
  		switch (status)
diff -c -r sendmail-8.13.0/sendmail/sendmail.h sendmail-8.13.0-lmtp/sendmail/sendmail.h
*** sendmail-8.13.0/sendmail/sendmail.h	Thu Jun  3 14:21:45 2004
--- sendmail-8.13.0-lmtp/sendmail/sendmail.h	Mon Jul 26 22:31:12 2004
***************
*** 458,463 ****
--- 458,464 ----
  #define M_HOLD		'%'	/* Hold delivery until ETRN/-qI/-qR/-qS */
  #define M_PLUS		'+'	/* Reserved: Used in mc for adding new flags */
  #define M_MINUS		'-'	/* Reserved: Used in mc for removing flags */
+ #define M_PLUSSED_USER	'&'	/* allow plussed users, use with 'w' flag */
  
  /* functions */
  extern void	initerrmailers __P((void));
***************
*** 2487,2492 ****
--- 2488,2494 ----
  extern void	logundelrcpts __P((ENVELOPE *, char *, int, bool));
  extern char	lower __P((int));
  extern void	makelower __P((char *));
+ extern void	makelowerplus __P((char *));
  extern int	makeconnection_ds __P((char *, MCI *));
  extern int	makeconnection __P((char *, volatile unsigned int, MCI *, ENVELOPE *, time_t));
  extern void	makeworkgroups __P((void));
diff -c -r sendmail-8.13.0/sendmail/util.c sendmail-8.13.0-lmtp/sendmail/util.c
*** sendmail-8.13.0/sendmail/util.c	Fri Mar 26 14:01:10 2004
--- sendmail-8.13.0-lmtp/sendmail/util.c	Thu Jul 22 00:07:19 2004
***************
*** 924,929 ****
--- 924,956 ----
  			*p = tolower(c);
  }
  /*
+ **  MAKELOWERPLUS -- Translate a line into lower case up to the '+'
+ **
+ **      Parameters:
+ **              p -- the string to translate.  If NULL, return is
+ **                      immediate.
+ **                      the string to lowercase.
+ **
+ **      Returns:
+ **              none.
+ **
+ **      Side Effects:
+ **              String pointed to by p is translated to lower case.
+ */
+ 
+ void
+ makelowerplus(p)
+ 	register char *p;
+ {
+ 	register char c;
+ 
+ 	if (p == NULL)
+ 		return;
+ 	for (; (c = *p) != '\0' && c != '+'; p++)
+ 		if (isascii(c) && isupper(c))
+ 			*p = tolower(c);
+ }
+ /*
  **  FIXCRLF -- fix <CR><LF> in line.
  **
  **	Looks for the <CR><LF> combination and turns it into the
