diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,15 @@
 # Changelog for Calamity
 
+## 0.1.17.0
+
+*2020-06-28*
+
+* Allow the session used for http requests to be specified to the client.
+
+* Drop from using a Wreq fork to vanilla Wreq.
+
+* `TFile` now requires a filename parameter.
+
 ## 0.1.16.0
 
 * Change how commands should be manually invoked from code, instead of firing a
diff --git a/calamity.cabal b/calamity.cabal
--- a/calamity.cabal
+++ b/calamity.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 7fb5885fd8780fbb721679f8e2823047e0bea244a686ec69115ca4b56159f700
+-- hash: d52c65805c329ab185c6c81bf5373347ad1946bdeef8964dd4999f411797d6a2
 
 name:           calamity
-version:        0.1.16.0
+version:        0.1.17.0
 synopsis:       A library for writing discord bots in haskell
 description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme>
 category:       Network, Web
@@ -162,6 +162,7 @@
     , lens >=4.18 && <5
     , lens-aeson >=1.1 && <2
     , megaparsec >=8 && <9
+    , mime-types >=0.1 && <0.2
     , mtl >=2.2 && <3
     , polysemy >=1.3 && <2
     , polysemy-plugin >=0.2 && <0.3
@@ -179,6 +180,6 @@
     , unordered-containers >=0.2 && <0.3
     , vector >=0.12 && <0.13
     , websockets >=0.12 && <0.13
-    , wreq-patchable >=1.0 && <2
+    , wreq >=0.5 && <0.6
     , wuss >=1.1 && <2
   default-language: Haskell2010
diff --git a/src/Calamity/Client/Client.hs b/src/Calamity/Client/Client.hs
--- a/src/Calamity/Client/Client.hs
+++ b/src/Calamity/Client/Client.hs
@@ -55,6 +55,8 @@
 
 import qualified DiPolysemy                        as Di
 
+import           Network.Wreq.Session            ( Session, newAPISession )
+
 import           Fmt
 
 import qualified Polysemy                          as P
@@ -75,8 +77,8 @@
   pure (duration, res)
 
 
-newClient :: Token -> IO Client
-newClient token = do
+newClient :: Token -> Session -> IO Client
+newClient token session = do
   shards'        <- newTVarIO []
   numShards'     <- newEmptyMVar
   rlState'       <- newRateLimitState
@@ -90,6 +92,7 @@
                 inc
                 outc
                 ehidCounter
+                session
 
 -- | Create a bot, run your setup action, and then loop until the bot closes.
 runBotIO :: forall r a.
@@ -97,20 +100,22 @@
          => Token
          -> P.Sem (SetupEff r) a
          -> P.Sem r (Maybe StartupError)
-runBotIO token setup = runBotIO' token Nothing Nothing setup
+runBotIO token setup = runBotIO' token Nothing Nothing Nothing setup
 
 -- | Create a bot, run your setup action, and then loop until the bot closes.
 --
--- This version allows you to specify the initial status and intents.
+-- This version allows you to specify the session and initial status and intents.
 runBotIO' :: forall r a.
           (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff] r, Typeable (SetupEff r))
           => Token
+          -> Maybe Session
           -> Maybe StatusUpdateData
           -> Maybe Intents
           -> P.Sem (SetupEff r) a
           -> P.Sem r (Maybe StartupError)
-runBotIO' token status intents setup = do
-  client <- P.embed $ newClient token
+runBotIO' token session status intents setup = do
+  session' <- maybe (P.embed newAPISession) pure session
+  client <- P.embed $ newClient token session'
   handlers <- P.embed $ newTVarIO def
   P.asyncToIOFinal . P.runAtomicStateTVar handlers . P.runReader client . Di.runDiToStderrIOFinal . Di.push "calamity" $ do
     void $ Di.push "calamity-setup" setup
diff --git a/src/Calamity/Client/Types.hs b/src/Calamity/Client/Types.hs
--- a/src/Calamity/Client/Types.hs
+++ b/src/Calamity/Client/Types.hs
@@ -44,6 +44,8 @@
 import           Data.Typeable
 import           Data.Void
 
+import           Network.Wreq.Session            ( Session )
+
 import           GHC.Exts                        ( fromList )
 import           GHC.Generics
 
