diff --git a/README.md b/README.md
index 28801bb5..d88e0750 100644
--- a/README.md
+++ b/README.md
@@ -68,7 +68,7 @@ Each file in the `data/` directory can be used as a rule in this format: `geosit
 
 - Install `golang` and `git`
 - Download and install project code: `go get -u -v --insecure github.com/v2ray/domain-list-community`
-- Generate `dlc.dat` (without `datapath` option means to use `data` directory of this project):
+- Generate `dlc.dat` (without `datapath` option means to use `data` directory of this repository in `$GOPATH`):
   - `$(go env GOPATH)/bin/domain-list-community`
   - `$(go env GOPATH)/bin/domain-list-community --datapath=/path/to/your/custom/data/directory`
 
diff --git a/data/bmw b/data/bmw
index cf1ee5aa..3f62252b 100644
--- a/data/bmw
+++ b/data/bmw
@@ -38,7 +38,6 @@ bmw.com
 bmw.com.ar
 bmw.com.au
 bmw.com.bn
-bmw.com.cn
 bmw.com.kh
 bmw.com.mt
 bmw.com.my
diff --git a/data/dnspod b/data/dnspod
new file mode 100644
index 00000000..d0d29c40
--- /dev/null
+++ b/data/dnspod
@@ -0,0 +1,7 @@
+dns.pub
+dnsapi.cn
+dnspod.cn
+dnspod.com
+dnspod.com.cn
+dnspod.org
+doh.pub
diff --git a/data/ebay b/data/ebay
index 746728b0..7ff9f155 100644
--- a/data/ebay
+++ b/data/ebay
@@ -4,7 +4,6 @@ ebay.at
 ebay.be
 ebay.ca
 ebay.ch
-ebay.cn
 ebay.co.nz
 ebay.co.uk
 ebay.co.ve
diff --git a/data/emojipedia b/data/emojipedia
new file mode 100644
index 00000000..fa9f5a60
--- /dev/null
+++ b/data/emojipedia
@@ -0,0 +1,3 @@
+emojipedia.org
+worldemojiawards.com
+worldemojiday.com
diff --git a/data/geolocation-!cn b/data/geolocation-!cn
index e615cd48..0d011619 100644
--- a/data/geolocation-!cn
+++ b/data/geolocation-!cn
@@ -228,6 +228,7 @@ include:reddit
 include:archive
 include:change
 include:csis
+include:emojipedia
 include:globalsecurity
 include:ruleoflaw
 include:un
diff --git a/data/google-scholar b/data/google-scholar
index 862af472..f4efb4ac 100644
--- a/data/google-scholar
+++ b/data/google-scholar
@@ -6,7 +6,6 @@ scholar.google.ca
 scholar.google.cat
 scholar.google.ch
 scholar.google.cl
-scholar.google.cn
 scholar.google.co.cr
 scholar.google.co.id
 scholar.google.co.il
diff --git a/data/mastercard b/data/mastercard
index 10ce24f6..6568d36e 100644
--- a/data/mastercard
+++ b/data/mastercard
@@ -25,7 +25,6 @@ mastercard.com.au
 mastercard.com.bh
 mastercard.com.br
 mastercard.com.bz
-mastercard.com.cn
 mastercard.com.co
 mastercard.com.cy
 mastercard.com.eg
diff --git a/data/mcdonalds b/data/mcdonalds
index be1a61bc..e49e657a 100644
--- a/data/mcdonalds
+++ b/data/mcdonalds
@@ -4,7 +4,6 @@ mcd
 # All .mcdonalds domains
 mcdonalds
 
-4008-517-517.cn
 aboutmcdonalds.com
 happymeal.co.nz
 happymeal.com.au
diff --git a/data/tencent b/data/tencent
index 4a72a63d..a77f382a 100644
--- a/data/tencent
+++ b/data/tencent
@@ -1,3 +1,6 @@
+include:tencent-ads
+include:dnspod
+
 apcdns.net
 foxmail.com
 foxmail.com.cn
@@ -28,5 +31,3 @@ tenpay.com
 wechat.com
 wegame.com
 weiyun.com
-
-include:tencent-ads
diff --git a/data/uber b/data/uber
index 4385c6ad..104b1a59 100644
--- a/data/uber
+++ b/data/uber
@@ -1,2 +1,3 @@
-uber.com
 uber-assets.com
+uber.com
+ubereats.com
diff --git a/data/visa b/data/visa
index f17fd68c..7b20d803 100644
--- a/data/visa
+++ b/data/visa
@@ -24,7 +24,6 @@ visa.com.bo
 visa.com.br
 visa.com.bs
 visa.com.bz
-visa.com.cn
 visa.com.co
 visa.com.cy
 visa.com.dm
diff --git a/main.go b/main.go
index f846aae8..2849741e 100644
--- a/main.go
+++ b/main.go
@@ -5,6 +5,7 @@ import (
 	"errors"
 	"flag"
 	"fmt"
+	"go/build"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -15,7 +16,10 @@ import (
 	"v2ray.com/core/app/router"
 )
 
-var dataPath = flag.String("datapath", "", "Path to the custom data folder")
+var (
+	dataPath        = flag.String("datapath", "", "Path to your custom 'data' directory")
+	defaultDataPath = filepath.Join("src", "github.com", "v2ray", "domain-list-community", "data")
+)
 
 type Entry struct {
 	Type  string
@@ -145,13 +149,13 @@ func parseEntry(line string) (Entry, error) {
 func DetectPath(path string) (string, error) {
 	arrPath := strings.Split(path, string(filepath.ListSeparator))
 	for _, content := range arrPath {
-		fullPath := filepath.Join(content, "src", "github.com", "v2ray", "domain-list-community", "data")
+		fullPath := filepath.Join(content, defaultDataPath)
 		_, err := os.Stat(fullPath)
 		if err == nil || os.IsExist(err) {
 			return fullPath, nil
 		}
 	}
-	err := errors.New("No file found in GOPATH")
+	err := fmt.Errorf("directory '%s' not found in '$GOPATH'", defaultDataPath)
 	return "", err
 }
 
@@ -218,6 +222,45 @@ func ParseList(list *List, ref map[string]*List) (*ParsedList, error) {
 	return pl, nil
 }
 
+func envFile() (string, error) {
+	if file := os.Getenv("GOENV"); file != "" {
+		if file == "off" {
+			return "", fmt.Errorf("GOENV=off")
+		}
+		return file, nil
+	}
+	dir, err := os.UserConfigDir()
+	if err != nil {
+		return "", err
+	}
+	if dir == "" {
+		return "", fmt.Errorf("missing user-config dir")
+	}
+	return filepath.Join(dir, "go", "env"), nil
+}
+
+func getRuntimeEnv(key string) (string, error) {
+	file, err := envFile()
+	if err != nil {
+		return "", err
+	}
+	if file == "" {
+		return "", fmt.Errorf("missing runtime env file")
+	}
+	var data []byte
+	var runtimeEnv string
+	data, err = ioutil.ReadFile(file)
+	envStrings := strings.Split(string(data), "\n")
+	for _, envItem := range envStrings {
+		envItem = strings.TrimSuffix(envItem, "\r")
+		envKeyValue := strings.Split(envItem, "=")
+		if strings.ToLower(envKeyValue[0]) == strings.ToLower(key) {
+			runtimeEnv = envKeyValue[1]
+		}
+	}
+	return runtimeEnv, nil
+}
+
 func main() {
 	flag.Parse()
 
@@ -226,12 +269,23 @@ func main() {
 	if *dataPath != "" {
 		dir = *dataPath
 	} else {
-		dir, err = DetectPath(os.Getenv("GOPATH"))
+		goPath, envErr := getRuntimeEnv("GOPATH")
+		if envErr != nil {
+			fmt.Println("Failed: please set '$GOPATH' manually, or use 'datapath' option to specify the path to your custom 'data' directory")
+			return
+		}
+		if goPath == "" {
+			goPath = build.Default.GOPATH
+		}
+		fmt.Println("Use $GOPATH:", goPath)
+		fmt.Printf("Searching directory '%s' in '%s'...\n", defaultDataPath, goPath)
+		dir, err = DetectPath(goPath)
 	}
 	if err != nil {
 		fmt.Println("Failed: ", err)
 		return
 	}
+	fmt.Println("Use domain lists in", dir)
 
 	ref := make(map[string]*List)
 	err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
@@ -275,6 +329,6 @@ func main() {
 	if err := ioutil.WriteFile("dlc.dat", protoBytes, 0777); err != nil {
 		fmt.Println("Failed: ", err)
 	} else {
-		fmt.Println("dlc.dat has been generated successfully.")
+		fmt.Println("dlc.dat has been generated successfully in the directory. You can rename 'dlc.dat' to 'geosite.dat' and use it in V2Ray.")
 	}
 }