diff --git a/src/client_cli/cmdTemplate/helper.go b/src/client_cli/cmdTemplate/helper.go
index 422db600e92e0634e736d36c0565d95b5704dd01..e6e996116ecf218a6b4e8db7194b4e43c733773e 100644
--- a/src/client_cli/cmdTemplate/helper.go
+++ b/src/client_cli/cmdTemplate/helper.go
@@ -37,9 +37,9 @@ func printUsage(c cmd.Command) {
 Any number of IDs or regexes can be specified.
 The regex only matches the templates's name and is case-insensitive.
 Regex examples:
-    ""    -> matches any templates
-    "."   -> matches any templates
-    "bla" -> matches any templates containing "bla"`
+""    -> matches any templates
+"."   -> matches any templates
+"bla" -> matches any templates containing "bla"`
 	u.PrintlnErr(usage)
 }
 
diff --git a/src/client_cli/cmdUser/helper.go b/src/client_cli/cmdUser/helper.go
index 118b54d638869d0f33d321d54c650df55761a544..001f99bafccdf4052b778569ac28b9f3c79217f7 100644
--- a/src/client_cli/cmdUser/helper.go
+++ b/src/client_cli/cmdUser/helper.go
@@ -39,9 +39,9 @@ func printUsage(c cmd.Command) {
 Any number of regexes can be specified.
 The regex matches the user email, first name and last name and is case-insensitive.
 Regex examples:
-    ""    -> matches any users
-    "."   -> matches any users
-    "bla" -> matches any users containing "bla"`
+""    -> matches any users
+"."   -> matches any users
+"bla" -> matches any users containing "bla"`
 	u.PrintlnErr(usage)
 }
 
diff --git a/src/client_cli/cmdVM/helper.go b/src/client_cli/cmdVM/helper.go
index 48793cc04c65eda8ea552a8fb0d97487fd67ede7..5e33c496c6c144673cf6a5e9fe71de19474124c4 100644
--- a/src/client_cli/cmdVM/helper.go
+++ b/src/client_cli/cmdVM/helper.go
@@ -59,9 +59,9 @@ func printUsage(c cmd.Command, action string) {
 	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
-    "."   -> matches any VMs
-    "bla" -> matches any VMs containing "bla" in their name`
+""    -> matches any VMs
+"."   -> matches any VMs
+"bla" -> matches any VMs containing "bla" in their name`
 	u.PrintlnErr(usage)
 }
 
