Index: trac/db_default.py
===================================================================
--- trac/db_default.py	(revision 2865)
+++ trac/db_default.py	(working copy)
@@ -18,7 +18,7 @@
 from trac.db import Table, Column, Index
 
 # Database version identifier. Used for automatic upgrades.
-db_version = 16
+db_version = 17
 
 def __mkreports(reports):
     """Utility function used to create report data in same syntax as the
@@ -83,11 +83,11 @@
         Column('author'),
         Column('message'),
         Index(['time'])],
-    Table('node_change', key=('rev', 'path', 'change'))[
+    Table('node_change', key=('rev', 'path', 'change_type'))[
         Column('rev'),
         Column('path'),
-        Column('kind', size=1),
-        Column('change', size=1),
+        Column('node_type', size=1),
+        Column('change_type', size=1),
         Column('base_path'),
         Column('base_rev'),
         Index(['rev'])],
Index: trac/versioncontrol/api.py
===================================================================
--- trac/versioncontrol/api.py	(revision 2865)
+++ trac/versioncontrol/api.py	(working copy)
@@ -207,11 +207,11 @@
     DIRECTORY = "dir"
     FILE = "file"
 
-    def __init__(self, path, rev, kind):
-        assert kind in (Node.DIRECTORY, Node.FILE), "Unknown node kind %s" % kind
+    def __init__(self, path, rev, node_type):
+        assert node_type in (Node.DIRECTORY, Node.FILE), "Unknown node node_type %s" % node_type
         self.path = str(path)
         self.rev = rev
-        self.kind = kind
+        self.node_type = node_type
 
     def get_content(self):
         """
@@ -274,8 +274,8 @@
         raise NotImplementedError
     last_modified = property(lambda x: x.get_last_modified())
 
-    isdir = property(lambda x: x.kind == Node.DIRECTORY)
-    isfile = property(lambda x: x.kind == Node.FILE)
+    isdir = property(lambda x: x.node_type == Node.DIRECTORY)
+    isfile = property(lambda x: x.node_type == Node.FILE)
 
 
 class Changeset(object):
@@ -297,10 +297,10 @@
 
     def get_changes(self):
         """
-        Generator that produces a (path, kind, change, base_rev, base_path)
+        Generator that produces a (path, node_type, change_type, base_rev, base_path)
         tuple for every change in the changeset, where change can be one of
         Changeset.ADD, Changeset.COPY, Changeset.DELETE, Changeset.EDIT or
-        Changeset.MOVE, and kind is one of Node.FILE or Node.DIRECTORY.
+        Changeset.MOVE, and node_type is one of Node.FILE or Node.DIRECTORY.
         """
         raise NotImplementedError
 
Index: trac/versioncontrol/tests/cache.py
===================================================================
--- trac/versioncontrol/tests/cache.py	(revision 2865)
+++ trac/versioncontrol/tests/cache.py	(working copy)
@@ -68,7 +68,7 @@
         self.assertEquals(('0', 41000, '', ''), cursor.fetchone())
         self.assertEquals(('1', 42000, 'joe', 'Import'), cursor.fetchone())
         self.assertEquals(None, cursor.fetchone())
-        cursor.execute("SELECT rev,path,kind,change,base_path,base_rev "
+        cursor.execute("SELECT rev,path,node_type,change_type,base_path,base_rev "
                        "FROM node_change")
         self.assertEquals(('1', 'trunk', 'D', 'A', None, None),
                           cursor.fetchone())
@@ -82,7 +82,7 @@
                        "VALUES (0,41000,'','')")
         cursor.execute("INSERT INTO revision (rev,time,author,message) "
                        "VALUES (1,42000,'joe','Import')")
