diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 974a5790579193e4cde68cf0dcd4828f4eefb32f..7f8e024d960bfaa3001f404bdae4ee55288b7ed0 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,37 @@ 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();
+                    }
+
+                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    try {
+                        javax.imageio.ImageIO.write(ImageIO.read(file), "png", baos);
+                        baos.flush();
+                        baos.close();
+                    }
+                    catch (IOException err) {
+                        err.printStackTrace();
+                    }
+
+                    try {
+                        if (client.getDrawingController().updateImage(baos.toByteArray())) {
+                            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..68c8f9ae6c6b685aa99eca6a0ee64b4bf61bd230 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -22,9 +22,9 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
 
     @Override
     public boolean notifyTextDrawing(String fromClient, String text, Font font, Point startPoint) throws RemoteException {
-        Graphics2D g2 = client.getApplicationMain().getPaintGUI().getDrawingArea().getG2();
-        g2.setFont(font);
-        g2.drawString(text, startPoint.x, startPoint.y);
+        client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().setFont(font);
+        client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().drawString(text, startPoint.x, startPoint.y);
         client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
         return true;
     }
@@ -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 df062613d0f9144d0139326c74bac84d764507cd..be96a215a69686225e4db0ecfc69958a25396b33 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -1,13 +1,8 @@
 package remote;
 
-
-import client.Client;
-
 import java.awt.*;
-import java.awt.image.BufferedImage;
 import java.rmi.Remote;
 import java.rmi.RemoteException;
-import java.util.ArrayList;
 
 
 /**
@@ -24,15 +19,7 @@ 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;
-
-    ArrayList<Shape> getShapeList() throws RemoteException;
-    ArrayList<Color> getColorList() throws RemoteException;
-    ArrayList<Integer> getStrokeSizeList() throws RemoteException;
-
-    ArrayList<String> getTextList() throws RemoteException;
-    ArrayList<Font> getFontList() throws RemoteException;
-    ArrayList<Point> getTextStartPointList() throws RemoteException;
-//    BufferedImage getCurrentImage() throws RemoteException;
+    boolean broadcastUpdateImage(String fromClient) throws RemoteException;
+    boolean updateImage(byte[] rawImage) throws RemoteException;
     void getImage(String fromClient) throws RemoteException;
-
 }
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index d604e62caef94cdf0cd343071d76596d6e28bc69..00d42fc5e09937a1e7d587f062ad4e7221218754 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -8,7 +8,6 @@ import java.awt.image.BufferedImage;
 import java.io.*;
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
-import java.util.ArrayList;
 
 public class DrawingController extends UnicastRemoteObject implements IDrawingController {
 
@@ -16,50 +15,25 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
     private final static int AREA_HEIGHT = 600;
 
     private Server server;
-//    private SerializableImage bufferedImage;
     private BufferedImage bufferedImage;
     private Graphics2D g2;
 
-    private ArrayList<Shape> shapeList;
-    private ArrayList<Color> colorList;
-    private ArrayList<Integer> strokeSizeList;
-
-    private ArrayList<String> textList;
-    private ArrayList<Font> fontList;
-    private ArrayList<Point> textStartPointList;
-
 
     protected DrawingController(Server server) throws RemoteException {
         this.server = server;
 
-//        this.bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-//        g2 = (Graphics2D) bufferedImage.getGraphics();
-//        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
         this.bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
         g2 = (Graphics2D) bufferedImage.getGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
-
-        this.shapeList = new ArrayList<Shape>();
-        this.colorList = new ArrayList<Color>();
-        this.strokeSizeList = new ArrayList<Integer>();
-
-        this.textList = new ArrayList<String>();
-        this.fontList = new ArrayList<Font>();
-        this.textStartPointList = new ArrayList<Point>();
     }
 
     @Override
     public boolean broadcastText(String fromClient, String text, Font font, Point startPoint) throws RemoteException {
         System.out.print("Broadcasting drawing to everyone...");
 
-        textList.add(text);
-        fontList.add(font);
-        textStartPointList.add(startPoint);
-
-
         g2 = (Graphics2D) bufferedImage.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         g2.setFont(font);
 //        g2.setPaint(Color.BLACK);
         g2.drawString(text, startPoint.x, startPoint.y);
@@ -87,10 +61,6 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
     public boolean broadcastDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
         System.out.print("Broadcasting drawing to everyone...");
 
-        shapeList.add(drawing);
-        colorList.add(color);
-        strokeSizeList.add(strokeSize);
-
         g2 = (Graphics2D) bufferedImage.getGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         switch (mode) {
@@ -109,12 +79,10 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
             default:
                 break;
         }
-        g2 = (Graphics2D) bufferedImage.getGraphics();
 
+        g2 = (Graphics2D) bufferedImage.getGraphics();
         g2.setColor(color);
 
-
-
         IDrawingUpdate client;
 
         for( User u : server.users )
@@ -133,12 +101,6 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
     public boolean broadcastDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
         System.out.print("Broadcasting dragging drawing to everyone...");
 
-        if (mode.equals("FREEHAND")) {
-            shapeList.add(drawing);
-            colorList.add(color);
-            strokeSizeList.add(strokeSize);
-        }
-
         g2 = (Graphics2D) bufferedImage.getGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         switch (mode) {
@@ -157,11 +119,10 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
             default:
                 break;
         }
-        g2 = (Graphics2D) bufferedImage.getGraphics();
 
+        g2 = (Graphics2D) bufferedImage.getGraphics();
         g2.setColor(color);
 
-
         IDrawingUpdate client;
 
         for( User u : server.users )
@@ -182,16 +143,8 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
 
         IDrawingUpdate client;
 
-        this.shapeList.clear();
-        this.colorList.clear();
-        this.strokeSizeList.clear();
-
-        this.textList.clear();
-        this.fontList.clear();
-        this.textStartPointList.clear();
-
-        BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-        g2 = (Graphics2D) image.getGraphics();
+        bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+        g2 = (Graphics2D) bufferedImage.getGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
         for( User u : server.users )
@@ -207,17 +160,64 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         return true;
     }
 
-    public BufferedImage getCurrentImage() throws RemoteException {
-        return bufferedImage;
+
+    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(bufferedImage, "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 = ImageIO.read(new ByteArrayInputStream(rawImage));
+            g2 = (Graphics2D) bufferedImage.getGraphics();
+            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g2.drawImage(bufferedImage, null, 0, 0);
+        }
+        catch (IOException err) {
+            err.printStackTrace();
+        }
+        return true;
     }
 
     public void getImage(String fromClient) throws RemoteException {
-//        if (bufferedImage.getImage().)
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
         IDrawingUpdate client;
+
         try {
             javax.imageio.ImageIO.write(bufferedImage, "png", baos);
             baos.flush();
+            baos.close();
         }
         catch (IOException err) {
             err.printStackTrace();
@@ -231,28 +231,4 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
             }
         }
     }
-
-    public ArrayList<Shape> getShapeList() {
-        return shapeList;
-    }
-
-    public ArrayList<Color> getColorList() {
-        return colorList;
-    }
-
-    public ArrayList<Integer> getStrokeSizeList() {
-        return strokeSizeList;
-    }
-
-    public ArrayList<String> getTextList() {
-        return textList;
-    }
-
-    public ArrayList<Font> getFontList() {
-        return fontList;
-    }
-
-    public ArrayList<Point> getTextStartPointList() {
-        return textStartPointList;
-    }
 }
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