diff --git a/src/GUI/ChatScreen.form b/src/GUI/ChatScreen.form
index fc19ecab3953bc99aa5416516e99b31508b22226..8628672c8b03ba53bb54ae10847a29458c98b80e 100644
--- a/src/GUI/ChatScreen.form
+++ b/src/GUI/ChatScreen.form
@@ -23,7 +23,9 @@
           <grid id="bad73" binding="myAreaPanel" layout-manager="GridLayoutManager" row-count="11" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
             <margin top="0" left="0" bottom="0" right="0"/>
             <constraints>
-              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="7" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="7" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false">
+                <preferred-size width="200" height="-1"/>
+              </grid>
             </constraints>
             <properties/>
             <border type="none" title="My Area"/>
@@ -124,7 +126,9 @@
           <grid id="5d886" binding="chatPanel" layout-manager="GridLayoutManager" row-count="6" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
             <margin top="0" left="0" bottom="0" right="0"/>
             <constraints>
-              <grid row="0" column="0" row-span="2" col-span="1" vsize-policy="7" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+              <grid row="0" column="0" row-span="2" col-span="1" vsize-policy="7" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false">
+                <preferred-size width="300" height="-1"/>
+              </grid>
             </constraints>
             <properties/>
             <border type="none" title="Chat Area"/>
diff --git a/src/GUI/DrawingArea.java b/src/GUI/DrawingArea.java
index a5dfa87448243d06b8516b17802b3b51af883a64..481c938471b92a3d62209282dd34a3560bf87ede 100644
--- a/src/GUI/DrawingArea.java
+++ b/src/GUI/DrawingArea.java
@@ -61,7 +61,7 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
         lineStroke = new BasicStroke(strokeSize);
         eraserSize = 10;
         textSize = 60;
-        textString = "Enter text...";
+        textString = "Text here.";
         drawing = null;
         addMouseListener(this);
         addMouseMotionListener(this);
@@ -218,70 +218,6 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
         eraserSize = size;
     }
 
-//    public void setColorAqua() {
-//        shapeColor = new Color(0,255, 255);
-//    }
-//
-//    public void setColorBlack() {
-//        shapeColor = new Color(0, 0, 0);
-//    }
-//
-//    public void setColorBlue() {
-//        shapeColor = new Color(0, 0, 255);
-//    }
-//
-//    public void setColorFuchsia() {
-//        shapeColor = new Color(255, 0, 255);
-//    }
-//
-//    public void setColorGray() {
-//        shapeColor = new Color(128, 128, 128);
-//    }
-//
-//    public void setColorGreen() {
-//        shapeColor = new Color(0, 128, 0);
-//    }
-//
-//    public void setColorLime() {
-//        shapeColor = new Color(0, 255, 0);
-//    }
-//
-//    public void setColorMaroon() {
-//        shapeColor = new Color(128,0, 0);
-//    }
-//
-//    public void setColorNavy() {
-//        shapeColor = new Color(0, 0, 128);
-//    }
-//
-//    public void setColorOlive() {
-//        shapeColor = new Color(128, 128, 0);
-//    }
-//
-//    public void setColorPurple() {
-//        shapeColor = new Color(128, 0, 128);
-//    }
-//
-//    public void setColorRed() {
-//        shapeColor = new Color(255, 0, 0);
-//    }
-//
-//    public void setColorSilver() {
-//        shapeColor = new Color(192, 192, 192);
-//    }
-//
-//    public void setColorTeal() {
-//        shapeColor = new Color(0, 128, 128);
-//    }
-//
-//    public void setColorWhite() {
-//        shapeColor = new Color(255, 255, 255);
-//    }
-//
-//    public void setColorYellow() {
-//        shapeColor = new Color(255, 255, 0);
-//    }
-
     @Override
     public void mouseClicked(MouseEvent e) {
         startPoint = e.getPoint();
@@ -298,6 +234,9 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
                 } catch (RemoteException ex) {
                     ex.printStackTrace();
                 }
+                repaint();
+                break;
+            default:
                 break;
         }
     }
@@ -327,8 +266,8 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
                 drawing = new Rectangle2D.Double();
                 break;
 
-//            case TEXT:
-//
+            case TEXT:
+
 //                g2.setFont(new Font("TimesRoman", Font.PLAIN, textSize));
 //                g2.drawString(textString, startPoint.x, startPoint.y);
 //                try {
@@ -336,6 +275,7 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
 //                } catch (RemoteException ex) {
 //                    ex.printStackTrace();
 //                }
+//                repaint();
 //                break;
         }
     }
@@ -347,20 +287,17 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
             case OVAL:
             case RECTANGLE:
             case CIRCLE:
-
-                /// Abort drawing if 2D has no width or height ///
-                if (((RectangularShape) drawing).getWidth() == 0 || ((RectangularShape) drawing).getHeight() == 0) {
-                    break;
-                }
             case FREEHAND:
             case LINE:
-                // Graphics2D g2 = (Graphics2D) image.getGraphics();
                 g2.setColor(shapeColor);
-
-                /// Uncomment the line below to fill the shapes with color ///
-                // g2.fill(drawing);
+                // g2.fill(drawing);    /// Uncomment the line to fill the shapes with color ///
                 g2.setStroke(lineStroke);
                 g2.draw(drawing);
+                break;
+            case TEXT:
+            case ERASE:
+            default:
+                break;
         }
 
         g2 = (Graphics2D) image.getGraphics();
diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 0621a492813df01f10cc8e58bb1fbd89455cddcd..1b87a668692f5c400ca04d65c24daad095848d3e 100644
--- a/src/GUI/PaintGUI.java
+++ b/src/GUI/PaintGUI.java
@@ -13,6 +13,7 @@ import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.rmi.RemoteException;
 
 public class PaintGUI extends JPanel {
 
@@ -165,7 +166,24 @@ public class PaintGUI extends JPanel {
 
 /// Clear button ///
             if (e.getSource() == clearBtn) {
-                drawingArea.clear();
+                int reply = JOptionPane.showConfirmDialog(null,
+                        "Do you want to save the canvas before clearing?",
+                        "Canvas clearance", JOptionPane.YES_NO_OPTION);
+
+                if( reply == JOptionPane.YES_OPTION )
+                {
+                    try
+                    {
+                        client.getDrawingController().broadcastClearCanvas(client.getUserName());
+                    }
+                    catch (RemoteException err)
+                    {
+                        JOptionPane.showMessageDialog(null,
+                                "Error in clearing the canvas", "Error", JOptionPane.ERROR_MESSAGE);
+                    }
+
+                    drawingArea.clear();
+                }
 
 /// Create new canvas ///
             } else if (e.getSource() == newBtn) {
diff --git a/src/GUI/SerializableImage.java b/src/GUI/SerializableImage.java
new file mode 100644
index 0000000000000000000000000000000000000000..159436e9213b1b666e2e4448a16afa3c7536808d
--- /dev/null
+++ b/src/GUI/SerializableImage.java
@@ -0,0 +1,23 @@
+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;
+
+public class SerializableImage implements Serializable {
+
+    transient BufferedImage image;
+
+    public void writeObject(ObjectOutputStream output) throws IOException {
+        output.defaultWriteObject();
+        ImageIO.write(image, "png", output);
+    }
+
+    public void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {
+        input.defaultReadObject();
+        image = ImageIO.read(input);
+    }
+}
diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java
index 59f39d947853d9edde1add1c7c901959875ebe14..bccf0339c196411c022f16f408709239a90cc8d3 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -70,4 +70,9 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
         client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
         return true;
     }
+
+    public boolean notifyCanvasClearance(String fromClient) throws RemoteException {
+        client.getApplicationMain().getPaintGUI().getDrawingArea().clear();
+        return true;
+    }
 }
diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java
index e39d8ecfa95ea62e865a94a6e3c3cf8edac78347..e30900af1ff1193799bb14110c0231985a9d2837 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -20,6 +20,8 @@ public interface IDrawingController extends Remote {
     boolean broadcastText(String fromClient, String text, Font font, Point startPoint) throws RemoteException;
     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;
diff --git a/src/remote/IDrawingUpdate.java b/src/remote/IDrawingUpdate.java
index 27f73ccfb04917f7a20189f40b6e6762bbc9465f..91e26578ba95c104afab0a9b5affde0349a919fe 100644
--- a/src/remote/IDrawingUpdate.java
+++ b/src/remote/IDrawingUpdate.java
@@ -9,4 +9,5 @@ public interface IDrawingUpdate extends Remote, Serializable {
     boolean notifyTextDrawing(String fromClient, String text, Font font, Point startPoint) throws RemoteException;
     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;
 }
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index da53d58f1248a09b7a6d712843c79aa809a3f712..dd89137a80de993953a9355dd991794b20a43aed 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -1,5 +1,6 @@
 package server;
 
+import GUI.SerializableImage;
 import remote.IDrawingController;
 import remote.IDrawingUpdate;
 
@@ -21,6 +22,7 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
     private final static int AREA_HEIGHT = 620;
 
     private Server server;
+    private SerializableImage serializableImage;
     private BufferedImage bufferedImage;
     private Graphics2D g2;
 
@@ -35,9 +37,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);
+//        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>();
@@ -118,6 +126,32 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
         return true;
     }
 
+    public boolean broadcastClearCanvas(String fromClient) throws RemoteException {
+        System.out.print("Broadcasting canvas clearance to everyone...");
+
+        IDrawingUpdate client;
+
+        this.shapeList.clear();
+        this.colorList.clear();
+        this.strokeSizeList.clear();
+
+        this.textList.clear();
+        this.fontList.clear();
+        this.textStartPointList.clear();
+
+        for( User u : server.users )
+        {
+            if (!u.getUserName().equals(fromClient)) {
+                client = u.getIDrawingUpdate();
+                client.notifyCanvasClearance(fromClient);
+            }
+        }
+
+        System.out.print("...DONE\n");
+
+        return true;
+    }
+
 //    public ImageCanvas getCurrentImage() {
 //        return image;
 //    }
diff --git a/src/server/Server.java b/src/server/Server.java
index 65842248bec9de49f36f79a9e29c9e2eface21a3..02172a2b8dcee73a78134e6651f1debc376203e8 100644
--- a/src/server/Server.java
+++ b/src/server/Server.java
@@ -49,13 +49,17 @@ 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 clientController = new ClientController(this);
+//        IChatController chatController = new ChatController(this);
+//        IDrawingController drawingController = new DrawingController(this);
 
-        registry.rebind(clientControllerName, clientController);
-        registry.rebind(chatControllerName, chatController);
-        registry.rebind(drawingControllerName, drawingController);
+        IClientController iclientController = this.clientController;
+        IChatController ichatController = this.chatController;
+        IDrawingController idrawingController = this.drawingController;
+
+        registry.rebind(clientControllerName, iclientController);
+        registry.rebind(chatControllerName, ichatController);
+        registry.rebind(drawingControllerName, idrawingController);
 
         System.out.println("Server is ready");
     }