diff --git a/src/client/cmdMisc/ls.go b/src/client/cmdMisc/ls.go
index e0261a257a112662e01663ae28a365709c3baaaa..ec92a9f8709d3070810151a55af5726435beef35 100644
--- a/src/client/cmdMisc/ls.go
+++ b/src/client/cmdMisc/ls.go
@@ -44,7 +44,7 @@ func (cmd *Ls)Run(args []string) int {
 func (cmd *Ls)listDir(dir string) {
     fis, err := ioutil.ReadDir(dir)
     if err != nil {
-        u.Println("Failed reading \""+dir+"\" directory: "+err.Error())
+        u.PrintlnErr("Failed reading \""+dir+"\" directory: "+err.Error())
         return
     }
 
diff --git a/src/client/nexus-exam/go.mod b/src/client/nexus-exam/go.mod
index 4a682fba02ff3ddf30b69a06dcb74b0607587ed0..a5f105ab7014c2585c20a7772f4dd9bb05cf31ce 100644
--- a/src/client/nexus-exam/go.mod
+++ b/src/client/nexus-exam/go.mod
@@ -89,5 +89,6 @@ require (
 	golang.org/x/text v0.14.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
+	nexus-client/cmdToken v0.0.0-00010101000000-000000000000 // indirect
 	nexus-common/caps v0.0.0-00010101000000-000000000000 // indirect
 )
diff --git a/src/client/nexus-exam/nexus-exam.go b/src/client/nexus-exam/nexus-exam.go
index c5044078f4c27efa987ee508164f11c120a663a6..4c02f26cf55d9c7833bccac35094df3b658340fc 100644
--- a/src/client/nexus-exam/nexus-exam.go
+++ b/src/client/nexus-exam/nexus-exam.go
@@ -19,6 +19,7 @@ import (
     "nexus-client/version"
     "nexus-client/defaults"
     "nexus-client/cmdLogin"
+    "nexus-client/cmdToken"
     "fyne.io/fyne/v2"
     "fyne.io/fyne/v2/app"
     "fyne.io/fyne/v2/theme"
@@ -54,6 +55,7 @@ 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")
@@ -133,37 +135,26 @@ func hypervisorCheck() {
     }
 }
 
-// Recurrently obtains a new JWT token so that the user session doesn't expire.
-func refreshToken(parent fyne.Window) {
+func setHeaderToken() {
     client := g.GetInstance().Client
-    host := g.GetInstance().Host
+    client.SetHeader("Content-Type", "application/json")
+    client.SetHeader("Authorization", "Bearer "+token)
+}
 
+// Recurrently obtains a new JWT token so that the user session doesn't expire.
+func refreshToken(parent fyne.Window) {
     for {
-        resp, err := client.R().Get(host+"/token/refresh")
+        setHeaderToken()
+        refreshedToken, err := cmdToken.GetToken()
         if err != nil {
-            errorPopup(parent, "Failed refreshing token (code 1)")
-            u.PrintlnErr(buildversion.BuildDate(), ": failed refreshing token (code 1)")
+            errorPopup(parent, "Failed refreshing token")
+            u.PrintlnErr(time.Now(), ": failed refreshing token: "+err.Error())
+            break
         } else {
-            if resp.IsSuccess() {
-                type Response struct {
-                    Token string
-                }
-                var response Response
-                err = json.Unmarshal(resp.Body(), &response)
-                if err != nil {
-                    errorPopup(parent, "Failed refreshing token (code 2)")
-                    u.PrintlnErr(buildversion.BuildDate(), ": failed refreshing token (code 2)")
-                } else {
-                    token = response.Token
-                    u.Println(buildversion.BuildDate(), ": successfully refreshed token")
-                }
-            } else {
-                // errorPopup(parent, resp.Status()+": "+resp.String())
-                errorPopup(parent, "Failed refreshing token (code 3)")
-                u.PrintlnErr(buildversion.BuildDate(), ": failed refreshing token (code 3)")
-            }
+            u.Println(time.Now(), ": successfully refreshed token")
         }
-        time.Sleep(1*time.Hour)
+        token = refreshedToken
+        time.Sleep(30*time.Second)
     }
 }
 
@@ -229,9 +220,6 @@ func run() int {
         abortWindow("Failed obtaining token (network issue?)")
     }
 
-    client.SetHeader("Content-Type", "application/json")
-    client.SetHeader("Authorization", "Bearer "+token)
-
     app := app.New()
     app.Settings().SetTheme(theme.LightTheme())
     win := app.NewWindow(windowTitle)
diff --git a/src/client/nexush/nexush.go b/src/client/nexush/nexush.go
index bbd5ef199697e1f57a0581b39833273c78240cf3..fe2ca8a026bda956049884424c836d041d951e59 100644
--- a/src/client/nexush/nexush.go
+++ b/src/client/nexush/nexush.go
@@ -212,14 +212,14 @@ Type: "help" for help on commands
             quit = true
             continue
         } else {
-            u.Println("Error reading line: ", err)
+            u.PrintlnErr("Error reading line: ", err)
             continue
         }
 
         line = strings.TrimSpace(line)
         args, err := extractArgs(line)
         if err != nil {
-            u.Println("invalid command line: "+err.Error())
+            u.PrintlnErr("invalid command line: "+err.Error())
             continue
         }
         if args == nil {
@@ -245,7 +245,7 @@ Type: "help" for help on commands
                     if typedCmd == "refresh" {
                         refreshedToken, err := cmdToken.GetToken()
                         if err != nil {
-                            u.Println("refresh error: "+err.Error())
+                            u.PrintlnErr("refresh error: "+err.Error())
                             break
                         }
                         token = refreshedToken
@@ -256,7 +256,7 @@ Type: "help" for help on commands
                         break
                     }
                 } else {
-                    u.Println(typedCmd+": unknown command")
+                    u.PrintlnErr(typedCmd+": unknown command")
                 }
         }
     }