diff --git a/src/client_cli/cmdVM/vmAttach.go b/src/client_cli/cmdVM/vmAttach.go
index d9c7708a659732ee43d7669df70b566ab77db379..26076a538ed60be7d698a8d8866ef15b4551a8c9 100644
--- a/src/client_cli/cmdVM/vmAttach.go
+++ b/src/client_cli/cmdVM/vmAttach.go
@@ -43,7 +43,7 @@ func (cmd *Attach)Run(args []string) int {
 
 	id := args[0]
 
-	resp, err := client.R().Get(host+"/vms/"+id+"/list")
+	resp, err := client.R().Get(host+"/vms/"+id)
 	if err != nil {
 		u.PrintlnErr("Error: "+err.Error())
 		return 1
diff --git a/src/client_cli/cmdVM/vmEdit.go b/src/client_cli/cmdVM/vmEdit.go
index bc5edaf0789934dac9430c03cc5dc5bbdda0be62..aa8ba536be7d86f61551d49fa2465922bfebf799 100644
--- a/src/client_cli/cmdVM/vmEdit.go
+++ b/src/client_cli/cmdVM/vmEdit.go
@@ -12,7 +12,7 @@ type Edit struct {
     Name string
 }
 
-type vmArgsParameters struct {
+type vmEditParameters struct {
 	Name string
 	Cpus int
 	Ram int
@@ -29,11 +29,19 @@ func (cmd *Edit)GetDesc() string {
 
 func (cmd *Edit)PrintUsage() {
 	u.PrintlnErr(cmd.GetDesc())
-	u.PrintlnErr("Usage: "+cmd.Name+" vmID [name=\"new name\"] [cpus=n] [ram=n] [nic=none/user]")
-	u.PrintlnErr("Parameters between [] are optional, but at least one must be defined.")
-	u.PrintlnErr("cpus must be between 1 and 16")
-	u.PrintlnErr("ram must be between 512 and 32768")
-	u.PrintlnErr("nic must be either \"none\" or \"user\"")
+	u.PrintlnErr("Usage: "+cmd.GetName()+" [ID ...] [regex ...] [name=\"new name\"] [cpus=n] [ram=n] [nic=none/user]")
+	u.PrintlnErr("Only VMs matching the specified IDs or regexes will be edited.")
+	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
+"."   -> matches any VMs
+"bla" -> matches any VMs containing "bla" in their name
+VM parameters that can be edited are the following:
+cpus    must be between 1 and 16
+ram     must be between 512 and 32768
+nic     must be either "none" or "user`
+	u.PrintlnErr(usage)
 }
 
 func (cmd *Edit)getStringVal(s string, prefix string) string {
@@ -44,45 +52,52 @@ func (cmd *Edit)getStringVal(s string, prefix string) string {
 	return ""
 }
 
-func (cmd *Edit)parseArgs(args []string) (*vmArgsParameters, error) {
-	vmArgs := &vmArgsParameters {}
+func (cmd *Edit)parseArgs(args []string) (*vmEditParameters, []string, error) {
+	vmParams := &vmEditParameters {}
+	var regex []string
 	atLeastOneArg := false
 
 	for _, arg := range args {
 		s := cmd.getStringVal(arg, "name=")
 		if s != "" {
-			vmArgs.Name = s
+			vmParams.Name = s
 			atLeastOneArg = true
+			continue
 		}
 		s = cmd.getStringVal(arg, "cpus=")
 		if s != "" {
 			cpus, err := strconv.Atoi(s)
 			if err != nil {
-				return nil, errors.New("Invalid number of CPU(s)")
+				return nil, nil, errors.New("Invalid number of CPU(s)")
 			}
-			vmArgs.Cpus = cpus
+			vmParams.Cpus = cpus
 			atLeastOneArg = true
+			continue
 		}
 		s = cmd.getStringVal(arg, "ram=")
 		if s != "" {
 			ram, err := strconv.Atoi(s)
 			if err != nil {
-				return nil, errors.New("Invalid amount of RAM")
+				return nil, nil, errors.New("Invalid amount of RAM")
 			}
-			vmArgs.Ram = ram
+			vmParams.Ram = ram
 			atLeastOneArg = true
+			continue
 		}
 		s = cmd.getStringVal(arg, "nic=")
 		if s != "" {
-			vmArgs.Nic = s
+			vmParams.Nic = s
 			atLeastOneArg = true
+			continue
 		}
+
+		regex = append(regex, arg)
 	}
 
 	if atLeastOneArg {
-		return vmArgs, nil
+		return vmParams, regex, nil
 	} else {
-		return nil, nil
+		return nil, nil, nil
 	}
 }
 
@@ -91,34 +106,46 @@ func (cmd *Edit)Run(args []string) int {
 	host := g.GetInstance().Host
 
 	argc := len(args)
-	if argc < 2 || argc > 5 {
+	if argc < 1 {
 		cmd.PrintUsage()
 		return 1
 	}
 
-	id := args[0]
-	vmArgs, err := cmd.parseArgs(args[1:])
+	vmParams, regex, err := cmd.parseArgs(args)
 	if err != nil {
 		u.PrintlnErr(err.Error())
 		return 1
 	}
 
-	if vmArgs == nil {
+	if vmParams == nil {
 		cmd.PrintUsage()
 		return 1
 	}
 
-	resp, err := client.R().SetBody(vmArgs).Put(host+"/vms/"+id)
+	vms, err := getFilteredVMs("/vms/edit", regex)
 	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().SetBody(vmParams).Put(host+"/vms/"+uuid)
+		if err != nil {
+			u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Edited VM \""+vm.Name+"\" ("+uuid+")")
+			} else {
+				u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
+				statusCode = 1
+			}
+		}
+
 	}
+
+	return statusCode
 }