-        cursor.executemany("INSERT INTO node_change (rev,path,kind,change,"
+        cursor.executemany("INSERT INTO node_change (rev,path,node_type,change_type,"
                            "base_path,base_rev) VALUES ('1',%s,%s,%s,%s,%s)",
                            [('trunk', 'D', 'A', None, None),
                             ('trunk/README', 'F', 'A', None, None)])
@@ -101,7 +101,7 @@
         cursor.execute("SELECT time,author,message FROM revision WHERE rev='2'")
         self.assertEquals((42042, 'joe', 'Update'), cursor.fetchone())
         self.assertEquals(None, cursor.fetchone())
-        cursor.execute("SELECT path,kind,change,base_path,base_rev "
+        cursor.execute("SELECT path,node_type,change_type,base_path,base_rev "
                        "FROM node_change WHERE rev='2'")
         self.assertEquals(('trunk/README', 'F', 'E', 'trunk/README', '1'),
                           cursor.fetchone())
@@ -113,7 +113,7 @@
                        "VALUES (0,41000,'','')")
         cursor.execute("INSERT INTO revision (rev,time,author,message) "
                        "VALUES (1,42000,'joe','Import')")
-        cursor.executemany("INSERT INTO node_change (rev,path,kind,change,"
+        cursor.executemany("INSERT INTO node_change (rev,path,node_type,change_type,"
                            "base_path,base_rev) VALUES ('1',%s,%s,%s,%s,%s)",
                            [('trunk', 'D', 'A', None, None),
                             ('trunk/README', 'F', 'A', None, None)])
Index: trac/versioncontrol/svn_fs.py
===================================================================
--- trac/versioncontrol/svn_fs.py	(revision 2865)
+++ trac/versioncontrol/svn_fs.py	(working copy)
@@ -40,14 +40,14 @@
         def apr_pool_clear(): pass
         Editor = object
     delta = core = dummy_svn()
-    
 
-_kindmap = {core.svn_node_dir: Node.DIRECTORY,
-            core.svn_node_file: Node.FILE}
 
+_node_type_map = {core.svn_node_dir: Node.DIRECTORY,
+                  core.svn_node_file: Node.FILE}
 
+
 application_pool = None
-    
+
 def _get_history(path, authz, fs_ptr, pool, start, end, limit=None):
     history = []
     if hasattr(repos, 'svn_repos_history2'):
@@ -93,7 +93,7 @@
     apr_pool_destroy = staticmethod(core.apr_pool_destroy)
     apr_terminate = staticmethod(core.apr_terminate)
     apr_pool_clear = staticmethod(core.apr_pool_clear)
-    
+
     def __init__(self, parent_pool=None):
         """Create a new memory pool"""
 
@@ -224,7 +224,7 @@
                   (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_MICRO)
 
         self.pool = Pool()
-        
+
         # Remove any trailing slash or else subversion might abort
         path = os.path.normpath(path).replace('\\', '/')
         self.path = repos.svn_repos_find_root_path(path, self.pool())
@@ -234,7 +234,7 @@
 
         self.repos = repos.svn_repos_open(self.path, self.pool())
         self.fs_ptr = repos.svn_repos_fs(self.repos)
-        
+
         uuid = fs.get_uuid(self.fs_ptr, self.pool())
         name = 'svn:%s:%s' % (uuid, path)
 
@@ -259,7 +259,7 @@
             pool = self.pool
         rev_root = fs.revision_root(self.fs_ptr, rev, pool())
         node_type = fs.check_path(rev_root, self.scope + path, pool())
-        return node_type in _kindmap
+        return node_type in _node_type_map
 
     def normalize_path(self, path):
         return _normalize_path(path)
@@ -410,11 +410,11 @@
             raise TracError, ('The Target for Diff is invalid: path %s'
                               ' doesn\'t exist in revision %s' \
                               % (new_path, new_rev))
-        if new_node.kind != old_node.kind:
+        if new_node.node_type != old_node.node_type:
             raise TracError, ('Diff mismatch: Base is a %s (%s in revision %s) '
                               'and Target is a %s (%s in revision %s).' \
-                              % (old_node.kind, old_path, old_rev,
-                                 new_node.kind, new_path, new_rev))
+                              % (old_node.node_type, old_path, old_rev,
+                                 new_node.node_type, new_path, new_rev))
         subpool = Pool(self.pool)
         if new_node.isdir:
             editor = DiffChangeEditor()
@@ -434,19 +434,19 @@
                                       entry_props,
                                       ignore_ancestry,
                                       subpool())
-            for path, kind, change in editor.deltas:
+            for path, node_type, change_type in editor.deltas:
                 old_node = new_node = None
-                if change != Changeset.ADD:
+                if change_type != Changeset.ADD:
                     old_node = self.get_node(posixpath.join(old_path, path),
                                              old_rev)
-                if change != Changeset.DELETE:
+                if change_type != Changeset.DELETE:
                     new_node = self.get_node(posixpath.join(new_path, path),
                                              new_rev)
                 else:
