diff --git a/package.json b/package.json
index d531110fdad30d5fb3fc2132b8f200b1eee967c9..aa6a30309ef9b8f56e219611e07a6705e22d25ee 100644
--- a/package.json
+++ b/package.json
@@ -94,7 +94,7 @@
     "react-router-dom": "^5.2.0",
     "react-scroll": "^1.8.2",
     "redux": "^4.1.0",
-    "revolt.js": "4.3.3-alpha.15",
+    "revolt.js": "4.3.3-alpha.16",
     "rimraf": "^3.0.2",
     "sass": "^1.35.1",
     "shade-blend-color": "^1.0.0",
diff --git a/src/components/common/AutoComplete.tsx b/src/components/common/AutoComplete.tsx
index 45b51f1d1192b5939f4d610aebeebec9e01cee78..8793d561fd0c8b5752cba5590bbfb4178f1f89dd 100644
--- a/src/components/common/AutoComplete.tsx
+++ b/src/components/common/AutoComplete.tsx
@@ -2,9 +2,9 @@ import { SYSTEM_USER_ID, User } from "revolt.js";
 import { Channels } from "revolt.js/dist/api/objects";
 import styled, { css } from "styled-components";
 
-import { StateUpdater, useContext, useState } from "preact/hooks";
+import { StateUpdater, useState } from "preact/hooks";
 
-import { AppContext } from "../../context/revoltjs/RevoltClient";
+import { useClient } from "../../context/revoltjs/RevoltClient";
 
 import { emojiDictionary } from "../../assets/emojis";
 import ChannelIcon from "./ChannelIcon";
