diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo b/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo
index 8a3408c16f49e05882ec5627d234f077d7bba934..49381ce9e1319cb2b27de46254f73f9d752c394d 100644
Binary files a/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo differ
diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide
index 4ce1ef7698a3e777fc11cde5fa17ff9d9eab09a4..b7fcf98d79c62e997d036c917bdc54b9e51e78da 100644
Binary files a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide differ
diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-shm b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-shm
new file mode 100644
index 0000000000000000000000000000000000000000..61970f6c0eb1ce2ded82344b08fd9c60011f2139
Binary files /dev/null and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-shm differ
diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-wal b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-wal
new file mode 100644
index 0000000000000000000000000000000000000000..5438e69a4becb02135ba7d28e29d578e13fc1a4b
Binary files /dev/null and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-wal differ
diff --git a/TDDD49-P2P/Models/Connection.cs b/TDDD49-P2P/Models/Connection.cs
index d96c9db53fb2717e7e5d33453f1cdcbffe12b6c0..4fa8e7c6b2b5daf8a42557b1bb49452ceb836d0f 100644
--- a/TDDD49-P2P/Models/Connection.cs
+++ b/TDDD49-P2P/Models/Connection.cs
@@ -211,8 +211,9 @@ namespace TDDD49_P2P.Models
         }
 
 
-        public void StartClient(String server, Int32 port, string name)
-        {           
+        public void EstablishClientConnection(Int32 port, String server, string name)
+        {
+          
             // Create a TcpClient.
             // Note, for this client to work you need to have a TcpServer 
             // connected to the same address as specified by the server, port
@@ -223,9 +224,12 @@ namespace TDDD49_P2P.Models
             //  Stream stream = client.GetStream();
             ServerStream = Client.GetStream();
 
+        
+
             int i;
             Byte[] bytes = new Byte[6250000];
             // Loop to receive all the data sent by the client.
+
             if(ServerStream != null)
             {
                 while ((i = ServerStream.Read(bytes, 0, bytes.Length)) != 0)
@@ -237,22 +241,6 @@ namespace TDDD49_P2P.Models
                     if (RecData.Msg == "STOP" && RecData.Type == "SYS")
                     {
                         CanOnlyRead = false;
-                        if (Server != null)
-                        {
-                            Console.WriteLine("client is closing server");
-                            Client.Close();
-                            Client = null;
-                            Server.Stop();
-                            listenThread.Abort();
-                        }
-                        else
-                        {
-                            Console.WriteLine("client is closing client");
-                            Client.Close();
-                            Server.Stop();
-                            Client = null;
-                            clientThread.Abort();
-                        }
                     } else if (RecData.Msg == "CONNECTED" && RecData.Type == "SYS")
                     {
                         Console.WriteLine("Connected!");
@@ -264,9 +252,8 @@ namespace TDDD49_P2P.Models
                         Buzz();
                     }                        
                 }
-                Client.Close();
-                ServerStream.Close();
             }
+
         }
 
 
@@ -307,39 +294,18 @@ namespace TDDD49_P2P.Models
             }
         }
 
-
-        private void EstablishClientConnection()
-        {
-            throw new NotImplementedException();
-        }
-
-
-        public void EstablishClientConnection(int port, string paddress, string name)
-        {            
-            StartClient(paddress, port, name);                     
-        }
-
-
         public void EstablishServerConnection(int port, string name)
-        {
-            try
+        {           
+            int res;
+            if (port >= 1000 && int.TryParse(port.ToString(), out res))
             {
-                int res;
-                if (port >= 1000 && int.TryParse(port.ToString(), out res))
-                {
-                    Listener(port, name);
-                }
-                else
-                {
-                    CanOnlyRead = false;
-                    throw (new NoPortEx("Invalid port"));
-                }
+                Listener(port, name);
             }
-            catch (NoPortEx e)
+            else
             {
-                Console.WriteLine("NoPortEx: {0}", e.Message);
-                MessageBox.Show("Invalid port", ":)", MessageBoxButton.OK);
-            }            
+                CanOnlyRead = false;
+                throw (new NoPortEx("Invalid port"));
+            }
         }
 
 
@@ -371,8 +337,6 @@ namespace TDDD49_P2P.Models
 
         public void StartListen(int port, string name)
         {
-            Console.Write("RESULT: ");
-            Console.WriteLine(Result);
             if (listenThread == null || !listenThread.IsAlive)
             {
                 CanOnlyRead = true;
@@ -457,7 +421,8 @@ namespace TDDD49_P2P.Models
                             }
                             else if(m.Type == "IMAGE")
                             {
-                                Message message = new Message() { Msg = "", Username = m.Username, Type = "IMAGE", Image = BitmapToImageSource(Base64ToImage(m.Msg)) };
+                                Bitmap bitmap = (Bitmap)Bitmap.FromFile(m.Msg);
+                                Message message = new Message() { Msg = "", Username = m.Username, Type = "IMAGE", Image = BitmapToImageSource(bitmap) };
                                 messages.Add(message);
                             }
                         }
@@ -502,12 +467,6 @@ namespace TDDD49_P2P.Models
             SendToStream(msg);
         }
 
-        public byte[] DecodeImage(string file)
-        {
-            byte[] newBytes = Convert.FromBase64String(file);
-            return newBytes;
-        }
-
 
         public void SendMessage(ObservableCollection<Message> Messages, String name, ObservableCollection<Button> Buttons, ICommand OpenChatCommand, History hist, String histPath, List<Message> history)
         {
@@ -520,10 +479,6 @@ namespace TDDD49_P2P.Models
                 hist.AddHistory(message, histPath, Chatter, history);
                 hist.CreateHistoryButton(RecData, Buttons, OpenChatCommand);
             }
-            else
-            {
-                Console.WriteLine("No connection established, please try again :')");
-            }
         }
 
 
@@ -536,12 +491,13 @@ namespace TDDD49_P2P.Models
                 if (Client != null && Client.Connected == true && ServerStream.CanWrite == true)
                 {
                     Message message = new Message() { Msg = Convert.ToBase64String(File.ReadAllBytes(dlg.FileName)), Username = name, TimeStamp = DateTime.Now.ToString(), Type = "IMAGE" };
+                    Message saveMessage = new Message() { Msg = dlg.FileName, Username = name, TimeStamp = DateTime.Now.ToString(), Type = "IMAGE" };
                     Bitmap bitmap = (Bitmap)Bitmap.FromFile(dlg.FileName);
                     Message messageToDisp = new Message() { Username = name, TimeStamp = DateTime.Now.ToString(), Type = "IMAGE", Image = BitmapToImageSource(bitmap) };
                     Messages.Add(messageToDisp);
                     String msg = JsonConvert.SerializeObject(message);
                     SendToStream(msg);
-                    hist.AddHistory(message, histPath, Chatter, history);
+                    hist.AddHistory(saveMessage, histPath, Chatter, history);
                 }
             }
         }
diff --git a/TDDD49-P2P/ViewModels/ChatViewModel.cs b/TDDD49-P2P/ViewModels/ChatViewModel.cs
index cc029c5bbff9e56f96f5cbf091a010f59a283bad..40c5ea586e4ce56adf81b1c548173cab06d7658c 100644
--- a/TDDD49-P2P/ViewModels/ChatViewModel.cs
+++ b/TDDD49-P2P/ViewModels/ChatViewModel.cs
@@ -15,11 +15,14 @@ using Microsoft.Win32;
 using System.Threading;
 using System.Net.Sockets;
 using System.Security;
+using static TDDD49_P2P.Models.Connection;
+using System.Text;
+using System.Drawing.Imaging;
 
 namespace TDDD49_P2P.ViewModels
 {
     public class ChatViewModel
-    {       
+    {
         public ObservableCollection<Message> Messages { get; set; } = new ObservableCollection<Message>();
         public ObservableCollection<Message> Images { get; set; } = new ObservableCollection<Message>();
         public ObservableCollection<Button> Buttons { get; set; } = new ObservableCollection<Button>();
@@ -29,6 +32,8 @@ namespace TDDD49_P2P.ViewModels
         private JsonSerializer serializer = new JsonSerializer();
         private Window window = Application.Current.MainWindow;
         private String histPath = System.AppDomain.CurrentDomain.BaseDirectory + @"history\";
+        private String imagePath = System.AppDomain.CurrentDomain.BaseDirectory + @"images\";
+
         Task task2;
 
         public ChatViewModel()
@@ -39,7 +44,7 @@ namespace TDDD49_P2P.ViewModels
             InitHist();
             ListenAnswer();
             RecieveData();
-        }    
+        }
 
 
         private User _user;
@@ -75,7 +80,7 @@ namespace TDDD49_P2P.ViewModels
             }
         }
 
