diff --git a/core/installer/app_manager.go b/core/installer/app_manager.go
index 8bb072e..fbee783 100644
--- a/core/installer/app_manager.go
+++ b/core/installer/app_manager.go
@@ -83,7 +83,7 @@
 
 func (m *AppManager) GetAllInstances() ([]AppInstanceConfig, error) {
 	m.repo.Pull()
-	kust, err := soft.ReadKustomization(m.repo, filepath.Join(m.appDirRoot, "kustomization.yaml"))
+	kust, err := soft.ReadKustomization(m.repo, filepath.Join(m.appDirRoot, kustomizationFileName))
 	if err != nil {
 		if errors.Is(err, fs.ErrNotExist) {
 			return nil, nil
@@ -103,7 +103,7 @@
 }
 
 func (m *AppManager) GetAllAppInstances(name string) ([]AppInstanceConfig, error) {
-	kust, err := soft.ReadKustomization(m.repo, filepath.Join(m.appDirRoot, "kustomization.yaml"))
+	kust, err := soft.ReadKustomization(m.repo, filepath.Join(m.appDirRoot, kustomizationFileName))
 	if err != nil {
 		if errors.Is(err, fs.ErrNotExist) {
 			return nil, nil
@@ -269,7 +269,7 @@
 func createKustomizationChain(r soft.RepoFS, path string) error {
 	for p := filepath.Clean(path); p != "/"; {
 		parent, child := filepath.Split(p)
-		kustPath := filepath.Join(parent, "kustomization.yaml")
+		kustPath := filepath.Join(parent, kustomizationFileName)
 		kust, err := soft.ReadKustomization(r, kustPath)
 		if err != nil {
 			if errors.Is(err, fs.ErrNotExist) {
@@ -350,7 +350,7 @@
 				return err
 			}
 			for name, contents := range data {
-				if name == "config.json" || name == "kustomization.yaml" || name == "resources" {
+				if name == "config.json" || name == kustomizationFileName || name == "resources" {
 					return fmt.Errorf("%s is forbidden", name)
 				}
 				w, err := r.Writer(path.Join(appDir, name))
@@ -382,7 +382,7 @@
 					return err
 				}
 			}
-			if err := soft.WriteYaml(r, path.Join(resourcesDir, "kustomization.yaml"), appKust); err != nil {
+			if err := soft.WriteYaml(r, path.Join(resourcesDir, kustomizationFileName), appKust); err != nil {
 				return err
 			}
 			return nil
@@ -699,7 +699,7 @@
 				break
 			}
 			n := filepath.Base(curr)
-			kustPath := filepath.Join(p, "kustomization.yaml")
+			kustPath := filepath.Join(p, kustomizationFileName)
 			kust, err := soft.ReadKustomization(r, kustPath)
 			if err != nil {
 				return "", err
@@ -729,13 +729,14 @@
 	}
 	for vmName, vmCfg := range cfg.Out.VM {
 		if vmCfg.VPN.Enabled {
-			if err := m.vpnAPIClient.ExpireNode(vmCfg.Username, vmName); err != nil {
+			// Not found error is ignored as VM might have not had enough time to boot before uninstalling it.
+			if err := m.vpnAPIClient.ExpireNode(vmCfg.Username, vmName); err != nil && !errors.Is(err, ErrorNotFound) {
 				return err
 			}
 			if err := m.vpnAPIClient.ExpireKey(vmCfg.Username, vmCfg.VPN.AuthKey); err != nil {
 				return err
 			}
-			if err := m.vpnAPIClient.RemoveNode(vmCfg.Username, vmName); err != nil {
+			if err := m.vpnAPIClient.RemoveNode(vmCfg.Username, vmName); err != nil && !errors.Is(err, ErrorNotFound) {
 				return err
 			}
 		}
@@ -934,7 +935,7 @@
 }
 
 func (m *InfraAppManager) FindInstance(id string) (InfraAppInstanceConfig, error) {
-	kust, err := soft.ReadKustomization(m.repoIO, filepath.Join("/infrastructure", "kustomization.yaml"))
+	kust, err := soft.ReadKustomization(m.repoIO, filepath.Join("/infrastructure", kustomizationFileName))
 	if err != nil {
 		return InfraAppInstanceConfig{}, err
 	}
diff --git a/core/installer/soft/repoio.go b/core/installer/soft/repoio.go
index de2f75a..0d5f67f 100644
--- a/core/installer/soft/repoio.go
+++ b/core/installer/soft/repoio.go
@@ -209,7 +209,6 @@
 	if len(st) == 0 {
 		return "", nil // TODO(gio): maybe return ErrorNothingToCommit
 	}
-	fmt.Printf("@@@ %+v\n", st)
 	hash, err := wt.Commit(message, &git.CommitOptions{
 		Author: &object.Signature{
 			Name: "pcloud-installer",
@@ -229,7 +228,6 @@
 	if o.Force {
 		gopts.Force = true
 	}
-	fmt.Println(3333)
 	return hash.String(), r.repo.Push(gopts)
 }
 
@@ -261,7 +259,6 @@
 	if o.ToBranch != "" {
 		popts = append(popts, WithToBranch(o.ToBranch))
 	}
-	fmt.Println(2222)
 	return r.CommitAndPush(msg, popts...)
 }
 
diff --git a/core/installer/vpn.go b/core/installer/vpn.go
index beeb8e4..0176383 100644
--- a/core/installer/vpn.go
+++ b/core/installer/vpn.go
@@ -65,10 +65,11 @@
 	if err != nil {
 		return err
 	}
-	if resp.StatusCode != http.StatusOK {
-		var buf bytes.Buffer
-		io.Copy(&buf, resp.Body)
-		return errors.New(buf.String())
+	if resp.StatusCode == http.StatusOK {
+		return nil
+	}
+	if resp.StatusCode == http.StatusNotFound {
+		return ErrorNotFound
 	}
 	return nil
 }
@@ -82,10 +83,11 @@
 	if err != nil {
 		return err
 	}
-	if resp.StatusCode != http.StatusOK {
-		var buf bytes.Buffer
-		io.Copy(&buf, resp.Body)
-		return errors.New(buf.String())
+	if resp.StatusCode == http.StatusOK {
+		return nil
+	}
+	if resp.StatusCode == http.StatusNotFound {
+		return ErrorNotFound
 	}
 	return nil
 }
@@ -103,10 +105,11 @@
 	if err != nil {
 		return err
 	}
-	if resp.StatusCode != http.StatusOK {
-		var buf bytes.Buffer
-		io.Copy(&buf, resp.Body)
-		return errors.New(buf.String())
+	if resp.StatusCode == http.StatusOK {
+		return nil
+	}
+	if resp.StatusCode == http.StatusNotFound {
+		return ErrorNotFound
 	}
 	return nil
 }
