diff --git a/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java b/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java
index ffbca27b868807ce98d7fc2ef74ebb7ab41c2904..2cbdb7628c4b3e32fb247214b029706ca572aecf 100644
--- a/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java
+++ b/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java
@@ -26,6 +26,7 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import net.jami.datastore.main.DataStore;
+import net.jami.jams.common.dao.DeleteStatementBuilder;
 import net.jami.jams.common.dao.SelectStatementBuilder;
 import net.jami.jams.common.dao.StatementList;
 import net.jami.jams.common.dao.UpdateStatementBuilder;
@@ -46,7 +47,6 @@ public abstract class AbstractDao<T> {
     private Class<T> tClass;
 
     public abstract boolean storeObject(T object);
-    public abstract boolean deleteObject(LinkedHashMap<String,String> constraints);
 
     public List<T> getObjects(StatementList constraints){
         List<T> result = new ArrayList<>();
@@ -82,4 +82,20 @@ public abstract class AbstractDao<T> {
             DataStore.connectionPool.returnConnection(connection);
         }
     }
+
+    public boolean deleteObject(StatementList delete){
+        SQLConnection connection = DataStore.connectionPool.getConnection();
+        try{
+            PreparedStatement ps = DeleteStatementBuilder.buildStatement(tableName,delete,connection);
+            return ps.execute();
+        }
+        catch (Exception e){
+            log.error("An error has occurred while trying to fetch a device: " + e.toString());
+            return false;
+        }
+        finally {
+            DataStore.connectionPool.returnConnection(connection);
+        }
+    }
+
 }
diff --git a/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java b/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java
index 1e33d86b870963fd13319a7f4ef1047d97fceb23..db920678d72eaf722ebcd9361684fe906c5aabe6 100644
--- a/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java
+++ b/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java
@@ -22,25 +22,43 @@
 */
 package net.jami.datastore.dao;
 
+import lombok.extern.slf4j.Slf4j;
+import net.jami.datastore.main.DataStore;
 import net.jami.jams.common.dao.StatementList;
+import net.jami.jams.common.dao.connectivity.SQLConnection;
 import net.jami.jams.common.objects.contacts.Contact;
+import net.jami.jams.common.objects.devices.Device;
 
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
 import java.util.LinkedHashMap;
 
