diff --git a/models/pull_list.go b/models/pull_list.go
index 7c5b83ae5f..9d4d428928 100644
--- a/models/pull_list.go
+++ b/models/pull_list.go
@@ -59,6 +59,16 @@ func GetUnmergedPullRequestsByHeadInfo(repoID int64, branch string) ([]*PullRequ
 		Find(&prs)
 }
 
+// HasUnmergedPullRequestsByHeadInfo checks if there are open and not merged pull request
+// by given head information (repo and branch)
+func HasUnmergedPullRequestsByHeadInfo(repoID int64, branch string) (bool, error) {
+	return db.GetEngine(db.DefaultContext).
+		Where("head_repo_id = ? AND head_branch = ? AND has_merged = ? AND issue.is_closed = ? AND flow = ?",
+			repoID, branch, false, false, PullRequestFlowGithub).
+		Join("INNER", "issue", "issue.id = pull_request.issue_id").
+		Exist(&PullRequest{})
+}
+
 // GetUnmergedPullRequestsByBaseInfo returns all pull requests that are open and has not been merged
 // by given base information (repo and branch).
 func GetUnmergedPullRequestsByBaseInfo(repoID int64, branch string) ([]*PullRequest, error) {
diff --git a/models/pull_test.go b/models/pull_test.go
index f5e9d486ff..2567984cc1 100644
--- a/models/pull_test.go
+++ b/models/pull_test.go
@@ -107,6 +107,18 @@ func TestGetUnmergedPullRequest(t *testing.T) {
 	assert.True(t, IsErrPullRequestNotExist(err))
 }
 
+func TestHasUnmergedPullRequestsByHeadInfo(t *testing.T) {
+	assert.NoError(t, unittest.PrepareTestDatabase())
+
+	exist, err := HasUnmergedPullRequestsByHeadInfo(1, "branch2")
+	assert.NoError(t, err)
+	assert.Equal(t, true, exist)
+
+	exist, err = HasUnmergedPullRequestsByHeadInfo(1, "not_exist_branch")
+	assert.NoError(t, err)
+	assert.Equal(t, false, exist)
+}
+
 func TestGetUnmergedPullRequestsByHeadInfo(t *testing.T) {
 	assert.NoError(t, unittest.PrepareTestDatabase())
 	prs, err := GetUnmergedPullRequestsByHeadInfo(1, "branch2")
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go
index 2b7280d39b..8297e35a17 100644
--- a/routers/api/v1/repo/pull.go
+++ b/routers/api/v1/repo/pull.go
@@ -873,6 +873,17 @@ func MergePullRequest(ctx *context.APIContext) {
 	log.Trace("Pull request merged: %d", pr.ID)
 
 	if form.DeleteBranchAfterMerge {
+		// Don't cleanup when there are other PR's that use this branch as head branch.
+		exist, err := models.HasUnmergedPullRequestsByHeadInfo(pr.HeadRepoID, pr.HeadBranch)
+		if err != nil {
+			ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
+			return
+		}
+		if exist {
+			ctx.Status(http.StatusOK)
+			return
+		}
+
 		var headRepo *git.Repository
 		if ctx.Repo != nil && ctx.Repo.Repository != nil && ctx.Repo.Repository.ID == pr.HeadRepoID && ctx.Repo.GitRepo != nil {
 			headRepo = ctx.Repo.GitRepo
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index d55b6c96b6..ea16de3950 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -1600,11 +1600,23 @@ func ViewIssue(ctx *context.Context) {
 		} else {
 			ctx.Data["WontSignReason"] = "not_signed_in"
 		}
-		ctx.Data["IsPullBranchDeletable"] = canDelete &&
+
+		isPullBranchDeletable := canDelete &&
 			pull.HeadRepo != nil &&
 			git.IsBranchExist(ctx, pull.HeadRepo.RepoPath(), pull.HeadBranch) &&
 			(!pull.HasMerged || ctx.Data["HeadBranchCommitID"] == ctx.Data["PullHeadCommitID"])
 
+		if isPullBranchDeletable && pull.HasMerged {
+			exist, err := models.HasUnmergedPullRequestsByHeadInfo(pull.HeadRepoID, pull.HeadBranch)
+			if err != nil {
+				ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
+				return
+			}
+
+			isPullBranchDeletable = !exist
+		}
+		ctx.Data["IsPullBranchDeletable"] = isPullBranchDeletable
+
 		stillCanManualMerge := func() bool {
 			if pull.HasMerged || issue.IsClosed || !ctx.IsSigned {
 				return false
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index 37826abfb4..b40eb1ea17 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -1051,6 +1051,17 @@ func MergePullRequest(ctx *context.Context) {
 	log.Trace("Pull request merged: %d", pr.ID)
 
 	if form.DeleteBranchAfterMerge {
+		// Don't cleanup when other pr use this branch as head branch
+		exist, err := models.HasUnmergedPullRequestsByHeadInfo(pr.HeadRepoID, pr.HeadBranch)
+		if err != nil {
+			ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
+			return
+		}
+		if exist {
+			ctx.Redirect(issue.Link())
+			return
+		}
+
 		var headRepo *git.Repository
 		if ctx.Repo != nil && ctx.Repo.Repository != nil && pr.HeadRepoID == ctx.Repo.Repository.ID && ctx.Repo.GitRepo != nil {
 			headRepo = ctx.Repo.GitRepo
@@ -1222,6 +1233,17 @@ func CleanUpPullRequest(ctx *context.Context) {
 		return
 	}
 
+	// Don't cleanup when there are other PR's that use this branch as head branch.
+	exist, err := models.HasUnmergedPullRequestsByHeadInfo(pr.HeadRepoID, pr.HeadBranch)
+	if err != nil {
+		ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
+		return
+	}
+	if exist {
+		ctx.NotFound("CleanUpPullRequest", nil)
+		return
+	}
+
 	if err := pr.LoadHeadRepo(); err != nil {
 		ctx.ServerError("LoadHeadRepo", err)
 		return