diff --git a/src/client_cli/cmdTemplate/helper.go b/src/client_cli/cmdTemplate/helper.go
index 1995b224eefab28fe54a645c6cafe01f424a233b..422db600e92e0634e736d36c0565d95b5704dd01 100644
--- a/src/client_cli/cmdTemplate/helper.go
+++ b/src/client_cli/cmdTemplate/helper.go
@@ -43,8 +43,9 @@ Regex examples:
 	u.PrintlnErr(usage)
 }
 
-// Call the given route and filter the results based on ID and regex.
-// Arguments (args) can either be:
+// Returns a list of filtered templates for a given route.
+// The filter is based on the specified IDs and regexes.
+// The filters argument can either be:
 // - any number of "template IDs" (UUID)
 // - any number of "template names"
 // - any combination of "template IDs" and "template names"
@@ -54,25 +55,24 @@ Regex examples:
 //   ""    -> matches everything
 //   "."   -> matches everything
 //   "bla" -> matches any template name containing "bla"
-func getFilteredTemplates(c cmd.Command, args []string, route string) int {
+func printFilteredTemplates(c cmd.Command, filters []string, route string) int {
 	client := g.GetInstance().Client
 	host := g.GetInstance().Host
 
-	argc := len(args)
-	if argc < 1 {
+	if len(filters) < 1 {
 		c.PrintUsage()
 		return 1
 	}
 
 	var ids []string
-	var namePatterns []string
+	var regexes []string
 
-	for _, arg := range args {
-		_, err := uuid.Parse(arg)
+	for _, filter := range filters {
+		_, err := uuid.Parse(filter)
 		if err != nil {
-			namePatterns = append(namePatterns, arg)
+			regexes = append(regexes, filter)
 		} else {
-			ids = append(ids, arg)
+			ids = append(ids, filter)
 		}
 	}
 
@@ -89,7 +89,7 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int {
 			return 1
 		}
 
-		for _, template := range *templates {
+		for _, template := range templates {
 			found := false
 			for _, id := range ids {
 				if id == template.ID.String() {
@@ -101,10 +101,10 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int {
 			if found {
 				continue
 			}
-			for _, namePattern := range namePatterns {
-				match, err := regexp.MatchString(strings.ToLower(namePattern), strings.ToLower(template.Name))
+			for _, regex := range regexes {
+				match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(template.Name))
 				if err != nil {
-					u.PrintlnErr("Error matching \""+namePattern+"\": "+err.Error())
+					u.PrintlnErr("Error matching \""+regex+"\": "+err.Error())
 				} else {
 					if match {
 						u.Println(template.String())
@@ -120,10 +120,10 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int {
 	}
 }
 
-func getTemplates(resp *resty.Response) (*[]Template, error) {
-	var templates []Template
+func getTemplates(resp *resty.Response) ([]Template, error) {
+	templates := []Template{}
 	if err := json.Unmarshal(resp.Body(), &templates); err != nil {
 		return nil, err
 	}
-	return &templates, nil
+	return templates, nil
 }
\ No newline at end of file
diff --git a/src/client_cli/cmdTemplate/templateList.go b/src/client_cli/cmdTemplate/templateList.go
index a258e028f258fdbf6958b1bc93ae89ceffb2e3c5..455afa3c015e25668a7332d115ac82aadf5be900 100644
--- a/src/client_cli/cmdTemplate/templateList.go
+++ b/src/client_cli/cmdTemplate/templateList.go
@@ -17,5 +17,5 @@ func (cmd *List)PrintUsage() {
 }
 
 func (cmd *List)Run(args []string) int {
-	return getFilteredTemplates(cmd, args, "/templates")
+	return printFilteredTemplates(cmd, args, "/templates")
 }
diff --git a/src/client_cli/cmdUser/helper.go b/src/client_cli/cmdUser/helper.go
index ad36e0dd47fd629fc93375e4a043c38261f6b91f..118b54d638869d0f33d321d54c650df55761a544 100644
--- a/src/client_cli/cmdUser/helper.go
+++ b/src/client_cli/cmdUser/helper.go
@@ -45,18 +45,18 @@ Regex examples:
 	u.PrintlnErr(usage)
 }
 
-// Call the given route and filter the results based on a regex.
+// 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.
 // Regular expression examples:
 //   ""    -> matches everything
 //   "."   -> matches everything
 //   "bla" -> matches any user containing "bla"
-func getFilteredUsers(c cmd.Command, args []string, route string) int {
+func printFilteredUsers(c cmd.Command, regexes []string, route string) int {
 	client := g.GetInstance().Client
 	host := g.GetInstance().Host
 
-	argc := len(args)
-	if argc < 1 {
+	if len(regexes) < 1 {
 		c.PrintUsage()
 		return 1
 	}
@@ -74,12 +74,12 @@ func getFilteredUsers(c cmd.Command, args []string, route string) int {
 			return 1
 		}
 
-		for _, user := range *users {
-			for _, pattern := range args {
+		for _, user := range users {
+			for _, regex := range regexes {
 				fieldsToMatch := user.Email+" "+user.FirstName+" "+user.LastName
-				match, err := regexp.MatchString(strings.ToLower(pattern), strings.ToLower(fieldsToMatch))
+				match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(fieldsToMatch))
 				if err != nil {
-					u.PrintlnErr("Error matching \""+pattern+"\": "+err.Error())
+					u.PrintlnErr("Error matching \""+regex+"\": "+err.Error())
 				} else {
 					if match {
 						u.Println(user.String())
@@ -95,10 +95,10 @@ func getFilteredUsers(c cmd.Command, args []string, route string) int {
 	}
 }
 
-func getUsers(resp *resty.Response) (*[]User, error) {
-	var users []User
+func getUsers(resp *resty.Response) ([]User, error) {
+	users := []User{}
 	if err := json.Unmarshal(resp.Body(), &users); err != nil {
 		return nil, err
 	}
-	return &users, nil
+	return users, nil
 }
\ No newline at end of file
diff --git a/src/client_cli/cmdUser/userList.go b/src/client_cli/cmdUser/userList.go
index 8adbf62ab45038542038e4770da6219eaf417103..55902fa8add3e051c33dad794a817fc134d03aa6 100644
--- a/src/client_cli/cmdUser/userList.go
+++ b/src/client_cli/cmdUser/userList.go
@@ -17,5 +17,5 @@ func (cmd *List)PrintUsage() {
 }
 
 func (cmd *List)Run(args []string) int {
-	return getFilteredUsers(cmd, args, "/users")
+	return printFilteredUsers(cmd, args, "/users")
 }
diff --git a/src/client_cli/cmdVM/helper.go b/src/client_cli/cmdVM/helper.go
index 06f6f06b92fd71a27133546244aa61503607b684..48793cc04c65eda8ea552a8fb0d97487fd67ede7 100644
--- a/src/client_cli/cmdVM/helper.go
+++ b/src/client_cli/cmdVM/helper.go
@@ -1,8 +1,9 @@
 package cmdVM
 
 import (
-	"strings"
 	"regexp"
+	"errors"
+	"strings"
 	"encoding/json"
 	"nexus-client/cmd"
 	u "nexus-client/utils"
@@ -51,11 +52,11 @@ func (vm *VM)String() string {
 	return string(output)
 }
 
-func printUsage(c cmd.Command) {
+func printUsage(c cmd.Command, action string) {
 	u.PrintlnErr(c.GetDesc())
 	u.PrintlnErr("Usage: ",c.GetName()," [ID ...] [regex ...]")
-	const usage string = `Only VMs matching the specified IDs or regexes will be listed.
-Any number of IDs or regexes can be specified.
+	u.PrintlnErr("Only VMs matching the specified IDs or regexes will be "+action+".")
+	const usage string = `Any number of IDs or regexes can be specified.
 The regex only matches the VM's name and is case-insensitive.
 Regex examples:
     ""    -> matches any VMs
@@ -64,8 +65,30 @@ Regex examples:
 	u.PrintlnErr(usage)
 }
 
-// Call the given route and filter the results based on ID and regex.
-// Arguments (args) can either be:
+// Prints a list of filtered VMs for a given route.
+// Return 0 if everything went well or 1 in case of failure.
+func printFilteredVMs(c cmd.Command, args []string, route string) int {
+	if len(args) < 1 {
+		c.PrintUsage()
+		return 1
+	}
+
+	vms, err := getFilteredVMs(route, args)
+	if err != nil {
+		u.PrintlnErr("Error: "+err.Error())
+		return 1
+	}
+
+	for _, vm := range vms {
+		u.Println(vm.String())
+	}
+
+	return 0
+}
+
+// Returns a list of filtered VMs for a given route.
+// The filter is based on the specified IDs and regexes.
+// The filters argument can either be:
 // - any number of "VM IDs" (UUID)
 // - any number of "VM names"
 // - any combination of "VM IDs" and "VM names"
@@ -75,46 +98,45 @@ Regex examples:
 //   ""    -> matches everything
 //   "."   -> matches everything
 //   "bla" -> matches any VM name containing "bla"
-func getFilteredVMs(c cmd.Command, args []string, route string) int {
+func getFilteredVMs(route string, filters []string) ([]VM, error) {
 	client := g.GetInstance().Client
 	host := g.GetInstance().Host
 
-	argc := len(args)
-	if argc < 1 {
-		c.PrintUsage()
-		return 1
-	}
-
 	var ids []string
-	var namePatterns []string
+	var regexes []string
 
-	for _, arg := range args {
-		_, err := uuid.Parse(arg)
+	for _, filter := range filters {
+		_, err := uuid.Parse(filter)
 		if err != nil {
-			namePatterns = append(namePatterns, arg)
+			regexes = append(regexes, filter)
 		} else {
-			ids = append(ids, arg)
+			ids = append(ids, filter)
 		}
 	}
 
 	resp, err := client.R().Get(host+route)
 	if err != nil {
-		u.PrintlnErr("Error: "+err.Error())
-		return 1
+		//u.PrintlnErr("Error: "+err.Error())
+		//return 1
+		return nil, err
 	}
 
+	vmsList := []VM{}
+
 	if resp.IsSuccess() {
 		vms, err := getVMs(resp)
 		if err != nil {
-			u.PrintlnErr("Error: "+err.Error())
-			return 1
+			//u.PrintlnErr("Error: "+err.Error())
+			//return 1
+			return nil, err
 		}
 
-		for _, vm := range *vms {
+		for _, vm := range vms {
 			found := false
 			for _, id := range ids {
 				if id == vm.ID.String() {
-					u.Println(vm.String())
+					vmsList = append(vmsList, vm)
+					//u.Println(vm.String())
 					found = true
 					break
 				}
@@ -122,29 +144,33 @@ func getFilteredVMs(c cmd.Command, args []string, route string) int {
 			if found {
 				continue
 			}
-			for _, namePattern := range namePatterns {
-				match, err := regexp.MatchString(strings.ToLower(namePattern), strings.ToLower(vm.Name))
+			for _, regex := range regexes {
+				match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(vm.Name))
 				if err != nil {
-					u.PrintlnErr("Error matching \""+namePattern+"\": "+err.Error())
+					//u.PrintlnErr("Error matching \""+regex+"\": "+err.Error())
+					return nil, errors.New("Error matching \""+regex+"\": "+err.Error())
 				} else {
 					if match {
-						u.Println(vm.String())
+						//u.Println(vm.String())
+						vmsList = append(vmsList, vm)
 						break
 					}
 				}
 			}
 		}
-		return 0
+		return vmsList, nil
 	} else {
-		u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
-		return 1
+		return nil, errors.New("Error: "+resp.Status()+": "+resp.String())
+		//u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
+		//return 1
 	}
 }
 
-func getVMs(resp *resty.Response) (*[]VM, error) {
-	var vms []VM
+// Retrieves all VMs (no filtering).
+func getVMs(resp *resty.Response) ([]VM, error) {
+	vms := []VM{}
 	if err := json.Unmarshal(resp.Body(), &vms); err != nil {
 		return nil, err
 	}
-	return &vms, nil
+	return vms, nil
 }
\ No newline at end of file
diff --git a/src/client_cli/cmdVM/vmAttach.go b/src/client_cli/cmdVM/vmAttach.go
index f2e70394475e92a8b0211208e14981cfaa672c68..d9c7708a659732ee43d7669df70b566ab77db379 100644
--- a/src/client_cli/cmdVM/vmAttach.go
+++ b/src/client_cli/cmdVM/vmAttach.go
@@ -21,7 +21,7 @@ func (cmd *Attach)GetName() string {
 }
  
 func (cmd *Attach)GetDesc() string {
-	return "Attach to a VM in order to see its desktop"
+	return "Attach to a VM in order to use its desktop environment"
 }
 
 func (cmd *Attach)PrintUsage() {
diff --git a/src/client_cli/cmdVM/vmCreate.go b/src/client_cli/cmdVM/vmCreate.go
index 851b698acae0e65920755b31922f095452d8d704..203aa38f909746d35d708625b600d5254e5c42ae 100644
--- a/src/client_cli/cmdVM/vmCreate.go
+++ b/src/client_cli/cmdVM/vmCreate.go
@@ -84,7 +84,7 @@ func (cmd *Create)Run(args []string) int {
 		TemplateID: template,
 	}
 
-	errors := false
+	statusCode := 0
 
 	for i := 1; i <= count; i++ {
 		if count > 1 {
@@ -94,20 +94,16 @@ func (cmd *Create)Run(args []string) int {
 		resp, err := client.R().SetBody(vmArgs).Post(host+"/vms")
 		if err != nil {
 			u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+err.Error())
-			errors = true
+			statusCode = 1
 		} else {
 			if resp.IsSuccess() {
-				u.Println("Successfully created VM \""+vmArgs.Name+"\"")
+				u.Println("Created VM \""+vmArgs.Name+"\"")
 			} else {
 				u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+resp.Status()+": "+resp.String())
-				errors = true
+				statusCode = 1
 			}
 		}
 	}
 
-	if errors {
-		return 1
-	} else {
-		return 0
-	}
+	return statusCode
 }
diff --git a/src/client_cli/cmdVM/vmDel.go b/src/client_cli/cmdVM/vmDel.go
index c9eedcfa1501b50f35fd1595e879b959e501f5b9..ae4ba723259a7dc87312e37b359910a7ed967c66 100644
--- a/src/client_cli/cmdVM/vmDel.go
+++ b/src/client_cli/cmdVM/vmDel.go
@@ -14,12 +14,11 @@ func (cmd *Del)GetName() string {
 }
  
 func (cmd *Del)GetDesc() string {
-	return "Delete one or more VMs"
+	return "Delete one or more VMs."
 }
 
 func (cmd *Del)PrintUsage() {
-	u.PrintlnErr(cmd.GetDesc())
-	u.PrintlnErr("Usage: "+cmd.Name+" vmID [vmID ...]")
+	printUsage(cmd, "deleted")
 }
 
 func (cmd *Del)Run(args []string) int {
@@ -32,23 +31,30 @@ func (cmd *Del)Run(args []string) int {
 		return 1
 	}
 
+	vms, err := getFilteredVMs("/vms/del", args)
+	if err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
+
 	statusCode := 0
 
-	// Iterates through each uuid to delete
-	for i:= range(args) {
-		uuid := args[i]
+	for _, vm := range(vms) {
+		uuid := vm.ID.String()
 		resp, err := client.R().Delete(host+"/vms/"+uuid)
 		if err != nil {
-			u.PrintlnErr("Error: "+err.Error())
+			u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
 			statusCode = 1
 		} else {
 			if resp.IsSuccess() {
-				u.Println("VM "+uuid+" deleted.")
+				u.Println("Deleted VM \""+vm.Name+"\" ("+uuid+")")
 			} else {
-				u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
+				u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
 				statusCode = 1
 			}
 		}
+
 	}
+
 	return statusCode
 }
diff --git a/src/client_cli/cmdVM/vmList.go b/src/client_cli/cmdVM/vmList.go
index c0690118e4973448f2f961f349dfc69f5491b769..844604b0993fa166534e599d902c70757b3edf92 100644
--- a/src/client_cli/cmdVM/vmList.go
+++ b/src/client_cli/cmdVM/vmList.go
@@ -13,9 +13,9 @@ func (cmd *List)GetDesc() string {
 }
 
 func (cmd *List)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *List)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms")
+	return printFilteredVMs(cmd, args, "/vms")
 }
diff --git a/src/client_cli/cmdVM/vmListAttach.go b/src/client_cli/cmdVM/vmListAttach.go
index c10ccfcb1a9cffe5aa0bf80b6344a9c26e73b42d..e8fb3e98bddcc26b16bfbb0ac74f85e6d1d984b3 100644
--- a/src/client_cli/cmdVM/vmListAttach.go
+++ b/src/client_cli/cmdVM/vmListAttach.go
@@ -13,9 +13,9 @@ func (cmd *ListAttach)GetDesc() string {
 }
 
 func (cmd *ListAttach)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *ListAttach)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms/attach")
+	return printFilteredVMs(cmd, args, "/vms/attach")
 }
diff --git a/src/client_cli/cmdVM/vmListDel.go b/src/client_cli/cmdVM/vmListDel.go
index 7701bac75a73e548d525762cd0aa2c77846db7dd..864604704c6b9d0e7f1798d218178854bbd15aad 100644
--- a/src/client_cli/cmdVM/vmListDel.go
+++ b/src/client_cli/cmdVM/vmListDel.go
@@ -13,9 +13,9 @@ func (cmd *ListDel)GetDesc() string {
 }
 
 func (cmd *ListDel)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *ListDel)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms/del")
+	return printFilteredVMs(cmd, args, "/vms/del")
 }
diff --git a/src/client_cli/cmdVM/vmListEdit.go b/src/client_cli/cmdVM/vmListEdit.go
index 47b3356692cc41919cc6a95c656602b40e8f7a67..ca022463267781c1fef5224a41afbe99e6cc684d 100644
--- a/src/client_cli/cmdVM/vmListEdit.go
+++ b/src/client_cli/cmdVM/vmListEdit.go
@@ -13,9 +13,9 @@ func (cmd *ListEdit)GetDesc() string {
 }
 
 func (cmd *ListEdit)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *ListEdit)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms/edit")
+	return printFilteredVMs(cmd, args, "/vms/edit")
 }
diff --git a/src/client_cli/cmdVM/vmListEditAccess.go b/src/client_cli/cmdVM/vmListEditAccess.go
index d8fa17daecf020ecb230ef5585e66c124c4c1b11..2d9789199d3559cfdf833a115f6b3623b9b90168 100644
--- a/src/client_cli/cmdVM/vmListEditAccess.go
+++ b/src/client_cli/cmdVM/vmListEditAccess.go
@@ -13,9 +13,9 @@ func (cmd *ListEditAccess)GetDesc() string {
 }
 
 func (cmd *ListEditAccess)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *ListEditAccess)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms/editaccess")
+	return printFilteredVMs(cmd, args, "/vms/editaccess")
 }
diff --git a/src/client_cli/cmdVM/vmListStart.go b/src/client_cli/cmdVM/vmListStart.go
index 66a486b7194b72c2eced633d69546b04517a0690..70a7daa648cee87f5881b76932ba38994f909bd9 100644
--- a/src/client_cli/cmdVM/vmListStart.go
+++ b/src/client_cli/cmdVM/vmListStart.go
@@ -13,9 +13,9 @@ func (cmd *ListStart)GetDesc() string {
 }
 
 func (cmd *ListStart)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *ListStart)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms/start")
+	return printFilteredVMs(cmd, args, "/vms/start")
 }
diff --git a/src/client_cli/cmdVM/vmListStop.go b/src/client_cli/cmdVM/vmListStop.go
index e7e8a2e1b172037d39cabd29807aa78bec1c1c52..19b473d553ee5a386d540c8e5fcb521b53dc7624 100644
--- a/src/client_cli/cmdVM/vmListStop.go
+++ b/src/client_cli/cmdVM/vmListStop.go
@@ -13,9 +13,9 @@ func (cmd *ListStop)GetDesc() string {
 }
 
 func (cmd *ListStop)PrintUsage() {
-	printUsage(cmd)
+	printUsage(cmd, "listed")
 }
 
 func (cmd *ListStop)Run(args []string) int {
-	return getFilteredVMs(cmd, args, "/vms/stop")
+	return printFilteredVMs(cmd, args, "/vms/stop")
 }
diff --git a/src/client_cli/cmdVM/vmStart.go b/src/client_cli/cmdVM/vmStart.go
index 9c03729a019b9c9e946a1f1f29ed642710d02032..49f751e5a21408c49106bf3dae5d7bb85c44d84d 100644
--- a/src/client_cli/cmdVM/vmStart.go
+++ b/src/client_cli/cmdVM/vmStart.go
@@ -14,12 +14,11 @@ func (cmd *Start)GetName() string {
 }
  
 func (cmd *Start)GetDesc() string {
-	return "Start a VM"
+	return "Start one or more VMs."
 }
 
 func (cmd *Start)PrintUsage() {
-	u.PrintlnErr(cmd.GetDesc())
-	u.PrintlnErr("Usage: "+cmd.Name+" vmID")
+	printUsage(cmd, "started")
 }
 
 func (cmd *Start)Run(args []string) int {
@@ -27,23 +26,35 @@ func (cmd *Start)Run(args []string) int {
 	host := g.GetInstance().Host
 
 	argc := len(args)
-	if argc != 1 {
+	if argc < 1 {
 		cmd.PrintUsage()
 		return 1
 	}
 
-	uuid := args[0]
-	resp, err := client.R().Put(host+"/vms/"+uuid+"/start")
+	vms, err := getFilteredVMs("/vms/start", args)
 	if err != nil {
-		u.PrintlnErr("Error: "+err.Error())
+		u.PrintlnErr(err.Error())
 		return 1
 	}
 
-	if resp.IsSuccess() {
-		u.Println(resp)
-		return 0
-	} else {
-		u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
-		return 1
+	statusCode := 0
+
+	for _, vm := range(vms) {
+		uuid := vm.ID.String()
+		resp, err := client.R().Put(host+"/vms/"+uuid+"/start")
+		if err != nil {
+			u.PrintlnErr("Failed starting VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Started VM \""+vm.Name+"\" ("+uuid+")")
+			} else {
+				u.PrintlnErr("Failed starting VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
+				statusCode = 1
+			}
+		}
+
 	}
+
+	return statusCode
 }
diff --git a/src/client_cli/cmdVM/vmStop.go b/src/client_cli/cmdVM/vmStop.go
index e15411a12deccacb3f6214f311dd513a4e98089e..072cb80cb366c8792661a2ddd0cddebaaddd0eea 100644
--- a/src/client_cli/cmdVM/vmStop.go
+++ b/src/client_cli/cmdVM/vmStop.go
@@ -14,12 +14,11 @@ func (cmd *Stop)GetName() string {
 }
  
 func (cmd *Stop)GetDesc() string {
-	return "Stop a VM"
+	return "Stop one or more VMs."
 }
 
 func (cmd *Stop)PrintUsage() {
-	u.PrintlnErr(cmd.GetDesc())
-	u.PrintlnErr("Usage: "+cmd.Name+" vmID")
+	printUsage(cmd, "stopped")
 }
 
 func (cmd *Stop)Run(args []string) int {
@@ -27,23 +26,35 @@ func (cmd *Stop)Run(args []string) int {
 	host := g.GetInstance().Host
 
 	argc := len(args)
-	if argc != 1 {
+	if argc < 1 {
 		cmd.PrintUsage()
 		return 1
 	}
 
-	uuid := args[0]
-	resp, err := client.R().Put(host+"/vms/"+uuid+"/stop")
+	vms, err := getFilteredVMs("/vms/stop", args)
 	if err != nil {
-		u.PrintlnErr("Error: "+err.Error())
+		u.PrintlnErr(err.Error())
 		return 1
 	}
 
-	if resp.IsSuccess() {
-		u.Println(resp)
-		return 0
-	} else {
-		u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
-		return 1
+	statusCode := 0
+
+	for _, vm := range(vms) {
+		uuid := vm.ID.String()
+		resp, err := client.R().Put(host+"/vms/"+uuid+"/stop")
+		if err != nil {
+			u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Stopped VM \""+vm.Name+"\" ("+uuid+")")
+			} else {
+				u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
+				statusCode = 1
+			}
+		}
+
 	}
+
+	return statusCode
 }