diff --git a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/LoginWindow.java b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/LoginWindow.java
index 220bca4..b9e813a 100644
--- a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/LoginWindow.java
+++ b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/LoginWindow.java
@@ -18,6 +18,9 @@
  */
 package org.apache.ace.webui.vaadin;
 
+import static org.osgi.service.log.LogService.LOG_INFO;
+import static org.osgi.service.log.LogService.LOG_WARNING;
+
 import java.util.Map;
 
 import org.osgi.service.log.LogService;
@@ -40,7 +43,7 @@
  */
 public class LoginWindow extends Window {
     /**
-     *  
+     *
      */
     public static interface LoginFunction {
         boolean login(String name, String password);
@@ -53,7 +56,7 @@
 
     /**
      * Creates a new {@link LoginWindow} instance.
-     * 
+     *
      * @param log
      *            the log service to use;
      * @param loginFunction
@@ -109,12 +112,12 @@
                     String password = (String) passwordField.getValue();
 
                     if (m_loginFunction.login(username, password)) {
-                        m_log.log(LogService.LOG_INFO, "Apache Ace WebUI succesfull login by user: " + username);
+                        m_log.log(LOG_INFO, "Apache Ace WebUI succesfull login by user: " + username);
 
                         closeWindow();
                     }
                     else {
-                        m_log.log(LogService.LOG_WARNING, "Apache Ace WebUI invalid username or password entered.");
+                        m_log.log(LOG_WARNING, "Apache Ace WebUI invalid username or password entered.");
 
                         m_additionalInfo.setValue("Invalid username or password!");
 
@@ -145,7 +148,7 @@
 
     /**
      * Shows this login window on screen.
-     * 
+     *
      * @param parent
      *            the parent window, cannot be <code>null</code>.
      */
diff --git a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
index 2cdc630..59a8471 100644
--- a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
+++ b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
@@ -106,7 +106,6 @@
 /**
  * Main application entry point.
  */
-@SuppressWarnings("serial")
 public class VaadinClient extends com.vaadin.Application implements AssociationManager, LoginFunction {
 
     // basic session ID generator
@@ -116,7 +115,7 @@
 
     /**
      * Remove the given directory and all it's files and subdirectories
-     * 
+     *
      * @param directory
      *            the name of the directory to remove
      */
@@ -202,9 +201,9 @@
 
     /**
      * Creates a new {@link VaadinClient} instance.
-     * 
+     *
      * @param m_manager2
-     * 
+     *
      * @param aceHost
      *            the hostname where the management service can be reached;
      * @param obrUrl
@@ -470,7 +469,7 @@
 
     /**
      * Create a new distribution in the distribution repository
-     * 
+     *
      * @param name
      *            the name of the new distribution;
      * @param description
@@ -486,7 +485,7 @@
 
     /**
      * Create a new feature in the feature repository.
-     * 
+     *
      * @param name
      *            the name of the new feature;
      * @param description
@@ -502,7 +501,7 @@
 
     /**
      * Create a new target in the stateful target repository.
-     * 
+     *
      * @param name
      *            the name of the new target;
      */
@@ -573,9 +572,9 @@
 
     /**
      * Create a button to show a pop window for adding new features.
-     * 
+     *
      * @param user
-     * 
+     *
      * @param main
      *            Main Window
      * @return Button
@@ -594,9 +593,9 @@
     /**
      * Create a button to show a popup window for adding a new distribution. On success this calls the
      * createDistribution() method.
-     * 
+     *
      * @param user
-     * 
+     *
      * @return the add-distribution button instance.
      */
     private Button createAddDistributionButton() {
@@ -624,9 +623,9 @@
 
     /***
      * Create a button to show popup window for adding a new feature. On success this calls the createFeature() method.
-     * 
+     *
      * @param user
-     * 
+     *
      * @return the add-feature button instance.
      */
     private Button createAddFeatureButton() {
@@ -653,9 +652,9 @@
 
     /**
      * Create a button to show a popup window for adding a new target. On success this calls the createTarget() method
-     * 
+     *
      * @param user
-     * 
+     *
      * @return the add-target button instance.
      */
     private Button createAddTargetButton() {
@@ -977,6 +976,11 @@
                 return m_admin;
             }
 
+            @Override
+            protected void log(int level, String msg, Exception e, Object... args) {
+                m_log.log(level, String.format(msg, args), e);
+            }
+
             private void updateTableData() {
                 m_artifactsPanel.populate();
                 m_featuresPanel.populate();
@@ -990,7 +994,7 @@
 
     /**
      * Authenticates the given user by creating all dependent services.
-     * 
+     *
      * @param user
      * @throws IOException
      *             in case of I/O problems.
@@ -1010,9 +1014,10 @@
             // @formatter:on
 
             m_admin.login(context);
-            initGrid();
             m_admin.checkout();
 
+            initGrid();
+
             return true;
         }
         catch (Exception e) {
diff --git a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
index 4002af1..8e07c6a 100644
--- a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
+++ b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
@@ -18,6 +18,9 @@
  */
 package org.apache.ace.webui.vaadin.component;
 
+import static org.osgi.service.log.LogService.LOG_ERROR;
+import static org.osgi.service.log.LogService.LOG_WARNING;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -87,7 +90,7 @@
 
         /**
          * Does the actual logout of the user.
-         * 
+         *
          * @throws IOException
          *             in case of I/O problems during the logout.
          */
@@ -140,7 +143,7 @@
 
         /**
          * Does the actual retrieval of the latest version.
-         * 
+         *
          * @throws IOException
          *             in case of I/O problems during the retrieve.
          */
@@ -193,7 +196,7 @@
 
         /**
          * Does the actual revert of changes.
-         * 
+         *
          * @throws IOException
          *             in case of problems during I/O exception.
          */
@@ -234,7 +237,7 @@
 
         /**
          * Does the actual commit of changes.
-         * 
+         *
          * @throws IOException
          *             in case of I/O problems during the commit.
          */
@@ -256,10 +259,10 @@
 
     /**
      * Creates a new {@link MainActionToolbar} instance.
-     * 
+     *
      * @param user
      * @param manager
-     * 
+     *
      * @param showLogoutButton
      *            <code>true</code> if a logout button should be shown, <code>false</code> if it should not.
      */
@@ -317,28 +320,28 @@
 
     /**
      * Called after a commit/store has taken place, allows additional UI-updates to be performed.
-     * 
+     *
      * @throws IOException
      */
     protected abstract void doAfterCommit() throws IOException;
 
     /**
      * Called after a logout has taken place, allows additional UI-updates to be performed.
-     * 
+     *
      * @throws IOException
      */
     protected abstract void doAfterLogout() throws IOException;
 
     /**
      * Called after a retrieve has taken place, allows additional UI-updates to be performed.
-     * 
+     *
      * @throws IOException
      */
     protected abstract void doAfterRetrieve() throws IOException;
 
     /**
      * Called after a revert has taken place, allows additional UI-updates to be performed.
-     * 
+     *
      * @throws IOException
      */
     protected abstract void doAfterRevert() throws IOException;
@@ -375,8 +378,7 @@
         component.add(dm.createServiceDependency()
             .setService(UIExtensionFactory.class, "(" + UIExtensionFactory.EXTENSION_POINT_KEY + "=" + UIExtensionFactory.EXTENSION_POINT_VALUE_MENU + ")")
             .setCallbacks("add", "remove")
-            .setRequired(false)
-        );
+            .setRequired(false));
     }
 
     protected final void remove(ServiceReference<UIExtensionFactory> ref, UIExtensionFactory factory) {
@@ -393,13 +395,21 @@
         else {
             sb.append("<br/>unknown error!");
         }
+        log(LOG_ERROR, message, e);
         getWindow().showNotification(title, sb.toString(), Notification.TYPE_ERROR_MESSAGE);
     }
 
     protected void showWarning(String title, String message) {
+        log(LOG_WARNING, message);
         getWindow().showNotification(title, String.format("<br/>%s", message), Notification.TYPE_WARNING_MESSAGE);
     }
 
+    protected final void log(int level, String msg, Object... args) {
+        log(level, msg, null, args);
+    }
+
+    protected abstract void log(int level, String msg, Exception e, Object... args);
+
     private void addCrossPlatformShortcut(Button button, int key, String description) {
         // ACE-427 - NPE when using getMainWindow() if no authentication is used...
         WebApplicationContext context = (WebApplicationContext) getApplication().getContext();
diff --git a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/StatusLine.java b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/StatusLine.java
index e6f57e2..fbc7665 100644
--- a/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/StatusLine.java
+++ b/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/StatusLine.java
@@ -36,7 +36,6 @@
 /**
  * Denotes a status line in which a short summary of the latest actions in the UI are displayed.
  */
-@SuppressWarnings("unchecked")
 public class StatusLine extends Label implements EventHandler {
 
     /**
@@ -52,22 +51,25 @@
         RepositoryObject entity = (RepositoryObject) event.getProperty(RepositoryObject.EVENT_ENTITY);
 
         String type = getType(topic);
+        if (type == null) {
+            // Nothing to do...
+            return;
+        }
+
         String action = getAction(topic);
         String name = getName(entity);
 
-        if (type != null) {
-            if (name != null) {
-                setStatus("%s '%s' %s...", type, name, action);
-            }
-            else if (action != null) {
-                setStatus("%s %s...", type, action);
-            }
+        if (name != null && action != null) {
+            setStatus("%s '%s' %s...", type, name, action);
+        }
+        else if (action != null) {
+            setStatus("%s %s...", type, action);
         }
     }
 
     /**
      * Sets the status to the given message.
-     * 
+     *
      * @param msg
      *            the message;
      * @param args
@@ -82,15 +84,23 @@
      * @return
      */
     private String getAction(String topic) {
-        if (topic.endsWith("/" + RepositoryObject.TOPIC_REMOVED_SUFFIX)) {
+        if (topic.endsWith("/REMOVED")) {
             return "removed";
         }
-        else if (topic.endsWith("/" + RepositoryObject.TOPIC_ADDED_SUFFIX)) {
+        else if (topic.endsWith("/ADDED")) {
             return "added";
         }
-        else if (topic.endsWith("/" + RepositoryObject.TOPIC_CHANGED_SUFFIX)) {
+        else if (topic.endsWith("/CHANGED")) {
             return "changed";
         }
+        else if (topic.endsWith("/STATUS_CHANGED")) {
+            // for stateful target objects only...
+            return "status updated";
+        }
+        else if (topic.endsWith("/AUDITEVENTS_CHANGED")) {
+            // for stateful target objects only...
+            return "audit log updated";
+        }
         return null;
     }
 
