diff --git a/integrations/api_issue_subscription_test.go b/integrations/api_issue_subscription_test.go
index 5d2956c4e0..d0b1921015 100644
--- a/integrations/api_issue_subscription_test.go
+++ b/integrations/api_issue_subscription_test.go
@@ -58,9 +58,17 @@ func TestAPIIssueSubscriptions(t *testing.T) {
 	session.MakeRequest(t, req, http.StatusCreated)
 	testSubscription(issue1, false)
 
+	req = NewRequest(t, "DELETE", urlStr)
+	session.MakeRequest(t, req, http.StatusOK)
+	testSubscription(issue1, false)
+
 	issue5Repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issue5.RepoID}).(*models.Repository)
 	urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/subscriptions/%s?token=%s", issue5Repo.OwnerName, issue5Repo.Name, issue5.Index, owner.Name, token)
 	req = NewRequest(t, "PUT", urlStr)
 	session.MakeRequest(t, req, http.StatusCreated)
 	testSubscription(issue5, true)
+
+	req = NewRequest(t, "PUT", urlStr)
+	session.MakeRequest(t, req, http.StatusOK)
+	testSubscription(issue5, true)
 }
diff --git a/routers/api/v1/repo/issue_subscription.go b/routers/api/v1/repo/issue_subscription.go
index 999dda1738..dfccbde64e 100644
--- a/routers/api/v1/repo/issue_subscription.go
+++ b/routers/api/v1/repo/issue_subscription.go
@@ -45,8 +45,10 @@ func AddIssueSubscription(ctx *context.APIContext) {
 	//   type: string
 	//   required: true
 	// responses:
+	//   "200":
+	//     description: Already subscribed
 	//   "201":
-	//     "$ref": "#/responses/empty"
+	//     description: Successfully Subscribed
 	//   "304":
 	//     description: User can only subscribe itself if he is no admin
 	//   "404":
@@ -87,8 +89,10 @@ func DelIssueSubscription(ctx *context.APIContext) {
 	//   type: string
 	//   required: true
 	// responses:
+	//   "200":
+	//     description: Already unsubscribed
 	//   "201":
-	//     "$ref": "#/responses/empty"
+	//     description: Successfully Unsubscribed
 	//   "304":
 	//     description: User can only subscribe itself if he is no admin
 	//   "404":
@@ -126,6 +130,19 @@ func setIssueSubscription(ctx *context.APIContext, watch bool) {
 		return
 	}
 
+	current, err := models.CheckIssueWatch(user, issue)
+	if err != nil {
+		ctx.Error(http.StatusInternalServerError, "CheckIssueWatch", err)
+		return
+	}
+
+	// If watch state wont change
+	if current == watch {
+		ctx.Status(http.StatusOK)
+		return
+	}
+
+	// Update watch state
 	if err := models.CreateOrUpdateIssueWatch(user.ID, issue.ID, watch); err != nil {
 		ctx.Error(http.StatusInternalServerError, "CreateOrUpdateIssueWatch", err)
 		return
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index edcc5fd37a..b6a9085be5 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -5315,8 +5315,11 @@
           }
         ],
         "responses": {
+          "200": {
+            "description": "Already subscribed"
+          },
           "201": {
-            "$ref": "#/responses/empty"
+            "description": "Successfully Subscribed"
           },
           "304": {
             "description": "User can only subscribe itself if he is no admin"
@@ -5370,8 +5373,11 @@
           }
         ],
         "responses": {
+          "200": {
+            "description": "Already unsubscribed"
+          },
           "201": {
-            "$ref": "#/responses/empty"
+            "description": "Successfully Unsubscribed"
           },
           "304": {
             "description": "User can only subscribe itself if he is no admin"