@@ -52,7 +52,7 @@ export function useAutoComplete(
 ): AutoCompleteProps {
     const [state, setState] = useState<AutoCompleteState>({ type: "none" });
     const [focused, setFocused] = useState(false);
-    const client = useContext(AppContext);
+    const client = useClient();
 
     function findSearchString(
         el: HTMLTextAreaElement,
diff --git a/src/components/common/messaging/embed/Embed.tsx b/src/components/common/messaging/embed/Embed.tsx
index 726c60d13447bd473cd098c4c0ced7492ba55480..d28fba4d1186bf6218a99422d969e11372dcfec3 100644
--- a/src/components/common/messaging/embed/Embed.tsx
+++ b/src/components/common/messaging/embed/Embed.tsx
@@ -5,6 +5,7 @@ import classNames from "classnames";
 import { useContext } from "preact/hooks";
 
 import { useIntermediate } from "../../../../context/intermediate/Intermediate";
+import { useClient } from "../../../../context/revoltjs/RevoltClient";
 
 import { MessageAreaWidthContext } from "../../../../pages/channels/messaging/MessageArea";
 import EmbedMedia from "./EmbedMedia";
@@ -19,11 +20,7 @@ const CONTAINER_PADDING = 24;
 const MAX_PREVIEW_SIZE = 150;
 
 export default function Embed({ embed }: Props) {
-    // ! FIXME: temp code
-    // ! add proxy function to client
-    function proxyImage(url: string) {
-        return `https://jan.revolt.chat/proxy?url=${encodeURIComponent(url)}`;
-    }
+    const client = useClient();
 
     const { openScreen } = useIntermediate();
     const maxWidth = Math.min(
@@ -95,7 +92,7 @@ export default function Embed({ embed }: Props) {
                                 {embed.icon_url && (
                                     <img
                                         className={styles.favicon}
-                                        src={proxyImage(embed.icon_url)}
+                                        src={client.proxyFile(embed.icon_url)}
                                         draggable={false}
                                         onError={(e) =>
                                             (e.currentTarget.style.display =
@@ -152,9 +149,10 @@ export default function Embed({ embed }: Props) {
                 <img
                     className={classNames(styles.embed, styles.image)}
                     style={calculateSize(embed.width, embed.height)}
-                    src={proxyImage(embed.url)}
+                    src={client.proxyFile(embed.url)}
                     type="text/html"
                     frameBorder="0"
+                    loading="lazy"
                     onClick={() => openScreen({ id: "image_viewer", embed })}
                     onMouseDown={(ev) =>
                         ev.button === 1 && window.open(embed.url, "_blank")
diff --git a/src/components/common/messaging/embed/EmbedMedia.tsx b/src/components/common/messaging/embed/EmbedMedia.tsx
index 81457495f4f5b4e63306216d1f64119f2645f4ef..169192e11b4d3f0c2af58b18ef97b2c84425362b 100644
--- a/src/components/common/messaging/embed/EmbedMedia.tsx
+++ b/src/components/common/messaging/embed/EmbedMedia.tsx
@@ -3,6 +3,7 @@ import { Embed } from "revolt.js/dist/api/objects";
 import styles from "./Embed.module.scss";
 
 import { useIntermediate } from "../../../../context/intermediate/Intermediate";
+import { useClient } from "../../../../context/revoltjs/RevoltClient";
 
 interface Props {
     embed: Embed;
@@ -11,19 +12,15 @@ interface Props {
 }
 
 export default function EmbedMedia({ embed, width, height }: Props) {
-    // ! FIXME: temp code
-    // ! add proxy function to client
-    function proxyImage(url: string) {
-        return `https://jan.revolt.chat/proxy?url=${encodeURIComponent(url)}`;
-    }
-
     if (embed.type !== "Website") return null;
     const { openScreen } = useIntermediate();
+    const client = useClient();
 
     switch (embed.special?.type) {
         case "YouTube":
             return (
                 <iframe
+                    loading="lazy"
                     src={`https://www.youtube-nocookie.com/embed/${embed.special.id}?modestbranding=1`}
                     allowFullScreen
                     style={{ height }}
@@ -38,6 +35,7 @@ export default function EmbedMedia({ embed, width, height }: Props) {
                     frameBorder="0"
                     allowFullScreen
                     scrolling="no"
+                    loading="lazy"
                     style={{ height }}
                 />
             );
@@ -45,6 +43,7 @@ export default function EmbedMedia({ embed, width, height }: Props) {
             return (
                 <iframe
                     src={`https://open.spotify.com/embed/${embed.special.content_type}/${embed.special.id}`}
+                    loading="lazy"
                     frameBorder="0"
                     allowFullScreen
                     allowTransparency
@@ -59,6 +58,7 @@ export default function EmbedMedia({ embed, width, height }: Props) {
                     )}&color=%23FF7F50&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true`}
                     frameBorder="0"
                     scrolling="no"
+                    loading="lazy"
                     style={{ height }}
                 />
             );
@@ -69,6 +69,7 @@ export default function EmbedMedia({ embed, width, height }: Props) {
                         embed.special.id
                     }/size=large/bgcol=181a1b/linkcol=056cc4/tracklist=false/transparent=true/`}
                     seamless
+                    loading="lazy"
                     style={{ height }}
                 />
             );
@@ -79,7 +80,8 @@ export default function EmbedMedia({ embed, width, height }: Props) {
                 return (
                     <img
                         className={styles.image}
-                        src={proxyImage(url)}
+                        src={client.proxyFile(url)}
+                        loading="lazy"
                         style={{ width, height }}
                         onClick={() =>
                             openScreen({
diff --git a/src/context/intermediate/popovers/ImageViewer.tsx b/src/context/intermediate/popovers/ImageViewer.tsx
index 6a1573dea5518723c6ffcdc1492c4dc26803b283..2bd056ee2997bf1cd6d889d770c22c8b2954797b 100644
--- a/src/context/intermediate/popovers/ImageViewer.tsx
+++ b/src/context/intermediate/popovers/ImageViewer.tsx
@@ -11,7 +11,7 @@ import AttachmentActions from "../../../components/common/messaging/attachments/
 import EmbedMediaActions from "../../../components/common/messaging/embed/EmbedMediaActions";
 import Modal from "../../../components/ui/Modal";
 
-import { AppContext } from "../../revoltjs/RevoltClient";
+import { useClient } from "../../revoltjs/RevoltClient";
 
 interface Props {
     onClose: () => void;
@@ -22,12 +22,6 @@ interface Props {
 type ImageMetadata = AttachmentMetadata & { type: "Image" };
 
 export function ImageViewer({ attachment, embed, onClose }: Props) {
-    // ! FIXME: temp code
-    // ! add proxy function to client
-    function proxyImage(url: string) {
-        return `https://jan.revolt.chat/proxy?url=${encodeURIComponent(url)}`;
-    }
-
     if (attachment && attachment.metadata.type !== "Image") {
         console.warn(
             `Attempted to use a non valid attatchment type in the image viewer: ${attachment.metadata.type}`,
@@ -35,7 +29,7 @@ export function ImageViewer({ attachment, embed, onClose }: Props) {
         return null;
     }
 
-    const client = useContext(AppContext);
+    const client = useClient();
 
     return (
         <Modal visible={true} onClose={onClose} noBackground>
@@ -55,7 +49,7 @@ export function ImageViewer({ attachment, embed, onClose }: Props) {
                 {embed && (
                     <>
                         <img
-                            src={proxyImage(embed.url)}
+                            src={client.proxyFile(embed.url)}
                             width={embed.width}
                             height={embed.height}
                         />
diff --git a/src/context/revoltjs/RevoltClient.tsx b/src/context/revoltjs/RevoltClient.tsx
index e1851145ab6248af75f12a7ea099252f935f87ea..b45744642cac56c382b5b303568137c709737c53 100644
--- a/src/context/revoltjs/RevoltClient.tsx
+++ b/src/context/revoltjs/RevoltClient.tsx
@@ -4,7 +4,7 @@ import { Client } from "revolt.js";
 import { Route } from "revolt.js/dist/api/routes";
 
 import { createContext } from "preact";
-import { useEffect, useMemo, useState } from "preact/hooks";
+import { useContext, useEffect, useMemo, useState } from "preact/hooks";
 
 import { SingletonMessageRenderer } from "../../lib/renderer/Singleton";
 
@@ -239,3 +239,5 @@ export default connectState<{ children: Children }>(Context, (state) => {
         sync: state.sync,
     };
 });
+
+export const useClient = () => useContext(AppContext);
diff --git a/yarn.lock b/yarn.lock
index 05ad5dbff5f577992d6c4692901305caea14aeb9..5e18fae5e65d0d566d2f7d58594dd5568dfbb163 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3563,10 +3563,10 @@ reusify@^1.0.4:
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-revolt.js@4.3.3-alpha.15:
-  version "4.3.3-alpha.15"
-  resolved "https://registry.yarnpkg.com/revolt.js/-/revolt.js-4.3.3-alpha.15.tgz#e511ad500a20f658b15b7bad0fdb9e2a5465d1b1"
-  integrity sha512-24hIQEO+FIRIAQXITBH2qVvWH6LA1MeJW2/3lj6cqBgJz7lnb3ZNIXZBu5sHbUEJpIDtJiHcOEeaeh3sE2RwxA==
+revolt.js@4.3.3-alpha.16:
+  version "4.3.3-alpha.16"
+  resolved "https://registry.yarnpkg.com/revolt.js/-/revolt.js-4.3.3-alpha.16.tgz#ed595d34cdefc1d8756694787abda01e28d373e8"
+  integrity sha512-UejqRKYoO98Uj2eki6dZMbEbX8msYz/JgY3EYxhbe1qMnBvLD8JxjcemHTLBf2Iytom8fFQ1EV0ee4Z89Jkcjw==
   dependencies:
     "@insertish/mutable" "1.1.0"
     axios "^0.19.2"