@@ -63,6 +65,7 @@
   , eventsIn            :: InChan CalamityEvent
   , eventsOut           :: OutChan CalamityEvent
   , ehidCounter         :: IORef Integer
+  , session             :: Session
   }
   deriving ( Generic )
 
diff --git a/src/Calamity/Commands.hs b/src/Calamity/Commands.hs
--- a/src/Calamity/Commands.hs
+++ b/src/Calamity/Commands.hs
@@ -46,21 +46,13 @@
 --
 --         Fired when a command returns an error.
 --
---     2. @"command-not-found" ('Calamity.Types.Model.Channel.Message', '['Data.Text.Lazy.Text'])@
+--     2. @"command-not-found" ('Calamity.Types.Model.Channel.Message', ['Data.Text.Lazy.Text'])@
 --
 --         Fired when a valid prefix is used, but the command is not found.
 --
 --     3. @"command-invoked" 'Context'@
 --
 --         Fired when a command is successfully invoked.
---
--- 'addCommands' will also register event handlers for the following events:
---
---     1. @"invoke-command" ('Calamity.Types.Model.Channel.Message', 'Data.Text.Lazy.Text')@
---
---         Given a message and a command string, manually invoke a command
---         treating it as if it originated from the provided 'Message'.
---
 --
 -- ==== Registered Metrics
 --
diff --git a/src/Calamity/Commands/Utils.hs b/src/Calamity/Commands/Utils.hs
--- a/src/Calamity/Commands/Utils.hs
+++ b/src/Calamity/Commands/Utils.hs
@@ -64,7 +64,7 @@
 --
 --         Fired when a command returns an error.
 --
---     2. @"command-not-found" ('Calamity.Types.Model.Channel.Message', '['Data.Text.Lazy.Text'])@
+--     2. @"command-not-found" ('Calamity.Types.Model.Channel.Message', ['Data.Text.Lazy.Text'])@
 --
 --         Fired when a valid prefix is used, but the command is not found.
 --
diff --git a/src/Calamity/HTTP/AuditLog.hs b/src/Calamity/HTTP/AuditLog.hs
--- a/src/Calamity/HTTP/AuditLog.hs
+++ b/src/Calamity/HTTP/AuditLog.hs
@@ -18,7 +18,7 @@
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq.Lens
 
 import           TextShow                       ( showt )
 
diff --git a/src/Calamity/HTTP/Channel.hs b/src/Calamity/HTTP/Channel.hs
--- a/src/Calamity/HTTP/Channel.hs
+++ b/src/Calamity/HTTP/Channel.hs
@@ -26,11 +26,15 @@
 import           Data.Default.Class
 import           Data.Generics.Product.Subtype  ( upcast )
 import           Data.Maybe
+import qualified Data.Text                      as S
 import           Data.Text                      ( Text )
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq ( partLBS )
+import           Network.Wreq.Lens
+import           Network.Wreq.Session
+import           Network.Mime
 
 import           TextShow
 
@@ -38,7 +42,7 @@
   { content         :: Maybe Text
   , nonce           :: Maybe Text
   , tts             :: Maybe Bool
-  , file            :: Maybe ByteString
+  , file            :: Maybe (Text, ByteString)
   , embed           :: Maybe Embed
   , allowedMentions :: Maybe AllowedMentions
   }
@@ -240,7 +244,8 @@
   action (CreateMessage _ o@CreateMessageOptions { file = Nothing }) = postWith'
     (toJSON . upcast @CreateMessageJson $ o)
   action (CreateMessage _ o@CreateMessageOptions { file = Just f }) = postWith'
-    [partLBS @IO "file" f, partLBS "payload_json" (encode . upcast @CreateMessageJson $ o)]
+    [partLBS @IO "file" (snd f) & partFileName ?~ (S.unpack $ fst f) & partContentType ?~ defaultMimeLookup (fst f),
+     partLBS "payload_json" (encode . upcast @CreateMessageJson $ o)]
   action (GetChannel _) = getWith
   action (ModifyChannel _ p) = putWith' (toJSON p)
   action (DeleteChannel _) = deleteWith
diff --git a/src/Calamity/HTTP/Emoji.hs b/src/Calamity/HTTP/Emoji.hs
--- a/src/Calamity/HTTP/Emoji.hs
+++ b/src/Calamity/HTTP/Emoji.hs
@@ -17,7 +17,8 @@
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq.Lens
+import           Network.Wreq.Session
 
 
 data CreateGuildEmojiOptions = CreateGuildEmojiOptions
diff --git a/src/Calamity/HTTP/Guild.hs b/src/Calamity/HTTP/Guild.hs
--- a/src/Calamity/HTTP/Guild.hs
+++ b/src/Calamity/HTTP/Guild.hs
@@ -34,7 +34,8 @@
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq.Lens
+import           Network.Wreq.Session
 
 import           TextShow
 
diff --git a/src/Calamity/HTTP/Internal/Request.hs b/src/Calamity/HTTP/Internal/Request.hs
--- a/src/Calamity/HTTP/Internal/Request.hs
+++ b/src/Calamity/HTTP/Internal/Request.hs
@@ -30,8 +30,9 @@
 
 import           DiPolysemy                       hiding ( debug, error, info )
 
-import           Network.Wreq
-import           Network.Wreq.Types               ( Patchable, Postable, Putable )
+import           Network.Wreq                     (Response, checkResponse, header, defaults)
+import           Network.Wreq.Session
+import           Network.Wreq.Types               (Options, Postable, Putable )
 
 import           Polysemy                         ( Sem )
 import qualified Polysemy                         as P
@@ -64,12 +65,13 @@
 
   route :: a -> Route
 
-  action :: a -> Options -> String -> IO (Response LB.ByteString)
+  action :: a -> Options -> Session -> String -> IO (Response LB.ByteString)
 
   invoke :: (BotC r, FromJSON (Calamity.HTTP.Internal.Request.Result a)) => a -> Sem r (Either RestError (Calamity.HTTP.Internal.Request.Result a))
   invoke a = do
-      rlState' <- P.asks rlState
-      token' <- P.asks token
+      rlState' <- P.asks (^. #rlState)
+      session <- P.asks (^. #session)
+      token' <- P.asks (^. #token)
 
       let route' = route a
 
@@ -79,7 +81,7 @@
       void $ addCounter 1 totalRequests
 
       resp <- attr "route" (route' ^. #path) $ doRequest rlState' route'
-        (action a (requestOptions token') (route' ^. #path . unpacked))
+        (action a (requestOptions token') session (route' ^. #path . unpacked))
 
       void $ modifyGauge (subtract 1) inFlightRequests
 
@@ -95,29 +97,29 @@
 requestOptions t = defaultRequestOptions
   & header "Authorization" .~ [TS.encodeUtf8 . TL.toStrict $ formatToken t]
 
-postWith' :: Postable a => a -> Options -> String -> IO (Response LB.ByteString)
-postWith' p o s = postWith o s p
+postWith' :: Postable a => a -> Options -> Session -> String -> IO (Response LB.ByteString)
+postWith' p o sess s = postWith o sess s p
 
-postWithP' :: Postable a => a -> (Options -> Options) -> Options -> String -> IO (Response LB.ByteString)
-postWithP' p oF o s = postWith (oF o) s p
+postWithP' :: Postable a => a -> (Options -> Options) -> Options -> Session -> String -> IO (Response LB.ByteString)
+postWithP' p oF o sess s = postWith (oF o) sess s p
 
-postEmpty :: Options -> String -> IO (Response LB.ByteString)
-postEmpty o s = postWith o s ("" :: ByteString)
+postEmpty :: Options -> Session -> String -> IO (Response LB.ByteString)
+postEmpty o sess s = postWith o sess s ("" :: ByteString)
 
-putWith' :: Putable a => a -> Options -> String -> IO (Response LB.ByteString)
-putWith' p o s = putWith o s p
+putWith' :: Putable a => a -> Options -> Session -> String -> IO (Response LB.ByteString)
+putWith' p o sess s = putWith o sess s p
 
-patchWith' :: Patchable a => a -> Options -> String -> IO (Response LB.ByteString)
-patchWith' p o s = patchWith o s p
+patchWith' :: Postable a => a -> Options -> Session -> String -> IO (Response LB.ByteString)
+patchWith' p o sess s = customPayloadMethodWith "PATCH" o sess s p
 
-putEmpty :: Options -> String -> IO (Response LB.ByteString)
-putEmpty o s = putWith o s ("" :: ByteString)
+putEmpty :: Options -> Session -> String -> IO (Response LB.ByteString)
+putEmpty o sess s = putWith o sess s ("" :: ByteString)
 
-putEmptyP :: (Options -> Options) -> Options -> String -> IO (Response LB.ByteString)
+putEmptyP :: (Options -> Options) -> Options -> Session -> String -> IO (Response LB.ByteString)
 putEmptyP = (putEmpty .)
 
-postEmptyP :: (Options -> Options) -> Options -> String -> IO (Response LB.ByteString)
+postEmptyP :: (Options -> Options) -> Options -> Session -> String -> IO (Response LB.ByteString)
 postEmptyP = (postEmpty .)
 
-getWithP :: (Options -> Options) -> Options -> String -> IO (Response LB.ByteString)
+getWithP :: (Options -> Options) -> Options -> Session -> String -> IO (Response LB.ByteString)
 getWithP oF o = getWith (oF o)
diff --git a/src/Calamity/HTTP/Invite.hs b/src/Calamity/HTTP/Invite.hs
--- a/src/Calamity/HTTP/Invite.hs
+++ b/src/Calamity/HTTP/Invite.hs
@@ -10,7 +10,8 @@
 
 import           Data.Text                      ( Text )
 
-import           Network.Wreq
+import           Network.Wreq.Lens
+import           Network.Wreq.Session
 
 import           TextShow
 
diff --git a/src/Calamity/HTTP/MiscRoutes.hs b/src/Calamity/HTTP/MiscRoutes.hs
--- a/src/Calamity/HTTP/MiscRoutes.hs
+++ b/src/Calamity/HTTP/MiscRoutes.hs
@@ -7,7 +7,7 @@
 
 import           Data.Function
 
-import           Network.Wreq
+import           Network.Wreq.Session
 
 data MiscRequest a where
   GetGateway    :: MiscRequest GatewayResponse
diff --git a/src/Calamity/HTTP/Reason.hs b/src/Calamity/HTTP/Reason.hs
--- a/src/Calamity/HTTP/Reason.hs
+++ b/src/Calamity/HTTP/Reason.hs
@@ -12,7 +12,7 @@
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq.Lens
 
 data Reason a = Reason a Text
   deriving ( Show, Eq, Generic )
diff --git a/src/Calamity/HTTP/User.hs b/src/Calamity/HTTP/User.hs
--- a/src/Calamity/HTTP/User.hs
+++ b/src/Calamity/HTTP/User.hs
@@ -22,7 +22,8 @@
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq.Lens
+import           Network.Wreq.Session
 
 import           TextShow
 
diff --git a/src/Calamity/HTTP/Webhook.hs b/src/Calamity/HTTP/Webhook.hs
--- a/src/Calamity/HTTP/Webhook.hs
+++ b/src/Calamity/HTTP/Webhook.hs
@@ -23,7 +23,9 @@
 
 import           GHC.Generics
 
-import           Network.Wreq
+import           Network.Wreq ( partLBS )
+import           Network.Wreq.Lens
+import           Network.Wreq.Session
 
 import           TextShow
 
diff --git a/src/Calamity/Types/Tellable.hs b/src/Calamity/Types/Tellable.hs
--- a/src/Calamity/Types/Tellable.hs
+++ b/src/Calamity/Types/Tellable.hs
@@ -27,7 +27,9 @@
 import qualified Polysemy.Error               as P
 
 -- | A wrapper type for sending files
-newtype TFile = TFile ByteString
+data TFile = TFile
+             S.Text -- ^ The filename
+             ByteString -- ^ The content
   deriving ( Show, Generic )
 
 -- | A wrapper type for allowing mentions
@@ -63,7 +65,7 @@
 
 -- | Message file, '(<>)' keeps the last added file
 instance ToMessage TFile where
-  intoMsg (TFile f) = Endo (#file %~ getLast . (<> Last (Just f)) . Last)
+  intoMsg (TFile n f) = Endo (#file %~ getLast . (<> Last (Just (n, f))) . Last)
 
 -- | Allowed mentions, '(<>)' combines allowed mentions
 instance ToMessage AllowedMentions where
