diff --git a/package.json b/package.json
index 4105d6deb4c6d7cbc8cdd22878b6ca2bd19091d7..3b9aba1e79dd28d03792080e50e1e240ac6c4af6 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,6 @@
     "mime-types": "^2.1.34",
     "moment": "^2.29.1",
     "morgan": "^1.10.0",
-    "multer": "^1.1.0",
     "node-cron": "^2.0.3",
     "nodemailer": "^6.4.18",
     "objection": "^2.2.15",
diff --git a/src/app.js b/src/app.js
index 5424f327282acdaf9258639a463723b1f9e19680..b74634f534a8b62e42ee88a9e414e66bf9d7ac68 100644
--- a/src/app.js
+++ b/src/app.js
@@ -1,12 +1,9 @@
 /* eslint-disable global-require, no-param-reassign */
 
-const path = require('path')
-
 const bodyParser = require('body-parser')
 const config = require('config')
 const cors = require('cors')
 const cookieParser = require('cookie-parser')
-const express = require('express')
 const helmet = require('helmet')
 const STATUS = require('http-status-codes')
 const morgan = require('morgan')
@@ -59,15 +56,6 @@ const configureApp = async app => {
 
   mountStatic(app)
 
-  if (config.has('uploads')) {
-    app.use(
-      '/uploads',
-      express.static(
-        path.resolve(config.has('uploads') && config.get('uploads')),
-      ),
-    )
-  }
-
   // Register passport authentication strategies
   app.use(passport.initialize())
   const authentication = require('./authentication')
diff --git a/src/graphqlSchema.js b/src/graphqlSchema.js
index dd2195f8fc9e6774f5b78ecf50e8814d683d3747..3d889c57a905a979f57910a71b26edd1ae25edd1 100644
--- a/src/graphqlSchema.js
+++ b/src/graphqlSchema.js
@@ -11,19 +11,18 @@ const logger = require('./logger')
 const { logTask } = require('./logger/internals')
 const tryRequireRelative = require('./tryRequireRelative')
 
-const upload = require('./upload')
 const emailMiddleware = require('./middleware/email')
 
 // #region BUILD-SCHEMA
 // load base types and resolvers
-const typeDefs = [
-  `type Query, type Mutation, type Subscription`,
-  upload.typeDefs,
-]
-
-const resolvers = merge({}, upload.resolvers, {
-  Upload: GraphQLUpload,
-})
+const typeDefs = [`type Query, type Mutation, type Subscription, scalar Upload`]
+
+const resolvers = merge(
+  {},
+  {
+    Upload: GraphQLUpload,
+  },
+)
 
 // recursively merge in component types and resolvers
 function getSchemaRecursively(componentName) {
diff --git a/src/routes/api.js b/src/routes/api.js
index 4bdb5f2c23c08e512c0868a31e6f991339eb7c85..e0edb7dd962801c938d2fbde8f639ca65dd171b8 100644
--- a/src/routes/api.js
+++ b/src/routes/api.js
@@ -5,9 +5,4 @@ const api = express.Router({ mergeParams: true })
 
 api.use(helmet())
 
-// File upload API
-const upload = require('./apiUpload')
-
-api.use(upload)
-
 module.exports = api
diff --git a/src/routes/apiUpload.js b/src/routes/apiUpload.js
deleted file mode 100644
index 69723f64609adfc336c403773ccc84f58ea3a171..0000000000000000000000000000000000000000
--- a/src/routes/apiUpload.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const path = require('path')
-const crypto = require('crypto')
-const multer = require('multer')
-const passport = require('passport')
-const express = require('express')
-const config = require('config')
-
-const api = express.Router()
-
-const authBearer = passport.authenticate('bearer', { session: false })
-
-const storage = multer.diskStorage({
-  destination: config.has('uploads') && config.get('uploads'),
-  filename(req, file, cb) {
-    /* eslint-disable-next-line node/no-deprecated-api */
-    crypto.pseudoRandomBytes(16, (err, raw) => {
-      if (err) {
-        cb(err)
-        return
-      }
-
-      cb(null, raw.toString('hex') + path.extname(file.originalname))
-    })
-  },
-})
-
-const upload = multer({
-  storage,
-  limits: { fileSize: 10000000, files: 1 },
-})
-
-api.post('/upload', authBearer, upload.single('file'), (req, res, next) =>
-  res.send(`/${req.file.path}`),
-)
-
-module.exports = api
diff --git a/src/services/docx/docx.service.js b/src/services/docx/docx.service.js
index 8b48ccf7a2d2f6bd75d31871f2ac2e8d374fefc2..951a08c01aaca7e540928b09cd862f39cde97948 100644
--- a/src/services/docx/docx.service.js
+++ b/src/services/docx/docx.service.js
@@ -502,7 +502,6 @@ class WaxToDocxConverter {
 
       const buffer = await Packer.toBuffer(parsed)
       fs.writeFileSync(path, buffer)
-      return
     } catch (e) {
       this.error(e)
     }
diff --git a/src/upload.js b/src/upload.js
deleted file mode 100644
index 9eeb014997a4230c41f95a2e28e1b47b1c817e13..0000000000000000000000000000000000000000
--- a/src/upload.js
+++ /dev/null
@@ -1,77 +0,0 @@
-const path = require('path')
-const crypto = require('crypto')
-const fs = require('fs-extra')
-const { promisify } = require('util')
-const config = require('config')
-
-const { getPubsub, asyncIterators } = require('./graphql/pubsub')
-
-const { ON_UPLOAD_PROGRESS } = asyncIterators
-const randomBytes = promisify(crypto.randomBytes)
-
-const resolvers = {
-  Mutation: {
-    upload: async (_, { file, fileSize }, context) => {
-      const uploadsPath = config.has('uploads') && config.get('uploads')
-      const pubsub = await getPubsub()
-      const { createReadStream, filename, encoding } = await file
-      const stream = createReadStream()
-
-      const raw = await randomBytes(16)
-      const generatedFilename = raw.toString('hex') + path.extname(filename)
-      const outPath = path.join(uploadsPath, generatedFilename)
-
-      await fs.ensureDir(uploadsPath)
-      const outStream = fs.createWriteStream(outPath)
-      stream.pipe(outStream, { encoding })
-      let uploadedSize = 0
-
-      stream.on('data', chunk => {
-        uploadedSize += chunk.length
-        let uploadProgress
-
-        if (fileSize) {
-          uploadProgress = Math.floor((uploadedSize * 100) / fileSize)
-        } else {
-          uploadProgress = uploadedSize
-        }
-
-        pubsub.publish(`${ON_UPLOAD_PROGRESS}.${context.user}`, {
-          uploadProgress,
-        })
-      })
-
-      return new Promise((resolve, reject) => {
-        outStream.on('finish', () => resolve({ url: `/${generatedFilename}` }))
-        outStream.on('error', reject)
-      })
-    },
-  },
-  Subscription: {
-    uploadProgress: {
-      subscribe: async (_, vars, context) => {
-        const pubsub = await getPubsub()
-        return pubsub.asyncIterator(`${ON_UPLOAD_PROGRESS}.${context.user}`)
-      },
-    },
-  },
-}
-
-const typeDefs = `
-  scalar Upload
-
-  extend type Mutation {
-    # Upload a file, store it on the server and return the file url
-    upload(file: Upload!, fileSize: Int): UploadResult
-  }
-
-  extend type Subscription {
-    uploadProgress: Int!
-  }
-
-  type UploadResult {
-    url: String
-  }
-`
-
-module.exports = { typeDefs, resolvers }
diff --git a/yarn.lock b/yarn.lock
index bc87331c61a59876f3ddcb556028fc3ef010dfdb..5f6d78d5f895d368227af5794e992d0c85b936f6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1440,7 +1440,6 @@ __metadata:
     mime-types: "npm:^2.1.34"
     moment: "npm:^2.29.1"
     morgan: "npm:^1.10.0"
-    multer: "npm:^1.1.0"
     node-cron: "npm:^2.0.3"
     node-wait-for-it: "npm:^0.2.0"
     nodemailer: "npm:^6.4.18"
@@ -3890,13 +3889,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"append-field@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "append-field@npm:1.0.0"
-  checksum: 10c0/1b5abcc227e5179936a9e4f7e2af4769fa1f00eda85bbaed907f7964b0fd1f7d61f0f332b35337f391389ff13dd5310c2546ba670f8e5a743b23ec85185c73ef
-  languageName: node
-  linkType: hard
-
 "aproba@npm:^1.0.3 || ^2.0.0":
   version: 2.0.0
   resolution: "aproba@npm:2.0.0"
@@ -4576,16 +4568,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"busboy@npm:^0.2.11":
-  version: 0.2.14
-  resolution: "busboy@npm:0.2.14"
-  dependencies:
-    dicer: "npm:0.2.5"
-    readable-stream: "npm:1.1.x"
-  checksum: 10c0/660ce531347a03210f46080c2447030c41f60202be0d8dd1544482786341a497b1d4d8941e3c7c9b5e6ed4edc42003c28c9451e1fde87dd94010df69bb27cc38
-  languageName: node
-  linkType: hard
-
 "busboy@npm:^0.3.1":
   version: 0.3.1
   resolution: "busboy@npm:0.3.1"
@@ -5177,18 +5159,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"concat-stream@npm:^1.5.2":
-  version: 1.6.2
-  resolution: "concat-stream@npm:1.6.2"
-  dependencies:
-    buffer-from: "npm:^1.0.0"
-    inherits: "npm:^2.0.3"
-    readable-stream: "npm:^2.2.2"
-    typedarray: "npm:^0.0.6"
-  checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617
-  languageName: node
-  linkType: hard
-
 "concat-stream@npm:^2.0.0":
   version: 2.0.0
   resolution: "concat-stream@npm:2.0.0"
@@ -6175,16 +6145,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"dicer@npm:0.2.5":
-  version: 0.2.5
-  resolution: "dicer@npm:0.2.5"
-  dependencies:
-    readable-stream: "npm:1.1.x"
-    streamsearch: "npm:0.1.2"
-  checksum: 10c0/c0520cee8c4d8c7e2db4f8fe30c0fdbf96d9623d53a65b54f4e0d9a89b76c3e0c397de54a1530c1d4b1788d1e87ff3ca5800e3ba93c748e0cd24827b505fb5e7
-  languageName: node
-  linkType: hard
-
 "dicer@npm:0.3.0":
   version: 0.3.0
   resolution: "dicer@npm:0.3.0"
@@ -8754,7 +8714,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4":
+"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4":
   version: 2.0.4
   resolution: "inherits@npm:2.0.4"
   checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2
@@ -9385,13 +9345,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"isarray@npm:0.0.1":
-  version: 0.0.1
-  resolution: "isarray@npm:0.0.1"
-  checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311
-  languageName: node
-  linkType: hard
-
 "isarray@npm:1.0.0, isarray@npm:~1.0.0":
   version: 1.0.0
   resolution: "isarray@npm:1.0.0"
@@ -11252,7 +11205,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4":
+"mkdirp@npm:^0.5.1":
   version: 0.5.6
   resolution: "mkdirp@npm:0.5.6"
   dependencies:
@@ -11346,22 +11299,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"multer@npm:^1.1.0":
-  version: 1.4.4
-  resolution: "multer@npm:1.4.4"
-  dependencies:
-    append-field: "npm:^1.0.0"
-    busboy: "npm:^0.2.11"
-    concat-stream: "npm:^1.5.2"
-    mkdirp: "npm:^0.5.4"
-    object-assign: "npm:^4.1.1"
-    on-finished: "npm:^2.3.0"
-    type-is: "npm:^1.6.4"
-    xtend: "npm:^4.0.0"
-  checksum: 10c0/ae7505b440b833bffe4d4b712659fc880b3a3735db1190745e738138b069b2344d0d17e3985c93f0aee287d795572dbb7a90af31ec33bd1293cbf90366934b7b
-  languageName: node
-  linkType: hard
-
 "mute-stream@npm:0.0.7":
   version: 0.0.7
   resolution: "mute-stream@npm:0.0.7"
@@ -11909,7 +11846,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"on-finished@npm:2.4.1, on-finished@npm:^2.3.0":
+"on-finished@npm:2.4.1":
   version: 2.4.1
   resolution: "on-finished@npm:2.4.1"
   dependencies:
@@ -13025,18 +12962,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"readable-stream@npm:1.1.x":
-  version: 1.1.14
-  resolution: "readable-stream@npm:1.1.14"
-  dependencies:
-    core-util-is: "npm:~1.0.0"
-    inherits: "npm:~2.0.1"
-    isarray: "npm:0.0.1"
-    string_decoder: "npm:~0.10.x"
-  checksum: 10c0/b7f41b16b305103d598e3c8964fa30d52d6e0b5d9fdad567588964521691c24b279c7a8bb71f11927c3613acf355bac72d8396885a43d50425b2caafd49bc83d
-  languageName: node
-  linkType: hard
-
 "readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0":
   version: 3.6.2
   resolution: "readable-stream@npm:3.6.2"
@@ -13048,7 +12973,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.5, readable-stream@npm:~2.3.6":
+"readable-stream@npm:^2.3.5, readable-stream@npm:~2.3.6":
   version: 2.3.8
   resolution: "readable-stream@npm:2.3.8"
   dependencies:
@@ -14315,13 +14240,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"string_decoder@npm:~0.10.x":
-  version: 0.10.31
-  resolution: "string_decoder@npm:0.10.31"
-  checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25
-  languageName: node
-  linkType: hard
-
 "string_decoder@npm:~1.1.1":
   version: 1.1.1
   resolution: "string_decoder@npm:1.1.1"
@@ -15185,7 +15103,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"type-is@npm:^1.6.16, type-is@npm:^1.6.4, type-is@npm:~1.6.18":
+"type-is@npm:^1.6.16, type-is@npm:~1.6.18":
   version: 1.6.18
   resolution: "type-is@npm:1.6.18"
   dependencies: