diff --git a/src/GUI/ApplicationMain.java b/src/GUI/ApplicationMain.java
index f58583c786fdc49d256d02afc788c81f773f9f06..32275b92f8dece89d30856904b4cab47a776d11d 100644
--- a/src/GUI/ApplicationMain.java
+++ b/src/GUI/ApplicationMain.java
@@ -7,6 +7,7 @@ import java.awt.*;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.rmi.RemoteException;
+import java.util.ArrayList;
 
 public class ApplicationMain extends JPanel {
     private Client client;
@@ -38,6 +39,36 @@ public class ApplicationMain extends JPanel {
         content.add(chatScreen.panel2, BorderLayout.EAST);
         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();
+
+            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();
+            }
+        }
+        catch (RemoteException e) {
+            e.printStackTrace();
+        }
+
+
         SwingUtilities.getRootPane(chatScreen.getSendButton()).setDefaultButton(chatScreen.getSendButton());
         frame.addWindowListener(new WindowAdapter()
         {
@@ -62,18 +93,13 @@ public class ApplicationMain extends JPanel {
 
                     System.exit(0);
                 }
-
-                if( reply == JOptionPane.NO_OPTION )
-                {
-                    //do nothing
-                }
             }
         });
 
         frame.setSize(1200, 700);
         frame.setLocationRelativeTo( null );
         frame.setResizable(false);
-        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
         frame.pack();
         frame.setVisible(true);
     }
diff --git a/src/GUI/ChatScreen.form b/src/GUI/ChatScreen.form
index d33374440b768c016d7fb477525ab8432cac3f01..fc19ecab3953bc99aa5416516e99b31508b22226 100644
--- a/src/GUI/ChatScreen.form
+++ b/src/GUI/ChatScreen.form
@@ -8,7 +8,7 @@
     <properties>
       <maximumSize width="-1" height="-1"/>
       <minimumSize width="-1" height="-1"/>
-      <preferredSize width="700" height="600"/>
+      <preferredSize width="500" height="600"/>
     </properties>
     <border type="none"/>
     <children>
@@ -20,7 +20,7 @@
         <properties/>
         <border type="none"/>
         <children>
-          <grid id="bad73" binding="myAreaPanel" layout-manager="GridLayoutManager" row-count="12" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+          <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"/>
@@ -30,7 +30,7 @@
             <children>
               <component id="a35da" class="javax.swing.JLabel" binding="managersNameLabel">
                 <constraints>
-                  <grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+                  <grid row="3" 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>
                   <font size="14" style="1"/>
@@ -39,12 +39,12 @@
               </component>
               <vspacer id="38e19">
                 <constraints>
-                  <grid row="10" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+                  <grid row="9" column="0" 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="98bbe" class="javax.swing.JLabel" binding="yourNameLabel">
                 <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"/>
+                  <grid row="1" 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>
                   <font size="14" style="1"/>
@@ -53,7 +53,7 @@
               </component>
               <component id="33d66" class="javax.swing.JLabel" binding="yourNameDisplay">
                 <constraints>
-                  <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+                  <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="Here goes User's Name"/>
@@ -62,7 +62,7 @@
               <grid id="4212" binding="managersPanel" layout-manager="GridLayoutManager" row-count="4" 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="6" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+                  <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
                 </constraints>
                 <properties/>
                 <border type="none" title="Manager's Tools"/>
@@ -100,7 +100,7 @@
               </grid>
               <component id="51b56" class="javax.swing.JLabel" binding="managersNameDisplay">
                 <constraints>
-                  <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+                  <grid row="4" 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="Here goes Admin's Name"/>
@@ -108,7 +108,7 @@
               </component>
               <vspacer id="e9e96">
                 <constraints>
-                  <grid row="11" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+                  <grid row="10" column="0" 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="deaed" class="javax.swing.JButton" binding="exitThisRoomButton" default-binding="true">
@@ -119,14 +119,6 @@
                   <text value="Exit This Room"/>
                 </properties>
               </component>
-              <component id="bd8ec" class="javax.swing.JButton" binding="quitButton">
-                <constraints>
-                  <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
-                </constraints>
-                <properties>
-                  <text value="Quit Program"/>
-                </properties>
-              </component>
             </children>
           </grid>
           <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">
@@ -163,7 +155,7 @@
                   <component id="c55f3" class="javax.swing.JTextArea" binding="chatDisplayBox">
                     <constraints/>
                     <properties>
-                      <editable value="true"/>
+                      <editable value="false"/>
                       <lineWrap value="true"/>
                     </properties>
                   </component>
