diff --git a/src/app/job/job.component.html b/src/app/job/job.component.html
index 0769af972a68b974a0a627df398b69095b54a6ac..43f14330a352380e534badbfd7ca2de7ac702ff5 100644
--- a/src/app/job/job.component.html
+++ b/src/app/job/job.component.html
@@ -1,6 +1,6 @@
 <mat-list-item style="height: auto; width: auto" class="strudel-job-typography">
   <div fxLayout="column" style="width: 100%" class="list-item">
-    <div style="text-align: left"> {{ jobdata.name }} </div>
+    <div style="text-align: left"> {{ jobdata.app.name }} </div>
     <div *ngIf="jobdata.connectionState == 0 || jobdata.connectionState == null" fxLayout="row" fxLayoutAlign="space-between">
       <div fxFlex="10%" style="overflow: auto"> {{ jobdata.state }}</div>
       <div fxFlex="10%" style="overflow: auto"> {{ jobdata.jobid }}</div>
diff --git a/src/app/job/job.component.ts b/src/app/job/job.component.ts
index d56bbc7359129e32a915d1b8e9cffc777f5e1de3..25177e3f8aa7af7d7e87c5e03dce6320940b5ee5 100644
--- a/src/app/job/job.component.ts
+++ b/src/app/job/job.component.ts
@@ -1,7 +1,6 @@
 import { Component, OnInit, Input, OnDestroy } from '@angular/core';
 import { Job } from '../job';
 import {TesService} from '../tes.service';
-import { StrudelappsService } from '../strudelapps.service';
 import { timer, Subscription } from 'rxjs';
 import { repeat } from 'rxjs/operators';
 import { AppAction, Strudelapp} from '../strudelapp';
