diff --git a/src/client/cmdVersion/version.go b/src/client/cmdVersion/version.go
index dde61e0313ea5cbebf50070e1bac723328fc2327..758be04213d76e91874d6d3d32e171b3f627e1c1 100644
--- a/src/client/cmdVersion/version.go
+++ b/src/client/cmdVersion/version.go
@@ -1,12 +1,9 @@
 package cmdVersion
 
 import (
-	"encoding/json"
-	"errors"
 	u "nexus-client/utils"
 	"nexus-client/version"
-	"nexus-common/params"
-	g "nexus-libclient/globals"
+	libclient "nexus-libclient/version"
 )
 
 type Version struct {
@@ -37,7 +34,7 @@ func (cmd *Version) Run(args []string) int {
 		return 1
 	}
 
-	serverVersion, err := getServerVersion()
+	serverVersion, err := libclient.GetServerVersion()
 	if err != nil {
 		u.PrintlnErr("Error: " + err.Error())
 		return 1
@@ -49,30 +46,10 @@ func (cmd *Version) Run(args []string) int {
 	return 0
 }
 
-func getServerVersion() (*params.Version, error) {
-	client := g.GetInstance().Client
-	host := g.GetInstance().Host
-
-	resp, err := client.R().Get(host + "/version")
-	if err != nil {
-		return nil, err
-	} else {
-		if resp.IsSuccess() {
-			version := params.Version{}
-			if err := json.Unmarshal(resp.Body(), &version); err != nil {
-				return nil, err
-			}
-			return &version, nil
-		} else {
-			return nil, errors.New(resp.Status() + ": " + resp.String())
-		}
-	}
-}
-
 // Checks the client version is compatible with the server's API.
 func CheckServerCompatibility(appname string) bool {
 	// Checks the client version is compatible with the server's API.
-	serverVersion, err := getServerVersion()
+	serverVersion, err := libclient.GetServerVersion()
 	if err != nil {
 		u.PrintlnErr("Error: " + err.Error())
 		return false
diff --git a/src/client/nexus-exam/nexus-exam.go b/src/client/nexus-exam/nexus-exam.go
index f73abf8579db147774c964800d4a0a7de9696f04..8bc25376e11e6799ca62bffc620d6a240a5f36ca 100644
--- a/src/client/nexus-exam/nexus-exam.go
+++ b/src/client/nexus-exam/nexus-exam.go
@@ -3,7 +3,6 @@ package main
 import (
 	"bytes"
 	_ "embed"
-	"encoding/json"
 	"errors"
 	"nexus-client/cmdLogin"
 	"nexus-client/cmdToken"
@@ -15,6 +14,7 @@ import (
 	"nexus-common/params"
 	"nexus-common/vm"
 	g "nexus-libclient/globals"
+	libclient "nexus-libclient/vm"
 	"os"
 	"os/exec"
 	"path"
@@ -26,7 +26,6 @@ import (
 	"fyne.io/fyne/v2/container"
 	"fyne.io/fyne/v2/theme"
 	"fyne.io/fyne/v2/widget"
-	"github.com/go-playground/validator/v10"
 	"github.com/go-resty/resty/v2"
 )
 
@@ -60,46 +59,20 @@ func exit(code int) {
 }
 
 func attachVM(parent fyne.Window, hostname, cert, pwd string) {
-	client := g.GetInstance().Client
-	host := g.GetInstance().Host
 	setHeaderToken()
 
-	p := &params.VMAttachCreds{Pwd: pwd}
-	resp, err := client.R().SetBody(p).Post(host + "/vms/spicecreds")
+	p := params.VMAttachCreds{Pwd: pwd}
+	creds, err := libclient.VMGetAnySpiceCreds(p)
 	if err != nil {
-		errorPopup(parent, "Failed attaching to VM (code 4)")
+		errorPopup(parent, "Failed attaching to VM: "+err.Error())
 		return
-	}
-
-	if resp.IsSuccess() {
-		var creds vm.VMSpiceCredentialsSerialized
-		if err := json.Unmarshal(resp.Body(), &creds); err != nil {
-			errorPopup(parent, "Failed attaching to VM (code 5)")
-			return
-		}
-		if err := validator.New(validator.WithRequiredStructEnabled()).Struct(creds); err != nil {
-			errorPopup(parent, "Failed attaching to VM (code 6)")
-			return
-		}
+	} else {
 		go func(creds vm.VMSpiceCredentialsSerialized) {
 			_, err := e.RunRemoteViewer(hostname, cert, creds.Name, creds.SpicePort, creds.SpicePwd, true)
 			if err != nil {
-				errorPopup(parent, "Failed attaching to VM (code 7)")
-				return
+				errorPopup(parent, "Failed executing remote-viewer: "+err.Error())
 			}
-		}(creds)
-	} else {
-		type msg struct {
-			Message string `json:"message"`
-		}
-		var m msg
-		if err := json.Unmarshal(resp.Body(), &m); err != nil {
-			errorPopup(parent, "Failed attaching to VM (code 8)")
-			return
-		}
-		errorPopup(parent, m.Message)
-		// errorPopup(parent, resp.Status()+": "+resp.String())
-		return
+		}(*creds)
 	}
 }
 
diff --git a/src/libclient/version/version.go b/src/libclient/version/version.go
new file mode 100644
index 0000000000000000000000000000000000000000..3c14629336b911442eeddd935058882645dfd852
--- /dev/null
+++ b/src/libclient/version/version.go
@@ -0,0 +1,28 @@
+package version
+
+import (
+	"encoding/json"
+	"errors"
+	"nexus-common/params"
+	g "nexus-libclient/globals"
+)
+
+func GetServerVersion() (*params.Version, error) {
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
+
+	resp, err := client.R().Get(host + "/version")
+	if err != nil {
+		return nil, err
+	} else {
+		if resp.IsSuccess() {
+			version := params.Version{}
+			if err := json.Unmarshal(resp.Body(), &version); err != nil {
+				return nil, err
+			}
+			return &version, nil
+		} else {
+			return nil, errors.New(resp.Status() + ": " + resp.String())
+		}
+	}
+}