diff -r -u trac-0.10.3.1-orig/templates/report.cs trac-0.10.3.1/templates/report.cs
--- trac-0.10.3.1-orig/templates/report.cs	2007-03-09 02:53:18.000000000 +0900
+++ trac-0.10.3.1/templates/report.cs	2007-04-12 11:22:30.000000000 +0900
@@ -108,6 +108,31 @@
     /if ?><?cs
    /if ?>
 
+
+<form id="query" method="get" action="">
+ <p class="option">
+  Page: 
+  <?cs each:n = page_query.numpages ?>
+  <?cs if:n == page_query.curpage ?>
+   <?cs var:n ?>
+  <?cs else ?>
+    <a href="<?cs var:report.href ?>?<?cs if page_query.baseparams ?><?cs var:page_query.baseparams ?>&<?cs /if ?>page=<?cs var:n ?>"><?cs var:n ?></a>
+  <?cs /if ?>
+  <?cs /each ?>
+ </p>
+ <p class="option">
+  <label>Tickets per page:
+   <input type="text" class="textwidget" name="per_page" value="<?cs var:page_query.perpage ?>" size="6" />
+  </label>
+ </p>
+ <div class="buttons">
+  <input type="hidden" name="order" value="<?cs var:query.order ?>" />
+  <?cs if:query.desc ?><input type="hidden" name="desc" value="1" /><?cs /if ?>
+  <input type="submit" name="update" value="Update" />
+ </div>
+ <hr />
+</form>
+
      <?cs each row = report.items ?>
        <?cs if group != row.__group__ || idx == #0 ?>
          <?cs if:idx != #0 ?></tbody><?cs /if ?>
diff -r -u trac-0.10.3.1-orig/trac/ticket/report.py trac-0.10.3.1/trac/ticket/report.py
--- trac-0.10.3.1-orig/trac/ticket/report.py	2007-03-09 02:53:17.000000000 +0900
+++ trac-0.10.3.1/trac/ticket/report.py	2007-04-12 11:21:19.000000000 +0900
@@ -28,12 +28,18 @@
 from trac.util.datefmt import format_date, format_time, format_datetime, \
                                http_date
 from trac.util.html import html
+from trac.config import IntOption
 from trac.web import IRequestHandler
 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
 from trac.wiki import wiki_to_html, IWikiSyntaxProvider, Formatter
 
+import math
+
 class ReportModule(Component):
 
+    tickets_per_page = IntOption('ticket', 'default_per_page', default=10,
+                                 doc="The number of tickets shown per page in queries")
+    
     implements(INavigationContributor, IPermissionRequestor, IRequestHandler,
                IWikiSyntaxProvider)
 
@@ -300,6 +306,39 @@
 
         # Convert the rows and cells to HDF-format
         row_idx = 0
+        # Update/retrieve the number of tickets per page
+        perpage = int(req.args.get("per_page", 0))
+        if not perpage:
+            perpage = req.session.get('tickets_perpage')
+            if not perpage:
+                perpage = self.tickets_per_page
+            else:
+                perpage = int(perpage)
+        else:
+            req.session['tickets_perpage'] = perpage
+            
+        # Calculate number of pages and current page
+        numpages = int(math.ceil(len(rows) * 1.0 / perpage))
+        curpage = int(req.args.get('page', 1))
+        if curpage <= 0 or curpage > numpages:
+            raise TracError, 'Invalid page %s'%(curpage)
+                
+        # Calculate the start and end point
+        start = perpage * (curpage-1)
+        end = start + perpage
+        rows = rows[start:end]
+
+        # A few more HDF variables
+        req.hdf['page_query.perpage'] = perpage
+        req.hdf['page_query.numpages'] = range(1, numpages+1)
+        req.hdf['page_query.curpage'] = curpage
+        params = {}
+        if req.args.has_key('sort'):
+            params['sort'] = req.args['sort']
+        if req.args.has_key('asc'):
+            params['asc'] = req.args['asc']
+        req.hdf['page_query.baseparams'] = urllib.urlencode(params)
+            
         for row in rows:
             col_idx = 0
             numrows = len(row)

