diff --git a/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml b/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml
index 497fc1c22784cbdff6467d4f932110a88694f73c..e308d987a39235eaaf2ae7802d9e3340f8e677b9 100644
--- a/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml
+++ b/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml
@@ -15,7 +15,7 @@
 #    under the License.
 nsd:
   nsd:
-  - description: Virtual Desktop Computer with Xubuntu Desktop and RDP
+  - description: Virtual Desktop Computer with Mate Desktop and RDP
     designer: OSM
     df:
     - id: default-df
diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml
index 867b12fb7529627480b3ecf66786f510becf471a..e4b157ae1c0dfd901e05a717309ca3420171b6fe 100644
--- a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml
+++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml
@@ -15,6 +15,26 @@ add-package:
   required:
     - package
 
+add-snap:
+  description: "Adds software packages from snap store."
+  params:
+    package:
+      description: "Names of packages to add, comma delimited."
+      type: string
+      default: ""
+  required:
+    - package
+
+announce:
+  description: "Sends a message to logged in users"
+  params:
+    message:
+      description: "Message to send"
+      type: string
+      default: ""
+  required:
+    - message
+
 reboot:
   description: "Reboots the server."
 
@@ -28,6 +48,16 @@ remove-package:
   required:
     - package
 
+remove-snap:
+  description: "Adds software packages from snap store."
+  params:
+    package:
+      description: "Names of packages to add, comma delimited."
+      type: string
+      default: ""
+  required:
+    - package
+
 update-system:
   description: "Updates all software to latest version."
 
diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py
index 579645795e3905e00db0ba2cf98c96e7906e44cd..e8581175cee7e2876563eb60f75bc2620dc36181 100755
--- a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py
+++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py
@@ -20,7 +20,9 @@ from utils import (
     service_stop,
     service_restart,
     install_apt,
+    remove_apt,
     shell,
+    upgrade_apt,
 )
 
 
@@ -31,16 +33,19 @@ APT_PROXY_PATH = "/etc/apt/apt.conf.d/99-HIVE-apt-proxy"
 APT_PROXY_TEMPLATE = "./templates/proxy"
 APT_REQUIREMENTS = [
     "firefox",
-    "mate-desktop",  # 469 packages
+    "indicator-applet-session",
+    "libnotify-bin",
+    "mate-desktop",
     "mate-applets",
     "mate-applet-brisk-menu",
     "mate-indicator-applet",
+    "mate-notification-daemon",
     "mate-session-manager",
     "mate-terminal",
     "xrdp",
 ]
 SNAP_INSTALLS = [
-    "code --classic",
+    #"code --classic",
 ]
 POLKIT_TEMPLATE = "./templates/color.pkla"
 POLKIT_PATH = "/etc/polkit-1/localauthority/50-local.d/color.pkla"
@@ -69,8 +74,11 @@ class VirtualPCCharm(CharmBase, InstallProgress):
 
         # Actions hooks
         self.framework.observe(self.on["add-package"].action, self._add_package)
+        self.framework.observe(self.on["add-snap"].action, self._add_snap)
+        self.framework.observe(self.on["announce"].action, self._announce)
         self.framework.observe(self.on["reboot"].action, self._reboot)
         self.framework.observe(self.on["remove-package"].action, self._remove_package)
+        self.framework.observe(self.on["remove-snap"].action, self._remove_snap)
         self.framework.observe(self.on["update-system"].action, self._update_system)
 
         # Relations hooks
@@ -116,6 +124,7 @@ class VirtualPCCharm(CharmBase, InstallProgress):
                 polkit.write(content)
 
         self._stored.installed = True
+        self.unit.status = self._get_current_status()
 
     def _on_start(self, _):
         self.unit.status = MaintenanceStatus("Starting XRDP server")
@@ -135,25 +144,44 @@ class VirtualPCCharm(CharmBase, InstallProgress):
         self.unit.status = self._get_current_status()
 
     # Action hooks
-    def _add_package(self, _):
+    def _add_package(self, event):
         self.unit.status = MaintenanceStatus("Installing apt packages")
         install_apt(packages=event.params["package"].split(','),
                     update=True, progress=self)
         self.unit.status = self._get_current_status()
 
+    def _add_snap(self, event):
+        self.unit.status = MaintenanceStatus("Installing snaps")
+        for snap in event.params["package"].split(','):
+            shell("sudo snap install " + snap)
+        self.unit.status = self._get_current_status()
+
+    def _announce(self, event):
+        self.unit.status = MaintenanceStatus("Announce")
+        shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"" + message + "\"'")
+        self.unit.status = self._get_current_status()
+
     def _reboot(self, _):
         self.unit.status = MaintenanceStatus("Rebooting server")
-        shell("reboot --reboot")
+        shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"System is going down for reboot in 60 seconds\" -u critical'")
+        shell("shutdown -r +1")
         self.unit.status = self._get_current_status()
 
