diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala
index d88bdc1..2c06fda 100644
--- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala
+++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala
@@ -1,5 +1,7 @@
 package gitbucket.core.controller
 
+import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
+
 import gitbucket.core.api._
 import gitbucket.core.plugin.PluginRegistry
 import gitbucket.core.repo.html
@@ -295,6 +297,21 @@
     redirect(s"/${repository.owner}/${repository.name}/tree/${form.branch}${if(form.path.length == 0) "" else form.path}")
   })
 
+  get("/:owner/:repository/raw/*")(referrersOnly { repository =>
+    val (id, path) = splitPath(repository, multiParams("splat").head)
+    using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
+      val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
+      getPathObjectId(git, path, revCommit).flatMap { objectId =>
+        JGitUtil.getObjectLoaderFromId(git, objectId){ loader =>
+          contentType = "application/octet-stream"
+          response.setContentLength(loader.getSize.toInt)
+          loader.copyTo(response.outputStream)
+          ()
+        }
+      } getOrElse NotFound
+    }
+  })
+
   /**
    * Displays the file content of the specified branch or commit.
    */
@@ -305,12 +322,11 @@
       val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
       getPathObjectId(git, path, revCommit).map { objectId =>
         if(raw){
-          // Download
+          // Download (This route is left for backword compatibility)
           JGitUtil.getObjectLoaderFromId(git, objectId){ loader =>
-            //RawData("application/octet-stream", bytes)
             contentType = "application/octet-stream"
             response.setContentLength(loader.getSize.toInt)
-            loader.copyTo(response.getOutputStream)
+            loader.copyTo(response.outputStream)
             ()
           } getOrElse NotFound
         } else {
@@ -745,4 +761,11 @@
 
   private def isEditable(owner: String, repository: String, author: String)(implicit context: Context): Boolean =
     hasWritePermission(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName
+
+
+
+  override protected def renderUncaughtException(e: Throwable)(implicit request: HttpServletRequest, response: HttpServletResponse): Unit = {
+    e.printStackTrace()
+  }
+
 }
diff --git a/src/main/twirl/gitbucket/core/helper/diff.scala.html b/src/main/twirl/gitbucket/core/helper/diff.scala.html
index 99749fc..d05049d 100644
--- a/src/main/twirl/gitbucket/core/helper/diff.scala.html
+++ b/src/main/twirl/gitbucket/core/helper/diff.scala.html
@@ -101,14 +101,14 @@
             @if(diff.newIsImage || diff.oldIsImage){
               <div class="diff-image-render diff2up">@diff.oldIsImage @diff.newIsImage
               @if(oldCommitId.isDefined && diff.oldIsImage){
-                <div class="diff-image-frame diff-old"><img src="@url(repository)/blob/@oldCommitId.get/@diff.oldPath?raw=true" class="diff-image" onload="onLoadedDiffImages(this)" style="display:none" /></div>
+                <div class="diff-image-frame diff-old"><img src="@url(repository)/raw/@oldCommitId.get/@diff.oldPath" class="diff-image" onload="onLoadedDiffImages(this)" style="display:none" /></div>
               } else {
                 @if(diff.changeType != ChangeType.ADD){
                   <div style="padding: 12px;">Not supported</div>
                 }
               }
               @if(newCommitId.isDefined && diff.newIsImage){
-                <div class="diff-image-frame diff-new"><img src="@url(repository)/blob/@newCommitId.get/@diff.newPath?raw=true" class="diff-image" onload="onLoadedDiffImages(this)" style="display:none" /></div>
+                <div class="diff-image-frame diff-new"><img src="@url(repository)/raw/@newCommitId.get/@diff.newPath" class="diff-image" onload="onLoadedDiffImages(this)" style="display:none" /></div>
               } else {
                 @if(diff.changeType != ChangeType.DELETE){
                   <div style="padding: 12px;">Not supported</div>
diff --git a/src/main/twirl/gitbucket/core/repo/blob.scala.html b/src/main/twirl/gitbucket/core/repo/blob.scala.html
index 4dc3d4c..3c08cd1 100644
--- a/src/main/twirl/gitbucket/core/repo/blob.scala.html
+++ b/src/main/twirl/gitbucket/core/repo/blob.scala.html
@@ -56,7 +56,7 @@
         @if(hasWritePermission && content.viewType == "text" && repository.branchList.contains(branch)){
           <a class="btn btn-sm btn-default" href="@url(repository)/edit/@encodeRefName(branch)/@pathList.mkString("/")">Edit</a>
         }
-        <a class="btn btn-sm btn-default" href="?raw=true">Raw</a>
+        <a class="btn btn-sm btn-default" href="@url(repository)/raw/@latestCommit.id/@pathList.mkString("/")">Raw</a>
         @if(content.viewType == "text"){
           <a class="btn btn-sm btn-default blame-action" href="@url(repository)/blame/@latestCommit.id/@pathList.mkString("/")" data-url="@url(repository)/get-blame/@latestCommit.id/@pathList.mkString("/")" data-repository="@url(repository)">Blame</a>
         }
@@ -81,12 +81,12 @@
       }
       @if(content.viewType == "image"){
         <div class="box-content-bottom">
-          <img src="?raw=true"/>
+          <img src="@url(repository)/raw/@encodeRefName(branch)/@pathList.mkString("/")"/>
         </div>
       }
       @if(content.viewType == "large" || content.viewType == "binary"){
         <div class="box-content-bottom" style="text-align: center; padding-top: 20px; padding-bottom: 20px;">
-          <a href="?raw=true">View Raw</a><br>
+          <a href="@url(repository)/raw/@encodeRefName(branch)/@pathList.mkString("/")">View Raw</a><br>
           <br>
           (Sorry about that, but we can't show files that are this big right now)
         </div>