diff -Naur -ur -x '*.pyc' mailman-2.1.13/bin//newlist mailman_patch_2.1.13/bin//newlist
--- mailman-2.1.13/bin//newlist	2011-06-23 19:40:28.000000000 +0000
+++ mailman_patch_2.1.13/bin//newlist	2011-06-23 19:39:07.000000000 +0000
@@ -164,7 +164,8 @@
 
     if '@' in listname:
         # note that --urlhost and --emailhost have precedence
-        listname, domain = listname.split('@', 1)
+        #listname, domain = listname.split('@', 1)
+	firstname, domain = listname.split('@', 1)
         urlhost = urlhost or domain
         emailhost = emailhost or mm_cfg.VIRTUAL_HOSTS.get(domain, domain)
 
diff -Naur -ur -x '*.pyc' mailman-2.1.13/bin//rmlist mailman_patch_2.1.13/bin//rmlist
--- mailman-2.1.13/bin//rmlist	2009-12-22 18:00:43.000000000 +0000
+++ mailman_patch_2.1.13/bin//rmlist	2011-06-23 19:39:07.000000000 +0000
@@ -92,6 +92,11 @@
         usage(1)
     listname = args[0].lower().strip()
 
+    if '@' in listname:
+        # note that --urlhost and --emailhost have precedence
+        firstname, domain = listname.split('@', 1)
+	listname = '%s-%s' % ( firstname, domain )
+
     removeArchives = False
     for opt, arg in opts:
         if opt in ('-a', '--archives'):
diff -Naur -ur -x '*.pyc' mailman-2.1.13/Mailman//Gui/General.py mailman_patch_2.1.13/Mailman//Gui/General.py
--- mailman-2.1.13/Mailman//Gui/General.py	2009-12-22 18:00:43.000000000 +0000
+++ mailman_patch_2.1.13/Mailman//Gui/General.py	2011-06-23 19:39:14.000000000 +0000
@@ -426,7 +426,7 @@
 
     def _setValue(self, mlist, property, val, doc):
         if property == 'real_name' and \
-               val.lower() <> mlist.internal_name().lower():
+               val.lower() <> mlist.real_name.lower():
             # These values can't differ by other than case
             doc.addError(_("""<b>real_name</b> attribute not
             changed!  It must differ from the list's name by case
diff -Naur -ur -x '*.pyc' mailman-2.1.13/Mailman//Handlers/CookHeaders.py mailman_patch_2.1.13/Mailman//Handlers/CookHeaders.py
--- mailman-2.1.13/Mailman//Handlers/CookHeaders.py	2009-12-22 18:00:43.000000000 +0000
+++ mailman_patch_2.1.13/Mailman//Handlers/CookHeaders.py	2011-06-23 19:39:16.000000000 +0000
@@ -180,7 +180,9 @@
     if msgdata.get('_nolist') or not mlist.include_rfc2369_headers:
         return
     # This will act like an email address for purposes of formataddr()
-    listid = '%s.%s' % (mlist.internal_name(), mlist.host_name)
+    #listid = '%s.%s' % (mlist.internal_name(), mlist.host_name)
+    # internal_name already contains the hostname with the vhost patch
+    listid = mlist.internal_name()
     cset = Utils.GetCharSet(mlist.preferred_language)
     if mlist.description:
         # Don't wrap the header since here we just want to get it properly RFC
diff -Naur -ur -x '*.pyc' mailman-2.1.13/Mailman//MailList.py mailman_patch_2.1.13/Mailman//MailList.py
--- mailman-2.1.13/Mailman//MailList.py	2009-12-22 18:00:43.000000000 +0000
+++ mailman_patch_2.1.13/Mailman//MailList.py	2011-06-23 19:39:09.000000000 +0000
@@ -185,9 +185,15 @@
         return self._full_path
 
     def getListAddress(self, extra=None):
-        if extra is None:
-            return '%s@%s' % (self.internal_name(), self.host_name)
-         return '%s-%s@%s' % (self.internal_name(), extra, self.host_name)
+        posting_addr = self.internal_name()
+        try:
+            posting_addr = self.real_name.lower()
+        except:
+            pass
+        if extra is None:
+            return '%s@%s' % (posting_addr, self.host_name)
+        return '%s-%s@%s' % (posting_addr, extra, self.host_name)
 
     # For backwards compatibility
     def GetBouncesEmail(self):
@@ -488,11 +494,20 @@
         # the admin's email address, so transform the exception.
         if emailhost is None:
             emailhost = mm_cfg.DEFAULT_EMAIL_HOST
-        postingaddr = '%s@%s' % (name, emailhost)
+        # default, for when no domain is given
+        firstname = name
+        # we set a special name for virtual hosted lists
+        if '@' in name:
+            firstname, emailhost = name.split('@', 1)
+            name = "%s-%s" % (firstname, emailhost)
+        # but we keep a sensible posting address
+        postingaddr = '%s@%s' % (firstname, emailhost)
         try:
             Utils.ValidateEmail(postingaddr)
         except Errors.EmailAddressError:
             raise Errors.BadListNameError, postingaddr
+        if Utils.list_exists(name):
+            raise Errors.MMListAlreadyExistsError, name
         # Validate the admin's email address
         Utils.ValidateEmail(admin)
         self._internal_name = name
@@ -501,6 +516,10 @@
         self.__lock.lock()
         self.InitVars(name, admin, crypted_password)
         self.CheckValues()
+        # this is for getListAddress
+        self.list_address = postingaddr
+        self.real_name = firstname
+        self.subject_prefix = mm_cfg.DEFAULT_SUBJECT_PREFIX % self.__dict__
         if langs is None:
             self.available_languages = [self.preferred_language]
         else:
@@ -1341,7 +1360,7 @@
         addresses in the recipient headers.
         """
         # This is the list's full address.
-        listfullname = '%s@%s' % (self.internal_name(), self.host_name)
+        listfullname = self.getListAddress()
         recips = []
         # Check all recipient addresses against the list's explicit addresses,
         # specifically To: Cc: and Resent-to:
@@ -1356,7 +1375,7 @@
             addr = addr.lower()
             localpart = addr.split('@')[0]
             if (# TBD: backwards compatibility: deprecated
-                    localpart == self.internal_name() or
+                    localpart == self.real_name.lower() or
                     # exact match against the complete list address
                     addr == listfullname):
                 return True
