diff --git a/go.mod b/go.mod
index 494108d1bdd90b73ee14aa6a310468ac09e3cc55..4713e000e70dc236794b7cfef22b8ae8953eb5ea 100644
--- a/go.mod
+++ b/go.mod
@@ -7,9 +7,10 @@ require (
 	github.com/MindscapeHQ/raygun4go v1.1.1
 	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
 	github.com/aws/aws-lambda-go v1.26.0
-	github.com/aws/aws-sdk-go-v2 v1.26.1
+	github.com/aws/aws-sdk-go-v2 v1.27.1
 	github.com/aws/aws-sdk-go-v2/config v1.27.10
 	github.com/aws/aws-sdk-go-v2/credentials v1.17.10
+	github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi v1.19.9
 	github.com/aws/aws-sdk-go-v2/service/batch v1.36.1
 	github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1
 	github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.6
@@ -43,8 +44,8 @@ require (
 	github.com/aws/aws-sdk-go v1.44.180 // indirect
 	github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
 	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.8 // indirect
 	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
 	github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect
 	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect
diff --git a/go.sum b/go.sum
index 9946076a47c7a649cc1002cee8c657f4461cea2f..8bb29d35362e77708cc7f003da98953688d48343 100644
--- a/go.sum
+++ b/go.sum
@@ -12,8 +12,8 @@ github.com/aws/aws-sdk-go v1.19.23/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi
 github.com/aws/aws-sdk-go v1.44.180 h1:VLZuAHI9fa/3WME5JjpVjcPCNfpGHVMiHx8sLHWhMgI=
 github.com/aws/aws-sdk-go v1.44.180/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
 github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
-github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA=
-github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
+github.com/aws/aws-sdk-go-v2 v1.27.1 h1:xypCL2owhog46iFxBKKpBcw+bPTX/RJzwNj8uSilENw=
+github.com/aws/aws-sdk-go-v2 v1.27.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to=
 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg=
 github.com/aws/aws-sdk-go-v2/config v1.18.8/go.mod h1:5XCmmyutmzzgkpk/6NYTjeWb6lgo9N170m1j6pQkIBs=
@@ -26,16 +26,18 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21/go.mod h1:ugwW57Z5Z48bpvU
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4=
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg=
 github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8 h1:RnLB7p6aaFMRfyQkD6ckxR7myCC9SABIqSz4czYUUbU=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8/go.mod h1:XH7dQJd+56wEbP1I4e4Duo+QhSMxNArE8VP7NuUOTeM=
 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.8 h1:jzApk2f58L9yW9q1GEab3BMMFWUkkiZhyrRUtbwUbKU=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.8/go.mod h1:WqO+FftfO3tGePUtQxPXM6iODVfqMwsVMgTbG/ZXIdQ=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28/go.mod h1:yRZVr/iT0AqyHeep00SZ4YfBAKojXz08w3XMBscdi0c=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
 github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU=
 github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0=
+github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi v1.19.9 h1:X1A2bnzBrB5uu+DzRTfDBwl+VsH7fCJmQgnGIk3BkKY=
+github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi v1.19.9/go.mod h1:f7D1hvCXZ4hEWk1tVgUOJp6QN6poeDMqVqPw4B/sglE=
 github.com/aws/aws-sdk-go-v2/service/batch v1.36.1 h1:OY9+Dt4FkK6q2VHKAB8zY4nEKOhkziVOtxCPnS94leM=
 github.com/aws/aws-sdk-go-v2/service/batch v1.36.1/go.mod h1:JuPGVm7DzXD73vZBQsZwlDzoJeZewN08swLBGiU47K8=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs=
@@ -138,7 +140,6 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslC
 github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
 github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
 github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
-github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
 github.com/hbollon/go-edlib v1.6.0 h1:ga7AwwVIvP8mHm9GsPueC0d71cfRU/52hmPJ7Tprv4E=
 github.com/hbollon/go-edlib v1.6.0/go.mod h1:wnt6o6EIVEzUfgbUZY7BerzQ2uvzp354qmS2xaLkrhM=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
diff --git a/s3/s3.go b/s3/s3.go
index e3a11e04f54583380e003926d82689aadddbe176..509549a60f8f2764034748f7c1cd6ac908639b40 100644
--- a/s3/s3.go
+++ b/s3/s3.go
@@ -330,6 +330,21 @@ func (s ClientWithHelpers) GetSignedDownloadURL(bucket string, fileName string,
 	return getRequest.URL, err
 }
 
+// GetSignedUploadURL gets a signed upload URL for the duration. If scv is nil, a new session will be created.
+func (s ClientWithHelpers) GetSignedUploadURL(bucket string, fileName string, duration time.Duration) (string, error) {
+	putInput := &s3.PutObjectInput{
+		Bucket: aws.String(bucket),
+		Key:    aws.String(fileName),
+	}
+
+	presignClient := s3.NewPresignClient(s.S3Client)
+	putRequest, err := presignClient.PresignPutObject(context.TODO(), putInput, func(po *s3.PresignOptions) {
+		po.Expires = duration
+	})
+
+	return putRequest.URL, err
+}
+
 func (s ClientWithHelpers) FileExists(bucket string, fileName string) (bool, error) {
 	_, err := s.S3Client.HeadObject(context.TODO(), &s3.HeadObjectInput{
 		Bucket: aws.String(bucket),
diff --git a/websocket_utils/websocket_utils.go b/websocket_utils/websocket_utils.go
index 3a77890ddbeb692af6d7008741ce98c55afa838f..dc27a36db516bd3405685d96b3302725c9fd96a3 100644
--- a/websocket_utils/websocket_utils.go
+++ b/websocket_utils/websocket_utils.go
@@ -1,25 +1,31 @@
 package websocket_utils
 
 import (
+	"context"
 	"fmt"
 	"github.com/aws/aws-lambda-go/events"
-	"github.com/aws/aws-sdk-go/aws"
-	"github.com/aws/aws-sdk-go/aws/session"
-	"github.com/aws/aws-sdk-go/service/apigatewaymanagementapi"
-	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/config"
+	"github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi"
+	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/logs"
 	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils"
 	"os"
 )
 
 var (
-	sessions = map[string]*APIGateWaySessionWithHelpers{}
+	sessions = map[string]*APIGateWayClientWithHelpers{}
 )
 
-type APIGateWaySessionWithHelpers struct {
-	APIGatewaySession *apigatewaymanagementapi.ApiGatewayManagementApi
+type APIGateWayClientWithHelpers struct {
+	APIGatewayClient *apigatewaymanagementapi.Client
 }
 
-func GetSession(region ...string) *APIGateWaySessionWithHelpers {
+func GetClient(req *events.APIGatewayWebsocketProxyRequest, region ...string) *APIGateWayClientWithHelpers {
+	if req == nil {
+		logs.ErrorMsg("APIGatewayWebsocketProxyRequest is nil")
+		return nil
+	}
+
 	s3Region := os.Getenv("AWS_REGION")
 
 	// Set custom region
@@ -33,34 +39,29 @@ func GetSession(region ...string) *APIGateWaySessionWithHelpers {
 	}
 
 	// Setup session
-	options := session.Options{
-		Config: aws.Config{
-			Region: utils.ValueToPointer(s3Region),
-		},
-	}
-	sess, err := session.NewSessionWithOptions(options)
+	cfg, err := config.LoadDefaultConfig(context.TODO(),
+		config.WithRegion(s3Region),
+	)
 	if err != nil {
 		return nil
 	}
-	apiGatewaySession := NewSession(sess)
+
+	apiGatewaySession := NewClient(req, cfg)
 	sessions[s3Region] = apiGatewaySession
 	return apiGatewaySession
 }
 
-func NewSession(session *session.Session) *APIGateWaySessionWithHelpers {
-	return &APIGateWaySessionWithHelpers{
-		APIGatewaySession: apigatewaymanagementapi.New(session),
+func NewClient(req *events.APIGatewayWebsocketProxyRequest, config aws.Config) *APIGateWayClientWithHelpers {
+	return &APIGateWayClientWithHelpers{
+		APIGatewayClient: apigatewaymanagementapi.NewFromConfig(config, func(o *apigatewaymanagementapi.Options) {
+			o.BaseEndpoint = utils.ValueToPointer(fmt.Sprintf("https://%s/%s", req.RequestContext.DomainName, req.RequestContext.Stage))
+		}),
 	}
 }
 
-func (s APIGateWaySessionWithHelpers) PostToConnectionIDs(data []byte, req *events.APIGatewayWebsocketProxyRequest, connectionIDs []string) error {
-	if req == nil {
-		return errors.Error("websocket request is nil")
-	}
-
+func (s APIGateWayClientWithHelpers) PostToConnectionIDs(data []byte, connectionIDs []string) error {
 	for _, connectionID := range connectionIDs {
-		s.APIGatewaySession.Endpoint = fmt.Sprintf("https://%s/%s", req.RequestContext.DomainName, req.RequestContext.Stage)
-		_, err := s.APIGatewaySession.PostToConnection(&apigatewaymanagementapi.PostToConnectionInput{
+		_, err := s.APIGatewayClient.PostToConnection(context.TODO(), &apigatewaymanagementapi.PostToConnectionInput{
 			ConnectionId: &connectionID,
 			Data:         data,
 		})