-    def _remove_package(self, _):
+    def _remove_package(self, event):
         self.unit.status = MaintenanceStatus("Removing apt packages")
         remove_apt(packages=event.params["package"].split(','),
                    update=True, progress=self)
         self.unit.status = self._get_current_status()
 
+    def _remove_snap(self, event):
+        self.unit.status = MaintenanceStatus("Removing snaps")
+        for snap in event.params["package"].split(','):
+            shell("sudo snap remove" + snap)
+        self.unit.status = self._get_current_status()
+
     def _update_system(self, _):
         self.unit.status = MaintenanceStatus("Updating system")
+        upgrade_apt(update=True, progress=self)
         self.unit.status = self._get_current_status()
 
     # Relation hooks
diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py
index a8dce1bf65ca03fc7c4a0c6f4f781f4d155966b4..c2df3c225b902ed20107eecd8b894067af8831fe 100644
--- a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py
+++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py
@@ -19,7 +19,6 @@ def all_values_set(dictionary: Dict[str, str]) -> bool:
 
 
 def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn:
-
     cache = apt.cache.Cache()
     if update:
         cache.update()
@@ -31,16 +30,25 @@ def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn
     cache.commit(install_progress=progress)
 
 
-def remove_apt(packages: List, update: bool = False) -> NoReturn:
+def remove_apt(packages: List, update: bool = False, progress=None) -> NoReturn:
     cache = apt.cache.Cache()
     if update:
         cache.update()
     cache.open()
     for package in packages:
         pkg = cache[package]
-        if not pkg.is_installed:
+        if pkg.is_installed:
             pkg.mark_delete()
-    cache.commit()
+    cache.commit(install_progress=progress)
+
+
+def upgrade_apt(update: bool = False, progress=None) -> NoReturn:
+    cache = apt.cache.Cache()
+    if update:
+        cache.update()
+    cache.open()
+    cache.upgrade(dist_upgrade=True)
+    cache.commit(install_progress=progress)
 
 
 def shell(command: str) -> NoReturn:
diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml
index 867b12fb7529627480b3ecf66786f510becf471a..e4b157ae1c0dfd901e05a717309ca3420171b6fe 100644
--- a/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml
+++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml
@@ -15,6 +15,26 @@ add-package:
   required:
     - package
 
+add-snap:
+  description: "Adds software packages from snap store."
+  params:
+    package:
+      description: "Names of packages to add, comma delimited."
+      type: string
+      default: ""
+  required:
+    - package
+
+announce:
+  description: "Sends a message to logged in users"
+  params:
+    message:
+      description: "Message to send"
+      type: string
+      default: ""
+  required:
+    - message
+
 reboot:
   description: "Reboots the server."
 
@@ -28,6 +48,16 @@ remove-package:
   required:
     - package
 
+remove-snap:
+  description: "Adds software packages from snap store."
+  params:
+    package:
+      description: "Names of packages to add, comma delimited."
+      type: string
+      default: ""
+  required:
+    - package
+
 update-system:
   description: "Updates all software to latest version."
 
diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py
index 579645795e3905e00db0ba2cf98c96e7906e44cd..e8581175cee7e2876563eb60f75bc2620dc36181 100755
--- a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py
+++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py
@@ -20,7 +20,9 @@ from utils import (
     service_stop,
     service_restart,
     install_apt,
+    remove_apt,
     shell,
+    upgrade_apt,
 )
 
 
@@ -31,16 +33,19 @@ APT_PROXY_PATH = "/etc/apt/apt.conf.d/99-HIVE-apt-proxy"
 APT_PROXY_TEMPLATE = "./templates/proxy"
 APT_REQUIREMENTS = [
     "firefox",
-    "mate-desktop",  # 469 packages
+    "indicator-applet-session",
+    "libnotify-bin",
+    "mate-desktop",
     "mate-applets",
     "mate-applet-brisk-menu",
     "mate-indicator-applet",
+    "mate-notification-daemon",
     "mate-session-manager",
     "mate-terminal",
     "xrdp",
 ]
 SNAP_INSTALLS = [
-    "code --classic",
+    #"code --classic",
 ]
 POLKIT_TEMPLATE = "./templates/color.pkla"
 POLKIT_PATH = "/etc/polkit-1/localauthority/50-local.d/color.pkla"
@@ -69,8 +74,11 @@ class VirtualPCCharm(CharmBase, InstallProgress):
 
         # Actions hooks
         self.framework.observe(self.on["add-package"].action, self._add_package)
+        self.framework.observe(self.on["add-snap"].action, self._add_snap)
+        self.framework.observe(self.on["announce"].action, self._announce)
         self.framework.observe(self.on["reboot"].action, self._reboot)
         self.framework.observe(self.on["remove-package"].action, self._remove_package)
+        self.framework.observe(self.on["remove-snap"].action, self._remove_snap)
         self.framework.observe(self.on["update-system"].action, self._update_system)
 
         # Relations hooks
@@ -116,6 +124,7 @@ class VirtualPCCharm(CharmBase, InstallProgress):
                 polkit.write(content)
 
         self._stored.installed = True
+        self.unit.status = self._get_current_status()
 
     def _on_start(self, _):
         self.unit.status = MaintenanceStatus("Starting XRDP server")
@@ -135,25 +144,44 @@ class VirtualPCCharm(CharmBase, InstallProgress):
         self.unit.status = self._get_current_status()
 
     # Action hooks
-    def _add_package(self, _):
+    def _add_package(self, event):
         self.unit.status = MaintenanceStatus("Installing apt packages")
         install_apt(packages=event.params["package"].split(','),
                     update=True, progress=self)
         self.unit.status = self._get_current_status()
 
+    def _add_snap(self, event):
+        self.unit.status = MaintenanceStatus("Installing snaps")
+        for snap in event.params["package"].split(','):
+            shell("sudo snap install " + snap)
+        self.unit.status = self._get_current_status()
+
+    def _announce(self, event):
+        self.unit.status = MaintenanceStatus("Announce")
+        shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"" + message + "\"'")
+        self.unit.status = self._get_current_status()
+
     def _reboot(self, _):
         self.unit.status = MaintenanceStatus("Rebooting server")
-        shell("reboot --reboot")
+        shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"System is going down for reboot in 60 seconds\" -u critical'")
+        shell("shutdown -r +1")
         self.unit.status = self._get_current_status()
 
-    def _remove_package(self, _):
+    def _remove_package(self, event):
         self.unit.status = MaintenanceStatus("Removing apt packages")
         remove_apt(packages=event.params["package"].split(','),
                    update=True, progress=self)
         self.unit.status = self._get_current_status()
 
+    def _remove_snap(self, event):
+        self.unit.status = MaintenanceStatus("Removing snaps")
+        for snap in event.params["package"].split(','):
+            shell("sudo snap remove" + snap)
+        self.unit.status = self._get_current_status()
+
     def _update_system(self, _):
         self.unit.status = MaintenanceStatus("Updating system")
+        upgrade_apt(update=True, progress=self)
         self.unit.status = self._get_current_status()
 
     # Relation hooks
diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py
index a8dce1bf65ca03fc7c4a0c6f4f781f4d155966b4..c2df3c225b902ed20107eecd8b894067af8831fe 100644
--- a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py
+++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py
@@ -19,7 +19,6 @@ def all_values_set(dictionary: Dict[str, str]) -> bool:
 
 
 def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn:
-
     cache = apt.cache.Cache()
     if update:
         cache.update()
@@ -31,16 +30,25 @@ def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn
     cache.commit(install_progress=progress)
 
 
-def remove_apt(packages: List, update: bool = False) -> NoReturn:
+def remove_apt(packages: List, update: bool = False, progress=None) -> NoReturn:
     cache = apt.cache.Cache()
     if update:
         cache.update()
     cache.open()
     for package in packages:
         pkg = cache[package]
-        if not pkg.is_installed:
+        if pkg.is_installed:
             pkg.mark_delete()
-    cache.commit()
+    cache.commit(install_progress=progress)
+
+
+def upgrade_apt(update: bool = False, progress=None) -> NoReturn:
+    cache = apt.cache.Cache()
+    if update:
+        cache.update()
+    cache.open()
+    cache.upgrade(dist_upgrade=True)
+    cache.commit(install_progress=progress)
 
 
 def shell(command: str) -> NoReturn:
diff --git a/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml b/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml
index 78484dd737cab871ca565f3254e6d7e1a80a500c..511baf03fda4e2d659a2929fe83580dd6dfac05d 100644
--- a/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml
+++ b/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml
@@ -17,7 +17,7 @@ vnfd:
             ssh-access:
               default-user: ubuntu
               required: true
-          id: virtual-pc
+          id: hackfest_virtual-pc_vnf
           execution-environment-list:
           - id: virtual-pc-ee
             juju:
@@ -33,6 +33,16 @@ vnfd:
             parameter:
             - data-type: STRING
               name: package
+          - name: add-snap
+            execution-environment-ref: virtual-pc-ee
+            parameter:
+            - data-type: STRING
+              name: package
+          - name: announce
+            execution-environment-ref: virtual-pc-ee
+            parameter:
+            - data-type: STRING
+              name: message
           - name: reboot
             execution-environment-ref: virtual-pc-ee
           - name: remove-package
@@ -40,6 +50,11 @@ vnfd:
             parameter:
             - data-type: STRING
               name: package
+          - name: remove-snap
+            execution-environment-ref: virtual-pc-ee
+            parameter:
+            - data-type: STRING
+              name: package
           - name: update-system
             execution-environment-ref: virtual-pc-ee