Index: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/CloudManagerClient.cs
===================================================================
--- branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/CloudManagerClient.cs	(revision 7429)
+++ branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/CloudManagerClient.cs	(revision 7433)
@@ -139,7 +139,11 @@
       }
       if (HostedServices.Contains(hostedService)) {
-        HostedServices.Remove(hostedService);
+        //HostedServices.Remove(hostedService);
+        HostedService hs = HostedServices[HostedServices.IndexOf(hostedService)];
+        hs.Merge(hostedService);
+
+      } else {
+        HostedServices.Add(hostedService);
       }
-      HostedServices.Add(hostedService);
     }
 
Index: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Model/Deployment.cs
===================================================================
--- branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Model/Deployment.cs	(revision 7429)
+++ branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Model/Deployment.cs	(revision 7433)
@@ -99,4 +99,9 @@
       //this.Modified = deployment.Modified;
       //this.NewInstanceCount = deployment.NewInstanceCount;
+
+      if (!this.Modified) {
+        this.Modified = deployment.Modified;
+        this.NewInstanceCount = deployment.NewInstanceCount;
+      }
     }
   }
Index: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Model/HostedService.cs
===================================================================
--- branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Model/HostedService.cs	(revision 7429)
+++ branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Model/HostedService.cs	(revision 7433)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Common;
@@ -61,4 +62,30 @@
       return new HostedService(this, cloner);
     }
+
+    public void Merge(HostedService hostedService) {
+      if (!this.Equals(hostedService)) {
+        throw new ArgumentException("Objects must be equal to be merged.", "subscription");
+      }
+      this.ServiceName = hostedService.ServiceName;
+      this.Url = hostedService.Url;
+      this.Subscription = hostedService.Subscription;
+      this.HostedServiceProperties = hostedService.HostedServiceProperties;
+
+      foreach (Deployment dep in hostedService.Deployments) {
+        int idx = this.Deployments.IndexOf(dep);
+        if (idx != -1) {
+          this.Deployments[idx].Merge(dep);
+        } else {
+          this.Deployments.Add(dep);
+        }
+      }
+
+      foreach (Deployment dep in this.Deployments) {
+        int idx = hostedService.Deployments.IndexOf(dep);
+        if (idx == -1) {
+          this.Deployments.Remove(dep);
+        }
+      }
+    }
   }
 }
Index: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/CloudResourcesView.cs
===================================================================
--- branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/CloudResourcesView.cs	(revision 7429)
+++ branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/CloudResourcesView.cs	(revision 7433)
@@ -101,28 +101,14 @@
         viewHost.Content = null;
         treeCloudResources.Nodes.Clear();
-      } else {
+      } else if (treeCloudResources.Nodes.Count == 0) {
         treeCloudResources.BeginUpdate();
-        treeCloudResources.Nodes.Clear();
+        //treeCloudResources.Nodes.Clear();
         foreach (Subscription sub in Content) {
-          TreeNode nodeSub = new TreeNode();
-          nodeSub.Tag = sub;
-          nodeSub.Text = sub.SubscriptionName;
-          nodeSub.ImageIndex = subscriptionImageIndex;
-          nodeSub.SelectedImageIndex = nodeSub.ImageIndex;
-
+          TreeNode nodeSub = GetTreeNode(sub, sub.SubscriptionName, subscriptionImageIndex);
           foreach (HostedService s in HostedServices) {
             if (s.Subscription.SubscriptionID == sub.SubscriptionID) {
-              TreeNode nodeServ = new TreeNode();
-              nodeServ.Tag = s;
-              nodeServ.Text = s.HostedServiceProperties.Label;
-              nodeServ.ImageIndex = serviceImageIndex;
-              nodeServ.SelectedImageIndex = nodeServ.ImageIndex;
-
+              TreeNode nodeServ = GetTreeNode(s, s.HostedServiceProperties.Label, serviceImageIndex);
               foreach (Deployment d in s.Deployments) {
-                TreeNode nodeDepl = new TreeNode();
-                nodeDepl.Tag = d;
-                nodeDepl.Text = d.Label + " (" + d.DeploymentSlot + ")";
-                nodeDepl.ImageIndex = deploymentImageIndex;
-                nodeDepl.SelectedImageIndex = nodeDepl.ImageIndex;
+                TreeNode nodeDepl = GetTreeNode(d, d.Label + " (" + d.DeploymentSlot + ")", deploymentImageIndex);
                 nodeServ.Nodes.Add(nodeDepl);
               }
@@ -133,5 +119,102 @@
         }
         treeCloudResources.EndUpdate();
-      }
+      } else {
+        treeCloudResources.BeginUpdate();
+        TreeNodeCollection tncSubs = treeCloudResources.Nodes;
+
+        // Delete treenodes that have no corresponding data in Content and HosteServices
+        foreach (TreeNode tnSub in tncSubs) {
+          Subscription s = (Subscription)tnSub.Tag;
+          int idx = Content.IndexOf(s);
+          if (idx == -1) {
+            tncSubs.Remove(tnSub);
+          } else {
+            TreeNodeCollection tncHS = tnSub.Nodes;
+            foreach (TreeNode tnHS in tncHS) {
+              HostedService hs = (HostedService)tnHS.Tag;
+              int idxHS = HostedServices.IndexOf(hs);
+              if (idxHS == -1) {
+                tncHS.Remove(tnHS);
+              } else {
+                TreeNodeCollection tncDep = tnHS.Nodes;
+                foreach (TreeNode tnDep in tncDep) {
+                  Deployment dep = (Deployment)tnDep.Tag;
+                  HostedService hsDep = HostedServices[idxHS];
+                  int idxDep = hsDep.Deployments.IndexOf(dep);
+                  if (idxDep == -1) {
+                    tncDep.Remove(tnDep);
+                  }
+                }
+              }
+            }
+          }
+        }
+
+        // Add missing treenodes
+        foreach (Subscription sub in Content) {
+          bool foundSub = false;
+          TreeNode foundSubNode = null;
+          foreach (TreeNode tnSub in treeCloudResources.Nodes) {
+            if (((Subscription)tnSub.Tag).Equals(sub)) {
+              foundSub = true;
+              foundSubNode = tnSub;
+            }
+          }
+          TreeNode nodeSub;
+          if (!foundSub) {
+            nodeSub = GetTreeNode(sub, sub.SubscriptionName, subscriptionImageIndex);
+            treeCloudResources.Nodes.Add(nodeSub);
+          } else {
+            nodeSub = foundSubNode;
+          }
+          foreach (HostedService s in HostedServices) {
+            if (s.Subscription.SubscriptionID == sub.SubscriptionID) {
+              bool foundHS = false;
+              TreeNode foundHSNode = null;
+              foreach (TreeNode tnHS in nodeSub.Nodes) {
+                if (((HostedService)tnHS.Tag).Equals(s)) {
+                  foundHS = true;
+                  foundHSNode = tnHS;
+                }
+              }
+              TreeNode nodeServ;
+              if (!foundHS) {
+                nodeServ = GetTreeNode(s, s.HostedServiceProperties.Label, serviceImageIndex);
+                nodeSub.Nodes.Add(nodeServ);
+              } else {
+                nodeServ = foundHSNode;
+              }
+              foreach (Deployment d in s.Deployments) {
+                bool foundDep = false;
+                TreeNode foundDepNode;
+                foreach (TreeNode tnDep in nodeServ.Nodes) {
+                  if (((Deployment)tnDep.Tag).Equals(d)) {
+                    foundDep = true;
+                    foundDepNode = tnDep;
+                  }
+                }
+                TreeNode nodeDepl;
+                if (!foundDep) {
+                  nodeDepl = GetTreeNode(d, d.Label + " (" + d.DeploymentSlot + ")", deploymentImageIndex);
+                  nodeServ.Nodes.Add(nodeDepl);
+                } else {
+                  // nothing to do
+                }
+              }
+            }
+          }
+        }
+        // ----------------------------
+        treeCloudResources.EndUpdate();
+      }
+    }
+
+    private TreeNode GetTreeNode(Object tag, string text, int imageIndex) {
+      TreeNode node = new TreeNode();
+      node.Tag = tag;
+      node.Text = text;
+      node.ImageIndex = imageIndex;
+      node.SelectedImageIndex = node.ImageIndex;
+      return node;
     }
 
Index: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/DeploymentView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/DeploymentView.Designer.cs	(revision 7429)
+++ branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/DeploymentView.Designer.cs	(revision 7433)
@@ -37,4 +37,5 @@
       this.label6 = new System.Windows.Forms.Label();
       this.txtInstanceCount = new System.Windows.Forms.TextBox();
+      this.lblChanges = new System.Windows.Forms.Label();
       ((System.ComponentModel.ISupportInitialize)(this.tbChangeCores)).BeginInit();
       this.SuspendLayout();
@@ -165,8 +166,18 @@
       this.txtInstanceCount.TabIndex = 12;
       // 
+      // lblChanges
+      // 
+      this.lblChanges.AutoSize = true;
+      this.lblChanges.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.lblChanges.Location = new System.Drawing.Point(127, 216);
+      this.lblChanges.Name = "lblChanges";
+      this.lblChanges.Size = new System.Drawing.Size(0, 13);
+      this.lblChanges.TabIndex = 13;
+      // 
       // DeploymentView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.lblChanges);
       this.Controls.Add(this.txtInstanceCount);
       this.Controls.Add(this.label6);
@@ -205,4 +216,5 @@
     private System.Windows.Forms.Label label6;
     private System.Windows.Forms.TextBox txtInstanceCount;
+    private System.Windows.Forms.Label lblChanges;
   }
 }
Index: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/DeploymentView.cs
===================================================================
--- branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/DeploymentView.cs	(revision 7429)
+++ branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/DeploymentView.cs	(revision 7433)
@@ -9,4 +9,5 @@
   [Content(typeof(Deployment), IsDefaultView = true)]
   public partial class DeploymentView : ItemView {
+    private const string SaveChangesString = "Save changes to take effect.";
     public new Deployment Content {
       get { return (Deployment)base.Content; }
@@ -42,5 +43,10 @@
         tbChangeCores.Minimum = 1;
         tbChangeCores.Maximum = Content.Subscription.MaxCoreCount;
-        tbChangeCores.Value = Content.RoleInstanceList.Count;
+        if (Content.Modified) {
+          tbChangeCores.Value = Content.NewInstanceCount;
+          lblChanges.Text = SaveChangesString;
+        } else {
+          tbChangeCores.Value = Content.RoleInstanceList.Count;
+        }
 
         txtCoresUsed.Text = (tbChangeCores.Value * GetCoresFromInstanceSize(txtInstanceSize.Text)).ToString();
@@ -55,4 +61,14 @@
       int cores = tbValue * (int)size;
       txtCoresUsed.Text = cores.ToString();
+
+      if (Content.RoleInstanceList.Count != tbValue) {
+        Content.Modified = true;
+        lblChanges.Text = SaveChangesString;
+      } else {
+        Content.Modified = false;
+        lblChanges.Text = string.Empty;
+      }
+
+      Content.NewInstanceCount = tbValue;
     }
 