diff --git a/src/GUI/ChatScreen.java b/src/GUI/ChatScreen.java
index b36a1a53b732ce6027fb4fc3de3dec9c97b63ee4..1c70a5f1b6933fae7b920b0039b8e4af9dc4639a 100644
--- a/src/GUI/ChatScreen.java
+++ b/src/GUI/ChatScreen.java
@@ -30,7 +30,6 @@ public class ChatScreen {
     private JPanel managersPanel;
     private JPanel chatPanel;
     private JButton exitThisRoomButton;
-    private JButton quitButton;
     private JFrame frame;
 
     public Client getClient() {
@@ -44,7 +43,6 @@ public class ChatScreen {
         this.client = client;
         yourNameDisplay.setText(client.getUserName());
         exitThisRoomButton.addActionListener(actionListener);
-        quitButton.addActionListener(actionListener);
         sendButton.addActionListener(actionListener);
         kickOutButton.addActionListener(actionListener);
         promoteToManagerButton.addActionListener(actionListener);
diff --git a/src/GUI/DrawingArea.java b/src/GUI/DrawingArea.java
index 21069490ac09b3a85c3eb35b876440ee928f206a..a5dfa87448243d06b8516b17802b3b51af883a64 100644
--- a/src/GUI/DrawingArea.java
+++ b/src/GUI/DrawingArea.java
@@ -6,9 +6,7 @@ import remote.IDrawingController;
 import javax.imageio.ImageIO;
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
+import java.awt.event.*;
 import java.awt.geom.Ellipse2D;
 import java.awt.geom.Line2D;
 import java.awt.geom.Rectangle2D;
@@ -16,38 +14,38 @@ import java.awt.geom.RectangularShape;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
+import java.io.Serializable;
 import java.rmi.RemoteException;
 
-public class DrawingArea extends JPanel implements MouseMotionListener, MouseListener {
-
-
+public class DrawingArea extends JPanel implements MouseMotionListener, MouseListener, Serializable {
 
     /// enum for all different mode ///
-    enum Mode { FREEHAND, LINE, CIRCLE, RECTANGLE, OVAL, ERASE }
+    enum Mode { FREEHAND, LINE, CIRCLE, RECTANGLE, OVAL, ERASE, TEXT }
 
     /// Canvas size parameter ///
     private final static int AREA_WIDTH = 600;
-    private final static int AREA_HEIGHT = 620;
+    private final static int AREA_HEIGHT = 600;
 
     /// Shape to be drawn on the canvas ///
     private Client client;
 
-    private Shape drawing;
-
     private Point startPoint;
     private Point previousPoint;
-
     private Point currentPoint;
-    /// Default mode and color ///
-    private Color shapeColor;// = new Color(0, 0, 0);
-
-    private Mode currentMode;// = Mode.FREEHAND;
-    /// Create a empty canvas ///
-    private BufferedImage image;// = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-
-    /// Drawing tool
-    private Graphics2D g2;// = (Graphics2D) image.getGraphics();
 
+    /// Default mode and color ///
+    private Mode currentMode;
+    private Color shapeColor;
+    private Stroke lineStroke;
+    private int strokeSize;
+    private int eraserSize;
+    private int textSize;
+    private String textString;
+
+    /// Create a empty canvas //
+    private BufferedImage image;
+    private Graphics2D g2;
+    private Shape drawing;
 
     public DrawingArea(Client client) {
         this.client = client;
@@ -59,12 +57,16 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         shapeColor =  new Color(0, 0, 0);
         currentMode = Mode.FREEHAND;
+        strokeSize = 3;
+        lineStroke = new BasicStroke(strokeSize);
+        eraserSize = 10;
+        textSize = 60;
+        textString = "Enter text...";
         drawing = null;
         addMouseListener(this);
         addMouseMotionListener(this);
     }
 
-
     public Shape getDrawing() {
         return drawing;
     }
@@ -73,6 +75,16 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
         this.drawing = drawing;
     }
 
+    public Graphics2D getG2() { return g2; }
+
+
+    public void setG2(Graphics2D g2) { this.g2 = g2; }
+
+
+    public BufferedImage getImage() { return image; }
+
+    public void setImage(BufferedImage image) { this.image = image; }
+
 
     @Override
     public Dimension getPreferredSize()
@@ -108,24 +120,38 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
             Color borderColor = currentMode != Mode.ERASE ? shapeColor : Color.WHITE;
             g2.setColor(borderColor);
             g2.draw(drawing);
-            IDrawingController drawingController = client.getDrawingController();
-            try {
-                drawingController.broadcastDrawing(client.getUserName(), drawing);
-            } catch (RemoteException ex) {
-                ex.printStackTrace();
-            }
         }
     }
 
 /// File manipulations (PNG only) ///
-    public void saveFile() {
+
+    public void saveAsPNGFile(File file) {
         try {
-            ImageIO.write(image, "PNG", new File("Saved_White_Board.png"));
+            ImageIO.write(image, "PNG", file);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void saveAsJPGFile(File file) {
+
+        BufferedImage imageJPG = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
+        imageJPG.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);
+        try {
+            ImageIO.write(imageJPG, "JPG", file);
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 
+//    public void saveFile() {
+//        try {
+//            ImageIO.write(image, "PNG", new File("Saved_White_Board.png"));
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//    }
+
     public void saveAsFile(File file) {
         try {
             ImageIO.write(image, "PNG", file);
@@ -169,75 +195,111 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
         currentMode = Mode.ERASE;
     }
 
-/// Drawing color setters ///
-
-    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 setModeText(String string, int size) {
+        currentMode = Mode.TEXT;
+        textString = string;
+        textSize = size;
     }
 
-    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);
-    }
+/// Drawing color setters ///
 
-    public void setColorYellow() {
-        shapeColor = new Color(255, 255, 0);
-    }
+    public void setColor(Color color) {
+        shapeColor = color;
+    }
+
+/// Drawing stroke setter ///
+
+    public void setStroke(int size) {
+        strokeSize = size;
+        lineStroke = new BasicStroke(strokeSize);
+    }
+
+    public void setEraserSize(int size) {
+        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();
+
+/// Instantiate object based on current mode ///
+        switch (currentMode) {
 
+            case TEXT:
+
+                g2.setFont(new Font("TimesRoman", Font.PLAIN, textSize));
+                g2.drawString(textString, startPoint.x, startPoint.y);
+                try {
+                    client.getDrawingController().broadcastText(client.getUserName(), textString, g2.getFont(), startPoint);
+                } catch (RemoteException ex) {
+                    ex.printStackTrace();
+                }
+                break;
+        }
     }
 
     @Override
@@ -264,27 +326,40 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
 
                 drawing = new Rectangle2D.Double();
                 break;
+
+//            case TEXT:
+//
+//                g2.setFont(new Font("TimesRoman", Font.PLAIN, textSize));
+//                g2.drawString(textString, startPoint.x, startPoint.y);
+//                try {
+//                    client.getDrawingController().broadcastText(client.getUserName(), textString, g2.getFont(), startPoint);
+//                } catch (RemoteException ex) {
+//                    ex.printStackTrace();
+//                }
+//                break;
         }
     }
 
     @Override
     public void mouseReleased(MouseEvent e) {
+        IDrawingController drawingController = client.getDrawingController();
         switch (currentMode) {
             case OVAL:
             case RECTANGLE:
             case CIRCLE:
 
-/// Abort drawing if 2D has no width or height ///
+                /// 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();
+                // Graphics2D g2 = (Graphics2D) image.getGraphics();
                 g2.setColor(shapeColor);
 
-/// Uncomment the line below to fill the shapes with color ///
-//                        g2.fill(drawing);
+                /// Uncomment the line below to fill the shapes with color ///
+                // g2.fill(drawing);
+                g2.setStroke(lineStroke);
                 g2.draw(drawing);
         }
 
@@ -292,9 +367,15 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         g2.setColor(shapeColor);
 
-/// This repaint is needed if we want to fill the drawing shape with color
+        /// This repaint is needed if we want to fill the drawing shape with color
         repaint();
 
+        try {
+            drawingController.broadcastDrawing(client.getUserName(), drawing, currentMode.toString(), shapeColor, strokeSize);
+        } catch (RemoteException ex) {
+            ex.printStackTrace();
+        }
+
         drawing = null;
     }
 
@@ -310,8 +391,9 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
 
     @Override
     public void mouseDragged(MouseEvent e) {
-        currentPoint = e.getPoint();
+        IDrawingController drawingController = client.getDrawingController();
 
+        currentPoint = e.getPoint();
         int x = Math.min(startPoint.x, e.getX());
         int y = Math.min(startPoint.y, e.getY());
         int width = Math.abs(startPoint.x - e.getX());
@@ -324,6 +406,7 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
 
                 ((Line2D) drawing).setLine(currentPoint, previousPoint);
                 g2.setColor(shapeColor);
+                g2.setStroke(lineStroke);
                 g2.draw(drawing);
                 previousPoint = currentPoint;
                 break;
@@ -362,9 +445,17 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
 
                 ((Rectangle2D) drawing).setFrame(x, y, width, height);
                 break;
+
+            case TEXT:
+                break;
         }
 
         repaint();
+        try {
+            drawingController.broadcastDraggingDrawing(client.getUserName(), drawing, currentMode.toString(), shapeColor, strokeSize);
+        } catch (RemoteException ex) {
+            ex.printStackTrace();
+        }
     }
 
     @Override
diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 40a63589b23c67847eade7ad28d6ae306516d3fd..0621a492813df01f10cc8e58bb1fbd89455cddcd 100644
--- a/src/GUI/PaintGUI.java
+++ b/src/GUI/PaintGUI.java
@@ -2,29 +2,43 @@ package GUI;
 
 import client.Client;
 
+import javax.imageio.ImageIO;
 import javax.swing.*;
+import javax.swing.filechooser.FileFilter;
+import javax.swing.filechooser.FileNameExtensionFilter;
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.image.BufferedImage;
 import java.io.File;
 
 public class PaintGUI extends JPanel {
 
     Client client;
+    DrawingArea drawingArea;
 
-    String[] shapes = {"Freehand", "Line", "Circle", "Rectangle", "Oval", "Eraser"};
-    String[] colors = {"Aqua", "Black", "Blue", "Fuchsia", "Gray", "Green", "Lime", "Maroon", "Navy", "Olive", "Purple", "Red", "Silver", "Teal", "White", "Yellow"};
+    String[] shapes = {"Freehand", "Line", "Circle", "Rectangle", "Oval", "Eraser", "Text"};
+    String[] strokes = {"Small", "Medium", "Large"};
+    String[] eraserSizes = {"Small", "Medium", "Large"};
     JFrame frame;
-    JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn, closeBtn;
-    JComboBox colorOptions;
-    JComboBox shapeOptions;
-    DrawingArea drawingArea;
+    JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn;
+    JButton freehandBtn, lineBtn, circleBtn, rectBtn, ovalBtn, eraserBtn, textBtn;
+    JButton colorPaletteBtn, setFontBtn;
+    JTextField textInput, textSize;
+    JComboBox strokeOptions;
+    JComboBox eraserSizeOptions;
 
+    String filePath = "";
+    Color currentColor = Color.BLACK;
 
     JPanel global = new JPanel();
-    JFileChooser fileChooser= new JFileChooser();
     JPanel toolbox = new JPanel();
+    JPanel toolbox1 = new JPanel();
+    JPanel toolbox2 = new JPanel();
     JPanel fileControl = new JPanel();
+    JFileChooser fileChooser= new JFileChooser();
 
     /// GUI setup ///
     public PaintGUI(Client client) {
@@ -33,16 +47,71 @@ public class PaintGUI extends JPanel {
 
 /// Main drawing area ///
         drawingArea = new DrawingArea(client);
+//        drawingArea.setPreferredSize(new Dimension(600, 620));
 
 /// Set up main frame and container ///
         global.setLayout(new BorderLayout());
+        toolbox.setLayout(new BorderLayout());
+
+        /// Set up button icons ///
+        try {
+            String path = System.getProperty("user.dir");
+            System.out.println(path);
+            File palettePic = new File(path + "/src/GUI/icon/palette.png");
+            File freehandPic = new File(path + "/src/GUI/icon/freehand.png");
+            File linePic = new File(path + "/src/GUI/icon/line.png");
+            File circlePic = new File(path + "/src/GUI/icon/circle.png");
+            File rectPic = new File(path + "/src/GUI/icon/rectangle.png");
+            File ovalPic = new File(path + "/src/GUI/icon/oval.png");
+            File eraserPic = new File(path + "/src/GUI/icon/eraser.png");
+            File textPic = new File(path + "/src/GUI/icon/text.png");
+            BufferedImage paletteIcon = ImageIO.read(palettePic);
+            BufferedImage freehandIcon = ImageIO.read(freehandPic);
+            BufferedImage lineIcon = ImageIO.read(linePic);
+            BufferedImage circleIcon = ImageIO.read(circlePic);
+            BufferedImage rectIcon = ImageIO.read(rectPic);
+            BufferedImage ovalIcon = ImageIO.read(ovalPic);
+            BufferedImage eraserIcon = ImageIO.read(eraserPic);
+            BufferedImage textIcon = ImageIO.read(textPic);
+            colorPaletteBtn = new JButton(new ImageIcon(paletteIcon));
+            colorPaletteBtn.addActionListener(actionListener);
+            freehandBtn = new JButton(new ImageIcon(freehandIcon));
+            freehandBtn.addActionListener(actionListener);
+            lineBtn = new JButton(new ImageIcon(lineIcon));
+            lineBtn.addActionListener(actionListener);
+            circleBtn = new JButton(new ImageIcon(circleIcon));
+            circleBtn.addActionListener(actionListener);
+            rectBtn = new JButton(new ImageIcon(rectIcon));
+            rectBtn.addActionListener(actionListener);
+            ovalBtn = new JButton(new ImageIcon(ovalIcon));
+            ovalBtn.addActionListener(actionListener);
+            eraserBtn = new JButton(new ImageIcon(eraserIcon));
+            eraserBtn.addActionListener(actionListener);
+            textBtn = new JButton(new ImageIcon(textIcon));
+            textBtn.addActionListener(actionListener);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        strokeOptions = new JComboBox(strokes);
+        strokeOptions.setSelectedItem("Small");
+        strokeOptions.addActionListener(actionListener);
+        eraserSizeOptions = new JComboBox(eraserSizes);
+        eraserSizeOptions.setSelectedItem("Small");
+        eraserSizeOptions.addActionListener(actionListener);
+
+        //        setFontBtn = new JButton("Font");
+//        setFontBtn.addActionListener(actionListener);
+        textInput = new JTextField("Text here.");
+        textInput.setColumns(8);
+        textInput.addFocusListener(focusListener);
+//        textInput.setVisible(false);
+        textSize = new JTextField("12");
+        textSize.setColumns(2);
+        textSize.addFocusListener(focusListener);
+//        textSize.setVisible(false);
 
 /// Set up elements ///
-        shapeOptions = new JComboBox(shapes);
-        shapeOptions.addActionListener(actionListener);
-        colorOptions = new JComboBox(colors);
-        colorOptions.setSelectedItem("Black");
-        colorOptions.addActionListener(actionListener);
         clearBtn = new JButton("Clear");
         clearBtn.addActionListener(actionListener);
         newBtn = new JButton("New");
@@ -53,22 +122,32 @@ public class PaintGUI extends JPanel {
         saveBtn.addActionListener(actionListener);
         saveAsBtn = new JButton("Save As");
         saveAsBtn.addActionListener(actionListener);
-        closeBtn = new JButton("Close");
-        closeBtn.addActionListener(actionListener);
 
 /// Toolbox panel ///
-        toolbox.add(colorOptions);
-        toolbox.add(shapeOptions);
-        toolbox.add(clearBtn);
+        toolbox1.add(colorPaletteBtn);
+//        toolbox.add(setFontBtn);
+        toolbox1.add(freehandBtn);
+        toolbox1.add(lineBtn);
+        toolbox1.add(circleBtn);
+        toolbox1.add(rectBtn);
+        toolbox1.add(ovalBtn);
+        toolbox1.add(eraserBtn);
+        toolbox1.add(textBtn);
+        toolbox2.add(textInput);
+        toolbox2.add(textSize);
+        toolbox2.add(strokeOptions);
+        toolbox2.add(eraserSizeOptions);
+        toolbox2.add(clearBtn);
 
 /// File control panel ///
         fileControl.add(newBtn);
         fileControl.add(openBtn);
         fileControl.add(saveBtn);
         fileControl.add(saveAsBtn);
-        fileControl.add(closeBtn);
 
 /// Layout ///
+        toolbox.add(toolbox1, BorderLayout.NORTH);
+        toolbox.add(toolbox2, BorderLayout.SOUTH);
         global.add(fileControl, BorderLayout.NORTH);
         global.add(drawingArea);
         global.add(toolbox, BorderLayout.SOUTH);
@@ -78,6 +157,8 @@ public class PaintGUI extends JPanel {
         return global;
     }
 
+    public DrawingArea getDrawingArea() { return drawingArea; }
+
     ActionListener actionListener = new ActionListener() {
 
         public void actionPerformed(ActionEvent e) {
@@ -88,10 +169,19 @@ public class PaintGUI extends JPanel {
 
 /// Create new canvas ///
             } else if (e.getSource() == newBtn) {
+                File file;
+
                 int returnVal = JOptionPane.showConfirmDialog(new JFrame(), "Save your current whiteboard?", "Save or Discard", JOptionPane.YES_NO_CANCEL_OPTION);
                 if (returnVal == JOptionPane.YES_OPTION) {
 
-                    drawingArea.saveFile();
+                    if (filePath.isEmpty()) {
+                        file = chooseSaveFile();
+
+                    } else {
+                        file = new File(filePath);
+
+                    }
+                    drawingArea.saveAsPNGFile(file);
                     drawingArea.clear();
 
                 } else if (returnVal == JOptionPane.NO_OPTION) {
@@ -110,123 +200,161 @@ public class PaintGUI extends JPanel {
 
 /// Save under project directory without filename (PNG file with default filename) ///
             } else if (e.getSource() == saveBtn) {
-                drawingArea.saveFile();
+
+                File file;
+
+                if (filePath.isEmpty()) {
+                    file = chooseSaveFile();
+                } else {
+                    file = new File(filePath);
+
+                }
+                if (file != null) {
+                    if (filePath.endsWith(".jpg")) {
+                        drawingArea.saveAsJPGFile(file);
+                    } else if (filePath.endsWith(".png")) {
+                        drawingArea.saveAsPNGFile(file);
+                    }
+                }
 
 /// Save with other filename (PNG only) ///
             } else if (e.getSource() == saveAsBtn) {
-                fileChooser = new JFileChooser();
-                int returnVal = fileChooser.showSaveDialog(frame);
-                if (returnVal == JFileChooser.APPROVE_OPTION) {
-                    File file = fileChooser.getSelectedFile();
-                    drawingArea.saveAsFile(file);
-                }
 
-/// Close application ///
-            } else if (e.getSource() == closeBtn) {
-                System.exit(0);
+                File file = chooseSaveFile();
+
+                if (file != null) {
+                    if (filePath.endsWith(".jpg")) {
+                        drawingArea.saveAsJPGFile(file);
+                    } else if (filePath.endsWith(".png")) {
+                        drawingArea.saveAsPNGFile(file);
+                    }
+                }
 
 /// Choose drawing color ///
-            } else if (e.getSource() == colorOptions) {
+            } else if (e.getSource() == colorPaletteBtn) {
+                drawingArea.setColor(JColorChooser.showDialog(null, "Choose a Color", currentColor));
 
-                String colorChosen = (String) colorOptions.getSelectedItem();
+/// Choose drawing tool ///
+            } else if (e.getSource() == freehandBtn) {
+                drawingArea.setModeFreehand();
 
-                switch (colorChosen){
-                    case "Aqua":
-                        drawingArea.setColorAqua();
-                        break;
-                    case "Black":
-                        drawingArea.setColorBlack();
-                        break;
-                    case "Blue":
-                        drawingArea.setColorBlue();
-                        break;
-                    case "Fuchsia":
-                        drawingArea.setColorFuchsia();
-                        break;
-                    case "Gray":
-                        drawingArea.setColorGray();
-                        break;
-                    case "Green":
-                        drawingArea.setColorGreen();
-                        break;
-                    case "Lime":
-                        drawingArea.setColorLime();
-                        break;
-                    case "Maroon":
-                        drawingArea.setColorMaroon();
-                        break;
-                    case "Navy":
-                        drawingArea.setColorNavy();
-                        break;
-                    case "Olive":
-                        drawingArea.setColorOlive();
-                        break;
-                    case "Purple":
-                        drawingArea.setColorPurple();
-                        break;
-                    case "Red":
-                        drawingArea.setColorRed();
-                        break;
-                    case "Silver":
-                        drawingArea.setColorSilver();
-                        break;
-                    case "Teal":
-                        drawingArea.setColorTeal();
-                        break;
-                    case "White":
-                        drawingArea.setColorWhite();
-                        break;
-                    case "Yellow":
-                        drawingArea.setColorYellow();
-                        break;
-                }
+            } else if (e.getSource() == lineBtn) {
+                drawingArea.setModeLine();
 
-/// Choose drawing tool ///
-            } else if (e.getSource() == shapeOptions) {
+            } else if (e.getSource() == circleBtn) {
+                drawingArea.setModeCircle();
+
+            } else if (e.getSource() == rectBtn) {
+                drawingArea.setModeRectangle();
+
+            } else if (e.getSource() == ovalBtn) {
+                drawingArea.setModeOval();
+
+            } else if (e.getSource() == eraserBtn) {
+                drawingArea.setModeErase();
 
-                String shapeChosen = (String) shapeOptions.getSelectedItem();
+            } else if (e.getSource() == textBtn) {
+    //                textInput.setVisible(true);
+    //                textSize.setVisible(true);
+                setTextDetail();
+            } else if (e.getSource() == strokeOptions) {
+                String strokeChosen = (String) strokeOptions.getSelectedItem();
 
-                switch (shapeChosen){
-                    case "Freehand":
-                        drawingArea.setModeFreehand();
+                switch (strokeChosen) {
+                    case "Small":
+                        drawingArea.setStroke(3);
                         break;
-                    case "Line":
-                        drawingArea.setModeLine();
+                    case "Medium":
+                        drawingArea.setStroke(6);
                         break;
-                    case "Circle":
-                        drawingArea.setModeCircle();
+                    case "Large":
+                        drawingArea.setStroke(10);
                         break;
-                    case "Rectangle":
-                        drawingArea.setModeRectangle();
+                }
+
+            } else if (e.getSource() == eraserSizeOptions) {
+                String eraserSizeChosen = (String) eraserSizeOptions.getSelectedItem();
+
+                switch (eraserSizeChosen) {
+                    case "Small":
+                        drawingArea.setEraserSize(10);
                         break;
-                    case "Oval":
-                        drawingArea.setModeOval();
+                    case "Medium":
+                        drawingArea.setEraserSize(20);
                         break;
-                    case "Eraser":
-                        drawingArea.setModeErase();
+                    case "Large":
+                        drawingArea.setEraserSize(30);
                         break;
                 }
             }
         }
     };
 
-    public DrawingArea getDrawingArea() {
-        return drawingArea;
-    }
+    FocusListener focusListener = new FocusListener() {
+        @Override
+        public void focusGained(FocusEvent e) {
+            setTextDetail();
+        }
 
+        @Override
+        public void focusLost(FocusEvent e) {
+            setTextDetail();
+        }
+    };
+
+    private File chooseSaveFile() {
+
+        fileChooser = new JFileChooser();
+        FileFilter png = new FileNameExtensionFilter("PNG format", "png");
+        FileFilter jpg = new FileNameExtensionFilter("JPG format", "jpg");
+        fileChooser.addChoosableFileFilter(png);
+        fileChooser.addChoosableFileFilter(jpg);
+        fileChooser.setFileFilter(png);
+        int returnVal = fileChooser.showSaveDialog(frame);
+        if (returnVal == JFileChooser.APPROVE_OPTION) {
+            File file = fileChooser.getSelectedFile();
+            filePath = file.getAbsolutePath();
+
+            if (fileChooser.getFileFilter().getDescription().equals("JPG format")) {
+                if (!filePath.toLowerCase().endsWith(".jpg")) {
+                    filePath = filePath + ".jpg";
+                    file = new File(file + ".jpg");
+                }
+                return file;
+            } else {
+                if (!filePath.toLowerCase().endsWith(".png")) {
+                    filePath = filePath + ".png";
+                    file = new File(file + ".png");
+                }
+                return file;
+            }
 
+        } else {
+            return null;
+        }
+    }
 
 
-    public void showGUI() {
-        frame = new JFrame("Shared Whiteboard System");
-        JFrame.setDefaultLookAndFeelDecorated(true);
-        frame.setContentPane(global);
+    private void setTextDetail() {
+        String textString = textInput.getText();
+        int size = Integer.parseInt(textSize.getText());
 
-        frame.setSize(800, 600);
-        frame.setLocationRelativeTo( null );
-        frame.setResizable(false);
-        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-        frame.setVisible(true);
+        drawingArea.setModeText(textString, size);
     }
 
+
+
+
+//    public void showGUI() {
+//        frame = new JFrame("Shared Whiteboard System");
+//        JFrame.setDefaultLookAndFeelDecorated(true);
+//        frame.setContentPane(global);
+//
+//        frame.setSize(800, 600);
+//        frame.setLocationRelativeTo( null );
+//        frame.setResizable(false);
+//        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+//        frame.setVisible(true);
+//    }
+
 }
\ No newline at end of file
diff --git a/src/GUI/icon/circle.png b/src/GUI/icon/circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c23e5a725c3b9d87d0765641e401184be837d24
Binary files /dev/null and b/src/GUI/icon/circle.png differ
diff --git a/src/GUI/icon/eraser.png b/src/GUI/icon/eraser.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5d98df4ca4a1a677baaf83a00fbc903f814119c
Binary files /dev/null and b/src/GUI/icon/eraser.png differ
diff --git a/src/GUI/icon/freehand.png b/src/GUI/icon/freehand.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d162ecd975889c2ff84b0b3e456a4d4115eb82f
Binary files /dev/null and b/src/GUI/icon/freehand.png differ
diff --git a/src/GUI/icon/line.png b/src/GUI/icon/line.png
new file mode 100644
index 0000000000000000000000000000000000000000..31156130a58ec6c455be88f00e470329cba61afd
Binary files /dev/null and b/src/GUI/icon/line.png differ
diff --git a/src/GUI/icon/oval.png b/src/GUI/icon/oval.png
new file mode 100644
index 0000000000000000000000000000000000000000..665c0a0c7c3b1eaa4ba51e6baa6c150f651f8b5f
Binary files /dev/null and b/src/GUI/icon/oval.png differ
diff --git a/src/GUI/icon/palette.png b/src/GUI/icon/palette.png
new file mode 100644
index 0000000000000000000000000000000000000000..813d7ffbe98d40089591256979bd1f21514abdc9
Binary files /dev/null and b/src/GUI/icon/palette.png differ
diff --git a/src/GUI/icon/rectangle.png b/src/GUI/icon/rectangle.png
new file mode 100644
index 0000000000000000000000000000000000000000..94d8278acf49ff157270cc81e0967334936611ec
Binary files /dev/null and b/src/GUI/icon/rectangle.png differ
diff --git a/src/GUI/icon/square.png b/src/GUI/icon/square.png
new file mode 100644
index 0000000000000000000000000000000000000000..38657f5a2779b68ecab7d083e8c112b879bf77bc
Binary files /dev/null and b/src/GUI/icon/square.png differ
diff --git a/src/GUI/icon/text.png b/src/GUI/icon/text.png
new file mode 100644
index 0000000000000000000000000000000000000000..33af1a2708cee9b502580ce4b6380c3a1d8740c8
Binary files /dev/null and b/src/GUI/icon/text.png differ
diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java
index 4b41c0285681b1674f9b35cc61336ca6d4451426..59f39d947853d9edde1add1c7c901959875ebe14 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -18,12 +18,56 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
     }
 
     @Override
-    public boolean notifyDrawing(String fromClient, Shape drawing) throws RemoteException {
-        client.getApplicationMain().getPaintGUI().getDrawingArea().setDrawing(drawing);
+    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().repaint();
-//        DrawingArea drawingArea = (DrawingArea) client.getChatScreen().getDrawingPanel().getComponent(1);
-//        drawingArea.setDrawing(drawing);
-//        drawingArea.repaint();
-        return false;
+        return true;
+    }
+
+    @Override
+    public boolean notifyDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
+        Graphics2D g2 = client.getApplicationMain().getPaintGUI().getDrawingArea().getG2();
+        switch (mode) {
+            case "OVAL":
+            case "RECTANGLE":
+            case "CIRCLE":
+            case "FREEHAND":
+            case "LINE":
+                g2.setColor(color);
+                g2.setStroke(new BasicStroke(strokeSize));
+                g2.draw(drawing);
+                break;
+            default:
+                System.out.println("Erased");
+        }
+        g2 = (Graphics2D) client.getApplicationMain().getPaintGUI().getDrawingArea().getImage().getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setColor(color);
+        client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
+        return true;
+    }
+
+    public boolean notifyDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
+        Graphics2D g2 = client.getApplicationMain().getPaintGUI().getDrawingArea().getG2();
+        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;
+        }
+        client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
+        return true;
     }
 }
diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java
index 145cc49619dcab3c25de449b706221fff56ecab6..e39d8ecfa95ea62e865a94a6e3c3cf8edac78347 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -1,8 +1,10 @@
 package remote;
 
 import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.rmi.Remote;
 import java.rmi.RemoteException;
+import java.util.ArrayList;
 
 
 /**
@@ -15,7 +17,16 @@ import java.rmi.RemoteException;
  */
 public interface IDrawingController extends Remote {
 
-    boolean broadcastDrawing(String fromClient, Shape drawing) throws RemoteException;
+    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;
+    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;
 
 }
diff --git a/src/remote/IDrawingUpdate.java b/src/remote/IDrawingUpdate.java
index 3df14ff51b7f3bbb41069b15f36ea23627699439..27f73ccfb04917f7a20189f40b6e6762bbc9465f 100644
--- a/src/remote/IDrawingUpdate.java
+++ b/src/remote/IDrawingUpdate.java
@@ -6,5 +6,7 @@ import java.rmi.Remote;
 import java.rmi.RemoteException;
 
 public interface IDrawingUpdate extends Remote, Serializable {
-    boolean notifyDrawing(String fromClient, Shape drawing) throws RemoteException;
+    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;
 }
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index 1471e8a38a33c3fc1d496f36ffa306ad0f0a1888..da53d58f1248a09b7a6d712843c79aa809a3f712 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -3,32 +3,146 @@ package server;
 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.lang.reflect.Array;
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
+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 Server server;
+    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.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 broadcastDrawing(String fromClient, Shape drawing) throws RemoteException {
+    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);
+
         IDrawingUpdate client;
 
         for( User u : server.users )
         {
-            client = u.getIDrawingUpdate();
-            client.notifyDrawing(fromClient, drawing);
+            if (!u.getUserName().equals(fromClient)) {
+                client = u.getIDrawingUpdate();
+                client.notifyTextDrawing(fromClient, text, font, startPoint);
+            }
         }
 
         System.out.print("...DONE\n");
 
         return true;
     }
-}
\ No newline at end of file
+
+
+    @Override
+    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);
+
+        IDrawingUpdate client;
+
+        for( User u : server.users )
+        {
+            if (!u.getUserName().equals(fromClient)) {
+                client = u.getIDrawingUpdate();
+                client.notifyDrawing(fromClient, drawing, mode, color, strokeSize);
+            }
+        }
+
+        System.out.print("...DONE\n");
+
+        return true;
+    }
+
+    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);
+        }
+
+        IDrawingUpdate client;
+
+        for( User u : server.users )
+        {
+            if (!u.getUserName().equals(fromClient)) {
+                client = u.getIDrawingUpdate();
+                client.notifyDraggingDrawing(fromClient, drawing, mode, color, strokeSize);
+            }
+        }
+
+        System.out.print("...DONE\n");
+
+        return true;
+    }
+
+//    public ImageCanvas getCurrentImage() {
+//        return image;
+//    }
+
+    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;
+    }
+}