diff --git a/src/main/java/dao/GroupChatDAO.java b/src/main/java/dao/GroupChatDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..91f62ea849e22f154908fafed49504853166b9df
--- /dev/null
+++ b/src/main/java/dao/GroupChatDAO.java
@@ -0,0 +1,222 @@
+package dao;
+
+import data.GroupChat;
+import data.Message;
+import data.User;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import static dao.Database.close;
+
+
+/**
+ * Data access object for GroupChat
+ */
+public class GroupChatDAO {
+
+    /**
+     * Add a new GroupChat
+     * @param groupChat GroupChat to be added
+     * @return GroupChat, empty GroupChat object if unsuccessful
+     */
+
+
+    public GroupChat addGroupChat(GroupChat groupChat){
+        PreparedStatement preparedStatement = null;
+        Connection connection = null;
+        ResultSet resultSet = null;
+        try{
+            connection = Database.instance().getConnection();
+            preparedStatement = connection.prepareStatement("INSERT INTO groupChat (groupChatName) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
+            preparedStatement.setString(1, groupChat.getGroupChatName());
+
+            int result = preparedStatement.executeUpdate();
+
+            if(result == 1){
+                resultSet = preparedStatement.getGeneratedKeys();
+                if(resultSet.next()){
+                    int groupChatId = resultSet.getInt(1);
+                    groupChat.setGroupChatId(groupChatId);
+
+                    ArrayList<User> users = groupChat.getUserList();
+                    preparedStatement = connection.prepareStatement("INSERT INTO user_groupChat (userId, groupChatId) VALUES (?, ?) ");
+                    for(User user:users){
+                        preparedStatement.setInt(1, user.getUserId());
+                        preparedStatement.setInt(2, groupChatId);
+                        preparedStatement.executeUpdate();
+                    }
+                    return groupChat;
+                }
+            }
+
+        }catch (SQLException e){
+            e.printStackTrace();
+        }finally{
+            close(connection, preparedStatement, resultSet);
+        }
+        return new GroupChat();
+    }
+
+    /**
+     * Get a GroupChat, with given groupChatId
+     * @param groupChatId groupChatId as int
+     * @return requested GroupChat if found, empty GroupChat object if not found
+     */
+
+
+    public GroupChat getGroupChat(int groupChatId){
+        PreparedStatement preparedStatement = null;
+        Connection connection = null;
+        ResultSet resultSet = null;
+        GroupChat groupChat = new GroupChat();
+        try{
+            connection = Database.instance().getConnection();
+            preparedStatement = connection.prepareStatement("SELECT * FROM groupChat WHERE groupChatId = ?");
+            preparedStatement.setInt(1, groupChatId);
+            resultSet = preparedStatement.executeQuery();
+            while(resultSet.next()) {
+                groupChat.setGroupChatId(groupChatId);
+                groupChat.setGroupChatName(resultSet.getString("groupChatName"));
+            }
+        }catch(SQLException e){
+            e.printStackTrace();
+        }finally{
+            close(connection, preparedStatement, resultSet);
+        }
+        return groupChat;
+    }
+
+
+
+    /**
+     * Get all GroupChats for user with given userId
+     * @param userId int userId of the user
+     * @return ArrayList of GroupChats
+     */
+
+
+    public ArrayList<GroupChat> getGroupChatByUserId(int userId){
+        ArrayList<GroupChat> groupChats = new ArrayList<>();
+        PreparedStatement preparedStatement = null;
+        Connection connection = null;
+        ResultSet resultSet = null;
+        try{
+            connection = Database.instance().getConnection();
+            preparedStatement = connection.prepareStatement("SELECT * FROM groupChat WHERE groupChatId IN (SELECT groupChatId FROM user_groupChat WHERE userId = ?)");
+            preparedStatement.setInt(1, userId);
+            resultSet = preparedStatement.executeQuery();
+            GroupChat groupChat;
+            while(resultSet.next()){
+                groupChat = new GroupChat();
+                groupChat.setGroupChatId(resultSet.getInt("groupChatId"));
+                groupChat.setGroupChatName(resultSet.getString("groupChatName"));
+                groupChats.add(groupChat);
+            }
+            return groupChats;
+        }catch (SQLException e){
+            e.printStackTrace();
+        }finally{
+            close(connection, preparedStatement, resultSet);
+        }
+        return groupChats;
+    }
+
+    /**
+     * Get all messages for a GroupChat
+     * @param groupChatId groupChatId as int
+     * @return ArrayList of Messages
+     */
+
+
+    public ArrayList<Message> getGroupChatMessages(int groupChatId){
+        ArrayList<Message> messages = new ArrayList<>();
+        PreparedStatement preparedStatement = null;
+        Connection connection = null;
+        ResultSet resultSet = null;
+        try{
+            connection = Database.instance().getConnection();
+            preparedStatement = connection.prepareStatement("SELECT * FROM message WHERE groupChatId = ?");
+            preparedStatement.setInt(1, groupChatId);
+            resultSet = preparedStatement.executeQuery();
+
+            Message message;
+            while(resultSet.next()){
+                message = new Message();
+                message.setMessageId(resultSet.getInt("messageId"));
+                message.setUserId1(resultSet.getInt("userId1"));
+                Calendar cal = Calendar.getInstance();
+                cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+                message.setTimestamp(resultSet.getTimestamp("timestamp",cal));
+                message.setMessageContent(resultSet.getString("messageContent"));
+                message.setGroupChatId(resultSet.getInt("groupChatId"));
+                messages.add(message);
+            }
+        }catch (SQLException e){
+            e.printStackTrace();
+        }finally {
+            close(connection, preparedStatement, resultSet);
+        }
+        return messages;
+    }
+
+    /**
+     * Adds a Message to a GroupChat
+     * @param groupChatId groupChatId as int
+     * @param message Message object to be added to GroupChat
+     * @return The message that was added
+     */
+
+    public Message addMessage(int groupChatId, Message message){
+        PreparedStatement preparedStatement = null;
+        Connection connection = null;
+        try{
+            connection = Database.instance().getConnection();
+            preparedStatement = connection.prepareStatement("INSERT INTO message (userId1, timestamp, messageContent, groupChatId) VALUES (?, NOW(), ?, ?)");
+            preparedStatement.setInt(1, message.getUserId1());
+            preparedStatement.setString(2, message.getMessageContent());
+            preparedStatement.setInt(3, groupChatId);
+
+            preparedStatement.executeUpdate();
+        }catch (SQLException e){
+            e.printStackTrace();
+        }finally{
+            close(connection, preparedStatement, null);
+        }
+        return message;
+    }
+
+    /**
+     * Get all users in a GroupChat
+     * @param groupChatId groupChatId as int
+     * @return ArrayList of Users the GroupChat
+     */
+
+
+    public ArrayList<User> getGroupChatUsers(int groupChatId){
+        ArrayList<User> users = new ArrayList<>();
+        PreparedStatement preparedStatement = null;
+        ResultSet resultSet = null;
+        Connection connection = null;
+        try{
+            connection = Database.instance().getConnection();
+            preparedStatement = connection.prepareStatement("SELECT * FROM user WHERE user.userId IN (SELECT userId FROM user_groupChat WHERE groupChatId = ?)");
+            preparedStatement.setInt(1, groupChatId);
+            resultSet = preparedStatement.executeQuery();
+
+            User user;
+            while(resultSet.next()){
+                user = new User();
+                user.setUserId(resultSet.getInt("userId"));
+                user.setUsername(resultSet.getString("username"));
+                users.add(user);
+            }
+        }catch(SQLException e){
+            e.printStackTrace();
+        }finally{
+            close(connection, preparedStatement, resultSet);
+        }
+        return users;
+    }
+}
diff --git a/src/main/java/dao/OGroupChatDAO.java b/src/main/java/dao/OGroupChatDAO.java
deleted file mode 100644
index aa068eb921b2f79bfa8acf18e9c426c2324c9e75..0000000000000000000000000000000000000000
--- a/src/main/java/dao/OGroupChatDAO.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package dao;
-import data.User;
-import java.util.ArrayList;
-public class GroupChatDAO {
-    //Made so that the rest of the application runs without group chats implemented.
-    public ArrayList<User> getGroupChatUsers(int groupChatId){
-        return null;
-    }
-}