diff --git a/src/aphront/request/AphrontRequest.php b/src/aphront/request/AphrontRequest.php
index 118119e6a2..d7f5fe8be5 100644
--- a/src/aphront/request/AphrontRequest.php
+++ b/src/aphront/request/AphrontRequest.php
@@ -303,7 +303,8 @@ final class AphrontRequest {
   final public function getRequestURI() {
     $get = $_GET;
     unset($get['__path__']);
-    return id(new PhutilURI($this->getPath()))->setQueryParams($get);
+    $path = phutil_escape_uri($this->getPath());
+    return id(new PhutilURI($path))->setQueryParams($get);
   }
 
   final public function isDialogFormPost() {
diff --git a/src/aphront/request/__init__.php b/src/aphront/request/__init__.php
index 7e0a7e8115..61fb9f861c 100644
--- a/src/aphront/request/__init__.php
+++ b/src/aphront/request/__init__.php
@@ -9,6 +9,7 @@
 phutil_require_module('phabricator', 'aphront/exception/csrf');
 phutil_require_module('phabricator', 'infrastructure/env');
 
+phutil_require_module('phutil', 'markup');
 phutil_require_module('phutil', 'parser/uri');
 phutil_require_module('phutil', 'utils');
 
diff --git a/src/applications/chatlog/controller/channellog/PhabricatorChatLogChannelLogController.php b/src/applications/chatlog/controller/channellog/PhabricatorChatLogChannelLogController.php
index bcf1d35a0f..2f89b40a49 100644
--- a/src/applications/chatlog/controller/channellog/PhabricatorChatLogChannelLogController.php
+++ b/src/applications/chatlog/controller/channellog/PhabricatorChatLogChannelLogController.php
@@ -27,13 +27,19 @@ final class PhabricatorChatLogChannelLogController
 
   public function processRequest() {
 
-    $request = $this->getRequest();
-    $user = $request->getUser();
+    $request     = $this->getRequest();
+    $user        = $request->getUser();
+    $offset      = $request->getInt('offset', 0);
+    $page_size   = 1000;
+    $pager       = new AphrontPagerView();
+    $request_uri = $request->getRequestURI();
+    $pager->setURI($request_uri, 'offset');
+    $pager->setPageSize($page_size);
+    $pager->setOffset($offset);
 
     $query = new PhabricatorChatLogQuery();
     $query->withChannels(array($this->channel));
-    $query->setLimit(1000);
-    $logs = $query->execute();
+    $logs = $query->executeWithPager($pager);
 
     require_celerity_resource('phabricator-chatlog-css');
 
@@ -78,7 +84,10 @@ final class PhabricatorChatLogChannelLogController
 
 
     return $this->buildStandardPageResponse(
-      implode("\n", $out),
+      array(
+        implode("\n", $out),
+        $pager
+      ),
       array(
         'title' => 'Channel Log',
       ));
diff --git a/src/applications/chatlog/controller/channellog/__init__.php b/src/applications/chatlog/controller/channellog/__init__.php
index ca4927c293..0dfed22523 100644
--- a/src/applications/chatlog/controller/channellog/__init__.php
+++ b/src/applications/chatlog/controller/channellog/__init__.php
@@ -9,6 +9,7 @@
 phutil_require_module('phabricator', 'applications/chatlog/controller/base');
 phutil_require_module('phabricator', 'applications/chatlog/query');
 phutil_require_module('phabricator', 'infrastructure/celerity/api');
+phutil_require_module('phabricator', 'view/control/pager');
 phutil_require_module('phabricator', 'view/utils');
 
 phutil_require_module('phutil', 'markup');
diff --git a/src/applications/chatlog/query/PhabricatorChatLogQuery.php b/src/applications/chatlog/query/PhabricatorChatLogQuery.php
index f15454a11b..9a52e37ee1 100644
--- a/src/applications/chatlog/query/PhabricatorChatLogQuery.php
+++ b/src/applications/chatlog/query/PhabricatorChatLogQuery.php
@@ -16,35 +16,20 @@
  * limitations under the License.
  */
 
-final class PhabricatorChatLogQuery {
-
+final class PhabricatorChatLogQuery extends PhabricatorOffsetPagedQuery {
   private $channels;
 
-  private $limit;
-
   public function withChannels(array $channels) {
     $this->channels = $channels;
     return $this;
   }
 
-  public function setLimit($limit) {
-    $this->limit = $limit;
-    return $this;
-  }
-
   public function execute() {
-    $table = new PhabricatorChatLogEvent();
+    $table  = new PhabricatorChatLogEvent();
     $conn_r = $table->establishConnection('r');
 
     $where_clause = $this->buildWhereClause($conn_r);
-
-    $limit_clause = '';
-    if ($this->limit) {
-      $limit_clause = qsprintf(
-        $conn_r,
-        'LIMIT %d',
-        $this->limit);
-    }
+    $limit_clause = $this->buildLimitClause($conn_r);
 
     $data = queryfx_all(
       $conn_r,
@@ -76,5 +61,4 @@ final class PhabricatorChatLogQuery {
 
     return $where;
   }
-
 }
diff --git a/src/applications/chatlog/query/__init__.php b/src/applications/chatlog/query/__init__.php
index 6af86c96a0..5afb603820 100644
--- a/src/applications/chatlog/query/__init__.php
+++ b/src/applications/chatlog/query/__init__.php
@@ -7,6 +7,7 @@
 
 
 phutil_require_module('phabricator', 'applications/chatlog/storage/event');
+phutil_require_module('phabricator', 'infrastructure/query/offsetpaged');
 phutil_require_module('phabricator', 'storage/qsprintf');
 phutil_require_module('phabricator', 'storage/queryfx');