Index: acct_mgr/web_ui.py
===================================================================
--- acct_mgr/web_ui.py	(revision 64)
+++ acct_mgr/web_ui.py	(revision 67)
@@ -22,7 +22,7 @@
 from trac.web.api import IAuthenticator
 from trac.web.main import IRequestHandler
 from trac.web.chrome import INavigationContributor, ITemplateProvider
-from trac.util import Markup
+from trac.util.html import html
 
 from api import AccountManager
 
@@ -116,6 +116,8 @@
 
     implements(INavigationContributor, IRequestHandler, ITemplateProvider)
 
+    _form_fields = ['newsid', 'name', 'email']
+    
     _password_chars = string.ascii_letters + string.digits
     password_length = IntOption('account-manager', 'generated_password_length', 8,
                                 'Length of the randomly-generated passwords '
@@ -124,39 +126,65 @@
 
     #INavigationContributor methods
     def get_active_navigation_item(self, req):
-        return 'account'
+        return 'settings'
 
     def get_navigation_items(self, req):
-        if req.authname != 'anonymous':
-            yield 'metanav', 'account', Markup('<a href="%s">My Account</a>',
-                                               (req.href.account()))
+        yield ('metanav', 'settings',
+	    html.A('Settings', href=req.href.settings()))
 
     # IRequestHandler methods
     def match_request(self, req):
-        return req.path_info in ('/account', '/reset_password')
+        return req.path_info in ('/', '/reset_password', '/settings')
 
     def process_request(self, req):
-        if req.path_info == '/account':
-            self._do_account(req)
+        if req.path_info == '/settings' or req.path_info == '/':
+	    req.hdf['title'] = 'Settings'
+	    req.hdf['settings'] = req.session
+    	    if req.authname == 'anonymous':
+		req.hdf['settings.session_id'] = req.session.sid
+            self._do_settings(req)
             return 'account.cs', None
         elif req.path_info == '/reset_password':
             self._do_reset_password(req)
             return 'reset_password.cs', None
 
-    def _do_account(self, req):
-        if req.authname == 'anonymous':
-            req.redirect(self.env.href.wiki())
+    def _do_settings(self, req):
         action = req.args.get('action')
+
         if req.method == 'POST':
-            if action == 'change_password':
-                self._do_change_password(req)
-            elif action == 'delete':
-                self._do_delete(req)
+	    if action == 'save_settings':
+		self._do_save_settings(req)
+	    elif action == 'load_settings':
+		self._do_load_settings(req)
+	    else:
+	        if req.authname == 'anonymous':
+		    req.redirect(self.env.href.wiki())
+	        else:
+		    if action == 'change_password':
+    		        self._do_change_password(req)
+    		    elif action == 'delete':
+            	        self._do_delete(req)
 
+    def _do_save_settings(self, req):
+	for field in self._form_fields:
+	    val = req.args.get(field)
+	    if val:
+		if field == 'newsid' and val:
+		    req.session.change_sid(val)
+		else:
+		    req.session[field] = val
+	req.redirect(req.href.settings())
+
+    def _do_load_settings(self, req):
+	if req.authname == 'anonymous':
+	    oldsid = req.args.get('loadsid')
+	    req.session.get_session(oldsid)
+	req.redirect(req.href.settings())
+    
     def _do_reset_password(self, req):
         if req.authname != 'anonymous':
             req.hdf['reset.logged_in'] = True
-            req.hdf['account_href'] = req.href.account()
+            req.hdf['settings_href'] = req.href.settings()
             return
         if req.method == 'POST':
             username = req.args.get('username')
@@ -233,8 +261,8 @@
 
     def get_navigation_items(self, req):
         if req.authname == 'anonymous':
-            yield 'metanav', 'register', Markup('<a href="%s">Register</a>',
-                                                (self.env.href.register()))
+            yield ('metanav', 'register',
+		html.A('Register', href=self.env.href.register()))
 
     # IRequestHandler methods
 
Index: acct_mgr/templates/account.cs
===================================================================
--- acct_mgr/templates/account.cs	(revision 64)
+++ acct_mgr/templates/account.cs	(revision 67)
@@ -3,14 +3,10 @@
 
 <div id="ctxtnav" class="nav"></div>
 
-<div id="content" class="register">
+<div id="content" class="settings">
 
- <h1>My Account</h1>
+ <h1>Account Settings, Session Management</h1>
 
- <p>
- Manage your user account.
- </p>
-
  <?cs if account.error ?>
  <div class="system-message">
   <h2>Error</h2>
@@ -22,8 +18,67 @@
  <p><?cs var:account.message ?></p>
  <?cs /if ?>
 
+ <h2>Personal Information</h2>
+
+ <p>
+ Customize and personalize your Trac settings. 
+ </p>
+
  <form method="post" action="">
   <div>
+   <input type="hidden" name="action" value="save_settings" />
+   <label for="name">Name:</label>
+   <input type="text" id="name" name="name" class="textwidget" size="30"
+          value="<?cs var:settings.name ?>" />
+  </div>
+  <div>
+   <label for="email">Email:</label>
+   <input type="text" id="email" name="email" class="textwidget" size="30"
+          value="<?cs var:settings.email ?>" />
+  </div><?cs
+  if:settings.session_id ?>
+   <h3>Session</h3>
+   <div>
+    <label for="newsid">Session Key:</label>
+    <input type="text" id="newsid" name="newsid" class="textwidget" size="30"
+            value="<?cs var:settings.session_id ?>" />
+    <p>The session key is used to identify stored  custom settings and session
+    data on the server. Automatically generated by default, you may change it
+    to something easier to remember at any time if you wish to use your settings
+    in a different web browser.</p>
+    </div><?cs
+  /if ?>
+  <div>
+   <br />
+   <input type="submit" value="Submit changes" />
+  </div>
+ </form><?cs
+ if:settings.session_id ?>
+  <hr />
+  <h2>Load Session</h2>
+  <p>You may load a previously created session by entering the corresponding
+  session key below and clicking 'Recover'. This lets you share settings between
+  multiple computers and/or web browsers.</p>
+  <form method="post" action="">
+   <div>
+    <input type="hidden" name="action" value="load_settings" />
+    <label for="loadsid">Existing Session Key:</label>
+    <input type="text" id="loadsid" name="loadsid" class="textwidget" size="30"
+           value="" />
+    <input type="submit" value="Recover" />
+   </div>
+  </form><?cs
+ /if ?>
+ <?cs if:trac.authname != "anonymous" ?>
+ <hr />
+ <h2>Password management</h2>
+
+ <p>
+ This allows you to change your currently used password.
+ </p>
+
+ <form method="post" action="">
+  <div>
    <input type="hidden" name="action" value="change_password" />
    <label for="password">New Password:</label>
    <input type="password" id="password" name="password" class="textwidget"
@@ -37,12 +92,20 @@
   <input type="submit" value="Change password" />
  </form>
 
+ <hr />
+ <h2>Delete your account</h2>
+ 
+ <p>
+ To permanently remove your account from the server press the button
+ below.
+ </p>
+ 
  <form method="post" action=""
        onsubmit="return confirm('Are you sure you want to delete your account?');">
   <input type="hidden" name="action" value="delete" />
   <input type="submit" value="Delete account" />
  </form>
-
+ <?cs /if ?>
 </div>
 
 <?cs include:"footer.cs"?>
Index: acct_mgr/templates/reset_password.cs
===================================================================
--- acct_mgr/templates/reset_password.cs	(revision 64)
+++ acct_mgr/templates/reset_password.cs	(revision 67)
@@ -12,7 +12,7 @@
   <h2>Already logged in</h2>
   <p>
    You're already logged in.  If you need to change your password please use
-   the <a href="<?cs var:account_href ?>">My Account</a> page.
+   the <a href="<?cs var:settings_href ?>">Settings</a> page.
   </p>
  </div>
  <?cs elif reset.sent_to_email ?>
