diff --git a/todo.go b/todo.go
index 78e1b046eeb0876fdf0c807fa60a208f7076bac8..438d84ac6ef446b137d1a0f8dba9523964dee41f 100644
--- a/todo.go
+++ b/todo.go
@@ -47,6 +47,16 @@ type Database struct {
     Db *sql.DB
 }
 
+
+func getURLParameter(path string) *string {
+    param := strings.Split(path, "/")
+    if len(param) == 3 {
+        return &param[2]
+    } else {
+        return nil
+    }
+}
+
 func getLists(db *sql.DB) []List {
     rows, err := db.Query("select * from list")
     CheckFatal(err)
@@ -63,10 +73,65 @@ func getLists(db *sql.DB) []List {
     return res
 }
 
+func getTasks(db *sql.DB, listId int) []Task {
+    // Query the database for all tasks that references the specified list
+    rows, err := db.Query("select * from task where list=$1", listId)
+    CheckFatal(err)
+
+    // Retrieve all tasks from the query
+    res := make([]Task, 0)
+    for rows.Next() {
+        var name string
+        var id, list int
+        var done bool
+        err := rows.Scan(&id, &name, &done, &list)
+        CheckFatal(err)
+        res = append(res, Task{Id: id, Name: name, Done: done, ListId: list})
+    }
+
+    return res
+}
+
+func insertTask(db *sql.DB, taskName string, listId int) {
+    _, err := db.Exec("insert into task (name, list) values ($1, $2)", taskName, listId)
+    // Handle non-existing list id
+    CheckFatal(err)
+}
+
 func (db *Database) listHandler(w http.ResponseWriter, r *http.Request) {
-    // Retrieve lists
-    list := getLists(db.Db)
-    json.NewEncoder(w).Encode(&list)
+    if r.Method == "GET" {
+        // Handle GET Request
+        param := getURLParameter(r.URL.Path)
+
+        // If no parameter exists, retrieve all lists
+        if param == nil || *param == "" {
+            // Retrieve lists
+            list := getLists(db.Db)
+            json.NewEncoder(w).Encode(&list)
+        } else {
+            // Get the list id from the parameter
+            listId, err := strconv.Atoi(*param)
+            CheckFatal(err)
+
+            // Retrieve tasks and send them back
+            tasks := getTasks(db.Db, listId)
+            json.NewEncoder(w).Encode(&tasks)
+        }
+    }
+}
+
+func (db *Database) taskHandler(w http.ResponseWriter, r *http.Request) {
+    if r.Method == "POST" {
+        body, err := ioutil.ReadAll(r.Body)
+        CheckFatal(err)
+        taskRequest := CreateTaskRequest{}
+        err = json.Unmarshal(body, &taskRequest)
+        CheckFatal(err)
+
+        insertTask(db.Db, taskRequest.Name, taskRequest.ListId)
+
+        fmt.Fprintf(w, "OK")
+    }
 }
 
 func ConnectDb() *sql.DB {
@@ -80,6 +145,8 @@ func Handlers() *http.ServeMux {
     db := Database{Db: ConnectDb()}
     mux := http.NewServeMux()
     mux.Handle("/list", http.HandlerFunc(db.listHandler))
+    mux.Handle("/list/", http.HandlerFunc(db.listHandler))
+    mux.Handle("/task", http.HandlerFunc(db.taskHandler))
     return mux
 }