@@ -22,7 +21,7 @@ export class JobComponent implements OnInit, OnDestroy {
   public mem_resources: string;
   public timeremaining: string;
   private updatesub: Subscription;
-  constructor(private tesService: TesService, private strudelAppsService: StrudelappsService, private backendService: BackendSelectionService) {
+  constructor(private tesService: TesService, private backendService: BackendSelectionService) {
 
 
 
@@ -103,8 +102,6 @@ export class JobComponent implements OnInit, OnDestroy {
   }
 
   onConnect(action: AppAction) {
-    // Before connecting we must resolve what type of app we are connecting to
-    // this.jobdata.app = this.strudelAppsService.getApp(this.jobdata.name);
     this.jobdata.connectionState = null;
     this.tesService.connect(this.jobdata,action);
   }
diff --git a/src/app/joblist/joblist.component.html b/src/app/joblist/joblist.component.html
index a030d369a15cced0eaf0c08be3313277afff8c0c..a630ba3a6d8ba908c516bb38f20907a663d397ec 100644
--- a/src/app/joblist/joblist.component.html
+++ b/src/app/joblist/joblist.component.html
@@ -24,7 +24,7 @@
                 </mat-list-item>
             <mat-divider style="background-color: var(--panel-border-color)"></mat-divider>
             <div *ngFor="let job of joblist ; let lastItem = last">
-                <div *ngIf="app.name == job.appname && job.state != 'Finished'">
+                <div *ngIf="job.app !== null && app.name == job.app.name && job.state != 'Finished'">
                     <app-job [jobdata]=job></app-job>
                     <mat-divider></mat-divider>
                 </div>
@@ -55,7 +55,7 @@
                 </mat-list-item>
             <mat-divider style="background-color: var(--panel-border-color)"></mat-divider>
             <div *ngFor="let job of joblist ; let lastItem = last">
-                <div *ngIf="job.app !== null && app.name == job.appname && job.state == 'Finished'">
+                <div *ngIf="job.app !== null && app.name == job.app.name && job.state == 'Finished'">
                     <app-job [jobdata]=job></app-job>
                     <mat-divider></mat-divider>
                 </div>
diff --git a/src/app/joblist/joblist.component.ts b/src/app/joblist/joblist.component.ts
index 3f6df3fd24fc2e62a5ea8ad6bb8669f55b8d7c93..e336904dbfc282aba3d18af23aa060dc649e3a0f 100644
--- a/src/app/joblist/joblist.component.ts
+++ b/src/app/joblist/joblist.component.ts
@@ -53,6 +53,7 @@ export class JoblistComponent implements OnInit {
      {this.sub = timer(5000).pipe(repeat()).subscribe( () => this.getJobs() )});
  }*/
  updateJoblist(jobquery: Job[], identity: Identity) {
+   console.log('in updateJoblist')
    var joblist: Job[] = []
    var qjobids: any[] = [];
    var cjobids: any[] = [];
@@ -91,7 +92,7 @@ export class JoblistComponent implements OnInit {
    // any jobs in the joblist that we don't know which application they arem try to figure it out
    for (j of joblist) {
      if (j.app === undefined || j.app == null) {
-       j.app = this.getApp(j.appname,identity.site.appCatalog.value);
+       j.app = Strudelapp.getApp(j.appname,identity.site.appCatalog.value);
      }
      if (j.identity == undefined) {
         j.identity = identity;
@@ -103,32 +104,6 @@ export class JoblistComponent implements OnInit {
    // Sort the joblist so jobs are descending
    this.joblist = joblist.sort((a,b) =>  (a.jobid < b.jobid)? 1:-1);
  }
-  getApp(name: string,applist: any): any {
-
-    var idx: number;
-    var app: any;
-    var sapp: Strudelapp;
-    app = applist[0];
-    for ( let item of applist) {
-      sapp = <Strudelapp>item;
-      //let sname = sapp.name.toLowerCase().replace(/\s/g, '');
-      //let jname = name.toLowerCase().replace(/\s/g, '');
-      let sname = sapp.name;
-      let jname = name;
-      idx = sname.indexOf(jname);
-      if (idx == 0) {
-        app = item;
-        return app;
-      }
-      if (sapp.applist != null) {
-        app = this.getApp(name,sapp.applist);
-        if (app != null) {
-          return app;
-        }
-      }
-    }
-    return null;
-  }
 
   public ngOnDestroy(): void {
     if (this.sub !== undefined) {
diff --git a/src/app/launch-dialog/launch-dialog.component.ts b/src/app/launch-dialog/launch-dialog.component.ts
index 3dd4018b585b7c83d338d0bfaec00d0aeec6608f..4a1ca6d1255a64c194848a5e8fb356ce377eb0ea 100644
--- a/src/app/launch-dialog/launch-dialog.component.ts
+++ b/src/app/launch-dialog/launch-dialog.component.ts
@@ -89,7 +89,7 @@ export class LaunchDialogComponent implements OnInit {
       theme = 'strudel-light-theme';
     }
     if (this.identity !== null && this.app !== null) {
-      this.batchcmdurl = this.identity.site.url+"/"+this.app.name+"?theme="+theme;
+      this.batchcmdurl = this.identity.site.url+"/"+encodeURIComponent(this.app.name)+"?theme="+theme;
     }
     this.batchcmdsafeurl = this.domSanitizer.bypassSecurityTrustResourceUrl(this.batchcmdurl);
     if (this.app.url !== null) {
diff --git a/src/app/launcher/launcher.component.ts b/src/app/launcher/launcher.component.ts
index fcb6179a36e37887b2336125e65f1f5f327e0763..f9770a80c20f98a1b569929e539dea129ab1b17d 100644
--- a/src/app/launcher/launcher.component.ts
+++ b/src/app/launcher/launcher.component.ts
@@ -12,7 +12,6 @@ import { repeat, takeUntil, skip, switchMap, take, filter} from 'rxjs/operators'
 import { Router, ActivatedRoute, ParamMap } from '@angular/router';
 
 import {Strudelapp} from '../strudelapp';
-import { StrudelappsService } from '../strudelapps.service';
 import { TesService } from '../tes.service';
 import {BackendSelectionService } from '../backend-selection.service';
 import { AuthorisationService } from '../authorisation.service';
@@ -68,7 +67,6 @@ export class LauncherComponent implements OnInit {
                 public computeSitesService: ComputesitesService,
                 private router: Router,
                 private route: ActivatedRoute,
-                private strudelappsService: StrudelappsService,
                 public settingsService: SettingsService,
                 private jobsService: JobsService,
                 ) {
@@ -249,7 +247,7 @@ export class LauncherComponent implements OnInit {
     if (id == 'accountinfo') {
       return null;
     }
-    return this.strudelappsService.getApp(v,id.site.appCatalog.value);
+    return Strudelapp.getApp(v,id.site.appCatalog.value);
   }
 
   getId(v: any, appidentities: Identity[]) {
diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts
index 31047156cd51ce6c28afc44dac0097bcd129491c..5fc95beacd4e145006a31bc86270805822f273cc 100644
--- a/src/app/login/login.component.ts
+++ b/src/app/login/login.component.ts
@@ -5,8 +5,6 @@ import { BehaviorSubject } from 'rxjs/BehaviorSubject';
 import { Subscription } from 'rxjs';
 import { Router, NavigationStart } from '@angular/router';
 
-import {Strudelapp} from '../strudelapp';
-import { StrudelappsService } from '../strudelapps.service';
 import { TesService } from '../tes.service';
 import {BackendSelectionService } from '../backend-selection.service';
 import { AuthorisationService } from '../authorisation.service';
@@ -33,9 +31,6 @@ export class SafeHtmlPipe implements PipeTransform  {
   styleUrls: ['./login.component.css']
 })
 export class LoginComponent implements OnInit {
-  public strudelapps: Strudelapp[];
-
-  public app: Strudelapp;
   public authorised: boolean;
   public identity: Identity;
 
diff --git a/src/app/modaldialog/modaldialog.component.html b/src/app/modaldialog/modaldialog.component.html
index bc5039f1fbafd800d888c6c179ec8ad324e94644..535dacdc32a7d162c7ab157dbd19271562f05abf 100644
--- a/src/app/modaldialog/modaldialog.component.html
+++ b/src/app/modaldialog/modaldialog.component.html
@@ -1,6 +1,6 @@
-  <h2>Close {{ data.name }}?</h2>
+  <h2>Close {{ data.app.name }}?</h2>
   It looks like you just closed an application.<br>
   You can choose to leave this application running if you will come back to it soon or to terminate it so that someone else may use the computing resources<br>
   <div fxLayout="row" fxLayoutAlign="space-between stretch" style="width: 100%">
-  <button mat-button (click)="close(null)">Leave it running</button><button mat-button (click)="close(data)">Terminate {{ data.name }}</button>
+  <button mat-button (click)="close(null)">Leave it running</button><button mat-button (click)="close(data)">Terminate {{ data.app.name }}</button>
   </div>
diff --git a/src/app/modaldialog/modaldialog.component.ts b/src/app/modaldialog/modaldialog.component.ts
index 66b85e68923d07174046b53ab6737b9296beaab4..e44e2c65944053c723f9529e1fc5f05203123159 100644
--- a/src/app/modaldialog/modaldialog.component.ts
+++ b/src/app/modaldialog/modaldialog.component.ts
@@ -15,6 +15,8 @@ export class ModaldialogComponent implements OnInit {
    }
 
   ngOnInit() {
+    console.log('created close dialog');
+    console.log(this.data);
   }
 
   close(rv) {
diff --git a/src/app/shareconnect/shareconnect.component.ts b/src/app/shareconnect/shareconnect.component.ts
index 5cdb6913293b22b4927c2765bbaea64f85fcf17e..d4bf13dbfe6b393f15603eece9ece81d9fa4f260 100644
--- a/src/app/shareconnect/shareconnect.component.ts
+++ b/src/app/shareconnect/shareconnect.component.ts
@@ -1,6 +1,5 @@
 import { Component, OnInit } from '@angular/core';
 import { Strudelapp } from '../strudelapp';
-import { StrudelappsService } from '../strudelapps.service';
 import { TesService } from '../tes.service';
 import { AuthorisationService } from '../authorisation.service';
 import { Computesite } from '../computesite';
diff --git a/src/app/strudelapp.ts b/src/app/strudelapp.ts
index 9f2fa16570ba39114fd083869ae1f1e3dcbed478..93fbc6d96ada2a67e22d9a5350b6efcf0785b45e 100644
--- a/src/app/strudelapp.ts
+++ b/src/app/strudelapp.ts
@@ -18,6 +18,35 @@ export class Strudelapp {
                       /// how we create tunnels
   applist: Strudelapp[] = null;
   desc: string = null;
+  static getApp(name: string,applist: any): any {
+
+
+    var idx, idxURI: number;
+    var app: any;
+    var sapp: Strudelapp;
+    app = applist[0];
+    let jname = name;
+    let uriname = decodeURIComponent(name);
+    for ( let item of applist) {
+      sapp = <Strudelapp>item;
+      //let sname = sapp.name.toLowerCase().replace(/\s/g, '');
+      //let jname = name.toLowerCase().replace(/\s/g, '');
+      let sname = sapp.name;
+      idx = sname.indexOf(jname);
+      idxURI = sname.indexOf(uriname);
+      if (idx == 0 || idxURI == 0) {
+        app = item;
+        return app;
+      }
+      if (sapp.applist != null) {
+        app = this.getApp(name,sapp.applist);
+        if (app != null) {
+          return app;
+        }
+      }
+    }
+    return null;
+  }
 }
 
 export class StrudelappInstance {
diff --git a/src/app/strudelapps.service.spec.ts b/src/app/strudelapps.service.spec.ts
deleted file mode 100644
index b374223071bc090e8d58570f29002246870c617c..0000000000000000000000000000000000000000
--- a/src/app/strudelapps.service.spec.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { TestBed, inject } from '@angular/core/testing';
-
-import { StrudelappsService } from './strudelapps.service';
-
-describe('StrudelappsService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [StrudelappsService]
-    });
-  });
-
-  it('should be created', inject([StrudelappsService], (service: StrudelappsService) => {
-    expect(service).toBeTruthy();
-  }));
-});
diff --git a/src/app/strudelapps.service.ts b/src/app/strudelapps.service.ts
deleted file mode 100644
index bbb4c6e23a00e21cefe3eb6759e6628af19e351b..0000000000000000000000000000000000000000
--- a/src/app/strudelapps.service.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Injectable } from '@angular/core';
-import { Strudelapp } from './strudelapp';
-
-@Injectable({
-  providedIn: 'root',
-})
-export class StrudelappsService {
-
-  constructor() { }
-  getApp(name: string,applist: any): any {
-
-    var idx: number;
-    var app: any;
-    var sapp: Strudelapp;
-    app = applist[0];
-    for ( let item of applist) {
-      sapp = <Strudelapp>item;
-      //let sname = sapp.name.toLowerCase().replace(/\s/g, '');
-      //let jname = name.toLowerCase().replace(/\s/g, '');
-      let sname = sapp.name;
-      let jname = name;
-      idx = sname.indexOf(jname);
-      if (idx == 0) {
-        app = item;
-        return app;
-      }
-      if (sapp.applist != null) {
-        app = this.getApp(name,sapp.applist);
-        if (app != null) {
-          return app;
-        }
-      }
-    }
-    return null;
-  }
-
-  // getApp(name: string,applist: Strudelapp[]): Strudelapp {
-    /*getApp(name: string,applist: any): any {
-
-    var idx: number;
-    var app: any;
-    var sapp: Strudelapp;
-    app = applist[0];
-    for ( let item of applist) {
-      sapp = <Strudelapp>item;
-      let sname = sapp.name.toLowerCase().replace(/\s/g, '');
-      let jname = name.toLowerCase().replace(/\s/g, '');
-      idx = sname.indexOf(jname)
-      if (idx == 0) {
-        app = item;
-        return app;
-      }
-      if (sapp.applist != null) {
-        app = this.getApp(name,sapp.applist);
-        if (app != null) {
-          return app;
-        }
-      }
-    }
-    return null;
-  }*/
-
-}
diff --git a/src/app/warndialog/warndialog.component.html b/src/app/warndialog/warndialog.component.html
index fce81dddf8ee2d20efaa1aef0c740e83b4434f19..28ca05da5077601dd9271686bcaab7ca99a4bbca 100644
--- a/src/app/warndialog/warndialog.component.html
+++ b/src/app/warndialog/warndialog.component.html
@@ -1,8 +1,8 @@
-  <div *ngIf="data.name !== undefined && data.name !== null">
-  <h2>{{ data.name }} Running</h2>
-  It looks like you already connected to {{ data.name }}<br>
+  <div *ngIf="data.app !== undefined && data.app !== null">
+  <h2>{{ data.app.name }} Running</h2>
+  It looks like you already connected to {{ data.app.name }}<br>
   </div>
-  <div *ngIf="data.name === undefined || data.name === null">
+  <div *ngIf="data.app === undefined || data.app === null">
   <h2>Application Running</h2>
   It looks like you already connected to a Strudel2 Application<br>
   </div>
diff --git a/src/assets/config/authservers.json b/src/assets/config/authservers.json
index fa64b247ba6d3ed7a434c464a0b25401cf941fe8..6b2a022fb9f845b04f2918468600746bb058acd0 100644
--- a/src/assets/config/authservers.json
+++ b/src/assets/config/authservers.json
@@ -9,6 +9,18 @@
       "name": "CVL",
       "icon": null,
       "scope": "user:email",
+      "cafingerprint": "ECDSA SHA256:6wVXdokvvlTNcXPMc9KyvIXA8a8XNfLuhBfNOYeeMdg",
+      "desc": "<div>The Characterisation Virtual Laboratory remote desktop services are available here. The service provides software, data and compute for researchers in the Characterisation research community.  For CVL desktop researchers from MASSIVE see <a href=https://www.massive.org.au>https://www.massive.org.au</a> for more information.  For CVL desktop users from other infrastructures see <a href=https://www.cvl.org.au>https://www.cvl.org.au</a></div>"
+    },
+    {
+      "authorise": "http://localhost:5000/oauth2/oauth/authorize/choose",
+      "base": "http://localhost:5000/oauth2/",
+      "client_id": "Q96kt2Vtw6S78dpORktM81DH",
+      "sign": "http://localhost:5000/sign/monash_hpcid/api/v1/sign_key",
+      "logout": "http://localhost:5000/oauth2/logout",
+      "name": "Localhost",
+      "icon": null,
+      "scope": "user:email",
       "cafingerprint": "RSA SHA256:cmDxHrZQSPlBMUUcI/BWmruXho1XOzfXPDHSqVTwV2I",
       "desc": "<div>The Characterisation Virtual Laboratory remote desktop services are available here. The service provides software, data and compute for researchers in the Characterisation research community.  For CVL desktop researchers from MASSIVE see <a href=https://www.massive.org.au>https://www.massive.org.au</a> for more information.  For CVL desktop users from other infrastructures see <a href=https://www.cvl.org.au>https://www.cvl.org.au</a></div>"
     }
diff --git a/src/assets/config/computesites.json b/src/assets/config/computesites.json
index 0fa0fd98932c114a4fd095f5ca6d346d5b23c489..78548395de49ad826e27a90f82d2125b30f4752e 100644
--- a/src/assets/config/computesites.json
+++ b/src/assets/config/computesites.json
@@ -7,9 +7,9 @@
     "cafingerprint": "ECDSA SHA256:6wVXdokvvlTNcXPMc9KyvIXA8a8XNfLuhBfNOYeeMdg",
     "appCatalog": [],
     "appCatalogCmd": "/usr/local/strudel2_cluster/latest/bin/getapps",
-    "cancelcmd": "/usr/local/sv2/dev/scripts/bin/s2cancel {jobid}",
-    "statcmd": "/usr/local/sv2/dev/scripts/bin/s2stat",
-    "userhealth": "/usr/local/userhealth/0.0.2/bin/uijson",
+    "cancelcmd": "/usr/local/strudel2_cluster/latest/bin/s2cancel {jobid}",
+    "statcmd": "/usr/local/strudel2_cluster/latest/bin/s2stat",
+    "userhealth": "/usr/local/bin/uijson",
     "cacheturis": [],
     "contact": "<MASSIVE Support> help@massive.org.au"
   }
diff --git a/src/assets/config/m3apps.test.json b/src/assets/config/m3apps.test.json
index 868f53c7751fafd40aabb5a754a0124fed551984..b12b6fa77e46aa3a9c0db500aeac691da2da22a3 100644
--- a/src/assets/config/m3apps.test.json
+++ b/src/assets/config/m3apps.test.json
@@ -39,7 +39,7 @@
  {
    "url": null,
    "name": "Jupyter Lab",
-   "startscript": "#!/bin/bash\nmodule load singularity\nsingularity exec /usr/local/sv2/jupyter.sif /start",
+   "startscript": "#!/bin/bash\nmodule load singularity\nsingularity exec /usr/local/sv2/juflocu.sif /start",
    "instactions": [ 
        {
            "name": "Connect",