diff --git a/models/notification.go b/models/notification.go
index 46d63b48238..188c987536d 100644
--- a/models/notification.go
+++ b/models/notification.go
@@ -182,14 +182,20 @@ func getIssueNotification(e Engine, userID, issueID int64) (*Notification, error
 }
 
 // NotificationsForUser returns notifications for a given user and status
-func NotificationsForUser(user *User, status NotificationStatus) ([]*Notification, error) {
-	return notificationsForUser(x, user, status)
+func NotificationsForUser(user *User, status NotificationStatus, page, perPage int) ([]*Notification, error) {
+	return notificationsForUser(x, user, status, page, perPage)
 }
-func notificationsForUser(e Engine, user *User, status NotificationStatus) (notifications []*Notification, err error) {
-	err = e.
+func notificationsForUser(e Engine, user *User, status NotificationStatus, page, perPage int) (notifications []*Notification, err error) {
+	sess := e.
 		Where("user_id = ?", user.ID).
 		And("status = ?", status).
-		OrderBy("updated_unix DESC").
+		OrderBy("updated_unix DESC")
+
+	if page > 0 && perPage > 0 {
+		sess.Limit(perPage, (page-1)*perPage)
+	}
+
+	err = sess.
 		Find(&notifications)
 	return
 }
diff --git a/routers/user/notification.go b/routers/user/notification.go
index 866cc6de02a..7e556ae2eaf 100644
--- a/routers/user/notification.go
+++ b/routers/user/notification.go
@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/Unknwon/paginater"
+
 	"code.gitea.io/gitea/models"
 	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/context"
@@ -34,26 +36,46 @@ func GetNotificationCount(c *context.Context) {
 
 // Notifications is the notifications page
 func Notifications(c *context.Context) {
-	var status models.NotificationStatus
-	switch c.Query("status") {
+	var (
+		keyword = c.Query("q")
+		status  models.NotificationStatus
+		page    = c.QueryInt("page")
+		perPage = c.QueryInt("perPage")
+	)
+	if page < 1 {
+		page = 1
+	}
+	if perPage < 1 {
+		perPage = 20
+	}
+
+	switch keyword {
 	case "read":
 		status = models.NotificationStatusRead
 	default:
 		status = models.NotificationStatusUnread
 	}
 
-	notifications, err := models.NotificationsForUser(c.User, status)
+	notifications, err := models.NotificationsForUser(c.User, status, page, perPage)
 	if err != nil {
 		c.Handle(500, "ErrNotificationsForUser", err)
 		return
 	}
 
+	total, err := models.GetNotificationCount(c.User, status)
+	if err != nil {
+		c.Handle(500, "ErrGetNotificationCount", err)
+		return
+	}
+
 	title := "Notifications"
 	if count := len(notifications); count > 0 {
 		title = fmt.Sprintf("(%d) %s", count, title)
 	}
 	c.Data["Title"] = title
+	c.Data["Keyword"] = keyword
 	c.Data["Status"] = status
 	c.Data["Notifications"] = notifications
+	c.Data["Page"] = paginater.New(int(total), perPage, page, 5)
 	c.HTML(200, tplNotification)
 }
diff --git a/templates/user/notification/notification.tmpl b/templates/user/notification/notification.tmpl
index 154f8b17905..ddfcd4f7176 100644
--- a/templates/user/notification/notification.tmpl
+++ b/templates/user/notification/notification.tmpl
@@ -5,7 +5,7 @@
 		<h1 class="ui header">{{.i18n.Tr "notification.notifications"}}</h1>
 
 		<div class="ui top attached tabular menu">
-			<a href="/notifications?status=unread">
+			<a href="/notifications?q=unread">
 				<div class="{{if eq .Status 1}}active{{end}} item">
 					{{.i18n.Tr "notification.unread"}}
 					{{if eq .Status 1}}
@@ -13,7 +13,7 @@
 					{{end}}
 				</div>
 			</a>
-			<a href="/notifications?status=read">
+			<a href="/notifications?q=read">
 				<div class="{{if eq .Status 2}}active{{end}} item">
 					{{.i18n.Tr "notification.read"}}
 					{{if eq .Status 2}}
@@ -62,6 +62,8 @@
 				</div>
 			{{end}}
 		</div>
+
+		{{template "base/paginate" .}}
 	</div>
 </div>