-                    kind = _kindmap[fs.check_path(old_root,
+                    node_type = _node_type_map[fs.check_path(old_root,
                                                   self.scope + old_node.path,
                                                   subpool())]
-                yield  (old_node, new_node, kind, change)
+                yield  (old_node, new_node, node_type, change_type)
         else:
             old_root = fs.revision_root(self.fs_ptr, old_rev, subpool())
             new_root = fs.revision_root(self.fs_ptr, new_rev, subpool())
@@ -471,7 +471,7 @@
 
         self.root = fs.revision_root(fs_ptr, rev, self.pool())
         node_type = fs.check_path(self.root, self.scoped_path, self.pool())
-        if not node_type in _kindmap:
+        if not node_type in _node_type_map:
             raise TracError, "No node at %s in revision %s" % (path, rev)
         self.created_rev = fs.node_created_rev(self.root, self.scoped_path,
                                                self.pool())
@@ -484,9 +484,9 @@
         #          * the node existed at (created_path,created_rev)
         # TODO: check node id
         self.rev = self.created_rev
-        
-        Node.__init__(self, path, self.rev, _kindmap[node_type])
 
+        Node.__init__(self, path, self.rev, _node_type_map[node_type])
+
     def get_content(self):
         if self.isdir:
             return None
@@ -608,7 +608,7 @@
                     revroots[b_rev] = b_root
                 change.base_path = fs.node_created_path(b_root, b_path, tmp())
                 change.base_rev = fs.node_created_rev(b_root, b_path, tmp())
-            kind = _kindmap[change.item_kind]
+            kind = _node_type_map[change.item_kind]
             path = path[len(self.scope) - 1:]
             base_path = _path_within_scope(self.scope, change.base_path)
             changes.append([path, kind, action, base_path, change.base_rev])
@@ -642,11 +642,11 @@
 # Note 2: the 'dir_baton' is the path of the parent directory
 #
 
-class DiffChangeEditor(delta.Editor): 
+class DiffChangeEditor(delta.Editor):
 
     def __init__(self):
         self.deltas = []
-    
+
     # -- svn.delta.Editor callbacks
 
     def open_root(self, base_revision, dir_pool):
Index: trac/versioncontrol/cache.py
===================================================================
--- trac/versioncontrol/cache.py	(revision 2865)
+++ trac/versioncontrol/cache.py	(working copy)
@@ -18,8 +18,8 @@
 from trac.versioncontrol import Changeset, Node, Repository, Authorizer
 
 
-_kindmap = {'D': Node.DIRECTORY, 'F': Node.FILE}
-_actionmap = {'A': Changeset.ADD, 'C': Changeset.COPY,
+_node_typemap = {'D': Node.DIRECTORY, 'F': Node.FILE}
+_change_typemap = {'A': Changeset.ADD, 'C': Changeset.COPY,
               'D': Changeset.DELETE, 'E': Changeset.EDIT,
               'M': Changeset.MOVE}
 
@@ -64,8 +64,8 @@
             authz = self.repos.authz
             self.repos.authz = Authorizer() # remove permission checking
 
-            kindmap = dict(zip(_kindmap.values(), _kindmap.keys()))
-            actionmap = dict(zip(_actionmap.values(), _actionmap.keys()))
+            node_typemap = dict(zip(_node_typemap.values(), _node_typemap.keys()))
+            change_typemap = dict(zip(_change_typemap.values(), _change_typemap.keys()))
             self.log.info("Syncing with repository (%s to %s)"
                           % (youngest_stored, self.repos.youngest_rev))
             if youngest_stored:
@@ -82,16 +82,16 @@
                                "VALUES (%s,%s,%s,%s)", (str(current_rev),
                                changeset.date, changeset.author,
                                changeset.message))
-                for path,kind,action,base_path,base_rev in changeset.get_changes():
+                for path,node_type,change_type,base_path,base_rev in changeset.get_changes():
                     self.log.debug("Caching node change in [%s]: %s"
-                                   % (current_rev, (path, kind, action,
+                                   % (current_rev, (path, node_type, change_type,
                                       base_path, base_rev)))
-                    kind = kindmap[kind]
-                    action = actionmap[action]
-                    cursor.execute("INSERT INTO node_change (rev,path,kind,"
-                                   "change,base_path,base_rev) "
+                    node_type = node_typemap[node_type]
+                    change_type = change_typemap[change_type]
+                    cursor.execute("INSERT INTO node_change (rev,path,node_type,"
+                                   "change_type,base_path,base_rev) "
                                    "VALUES (%s,%s,%s,%s,%s,%s)",
-                                   (str(current_rev), path, kind, action,
+                                   (str(current_rev), path, node_type, change_type,
                                    base_path, base_rev))
                 current_rev = self.repos.next_rev(current_rev)
             self.db.commit()
@@ -148,13 +148,13 @@
 
     def get_changes(self):
         cursor = self.db.cursor()
-        cursor.execute("SELECT path,kind,change,base_path,base_rev "
+        cursor.execute("SELECT path,node_type,change_type,base_path,base_rev "
                        "FROM node_change WHERE rev=%s "
                        "ORDER BY path", (self.rev,))
-        for path, kind, change, base_path, base_rev in cursor:
+        for path, node_type, change_type, base_path, base_rev in cursor:
             if not self.authz.has_permission(path):
                 # FIXME: what about the base_path?
                 continue
-            kind = _kindmap[kind]
-            change = _actionmap[change]
-            yield path, kind, change, base_path, base_rev
+            node_type = _node_typemap[node_type]
+            change_type = _change_typemap[change_type]
+            yield path, node_type, change_type, base_path, base_rev
Index: trac/versioncontrol/web_ui/changeset.py
===================================================================
--- trac/versioncontrol/web_ui/changeset.py	(revision 2865)
+++ trac/versioncontrol/web_ui/changeset.py	(working copy)
@@ -77,7 +77,7 @@
     # IRequestHandler methods
 
     _request_re = re.compile(r"/changeset(?:/([^/]+))?(/.*)?$")
-    
+
     def match_request(self, req):
         match = re.match(self._request_re, req.path_info)
         if match:
@@ -95,7 +95,7 @@
          * If `new_path` and `old_path` are equal (or `old_path` is omitted)
            and `new` and `old` are equal (or `old` is omitted),
            then we're about to view a revision Changeset: `chgset` is True.
-           Furthermore, if the path is not the root, the changeset is 
+           Furthermore, if the path is not the root, the changeset is
            ''restricted'' to that path (only the changes affecting that path,
            its children or its ancestor directories will be shown).
          * In any other case, the set of changes corresponds to arbitrary
@@ -103,11 +103,11 @@
            are equal, the ''restricted'' flag will also be set, meaning in this
            case that the differences between two revisions are restricted to
            those occurring on that path.
-         
+
         In any case, either path@rev pairs must exist.
         """
         req.perm.assert_permission('CHANGESET_VIEW')
-        
+
         # -- retrieve arguments
         new_path = req.args.get('new_path')
         new = req.args.get('new')
@@ -245,14 +245,14 @@
                                                         rev=diff.old_rev),
                       }
             }
-        
+
         if chgset: # Changeset Mode (possibly restricted on a path)
             path, rev = diff.new_path, diff.new_rev
 
-            # -- getting the change summary from the Changeset.get_changes 
+            # -- getting the change summary from the Changeset.get_changes
             def get_changes():
                 old_node = new_node = None
-                for npath, kind, change, opath, orev in chgset.get_changes():
+                for npath, node_type, change_type, opath, orev in chgset.get_changes():
                     if restricted and \
                            not (npath.startswith(path)      # npath is below
                                 or path.startswith(npath)): # npath is above
@@ -261,8 +261,8 @@
                         old_node = repos.get_node(opath, orev)
                     if change != Changeset.DELETE:
                         new_node = repos.get_node(npath, rev)
-                    yield old_node, new_node, kind, change
-                    
+                    yield old_node, new_node, node_type, change_type
+
             def _changeset_title(rev):
                 if restricted:
                     return 'Changeset %s for %s' % (rev, path)
@@ -314,11 +314,11 @@
                     add_link(req, 'next', next_href, _changeset_title(next_rev))
 
         else: # Diff Mode
-            # -- getting the change summary from the Repository.get_changes 
+            # -- getting the change summary from the Repository.get_changes
             def get_changes():
                 for d in repos.get_changes(**diff):
                     yield d
-                    
+
             reverse_href = self.env.href.changeset(diff.old_rev, diff.old_path,
                                                    old=diff.new_rev,
                                                    old_path=diff.new_path)
@@ -411,8 +411,8 @@
                 return []
 
         idx = 0
-        for old_node, new_node, kind, change in get_changes():
-            if change != Changeset.EDIT:
+        for old_node, new_node, node_type, change_type in get_changes():
+            if change_type != Changeset.EDIT:
                 show_entry = True
             else:
                 show_entry = False
@@ -421,7 +421,7 @@
                 if props:
                     req.hdf['changeset.changes.%d.props' % idx] = props
                     show_entry = True
-                if kind == Node.FILE:
+                if node_type == Node.FILE:
                     diffs = _content_changes(old_node, new_node)
                     if diffs != []:
                         if diffs:
@@ -429,7 +429,7 @@
                         # elif None (means: manually compare to (previous))
                         show_entry = True
             if show_entry:
-                info = _change_info(old_node, new_node, change)
+                info = _change_info(old_node, new_node, change_type)
                 req.hdf['changeset.changes.%d' % idx] = info
             idx += 1 # the sequence should be immutable
 
@@ -442,11 +442,11 @@
         req.end_headers()
 
         mimeview = Mimeview(self.env)
-        for old_node, new_node, kind, change in repos.get_changes(**diff):
+        for old_node, new_node, node_type, change_type in repos.get_changes(**diff):
             # TODO: Property changes
 
             # Content changes
-            if kind == Node.DIRECTORY:
+            if node_type == Node.DIRECTORY:
                 continue
 
             new_content = old_content = ''
@@ -463,7 +463,7 @@
                 data = new_node.get_content().read()
                 if is_binary(data):
                     continue
-                new_content = mimeview.to_utf8(data, new_node.content_type) 
+                new_content = mimeview.to_utf8(data, new_node.content_type)
                 new_node_info = (new_node.path, new_node.rev)
                 new_path = new_node.path
             else:
@@ -510,8 +510,8 @@
 
         buf = StringIO()
         zipfile = ZipFile(buf, 'w', ZIP_DEFLATED)
-        for old_node, new_node, kind, change in repos.get_changes(**diff):
-            if kind == Node.FILE and change != Changeset.DELETE:
+        for old_node, new_node, node_type, change_type in repos.get_changes(**diff):
+            if node_type == Node.FILE and change_type != Changeset.DELETE:
                 assert new_node
                 zipinfo = ZipInfo()
                 zipinfo.filename = new_node.path
@@ -523,7 +523,7 @@
         buf.seek(0, 2) # be sure to be at the end
         req.send_header("Content-Length", buf.tell())
         req.end_headers()
-        
+
         req.write(buf.getvalue())
 
     def title_for_diff(self, diff):
@@ -582,10 +582,10 @@
 
     def get_wiki_syntax(self):
         yield (
-            # [...] form: start with optional intertrac: [T... or [trac ... 
+            # [...] form: start with optional intertrac: [T... or [trac ...
             r"!?\[(?P<it_changeset>%s\s*)?" % Formatter.INTERTRAC_SCHEME +
             #  digits + optional path for the restricted changeset
-            r"\d+(?:/[^\]]*)?\]|"   
+            r"\d+(?:/[^\]]*)?\]|"
             # r... form: allow r1 but not r1:2 (handled by the log syntax)
             r"(?:\b|!)r\d+\b(?!:\d)",
             lambda x, y, z:
@@ -631,7 +631,7 @@
             old, new = pathrev(p1), pathrev(p2)
             diff = DiffArgs(old_path=old[0], old_rev=old[1],
                             new_path=new[0], new_rev=new[1])
-        else: 
+        else:
             old_path, old_rev = pathrev(params)
             new_rev = None
             if old_rev and ':' in old_rev:
@@ -640,12 +640,12 @@
                             new_path=old_path, new_rev=new_rev)
         title = self.title_for_diff(diff)
         href = formatter.href.changeset(new_path=diff.new_path or None,
-                                        new=diff.new_rev, 
+                                        new=diff.new_rev,
                                         old_path=diff.old_path or None,
                                         old=diff.old_rev)
         return '<a class="changeset" title="%s" href="%s">%s</a>' \
                % (title, href, label)
-    
+
     # ISearchProvider methods
 
     def get_search_filters(self, req):
@@ -685,7 +685,7 @@
         old_path = req.args.get('old_path')
         old_rev = req.args.get('old_rev')
 
-        # -- normalize 
+        # -- normalize
         repos = self.env.get_repository(req.authname)
         new_path = repos.normalize_path(new_path)
         new_rev = repos.normalize_rev(new_rev)
@@ -695,7 +695,7 @@
         authzperm = SubversionAuthorizer(self.env, req.authname)
         authzperm.assert_permission_for_changeset(new_rev)
         authzperm.assert_permission_for_changeset(old_rev)
-        
+
         # -- prepare rendering
         req.hdf['anydiff'] = {
             'new_path': new_path,
Index: trac/upgrades/db17.py
===================================================================
--- trac/upgrades/db17.py	(revision 0)
+++ trac/upgrades/db17.py	(revision 0)
@@ -0,0 +1,22 @@
+from trac.db import Table, Column, Index, DatabaseManager
+
+def do_upgrade(env, ver, cursor):
+    cursor.execute("CREATE TEMP TABLE node_change_old AS SELECT * FROM node_change")
+    cursor.execute("DROP TABLE node_change")
+
+    db = env.get_db_cnx()
+    node_change_table = Table('node_change', key=('rev', 'path', 'change_type'))[
+        Column('rev'),
+        Column('path'),
+        Column('node_type', size=1),
+        Column('change_type', size=1),
+        Column('base_path'),
+        Column('base_rev'),
+        Index(['rev'])]
+    db_backend, _ = DatabaseManager(env)._get_connector()
+    for stmt in db_backend.to_sql(node_change_table):
+        cursor.execute(stmt)
+
+    cursor.execute("INSERT INTO node_change (rev,path,node_type,change_type,base_path,base_rev) "
+                   "SELECT rev,path,kind,change,base_path,base_rev "
+                   "FROM node_change_old")
Index: templates/changeset.cs
===================================================================
--- templates/changeset.cs	(revision 2865)
+++ templates/changeset.cs	(working copy)
@@ -8,21 +8,21 @@
    if:changeset.chgset ?><?cs
     if:changeset.restricted ?><?cs
      set:change = "Change" ?><?cs
-    else ?><?cs 
+    else ?><?cs
      set:change = "Changeset" ?><?cs
     /if ?>
     <li class="first"><?cs
-     if:len(links.prev) ?> &larr; 
+     if:len(links.prev) ?> &larr;
       <a class="prev" href="<?cs var:links.prev.0.href ?>" title="<?cs
-       var:links.prev.0.title ?>">Previous <?cs var:change ?></a> <?cs 
+       var:links.prev.0.title ?>">Previous <?cs var:change ?></a> <?cs
      else ?>
-      <span class="missing">&larr; Previous <?cs var:change ?></span><?cs 
+      <span class="missing">&larr; Previous <?cs var:change ?></span><?cs
      /if ?>
     </li>
     <li class="last"><?cs
      if:len(links.next) ?>
       <a class="next" href="<?cs var:links.next.0.href ?>" title="<?cs
-       var:links.next.0.title ?>">Next <?cs var:change ?></a> &rarr; <?cs 
+       var:links.next.0.title ?>">Next <?cs var:change ?></a> &rarr; <?cs
      else ?>
       <span class="missing">Next <?cs var:change ?> &rarr;</span><?cs
      /if ?>
@@ -39,9 +39,9 @@
   if:changeset.chgset ?><?cs
    if:changeset.restricted ?>
     <h1>Changeset <a title="Show full changeset" href="<?cs var:changeset.href.new_rev ?>">
-      <?cs var:changeset.new_rev ?></a> 
+      <?cs var:changeset.new_rev ?></a>
      for <a title="Show entry in browser" href="<?cs var:changeset.href.new_path ?>">
-      <?cs var:changeset.new_path ?></a> 
+      <?cs var:changeset.new_path ?></a>
     </h1><?cs
    else ?>
     <h1>Changeset <?cs var:changeset.new_rev ?></h1><?cs
@@ -55,11 +55,11 @@
     </h1><?cs
    else ?>
     <h1>Changes from <a title="Show entry in browser" href="<?cs var:changeset.href.old_path ?>">
-      <?cs var:changeset.old_path ?></a> 
+      <?cs var:changeset.old_path ?></a>
      at <a title="Show full changeset" href="<?cs var:changeset.href.old_rev ?>">
       r<?cs var:changeset.old_rev ?></a>
      to <a title="Show entry in browser" href="<?cs var:changeset.href.new_path ?>">
-     <?cs var:changeset.new_path ?></a> 
+     <?cs var:changeset.new_path ?></a>
      at <a title="Show full changeset" href="<?cs var:changeset.href.new_rev ?>">
      r<?cs var:changeset.new_rev ?></a>
     </h1><?cs
@@ -71,10 +71,10 @@
  if:len(change.diff) ?><?cs
   set:has_diffs = 1 ?><?cs
  /if ?><?cs
-/each ?><?cs if:has_diffs || diff.options.ignoreblanklines 
+/each ?><?cs if:has_diffs || diff.options.ignoreblanklines
   || diff.options.ignorecase || diff.options.ignorewhitespace ?>
 <form method="post" id="prefs" action="">
- <div><?cs 
+ <div><?cs
   if:!changeset.chgset ?>
    <input type="hidden" name="old_path" value="<?cs var:changeset.old_path ?>" />
    <input type="hidden" name="path" value="<?cs var:changeset.new_path ?>" />
@@ -119,10 +119,10 @@
  </div>
 </form><?cs /if ?>
 
-<?cs def:node_change(item,cl,kind) ?><?cs 
+<?cs def:node_change(item,cl,node_type) ?><?cs
   set:ndiffs = len(item.diff) ?><?cs
   set:nprops = len(item.props) ?>
-  <div class="<?cs var:cl ?>"></div><?cs 
+  <div class="<?cs var:cl ?>"></div><?cs
   if:cl == "rem" ?>
    <a title="Show what was removed (rev. <?cs var:item.rev.old ?>)" href="<?cs
      var:item.browser_href.old ?>"><?cs var:item.path.old ?></a><?cs
@@ -130,17 +130,17 @@
    <a title="Show entry in browser" href="<?cs
      var:item.browser_href.new ?>"><?cs var:item.path.new ?></a><?cs
   /if ?>
-  <span class="comment">(<?cs var:kind ?>)</span><?cs
+  <span class="comment">(<?cs var:node_type ?>)</span><?cs
   if:item.path.old && item.change == 'copy' || item.change == 'move' ?>
-   <small><em>(<?cs var:kind ?> from <a href="<?cs
+   <small><em>(<?cs var:node_type ?> from <a href="<?cs
     var:item.browser_href.old ?>" title="Show original file (rev. <?cs
     var:item.rev.old ?>)"><?cs var:item.path.old ?></a>)</em></small><?cs
   /if ?><?cs
   if:$ndiffs + $nprops > #0 ?>
     (<a href="#file<?cs var:name(item) ?>" title="Show differences"><?cs
-      if:$ndiffs > #0 ?><?cs var:ndiffs ?>&nbsp;diff<?cs if:$ndiffs > #1 ?>s<?cs /if ?><?cs 
+      if:$ndiffs > #0 ?><?cs var:ndiffs ?>&nbsp;diff<?cs if:$ndiffs > #1 ?>s<?cs /if ?><?cs
       /if ?><?cs
-      if:$ndiffs && $nprops ?>, <?cs /if ?><?cs 
+      if:$ndiffs && $nprops ?>, <?cs /if ?><?cs
       if:$nprops > #0 ?><?cs var:nprops ?>&nbsp;prop<?cs if:$nprops > #1 ?>s<?cs /if ?><?cs
       /if ?></a>)<?cs
   elif:cl == "mod" ?>
@@ -152,7 +152,7 @@
 <dl id="overview"><?cs
  if:changeset.chgset ?>
  <dt class="time">Timestamp:</dt>
- <dd class="time"><?cs var:changeset.time ?> 
+ <dd class="time"><?cs var:changeset.time ?>
   (<?cs alt:changeset.age ?>less than one hour<?cs /alt ?> ago)</dd>
  <dt class="author">Author:</dt>
  <dd class="author"><?cs var:changeset.author ?></dd>
@@ -160,7 +160,7 @@
  <dd class="message" id="searchable"><?cs
   alt:changeset.message ?>&nbsp;<?cs /alt ?></dd><?cs
  /if ?>
- <dt class="files"><?cs 
+ <dt class="files"><?cs
   if:len(changeset.changes) > #0 ?>
    Files:<?cs
   else ?>
