diff --git a/core/installer/server/appmanager/server.go b/core/installer/server/appmanager/server.go
index 80f076a..e0aeab2 100644
--- a/core/installer/server/appmanager/server.go
+++ b/core/installer/server/appmanager/server.go
@@ -39,21 +39,20 @@
 }
 
 type Server struct {
-	l             sync.Locker
-	port          int
-	ssClient      soft.Client
-	repo          soft.RepoIO
-	m             *installer.AppManager
-	r             installer.AppRepository
-	fr            installer.AppRepository
-	reconciler    *tasks.FixedReconciler
-	h             status.ResourceMonitor
-	im            *status.InstanceMonitor
-	cnc           installer.ClusterNetworkConfigurator
-	vpnAPIClient  installer.VPNAPIClient
-	tasks         map[string]*taskForward
-	tmpl          tmplts
-	idToResources map[string]map[string][]status.Resource
+	l            sync.Locker
+	port         int
+	ssClient     soft.Client
+	repo         soft.RepoIO
+	m            *installer.AppManager
+	r            installer.AppRepository
+	fr           installer.AppRepository
+	reconciler   *tasks.FixedReconciler
+	h            status.ResourceMonitor
+	im           *status.InstanceMonitor
+	cnc          installer.ClusterNetworkConfigurator
+	vpnAPIClient installer.VPNAPIClient
+	tasks        map[string]*taskForward
+	tmpl         tmplts
 }
 
 type tmplts struct {
@@ -117,21 +116,20 @@
 		return nil, err
 	}
 	return &Server{
-		l:             &sync.Mutex{},
-		port:          port,
-		ssClient:      ssClient,
-		repo:          repo,
-		m:             m,
-		r:             r,
-		fr:            fr,
-		reconciler:    reconciler,
-		h:             h,
-		im:            im,
-		cnc:           cnc,
-		vpnAPIClient:  vpnAPIClient,
-		tasks:         make(map[string]*taskForward),
-		tmpl:          tmpl,
-		idToResources: make(map[string]map[string][]status.Resource),
+		l:            &sync.Mutex{},
+		port:         port,
+		ssClient:     ssClient,
+		repo:         repo,
+		m:            m,
+		r:            r,
+		fr:           fr,
+		reconciler:   reconciler,
+		h:            h,
+		im:           im,
+		cnc:          cnc,
+		vpnAPIClient: vpnAPIClient,
+		tasks:        make(map[string]*taskForward),
+		tmpl:         tmpl,
 	}, nil
 }
 
