diff --git a/src/client/cmdTemplate/templateList.go b/src/client/cmdTemplate/templateList.go
index 6941a14ce5606ad066e035db5d835f590b0db1a8..d15f07a5577c14426c908063e84d41353b20f41a 100644
--- a/src/client/cmdTemplate/templateList.go
+++ b/src/client/cmdTemplate/templateList.go
@@ -43,13 +43,9 @@ Regex examples:
 	u.PrintlnErr(usage)
 }
 
-func (cmd *List) Run(args []string) int {
-	return cmd.printFilteredTemplates(args, "/templates")
-}
-
-// Prints a list of filtered templates for a given route.
+// Prints a list of filtered templates.
 // Return 0 if everything went well or 1 in case of failure.
-func (cmd *List) printFilteredTemplates(args []string, route string) int {
+func (cmd *List) Run(args []string) int {
 	if len(args) < 1 {
 		cmd.PrintUsage()
 		return 1
@@ -67,7 +63,7 @@ func (cmd *List) printFilteredTemplates(args []string, route string) int {
 		args = u.RemoveArgAtIndex(args, foundLongOutputFlag)
 	}
 
-	templates, err := cmd.getFilteredTemplates(route, args)
+	templates, err := cmd.getFilteredTemplates(args)
 	if err != nil {
 		u.PrintlnErr(err)
 		return 1
@@ -121,7 +117,7 @@ func (cmd *List) printFilteredTemplates(args []string, route string) int {
 //
 //	"."   -> matches everything
 //	"bla" -> matches any template name containing "bla"
-func (cmd *List) getFilteredTemplates(route string, patterns []string) ([]t.TemplateSerialized, error) {
+func (cmd *List) getFilteredTemplates(patterns []string) ([]t.TemplateSerialized, error) {
 	if len(patterns) < 1 {
 		return nil, errors.New("At least one ID or regex must be specified")
 	}
diff --git a/src/client/cmdUser/userList.go b/src/client/cmdUser/userList.go
index 196d19e65f3f6b5b60877dcef46c0f09174f7d75..bc02c9150121f2046b2c322babb451051d2c57fb 100644
--- a/src/client/cmdUser/userList.go
+++ b/src/client/cmdUser/userList.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	u "nexus-client/utils"
 	"nexus-common/params"
-	g "nexus-libclient/globals"
+	libclient "nexus-libclient/user"
 	"regexp"
 	"strings"
 )
@@ -34,10 +34,6 @@ func (cmd *List) PrintUsage() {
 	printRegexUsageDetails()
 }
 
-func (cmd *List) Run(args []string) int {
-	return cmd.printFilteredUsers(args, "/users")
-}
-
 // Prints a list of filtered users for a given route.
 // The filter is based on regexes.
 // Remark: the regex matches the user email, first name and last name and is case-insensitive.
@@ -46,7 +42,7 @@ func (cmd *List) Run(args []string) int {
 //	""    -> matches everything
 //	"."   -> matches everything
 //	"bla" -> matches any user containing "bla"
-func (cmd *List) printFilteredUsers(args []string, route string) int {
+func (cmd *List) Run(args []string) int {
 	if len(args) < 1 {
 		cmd.PrintUsage()
 		return 1
@@ -64,78 +60,64 @@ func (cmd *List) printFilteredUsers(args []string, route string) int {
 		args = u.RemoveArgAtIndex(args, foundLongOutputFlag)
 	}
 
-	client := g.GetInstance().Client
-	host := g.GetInstance().Host
-
-	resp, err := client.R().Get(host + route)
+	users, err := libclient.GetUsers()
 	if err != nil {
-		u.PrintlnErr("Error: " + err.Error())
+		u.PrintlnErr(err)
 		return 1
 	}
 
-	if resp.IsSuccess() {
-		users, err := deserializeUsers(resp)
-		if err != nil {
-			u.PrintlnErr("Error: " + err.Error())
-			return 1
-		}
-
-		userList := []params.UserWithoutPwd{}
-
-		for _, user := range users {
-			for _, regex := range args {
-				fieldsToMatch := user.Email + " " + user.FirstName + " " + user.LastName
-				match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(fieldsToMatch))
-				if err != nil {
-					u.PrintlnErr("Error matching \"" + regex + "\": " + err.Error())
-				} else {
-					if match {
-						userList = append(userList, user)
-						break
-					}
+	userList := []params.UserWithoutPwd{}
+
+	for _, user := range users {
+		for _, regex := range args {
+			fieldsToMatch := user.Email + " " + user.FirstName + " " + user.LastName
+			match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(fieldsToMatch))
+			if err != nil {
+				u.PrintlnErr("Error matching \"" + regex + "\": " + err.Error())
+			} else {
+				if match {
+					userList = append(userList, user)
+					break
 				}
 			}
 		}
+	}
 
-		if len(userList) == 0 {
-			u.PrintlnErr("Error: user(s) not found.")
-			return 1
-		}
+	if len(userList) == 0 {
+		u.PrintlnErr("Error: user(s) not found.")
+		return 1
+	}
 
-		if foundLongOutputFlag >= 0 {
-			for _, user := range userList {
-				u.Println(user.String())
+	if foundLongOutputFlag >= 0 {
+		for _, user := range userList {
+			u.Println(user.String())
+		}
+	} else {
+		// Compute the length of the longest LastName, FirstName and Email (used for padding columns)
+		lastNameLen := 0
+		firstNameLen := 0
+		emailLen := 0
+		for _, user := range userList {
+			l := len(user.LastName)
+			if l > lastNameLen {
+				lastNameLen = l
 			}
-		} else {
-			// Compute the length of the longest LastName, FirstName and Email (used for padding columns)
-			lastNameLen := 0
-			firstNameLen := 0
-			emailLen := 0
-			for _, user := range userList {
-				l := len(user.LastName)
-				if l > lastNameLen {
-					lastNameLen = l
-				}
-				l = len(user.FirstName)
-				if l > firstNameLen {
-					firstNameLen = l
-				}
-				l = len(user.Email)
-				if l > emailLen {
-					emailLen = l
-				}
+			l = len(user.FirstName)
+			if l > firstNameLen {
+				firstNameLen = l
 			}
-
-			paddedFmt := fmt.Sprintf("%%-%ds | %%-%ds | %%-%ds\n", lastNameLen, firstNameLen, emailLen)
-
-			for _, user := range userList {
-				fmt.Printf(paddedFmt, user.LastName, user.FirstName, user.Email)
+			l = len(user.Email)
+			if l > emailLen {
+				emailLen = l
 			}
 		}
 
-		return 0
-	} else {
-		u.PrintlnErr(resp.Status() + ": " + resp.String())
-		return 1
+		paddedFmt := fmt.Sprintf("%%-%ds | %%-%ds | %%-%ds\n", lastNameLen, firstNameLen, emailLen)
+
+		for _, user := range userList {
+			fmt.Printf(paddedFmt, user.LastName, user.FirstName, user.Email)
+		}
 	}
+
+	return 0
 }
diff --git a/src/libclient/user/helper.go b/src/libclient/user/helper.go
new file mode 100644
index 0000000000000000000000000000000000000000..ee90383bbf3ad517fa606bae9f03b3e429202529
--- /dev/null
+++ b/src/libclient/user/helper.go
@@ -0,0 +1,26 @@
+package user
+
+import (
+	"encoding/json"
+	"nexus-common/params"
+
+	"github.com/go-resty/resty/v2"
+)
+
+// Deserialize a list of users from an http response (no filtering).
+func deserializeUsers(resp *resty.Response) ([]params.UserWithoutPwd, error) {
+	users := []params.UserWithoutPwd{}
+	if err := json.Unmarshal(resp.Body(), &users); err != nil {
+		return nil, err
+	}
+	return users, nil
+}
+
+// Deserialize a single user from an http response.
+func deserializeUser(resp *resty.Response) (*params.UserWithoutPwd, error) {
+	var user *params.UserWithoutPwd = &params.UserWithoutPwd{}
+	if err := json.Unmarshal(resp.Body(), &user); err != nil {
+		return user, err
+	}
+	return user, nil
+}
diff --git a/src/libclient/user/userCreate.go b/src/libclient/user/userCreate.go
index c0aba07a040c4eafc3953aff05f5be8159720fe8..a08f047afd50dddfe1b6ed00e8b18e9a29a85cbc 100644
--- a/src/libclient/user/userCreate.go
+++ b/src/libclient/user/userCreate.go
@@ -1,4 +1,4 @@
-package template
+package user
 
 import (
 	"nexus-common/params"
diff --git a/src/libclient/user/userDel.go b/src/libclient/user/userDel.go
index 776ec3a9ce812447e391217686bd1dbf8e452f6d..9aaa78b39c034c79d431a24ef93e65b3423a7871 100644
--- a/src/libclient/user/userDel.go
+++ b/src/libclient/user/userDel.go
@@ -1,4 +1,4 @@
-package template
+package user
 
 import (
 	g "nexus-libclient/globals"
diff --git a/src/libclient/user/userList.go b/src/libclient/user/userList.go
new file mode 100644
index 0000000000000000000000000000000000000000..a15fbf624dc72ca3824d1eac8594f57b037cd830
--- /dev/null
+++ b/src/libclient/user/userList.go
@@ -0,0 +1,48 @@
+package user
+
+import (
+	"nexus-common/params"
+	g "nexus-libclient/globals"
+	"nexus-libclient/response"
+)
+
+func GetUsers() ([]params.UserWithoutPwd, error) {
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
+
+	resp, err := client.R().Get(host + "/users")
+	if err != nil {
+		return nil, err
+	}
+
+	if resp.IsSuccess() {
+		templates, err := deserializeUsers(resp)
+		if err != nil {
+			return nil, err
+		}
+		return templates, nil
+	} else {
+		return nil, response.ErrorToMsg(resp)
+	}
+}
+
+// NOTE: this route is not implemented in the backend yet.
+func GetUser(email string) (*params.UserWithoutPwd, error) {
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
+
+	resp, err := client.R().Get(host + "/users/" + email)
+	if err != nil {
+		return nil, err
+	}
+
+	if resp.IsSuccess() {
+		template, err := deserializeUser(resp)
+		if err != nil {
+			return nil, err
+		}
+		return template, nil
+	} else {
+		return nil, response.ErrorToMsg(resp)
+	}
+}