+@Slf4j
 public class ContactDao extends AbstractDao<Contact> {
 
-    @Override
-    public boolean storeObject(Contact object) {
-        return false;
-    }
-
-    @Override
-    public boolean deleteObject(LinkedHashMap<String, String> constraints) {
-        return false;
+    public ContactDao() {
+        SQLConnection connection = DataStore.connectionPool.getConnection();
+        try {
+            this.setTableName("contacts");
+            this.setTClass(Contact.class);
+            String createTable = "CREATE TABLE contacts (" +
+                "owner varchar(255), " +
+                "contact varchar(255)," +
+                "displayName varchar(255),"+
+                "PRIMARY KEY (owner,contact))";
+            PreparedStatement ps = connection.getConnection().prepareStatement(createTable);
+            ps.execute();
+        }
+        catch (SQLException e){
+            log.error("Could not create the contacts table with error " + e.getMessage());
+        }
+        finally {
+            DataStore.connectionPool.returnConnection(connection);
+        }
     }
 
     @Override
-    public boolean updateObject(StatementList update, StatementList constraints) {
+    public boolean storeObject(Contact object) {
         return false;
     }
 }
diff --git a/datastore/src/main/java/net/jami/datastore/dao/UserProfileDAO.java b/datastore/src/main/java/net/jami/datastore/dao/UserProfileDao.java
similarity index 96%
rename from datastore/src/main/java/net/jami/datastore/dao/UserProfileDAO.java
rename to datastore/src/main/java/net/jami/datastore/dao/UserProfileDao.java
index 1f1d4096fde5916969f9a52fb243c8ca9231d854..f049b9975686f401db2897865049708eb9aa5c02 100644
--- a/datastore/src/main/java/net/jami/datastore/dao/UserProfileDAO.java
+++ b/datastore/src/main/java/net/jami/datastore/dao/UserProfileDao.java
@@ -32,10 +32,10 @@ import java.sql.SQLException;
 import java.util.LinkedHashMap;
 
 @Slf4j
-public class UserProfileDAO extends AbstractDao<UserProfile> {
+public class UserProfileDao extends AbstractDao<UserProfile> {
 
     //Fis this to include the fields from AD/LDAP.
-    public UserProfileDAO() {
+    public UserProfileDao() {
         SQLConnection connection = DataStore.connectionPool.getConnection();
         try {
             this.setTableName("local_directory");
diff --git a/datastore/src/main/java/net/jami/datastore/main/DataStore.java b/datastore/src/main/java/net/jami/datastore/main/DataStore.java
index 41ed66eefbed2b3d301b0ed153d381eab663ba7f..852cdaeafea5f50450e8183b5342a1c0decf2418 100644
--- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java
+++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java
@@ -24,6 +24,7 @@ package net.jami.datastore.main;
 
 import lombok.Getter;
 import lombok.Setter;
+import net.jami.datastore.dao.ContactDao;
 import net.jami.datastore.dao.DeviceDao;
 import net.jami.datastore.dao.SystemDao;
 import net.jami.datastore.dao.UserDao;
@@ -46,6 +47,7 @@ public class DataStore implements AuthenticationSource {
     private UserDao userDao;
     private DeviceDao deviceDao;
     private SystemDao systemDao;
+    private ContactDao contactDao;
 
     //Implicitly connect to debry.
     public DataStore(String connectionString) {
@@ -53,6 +55,7 @@ public class DataStore implements AuthenticationSource {
         userDao = new UserDao();
         deviceDao = new DeviceDao();
         systemDao = new SystemDao();
+        contactDao = new ContactDao();
     }
 
     public boolean userExists(String username){
diff --git a/jams-common/src/main/java/net/jami/jams/common/dao/DeleteStatementBuilder.java b/jams-common/src/main/java/net/jami/jams/common/dao/DeleteStatementBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..26e495e69e710f440e76b1514510821caab1c018
--- /dev/null
+++ b/jams-common/src/main/java/net/jami/jams/common/dao/DeleteStatementBuilder.java
@@ -0,0 +1,38 @@
+package net.jami.jams.common.dao;
+
+import net.jami.jams.common.dao.connectivity.SQLConnection;
+
+import java.sql.PreparedStatement;
+
+public class DeleteStatementBuilder {
+
+    public static PreparedStatement buildStatement(String table, StatementList statementElements,
+                                                   SQLConnection connection) throws Exception {
+        PreparedStatement ps = null;
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("DELETE FROM ").append(table);
+        if(statementElements != null) {
+            stringBuilder.append(" WHERE ");
+            for (StatementElement statementElement : statementElements.getStatements()) {
+                stringBuilder
+                    .append(statementElement.getColumn())
+                    .append(" ")
+                    .append(statementElement.getOperator())
+                    .append(" ")
+                    .append("?")
+                    .append(" ")
+                    .append(statementElement.getNextStatementRelation());
+            }
+            ps = connection.getConnection().prepareStatement(stringBuilder.toString());
+            int i = 1;
+            for (StatementElement statementElement : statementElements.getStatements()) {
+                ps.setString(i, statementElement.getValue());
+                i++;
+            }
+        }
+        else{
+            ps = connection.getConnection().prepareStatement(stringBuilder.toString());
+        }
+        return ps;
+    }
+}
diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java b/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java
index 2804fd9605299b4dbd70e598aaf4c8e4388388a2..dfcf11b391b0b0dcc43ead99a63f88183f40affa 100644
--- a/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java
+++ b/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java
@@ -22,10 +22,46 @@
 */
 package net.jami.jams.common.objects.contacts;
 
+import com.jsoniter.annotation.JsonIgnore;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
+import net.jami.jams.common.serialization.database.DatabaseObject;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 
 @Getter
 @Setter
-public class Contact {
+@NoArgsConstructor
+public class Contact implements DatabaseObject {
+
+    @JsonIgnore //Ignore the owner because he is irrelevant.
+    private String owner;
+    private String uri;
+    private String displayName;
+
+    public Contact(ResultSet rs) throws Exception {
+        this.owner = rs.getString("owner");
+        this.uri = rs.getString("uri");
+        this.displayName = rs.getString("displayName");
+    }
+
+    @Override
+    public PreparedStatement getInsert(PreparedStatement ps) throws Exception {
+        ps.setString(1,owner);
+        ps.setString(2,uri);
+        ps.setString(3,displayName);
+        return ps;
+    }
+
+    @Override
+    public PreparedStatement getDelete(PreparedStatement ps) throws Exception {
+        return null;
+    }
+
+    @Override
+    public PreparedStatement getUpdate(PreparedStatement ps) throws Exception {
+        return null;
+    }
 }
diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java b/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java
index 2198d8cac27346ea957e9460e74004d02eedf541..eeb2e87b0ffc67bc156307112a313c01f7a7881b 100644
--- a/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java
+++ b/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java
@@ -23,9 +23,9 @@
 package net.jami.jams.common.serialization.database;
 
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 
 public interface DatabaseObject {
-
     PreparedStatement getInsert(PreparedStatement ps) throws Exception;
     PreparedStatement getDelete(PreparedStatement ps) throws Exception;
     PreparedStatement getUpdate(PreparedStatement ps) throws Exception;
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java
index 9b0626fde9b5bb026e0ac1caa672ac7128dfb703..c5d1130d888ea8a753ca19b266cda517358d2f4b 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java
@@ -22,28 +22,48 @@
 */
 package net.jami.jams.server.servlets.api.auth.contacts;
 
+import com.jsoniter.JsonIterator;
+import com.jsoniter.output.JsonStream;
+import net.jami.datastore.dao.ContactDao;
+import net.jami.jams.common.dao.StatementElement;
+import net.jami.jams.common.dao.StatementList;
+import net.jami.jams.common.objects.contacts.Contact;
+
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.List;
+
+import static net.jami.jams.server.Server.dataStore;
 
 @WebServlet("/api/auth/contacts")
 public class ContactServlet extends HttpServlet {
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-        super.doGet(req, resp);
+        StatementList statementList = new StatementList();
+        statementList.addStatement(new StatementElement("owner","=",req.getAttribute("username").toString(),""));
+        List<Contact> contactList = dataStore.getContactDao().getObjects(statementList);
+        resp.getOutputStream().write(JsonStream.serialize(contactList).getBytes());
     }
 
     @Override
     protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-        super.doPut(req, resp);
+        Contact contact = JsonIterator.deserialize(req.getInputStream().readAllBytes(),Contact.class);
+        contact.setOwner(req.getAttribute("username").toString());
+        if(dataStore.getContactDao().storeObject(contact)) resp.setStatus(200);
+        else resp.sendError(500,"Could not store device!");
     }
 
+    //TODO: Because deleting requires sending the URI in the body, didn't want to do this now.
     @Override
     protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-        super.doDelete(req, resp);
+        StatementList statementList = new StatementList();
+        statementList.addStatement(new StatementElement("owner","=",req.getAttribute("username").toString(),"AND"));
+        //if(dataStore.getContactDao().deleteObject()) resp.setStatus(200);
+        //else resp.sendError(500,"Could not delete a contact!");
     }
 }