diff --git a/conf/app.ini b/conf/app.ini
index 014411ce45..dbae8a4fd0 100644
--- a/conf/app.ini
+++ b/conf/app.ini
@@ -167,6 +167,8 @@ SESSION_LIFE_TIME = 86400
 [picture]
 ; The place to picture data, either "server" or "qiniu", default is "server"
 SERVICE = server
+; Chinese users can choose "duoshuo"
+GRAVATAR_SOURCE = gravatar
 DISABLE_GRAVATAR = false
 
 [attachment]
diff --git a/gogs.go b/gogs.go
index 0c01cfcc19..01cee6138a 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
 	"github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.5.8.1114 Beta"
+const APP_VER = "0.5.8.1116 Beta"
 
 func init() {
 	runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/user.go b/models/user.go
index 88fcb8388e..7038e075f8 100644
--- a/models/user.go
+++ b/models/user.go
@@ -100,7 +100,7 @@ func (u *User) AvatarLink() string {
 	} else if setting.Service.EnableCacheAvatar {
 		return setting.AppSubUrl + "/avatar/" + u.Avatar
 	}
-	return "//1.gravatar.com/avatar/" + u.Avatar
+	return setting.GravatarSource + u.Avatar
 }
 
 // NewGitSig generates and returns the signature of given user.
diff --git a/models/webhook.go b/models/webhook.go
index 2f2accf9d2..33146b529a 100644
--- a/models/webhook.go
+++ b/models/webhook.go
@@ -207,6 +207,7 @@ const (
 	PUSH HookEventType = "push"
 )
 
+// FIXME: just use go-gogs-client structs maybe?
 type PayloadAuthor struct {
 	Name     string `json:"name"`
 	Email    string `json:"email"`
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 50f073a525..0e083c8d0c 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -180,7 +180,7 @@ func AvatarLink(email string) string {
 	} else if setting.Service.EnableCacheAvatar {
 		return setting.AppSubUrl + "/avatar/" + EncodeMd5(email)
 	}
-	return "//1.gravatar.com/avatar/" + EncodeMd5(email)
+	return setting.GravatarSource + EncodeMd5(email)
 }
 
 // Seconds-based time units
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 99116fff70..6b1b9fed4c 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -67,6 +67,7 @@ var (
 
 	// Picture settings.
 	PictureService  string
+	GravatarSource  string
 	DisableGravatar bool
 
 	// Log settings.
@@ -257,8 +258,13 @@ func NewConfigContext() {
 	}
 	ScriptType = Cfg.MustValue("repository", "SCRIPT_TYPE", "bash")
 
-	PictureService = Cfg.MustValueRange("picture", "SERVICE", "server",
-		[]string{"server"})
+	PictureService = Cfg.MustValueRange("picture", "SERVICE", "server", []string{"server"})
+	switch Cfg.MustValue("picture", "GRAVATAR_SOURCE", "gravatar") {
+	case "duoshuo":
+		GravatarSource = "http://gravatar.duoshuo.com/avatar/"
+	default:
+		GravatarSource = "//1.gravatar.com/avatar/"
+	}
 	DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR")
 
 	MaxGitDiffLines = Cfg.MustInt("git", "MAX_GITDIFF_LINES", 10000)
diff --git a/routers/api/v1/repo_file.go b/routers/api/v1/repo_file.go
new file mode 100644
index 0000000000..ca06a2e9b8
--- /dev/null
+++ b/routers/api/v1/repo_file.go
@@ -0,0 +1,5 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package v1
diff --git a/templates/.VERSION b/templates/.VERSION
index a60a985a7d..78403f16c7 100644
--- a/templates/.VERSION
+++ b/templates/.VERSION
@@ -1 +1 @@
-0.5.8.1114 Beta
\ No newline at end of file
+0.5.8.1116 Beta
\ No newline at end of file