diff --git a/modules/convert/notification.go b/modules/convert/notification.go
index b0888ee09f..fae7be1257 100644
--- a/modules/convert/notification.go
+++ b/modules/convert/notification.go
@@ -31,10 +31,12 @@ func ToNotificationThread(n *models.Notification) *api.NotificationThread {
 		if n.Issue != nil {
 			result.Subject.Title = n.Issue.Title
 			result.Subject.URL = n.Issue.APIURL()
+			result.Subject.HTMLURL = n.Issue.HTMLURL()
 			result.Subject.State = n.Issue.State()
 			comment, err := n.Issue.GetLastComment()
 			if err == nil && comment != nil {
 				result.Subject.LatestCommentURL = comment.APIURL()
+				result.Subject.LatestCommentHTMLURL = comment.HTMLURL()
 			}
 		}
 	case models.NotificationSourcePullRequest:
@@ -42,10 +44,12 @@ func ToNotificationThread(n *models.Notification) *api.NotificationThread {
 		if n.Issue != nil {
 			result.Subject.Title = n.Issue.Title
 			result.Subject.URL = n.Issue.APIURL()
+			result.Subject.HTMLURL = n.Issue.HTMLURL()
 			result.Subject.State = n.Issue.State()
 			comment, err := n.Issue.GetLastComment()
 			if err == nil && comment != nil {
 				result.Subject.LatestCommentURL = comment.APIURL()
+				result.Subject.LatestCommentHTMLURL = comment.HTMLURL()
 			}
 
 			pr, _ := n.Issue.GetPullRequest()
@@ -54,16 +58,20 @@ func ToNotificationThread(n *models.Notification) *api.NotificationThread {
 			}
 		}
 	case models.NotificationSourceCommit:
+		url := n.Repository.HTMLURL() + "/commit/" + n.CommitID
 		result.Subject = &api.NotificationSubject{
-			Type:  api.NotifySubjectCommit,
-			Title: n.CommitID,
-			URL:   n.Repository.HTMLURL() + "/commit/" + n.CommitID,
+			Type:    api.NotifySubjectCommit,
+			Title:   n.CommitID,
+			URL:     url,
+			HTMLURL: url,
 		}
 	case models.NotificationSourceRepository:
 		result.Subject = &api.NotificationSubject{
 			Type:  api.NotifySubjectRepository,
 			Title: n.Repository.FullName(),
-			URL:   n.Repository.Link(),
+			// FIXME: this is a relative URL, rather useless and inconsistent, but keeping for backwards compat
+			URL:     n.Repository.Link(),
+			HTMLURL: n.Repository.HTMLURL(),
 		}
 	}
 
diff --git a/modules/structs/notifications.go b/modules/structs/notifications.go
index 675dcf76b1..3fd9088ce3 100644
--- a/modules/structs/notifications.go
+++ b/modules/structs/notifications.go
@@ -21,11 +21,13 @@ type NotificationThread struct {
 
 // NotificationSubject contains the notification subject (Issue/Pull/Commit)
 type NotificationSubject struct {
-	Title            string            `json:"title"`
-	URL              string            `json:"url"`
-	LatestCommentURL string            `json:"latest_comment_url"`
-	Type             NotifySubjectType `json:"type" binding:"In(Issue,Pull,Commit)"`
-	State            StateType         `json:"state"`
+	Title                string            `json:"title"`
+	URL                  string            `json:"url"`
+	LatestCommentURL     string            `json:"latest_comment_url"`
+	HTMLURL              string            `json:"html_url"`
+	LatestCommentHTMLURL string            `json:"latest_comment_html_url"`
+	Type                 NotifySubjectType `json:"type" binding:"In(Issue,Pull,Commit,Repository)"`
+	State                StateType         `json:"state"`
 }
 
 // NotificationCount number of unread notifications
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 03d1cbda98..c6fa664af6 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -15728,6 +15728,14 @@
       "description": "NotificationSubject contains the notification subject (Issue/Pull/Commit)",
       "type": "object",
       "properties": {
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "latest_comment_html_url": {
+          "type": "string",
+          "x-go-name": "LatestCommentHTMLURL"
+        },
         "latest_comment_url": {
           "type": "string",
           "x-go-name": "LatestCommentURL"