diff --git a/api/r0/download.go b/api/r0/download.go
index 5272e38687f5c041fe7af243e9a705ec8e3fc4f4..7855f73e7ce1804fc118a5578159114a6a571769 100644
--- a/api/r0/download.go
+++ b/api/r0/download.go
@@ -9,7 +9,7 @@ import (
 	"github.com/turt2live/matrix-media-repo/api/_apimeta"
 	"github.com/turt2live/matrix-media-repo/api/_responses"
 	"github.com/turt2live/matrix-media-repo/api/_routers"
-	"github.com/turt2live/matrix-media-repo/pipline/download_pipeline"
+	"github.com/turt2live/matrix-media-repo/pipelines/pipeline_download"
 	"github.com/turt2live/matrix-media-repo/util"
 
 	"github.com/sirupsen/logrus"
@@ -75,7 +75,7 @@ func DownloadMedia(r *http.Request, rctx rcontext.RequestContext, user _apimeta.
 		return _responses.MediaBlocked()
 	}
 
-	media, stream, err := download_pipeline.DownloadMedia(rctx, server, mediaId, download_pipeline.DownloadOpts{
+	media, stream, err := pipeline_download.Execute(rctx, server, mediaId, pipeline_download.DownloadOpts{
 		FetchRemoteIfNeeded: downloadRemote,
 		StartByte:           -1,
 		EndByte:             -1,
diff --git a/api/r0/upload.go b/api/r0/upload.go
index 3287154fec09b21ac06757f80d82ade42eac9689..4734ba0ab882cf092dd8edc43014117b42bc69aa 100644
--- a/api/r0/upload.go
+++ b/api/r0/upload.go
@@ -13,7 +13,7 @@ import (
 	"github.com/turt2live/matrix-media-repo/common/rcontext"
 	"github.com/turt2live/matrix-media-repo/database"
 	"github.com/turt2live/matrix-media-repo/datastores"
-	"github.com/turt2live/matrix-media-repo/pipline/upload_pipeline"
+	"github.com/turt2live/matrix-media-repo/pipelines/pipeline_upload"
 	"github.com/turt2live/matrix-media-repo/util"
 )
 
@@ -60,7 +60,7 @@ func UploadMedia(r *http.Request, rctx rcontext.RequestContext, user _apimeta.Us
 	}
 
 	// Actually upload
-	media, err := upload_pipeline.UploadMedia(rctx, r.Host, "", r.Body, contentType, filename, user.UserId, datastores.LocalMediaKind)
+	media, err := pipeline_upload.Execute(rctx, r.Host, "", r.Body, contentType, filename, user.UserId, datastores.LocalMediaKind)
 	if err != nil {
 		if err == common.ErrQuotaExceeded {
 			return _responses.QuotaExceeded()
diff --git a/api/v1/create.go b/api/v1/create.go
index 0617093f809928103e9e594b07c3f6d7a9a5e0c6..2036482fbc5b71a323b6fcbdf12ac74deb371b08 100644
--- a/api/v1/create.go
+++ b/api/v1/create.go
@@ -7,7 +7,7 @@ import (
 	"github.com/turt2live/matrix-media-repo/api/_apimeta"
 	"github.com/turt2live/matrix-media-repo/api/_responses"
 	"github.com/turt2live/matrix-media-repo/common/rcontext"
-	"github.com/turt2live/matrix-media-repo/pipline/create_pipeline"
+	"github.com/turt2live/matrix-media-repo/pipelines/pipeline_create"
 	"github.com/turt2live/matrix-media-repo/util"
 )
 
@@ -17,7 +17,7 @@ type MediaCreatedResponse struct {
 }
 
 func CreateMedia(r *http.Request, rctx rcontext.RequestContext, user _apimeta.UserInfo) interface{} {
-	id, err := create_pipeline.Execute(rctx, r.Host, user.UserId, create_pipeline.DefaultExpirationTime)
+	id, err := pipeline_create.Execute(rctx, r.Host, user.UserId, pipeline_create.DefaultExpirationTime)
 	if err != nil {
 		rctx.Log.Error("Unexpected error creating media ID:", err)
 		sentry.CaptureException(err)
diff --git a/pipline/_steps/download/open_stream.go b/pipelines/_steps/download/open_stream.go
similarity index 100%
rename from pipline/_steps/download/open_stream.go
rename to pipelines/_steps/download/open_stream.go
diff --git a/pipline/_steps/download/try_download.go b/pipelines/_steps/download/try_download.go
similarity index 96%
rename from pipline/_steps/download/try_download.go
rename to pipelines/_steps/download/try_download.go
index a963505af332c90ee10a5cd7c21f0f016cfdbb9b..a892add75c8490c1ed55cbfbf19a6e2ccd0bcec2 100644
--- a/pipline/_steps/download/try_download.go
+++ b/pipelines/_steps/download/try_download.go
@@ -19,7 +19,7 @@ import (
 	"github.com/turt2live/matrix-media-repo/errcache"
 	"github.com/turt2live/matrix-media-repo/matrix"
 	"github.com/turt2live/matrix-media-repo/metrics"
-	"github.com/turt2live/matrix-media-repo/pipline/upload_pipeline"
+	"github.com/turt2live/matrix-media-repo/pipelines/pipeline_upload"
 	"github.com/turt2live/matrix-media-repo/pool"
 	"github.com/turt2live/matrix-media-repo/util"
 )
@@ -147,7 +147,7 @@ func TryDownload(ctx rcontext.RequestContext, origin string, mediaId string) (*d
 	}(dsConf, pr, bufferCh)
 
 	go func(ctx rcontext.RequestContext, origin string, mediaId string, r io.ReadCloser, upstreamClose func() error, contentType string, fileName string, uploadCh chan uploadResult) {
-		m, err2 := upload_pipeline.UploadMedia(ctx, origin, mediaId, r, contentType, fileName, "", datastores.RemoteMediaKind)
+		m, err2 := pipeline_upload.Execute(ctx, origin, mediaId, r, contentType, fileName, "", datastores.RemoteMediaKind)
 		// async the channel update to avoid deadlocks
 		go func(uploadCh chan uploadResult, err2 error, m *database.DbMedia) {
 			uploadCh <- uploadResult{err: err2, m: m}
diff --git a/pipline/_steps/quota/check.go b/pipelines/_steps/quota/check.go
similarity index 100%
rename from pipline/_steps/quota/check.go
rename to pipelines/_steps/quota/check.go
diff --git a/pipline/_steps/upload/blurhash_async.go b/pipelines/_steps/upload/blurhash_async.go
similarity index 100%
rename from pipline/_steps/upload/blurhash_async.go
rename to pipelines/_steps/upload/blurhash_async.go
diff --git a/pipline/_steps/upload/deduplicate.go b/pipelines/_steps/upload/deduplicate.go
similarity index 100%
rename from pipline/_steps/upload/deduplicate.go
rename to pipelines/_steps/upload/deduplicate.go
diff --git a/pipline/_steps/upload/generate_media_id.go b/pipelines/_steps/upload/generate_media_id.go
similarity index 100%
rename from pipline/_steps/upload/generate_media_id.go
rename to pipelines/_steps/upload/generate_media_id.go
diff --git a/pipline/_steps/upload/limit.go b/pipelines/_steps/upload/limit.go
similarity index 100%
rename from pipline/_steps/upload/limit.go
rename to pipelines/_steps/upload/limit.go
diff --git a/pipline/_steps/upload/lock.go b/pipelines/_steps/upload/lock.go
similarity index 100%
rename from pipline/_steps/upload/lock.go
rename to pipelines/_steps/upload/lock.go
diff --git a/pipline/_steps/upload/quarantine.go b/pipelines/_steps/upload/quarantine.go
similarity index 100%
rename from pipline/_steps/upload/quarantine.go
rename to pipelines/_steps/upload/quarantine.go
diff --git a/pipline/_steps/upload/redis_async.go b/pipelines/_steps/upload/redis_async.go
similarity index 100%
rename from pipline/_steps/upload/redis_async.go
rename to pipelines/_steps/upload/redis_async.go
diff --git a/pipline/create_pipeline/pipeline.go b/pipelines/pipeline_create/pipeline.go
similarity index 87%
rename from pipline/create_pipeline/pipeline.go
rename to pipelines/pipeline_create/pipeline.go
index 6cbf918ff4f8b19ed6fba32c50f5b16dc290751b..c2167a70c129a8c3aa160a7cd29c92238bcf9931 100644
--- a/pipline/create_pipeline/pipeline.go
+++ b/pipelines/pipeline_create/pipeline.go
@@ -1,10 +1,10 @@
-package create_pipeline
+package pipeline_create
 
 import (
 	"github.com/turt2live/matrix-media-repo/common/rcontext"
 	"github.com/turt2live/matrix-media-repo/database"
-	"github.com/turt2live/matrix-media-repo/pipline/_steps/quota"
-	"github.com/turt2live/matrix-media-repo/pipline/_steps/upload"
+	"github.com/turt2live/matrix-media-repo/pipelines/_steps/quota"
+	"github.com/turt2live/matrix-media-repo/pipelines/_steps/upload"
 	"github.com/turt2live/matrix-media-repo/util"
 )
 
diff --git a/pipline/download_pipeline/pipeline.go b/pipelines/pipeline_download/pipeline.go
similarity index 91%
rename from pipline/download_pipeline/pipeline.go
rename to pipelines/pipeline_download/pipeline.go
index c7b06097e2284dc409235b7f2d2e4afd4e53a82e..f678b7488f4f002c6bdd2d90a874efefbaf22064 100644
--- a/pipline/download_pipeline/pipeline.go
+++ b/pipelines/pipeline_download/pipeline.go
@@ -1,4 +1,4 @@
-package download_pipeline
+package pipeline_download
 
 import (
 	"context"
@@ -10,7 +10,7 @@ import (
 	"github.com/turt2live/matrix-media-repo/common"
 	"github.com/turt2live/matrix-media-repo/common/rcontext"
 	"github.com/turt2live/matrix-media-repo/database"
-	"github.com/turt2live/matrix-media-repo/pipline/_steps/download"
+	"github.com/turt2live/matrix-media-repo/pipelines/_steps/download"
 )
 
 var sf = new(sfstreams.Group)
@@ -41,7 +41,7 @@ func (c *cancelCloser) Close() error {
 	return c.r.Close()
 }
 
-func DownloadMedia(ctx rcontext.RequestContext, origin string, mediaId string, opts DownloadOpts) (*database.DbMedia, io.ReadCloser, error) {
+func Execute(ctx rcontext.RequestContext, origin string, mediaId string, opts DownloadOpts) (*database.DbMedia, io.ReadCloser, error) {
 	// Step 1: Make our context a timeout context
 	var cancel context.CancelFunc
 	//goland:noinspection GoVetLostCancel - we handle the function in our custom cancelCloser struct
diff --git a/pipline/upload_pipeline/pipeline.go b/pipelines/pipeline_upload/pipeline.go
similarity index 90%
rename from pipline/upload_pipeline/pipeline.go
rename to pipelines/pipeline_upload/pipeline.go
index 6a8c87654c8b3a45c7052eb28f6a54aaa988353d..15a924561155b1146c83ffc75c210dbe1cb6477f 100644
--- a/pipline/upload_pipeline/pipeline.go
+++ b/pipelines/pipeline_upload/pipeline.go
@@ -1,4 +1,4 @@
-package upload_pipeline
+package pipeline_upload
 
 import (
 	"errors"
@@ -8,13 +8,13 @@ import (
 	"github.com/turt2live/matrix-media-repo/common/rcontext"
 	"github.com/turt2live/matrix-media-repo/database"
 	"github.com/turt2live/matrix-media-repo/datastores"
-	"github.com/turt2live/matrix-media-repo/pipline/_steps/quota"
-	"github.com/turt2live/matrix-media-repo/pipline/_steps/upload"
+	"github.com/turt2live/matrix-media-repo/pipelines/_steps/quota"
+	"github.com/turt2live/matrix-media-repo/pipelines/_steps/upload"
 	"github.com/turt2live/matrix-media-repo/util"
 )
 
-// UploadMedia Media upload. If mediaId is an empty string, one will be generated.
-func UploadMedia(ctx rcontext.RequestContext, origin string, mediaId string, r io.ReadCloser, contentType string, fileName string, userId string, kind datastores.Kind) (*database.DbMedia, error) {
+// Execute Media upload. If mediaId is an empty string, one will be generated.
+func Execute(ctx rcontext.RequestContext, origin string, mediaId string, r io.ReadCloser, contentType string, fileName string, userId string, kind datastores.Kind) (*database.DbMedia, error) {
 	// Step 1: Limit the stream's length
 	r = upload.LimitStream(ctx, r)