diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 974a5790579193e4cde68cf0dcd4828f4eefb32f..328df867afc69c681f09de7c9893459b8472fe34 100644
--- a/src/GUI/PaintGUI.java
+++ b/src/GUI/PaintGUI.java
@@ -1,6 +1,7 @@
 package GUI;
 
 import client.Client;
+import remote.IDrawingUpdate;
 
 import javax.imageio.ImageIO;
 import javax.swing.*;
@@ -12,7 +13,9 @@ import java.awt.event.ActionListener;
 import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;
 import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import java.rmi.RemoteException;
 
 public class PaintGUI extends JPanel {
@@ -236,8 +239,49 @@ public class PaintGUI extends JPanel {
                 if (returnVal == JFileChooser.APPROVE_OPTION) {
                     File file = fileChooser.getSelectedFile();
                     drawingArea.openFile(file);
+
+                    try
+                    {
+                        client.getDrawingController().broadcastClearCanvas(client.getUserName());
+                    }
+                    catch (RemoteException err)
+                    {
+                        err.printStackTrace();
+                    }
+
+
+                    SerializableImage serializableImage = new SerializableImage(600, 600, BufferedImage.TYPE_INT_ARGB);
+                    try {
+                        serializableImage.setImage(ImageIO.read(file));
+                    } catch (IOException ex) {
+                        ex.printStackTrace();
+                    }
+
+                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    try {
+                        javax.imageio.ImageIO.write(serializableImage, "png", baos);
+                        baos.flush();
+                        baos.close();
+                    }
+                    catch (IOException err) {
+                        err.printStackTrace();
+                    }
+
+                    try {
+                        client.getDrawingController().updateImage(baos.toByteArray());
+                    } catch (RemoteException ex) {
+                        ex.printStackTrace();
+                    }
+
+                    try {
+                        client.getDrawingController().broadcastUpdateImage(client.getUserName());
+                    } catch (RemoteException ex) {
+                        ex.printStackTrace();
+                    }
                 }
 
+
+
 /// Save under project directory without filename (PNG file with default filename) ///
             } else if (e.getSource() == saveBtn) {
 
diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java
index 43883b2e581f3067691b42ca1d22592a42b8be66..6ce9968c6ba3f6ecb515e6a513d8584303e0350c 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -84,8 +84,8 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
 //            BufferedImage bufferedImage = client.getApplicationMain().getPaintGUI().getDrawingArea().getImage();
             BufferedImage bufferedImage = javax.imageio.ImageIO.read(new ByteArrayInputStream(rawImage));
             client.getApplicationMain().getPaintGUI().getDrawingArea().setImage(bufferedImage);
-            Graphics2D g2 = (Graphics2D) bufferedImage.getGraphics();
-            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            client.getApplicationMain().getPaintGUI().getDrawingArea().setG2((Graphics2D) bufferedImage.getGraphics());
+            client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
 
             // do whatever you wish with the image
diff --git a/src/client/client.policy b/src/client/client.policy
new file mode 100644
index 0000000000000000000000000000000000000000..a8f141af97047fdcc681f3d85b1eee1afa8372c4
--- /dev/null
+++ b/src/client/client.policy
@@ -0,0 +1,3 @@
+grant {
+        permission java.net.SocketPermission "10.13.64.162", "accept,connect";
+};
diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java
index 635c490c49e86dd5ee1bee1ed89ca997de08308c..5f0177d4e79af3345ee391b47549532fd9b77d1c 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -24,6 +24,8 @@ public interface IDrawingController extends Remote {
     boolean broadcastDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException;
     boolean broadcastDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException;
     boolean broadcastClearCanvas(String fromClient) throws RemoteException;
+    boolean broadcastUpdateImage(String fromClient) throws RemoteException;
+    boolean updateImage(byte[] rawImage) throws RemoteException;
 
     ArrayList<Shape> getShapeList() throws RemoteException;
     ArrayList<Color> getColorList() throws RemoteException;
@@ -35,5 +37,6 @@ public interface IDrawingController extends Remote {
 //    BufferedImage getCurrentImage() throws RemoteException;
     SerializableImage getCurrentImage() throws RemoteException;
     void getImage(String fromClient) throws RemoteException;
+//    void setImage(String fromClient) throws RemoteException;
 
 }
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index d52aebe4592c31b9e5c84be2d689a33490ac17fb..ca93859785887347f808bcee1616320ced536e12 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -21,7 +21,6 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
 
     private Server server;
     private SerializableImage serializableImage;
-    private BufferedImage bufferedImage;
     private Graphics2D g2;
 
     private ArrayList<Shape> shapeList;
@@ -208,17 +207,69 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         return true;
     }
 
+
+    public boolean broadcastUpdateImage(String fromClient) throws RemoteException {
+        System.out.print("Broadcasting new image loading to everyone...");
+
+        try {
+
+            // do whatever you wish with the image
+            IDrawingUpdate client;
+
+            for( User u : server.users )
+            {
+                if (!u.getUserName().equals(fromClient)) {
+                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    client = u.getIDrawingUpdate();
+                    try {
+                        javax.imageio.ImageIO.write(serializableImage, "png", baos);
+                        baos.flush();
+                        client.receiveImage(baos.toByteArray());
+                    }
+                    catch (IOException err) {
+                        err.printStackTrace();
+                    }
+                    baos.close();
+                }
+            }
+        }
+        catch (IOException err) {
+            err.printStackTrace();
+        }
+
+        System.out.print("...DONE\n");
+
+        return true;
+    }
+
+    public boolean updateImage(byte[] rawImage) throws RemoteException {
+        try {
+            BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(rawImage));
+            serializableImage.setImage(bufferedImage);
+            g2 = serializableImage.createGraphics();
+            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            // do whatever you wish with the image
+        }
+        catch (IOException err) {
+            err.printStackTrace();
+        }
+        return true;
+    }
+
     public SerializableImage getCurrentImage() throws RemoteException {
         return serializableImage;
     }
 
     public void getImage(String fromClient) throws RemoteException {
-//        if (serializableImage.getImage().)
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
         IDrawingUpdate client;
+
         try {
             javax.imageio.ImageIO.write(serializableImage, "png", baos);
             baos.flush();
+            baos.close();
         }
         catch (IOException err) {
             err.printStackTrace();
@@ -233,6 +284,7 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         }
     }
 
+
     public ArrayList<Shape> getShapeList() {
         return shapeList;
     }
diff --git a/src/server/Server.java b/src/server/Server.java
index cb1ef67e4d58a8f673777b4324c0fc783792b1ec..1063d88fb21da8e2cd3ea5078816e9dff18712e8 100644
--- a/src/server/Server.java
+++ b/src/server/Server.java
@@ -4,11 +4,15 @@ import remote.IChatController;
 import remote.IClientController;
 import remote.IDrawingController;
 
+import javax.naming.NamingEnumeration;
 import java.net.InetAddress;
+import java.net.MalformedURLException;
 import java.net.UnknownHostException;
+import java.rmi.Naming;
 import java.rmi.RemoteException;
 import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
 import java.util.ArrayList;
 
 public class Server
@@ -58,6 +62,10 @@ public class Server
     {
         LocateRegistry.createRegistry(1099);
         Registry registry = LocateRegistry.getRegistry();
+//        if (System.getSecurityManager() == null) {
+//            System.setSecurityManager(new SecurityManager());
+//        }
+//        System.setProperty("java.security.policy", "file:/Users/haiho/OneDrive - The University of Melbourne/Distributed Systems (COMP90015)/Assignment 2/InfinityMonkeys-remaster/comp90015-dsass2-infinitymonkeys-remaster/src/server/server.policy");
 
         String clientControllerName = "ClientController";
         String chatControllerName = "ChatController";
@@ -70,6 +78,18 @@ public class Server
         registry.rebind(clientControllerName, clientController);
         registry.rebind(chatControllerName, chatController);
         registry.rebind(drawingControllerName, drawingController);
+//        registry.rebind(clientControllerName, UnicastRemoteObject.exportObject(clientController, 1099));
+//        registry.rebind(chatControllerName, UnicastRemoteObject.exportObject(chatController, 1099));
+//        registry.rebind(drawingControllerName, UnicastRemoteObject.exportObject(drawingController, 1099));
+
+//        try {
+//            Naming.rebind(clientControllerName, clientController);
+//            Naming.rebind(chatControllerName, chatController);
+//            Naming.rebind(drawingControllerName, drawingController);
+//        } catch (MalformedURLException e) {
+//            e.printStackTrace();
+//        }
+
 
         System.out.println("Server is ready");
 
diff --git a/src/server/server.policy b/src/server/server.policy
new file mode 100644
index 0000000000000000000000000000000000000000..5c059491c631fa37d14fc62d9654cdb13ce184c0
--- /dev/null
+++ b/src/server/server.policy
@@ -0,0 +1,3 @@
+grant codeBase "file:/Users/haiho/OneDrive - The University of Melbourne/Distributed Systems (COMP90015)/Assignment 2/InfinityMonkeys-remaster/comp90015-dsass2-infinitymonkeys-remaster/out/production/comp90015-dsass2-infinitymonkeys-remaster/" {
+    permission java.security.AllPermission;
+};
\ No newline at end of file