diff -uNr CMFPlone.orig/MembershipTool.py CMFPlone/MembershipTool.py
--- CMFPlone.orig/MembershipTool.py	2003-09-09 05:42:53.000000000 +0100
+++ CMFPlone/MembershipTool.py	2004-01-10 16:16:10.000000000 +0000
@@ -115,7 +115,7 @@
             # Create Member's home page.
             # go get the home page text from the skin
             try:
-                member_content = self.homePageText()
+                member_content = self.homePageText() % member_id
             except:
                 member_content = DEFAULT_MEMBER_CONTENT % member_id
 
diff -uNr CMFPlone.orig/MembershipTool.py~ CMFPlone/MembershipTool.py~
--- CMFPlone.orig/MembershipTool.py~	1970-01-01 01:00:00.000000000 +0100
+++ CMFPlone/MembershipTool.py~	2003-09-09 05:42:53.000000000 +0100
@@ -0,0 +1,211 @@
+from Products.CMFCore.utils import getToolByName, _checkPermission
+from Products.CMFDefault.MembershipTool import MembershipTool as BaseTool
+from Products.CMFDefault.Document import addDocument
+from Products.CMFPlone.PloneFolder import addPloneFolder
+from Acquisition import aq_base
+
+default_portrait = 'defaultUser.gif'
+
+DEFAULT_MEMBER_CONTENT = """\
+Default page for %s
+
+  This is the default document created for you when
+  you joined this community.
+
+  To change the content just click the 'edit'
+  tab above.
+"""
+        
+class MembershipTool( BaseTool ):
+    """ Plone customized Membership Tool """
+    meta_type='Plone Membership Tool'
+    plone_tool = 1
+    personal_id = '.personal'
+    portrait_id = 'MyPortrait'
+    default_portrait = 'defaultUser.gif'
+    
+    def getPersonalPortrait(self, member_id=None, verifyPermission=0):
+        """
+        returns the Portait for a member_id
+        """
+        portrait=None
+        personal=self.getPersonalFolder(member_id)
+
+        if personal:
+            portrait=getattr( personal
+                            , self.portrait_id
+                            , None )
+            if verifyPermission and not _checkPermission('View', portrait):
+                return None
+        if portrait is None:
+            portal = getToolByName(self, 'portal_url').getPortalObject()
+            portrait = getattr(portal, default_portrait)
+
+        return portrait
+
+    def getPersonalFolder(self, member_id=None):
+        """
+        returns the Personal Item folder for a member
+        if no Personal Folder exists will return None
+        """
+        home=self.getHomeFolder(member_id)
+        personal=None
+        if home:
+            personal=getattr( home
+                            , self.personal_id
+                            , None )
+        return personal
+
+    def changeMemberPortrait(self, portrait, member_id=None):
+        """ 
+        given a portrait we will modify the users portrait
+        we put this method here because we do not want
+        .personal or portrait in the catalog
+
+        portraits are $MemberHomeFolder/.personal/MyPortrait
+        """
+        if portrait and portrait.filename:
+            catalog=getToolByName(self, 'portal_catalog')
+            personal=self.getPersonalFolder(member_id)
+            if not personal:
+                home=self.getHomeFolder(member_id)
+                home.invokeFactory(id=self.personal_id, type_name='Folder')
+                personal=getattr(home, self.personal_id)
+                catalog.unindexObject(personal) #remove persona folder from catalog
+            if hasattr(personal, self.portrait_id):
+                personal.manage_delObjects(self.portrait_id)
+            personal.invokeFactory(id=self.portrait_id, type_name='Image')
+            portrait_obj=getattr(personal, self.portrait_id, None)
+            portrait_obj.edit(file=portrait)
+            catalog.unindexObject(portrait_obj) #remove portrait image from catalog
+                
+    def createMemberarea(self, member_id):
+        """
+        since we arent using PortalFolders and invokeFactory will not work
+        we must do all of this ourself. ;(
+        """
+        parent = self.aq_inner.aq_parent
+        members =  getattr(parent, 'Members', None)
+
+        if members is None:
+            parent.manage_addPloneFolder(id='Members', title='Members')
+            members = getattr(parent, 'Members', None)
+            
+        if members is not None and not hasattr(members, member_id):
+            f_title = "%s's Home" % member_id
+            try:
+                addPloneFolder(members, id=member_id, title=f_title)
+            except:
+                members.manage_addPloneFolder(id=member_id, title=f_title)
+            f=getattr(members, member_id)
+            # Grant ownership to Member
+            acl_users = self.__getPUS()
+            user = acl_users.getUser(member_id)
+            if user is not None:
+                user= user.__of__(acl_users)
+            else:
+                from AccessControl import getSecurityManager
+                user= getSecurityManager().getUser()
+                # check that we do not do something wrong
+                if user.getUserName() != member_id:
+                    raise NotImplementedError, \
+                        'cannot get user for member area creation'
+            f.changeOwnership(user)
+            f.manage_setLocalRoles(member_id, ['Owner'])
+            # Create Member's home page.
+            # go get the home page text from the skin
+            try:
+                member_content = self.homePageText()
+            except:
+                member_content = DEFAULT_MEMBER_CONTENT % member_id
+
+            addDocument( f
+                       , 'index_html'
+                       , member_id+"'s Home Page"
+                       , member_id+"'s front page"
+                       , "structured-text"
+                       , member_content
+                       )
+
+            f.index_html._setPortalTypeName( 'Document' )
+            # Overcome an apparent catalog bug.
+            f.index_html.reindexObject()
+            wftool = getToolByName( f, 'portal_workflow' )
+            wftool.notifyCreated( f.index_html )
+            #XXX the above is copy/pasted from CMFDefault.MembershipTool only because
+            #its not using invokeFactory('Folder') -- FIX IT!
+            
+            #XXX Below is what really is Plone customizations
+            member_folder=self.getHomeFolder(member_id)
+            member_folder.description = 'Home page area that contains the items created and ' \
+                                        + 'collected by %s' % member_id
+        
+            member_folder.manage_addPloneFolder('.personal', 'Personal Items')
+            personal=getattr(member_folder, '.personal')
+            personal.description = "contains personal workarea items for %s" % member_id
+            personal.changeOwnership(user)
+            personal.manage_setLocalRoles(member_id, ['Owner'])
+            
+            catalog = getToolByName(self, 'portal_catalog')
+            catalog.unindexObject(personal) #dont add .personal folders to catalog
+
+            # Hook to allow doing other things after memberarea creation.
+            notify_script = getattr(member_folder, 'notifyMemberAreaCreated', None)
+
+            if notify_script is not None:
+                notify_script()
+
+    # this should probably be in MemberDataTool.py
+    #security.declarePublic( 'searchForMembers' )
+    def searchForMembers( self, REQUEST=None, **kw ):
+        """ """
+        if REQUEST:
+            dict = REQUEST
+        else:
+            dict = kw
+        
+        name = dict.get('name', None)
+        email = dict.get('email', None)
+        roles = dict.get('roles', None)
+        last_login_time = dict.get('last_login_time', None)
+        is_manager = self.checkPermission('Manage portal', self)
+            
+        if name:
+            name = name.strip().lower()
+        if not name:
+            name = None
+        if email:
+            email = email.strip().lower()
+        if not email:
+            email = None
+
+
+        md = self.portal_memberdata
+        
+        res = []
+        portal = self.portal_url.getPortalObject()
+        for u in portal.acl_users.getUsers():
+            user = md.wrapUser(u)
+            if not (user.listed or is_manager):
+                continue
+            if name:
+                if (u.getUserName().lower().find(name) == -1) and (user.fullname.lower().find(name) == -1):
+                    continue
+            if email:
+                if user.email.lower().find(email) == -1:
+                    continue
+            if roles:
+                user_roles = user.getRoles()
+                found = 0
+                for r in roles:
+                    if r in user_roles:
+                        found = 1
+                        break
+                if not found:
+                    continue
+            if last_login_time:
+                if user.last_login_time < last_login_time:
+                    continue
+            res.append(user)
+
+        return res
