Index: trunk/lib/Bookmarks.pm
===================================================================
--- trunk/lib/Bookmarks.pm	(revision 101)
+++ trunk/lib/Bookmarks.pm	(revision 106)
@@ -99,8 +99,40 @@
 }
 
+sub get_count {
+    my $self = shift;
+    my $search = shift;
+
+    my ($sql, @bind) = sql_interp(
+        'select count(*) from resources join bookmarks on resources.uri = bookmarks.uri',
+        $self->_sql_where_clause($search),
+    );
+    my $sth = $self->dbh->prepare($sql);
+    $sth->execute(@bind);
+    my ($count) = $sth->fetchrow_array;
+    return $count;
+}
+
 sub search {
     my $self = shift;
     my $params = shift || {};
     my $search = Bookmarks::Search->new($params);
+
+    my ($limit, $offset);
+    if ($search->page) {
+        my $count = $self->get_count($search);
+        use Data::Pageset;
+        my $pages = Data::Pageset->new({
+            total_entries    => $count,
+            current_page     => $search->page,
+            entries_per_page => 15,
+            mode             => 'slide',
+        });
+        $search->pages($pages);
+        $limit = $pages->entries_per_page;
+        $offset = $pages->skipped;
+    } else {
+        $limit = $search->limit;
+        $offset = $search->offset;
+    }
 
     # build the query
@@ -110,7 +142,7 @@
     push @sql, $self->_sql_where_clause($search);
     push @sql, 'order by ctime desc';
-    push @sql, ('limit', \$search->limit) if $search->limit;
+    push @sql, ('limit', \$limit) if $limit;
     # an offset is only allowed if we have a limit clause
-    push @sql, ('offset', \$search->offset) if $search->limit && $search->offset;
+    push @sql, ('offset', \$offset) if $limit && $offset;
 
     my ($sql, @bind) = sql_interp(@sql);
Index: trunk/lib/Bookmarks/Controller.pm
===================================================================
--- trunk/lib/Bookmarks/Controller.pm	(revision 101)
+++ trunk/lib/Bookmarks/Controller.pm	(revision 106)
@@ -83,4 +83,5 @@
     my $limit = $self->request->param('limit');
     my $offset = $self->request->param('offset');
+    my $page = $self->request->param('page');
 
     my $list = Bookmarks::List->new({
@@ -91,4 +92,5 @@
             limit  => $limit,
             offset => $offset,
+            page   => $page,
         }),
     });
Index: trunk/lib/Bookmarks/List.pm
===================================================================
--- trunk/lib/Bookmarks/List.pm	(revision 101)
+++ trunk/lib/Bookmarks/List.pm	(revision 106)
@@ -197,4 +197,5 @@
             cotags       => \@cotags,
             resources    => $self->results,
+            pages        => $self->search->pages,
         },
         \my $output,
Index: trunk/lib/Bookmarks/Search.pm
===================================================================
--- trunk/lib/Bookmarks/Search.pm	(revision 101)
+++ trunk/lib/Bookmarks/Search.pm	(revision 106)
@@ -10,6 +10,11 @@
 has limit  => (is => 'ro');
 has offset => (is => 'ro');
+has page   => (is => 'ro');
 
 has results => (is => 'rw', default => sub { [] });
+has pages => (
+    is => 'rw',
+    isa => 'Data::Pageset',
+);
 
 # module return
Index: trunk/lib/Bookmarks/list.tt
===================================================================
--- trunk/lib/Bookmarks/list.tt	(revision 101)
+++ trunk/lib/Bookmarks/list.tt	(revision 106)
@@ -84,4 +84,7 @@
     font-size: .875em;
 }
+.pagination {
+    margin: .5em;
+}
     </style>
   </head>
@@ -96,4 +99,23 @@
       <input type="submit" value="Go"/>
     </form>
+    <div class="pagination">
+      [% IF pages %]
+        <a href="?page=[% pages.first_page %]">«</a>
+        [% IF pages.previous_set %]
+          <a href="?page=[% pages.previous_set %]">‹</a>
+        [% END %]
+        [% FOREACH page IN pages.pages_in_set %]
+          [% IF page == pages.current_page %]
+            <strong>[% page %]</strong>
+          [% ELSE %]
+            <a href="?page=[% page %]">[% page %]</a>
+          [% END %]
+        [% END %]
+        [% IF pages.next_set %]
+          <a href="?page=[% pages.next_set %]">›</a>
+        [% END %]
+        <a href="?page=[% pages.last_page %]">»</a>
+      [% END %]
+    </div>
     <ul class="main">
       [%  FOREACH resource IN resources %]