@@ -213,24 +211,12 @@
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	} else {
-		var toMonitor []status.Resource
-		s.idToResources[instanceId] = map[string][]status.Resource{}
-		for _, r := range rr.Helm {
-			resource := status.Resource{
-				Type: status.ResourceHelmRelease,
-				ResourceRef: status.ResourceRef{
-					Name:      r.Name,
-					Namespace: r.Namespace,
-				},
-			}
-			toMonitor = append(toMonitor, resource)
-			if tmp, ok := s.idToResources[instanceId][r.Id]; ok {
-				s.idToResources[instanceId][r.Id] = append(tmp, resource)
-			} else {
-				s.idToResources[instanceId][r.Id] = []status.Resource{resource}
-			}
+		outs, err := status.DecodeResourceOuts(rr.RenderedRaw)
+		if err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
-		s.im.Monitor(instanceId, toMonitor)
+		s.im.Monitor(instanceId, outs)
 		var cfg dodoAppRendered
 		if err := json.NewDecoder(bytes.NewReader(rr.RenderedRaw)).Decode(&cfg); err != nil {
 			http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -278,25 +264,14 @@
 	rr, err := s.m.Update(instanceId, nil, overrides)
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
-	var toMonitor []status.Resource
-	s.idToResources[instanceId] = map[string][]status.Resource{}
-	for _, r := range rr.Helm {
-		resource := status.Resource{
-			Type: status.ResourceHelmRelease,
-			ResourceRef: status.ResourceRef{
-				Name:      r.Name,
-				Namespace: r.Namespace,
-			},
-		}
-		toMonitor = append(toMonitor, resource)
-		if tmp, ok := s.idToResources[instanceId][r.Id]; ok {
-			s.idToResources[instanceId][r.Id] = append(tmp, resource)
-		} else {
-			s.idToResources[instanceId][r.Id] = []status.Resource{resource}
-		}
+	outs, err := status.DecodeResourceOuts(rr.RenderedRaw)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
-	s.im.Monitor(instanceId, toMonitor)
+	s.im.Monitor(instanceId, outs)
 	t := tasks.NewInstallTask(s.h, func() (installer.ReleaseResources, error) {
 		if err == nil {
 			ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
@@ -767,68 +742,6 @@
 	return ret
 }
 
-type IdName struct {
-	Id   string
-	Name string
-}
-
-type IdNameMap map[string]IdName
-
-type resourceOuts struct {
-	Outs map[string]struct {
-		PostgreSQL IdNameMap `json:"postgresql"`
-		MongoDB    IdNameMap `json:"mongodb"`
-		Volume     IdNameMap `json:"volume"`
-		Ingress    IdNameMap `json:"ingress"`
-	} `json:"outs"`
-}
-
-type DodoResource struct {
-	Type string
-	Name string
-}
-
-type DodoResourceStatus struct {
-	Type   string `json:"type"`
-	Name   string `json:"name"`
-	Status string `json:"status"`
-}
-
-func orginize(raw []byte) (map[string]DodoResource, error) {
-	var outs resourceOuts
-	if err := json.NewDecoder(bytes.NewReader(raw)).Decode(&outs); err != nil {
-		return nil, err
-	}
-	ret := map[string]DodoResource{}
-	for _, out := range outs.Outs {
-		for _, r := range out.PostgreSQL {
-			ret[r.Id] = DodoResource{
-				Type: "postgresql",
-				Name: r.Name,
-			}
-		}
-		for _, r := range out.MongoDB {
-			ret[r.Id] = DodoResource{
-				Type: "mongodb",
-				Name: r.Name,
-			}
-		}
-		for _, r := range out.Volume {
-			ret[r.Id] = DodoResource{
-				Type: "volume",
-				Name: r.Name,
-			}
-		}
-		for _, r := range out.Ingress {
-			ret[r.Id] = DodoResource{
-				Type: "ingress",
-				Name: r.Name,
-			}
-		}
-	}
-	return ret, nil
-}
-
 func (s *Server) handleInstanceStatusAPI(w http.ResponseWriter, r *http.Request) {
 	s.l.Lock()
 	defer s.l.Unlock()
@@ -842,36 +755,15 @@
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	idStatus := map[string]status.Status{}
-	for id, resources := range s.idToResources[instanceId] {
-		st := status.StatusNoStatus
-		for _, resource := range resources {
-			if st < statuses[resource] {
-				st = statuses[resource]
-			}
-		}
-		idStatus[id] = st
-	}
-	s.repo.Pull()
-	rendered, err := s.m.AppRendered(instanceId)
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-		return
-	}
-	idToResource, err := orginize(rendered)
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-		return
-	}
-	resources := []DodoResourceStatus{}
-	for id, st := range idStatus {
-		resources = append(resources, DodoResourceStatus{
-			Type:   idToResource[id].Type,
-			Name:   idToResource[id].Name,
-			Status: status.StatusString(st),
+	ret := []resourceStatus{}
+	for r, s := range statuses {
+		ret = append(ret, resourceStatus{
+			Type:   r.Type,
+			Name:   r.Name,
+			Status: status.StatusString(s),
 		})
 	}
-	json.NewEncoder(w).Encode(resources)
+	json.NewEncoder(w).Encode(ret)
 }
 
 type clustersData struct {
