diff -ur originals/accountmanagerplugin/trunk/acct_mgr/api.py updates/accountmanagerplugin/trunk/acct_mgr/api.py
--- originals/accountmanagerplugin/trunk/acct_mgr/api.py	2018-06-22 07:48:03.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/api.py	2023-02-21 10:23:23.815036365 +0100
@@ -101,7 +101,7 @@
     def config_key():
         """'''Deprecated''': New implementations should not use this method.
 
-        The prefered way to configure an `IPasswordStore` implemenation is by
+        The preferred way to configure an `IPasswordStore` implementation is by
         using its class name in the `password_store` option.
 
         Returns a string used to identify this implementation in the config.
@@ -126,11 +126,11 @@
     def check_password(user, password):
         """Checks if the password is valid for the user.
 
-        Returns True, if the correct user and password are specfied.
+        Returns True, if the correct user and password are specified.
         Returns False, if the incorrect password was specified.
         Returns None, if the user doesn't exist in this password store.
 
-        Note: Returing `False` is an active rejection of the login attempt.
+        Note: Returning `False` is an active rejection of the login attempt.
         Return None to let the authentication eventually fall through to
         next store in a chain.
         """
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/htfile.py updates/accountmanagerplugin/trunk/acct_mgr/htfile.py
--- originals/accountmanagerplugin/trunk/acct_mgr/htfile.py	2017-03-23 21:45:04.000000000 +0100
+++ updates/accountmanagerplugin/trunk/acct_mgr/htfile.py	2023-02-21 10:26:03.262297091 +0100
@@ -101,7 +101,7 @@
                 lines = f.readlines()
 
             # DEVEL: Beware, in shared use there is a race-condition,
-            #   since file changes by other programs that occure from now on
+            #   since file changes by other programs that occur from now on
             #   are currently not detected and will get overwritten.
             #   This could be fixed by file locking, but a cross-platform
             #   implementation is certainly non-trivial.
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/macros.py updates/accountmanagerplugin/trunk/acct_mgr/macros.py
--- originals/accountmanagerplugin/trunk/acct_mgr/macros.py	2018-06-22 07:48:03.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/macros.py	2023-02-21 10:24:43.640578842 +0100
@@ -64,7 +64,7 @@
  * '''locked''' -- alias for 'locked=True'
  * '''visit''' -- show a list of accounts with last-login information, only
  available in table format
- * '''name''' -- forces replacement of maching username with their
+ * '''name''' -- forces replacement of matching username with their
  corresponding full names, if available; adds a full names column if combined
  with 'visit'
  * '''email''' -- append email address to usernames, if available
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/opt/radius.py updates/accountmanagerplugin/trunk/acct_mgr/opt/radius.py
--- originals/accountmanagerplugin/trunk/acct_mgr/opt/radius.py	2017-03-23 21:45:04.000000000 +0100
+++ updates/accountmanagerplugin/trunk/acct_mgr/opt/radius.py	2023-02-21 10:26:54.523475326 +0100
@@ -99,7 +99,7 @@
         if pyrad.packet.AccessAccept == reply.code:
             self.log.debug("RADIUS Accept for username=%s", username)
             return True
-        # Rejection of login attempt, stopping further auth store interation.
+        # Rejection of login attempt, stopping further auth store interaction.
         elif pyrad.packet.AccessReject == reply.code:
             self.log.debug("RADIUS Reject for username=%s", username)
             return False
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/register.py updates/accountmanagerplugin/trunk/acct_mgr/register.py
--- originals/accountmanagerplugin/trunk/acct_mgr/register.py	2018-06-22 07:48:03.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/register.py	2023-02-21 10:24:13.263967458 +0100
@@ -94,7 +94,7 @@
             raise RegistrationError(_("A username with only upper-cased "
                                       "characters is not allowed."))
 
-        # Prohibit some user names, that are important for Trac and therefor
+        # Prohibit some user names, that are important for Trac and therefore
         # reserved, even if not in the permission store for some reason.
         if username.lower() in ['anonymous', 'authenticated']:
             raise RegistrationError(tag_("Username %(username)s is not "
@@ -208,7 +208,7 @@
         insert = tag.label(_("Email:"),
                            tag.input(type='text', name='email', size=20,
                                      class_='textwidget', value=old_value))
-        # Deferred import required to aviod circular import dependencies.
+        # Deferred import required to avoid circular import dependencies.
         from acct_mgr.web_ui import AccountModule
         reset_password = AccountModule(self.env).reset_password_enabled
         verify_account = self.env.is_enabled(EmailVerificationModule) and \
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/templates/account_admin.html updates/accountmanagerplugin/trunk/acct_mgr/templates/account_admin.html
--- originals/accountmanagerplugin/trunk/acct_mgr/templates/account_admin.html	2018-06-22 07:48:03.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/templates/account_admin.html	2023-02-21 10:32:36.335243558 +0100
@@ -32,7 +32,7 @@
           </py:otherwise>
           <img src="${href.chrome('/acct_mgr/info.png')}" alt="info"
                title="User ID change requires additional components enabled"
-               heigth="16" width="16" py:if="not change_uid_enabled" />
+               height="16" width="16" py:if="not change_uid_enabled" />
         </p>
       </div>
 
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/templates/account_config.html updates/accountmanagerplugin/trunk/acct_mgr/templates/account_config.html
--- originals/accountmanagerplugin/trunk/acct_mgr/templates/account_config.html	2018-06-22 07:48:03.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/templates/account_config.html	2023-02-21 10:32:00.544368273 +0100
@@ -39,7 +39,7 @@
           </span>
           <a href="$url" title="${step.image and step.label or None}">
           <img class="icon" alt="${step.label}" py:if="step.image"
-               heigth="32" width="32"
+               height="32" width="32"
                src="${href.chrome('/acct_mgr/' + step.image + '.png')}" />
           <py:if test="not step.image">$step.label</py:if>
           </a>
@@ -77,7 +77,7 @@
           </p>
           <p>
             After initial login Trac sessions are authenticated per request
-            based on browser cookies.  Therefor a number of options provide
+            based on browser cookies. Therefore a number of options provide
             control over some critical browser cookie properties.
           </p>
 
@@ -91,7 +91,7 @@
             </label>
             <p class="hint" i18n:msg="">
               Adapt to careless username typing, where casing does not matter,
-              like on Windows.  Potentially troublesome, because <tt>case
+              like on Windows. Potentially troublesome, because <tt>case
               matters for Trac permission assignment lookup</tt> anyway.
             </p>
           </div>
@@ -103,7 +103,7 @@
               Check IP address for authentication.
             </label>
             <p class="hint">
-              Potentially troublesome for users with dynamic IP adress, but
+              Potentially troublesome for users with dynamic IP address, but
               disregarded for persistent sessions.
             </p>
           </div>
@@ -140,7 +140,7 @@
             <p class="hint">
               Determines how long the browser will cache authentication
               information, and therefore, after how much inactivity a user
-              will have to log in again.  Default (0&nbsp;s) makes cookie
+              will have to log in again. Default (0&nbsp;s) makes cookie
               expire at browsing sessions end.
             </p>
           </div>
@@ -201,7 +201,7 @@
                 </ul>
                 <p class="hint">
                   that normally reside in Trac's meta-navigation bar, will
-                  appear inside the login form.  CSS styling allows further
+                  appear inside the login form. CSS styling allows further
                   customization of the login prompt.
                 </p>
               </i18n:msg>
@@ -230,7 +230,7 @@
               </label>
               <p class="hint" i18n:msg="">
                 Driving a refresh process to decrease vulnerability of
-                long-lasting sessions.  Zero means <strong>never</strong>.
+                long-lasting sessions. Zero means <strong>never</strong>.
               </p>
             </div>
             <div class="field">
@@ -284,7 +284,7 @@
                 </p>
                 <p class="hint">
                   While great to resolve some concurrent access issues too,
-                  this password store has shortcomings as well.  Notably it
+                  this password store has shortcomings as well. Notably it
                   does not support seamless hash type migration, and its no
                   candidate for shared use by multiple Trac instances or even
                   by applications beyond Trac.
@@ -396,7 +396,7 @@
                 </label>
                 <p class="hint" i18n:msg="">
                   AccountManagerPlugin enables use of standard HTTP-Auth
-                  by its <strong>HttpAuthStore</strong> component.  Both
+                  by its <strong>HttpAuthStore</strong> component. Both
                   Basic and Digest authentication challenges are supported.
                 </p>
                 <p class="hint">
@@ -428,9 +428,9 @@
                 <p class="hint">
                   AccountManagerPlugin's modular password store concept
                   encourages creation of more ways to provide user credential
-                  beyond the natively supported stores.  While specific setup
+                  beyond the natively supported stores. While a specific setup
                   assistance for these 3rd-party authentication providers is not
-                  implemented, you may fill-in approprate configuration details
+                  implemented, you may fill-in appropriate configuration details
                   for an already installed component below.
                 </p>
               </div>
@@ -524,7 +524,7 @@
                   primary password store.
                 </p>
                 <p class="hint">
-                  The update will run only once.  Restarting the procedure
+                  The update will run only once. Restarting the procedure
                   for all accounts allows to propagate subsequent changes.
                 </p>
                 <div class="buttons">
@@ -595,8 +595,8 @@
             <h3>Objective for Account Registration and Verification rules</h3>
             <p>
               You may require administrative approval of new accounts for the
-              user registration process.  The ability to immediately ban
-              existing accounts is another, related but independed feature.
+              user registration process. The ability to immediately ban
+              existing accounts is another, related but independent feature.
             </p>
             <div class="field">
               <label>
@@ -650,7 +650,7 @@
               Concurrent use of multiple registration checks is encouraged.
             </p>
             <p class="hint">
-              Checks are applied in turn, so order matters.  Note that some
+              Checks are applied in turn, so order matters. Note that some
               checks are used to validate admin user actions too.
             </p>
 
@@ -737,9 +737,9 @@
             <h3>Objective for Account Protection rules</h3>
             <p>
               Passwords are often not constructed as carefully as they should
-              be.  And even a strong passphrase could be sift out, if an
+              be. And even a strong passphrase could be sift out, if an
               attacker is able to test millions of variants in hours, if not
-              seconds.  Firewalls and full-featured web-servers already offer
+              seconds. Firewalls and full-featured web-servers already offer
               sophisticated protection, if one can afford them, handle their
               installation, configuration and maintenance.
             </p>
@@ -774,7 +774,7 @@
                 </label>
                 <p class="hint" i18n:msg="">
                   Lock user account after the specified number of failed
-                  attempts.  Value zero means <strong>no limit</strong>.
+                  attempts. Value zero means <strong>no limit</strong>.
                 </p>
               </div>
               <div id="user_lock_time">
@@ -806,7 +806,7 @@
                     </p>
                     <p class="hint">
                       Lock time will grow for any value > 1, if the failure
-                      happens before lock expiration.  I.e. value '2' means
+                      happens before lock expiration. I.e. value '2' means
                     </p>
                     <ul i18n:msg="">
                       <li><span class="hint">
@@ -866,9 +866,9 @@
                 <legend>Add Admin Account:</legend>
                 <p i18n:msg="">
                   The user will get <strong>TRAC_ADMIN</strong> assigned, that
-                  inherits all available permissions.  One such account is
-                  required to configure Trac via the admin web-UI.  Create and
-                  manage more limitted admin accounts as well as actual user
+                  inherits all available permissions. One such account is
+                  required to configure Trac via the admin web-UI. Create and
+                  manage more limited admin accounts as well as actual user
                   accounts on your own later via the Accounts admin panel.
                 </p>
                 <p class="hint" i18n:msg="">
@@ -877,7 +877,7 @@
                   administration, <strong>ACCTMGR_CONFIG_ADMIN</strong> for
                   viewing these pages and changing the configuration later.
                   Both are inherited by <strong>ACCTMGR_ADMIN</strong>
-                  permission.  To assign permissions you'll need
+                  permission. To assign permissions you'll need
                   <strong>PERMISSION_GRANT</strong> inherited by
                   <strong>PERMISSION_ADMIN</strong> too.
                 </p>
@@ -936,7 +936,7 @@
                 By now you did almost finish AccountManagerPlugin
                 configuration, but any changes are temporary yet. Please test
                 and adjust the configuration as required, or cancel to revert
-                all changes.  Apply settings to <em>trac.ini</em> only if you
+                all changes. Apply settings to <em>trac.ini</em> only if you
                 really want to preserve them permanently.
               </p>
               <!--! Final configuration preview listing -->
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/templates/account_prefs.html updates/accountmanagerplugin/trunk/acct_mgr/templates/account_prefs.html
--- originals/accountmanagerplugin/trunk/acct_mgr/templates/account_prefs.html	2018-06-22 07:48:03.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/templates/account_prefs.html	2023-02-21 10:32:38.267186488 +0100
@@ -48,7 +48,7 @@
      </script>
   </head>
 
-  <!--! Commont content, will get wrapped in a form with 'save' button -->
+  <!--! Common content, will get wrapped in a form with 'save' button -->
   <body>
     <h2>Change Password</h2>
     <div class="field">
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/tests/guard.py updates/accountmanagerplugin/trunk/acct_mgr/tests/guard.py
--- originals/accountmanagerplugin/trunk/acct_mgr/tests/guard.py	2020-01-31 20:06:05.000000000 +0100
+++ updates/accountmanagerplugin/trunk/acct_mgr/tests/guard.py	2023-02-21 10:26:17.086609948 +0100
@@ -81,7 +81,7 @@
         self.assertEqual(self.guard.failed_count(user, ipnr), 2)
         # Read failed attempts.
         self.assertEqual(self.guard.failed_count(user, ipnr, None), 2)
-        # Reset failed attempts, returning deleted attemps.
+        # Reset failed attempts, returning deleted attempts.
         self.assertEqual(self.guard.failed_count(user, reset=True), 2)
         self.assertEqual(self.guard.failed_count(user, reset=None), 0)
 
diff -ur originals/accountmanagerplugin/trunk/acct_mgr/web_ui.py updates/accountmanagerplugin/trunk/acct_mgr/web_ui.py
--- originals/accountmanagerplugin/trunk/acct_mgr/web_ui.py	2020-08-17 19:55:43.000000000 +0200
+++ updates/accountmanagerplugin/trunk/acct_mgr/web_ui.py	2023-02-21 10:21:56.441633721 +0100
@@ -143,7 +143,7 @@
         if not req.authname or req.authname == 'anonymous':
             if req.path_info == '/prefs/account':
                 # An anonymous session has no account associated with it, and
-                # no account properies too, but general session preferences
+                # no account properties either, but general session preferences
                 # should always be available.
                 req.redirect(req.href.prefs())
             elif req.path_info == '/prefs/advanced' and req.method == 'POST':
@@ -299,7 +299,7 @@
             try:
                 self.acctmgr.delete_user(username)
             except NotificationError, e:
-                # User wont care for notification, only care for logging here.
+                # User won't care for notification, but only for logging here.
                 self.log.error(
                     "Unable to send account deletion notification: "
                     "%s", exception_to_unicode(e, traceback=True))
@@ -422,7 +422,7 @@
         after processing login form input. Otherwise it will only be set,
         if unset at the time of authentication.""")
 
-    # Update cookies for persistant sessions only 1/day.
+    # Update cookies for persistent sessions only 1/day.
     #   hex_entropy returns 32 chars per call equal to 128 bit of entropy,
     #   so it should be technically impossible to explore the hash even within
     #   a year by just throwing forged HTTP requests at the server.
@@ -559,7 +559,7 @@
         name = None
         # Replicate _get_name_for_cookie() or _cookie_to_name() since Trac 1.0
         # adding special handling of persistent sessions, as the user may have
-        # a dynamic IP adress and this would lead to the user being logged out
+        # a dynamic IP address and this would lead to the user being logged out
         # due to an IP address conflict.
         if 'trac_auth_session' in req.incookie or True:
             sql = "SELECT name FROM auth_cookie WHERE cookie=%s AND ipnr=%s"
@@ -733,7 +733,7 @@
         """Determine "path" cookie property from setting or request object."""
         return self.auth_cookie_path or req.base_path or '/'
 
-    # Keep this code in a separate methode to be able to expire the session
+    # Keep this code in a separate method to be able to expire the session
     # cookie trac_auth_session independently of the trac_auth cookie.
     def _expire_session_cookie(self, req):
         """Instruct the user agent to drop the session cookie.
