diff --git a/app.js b/app.js
index e6fb0df..86f2ff6 100644
--- a/app.js
+++ b/app.js
@@ -10,10 +10,8 @@ var compression = require('compression')
 var session = require('express-session')
 var SequelizeStore = require('connect-session-sequelize')(session.Store)
 var fs = require('fs')
-var url = require('url')
 var path = require('path')
-var imgur = require('imgur')
-var formidable = require('formidable')
+
 var morgan = require('morgan')
 var passportSocketIo = require('passport.socketio')
 var helmet = require('helmet')
@@ -200,87 +198,7 @@ app.use(require('./lib/web/statusRouter'))
 app.use(require('./lib/web/auth'))
 app.use(require('./lib/web/historyRouter'))
 app.use(require('./lib/web/userRouter'))
-// upload image
-app.post('/uploadimage', function (req, res) {
-  var form = new formidable.IncomingForm()
-
-  form.keepExtensions = true
-
-  if (config.imageUploadType === 'filesystem') {
-    form.uploadDir = 'public/uploads'
-  }
-
-  form.parse(req, function (err, fields, files) {
-    if (err || !files.image || !files.image.path) {
-      response.errorForbidden(res)
-    } else {
-      if (config.debug) { logger.info('SERVER received uploadimage: ' + JSON.stringify(files.image)) }
-
-      try {
-        switch (config.imageUploadType) {
-          case 'filesystem':
-            res.send({
-              link: url.resolve(config.serverurl + '/', files.image.path.match(/^public\/(.+$)/)[1])
-            })
-
-            break
-
-          case 's3':
-            var AWS = require('aws-sdk')
-            var awsConfig = new AWS.Config(config.s3)
-            var s3 = new AWS.S3(awsConfig)
-
-            fs.readFile(files.image.path, function (err, buffer) {
-              if (err) {
-                logger.error(err)
-                res.status(500).end('upload image error')
-                return
-              }
-              var params = {
-                Bucket: config.s3bucket,
-                Key: path.join('uploads', path.basename(files.image.path)),
-                Body: buffer
-              }
-
-              var mimeType = getImageMimeType(files.image.path)
-              if (mimeType) { params.ContentType = mimeType }
-
-              s3.putObject(params, function (err, data) {
-                if (err) {
-                  logger.error(err)
-                  res.status(500).end('upload image error')
-                  return
-                }
-                res.send({
-                  link: `https://s3-${config.s3.region}.amazonaws.com/${config.s3bucket}/${params.Key}`
-                })
-              })
-            })
-            break
-          case 'imgur':
-          default:
-            imgur.setClientId(config.imgur.clientID)
-            imgur.uploadFile(files.image.path)
-              .then(function (json) {
-                if (config.debug) { logger.info('SERVER uploadimage success: ' + JSON.stringify(json)) }
-                res.send({
-                  link: json.data.link.replace(/^http:\/\//i, 'https://')
-                })
-              })
-              .catch(function (err) {
-                logger.error(err)
-                return res.status(500).end('upload image error')
-              })
-            break
-        }
-      } catch (err) {
-        logger.error(err)
-        return res.status(500).end('upload image error')
-      }
-    }
-  })
-})
-
+app.use(require('./lib/web/imageRouter'))
 app.use(require('./lib/web/noteRouter'))
 
 // response not found if no any route matxches
diff --git a/lib/web/imageRouter.js b/lib/web/imageRouter.js
new file mode 100644
index 0000000..7a3819c
--- /dev/null
+++ b/lib/web/imageRouter.js
@@ -0,0 +1,95 @@
+'use strict'
+var fs = require('fs')
+var url = require('url')
+var path = require('path')
+
+const Router = require('express').Router
+const formidable = require('formidable')
+var imgur = require('imgur')
+
+const config = require('../config')
+const logger = require('../logger')
+const response = require('../response')
+
+const imageRouter = module.exports = Router()
+
+// upload image
+imageRouter.post('/uploadimage', function (req, res) {
+  var form = new formidable.IncomingForm()
+
+  form.keepExtensions = true
+
+  if (config.imageUploadType === 'filesystem') {
+    form.uploadDir = 'public/uploads'
+  }
+
+  form.parse(req, function (err, fields, files) {
+    if (err || !files.image || !files.image.path) {
+      response.errorForbidden(res)
+    } else {
+      if (config.debug) { logger.info('SERVER received uploadimage: ' + JSON.stringify(files.image)) }
+
+      try {
+        switch (config.imageUploadType) {
+          case 'filesystem':
+            res.send({
+              link: url.resolve(config.serverurl + '/', files.image.path.match(/^public\/(.+$)/)[1])
+            })
+
+            break
+
+          case 's3':
+            var AWS = require('aws-sdk')
+            var awsConfig = new AWS.Config(config.s3)
+            var s3 = new AWS.S3(awsConfig)
+
+            fs.readFile(files.image.path, function (err, buffer) {
+              if (err) {
+                logger.error(err)
+                res.status(500).end('upload image error')
+                return
+              }
+              var params = {
+                Bucket: config.s3bucket,
+                Key: path.join('uploads', path.basename(files.image.path)),
+                Body: buffer
+              }
+
+              var mimeType = getImageMimeType(files.image.path)
+              if (mimeType) { params.ContentType = mimeType }
+
+              s3.putObject(params, function (err, data) {
+                if (err) {
+                  logger.error(err)
+                  res.status(500).end('upload image error')
+                  return
+                }
+                res.send({
+                  link: `https://s3-${config.s3.region}.amazonaws.com/${config.s3bucket}/${params.Key}`
+                })
+              })
+            })
+            break
+          case 'imgur':
+          default:
+            imgur.setClientId(config.imgur.clientID)
+            imgur.uploadFile(files.image.path)
+              .then(function (json) {
+                if (config.debug) { logger.info('SERVER uploadimage success: ' + JSON.stringify(json)) }
+                res.send({
+                  link: json.data.link.replace(/^http:\/\//i, 'https://')
+                })
+              })
+              .catch(function (err) {
+                logger.error(err)
+                return res.status(500).end('upload image error')
+              })
+            break
+        }
+      } catch (err) {
+        logger.error(err)
+        return res.status(500).end('upload image error')
+      }
+    }
+  })
+})