diff --git a/src/GUI/ApplicationMain.java b/src/GUI/ApplicationMain.java
index 6916775b25ec3b84a6149c84110078c57aaa822e..020e67b3793de9e099a4bcd5c528c476bd48820d 100644
--- a/src/GUI/ApplicationMain.java
+++ b/src/GUI/ApplicationMain.java
@@ -6,6 +6,7 @@ import javax.swing.*;
 import java.awt.*;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
 import java.rmi.RemoteException;
 import java.util.ArrayList;
 
@@ -29,8 +30,7 @@ public class ApplicationMain extends JPanel {
         this.paintGUI = new PaintGUI(client);
     }
 
-    public void createAndShowGUI()
-    {
+    public void createAndShowGUI() {
         frame = new JFrame("Application Main");
         JFrame.setDefaultLookAndFeelDecorated(true);
         Container content = frame.getContentPane();
@@ -40,32 +40,39 @@ public class ApplicationMain extends JPanel {
         chatScreen.setUserName(client.getUserName());
 
 
-        try {
-            // Update canvas
-            ArrayList<Shape> shapeList = client.getDrawingController().getShapeList();
-            ArrayList<Color> colorList = client.getDrawingController().getColorList();
-            ArrayList<Integer> strokeSizeList = client.getDrawingController().getStrokeSizeList();
-
-            ArrayList<String> textList = client.getDrawingController().getTextList();
-            ArrayList<Font> fontList = client.getDrawingController().getFontList();
-            ArrayList<Point> textStartPointList = client.getDrawingController().getTextStartPointList();
+//        try {
+//            // Update canvas
+//            ArrayList<Shape> shapeList = client.getDrawingController().getShapeList();
+//            ArrayList<Color> colorList = client.getDrawingController().getColorList();
+//            ArrayList<Integer> strokeSizeList = client.getDrawingController().getStrokeSizeList();
+//
+//            ArrayList<String> textList = client.getDrawingController().getTextList();
+//            ArrayList<Font> fontList = client.getDrawingController().getFontList();
+//            ArrayList<Point> textStartPointList = client.getDrawingController().getTextStartPointList();
 
-            Graphics2D g2 = paintGUI.getDrawingArea().getG2();
+//            Graphics2D g2 = paintGUI.getDrawingArea().getG2();
 //            for (int i = 0; i < textList.size(); i++) {
 //                g2.setFont(fontList.get(i));
 //                g2.drawString(textList.get(i), textStartPointList.get(i).x, textStartPointList.get(i).y);
 //                client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
 //            }
 
-            for (int i = 0; i < shapeList.size(); i++) {
-                g2.setStroke(new BasicStroke(strokeSizeList.get(i)));
-                g2.setColor(colorList.get(i));
-                g2.draw(shapeList.get(i));
-                paintGUI.getDrawingArea().repaint();
-            }
+//            for (int i = 0; i < shapeList.size(); i++) {
+//                g2.setStroke(new BasicStroke(strokeSizeList.get(i)));
+//                g2.setColor(colorList.get(i));
+//                g2.draw(shapeList.get(i));
+//                paintGUI.getDrawingArea().repaint();
+//            }
+//        }
+//        catch (RemoteException e) {
+//            e.printStackTrace();
+//        }
+
+        try {
+            client.getDrawingController().getImage(client.getUserName());
         }
-        catch (RemoteException e) {
-            e.printStackTrace();
+        catch (RemoteException err) {
+            err.printStackTrace();
         }
 
 
diff --git a/src/GUI/DrawingArea.java b/src/GUI/DrawingArea.java
index 481c938471b92a3d62209282dd34a3560bf87ede..6b6235858b7312f7481ef352e5c19e07d57caa8b 100644
--- a/src/GUI/DrawingArea.java
+++ b/src/GUI/DrawingArea.java
@@ -386,7 +386,7 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
             case TEXT:
                 break;
         }
-
+        g2.setStroke(lineStroke);
         repaint();
         try {
             drawingController.broadcastDraggingDrawing(client.getUserName(), drawing, currentMode.toString(), shapeColor, strokeSize);
diff --git a/src/GUI/MenuBar.java b/src/GUI/MenuBar.java
deleted file mode 100644
index b466e4b9cbe917d1c2acd97dee35ef4d995acfd8..0000000000000000000000000000000000000000
--- a/src/GUI/MenuBar.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package GUI;
-
-import javax.swing.*;
-
-public class MenuBar extends JMenuBar {
-    JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn, closeBtn;
-}
diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 1b87a668692f5c400ca04d65c24daad095848d3e..385ce53052614a44049ecebc846f43f0966688b5 100644
--- a/src/GUI/PaintGUI.java
+++ b/src/GUI/PaintGUI.java
@@ -27,7 +27,8 @@ public class PaintGUI extends JPanel {
     JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn;
     JButton freehandBtn, lineBtn, circleBtn, rectBtn, ovalBtn, eraserBtn, textBtn;
     JButton colorPaletteBtn, setFontBtn;
-    JTextField textInput, textSize;
+    JTextField textInput;
+    JTextField textSize;
     JComboBox strokeOptions;
     JComboBox eraserSizeOptions;
 
@@ -111,6 +112,7 @@ public class PaintGUI extends JPanel {
         textSize.setColumns(2);
         textSize.addFocusListener(focusListener);
 //        textSize.setVisible(false);
+        setTextDetail();
 
 /// Set up elements ///
         clearBtn = new JButton("Clear");
@@ -126,7 +128,6 @@ public class PaintGUI extends JPanel {
 
 /// Toolbox panel ///
         toolbox1.add(colorPaletteBtn);
-//        toolbox.add(setFontBtn);
         toolbox1.add(freehandBtn);
         toolbox1.add(lineBtn);
         toolbox1.add(circleBtn);
@@ -135,6 +136,7 @@ public class PaintGUI extends JPanel {
         toolbox1.add(eraserBtn);
         toolbox1.add(textBtn);
         toolbox2.add(textInput);
+//        toolbox2.add(setFontBtn);
         toolbox2.add(textSize);
         toolbox2.add(strokeOptions);
         toolbox2.add(eraserSizeOptions);
@@ -167,7 +169,7 @@ public class PaintGUI extends JPanel {
 /// Clear button ///
             if (e.getSource() == clearBtn) {
                 int reply = JOptionPane.showConfirmDialog(null,
-                        "Do you want to save the canvas before clearing?",
+                        "Are you sure you want to clear the canvas?",
                         "Canvas clearance", JOptionPane.YES_NO_OPTION);
 
                 if( reply == JOptionPane.YES_OPTION )
@@ -199,11 +201,32 @@ public class PaintGUI extends JPanel {
                         file = new File(filePath);
 
                     }
+
                     drawingArea.saveAsPNGFile(file);
+
+                    try
+                    {
+                        client.getDrawingController().broadcastClearCanvas(client.getUserName());
+                    }
+                    catch (RemoteException err)
+                    {
+                        JOptionPane.showMessageDialog(null,
+                                "Error in clearing the canvas", "Error", JOptionPane.ERROR_MESSAGE);
+                    }
+
                     drawingArea.clear();
 
                 } else if (returnVal == JOptionPane.NO_OPTION) {
 
+                    try
+                    {
+                        client.getDrawingController().broadcastClearCanvas(client.getUserName());
+                    }
+                    catch (RemoteException err)
+                    {
+                        JOptionPane.showMessageDialog(null,
+                                "Error in clearing the canvas", "Error", JOptionPane.ERROR_MESSAGE);
+                    }
                     drawingArea.clear();
 
                 }
@@ -361,8 +384,6 @@ public class PaintGUI extends JPanel {
     }
 
 
-
-
 //    public void showGUI() {
 //        frame = new JFrame("Shared Whiteboard System");
 //        JFrame.setDefaultLookAndFeelDecorated(true);
diff --git a/src/GUI/SerializableImage.java b/src/GUI/SerializableImage.java
index 159436e9213b1b666e2e4448a16afa3c7536808d..10ddffd3c0500cafb7cf7661d9546288018f4d02 100644
--- a/src/GUI/SerializableImage.java
+++ b/src/GUI/SerializableImage.java
@@ -2,15 +2,38 @@ package GUI;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
+import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.io.*;
+import java.util.Hashtable;
 
-public class SerializableImage implements Serializable {
+public class SerializableImage extends BufferedImage implements Serializable {
 
     transient BufferedImage image;
 
+    public SerializableImage(int width, int height, int imageType) {
+        super(width, height, imageType);
+        image = new BufferedImage(width, height, imageType);
+    }
+
+    public BufferedImage getImage() {
+        return image;
+    }
+
+    public void setImage(BufferedImage image) {
+        this.image = image;
+    }
+
+    public SerializableImage(int width, int height, int imageType, IndexColorModel cm) {
+        super(width, height, imageType, cm);
+    }
+
+    public SerializableImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?, ?> properties) {
+        super(cm, raster, isRasterPremultiplied, properties);
+    }
+
+
     public void writeObject(ObjectOutputStream output) throws IOException {
         output.defaultWriteObject();
         ImageIO.write(image, "png", output);
diff --git a/src/GUI/StartScreen.form b/src/GUI/StartScreen.form
index f0955e307a4314519ca6a371640e7a574ec439c9..a6eacb755c0f906ce615768a12eb2fb64b8fbcb2 100644
--- a/src/GUI/StartScreen.form
+++ b/src/GUI/StartScreen.form
@@ -40,7 +40,7 @@
             </constraints>
             <properties>
               <editable value="false"/>
-              <text value="Welcome, please provide server's IP to connect to and nameto be identified by in the Whiteboard's chat."/>
+              <text value="Welcome to Distributed Whiteboard. Please provide server's IP, username, and password."/>
             </properties>
           </component>
         </children>
@@ -63,7 +63,7 @@
           </component>
         </children>
       </grid>
-      <grid id="6ef31" layout-manager="GridLayoutManager" row-count="2" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+      <grid id="6ef31" layout-manager="GridLayoutManager" row-count="4" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
         <margin top="0" left="0" bottom="0" right="0"/>
         <constraints>
           <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -76,7 +76,7 @@
         <children>
           <component id="94078" class="javax.swing.JLabel">
             <constraints>
-              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+              <grid row="0" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
             </constraints>
             <properties>
               <text value="Server IP:"/>
@@ -84,7 +84,7 @@
           </component>
           <component id="63209" class="javax.swing.JTextField" binding="textField2">
             <constraints>
-              <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
+              <grid row="1" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
                 <preferred-size width="150" height="-1"/>
               </grid>
             </constraints>
@@ -94,12 +94,12 @@
           </component>
           <vspacer id="bb71b">
             <constraints>
-              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
             </constraints>
           </vspacer>
           <component id="87b91" class="javax.swing.JLabel">
             <constraints>
-              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+              <grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
             </constraints>
             <properties>
               <text value="Your name:"/>
@@ -107,12 +107,30 @@
           </component>
           <component id="e39f4" class="javax.swing.JTextField" binding="textField1" default-binding="true">
             <constraints>
-              <grid row="1" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
+              <grid row="1" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
                 <preferred-size width="150" height="-1"/>
               </grid>
             </constraints>
             <properties/>
           </component>
+          <component id="51d9f" class="javax.swing.JPasswordField" binding="passwordField">
+            <constraints>
+              <grid row="3" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
+                <preferred-size width="150" height="-1"/>
+              </grid>
+            </constraints>
+            <properties>
+              <columns value="20"/>
+            </properties>
+          </component>
+          <component id="62e48" class="javax.swing.JLabel">
+            <constraints>
+              <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="Password:"/>
+            </properties>
+          </component>
         </children>
       </grid>
     </children>
diff --git a/src/GUI/StartScreen.java b/src/GUI/StartScreen.java
index 44aaa3916649d120a1ba4599af2144eae2ef5a87..70ac2f2e3dc766e42e22451279d9ea89a42fa30b 100644
--- a/src/GUI/StartScreen.java
+++ b/src/GUI/StartScreen.java
@@ -8,11 +8,13 @@ import java.awt.event.ActionListener;
 
 public class StartScreen {
 
-    private JPanel panel1;
     private JTextPane information;
+    private JPanel panel1;
     private JTextField textField1;
     private JButton joinButton;
     private JTextField textField2;
+    private JTextField textField3;
+    private JPasswordField passwordField;
     JFrame frame;
 
     private Client client;
@@ -35,8 +37,9 @@ public class StartScreen {
             {
                 String serverAddress = textField2.getText();
                 String userName = textField1.getText();
+                String password = new String(passwordField.getPassword());
 
-                int connectionStatus = client.connect(userName, serverAddress);
+                int connectionStatus = client.connect(userName, serverAddress, password);
 
                 if( connectionStatus == 1 )
                 {
@@ -52,6 +55,10 @@ public class StartScreen {
                 {
                     showErrorMessage("Cannot connect to server: Please check the server address");
                 }
+                else if( connectionStatus == 4 )
+                {
+                    showErrorMessage("Incorrect Password");
+                }
                 else
                 {
                     showErrorMessage("Unknown Connection Status");
@@ -75,7 +82,8 @@ public class StartScreen {
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.pack();
         frame.setLocationRelativeTo(null);
+        frame.getRootPane().setDefaultButton(joinButton);
+        joinButton.requestFocus();
         frame.setVisible(true);
     }
-
 }
diff --git a/src/GUI/ToolBar.java b/src/GUI/ToolBar.java
deleted file mode 100644
index 04087e80db705c26881b58bcde46bfead77687d7..0000000000000000000000000000000000000000
--- a/src/GUI/ToolBar.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package GUI;
-
-import javax.swing.*;
-import java.awt.*;
-
-public class ToolBar extends JPanel {
-    private DrawingArea drawingArea;
-
-    public ToolBar() {
-
-    }
-}
-
-class Tools extends JPanel {
-
-}
-
-class ColorPallete extends JPanel {
-    private Color color;
-
-    public ColorPallete() {
-        this.color = new Color(0, 0, 0);    // Black
-    }
-
-    public void setColor(Color color) {
-        this.color = color;
-    }
-
-    public void setColorRBG(int r, int b, int g) {
-        this.color = new Color(r, b, g);
-    }
-
-    public Color getColor() {
-        return this.color;
-    }
-
-    public void setColorAqua() {
-        this.color = new Color(0,255, 255);
-    }
-
-    public void setColorBlack() {
-        this.color = new Color(0, 0, 0);
-    }
-
-    public void setColorBlue() {
-        this.color = new Color(0, 0, 255);
-    }
-
-    public void setColorFuchsia() {
-        this.color = new Color(255, 0, 255);
-    }
-
-    public void setColorGray() {
-        this.color = new Color(128, 128, 128);
-    }
-
-    public void setColorGreen() {
-        this.color = new Color(0, 128, 0);
-    }
-
-    public void setColorLime() {
-        this.color = new Color(0, 255, 0);
-    }
-
-    public void setColorMaroon() {
-        this.color = new Color(128,0, 0);
-    }
-
-    public void setColorNavy() {
-        this.color = new Color(0, 0, 128);
-    }
-
-    public void setColorOlive() {
-        this.color = new Color(128, 128, 0);
-    }
-
-    public void setColorPurple() {
-        this.color = new Color(128, 0, 128);
-    }
-
-    public void setColorRed() {
-        this.color = new Color(255, 0, 0);
-    }
-
-    public void setColorSilver() {
-        this.color = new Color(192, 192, 192);
-    }
-
-    public void setColorTeal() {
-        this.color = new Color(0, 128, 128);
-    }
-
-    public void setColorWhite() {
-        this.color = new Color(255, 255, 255);
-    }
-
-    public void setColorYellow() {
-        this.color = new Color(255, 255, 0);
-    }
-}
\ No newline at end of file
diff --git a/src/client/Client.java b/src/client/Client.java
index 5eed15f56e0382d5755970a297a77061654b344c..800fac6e8eb9444b5018277491d4e3dc6cec8b47 100644
--- a/src/client/Client.java
+++ b/src/client/Client.java
@@ -28,9 +28,8 @@ public class Client
     private ClientUpdate clientUpdate;
     private ChatUpdate chatUpdate;
     private DrawingUpdate drawingUpdate;
-
+    private ApplicationMain applicationMain;
     private StartScreen startScreen;
-    private PaintGUI paintGUI;
 
 
     public String getUserName()
@@ -53,13 +52,9 @@ public class Client
         this.serverAddress = serverAddress;
     }
 
-    private ApplicationMain applicationMain;
 
-    public ApplicationMain getApplicationMain() { return applicationMain; }
 
-    public PaintGUI getPaintGUI() {
-        return paintGUI;
-    }
+    public ApplicationMain getApplicationMain() { return applicationMain; }
 
     public ChatScreen getChatScreen() {
         return getApplicationMain().getChatScreen();
@@ -98,6 +93,7 @@ public class Client
         catch (Exception e)
         {
             StartScreen.showErrorMessage("Error starting up client");
+            System.exit(0);
         }
     }
 
@@ -117,7 +113,8 @@ public class Client
     // return = 1 -> connected successfully
     // return = 2 -> duplicate username
     // return = 3 -> error in locating the server
-    public int connect(String userName, String serverAddress)
+    // return = 4 -> incorrect password entered
+    public int connect(String userName, String serverAddress, String password)
     {
         if( !userName.trim().isEmpty() )
         {
@@ -134,31 +131,38 @@ public class Client
 
         try
         {
-            System.out.println("Server address:" + serverAddress);
+            System.out.println("Server address: " + serverAddress);
             registryServer = LocateRegistry.getRegistry(serverAddress);
 
             chatController = (IChatController) registryServer.lookup("ChatController");
             clientController = (IClientController) registryServer.lookup("ClientController");
             drawingController = (IDrawingController) registryServer.lookup("DrawingController");
 
-            System.out.println("User name:" + userName);
-            if( clientController.join(userName, this.chatUpdate, this.clientUpdate, this.drawingUpdate) )
-            {
-                System.out.println("Connected to server");
+            System.out.println("User name: " + userName);
+            System.out.println("Password: " + password);
 
-                return 1;
+            if( clientController.checkPassword(password) )
+            {
+                if( clientController.join(userName, this.chatUpdate, this.clientUpdate, this.drawingUpdate) )
+                {
+                    System.out.println("Connected to server");
+
+                    return 1;
+                }
+                else
+                {
+                    return 2;
+                }
             }
             else
             {
-                return 2;
+                return 4;
             }
         }
         catch (Exception e)
         {
             //e.printStackTrace();
-
             return 3;
         }
     }
-
 }
\ No newline at end of file
diff --git a/src/client/ClientUpdate.java b/src/client/ClientUpdate.java
index 9fdef79bf4438c8af406c61911df11a72583d383..5bcea9acfb809807f3e99c6874533a956439d243 100644
--- a/src/client/ClientUpdate.java
+++ b/src/client/ClientUpdate.java
@@ -41,18 +41,14 @@ public class ClientUpdate extends UnicastRemoteObject implements IClientUpdate,
     {
         printUserList(users);
 
-        System.out.println("TEST1");
         JComboBox userBox = client.getApplicationMain().getChatScreen().getSendMessageToComboBox();
         JComboBox kickUserBox = client.getChatScreen().getKickUserComboBox();
 
-        System.out.println("TEST2");
         userBox.removeAllItems();
         kickUserBox.removeAllItems();
 
-        System.out.println("TEST3");
         userBox.addItem("All");
 
-        System.out.println("TEST4");
         for( String s : users )
         {
             if( !s.equals(client.getUserName()) )
diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java
index bccf0339c196411c022f16f408709239a90cc8d3..43883b2e581f3067691b42ca1d22592a42b8be66 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -4,6 +4,9 @@ import GUI.DrawingArea;
 import remote.IDrawingUpdate;
 
 import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.Serializable;
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
@@ -75,4 +78,21 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
         client.getApplicationMain().getPaintGUI().getDrawingArea().clear();
         return true;
     }
+
+    public boolean receiveImage(byte[] rawImage) throws RemoteException {
+        try {
+//            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().repaint();
+
+            // do whatever you wish with the image
+        }
+        catch (IOException err) {
+            err.printStackTrace();
+        }
+        return true;
+    }
 }
diff --git a/src/remote/IClientController.java b/src/remote/IClientController.java
index 349297d37ca18e26184c87e1d7754b5299718340..1dcd165573a381d245924c9966d8a13367439a3f 100644
--- a/src/remote/IClientController.java
+++ b/src/remote/IClientController.java
@@ -18,4 +18,6 @@ public interface IClientController extends Remote
     boolean broadcastManagerMessage(String toClient, Action action) throws RemoteException;
 
     String getAdmin() throws RemoteException;
+
+    boolean checkPassword(String password) throws RemoteException;
 }
diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java
index e30900af1ff1193799bb14110c0231985a9d2837..635c490c49e86dd5ee1bee1ed89ca997de08308c 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -1,5 +1,8 @@
 package remote;
 
+import GUI.SerializableImage;
+import client.Client;
+
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.rmi.Remote;
@@ -30,5 +33,7 @@ public interface IDrawingController extends Remote {
     ArrayList<Font> getFontList() throws RemoteException;
     ArrayList<Point> getTextStartPointList() throws RemoteException;
 //    BufferedImage getCurrentImage() throws RemoteException;
+    SerializableImage getCurrentImage() throws RemoteException;
+    void getImage(String fromClient) throws RemoteException;
 
 }
diff --git a/src/remote/IDrawingUpdate.java b/src/remote/IDrawingUpdate.java
index 91e26578ba95c104afab0a9b5affde0349a919fe..02f17f1e685503799e74e2ca9f3f7d26bdff404d 100644
--- a/src/remote/IDrawingUpdate.java
+++ b/src/remote/IDrawingUpdate.java
@@ -10,4 +10,5 @@ public interface IDrawingUpdate extends Remote, Serializable {
     boolean notifyDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException;
     boolean notifyDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException;
     boolean notifyCanvasClearance(String fromClient) throws RemoteException;
+    boolean receiveImage(byte[] rawImage) throws RemoteException;
 }
diff --git a/src/server/ClientController.java b/src/server/ClientController.java
index dfdb350ab7698554b76cf1eed74f27fc168d0107..4c710bbc9d0fa508751c3db651f717aed06798f4 100644
--- a/src/server/ClientController.java
+++ b/src/server/ClientController.java
@@ -62,7 +62,7 @@ public class ClientController extends UnicastRemoteObject implements IClientCont
             broadcastUserList();
         }
 
-        printUserList();
+        //printUserList();
     }
 
     // for debuggins purposes
@@ -71,7 +71,7 @@ public class ClientController extends UnicastRemoteObject implements IClientCont
         System.out.print("Currently connected users: ");
         for( User u : server.users )
         {
-            System.out.print(u.getUserName());
+            System.out.print(u.getUserName() + " ");
         }
         System.out.println();
     }
@@ -105,10 +105,12 @@ public class ClientController extends UnicastRemoteObject implements IClientCont
         if ( adminIndex >= 0 && userIndex >= 0 && server.users.get(adminIndex).isAdmin() )
         {
 
-            try {
+            try
+            {
                 server.users.get(userIndex).getIClientUpdate().terminateChat();
             }
-            finally {
+            finally
+            {
                 System.out.print(server.users);
                 server.users.remove(userIndex);
                 System.out.print(server.users);
@@ -202,4 +204,23 @@ public class ClientController extends UnicastRemoteObject implements IClientCont
 
         return true;
     }
+
+    @Override
+    public boolean checkPassword(String password)
+    {
+        if( server.users.size() == 0 )
+        {
+            server.setPassword(password);
+
+            return true;
+        }
+        else if( server.getPassword().equals(password) )
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
 }
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index dd89137a80de993953a9355dd991794b20a43aed..d52aebe4592c31b9e5c84be2d689a33490ac17fb 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -1,16 +1,14 @@
 package server;
 
 import GUI.SerializableImage;
+import client.Client;
 import remote.IDrawingController;
 import remote.IDrawingUpdate;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
+import java.io.*;
 import java.lang.reflect.Array;
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
@@ -19,7 +17,7 @@ import java.util.ArrayList;
 public class DrawingController extends UnicastRemoteObject implements IDrawingController {
 
     private final static int AREA_WIDTH = 600;
-    private final static int AREA_HEIGHT = 620;
+    private final static int AREA_HEIGHT = 600;
 
     private Server server;
     private SerializableImage serializableImage;
@@ -38,14 +36,15 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
     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.serializableImage = new SerializableImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+//        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.serializableImage = new SerializableImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+        g2 = (Graphics2D) serializableImage.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>();
@@ -63,6 +62,14 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         fontList.add(font);
         textStartPointList.add(startPoint);
 
+
+        g2 = (Graphics2D) serializableImage.getGraphics();
+        g2.setFont(font);
+        g2.drawString(text, startPoint.x, startPoint.y);
+        g2 = (Graphics2D) serializableImage.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+
         IDrawingUpdate client;
 
         for( User u : server.users )
@@ -87,6 +94,29 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         colorList.add(color);
         strokeSizeList.add(strokeSize);
 
+        g2 = (Graphics2D) serializableImage.getGraphics();
+        switch (mode) {
+            case "OVAL":
+            case "RECTANGLE":
+            case "CIRCLE":
+            case "FREEHAND":
+            case "LINE":
+                g2.setColor(color);
+                // g2.fill(drawing);    /// Uncomment the line to fill the shapes with color ///
+                g2.setStroke(new BasicStroke(strokeSize));
+                g2.draw(drawing);
+                break;
+            case "TEXT":
+            case "ERASE":
+            default:
+                break;
+        }
+        g2 = (Graphics2D) serializableImage.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setColor(color);
+
+
+
         IDrawingUpdate client;
 
         for( User u : server.users )
@@ -111,6 +141,28 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
             strokeSizeList.add(strokeSize);
         }
 
+        g2 = (Graphics2D) serializableImage.getGraphics();
+        switch (mode) {
+            case "FREEHAND":
+                g2.setColor(color);
+                g2.setStroke(new BasicStroke(strokeSize));
+                g2.draw(drawing);
+                break;
+
+            case "ERASE":
+                g2.setColor(Color.WHITE);
+                g2.fill(drawing);
+                g2.draw(drawing);
+                break;
+
+            default:
+                break;
+        }
+        g2 = (Graphics2D) serializableImage.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setColor(color);
+
+
         IDrawingUpdate client;
 
         for( User u : server.users )
@@ -139,6 +191,10 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         this.fontList.clear();
         this.textStartPointList.clear();
 
+        BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+        g2 = (Graphics2D) image.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
         for( User u : server.users )
         {
             if (!u.getUserName().equals(fromClient)) {
@@ -152,9 +208,30 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         return true;
     }
 
-//    public ImageCanvas getCurrentImage() {
-//        return image;
-//    }
+    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();
+        }
+        catch (IOException err) {
+            err.printStackTrace();
+        }
+
+        for( User u : server.users )
+        {
+            if (u.getUserName().equals(fromClient)) {
+                client = u.getIDrawingUpdate();
+                client.receiveImage(baos.toByteArray());
+            }
+        }
+    }
 
     public ArrayList<Shape> getShapeList() {
         return shapeList;
diff --git a/src/server/Server.java b/src/server/Server.java
index 02172a2b8dcee73a78134e6651f1debc376203e8..0160269bb14d69676c82e568f5521ab9d84ae94d 100644
--- a/src/server/Server.java
+++ b/src/server/Server.java
@@ -17,14 +17,27 @@ public class Server
     protected ChatController chatController;
     protected DrawingController drawingController;
 
+    private String password;
+
     public Server() throws RemoteException
     {
+        password = null;
         users = new ArrayList<User>();
         clientController = new ClientController(this);
         chatController = new ChatController(this);
         drawingController = new DrawingController(this);
     }
 
+    protected void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    protected String getPassword()
+    {
+        return password;
+    }
+
     public static void main(String[] args)
     {
         try
@@ -49,17 +62,13 @@ public class Server
         String chatControllerName = "ChatController";
         String drawingControllerName = "DrawingController";
 
-//        IClientController clientController = new ClientController(this);
-//        IChatController chatController = new ChatController(this);
-//        IDrawingController drawingController = new DrawingController(this);
-
-        IClientController iclientController = this.clientController;
-        IChatController ichatController = this.chatController;
-        IDrawingController idrawingController = this.drawingController;
+        IClientController clientController = this.clientController;
+        IChatController chatController = this.chatController;
+        IDrawingController drawingController = this.drawingController;
 
-        registry.rebind(clientControllerName, iclientController);
-        registry.rebind(chatControllerName, ichatController);
-        registry.rebind(drawingControllerName, idrawingController);
+        registry.rebind(clientControllerName, clientController);
+        registry.rebind(chatControllerName, chatController);
+        registry.rebind(drawingControllerName, drawingController);
 
         System.out.println("Server is ready");
     }