diff --git a/src/client/cmdTemplate/templateList.go b/src/client/cmdTemplate/templateList.go
index d15f07a5577c14426c908063e84d41353b20f41a..54d594de4afcdce78bc51ab03b79a453bec689f8 100644
--- a/src/client/cmdTemplate/templateList.go
+++ b/src/client/cmdTemplate/templateList.go
@@ -6,6 +6,7 @@ import (
 	u "nexus-client/utils"
 	t "nexus-common/template"
 	libclient "nexus-libclient/template"
+	"nexus-libclient/utils"
 	"regexp"
 	"strings"
 
@@ -60,7 +61,7 @@ func (cmd *List) Run(args []string) int {
 	}
 
 	if foundLongOutputFlag >= 0 {
-		args = u.RemoveArgAtIndex(args, foundLongOutputFlag)
+		args = utils.RemoveArgAtIndex(args, foundLongOutputFlag)
 	}
 
 	templates, err := cmd.getFilteredTemplates(args)
diff --git a/src/client/cmdUser/userCreate.go b/src/client/cmdUser/userCreate.go
index 14e39b8ca8907232b3f6818488f457838082ff36..19d8f5a9912b03c953c6dc75d7a13410d73b6d98 100644
--- a/src/client/cmdUser/userCreate.go
+++ b/src/client/cmdUser/userCreate.go
@@ -8,6 +8,7 @@ import (
 	"nexus-common/params"
 	g "nexus-libclient/globals"
 	libclient "nexus-libclient/user"
+	"nexus-libclient/utils"
 	"os"
 	"strings"
 )
@@ -51,7 +52,7 @@ List of user capabilities:
 		usage += v + " "
 		i += 1
 		if i >= 5 {
-			usage = u.AppendNewLine(usage)
+			usage = utils.AppendNewLine(usage)
 			i = 0
 		}
 	}
@@ -115,7 +116,7 @@ func (cmd *Add) Run(args []string) int {
 			}
 
 			email := columns[0]