-        
+
         public bool CanExecute
         {
             get
@@ -104,9 +109,9 @@ namespace TDDD49_P2P.ViewModels
         public ICommand StartClientCommand
         {
             get
-            {                
-                return _startClientCommand ?? (_startClientCommand = new CommandHandler(param => Connection.InitClient(User.Port, User.PAddress, User.Name), () => CanExecute));                
-            }            
+            {
+                return _startClientCommand ?? (_startClientCommand = new CommandHandler(param => Connection.InitClient(User.Port, User.PAddress, User.Name), () => CanExecute));
+            }
         }
 
 
@@ -139,7 +144,7 @@ namespace TDDD49_P2P.ViewModels
             }
         }
 
-        
+
         private ICommand _stopCommand;
         public ICommand StopCommand
         {
@@ -154,7 +159,7 @@ namespace TDDD49_P2P.ViewModels
         public ICommand OpenChatCommand
         {
             get
-            {               
+            {
                 return _openChatCommand ?? (_openChatCommand = new CommandHandler(param => Connection.OpenHistChat(param, Messages), () => CanExecute));
             }
         }
@@ -199,7 +204,7 @@ namespace TDDD49_P2P.ViewModels
         public void StopChat()
         {
             try
-            { 
+            {
                 Connection.StopListen(User.Name);
             }
             catch (SocketException e)
@@ -218,6 +223,26 @@ namespace TDDD49_P2P.ViewModels
             {
                 Console.WriteLine("ThreadStateException: {0}", e);
             }
+            catch (ArgumentNullException e)
+            {
+                Console.WriteLine("ArgumentNullException: {0}", e);
+            }
+            catch (EncoderFallbackException e)
+            {
+                Console.WriteLine("EncoderFallbackException: {0}", e);
+            }
+            catch (ArgumentOutOfRangeException e)
+            {
+                Console.WriteLine("ArgumentOutOfRangeException: {0}", e);
+            }
+            catch (ObjectDisposedException e)
+            {
+                Console.WriteLine("ObjectDisposedException: {0}", e);
+            }
+            catch (FormatException e)
+            {
+                Console.WriteLine("FormatException: {0}", e);
+            }
             MessageBox.Show("Connection Lost", ":(", MessageBoxButton.OK);
         }
 
@@ -232,9 +257,9 @@ namespace TDDD49_P2P.ViewModels
             else
             {
                 task2.Start();
-            }            
+            }
             try
-            { 
+            {
                 Connection.StartListen(User.Port, User.Name);
             }
             catch (IOException e)
@@ -242,6 +267,11 @@ namespace TDDD49_P2P.ViewModels
                 Console.WriteLine("IOException: {0}", e);
                 MessageBox.Show("Lost connection", ":)", MessageBoxButton.OK);
             }
+            catch (NoPortEx e)
+            {
+                Console.WriteLine("NoPortEx: {0}", e.Message);
+                MessageBox.Show("Invalid port", ":)", MessageBoxButton.OK);
+            }
             catch (ArgumentNullException e)
             {
                 Console.WriteLine("ArgumentNullException: {0}", e);
@@ -264,100 +294,159 @@ namespace TDDD49_P2P.ViewModels
             {
                 Console.WriteLine("SecurityException: {0}", e);
             }
+            catch (EncoderFallbackException e)
+            {
+                Console.WriteLine("EncoderFallbackException: {0}", e);
+            }
+            catch (ArgumentOutOfRangeException e)
+            {
+                Console.WriteLine("ArgumentOutOfRangeException: {0}", e);
+            }
+            catch (ObjectDisposedException e)
+            {
+                Console.WriteLine("ObjectDisposedException: {0}", e);
+            }
+            catch (FormatException e)
+            {
+                Console.WriteLine("FormatException: {0}", e);
+            }
         }
 
         public void ListenAnswer()
         {
             bool stop = false;
-            task2 = new Task(() =>
+            try
             {
-                while (true)
+                task2 = new Task(() =>
                 {
-                    while (Connection.Client != null && !stop)
+
+                    while (true)
                     {
-                        Connection.Result = MessageBox.Show("Would you like to chat? :)", ":)", MessageBoxButton.YesNo);
-                        if (Connection.Result == MessageBoxResult.No)
+                        while (Connection.Client != null && !stop)
                         {
-                            Message msg = new Message() { Msg = "REJECT", Username = User.Name, Type = "SYS" };
-                            Connection.SendToStream(JsonConvert.SerializeObject(msg));
+                            Connection.Result = MessageBox.Show("Would you like to chat? :)", ":)", MessageBoxButton.YesNo);
+                            if (Connection.Result == MessageBoxResult.No)
+                            {
+                                Message msg = new Message() { Msg = "REJECT", Username = User.Name, Type = "SYS" };
+                                Connection.SendToStream(JsonConvert.SerializeObject(msg));
+                            }
+                            Console.WriteLine(Connection.Result);
+                            stop = true;
+                        }
+                        if (stop)
+                        {
+                            break;
                         }
-                        Console.WriteLine(Connection.Result);
-                        stop = true;
-                    }
-                    if (stop)
-                    {
-                        break;
                     }
-                }
-            });
+
+
+                });
+            }
+            catch (ArgumentNullException e)
+            {
+                Console.WriteLine("ArgumentNullException: {0}", e);
+            }
+            catch (EncoderFallbackException e)
+            {
+                Console.WriteLine("EncoderFallbackException: {0}", e);
+            }
+            catch (ArgumentOutOfRangeException e)
+            {
+                Console.WriteLine("ArgumentOutOfRangeException: {0}", e);
+            }
+            catch (IOException e)
+            {
+                Console.WriteLine("IOException: {0}", e);
+            }
+            catch (ObjectDisposedException e)
+            {
+                Console.WriteLine("ObjectDisposedException: {0}", e);
+            }
+            catch (FormatException e)
+            {
+                Console.WriteLine("FormatException: {0}", e);
+            }
         }
 
 
         public void RecieveData()
         {
-            Task task = new Task(() =>
+            try
             {
-                while (true)
+                Task task = new Task(() =>
                 {
-                    if (Connection.RecData != null)
+                    while (true)
                     {
-                        if (Connection.RecData.Type == "MESSAGE")
+                        if (Connection.RecData != null)
                         {
-                            App.Current.Dispatcher.Invoke((Action)delegate
+                            if (Connection.RecData.Type == "MESSAGE")
                             {
-                                Message message = new Message() { Msg = Connection.RecData.Msg, Username = Connection.RecData.Username, TimeStamp = Connection.RecData.TimeStamp, Type = Connection.RecData.Type };
-                                Messages.Add(message);
+                                App.Current.Dispatcher.Invoke((Action)delegate
+                                {
+                                    Message message = new Message() { Msg = Connection.RecData.Msg, Username = Connection.RecData.Username, TimeStamp = Connection.RecData.TimeStamp, Type = Connection.RecData.Type };
+                                    Messages.Add(message);
 
-                                histPath = System.AppDomain.CurrentDomain.BaseDirectory + @"history\";
-                                System.IO.Directory.CreateDirectory(histPath);
-                                histPath += Connection.RecData.Username + ".txt";
+                                    histPath = System.AppDomain.CurrentDomain.BaseDirectory + @"history\";
+                                    System.IO.Directory.CreateDirectory(histPath);
+                                    histPath += Connection.RecData.Username + ".txt";
 
-                                if (File.Exists(histPath))
-                                {
-                                    using (StreamReader file1 = File.OpenText(histPath))
+                                    if (File.Exists(histPath))
                                     {
-                                        _history = (List<Message>)serializer.Deserialize(file1, typeof(List<Message>));
+                                        using (StreamReader file1 = File.OpenText(histPath))
+                                        {
+                                            _history = (List<Message>)serializer.Deserialize(file1, typeof(List<Message>));
+                                        }
+                                    }
+                                    _history.Add(message);
+                                    using (StreamWriter file = File.CreateText(histPath))
+                                    {
+                                        //serialize object directly into file stream
+                                        serializer.Serialize(file, _history);
                                     }
-                                }
-                                _history.Add(message);
-                                using (StreamWriter file = File.CreateText(histPath))
-                                {
-                                    //serialize object directly into file stream
-                                    serializer.Serialize(file, _history);
-                                }
 
-                                History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand);
-                                Connection.RecData = null;
-                            });
-                        }
-                        else if (Connection.RecData.Type == "IMAGE")
-                        {
-                            App.Current.Dispatcher.Invoke((Action)delegate
-                            {
-                                Message message = new Message() { Msg = "", Username = Connection.RecData.Username, Type = "IMAGE", Image = Connection.BitmapToImageSource(Connection.Base64ToImage(Connection.RecData.Msg)) };
-                                Message histMessage = new Message() { Msg = Connection.RecData.Msg, Username = Connection.RecData.Username, Type = "IMAGE" };
-                                Messages.Add(message);
-                                History.AddHistory(histMessage, histPath, Connection.Chatter, _history);
-
-                                History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand);
-                                Connection.RecData = null;
-                            });
-                        }else if (Connection.RecData.Type == "SYS")
-                        {
-                            if(Connection.RecData.Msg == "REJECT")
+                                    History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand);
+                                    Connection.RecData = null;
+                                });
+                            }
+                            else if (Connection.RecData.Type == "IMAGE")
                             {
-                                MessageBox.Show("They dont want to chat with you", ":(", MessageBoxButton.OK);
-                                Connection.RecData = null;
-                            }else if (Connection.RecData.Msg == "STOP")
+                                App.Current.Dispatcher.Invoke((Action)delegate
+                                {
+                                    System.IO.Directory.CreateDirectory(imagePath);
+
+                                    Message message = new Message() { Msg = "", Username = Connection.RecData.Username, Type = "IMAGE", Image = Connection.BitmapToImageSource(Connection.Base64ToImage(Connection.RecData.Msg)) };
+                                    string imageName = imagePath + message.GetHashCode() + ".png";
+                                    Connection.Base64ToImage(Connection.RecData.Msg).Save(imageName, ImageFormat.Png);
+
+                                    Message histMessage = new Message() { Msg = imageName, Username = Connection.RecData.Username, Type = "IMAGE" };
+
+                                    Messages.Add(message);
+                                    History.AddHistory(histMessage, histPath, Connection.Chatter, _history);
+
+                                    History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand);
+                                    Connection.RecData = null;
+                                });
+                            } else if (Connection.RecData.Type == "SYS")
                             {
-                                MessageBox.Show("Connection Lost", ":(", MessageBoxButton.OK);
-                                Connection.RecData = null;
+                                if (Connection.RecData.Msg == "REJECT")
+                                {
+                                    MessageBox.Show("They dont want to chat with you", ":(", MessageBoxButton.OK);
+                                    Connection.RecData = null;
+                                } else if (Connection.RecData.Msg == "STOP")
+                                {
+                                    MessageBox.Show("Connection Lost", ":(", MessageBoxButton.OK);
+                                    Connection.RecData = null;
+                                }
                             }
                         }
                     }
-                }
-            });
-            task.Start();
+                });
+                task.Start();
+            }
+            catch(InvalidOperationException e)
+            {
+                Console.WriteLine("InvalidOperationException: {0}", e);
+            }
         }
     }
 }
diff --git a/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
index 7d14f7706a2dbe50a2a7e5aace432c6a0fcdb8f5..afab3b4f9e98bf6d39cddb611ee588c5aef1d6b4 100644
Binary files a/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache b/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache
index a64896c2dacca2a68e21c9267bfa168684dc6bf3..b9d6bb37d9e8a91f873ed01b57b0fd14d9dc972e 100644
Binary files a/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache and b/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache differ
diff --git a/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache b/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache
index 460bf39608b464b01d13887331676f26babad515..132e114a0bcf2cee7ba56b6a79cde9b2590ab2ea 100644
--- a/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache
+++ b/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache
@@ -12,7 +12,7 @@ DEBUG;TRACE
 X:\tddd49\TDDD49-P2P\App.xaml
 11892971807
 
-15329401250
+12480718928
 15-996201704
 Views\MainWindow.xaml;