diff --git a/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt b/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt
index e07443025e676b850163ce70d98d9fd07afdb08f..5ae8a5329bbaa22017cdec6ef974e18d22e0f213 100644
--- a/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt
+++ b/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt
@@ -11,12 +11,12 @@ class TasksRepository {
 
     // Ces deux variables encapsulent la même donnée:
     // [_taskList] est modifiable mais privée donc inaccessible à l'extérieur de cette classe
-    private val _taskList = MutableLiveData<List<Task>>()
+    //private val _taskList = MutableLiveData<List<Task>>()
     // [taskList] est publique mais non-modifiable:
     // On pourra seulement l'observer (s'y abonner) depuis d'autres classes
-    public val taskList: LiveData<List<Task>> = _taskList
+    //public val taskList: LiveData<List<Task>> = _taskList
 
-    suspend fun refresh() {
+    /*suspend fun refresh() {
         // Call HTTP (opération longue):
         val tasksResponse = tasksWebService.getTasks()
         // À la ligne suivante, on a reçu la réponse de l'API:
@@ -47,8 +47,6 @@ class TasksRepository {
     }
 
     suspend fun updateTask(task: Task) {
-        // TODO: do update request and check response
-        // DONE
         val taskResponse = tasksWebService.updateTask(task, task.id)
         if (taskResponse.isSuccessful){
             val editableList = _taskList.value.orEmpty().toMutableList()
@@ -57,5 +55,29 @@ class TasksRepository {
             editableList[position] = updatedTask!!
             _taskList.value = editableList
         }
+    }*/
+
+
+    // Refactoring
+    suspend fun loadTasks() : List<Task>? {
+        // Call HTTP (opération longue):
+        val tasksResponse = tasksWebService.getTasks()
+        // À la ligne suivante, on a reçu la réponse de l'API:
+        return if (tasksResponse.isSuccessful) tasksResponse.body() else null
+    }
+
+    suspend fun deleteTask(task : Task) {
+        val taskResponse = tasksWebService.deleteTask(id = task.id)
+        // return taskResponse.isSuccessful // ???
+    }
+
+    suspend fun addTask(task: Task){
+        val taskResponse = tasksWebService.createTask(task)
+        // return taskResponse.isSuccessful // ???
+    }
+
+    suspend fun updateTask(task: Task) {
+        val taskResponse = tasksWebService.updateTask(task, task.id)
+        // return taskResponse.isSuccessful // ???
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt
index 94e8069fa3c75ff33800e97a18ed9453f98d43fb..e0b6a3e7c1663a4b0a35e7d627c2145c67eb63b1 100644
--- a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt
+++ b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt
@@ -9,8 +9,9 @@ import android.widget.TextView
 import androidx.recyclerview.widget.RecyclerView
 import com.clemhaowen.dm_td2.R
 
-class TaskListAdapter(/*private val*/var taskList: List<Task>) : RecyclerView.Adapter<TaskListAdapter.TaskViewHolder>() {
+class TaskListAdapter(var taskList: List<Task> = emptyList()) : RecyclerView.Adapter<TaskListAdapter.TaskViewHolder>() {
 
+    //var list : List<Task> = emptyList()
     var onDeleteClickListener: ((Task) -> Unit)? = null
     var onEditClickListener: ((Task) -> Unit)? = null
 
diff --git a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt
index 0267a206e3fc6800cab8733dc15043efda98cced..b46cf70d186f4945d13d76e01033f6addc8a047c 100644
--- a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt
+++ b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt
@@ -7,7 +7,9 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.activity.result.contract.ActivityResultContracts
 import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.observe
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -27,14 +29,21 @@ import java.util.*
 class TaskListFragment : Fragment() {
 
     //private var taskList = mutableListOf("Task 1", "Task 2", "Task 3")
-    // TODO uncomment when Task is implemented
-    private val taskList = mutableListOf(
+
+    /*private val taskList = mutableListOf(
         Task(id = "id_1", title = "Task 1", description = "description 1"),
         Task(id = "id_2", title = "Task 2"),
         Task(id = "id_3", title = "Task 3")
-    )
+    )*/
+
+    // Refactoring
+    val taskListAdapter = TaskListAdapter()
+
+    // On récupère une instance de ViewModel
+    private val viewModel: TaskListViewModel by viewModels()
 
-    private val tasksRepository = TasksRepository()
+    // TODO delete this line when refactoring is done.
+    //private val tasksRepository = TasksRepository()
 
     companion object {
         const val ADD_TASK_REQUEST_CODE = 666
@@ -55,15 +64,14 @@ class TaskListFragment : Fragment() {
         // En utilisant les synthetics, on écrit juste l'id directement (c'est magique ✨):
         //R.id.fragment_tasklist_recyclerView.layoutManager = LinearLayoutManager(activity) // ça marche pas
 
-        // TODO uncomment when TaskListAdapter is created
-        // DONE
-        recyclerView?.adapter = TaskListAdapter(taskList)
+        recyclerView?.adapter = taskListAdapter //TaskListAdapter(taskList)
         (recyclerView?.adapter as TaskListAdapter).onDeleteClickListener = { task ->
             // Supprimer la tâche
             //taskList.remove(task)
             //(recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged()
             lifecycleScope.launch {
-                tasksRepository.deleteTask(task)
+                //tasksRepository.deleteTask(task)
+                viewModel.deleteTask(task)
             }
         }
 
@@ -71,15 +79,29 @@ class TaskListFragment : Fragment() {
             val intent = Intent(activity, TaskActivity::class.java)
             intent.putExtra("editTask", task)
             startActivityForResult(intent, EDIT_TASK_REQUEST_CODE)
+            /*val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
+
+            }
+            startForResult.launch(intent)*/
             (recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged()
         }
 
-        tasksRepository.taskList.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
+        // TODO comment this when refactoring is done.
+        /*tasksRepository.taskList.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
             val editableList = (recyclerView?.adapter as TaskListAdapter).taskList.toMutableList()
             editableList.clear()
             editableList.addAll(it)
             (recyclerView?.adapter as TaskListAdapter).taskList = editableList
             (recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged()
+        })*/
+
+        // TODO uncomment this when refactoring is done.
+        viewModel.taskList.observe(viewLifecycleOwner, androidx.lifecycle.Observer { newList ->
+            val editableList = (recyclerView?.adapter as TaskListAdapter).taskList.toMutableList()
+            editableList.clear()
+            editableList.addAll(newList)
+            (recyclerView?.adapter as TaskListAdapter).taskList = newList
+            (recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged()
         })
 
         val createButton = view.findViewById<FloatingActionButton>(R.id.floatingActionButton)
@@ -102,10 +124,12 @@ class TaskListFragment : Fragment() {
         val task = data!!.getSerializableExtra(TaskActivity.TASK_KEY) as Task
         lifecycleScope.launch {
             if (requestCode == ADD_TASK_REQUEST_CODE) {
-                tasksRepository.addTask(task)
+                //tasksRepository.addTask(task)
+                viewModel.addTask(task)
             }
             else if (requestCode == EDIT_TASK_REQUEST_CODE){
-                tasksRepository.updateTask(task)
+                //tasksRepository.updateTask(task)
+                viewModel.editTask(task)
             }
         }
         //taskList.add(task)
@@ -118,14 +142,16 @@ class TaskListFragment : Fragment() {
             crossfade(true)
             transformations(CircleCropTransformation())
         }
-        /*lifecycleScope.launch {
-            tasksRepository.refresh()
-        }*/
         lifecycleScope.launch {
             val userInfo = Api.userService.getInfo().body()!!
             val textView = view?.findViewById<TextView>(R.id.textViewInfo)
             textView?.text = "${userInfo.firstName} ${userInfo.lastName}"
-            tasksRepository.refresh()
+
+            // TODO comment this when refactoring is done.
+            //tasksRepository.refresh()
+
+            // TODO uncomment this when refactoring is done.
+            viewModel.loadTasks()
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListViewModel.kt b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListViewModel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c47b275e936627282a12978f146be9dfb2d34fe7
--- /dev/null
+++ b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListViewModel.kt
@@ -0,0 +1,46 @@
+package com.clemhaowen.dm_td2.tasklist
+
+import androidx.lifecycle.*
+import com.clemhaowen.dm_td2.network.TasksRepository
+import kotlinx.coroutines.launch
+
+class TaskListViewModel : ViewModel() {
+    private val repository = TasksRepository()
+    private val _taskList = MutableLiveData<List<Task>>()
+    val taskList: LiveData<List<Task>> = _taskList
+
+    fun loadTasks() {
+        viewModelScope.launch {
+            _taskList.value = repository.loadTasks()!!
+        }
+    }
+
+    fun deleteTask(task: Task) {
+        viewModelScope.launch {
+            repository.deleteTask(task)
+        }
+        val editableList = _taskList.value.orEmpty().toMutableList()
+        val position = editableList.indexOfFirst { task.id == it.id }
+        editableList.removeAt(position)
+        _taskList.value = editableList
+    }
+
+    fun addTask(task: Task) {
+        viewModelScope.launch {
+            repository.addTask(task)
+        }
+        val editableList = _taskList.value.orEmpty().toMutableList()
+        editableList.add(task)
+        _taskList.value = editableList
+    }
+
+    fun editTask(task: Task) {
+        viewModelScope.launch {
+            repository.updateTask(task)
+        }
+        val editableList = _taskList.value.orEmpty().toMutableList()
+        val position = editableList.indexOfFirst { task.id == it.id }
+        editableList[position] = task
+        _taskList.value = editableList
+    }
+}
\ No newline at end of file