-			if !u.IsEmail(email) {
+			if !utils.IsEmail(email) {
 				u.PrintlnErr("Failed reading record on line ", line, ": ", email, " is not a valid email")
 				statusCode = 1
 				continue
diff --git a/src/client/cmdUser/userDel.go b/src/client/cmdUser/userDel.go
index 3d1159e48a6f5b8c01d577c1d88695ec3ef8a9df..0f09be15a84d259ffbf4351679845dbbe94a002f 100644
--- a/src/client/cmdUser/userDel.go
+++ b/src/client/cmdUser/userDel.go
@@ -6,6 +6,7 @@ import (
 	u "nexus-client/utils"
 	g "nexus-libclient/globals"
 	libclient "nexus-libclient/user"
+	"nexus-libclient/utils"
 	"os"
 )
 
@@ -43,12 +44,12 @@ func (cmd *Del) Run(args []string) int {
 
 	statusCode := 0
 
-	if argc == 1 && !u.IsEmail(args[0]) {
+	if argc == 1 && !utils.IsEmail(args[0]) {
 		// Single argument and it's a CSV file
 
 		csvFile := args[0]
 
-		if u.IsEmail(csvFile) {
+		if utils.IsEmail(csvFile) {
 			cmd.PrintUsage()
 			return 1
 		}
@@ -83,7 +84,7 @@ func (cmd *Del) Run(args []string) int {
 			}
 
 			email := columns[0]
-			if !u.IsEmail(email) {
+			if !utils.IsEmail(email) {
 				u.PrintlnErr("Failed reading record on line ", line, ": ", email, " is not a valid email")
 				statusCode = 1
 				continue
diff --git a/src/client/cmdUser/userList.go b/src/client/cmdUser/userList.go
index c6dc9adecf404f2669b6f168ee3c96a2de0ca4bb..17f2648da79e17aef468a1b4e5bf3cf356235a2c 100644
--- a/src/client/cmdUser/userList.go
+++ b/src/client/cmdUser/userList.go
@@ -6,6 +6,7 @@ import (
 	u "nexus-client/utils"
 	"nexus-common/params"
 	libclient "nexus-libclient/user"
+	"nexus-libclient/utils"
 	"regexp"
 	"strings"
 )
@@ -58,7 +59,7 @@ func (cmd *List) Run(args []string) int {
 	}
 
 	if foundLongOutputFlag >= 0 {
-		args = u.RemoveArgAtIndex(args, foundLongOutputFlag)
+		args = utils.RemoveArgAtIndex(args, foundLongOutputFlag)
 	}
 
 	users, err := libclient.GetUsers()
diff --git a/src/client/cmdUser/userSetCaps.go b/src/client/cmdUser/userSetCaps.go
index 44133e72c9ed55dd15c933a4a0dda051df017de8..6e3ddec91dc940783a67659e978168bac47f4517 100644
--- a/src/client/cmdUser/userSetCaps.go
+++ b/src/client/cmdUser/userSetCaps.go
@@ -8,6 +8,7 @@ import (
 	"nexus-common/params"
 	g "nexus-libclient/globals"
 	libclient "nexus-libclient/user"
+	"nexus-libclient/utils"
 	"os"
 	"strings"
 )
@@ -50,7 +51,7 @@ List of user capabilities:
 		i += 1
 		count += 1
 		if i >= 5 && count < len(caps) {
-			usage = u.AppendNewLine(usage)
+			usage = utils.AppendNewLine(usage)
 			i = 0
 		}
 	}
@@ -66,12 +67,12 @@ func (cmd *SetCaps) Run(args []string) int {
 
 	statusCode := 0
 
-	if argc == 1 && !u.IsEmail(args[0]) {
+	if argc == 1 && !utils.IsEmail(args[0]) {
 		// Single argument and it's a CSV file
 
 		csvFile := args[0]
 
-		if u.IsEmail(csvFile) {
+		if utils.IsEmail(csvFile) {
 			cmd.PrintUsage()
 			return 1
 		}
@@ -116,7 +117,7 @@ func (cmd *SetCaps) Run(args []string) int {
 			}
 
 			email := columns[0]
-			if !u.IsEmail(email) {
+			if !utils.IsEmail(email) {
 				u.PrintlnErr("Failed reading record on line ", line, ": ", email, " is not a valid email")
 				statusCode = 1
 				continue
diff --git a/src/client/cmdVM/vmAddAccess.go b/src/client/cmdVM/vmAddAccess.go
index dba53d535ab682bdf23b90b7d9bb7c2790a30cbe..ec290e443bf49ae12866a3458b3d8c2ca794f07c 100644
--- a/src/client/cmdVM/vmAddAccess.go
+++ b/src/client/cmdVM/vmAddAccess.go
@@ -9,6 +9,7 @@ import (
 	"nexus-common/caps"
 	"nexus-common/params"
 	g "nexus-libclient/globals"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
 	"os"
 	"strings"
@@ -53,7 +54,7 @@ List of VM access capabilities:
 		i += 1
 		count += 1
 		if i >= 5 && count < len(caps) {
-			usage = u.AppendNewLine(usage)
+			usage = utils.AppendNewLine(usage)
 			i = 0
 		}
 	}
@@ -107,7 +108,7 @@ func (cmd *AddAccess) Run(args []string) int {
 			vmID := columns[0]
 
 			email := columns[1]
-			if !u.IsEmail(email) {
+			if !utils.IsEmail(email) {
 				u.PrintlnErr("FAILED reading record on line ", line, ": ", email, " is not a valid email")
 				statusCode = 1
 				continue
diff --git a/src/client/cmdVM/vmCreate.go b/src/client/cmdVM/vmCreate.go
index 4a4763c6ac577a1198942016096ca2c998bd790a..c8a8def2df574a5bdb2132e261ea214f25985036 100644
--- a/src/client/cmdVM/vmCreate.go
+++ b/src/client/cmdVM/vmCreate.go
@@ -5,6 +5,7 @@ import (
 	u "nexus-client/utils"
 	"nexus-common/params"
 	"nexus-common/vm"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
 	"strconv"
 
@@ -67,7 +68,7 @@ func (cmd *Create) Run(args []string) int {
 		return 1
 	}
 	nic := vm.NicType(args[3])
-	usbDevs := u.Str2UsbDevices(args[4])
+	usbDevs := utils.Str2UsbDevices(args[4])
 	templateID, err := uuid.Parse(args[5])
 	if err != nil {
 		u.PrintlnErr(err)
@@ -82,7 +83,7 @@ func (cmd *Create) Run(args []string) int {
 		if err != nil {
 			// It's not a number, we assume it's a CSV file and parse it.
 			csvFile := args[6]
-			csvEntries, err = u.ReadCSVColumn(csvFile, 0)
+			csvEntries, err = utils.ReadCSVColumn(csvFile, 0)
 			if err != nil {
 				u.PrintlnErr(err)
 				return 1
diff --git a/src/client/cmdVM/vmDelAccess.go b/src/client/cmdVM/vmDelAccess.go
index 4bd7ef9fdd6d755669492df16637082abbda04b4..7d16a31c81ee86d91140a2ca9101e058633386e8 100644
--- a/src/client/cmdVM/vmDelAccess.go
+++ b/src/client/cmdVM/vmDelAccess.go
@@ -7,6 +7,7 @@ import (
 	"net/mail"
 	u "nexus-client/utils"
 	g "nexus-libclient/globals"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
 	"os"
 )
@@ -85,7 +86,7 @@ func (cmd *DelAccess) Run(args []string) int {
 			vmID := columns[0]
 
 			email := columns[1]
-			if !u.IsEmail(email) {
+			if !utils.IsEmail(email) {
 				u.PrintlnErr("FAILED reading record on line ", line, ": ", email, " is not a valid email")
 				statusCode = 1
 				continue
diff --git a/src/client/cmdVM/vmEdit.go b/src/client/cmdVM/vmEdit.go
index 4650648a20c0920c7609b83bfa8f64da9b719b17..9cc00938994df74f13232a04819a9ad21da37fe2 100644
--- a/src/client/cmdVM/vmEdit.go
+++ b/src/client/cmdVM/vmEdit.go
@@ -5,6 +5,7 @@ import (
 	u "nexus-client/utils"
 	"nexus-common/params"
 	"nexus-common/vm"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
 	"strconv"
 	"strings"
@@ -144,7 +145,7 @@ func (cmd *Edit) parseArgs(args []string) (*params.VMEdit, []string, error) {
 		}
 		s = getStringVal(arg, "usb=")
 		if s != "" {
-			vmParams.UsbDevs = u.Str2UsbDevices(s)
+			vmParams.UsbDevs = utils.Str2UsbDevices(s)
 			atLeastOneArg = true
 			continue
 		}
diff --git a/src/client/cmdVM/vmImportDir.go b/src/client/cmdVM/vmImportDir.go
index f1a22388099342174073b97b501630a02975ff33..60421183ea4bed76ebf6f094301a7c0dfac49e7d 100644
--- a/src/client/cmdVM/vmImportDir.go
+++ b/src/client/cmdVM/vmImportDir.go
@@ -2,9 +2,9 @@ package cmdVM
 
 import (
 	u "nexus-client/utils"
-	"nexus-common/utils"
+	cu "nexus-common/utils"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
-
 	"os"
 )
 
@@ -60,14 +60,14 @@ func (cmd *ImportDir) Run(args []string) int {
 
 	statusCode := 0
 
-	tmpTarGzFile, err := utils.GetRandomTempFilename()
+	tmpTarGzFile, err := cu.GetRandomTempFilename()
 	if err != nil {
 		u.PrintlnErr(err)
 		return 1
 	}
 	tmpTarGzFile += ".tar.gz"
 	defer os.Remove(tmpTarGzFile)
-	if err := u.TarGzDir(localDir, tmpTarGzFile); err != nil {
+	if err := utils.TarGzDir(localDir, tmpTarGzFile); err != nil {
 		u.PrintlnErr(err)
 		return 1
 	}
diff --git a/src/client/cmdVM/vmList.go b/src/client/cmdVM/vmList.go
index c1f1d79f46205383d2d3c222d8cc77a8161aeeb2..e9312f658caafc11714d8f9eb73143a5682a7492 100644
--- a/src/client/cmdVM/vmList.go
+++ b/src/client/cmdVM/vmList.go
@@ -3,6 +3,7 @@ package cmdVM
 import (
 	"fmt"
 	u "nexus-client/utils"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
 )
 
@@ -52,7 +53,7 @@ func (cmd *List) printFilteredVMs(args []string, route string) int {
 	}
 
 	if foundLongOutputFlag >= 0 {
-		args = u.RemoveArgAtIndex(args, foundLongOutputFlag)
+		args = utils.RemoveArgAtIndex(args, foundLongOutputFlag)
 	}
 
 	vms, err := getFilteredVMs(libclient.GetListVMs, args)
diff --git a/src/client/cmdVM/vmStartWithCreds.go b/src/client/cmdVM/vmStartWithCreds.go
index 30663e57c5654882b64d93ccad313e43d9419d37..b583fdaad4679fcf71a597361845abe7e0647f21 100644
--- a/src/client/cmdVM/vmStartWithCreds.go
+++ b/src/client/cmdVM/vmStartWithCreds.go
@@ -4,6 +4,7 @@ import (
 	"errors"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	"nexus-libclient/utils"
 	libclient "nexus-libclient/vm"
 )
 
@@ -35,12 +36,12 @@ func (cmd *StartWithCreds) PrintUsage() {
 
 func (cmd *StartWithCreds) parseCSVFile(csvFile string) ([]string, []string, error) {
 	// Column 0: VM IDs
-	vmIDs, err := u.ReadCSVColumn(csvFile, 0)
+	vmIDs, err := utils.ReadCSVColumn(csvFile, 0)
 	if err != nil {
 		return nil, nil, err
 	}
 	// Column 2: passwords
-	pwds, err := u.ReadCSVColumn(csvFile, 2)
+	pwds, err := utils.ReadCSVColumn(csvFile, 2)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/src/client/nexus-exam/nexus-exam.go b/src/client/nexus-exam/nexus-exam.go
index 8bc25376e11e6799ca62bffc620d6a240a5f36ca..8ccf87e8d6c9dac34603865367ac5a3588816d55 100644
--- a/src/client/nexus-exam/nexus-exam.go
+++ b/src/client/nexus-exam/nexus-exam.go
@@ -4,8 +4,6 @@ import (
 	"bytes"
 	_ "embed"
 	"errors"
-	"nexus-client/cmdLogin"
-	"nexus-client/cmdToken"
 	"nexus-client/defaults"
 	e "nexus-client/exec"
 	u "nexus-client/utils"
@@ -14,6 +12,7 @@ import (
 	"nexus-common/params"
 	"nexus-common/vm"
 	g "nexus-libclient/globals"
+	login "nexus-libclient/login"
 	libclient "nexus-libclient/vm"
 	"os"
 	"os/exec"
@@ -128,7 +127,7 @@ func refreshToken(parent fyne.Window) {
 	for {
 		if !loggedIn {
 			// Logins and obtains a JWT token.
-			token, err = cmdLogin.GetToken(nexus_exam_user, nexus_exam_pwd)
+			token, err = login.GetToken(nexus_exam_user, nexus_exam_pwd)
 			if err != nil {
 				appLabel.SetText("Unable to connect to server (error code 1)...\nCheck your network connection.")
 				u.PrintlnErr(time.Now(), ": failed connecting to server: "+err.Error())
@@ -139,7 +138,7 @@ func refreshToken(parent fyne.Window) {
 			}
 		} else {
 			setHeaderToken()
-			refreshedToken, err := cmdToken.GetToken()
+			refreshedToken, err := login.RefreshToken()
 			if err != nil {
 				appLabel.SetText("Unable to connect to server (error code 2)...\nCheck your network connection.")
 				u.PrintlnErr(time.Now(), ": failed refreshing token: "+err.Error())
@@ -155,7 +154,7 @@ func refreshToken(parent fyne.Window) {
 		} else {
 			appConnect.Hide()
 		}
-		time.Sleep(10 * time.Second)
+		time.Sleep(60 * time.Second)
 	}
 }
 
diff --git a/src/libclient/template/templateExportDisk.go b/src/libclient/template/templateExportDisk.go
index 0c418f51ce035200c709f88d4a835008fd28d71d..043675f66b335fc27821d5c279f62c790adc95d7 100644
--- a/src/libclient/template/templateExportDisk.go
+++ b/src/libclient/template/templateExportDisk.go
@@ -2,9 +2,9 @@ package template
 
 import (
 	"errors"
-	u "nexus-client/utils"
 	g "nexus-libclient/globals"
 	"nexus-libclient/response"
+	u "nexus-libclient/utils"
 )
 
 func TemplateExportDisk(tplID, outputFile string) error {
diff --git a/src/client/utils/csv.go b/src/libclient/utils/csv.go
similarity index 100%
rename from src/client/utils/csv.go
rename to src/libclient/utils/csv.go
diff --git a/src/client/utils/files.go b/src/libclient/utils/files.go
similarity index 100%
rename from src/client/utils/files.go
rename to src/libclient/utils/files.go
diff --git a/src/client/utils/strings.go b/src/libclient/utils/strings.go
similarity index 100%
rename from src/client/utils/strings.go
rename to src/libclient/utils/strings.go
diff --git a/src/libclient/vm/vmExportDir.go b/src/libclient/vm/vmExportDir.go
index adf02367987b920a419725d3ca93d4c3716366e6..a682021acdb8e7b33147adf9bec3d9e21f430591 100644
--- a/src/libclient/vm/vmExportDir.go
+++ b/src/libclient/vm/vmExportDir.go
@@ -2,9 +2,9 @@ package vm
 
 import (
 	"errors"
-	u "nexus-client/utils"
 	"nexus-common/params"
 	g "nexus-libclient/globals"
+	u "nexus-libclient/utils"
 )
 
 func VMExportDir(vmName, vmID, dirToExport string) (string, error) {
diff --git a/src/server/cleaner/cleaner.go b/src/server/cleaner/cleaner.go
index 7b85542431635862f96ee849d0dfadbf201ae1f9..742f9f6d6a85ea1334ba7db58056bc99a5fb7c97 100644
--- a/src/server/cleaner/cleaner.go
+++ b/src/server/cleaner/cleaner.go
@@ -26,7 +26,7 @@ func isOlderThanMinutes(fi os.FileInfo, n time.Duration) bool {
 func cleanup() {
 	dir := "/tmp"
 
-	log.Info("Cleanup thread configured to run every ", periodTimeInMin, " minutes and to delete uploaded files in ", dir, " last accessed more than ", deleteOlderThanInMin, " minutes ago")
+	log.Info("Cleanup thread: run every ", periodTimeInMin, " minutes; delete uploaded files in ", dir, " last accessed more than ", deleteOlderThanInMin, " minutes ago")
 
 	for {
 		log.Debug("Cleanup thread: checking for files to delete...")
diff --git a/src/server/nexus-server.go b/src/server/nexus-server.go
index 3158f816e59ddfa9a54c96d894b49f2d64e55886..feef8ff7e9f8bf8943f00a5aeebeece282acd931 100644
--- a/src/server/nexus-server.go
+++ b/src/server/nexus-server.go
@@ -48,7 +48,7 @@ func main() {
 	cleaner.Start()
 
 	log.Info("API port: ", conf.Core.APIDefaultPort)
-	log.Info("Spice port range [", conf.Core.VMSpiceMinPort, "-", conf.Core.VMSpiceMaxPort, "]")
+	log.Info("Spice port range: ", conf.Core.VMSpiceMinPort, "-", conf.Core.VMSpiceMaxPort)
 	log.Info("Tmp directory: ", conf.Core.TmpDir)
 
 	log.Info("Max upload size: ", conf.Limits.MaxUploadSize)
diff --git a/src/server/vms/vms.go b/src/server/vms/vms.go
index 13a6df5a33db30af2efd6b8dbc9130e0103963de..72144d4e5be48c817afd617a41c6d0a5f0c2db4b 100644
--- a/src/server/vms/vms.go
+++ b/src/server/vms/vms.go
@@ -872,9 +872,7 @@ func (vms *VMs) DeleteFileFromVM(vm *VM, filePath string) error {
 	}
 
 	vm.DiskBusy = true
-	defer func(vm *VM) {
-		vm.DiskBusy = false
-	}(vm)
+	defer func(vm *VM) { vm.DiskBusy = false }(vm)
 
 	if err := exec.DeleteFromVM(vm.getDiskPath(), filePath); err != nil {
 		msg := prefix + err.Error()