diff --git a/modules/markup/markup.go b/modules/markup/markup.go
index d17270fb01..c506007723 100644
--- a/modules/markup/markup.go
+++ b/modules/markup/markup.go
@@ -111,9 +111,14 @@ func IsMarkupFile(name, markup string) bool {
 }
 
 // IsReadmeFile reports whether name looks like a README file
-// based on its name.
-func IsReadmeFile(name string) bool {
+// based on its name. If an extension is provided, it will strictly
+// match that extension.
+// Note that the '.' should be provided in ext, e.g ".md"
+func IsReadmeFile(name string, ext ...string) bool {
 	name = strings.ToLower(name)
+	if len(ext) > 0 {
+		return name == "readme"+ext[0]
+	}
 	if len(name) < 6 {
 		return false
 	} else if len(name) == 6 {
diff --git a/modules/markup/markup_test.go b/modules/markup/markup_test.go
index b0ebfae57d..118fa2632b 100644
--- a/modules/markup/markup_test.go
+++ b/modules/markup/markup_test.go
@@ -19,6 +19,7 @@ func TestMisc_IsReadmeFile(t *testing.T) {
 		"README",
 		"readME.mdown",
 		"README.md",
+		"readme.i18n.md",
 	}
 	falseTestCases := []string{
 		"test.md",
@@ -37,4 +38,25 @@ func TestMisc_IsReadmeFile(t *testing.T) {
 	for _, testCase := range falseTestCases {
 		assert.False(t, IsReadmeFile(testCase))
 	}
+
+	trueTestCasesStrict := [][]string{
+		{"readme", ""},
+		{"readme.md", ".md"},
+		{"readme.txt", ".txt"},
+	}
+	falseTestCasesStrict := [][]string{
+		{"readme", ".md"},
+		{"readme.md", ""},
+		{"readme.md", ".txt"},
+		{"readme.md", "md"},
+		{"readmee.md", ".md"},
+		{"readme.i18n.md", ".md"},
+	}
+
+	for _, testCase := range trueTestCasesStrict {
+		assert.True(t, IsReadmeFile(testCase[0], testCase[1]))
+	}
+	for _, testCase := range falseTestCasesStrict {
+		assert.False(t, IsReadmeFile(testCase[0], testCase[1]))
+	}
 }
diff --git a/routers/repo/view.go b/routers/repo/view.go
index 78a305aa28..8739c139d9 100644
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -56,18 +56,31 @@ func renderDirectory(ctx *context.Context, treeLink string) {
 		return
 	}
 
-	var readmeFile *git.Blob
+	// 3 for the extensions in exts[] in order
+	// the last one is for a readme that doesn't
+	// strictly match an extension
+	var readmeFiles [4]*git.Blob
+	var exts = []string{".md", ".txt", ""} // sorted by priority
 	for _, entry := range entries {
 		if entry.IsDir() {
 			continue
 		}
 
-		if !markup.IsReadmeFile(entry.Name()) {
-			continue
+		for i, ext := range exts {
+			if markup.IsReadmeFile(entry.Name(), ext) {
+				readmeFiles[i] = entry.Blob()
+			}
 		}
 
-		readmeFile = entry.Blob()
-		if markup.Type(entry.Name()) != "" {
+		if markup.IsReadmeFile(entry.Name()) {
+			readmeFiles[3] = entry.Blob()
+		}
+	}
+
+	var readmeFile *git.Blob
+	for _, f := range readmeFiles {
+		if f != nil {
+			readmeFile = f
 			break
 		}
 	}