2 commits - lib/kolab_sync_backend.php lib/kolab_sync_data.php lib/plugins

Aleksander Machniak machniak at kolabsys.com
Wed Feb 4 18:58:49 CET 2015


 lib/kolab_sync_backend.php                                     |    9 
 lib/kolab_sync_data.php                                        |   38 -
 lib/plugins/kolab_auth/composer.json                           |   30 +
 lib/plugins/kolab_auth/config.inc.php.dist                     |   55 +-
 lib/plugins/kolab_auth/kolab_auth.php                          |  166 +++++--
 lib/plugins/kolab_auth/kolab_auth_ldap.php                     |   12 
 lib/plugins/kolab_auth/localization/de_CH.inc                  |    7 
 lib/plugins/kolab_auth/localization/de_DE.inc                  |    8 
 lib/plugins/kolab_auth/localization/en_US.inc                  |    1 
 lib/plugins/kolab_auth/localization/fr_FR.inc                  |    8 
 lib/plugins/kolab_auth/localization/ja_JP.inc                  |    7 
 lib/plugins/kolab_auth/localization/nl_NL.inc                  |    7 
 lib/plugins/kolab_auth/localization/pl_PL.inc                  |    7 
 lib/plugins/kolab_auth/localization/ru_RU.inc                  |    8 
 lib/plugins/kolab_auth/package.xml                             |   63 --
 lib/plugins/kolab_folders/composer.json                        |   26 +
 lib/plugins/kolab_folders/config.inc.php.dist                  |   30 -
 lib/plugins/kolab_folders/kolab_folders.js                     |   40 -
 lib/plugins/kolab_folders/kolab_folders.php                    |   41 +
 lib/plugins/kolab_folders/localization/de_CH.inc               |    8 
 lib/plugins/kolab_folders/localization/de_DE.inc               |    8 
 lib/plugins/kolab_folders/localization/en_US.inc               |    1 
 lib/plugins/kolab_folders/localization/es_ES.inc               |   21 
 lib/plugins/kolab_folders/localization/et_EE.inc               |   25 +
 lib/plugins/kolab_folders/localization/fr_FR.inc               |    8 
 lib/plugins/kolab_folders/localization/ja_JP.inc               |    8 
 lib/plugins/kolab_folders/localization/nl_NL.inc               |    8 
 lib/plugins/kolab_folders/localization/pl_PL.inc               |    8 
 lib/plugins/kolab_folders/localization/ru_RU.inc               |    8 
 lib/plugins/kolab_folders/package.xml                          |   63 --
 lib/plugins/libkolab/SQL/mysql.initial.sql                     |   18 
 lib/plugins/libkolab/SQL/mysql/2014112700.sql                  |    2 
 lib/plugins/libkolab/SQL/mysql/2015011600.sql                  |    8 
 lib/plugins/libkolab/SQL/oracle.initial.sql                    |  184 +++++++
 lib/plugins/libkolab/SQL/oracle/2015011600.sql                 |   40 +
 lib/plugins/libkolab/bin/readcache.sh                          |  150 ++++++
 lib/plugins/libkolab/composer.json                             |    2 
 lib/plugins/libkolab/config.inc.php.dist                       |   27 -
 lib/plugins/libkolab/js/folderlist.js                          |  104 ++++
 lib/plugins/libkolab/lib/kolab_bonnie_api.php                  |    2 
 lib/plugins/libkolab/lib/kolab_format.php                      |  126 +++++
 lib/plugins/libkolab/lib/kolab_format_configuration.php        |   56 +-
 lib/plugins/libkolab/lib/kolab_format_event.php                |   12 
 lib/plugins/libkolab/lib/kolab_format_xcal.php                 |   11 
 lib/plugins/libkolab/lib/kolab_storage.php                     |   85 ++-
 lib/plugins/libkolab/lib/kolab_storage_cache.php               |  233 +++++++---
 lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php |   22 
 lib/plugins/libkolab/lib/kolab_storage_config.php              |  185 +++++++
 lib/plugins/libkolab/lib/kolab_storage_folder.php              |  138 +++++
 lib/plugins/libkolab/lib/kolab_storage_folder_api.php          |   37 +
 lib/plugins/libkolab/lib/kolab_storage_folder_user.php         |   34 +
 lib/plugins/libkolab/package.xml                               |  101 ----
 lib/plugins/managesieve/Changelog                              |   11 
 lib/plugins/managesieve/composer.json                          |    4 
 lib/plugins/managesieve/config.inc.php.dist                    |    2 
 lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php   |  103 ++--
 lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php   |   18 
 lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php |  222 +++++++--
 lib/plugins/managesieve/localization/ar_SA.inc                 |  155 ++++++
 lib/plugins/managesieve/localization/az_AZ.inc                 |    8 
 lib/plugins/managesieve/localization/be_BE.inc                 |    8 
 lib/plugins/managesieve/localization/bg_BG.inc                 |   29 -
 lib/plugins/managesieve/localization/bs_BA.inc                 |    5 
 lib/plugins/managesieve/localization/ca_ES.inc                 |   46 +
 lib/plugins/managesieve/localization/cs_CZ.inc                 |   40 +
 lib/plugins/managesieve/localization/cy_GB.inc                 |   44 +
 lib/plugins/managesieve/localization/da_DK.inc                 |   25 -
 lib/plugins/managesieve/localization/de_CH.inc                 |   44 +
 lib/plugins/managesieve/localization/de_DE.inc                 |   44 +
 lib/plugins/managesieve/localization/el_GR.inc                 |   55 ++
 lib/plugins/managesieve/localization/en_CA.inc                 |   29 -
 lib/plugins/managesieve/localization/en_GB.inc                 |   44 +
 lib/plugins/managesieve/localization/en_US.inc                 |    5 
 lib/plugins/managesieve/localization/es_419.inc                |    5 
 lib/plugins/managesieve/localization/es_AR.inc                 |    5 
 lib/plugins/managesieve/localization/es_ES.inc                 |   44 +
 lib/plugins/managesieve/localization/et_EE.inc                 |    8 
 lib/plugins/managesieve/localization/eu_ES.inc                 |   54 +-
 lib/plugins/managesieve/localization/fa_IR.inc                 |  124 +++--
 lib/plugins/managesieve/localization/fi_FI.inc                 |   79 +++
 lib/plugins/managesieve/localization/fr_FR.inc                 |  184 ++++---
 lib/plugins/managesieve/localization/gl_ES.inc                 |   26 -
 lib/plugins/managesieve/localization/he_IL.inc                 |   44 +
 lib/plugins/managesieve/localization/hr_HR.inc                 |   14 
 lib/plugins/managesieve/localization/hu_HU.inc                 |   44 +
 lib/plugins/managesieve/localization/id_ID.inc                 |    3 
 lib/plugins/managesieve/localization/it_IT.inc                 |   44 +
 lib/plugins/managesieve/localization/ja_JP.inc                 |   34 +
 lib/plugins/managesieve/localization/km_KH.inc                 |    9 
 lib/plugins/managesieve/localization/ko_KR.inc                 |  108 +++-
 lib/plugins/managesieve/localization/lt_LT.inc                 |   52 +-
 lib/plugins/managesieve/localization/lv_LV.inc                 |    8 
 lib/plugins/managesieve/localization/nb_NO.inc                 |   19 
 lib/plugins/managesieve/localization/nl_NL.inc                 |   44 +
 lib/plugins/managesieve/localization/pl_PL.inc                 |   44 +
 lib/plugins/managesieve/localization/pt_BR.inc                 |   44 +
 lib/plugins/managesieve/localization/pt_PT.inc                 |   44 +
 lib/plugins/managesieve/localization/ro_RO.inc                 |   33 +
 lib/plugins/managesieve/localization/ru_RU.inc                 |    5 
 lib/plugins/managesieve/localization/sk_SK.inc                 |   44 +
 lib/plugins/managesieve/localization/sl_SI.inc                 |    8 
 lib/plugins/managesieve/localization/sv_SE.inc                 |   48 +-
 lib/plugins/managesieve/localization/tr_TR.inc                 |   50 +-
 lib/plugins/managesieve/localization/uk_UA.inc                 |    8 
 lib/plugins/managesieve/localization/vi_VN.inc                 |   29 -
 lib/plugins/managesieve/localization/zh_CN.inc                 |    8 
 lib/plugins/managesieve/managesieve.js                         |    5 
 lib/plugins/managesieve/managesieve.php                        |   19 
 lib/plugins/managesieve/package.xml                            |  128 -----
 lib/plugins/managesieve/skins/larry/managesieve.css            |   11 
 lib/plugins/managesieve/tests/Managesieve.php                  |    2 
 lib/plugins/managesieve/tests/Parser.php                       |    4 
 lib/plugins/managesieve/tests/Tokenizer.php                    |    2 
 lib/plugins/managesieve/tests/Vacation.php                     |    4 
 114 files changed, 3504 insertions(+), 1235 deletions(-)

New commits:
commit 9ec1afd0a0c349a8a2c782f79ba97a84d3bcaeeb
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Wed Feb 4 12:00:44 2015 -0500

    Handle kolab_storage errors correctly (#4418)
    
    As we already found out (in #4378) kolab_storage did't prevent from sql errors
    if some imap connection error happened. This is already fixed, however
    syncroton need to use 'valid' flag implemented in kolab_storage_folder
    to pass correct error codes to activesync client and to prevent from more issues.

diff --git a/lib/kolab_sync_backend.php b/lib/kolab_sync_backend.php
index 56a411d..a1c24a8 100644
--- a/lib/kolab_sync_backend.php
+++ b/lib/kolab_sync_backend.php
@@ -790,7 +790,7 @@ class kolab_sync_backend
         // get all folders of specified type
         $folderdata = $this->folder_meta();
 
-        if (!is_array($folderdata)) {
+        if (!is_array($folderdata) || $id === null) {
             return null;
         }
 
@@ -802,10 +802,11 @@ class kolab_sync_backend
                 continue;
             }
 
-            $uid = self::folder_id($folder);
-            $this->folder_uids[$folder] = $uid;
+            if ($uid = self::folder_id($folder)) {
+                $this->folder_uids[$folder] = $uid;
+            }
 
-            if ($uid == $id) {
+            if ($uid === $id) {
                 $name = $folder;
             }
         }
diff --git a/lib/kolab_sync_data.php b/lib/kolab_sync_data.php
index 59bff31..ba09dd9 100644
--- a/lib/kolab_sync_data.php
+++ b/lib/kolab_sync_data.php
@@ -377,13 +377,12 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
 
         foreach ($folders as $folderid) {
             $foldername = $this->backend->folder_id2name($folderid, $this->device->deviceid);
+            $folder     = $this->getFolderObject($foldername);
 
-            if ($foldername === null) {
-                continue;
+            if (!$folder || !$folder->valid) {
+                throw new Syncroton_Exception_Status_ItemOperations(Syncroton_Exception_Status_ItemOperations::ITEM_SERVER_ERROR);
             }
 
-            $folder = $this->getFolderObject($foldername);
-
             // Remove all entries
             $folder->delete_all();
 
@@ -392,13 +391,12 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
                 $list = $this->listFolders($folderid);
                 foreach ($list as $folderid => $folder) {
                     $foldername = $this->backend->folder_id2name($folderid, $this->device->deviceid);
+                    $folder     = $this->getFolderObject($foldername);
 
-                    if ($foldername === null) {
-                        continue;
+                    if (!$folder || !$folder->valid) {
+                        throw new Syncroton_Exception_Status_ItemOperations(Syncroton_Exception_Status_ItemOperations::ITEM_SERVER_ERROR);
                     }
 
-                    $folder = $this->getFolderObject($foldername);
-
                     // Remove all entries
                     $folder->delete_all();
                 }
@@ -545,9 +543,10 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
 
         foreach ($folders as $folder_id) {
             $foldername = $this->backend->folder_id2name($folder_id, $this->device->deviceid);
+            $folder     = $this->getFolderObject($foldername);
 
-            if ($foldername === null || !($folder = $this->getFolderObject($foldername))) {
-                continue;
+            if (!$folder || !$folder->valid) {
+                throw new Syncroton_Exception_Status(Syncroton_Exception_Status::SERVER_ERROR);
             }
 
             $found++;
@@ -911,14 +910,9 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
 
         foreach ($folders as $folderid) {
             $foldername = $this->backend->folder_id2name($folderid, $this->device->deviceid);
+            $folder     = $this->getFolderObject($foldername);
 
-            if ($foldername === null) {
-                continue;
-            }
-
-            $folder = $this->getFolderObject($foldername);
-
-            if ($folder && ($object = $folder->get_object($entryid))) {
+            if ($folder && $folder->valid && ($object = $folder->get_object($entryid))) {
                 $object['_folderid'] = $folderid;
 
                 return $object;
@@ -950,7 +944,7 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
         $foldername = $this->backend->folder_id2name($folderid, $this->device->deviceid);
         $folder     = $this->getFolderObject($foldername);
 
-        if ($folder && $folder->save($data)) {
+        if ($folder && $folder->valid && $folder->save($data)) {
             if (!empty($tags)) {
                 $this->setKolabTags($data['uid'], $tags);
             }
@@ -975,7 +969,7 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
                 unset($data['categories']);
             }
 
-            if ($folder && $folder->save($data)) {
+            if ($folder && $folder->valid && $folder->save($data)) {
                 if (isset($tags)) {
                     $this->setKolabTags($data['uid'], $tags);
                 }
@@ -995,7 +989,7 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
         if ($object) {
             $folder = $this->getFolderObject($object['_mailbox']);
 
-            if ($folder && $folder->delete($entryid)) {
+            if ($folder && $folder->valid && $folder->delete($entryid)) {
                 if ($this->tag_categories) {
                     $this->setKolabTags($object['uid'], null);
                 }
@@ -1078,12 +1072,12 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
      */
     protected function getFolderObject($name)
     {
-        if ($name === null) {
+        if ($name === null || $name === '') {
             return null;
         }
 
         if (!isset($this->folders[$name])) {
-            $this->folders[$name] = kolab_storage::get_folder($name);
+            $this->folders[$name] = kolab_storage::get_folder($name, $this->modelName);
         }
 
         return $this->folders[$name];


commit e74dd441e5c64ea4dcd2db83f39b56f9ec1d1bfa
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Wed Feb 4 09:06:59 2015 -0500

    Update kolab plugins and managesieve plugin

diff --git a/lib/plugins/kolab_auth/composer.json b/lib/plugins/kolab_auth/composer.json
new file mode 100644
index 0000000..3e7012f
--- /dev/null
+++ b/lib/plugins/kolab_auth/composer.json
@@ -0,0 +1,30 @@
+{
+    "name": "kolab/kolab_auth",
+    "type": "roundcube-plugin",
+    "description": "Kolab authentication",
+    "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/",
+    "license": "AGPLv3",
+    "version": "3.2.2",
+    "authors": [
+        {
+            "name": "Thomas Bruederli",
+            "email": "bruederli at kolabsys.com",
+            "role": "Lead"
+        },
+        {
+            "name": "Aleksander Machniak",
+            "email": "machniak at kolabsys.com",
+            "role": "Lead"
+        }
+    ],
+    "repositories": [
+        {
+            "type": "composer",
+            "url": "http://plugins.roundcube.net"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0",
+        "roundcube/plugin-installer": ">=0.1.3"
+    }
+}
diff --git a/lib/plugins/kolab_auth/config.inc.php.dist b/lib/plugins/kolab_auth/config.inc.php.dist
index 785fb78..8c01d56 100644
--- a/lib/plugins/kolab_auth/config.inc.php.dist
+++ b/lib/plugins/kolab_auth/config.inc.php.dist
@@ -13,48 +13,55 @@
 //   With this %dc variable in base_dn and groups/base_dn will be
 //   replaced with DN string of resolved domain
 //---------------------------------------------------------------------
-$rcmail_config['kolab_auth_addressbook'] = '';
+$config['kolab_auth_addressbook'] = '';
 
 // This will overwrite defined filter
-$rcmail_config['kolab_auth_filter'] = '(&(objectClass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)(alias=%fu)))';
+$config['kolab_auth_filter'] = '(&(objectClass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)(alias=%fu)))';
 
-// Use this fields (from fieldmap configuration) to get authentication ID
-$rcmail_config['kolab_auth_login'] = 'email';
+// Use this field (from fieldmap configuration) to get authentication ID. Don't use an array here!
+$config['kolab_auth_login'] = 'email';
 
-// Use this fields (from fieldmap configuration) for default identity.
+// Use these fields (from fieldmap configuration) for default identity.
 // If the value array contains more than one field, first non-empty will be used
 // Note: These aren't LDAP attributes, but field names in config
 // Note: If there's more than one email address, as many identities will be created
-$rcmail_config['kolab_auth_name']         = array('name', 'cn');
-$rcmail_config['kolab_auth_email']        = array('email');
-$rcmail_config['kolab_auth_organization'] = array('organization');
+$config['kolab_auth_name']         = array('name', 'cn');
+$config['kolab_auth_email']        = array('email');
+$config['kolab_auth_organization'] = array('organization');
+
+// Role field (from fieldmap configuration)
+$config['kolab_auth_role'] = 'role';
 
 // Template for user names displayed in the UI.
 // You can use all attributes from the 'fieldmap' property of the 'kolab_auth_addressbook' configuration
-$rcmail_config['kolab_auth_user_displayname'] = '{name} ({ou})';
+$config['kolab_auth_user_displayname'] = '{name} ({ou})';
 
 // Login and password of the admin user. Enables "Login As" feature.
-$rcmail_config['kolab_auth_admin_login']    = '';
-$rcmail_config['kolab_auth_admin_password'] = '';
+$config['kolab_auth_admin_login']    = '';
+$config['kolab_auth_admin_password'] = '';
 
 // Enable audit logging for abuse of administrative privileges.
-$rcmail_config['kolab_auth_auditlog'] = false;
-
-// Role field (from fieldmap configuration)
-$rcmail_config['kolab_auth_role'] = 'role';
-// The required value for the role attribute to contain should the user be allowed
-// to login as another user.
-$rcmail_config['kolab_auth_role_value'] = '';
+$config['kolab_auth_auditlog'] = false;
 
-// Administrative group name to which user must be assigned to
-// which adds privilege to login as another user.
-$rcmail_config['kolab_auth_group'] = '';
+// As set of rules to define the required rights on the target entry
+// which allow an admin user to login as another user (the target).
+// The effective rights value refers to either entry level attribute level rights:
+//  * entry:[read|add|delete]
+//  * attrib:<attribute-name>:[read|write|delete]
+$config['kolab_auth_admin_rights'] = array(
+    // Roundcube task => required effective right
+    'settings'        => 'entry:read',
+    'mail'            => 'entry:delete',
+    'addressbook'     => 'entry:delete',
+    // or use a wildcard entry like this:
+    '*'               => 'entry:read',
+);
 
 // Enable plugins on a role-by-role basis. In this example, the 'acl' plugin
 // is enabled for people with a 'cn=professional-user,dc=mykolab,dc=ch' role.
 //
 // Note that this does NOT mean the 'acl' plugin is disabled for other people.
-$rcmail_config['kolab_auth_role_plugins'] = Array(
+$config['kolab_auth_role_plugins'] = Array(
         'cn=professional-user,dc=mykolab,dc=ch' => Array(
                 'acl',
             ),
@@ -66,7 +73,7 @@ $rcmail_config['kolab_auth_role_plugins'] = Array(
 // do not allow the setting to be controlled through the preferences, enable the
 // html editor for professional users and allow them to override the setting in
 // the preferences.
-$rcmail_config['kolab_auth_role_settings'] = Array(
+$config['kolab_auth_role_settings'] = Array(
         'cn=professional-user,dc=mykolab,dc=ch' => Array(
                 'htmleditor' => Array(
                         'mode' => 'override',
@@ -79,6 +86,6 @@ $rcmail_config['kolab_auth_role_settings'] = Array(
 // List of LDAP addressbooks (keys of ldap_public configuration array)
 // for which base_dn variables (%dc, etc.) will be replaced according to authenticated user DN
 // Note: special name '*' for all LDAP addressbooks
-$rcmail_config['kolab_auth_ldap_addressbooks'] = array('*');
+$config['kolab_auth_ldap_addressbooks'] = array('*');
 
 ?>
diff --git a/lib/plugins/kolab_auth/kolab_auth.php b/lib/plugins/kolab_auth/kolab_auth.php
index 2b685a7..033d5b1 100644
--- a/lib/plugins/kolab_auth/kolab_auth.php
+++ b/lib/plugins/kolab_auth/kolab_auth.php
@@ -83,8 +83,30 @@ class kolab_auth extends rcube_plugin
         }
     }
 
+    /**
+     * Startup hook handler
+     */
     public function startup($args)
     {
+        // Check access rights when logged in as another user
+        if (!empty($_SESSION['kolab_auth_admin']) && $args['task'] != 'login' && $args['task'] != 'logout') {
+            // access to specified task is forbidden,
+            // redirect to the first task on the list
+            if (!empty($_SESSION['kolab_auth_allowed_tasks'])) {
+                $tasks = (array)$_SESSION['kolab_auth_allowed_tasks'];
+                if (!in_array($args['task'], $tasks) && !in_array('*', $tasks)) {
+                    header('Location: ?_task=' . array_shift($tasks));
+                    die;
+                }
+
+                // add script that will remove disabled taskbar buttons
+                if (!in_array('*', $tasks)) {
+                    $this->add_hook('render_page', array($this, 'render_page'));
+                }
+            }
+        }
+
+        // load per-user settings
         $this->load_user_role_plugins_and_settings();
 
         return $args;
@@ -103,21 +125,36 @@ class kolab_auth extends rcube_plugin
 
             foreach ($args['result'] as $name => $config) {
                 if (in_array($name, $kolab_books) || in_array('*', $kolab_books)) {
-                    $args['result'][$name]['base_dn']        = self::parse_ldap_vars($config['base_dn']);
-                    $args['result'][$name]['search_base_dn'] = self::parse_ldap_vars($config['search_base_dn']);
-                    $args['result'][$name]['bind_dn']        = str_replace('%dn', $_SESSION['kolab_dn'], $config['bind_dn']);
-
-                    if (!empty($config['groups'])) {
-                        $args['result'][$name]['groups']['base_dn'] = self::parse_ldap_vars($config['groups']['base_dn']);
-                    }
+                    $args['result'][$name] = $this->patch_ldap_config($config);
                 }
             }
         }
+        else if ($args['name'] == 'kolab_users_directory' && !empty($args['result'])) {
+            $args['result'] = $this->patch_ldap_config($args['result']);
+        }
 
         return $args;
     }
 
     /**
+     * Helper method to patch the given LDAP directory config with user-specific values
+     */
+    protected function patch_ldap_config($config)
+    {
+        if (is_array($config)) {
+            $config['base_dn']        = self::parse_ldap_vars($config['base_dn']);
+            $config['search_base_dn'] = self::parse_ldap_vars($config['search_base_dn']);
+            $config['bind_dn']        = str_replace('%dn', $_SESSION['kolab_dn'], $config['bind_dn']);
+
+            if (!empty($config['groups'])) {
+                $config['groups']['base_dn'] = self::parse_ldap_vars($config['groups']['base_dn']);
+            }
+        }
+
+        return $config;
+    }
+
+    /**
      * Modifies list of plugins and settings according to
      * specified LDAP roles
      */
@@ -429,24 +466,69 @@ class kolab_auth extends rcube_plugin
                 return $args;
             }
 
-            // check if the original user has/belongs to administrative role/group
             $isadmin = false;
-            $group   = $rcmail->config->get('kolab_auth_group');
-            $role_dn = $rcmail->config->get('kolab_auth_role_value');
-
-            // check role attribute
-            if (!empty($role_attr) && !empty($role_dn) && !empty($record[$role_attr])) {
-                $role_dn = $ldap->parse_vars($role_dn, $user, $host);
-                if (in_array($role_dn, (array)$record[$role_attr])) {
-                    $isadmin = true;
+            $admin_rights = $rcmail->config->get('kolab_auth_admin_rights', array());
+
+            // @deprecated: fall-back to the old check if the original user has/belongs to administrative role/group
+            if (empty($admin_rights)) {
+                $group   = $rcmail->config->get('kolab_auth_group');
+                $role_dn = $rcmail->config->get('kolab_auth_role_value');
+
+                // check role attribute
+                if (!empty($role_attr) && !empty($role_dn) && !empty($record[$role_attr])) {
+                    $role_dn = $ldap->parse_vars($role_dn, $user, $host);
+                    if (in_array($role_dn, (array)$record[$role_attr])) {
+                        $isadmin = true;
+                    }
+                }
+
+                // check group
+                if (!$isadmin && !empty($group)) {
+                    $groups = $ldap->get_user_groups($record['dn'], $user, $host);
+                    if (in_array($group, $groups)) {
+                        $isadmin = true;
+                    }
+                }
+
+                if ($isadmin) {
+                    // user has admin privileges privilage, get "login as" user credentials
+                    $target_entry = $ldap->get_user_record($loginas, $host);
+                    $allowed_tasks = $rcmail->config->get('kolab_auth_allowed_tasks');
                 }
             }
+            else {
+                // get "login as" user credentials
+                $target_entry = $ldap->get_user_record($loginas, $host);
+
+                if (!empty($target_entry)) {
+                    // get effective rights to determine login-as permissions
+                    $effective_rights = (array)$ldap->effective_rights($target_entry['dn']);
+
+                    if (!empty($effective_rights)) {
+                        $effective_rights['attrib'] = $effective_rights['attributeLevelRights'];
+                        $effective_rights['entry']  = $effective_rights['entryLevelRights'];
+
+                        // compare the rights with the permissions mapping
+                        $allowed_tasks = array();
+                        foreach ($admin_rights as $task => $perms) {
+                            $perms_ = explode(':', $perms);
+                            $type   = array_shift($perms_);
+                            $req    = array_pop($perms_);
+                            $attrib = array_pop($perms_);
+
+                            if (array_key_exists($type, $effective_rights)) {
+                                if ($type == 'entry' && in_array($req, $effective_rights[$type])) {
+                                    $allowed_tasks[] = $task;
+                                }
+                                else if ($type == 'attrib' && array_key_exists($attrib, $effective_rights[$type]) &&
+                                        in_array($req, $effective_rights[$type][$attrib])) {
+                                    $allowed_tasks[] = $task;
+                                }
+                            }
+                        }
 
-            // check group
-            if (!$isadmin && !empty($group)) {
-                $groups = $ldap->get_user_groups($record['dn'], $user, $host);
-                if (in_array($group, $groups)) {
-                    $isadmin = true;
+                        $isadmin = !empty($allowed_tasks);
+                    }
                 }
             }
 
@@ -458,22 +540,22 @@ class kolab_auth extends rcube_plugin
                 $origname = $user;
             }
 
-            $record = null;
-
-            // user has the privilage, get "login as" user credentials
-            if ($isadmin) {
-                $record = $ldap->get_user_record($loginas, $host);
-            }
+            if (!$isadmin || empty($target_entry)) {
+                $this->add_texts('localization/');
 
-            if (empty($record)) {
                 $args['abort'] = true;
+                $args['error'] = $this->gettext(array(
+                    'name' => 'loginasnotallowed',
+                    'vars' => array('user' => Q($loginas)),
+                ));
+
                 $message = sprintf(
                         'Login failure for user %s (as user %s) from %s in session %s (error %s)',
                         $user,
                         $loginas,
                         rcube_utils::remote_ip(),
                         session_id(),
-                        "No user record found for '" . $loginas . "'"
+                        "No privileges to login as '" . $loginas . "'"
                     );
 
                 rcube::write_log('userlogins', $message);
@@ -481,12 +563,16 @@ class kolab_auth extends rcube_plugin
                 return $args;
             }
 
+            // replace $record with target entry
+            $record = $target_entry;
+
             $args['user'] = $this->username = $loginas;
 
             // Mark session to use SASL proxy for IMAP authentication
             $_SESSION['kolab_auth_admin']    = strtolower($origname);
             $_SESSION['kolab_auth_login']    = $rcmail->encrypt($admin_login);
             $_SESSION['kolab_auth_password'] = $rcmail->encrypt($admin_pass);
+            $_SESSION['kolab_auth_allowed_tasks'] = $allowed_tasks;
         }
 
         // Store UID and DN of logged user in session for use by other plugins
@@ -634,6 +720,28 @@ class kolab_auth extends rcube_plugin
     }
 
     /**
+     * Action executed before the page is rendered to add an onload script
+     * that will remove all taskbar buttons for disabled tasks
+     */
+    public function render_page($args)
+    {
+        $rcmail  = rcube::get_instance();
+        $tasks   = (array)$_SESSION['kolab_auth_allowed_tasks'];
+        $tasks[] = 'logout';
+
+        // disable buttons in taskbar
+        $script = "
+        \$('a').filter(function() {
+            var ev = \$(this).attr('onclick');
+            return ev && ev.match(/'switch-task','([a-z]+)'/)
+                && \$.inArray(RegExp.\$1, " . json_encode($tasks) . ") < 0;
+        }).remove();
+        ";
+
+        $rcmail->output->add_script($script, 'docready');
+    }
+
+    /**
      * Initializes LDAP object and connects to LDAP server
      */
     public static function ldap()
diff --git a/lib/plugins/kolab_auth/kolab_auth_ldap.php b/lib/plugins/kolab_auth/kolab_auth_ldap.php
index 303bbf3..431133b 100644
--- a/lib/plugins/kolab_auth/kolab_auth_ldap.php
+++ b/lib/plugins/kolab_auth/kolab_auth_ldap.php
@@ -57,8 +57,6 @@ class kolab_auth_ldap extends rcube_ldap_generic
     */
     private function _connect()
     {
-        $rcube = rcube::get_instance();
-
         // try to connect + bind for every host configured
         // with OpenLDAP 2.x ldap_connect() always succeeds but ldap_bind will fail if host isn't reachable
         // see http://www.php.net/manual/en/function.ldap-connect.php
@@ -157,11 +155,10 @@ class kolab_auth_ldap extends rcube_ldap_generic
 
         $groups = array();
         foreach ($result as $entry) {
+            $dn    = $entry['dn'];
             $entry = rcube_ldap_generic::normalize_entry($entry);
-            if (!$entry['dn']) {
-                $entry['dn'] = key($result->entries(true));
-            }
-            $groups[$entry['dn']] = $entry[$name_attr];
+
+            $groups[$dn] = $entry[$name_attr];
         }
 
         return $groups;
@@ -310,7 +307,8 @@ class kolab_auth_ldap extends rcube_ldap_generic
                 if ($limit && $limit <= $i) {
                     break;
                 }
-                $dn        = key($result->entries(true));
+
+                $dn        = $entry['dn'];
                 $entry     = rcube_ldap_generic::normalize_entry($entry);
                 $list[$dn] = $this->field_mapping($dn, $entry);
                 $i++;
diff --git a/lib/plugins/kolab_auth/localization/de_CH.inc b/lib/plugins/kolab_auth/localization/de_CH.inc
index 5e85a01..0332070 100644
--- a/lib/plugins/kolab_auth/localization/de_CH.inc
+++ b/lib/plugins/kolab_auth/localization/de_CH.inc
@@ -1,3 +1,10 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'Anmelden als';
 ?>
diff --git a/lib/plugins/kolab_auth/localization/de_DE.inc b/lib/plugins/kolab_auth/localization/de_DE.inc
index 5e85a01..3918e6e 100644
--- a/lib/plugins/kolab_auth/localization/de_DE.inc
+++ b/lib/plugins/kolab_auth/localization/de_DE.inc
@@ -1,3 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'Anmelden als';
+$labels['loginasnotallowed'] = 'Keine Privilegien zum Anmelden als $user';
 ?>
diff --git a/lib/plugins/kolab_auth/localization/en_US.inc b/lib/plugins/kolab_auth/localization/en_US.inc
index 2a7b246..4882bdc 100644
--- a/lib/plugins/kolab_auth/localization/en_US.inc
+++ b/lib/plugins/kolab_auth/localization/en_US.inc
@@ -9,5 +9,6 @@
  */
 
 $labels['loginas'] = 'Login As';
+$labels['loginasnotallowed'] = 'No privileges to login as $user';
 
 ?>
diff --git a/lib/plugins/kolab_auth/localization/fr_FR.inc b/lib/plugins/kolab_auth/localization/fr_FR.inc
index 6f72695..6538f5b 100644
--- a/lib/plugins/kolab_auth/localization/fr_FR.inc
+++ b/lib/plugins/kolab_auth/localization/fr_FR.inc
@@ -1,3 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'Se connecter en tant que';
+$labels['loginasnotallowed'] = 'Pas de privilège de se connecter comme $utilisateur';
 ?>
diff --git a/lib/plugins/kolab_auth/localization/ja_JP.inc b/lib/plugins/kolab_auth/localization/ja_JP.inc
index ed0358a..e360737 100644
--- a/lib/plugins/kolab_auth/localization/ja_JP.inc
+++ b/lib/plugins/kolab_auth/localization/ja_JP.inc
@@ -1,3 +1,10 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'ログイン';
 ?>
diff --git a/lib/plugins/kolab_auth/localization/nl_NL.inc b/lib/plugins/kolab_auth/localization/nl_NL.inc
index a98283f..ea3a1c0 100644
--- a/lib/plugins/kolab_auth/localization/nl_NL.inc
+++ b/lib/plugins/kolab_auth/localization/nl_NL.inc
@@ -1,3 +1,10 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'Log in als';
 ?>
diff --git a/lib/plugins/kolab_auth/localization/pl_PL.inc b/lib/plugins/kolab_auth/localization/pl_PL.inc
index 124c373..ca67859 100644
--- a/lib/plugins/kolab_auth/localization/pl_PL.inc
+++ b/lib/plugins/kolab_auth/localization/pl_PL.inc
@@ -1,3 +1,10 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'Zaloguj jako';
 ?>
diff --git a/lib/plugins/kolab_auth/localization/ru_RU.inc b/lib/plugins/kolab_auth/localization/ru_RU.inc
index 9e28c12..ac9e5a7 100644
--- a/lib/plugins/kolab_auth/localization/ru_RU.inc
+++ b/lib/plugins/kolab_auth/localization/ru_RU.inc
@@ -1,3 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
 $labels['loginas'] = 'Войти как';
+$labels['loginasnotallowed'] = 'Нет привилегий войти как $user';
 ?>
diff --git a/lib/plugins/kolab_auth/package.xml b/lib/plugins/kolab_auth/package.xml
deleted file mode 100644
index 5a2093b..0000000
--- a/lib/plugins/kolab_auth/package.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-    http://pear.php.net/dtd/tasks-1.0.xsd
-    http://pear.php.net/dtd/package-2.0
-    http://pear.php.net/dtd/package-2.0.xsd">
-	<name>kolab_auth</name>
-    <uri>http://git.kolab.org/roundcubemail-plugins-kolab/</uri>
-	<summary>Kolab Authentication</summary>
-	<description>
-        Authenticates on LDAP server, finds canonized authentication ID for IMAP
-        and for new users creates identity based on LDAP information.
-        Supports impersonate feature (login as another user). To use this feature
-        imap_auth_type/smtp_auth_type must be set to DIGEST-MD5 or PLAIN.
-	</description>
-	<lead>
-		<name>Aleksander Machniak</name>
-		<user>machniak</user>
-		<email>machniak at kolabsys.com</email>
-		<active>yes</active>
-	</lead>
-	<date>2013-10-04</date>
-	<version>
-		<release>1.0</release>
-		<api>1.0</api>
-	</version>
-	<stability>
-		<release>stable</release>
-		<api>stable</api>
-	</stability>
-	<license uri="http://www.gnu.org/licenses/agpl.html">GNU AGPLv3</license>
-	<notes>-</notes>
-	<contents>
-		<dir baseinstalldir="/" name="/">
-			<file name="kolab_auth.php" role="php">
-				<tasks:replace from="@name@" to="name" type="package-info"/>
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="kolab_auth_ldap.php" role="php">
-				<tasks:replace from="@name@" to="name" type="package-info"/>
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="config.inc.php.dist" role="data"></file>
-			<file name="LICENSE" role="data"></file>
-
-			<file name="localization/de_CH.inc" role="data"></file>
-			<file name="localization/de_DE.inc" role="data"></file>
-			<file name="localization/en_US.inc" role="data"></file>
-			<file name="localization/pl_PL.inc" role="data"></file>
-		</dir>
-		<!-- / -->
-	</contents>
-	<dependencies>
-		<required>
-			<php>
-				<min>5.2.1</min>
-			</php>
-			<pearinstaller>
-				<min>1.7.0</min>
-			</pearinstaller>
-		</required>
-	</dependencies>
-	<phprelease/>
-</package>
diff --git a/lib/plugins/kolab_folders/composer.json b/lib/plugins/kolab_folders/composer.json
new file mode 100644
index 0000000..a4a9877
--- /dev/null
+++ b/lib/plugins/kolab_folders/composer.json
@@ -0,0 +1,26 @@
+{
+    "name": "kolab/kolab_folders",
+    "type": "roundcube-plugin",
+    "description": "Type-aware folder management/listing for Kolab",
+    "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/",
+    "license": "AGPLv3",
+    "version": "3.2.3",
+    "authors": [
+        {
+            "name": "Aleksander Machniak",
+            "email": "machniak at kolabsys.com",
+            "role": "Lead"
+        }
+    ],
+    "repositories": [
+        {
+            "type": "composer",
+            "url": "http://plugins.roundcube.net"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0",
+        "roundcube/plugin-installer": ">=0.1.3",
+        "kolab/libkolab": ">=3.2.3"
+    }
+}
diff --git a/lib/plugins/kolab_folders/config.inc.php.dist b/lib/plugins/kolab_folders/config.inc.php.dist
index ffa1e15..0c9bd12 100644
--- a/lib/plugins/kolab_folders/config.inc.php.dist
+++ b/lib/plugins/kolab_folders/config.inc.php.dist
@@ -7,32 +7,30 @@
 // Note: Mail folders will be also subscribed.
 
 // Default Configuration folder
-$rcmail_config['kolab_folders_configuration_default'] = '';
+$config['kolab_folders_configuration_default'] = '';
 // Default Calendar folder
-$rcmail_config['kolab_folders_event_default'] = '';
+$config['kolab_folders_event_default'] = '';
 // Default Contacts (Addressbook) folder
-$rcmail_config['kolab_folders_contact_default'] = '';
+$config['kolab_folders_contact_default'] = '';
 // Default Tasks folder
-$rcmail_config['kolab_folders_task_default'] = '';
+$config['kolab_folders_task_default'] = '';
 // Default Notes folder
-$rcmail_config['kolab_folders_note_default'] = '';
+$config['kolab_folders_note_default'] = '';
 // Default Journal folder
-$rcmail_config['kolab_folders_journal_default'] = '';
+$config['kolab_folders_journal_default'] = '';
 // Default Files folder
-$rcmail_config['kolab_folders_file_default'] = '';
+$config['kolab_folders_file_default'] = '';
 // Default FreeBusy folder
-$rcmail_config['kolab_folders_freebusy_default'] = '';
+$config['kolab_folders_freebusy_default'] = '';
 
 // INBOX folder
-$rcmail_config['kolab_folders_mail_inbox'] = '';
+$config['kolab_folders_mail_inbox'] = '';
 // Drafts folder
-$rcmail_config['kolab_folders_mail_drafts'] = '';
+$config['kolab_folders_mail_drafts'] = '';
 // Sent folder
-$rcmail_config['kolab_folders_mail_sentitems'] = '';
+$config['kolab_folders_mail_sentitems'] = '';
 // Trash folder
-$rcmail_config['kolab_folders_mail_wastebasket'] = '';
+$config['kolab_folders_mail_wastebasket'] = '';
 // Others folders
-$rcmail_config['kolab_folders_mail_outbox'] = '';
-$rcmail_config['kolab_folders_mail_junkemail'] = '';
-
-?>
+$config['kolab_folders_mail_outbox'] = '';
+$config['kolab_folders_mail_junkemail'] = '';
diff --git a/lib/plugins/kolab_folders/kolab_folders.js b/lib/plugins/kolab_folders/kolab_folders.js
index ac50543..b9d9225 100644
--- a/lib/plugins/kolab_folders/kolab_folders.js
+++ b/lib/plugins/kolab_folders/kolab_folders.js
@@ -50,47 +50,23 @@ window.rcmail && rcmail.env.action == 'folders' && rcmail.addEventListener('init
 });
 
 window.rcmail && rcmail.env.action != 'folders' && $(document).ready(function() {
-    // IE doesn't allow setting OPTION's display/visibility
-    // We'll need to remove SELECT's options, see below
-    if (bw.ie) {
-        rcmail.env.subtype_html = $('#_subtype').html();
-    }
-
     // Add onchange handler for folder type SELECT, and call it on form init
     $('#_ctype').change(function() {
         var type = $(this).val(),
             sub = $('#_subtype'),
-            subtype = sub.val();
+            subtypes = rcmail.env.kolab_folder_subtypes[type] || {};
 
-        // For IE we need to revert the whole SELECT to the original state
-        if (bw.ie) {
-            sub.html(rcmail.env.subtype_html).val(subtype);
-        }
+        // reset subtype selector
+        sub.html('<option value=""></option>');
 
-        // For non-mail folders we must hide mail-specific subtypes
-        $('option', sub).each(function() {
-            var opt = $(this), val = opt.val();
-            if (val == '')
-                return;
-            // there's no mail.default
-            if (val == 'default' && type != 'mail') {
-                opt.show();
-                return;
-            };
-
-            if (type == 'mail' && val != 'default')
-                opt.show();
-            else if (bw.ie)
-                opt.remove();
-            else
-                opt.hide();
+        // append available subtypes for the given folder type
+        $.each(subtypes, function(val, label) {
+            $('<option>').attr('value', val).text(label).appendTo(sub);
         });
 
         // And re-set subtype
-        if (type != 'mail' && subtype != '' && subtype != 'default') {
-            sub.val('');
-        }
-    }).change();
+        sub.val(rcmail.env.kolab_folder_subtype);
+    });
 });
 
 function kolab_folders_filter(filter)
diff --git a/lib/plugins/kolab_folders/kolab_folders.php b/lib/plugins/kolab_folders/kolab_folders.php
index 510388c..b3c2e8e 100644
--- a/lib/plugins/kolab_folders/kolab_folders.php
+++ b/lib/plugins/kolab_folders/kolab_folders.php
@@ -27,7 +27,17 @@ class kolab_folders extends rcube_plugin
     public $task = '?(?!login).*';
 
     public $types      = array('mail', 'event', 'journal', 'task', 'note', 'contact', 'configuration', 'file', 'freebusy');
-    public $mail_types = array('inbox', 'drafts', 'sentitems', 'outbox', 'wastebasket', 'junkemail');
+    public $subtypes   = array(
+        'mail'          => array('inbox', 'drafts', 'sentitems', 'outbox', 'wastebasket', 'junkemail'),
+        'event'         => array('default', 'confidential'),
+        'task'          => array('default', 'confidential'),
+        'journal'       => array('default'),
+        'note'          => array('default'),
+        'contact'       => array('default'),
+        'configuration' => array('default'),
+        'file'          => array('default'),
+        'freebusy'      => array('default'),
+    );
     public $act_types  = array('event', 'task');
 
     private $rc;
@@ -202,8 +212,8 @@ class kolab_folders extends rcube_plugin
         $mbox = strlen($args['name']) ? $args['name'] : $args['parent_name'];
 
         if (isset($_POST['_ctype'])) {
-            $new_ctype   = trim(get_input_value('_ctype', RCUBE_INPUT_POST));
-            $new_subtype = trim(get_input_value('_subtype', RCUBE_INPUT_POST));
+            $new_ctype   = trim(rcube_utils::get_input_value('_ctype', rcube_utils::INPUT_POST));
+            $new_subtype = trim(rcube_utils::get_input_value('_subtype', rcube_utils::INPUT_POST));
         }
 
         // Get type of the folder or the parent
@@ -248,6 +258,7 @@ class kolab_folders extends rcube_plugin
         // build type SELECT fields
         $type_select = new html_select(array('name' => '_ctype', 'id' => '_ctype'));
         $sub_select  = new html_select(array('name' => '_subtype', 'id' => '_subtype'));
+        $sub_select->add('', '');
 
         foreach ($this->types as $type) {
             $type_select->add($this->gettext('foldertype'.$type), $type);
@@ -257,10 +268,14 @@ class kolab_folders extends rcube_plugin
             $type_select->add($ctype, $ctype);
         }
 
-        $sub_select->add('', '');
-        $sub_select->add($this->gettext('default'), 'default');
-        foreach ($this->mail_types as $type) {
-            $sub_select->add($this->gettext($type), $type);
+        $sub_types = array();
+        foreach ($this->subtypes as $ftype => $subtypes) {
+            $sub_types[$ftype] = array_combine($subtypes, array_map(array($this, 'gettext'), $subtypes));
+
+            // fill options for the current folder type
+            if ($ftype == $ctype || $ftype == $new_ctype) {
+                $sub_select->add(array_values($sub_types[$ftype]), $subtypes);
+            }
         }
 
         $args['form']['props']['fieldsets']['settings']['content']['foldertype'] = array(
@@ -269,6 +284,9 @@ class kolab_folders extends rcube_plugin
                 . $sub_select->show(isset($new_subtype) ? $new_subtype : $subtype),
         );
 
+        $this->rc->output->set_env('kolab_folder_subtypes', $sub_types);
+        $this->rc->output->set_env('kolab_folder_subtype', isset($new_subtype) ? $new_subtype : $subtype);
+
         return $args;
     }
 
@@ -283,8 +301,8 @@ class kolab_folders extends rcube_plugin
         }
 
         // Folder create/update with form
-        $ctype     = trim(get_input_value('_ctype', RCUBE_INPUT_POST));
-        $subtype   = trim(get_input_value('_subtype', RCUBE_INPUT_POST));
+        $ctype     = trim(rcube_utils::get_input_value('_ctype', rcube_utils::INPUT_POST));
+        $subtype   = trim(rcube_utils::get_input_value('_subtype', rcube_utils::INPUT_POST));
         $mbox      = $args['record']['name'];
         $old_mbox  = $args['record']['oldname'];
         $subscribe = $args['record']['subscribe'];
@@ -312,7 +330,7 @@ class kolab_folders extends rcube_plugin
             }
         }
         // Subtype sanity-checks
-        else if ($subtype && ($ctype != 'mail' || !in_array($subtype, $this->mail_types))) {
+        else if ($subtype && (!($subtypes = $this->subtypes[$ctype]) || !in_array($subtype, $subtypes))) {
             $subtype = '';
         }
 
@@ -522,8 +540,7 @@ class kolab_folders extends rcube_plugin
 
         // get configured defaults
         foreach ($this->types as $type) {
-            $subtypes = $type == 'mail' ? $this->mail_types : array('default');
-            foreach ($subtypes as $subtype) {
+            foreach ((array)$this->subtypes[$type] as $subtype) {
                 $opt_name = 'kolab_folders_' . $type . '_' . $subtype;
                 if ($folder = $this->rc->config->get($opt_name)) {
                     // convert configuration value to UTF7-IMAP charset
diff --git a/lib/plugins/kolab_folders/localization/de_CH.inc b/lib/plugins/kolab_folders/localization/de_CH.inc
index ebac855..91c24d3 100644
--- a/lib/plugins/kolab_folders/localization/de_CH.inc
+++ b/lib/plugins/kolab_folders/localization/de_CH.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'Ordnerinhalt';
 $labels['foldertypemail'] = 'E-Mail';
 $labels['foldertypeevent'] = 'Kalender';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Gesendet';
 $labels['outbox'] = 'Postausgang';
 $labels['wastebasket'] = 'Gelöscht';
 $labels['junkemail'] = 'Spam';
+$labels['confidential'] = 'Confidential';
 $messages['defaultfolderexists'] = 'Es existiert bereits ein Standardordner für den angegebenen Typ';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/de_DE.inc b/lib/plugins/kolab_folders/localization/de_DE.inc
index 9921e25..24749ad 100644
--- a/lib/plugins/kolab_folders/localization/de_DE.inc
+++ b/lib/plugins/kolab_folders/localization/de_DE.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'Ordnerinhalt';
 $labels['foldertypemail'] = 'E-Mail';
 $labels['foldertypeevent'] = 'Kalender';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Gesendet';
 $labels['outbox'] = 'Postausgang';
 $labels['wastebasket'] = 'Mülleimer';
 $labels['junkemail'] = 'Spam';
+$labels['confidential'] = 'Vertraulich';
 $messages['defaultfolderexists'] = 'Es gibt bereits einen Standardordner dieses Typs';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/en_US.inc b/lib/plugins/kolab_folders/localization/en_US.inc
index 0d8d86c..0910d9d 100644
--- a/lib/plugins/kolab_folders/localization/en_US.inc
+++ b/lib/plugins/kolab_folders/localization/en_US.inc
@@ -28,6 +28,7 @@ $labels['sentitems'] = 'Sent';
 $labels['outbox'] = 'Outbox';
 $labels['wastebasket'] = 'Trash';
 $labels['junkemail'] = 'Junk';
+$labels['confidential'] = 'Confidential';
 
 $messages['defaultfolderexists'] = 'There is already default folder of specified type';
 
diff --git a/lib/plugins/kolab_folders/localization/es_ES.inc b/lib/plugins/kolab_folders/localization/es_ES.inc
index cdbc62c..b53712b 100644
--- a/lib/plugins/kolab_folders/localization/es_ES.inc
+++ b/lib/plugins/kolab_folders/localization/es_ES.inc
@@ -1,7 +1,28 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
+$labels['folderctype'] = 'Content type';
+$labels['foldertypemail'] = 'Mail';
 $labels['foldertypeevent'] = 'Calendar';
+$labels['foldertypejournal'] = 'Journal';
 $labels['foldertypetask'] = 'Tareas';
 $labels['foldertypenote'] = 'Notas';
 $labels['foldertypecontact'] = 'Contactos';
 $labels['foldertypeconfiguration'] = 'Configuración';
+$labels['foldertypefile'] = 'Files';
+$labels['foldertypefreebusy'] = 'Free-Busy';
+$labels['default'] = 'Default';
+$labels['inbox'] = 'Inbox';
+$labels['drafts'] = 'Drafts';
+$labels['sentitems'] = 'Sent';
+$labels['outbox'] = 'Outbox';
+$labels['wastebasket'] = 'Trash';
+$labels['junkemail'] = 'Junk';
+$labels['confidential'] = 'Confidential';
+$messages['defaultfolderexists'] = 'There is already default folder of specified type';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/et_EE.inc b/lib/plugins/kolab_folders/localization/et_EE.inc
index efb51b6..5a12004 100644
--- a/lib/plugins/kolab_folders/localization/et_EE.inc
+++ b/lib/plugins/kolab_folders/localization/et_EE.inc
@@ -1,3 +1,28 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
+$labels['folderctype'] = 'Content type';
+$labels['foldertypemail'] = 'Mail';
 $labels['foldertypeevent'] = 'Calendar';
+$labels['foldertypejournal'] = 'Journal';
+$labels['foldertypetask'] = 'Tasks';
+$labels['foldertypenote'] = 'Notes';
+$labels['foldertypecontact'] = 'Contacts';
+$labels['foldertypeconfiguration'] = 'Configuration';
+$labels['foldertypefile'] = 'Files';
+$labels['foldertypefreebusy'] = 'Free-Busy';
+$labels['default'] = 'Default';
+$labels['inbox'] = 'Inbox';
+$labels['drafts'] = 'Drafts';
+$labels['sentitems'] = 'Sent';
+$labels['outbox'] = 'Outbox';
+$labels['wastebasket'] = 'Trash';
+$labels['junkemail'] = 'Junk';
+$labels['confidential'] = 'Confidential';
+$messages['defaultfolderexists'] = 'There is already default folder of specified type';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/fr_FR.inc b/lib/plugins/kolab_folders/localization/fr_FR.inc
index ac3d2dd..41e506e 100644
--- a/lib/plugins/kolab_folders/localization/fr_FR.inc
+++ b/lib/plugins/kolab_folders/localization/fr_FR.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'Type de contenu';
 $labels['foldertypemail'] = 'Courriel';
 $labels['foldertypeevent'] = 'Calendrier';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Envoyés';
 $labels['outbox'] = 'Courrier sortant';
 $labels['wastebasket'] = 'Corbeille';
 $labels['junkemail'] = 'Indésirables';
+$labels['confidential'] = 'Confidentiel';
 $messages['defaultfolderexists'] = 'Il existe déjà un répertoire par défaut pour le type spécifié';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/ja_JP.inc b/lib/plugins/kolab_folders/localization/ja_JP.inc
index 2ac10c2..6dfd611 100644
--- a/lib/plugins/kolab_folders/localization/ja_JP.inc
+++ b/lib/plugins/kolab_folders/localization/ja_JP.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'コンテンツタイプ';
 $labels['foldertypemail'] = 'メール';
 $labels['foldertypeevent'] = 'カレンダー';
@@ -16,5 +23,6 @@ $labels['sentitems'] = '送信済';
 $labels['outbox'] = '送信箱';
 $labels['wastebasket'] = 'ごみ箱';
 $labels['junkemail'] = '迷惑メール';
+$labels['confidential'] = 'Confidential';
 $messages['defaultfolderexists'] = '指定したタイプの初期フォルダは既にあります。';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/nl_NL.inc b/lib/plugins/kolab_folders/localization/nl_NL.inc
index 4946a24..a80aca5 100644
--- a/lib/plugins/kolab_folders/localization/nl_NL.inc
+++ b/lib/plugins/kolab_folders/localization/nl_NL.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'Inhoudstype';
 $labels['foldertypemail'] = 'Mail';
 $labels['foldertypeevent'] = 'Agenda';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Verzonden';
 $labels['outbox'] = 'Te versturen';
 $labels['wastebasket'] = 'Prullenbak';
 $labels['junkemail'] = 'Ongewenst';
+$labels['confidential'] = 'Vertrouwelijk';
 $messages['defaultfolderexists'] = 'Er is reeds een standaard map voor dit type inhoud';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/pl_PL.inc b/lib/plugins/kolab_folders/localization/pl_PL.inc
index 0b13bdd..8d9f61a 100644
--- a/lib/plugins/kolab_folders/localization/pl_PL.inc
+++ b/lib/plugins/kolab_folders/localization/pl_PL.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'Typ treści';
 $labels['foldertypemail'] = 'Poczta';
 $labels['foldertypeevent'] = 'Kalendarz';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Wysłane';
 $labels['outbox'] = 'Poczta wychodzÄ…ca';
 $labels['wastebasket'] = 'Kosz';
 $labels['junkemail'] = 'Spam';
+$labels['confidential'] = 'Confidential';
 $messages['defaultfolderexists'] = 'Folder domyślny wybranego typu już istnieje';
 ?>
diff --git a/lib/plugins/kolab_folders/localization/ru_RU.inc b/lib/plugins/kolab_folders/localization/ru_RU.inc
index 83df476..4e50bff 100644
--- a/lib/plugins/kolab_folders/localization/ru_RU.inc
+++ b/lib/plugins/kolab_folders/localization/ru_RU.inc
@@ -1,4 +1,11 @@
 <?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
 $labels['folderctype'] = 'Тип ящика';
 $labels['foldertypemail'] = 'Почта';
 $labels['foldertypeevent'] = 'Календарь';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Отправленные';
 $labels['outbox'] = 'Исходящие';
 $labels['wastebasket'] = 'Корзина';
 $labels['junkemail'] = 'Спам';
+$labels['confidential'] = 'Конфиденциально';
 $messages['defaultfolderexists'] = 'Уже назначен ящик по умолчанию для указанного типа';
 ?>
diff --git a/lib/plugins/kolab_folders/package.xml b/lib/plugins/kolab_folders/package.xml
deleted file mode 100644
index b40acab..0000000
--- a/lib/plugins/kolab_folders/package.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-    http://pear.php.net/dtd/tasks-1.0.xsd
-    http://pear.php.net/dtd/package-2.0
-    http://pear.php.net/dtd/package-2.0.xsd">
-	<name>kolab_folders</name>
-	<uri>http://git.kolab.org/roundcubemail-plugins-kolab/</uri>
-	<summary>Type-aware folder management/listing for Kolab</summary>
-	<description>
-	    The plugin extends folders handling with features of the Kolab Suite
-	    according to specified format (http://www.kolab.org/doc/kolabformat-2.0-html).
-        With this plugin enabled it is possible to:
-        - set/get/change folder's type,
-        - filter folders list by folder type,
-        - style folders list rows (in folder manager),
-        - create default folders with specified type.
-	</description>
-	<lead>
-		<name>Aleksander Machniak</name>
-		<user>machniak</user>
-		<email>machniak at kolabsys.com</email>
-		<active>yes</active>
-	</lead>
-	<date>2012-10.25</date>
-	<version>
-		<release>2.1</release>
-		<api>2.0</api>
-	</version>
-	<stability>
-		<release>stable</release>
-		<api>stable</api>
-	</stability>
-	<license uri="http://www.gnu.org/licenses/agpl.html">GNU AGPLv3</license>
-	<notes>-</notes>
-	<contents>
-		<dir baseinstalldir="/" name="/">
-			<file name="kolab_folders.php" role="php">
-				<tasks:replace from="@name@" to="name" type="package-info"/>
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="kolab_folders.js" role="data">
-				<tasks:replace from="@name@" to="name" type="package-info"/>
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="config.inc.php.dist" role="data"></file>
-			<file name="localization/en_US.inc" role="data"></file>
-			<file name="localization/pl_PL.inc" role="data"></file>
-			<file name="LICENSE" role="data"></file>
-		</dir>
-		<!-- / -->
-	</contents>
-	<dependencies>
-		<required>
-			<php>
-				<min>5.2.1</min>
-			</php>
-			<pearinstaller>
-				<min>1.7.0</min>
-			</pearinstaller>
-		</required>
-	</dependencies>
-	<phprelease />
-</package>
diff --git a/lib/plugins/libkolab/SQL/mysql.initial.sql b/lib/plugins/libkolab/SQL/mysql.initial.sql
index 2aa046d..98e7e78 100644
--- a/lib/plugins/libkolab/SQL/mysql.initial.sql
+++ b/lib/plugins/libkolab/SQL/mysql.initial.sql
@@ -31,7 +31,7 @@ CREATE TABLE `kolab_cache_contact` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `type` VARCHAR(32) CHARACTER SET ascii NOT NULL,
   `name` VARCHAR(255) NOT NULL,
@@ -55,7 +55,7 @@ CREATE TABLE `kolab_cache_event` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `dtstart` DATETIME,
   `dtend` DATETIME,
@@ -75,7 +75,7 @@ CREATE TABLE `kolab_cache_task` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `dtstart` DATETIME,
   `dtend` DATETIME,
@@ -95,7 +95,7 @@ CREATE TABLE `kolab_cache_journal` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `dtstart` DATETIME,
   `dtend` DATETIME,
@@ -115,7 +115,7 @@ CREATE TABLE `kolab_cache_note` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   CONSTRAINT `fk_kolab_cache_note_folder` FOREIGN KEY (`folder_id`)
     REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -133,7 +133,7 @@ CREATE TABLE `kolab_cache_file` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `filename` varchar(255) DEFAULT NULL,
   CONSTRAINT `fk_kolab_cache_file_folder` FOREIGN KEY (`folder_id`)
@@ -153,7 +153,7 @@ CREATE TABLE `kolab_cache_configuration` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `type` VARCHAR(32) CHARACTER SET ascii NOT NULL,
   CONSTRAINT `fk_kolab_cache_configuration_folder` FOREIGN KEY (`folder_id`)
@@ -173,7 +173,7 @@ CREATE TABLE `kolab_cache_freebusy` (
   `changed` DATETIME DEFAULT NULL,
   `data` LONGTEXT NOT NULL,
   `xml` LONGBLOB NOT NULL,
-  `tags` VARCHAR(255) NOT NULL,
+  `tags` TEXT NOT NULL,
   `words` TEXT NOT NULL,
   `dtstart` DATETIME,
   `dtend` DATETIME,
@@ -184,4 +184,4 @@ CREATE TABLE `kolab_cache_freebusy` (
 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
 
 
-INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2014021000');
+INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2015011600');
diff --git a/lib/plugins/libkolab/SQL/mysql/2014112700.sql b/lib/plugins/libkolab/SQL/mysql/2014112700.sql
new file mode 100644
index 0000000..90c77b8
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/mysql/2014112700.sql
@@ -0,0 +1,2 @@
+-- delete cache entries for old folder identifiers
+DELETE FROM `kolab_folders` WHERE `resource` LIKE 'imap://anonymous@%';
diff --git a/lib/plugins/libkolab/SQL/mysql/2015011600.sql b/lib/plugins/libkolab/SQL/mysql/2015011600.sql
new file mode 100644
index 0000000..be523ae
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/mysql/2015011600.sql
@@ -0,0 +1,8 @@
+ALTER TABLE `kolab_cache_contact` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_event` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_task` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_journal` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_note` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_file` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_configuration` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_freebusy` MODIFY `tags` text NOT NULL;
diff --git a/lib/plugins/libkolab/SQL/oracle.initial.sql b/lib/plugins/libkolab/SQL/oracle.initial.sql
new file mode 100644
index 0000000..8f1ed64
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/oracle.initial.sql
@@ -0,0 +1,184 @@
+/**
+ * libkolab database schema
+ *
+ * @version 1.1
+ * @author Aleksander Machniak
+ * @licence GNU AGPL
+ **/
+
+
+CREATE TABLE "kolab_folders" (
+    "folder_id" number NOT NULL PRIMARY KEY,
+    "resource" VARCHAR(255) NOT NULL,
+    "type" VARCHAR(32) NOT NULL,
+    "synclock" integer DEFAULT 0 NOT NULL,
+    "ctag" VARCHAR(40) DEFAULT NULL
+);
+
+CREATE INDEX "kolab_folders_resource_idx" ON "kolab_folders" ("resource", "type");
+
+CREATE SEQUENCE "kolab_folders_seq"
+    START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "kolab_folders_seq_trig"
+BEFORE INSERT ON "kolab_folders" FOR EACH ROW
+BEGIN
+    :NEW."folder_id" := "kolab_folders_seq".nextval;
+END;
+/
+
+CREATE TABLE "kolab_cache_contact" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "type" varchar(32) NOT NULL,
+    "name" varchar(255) DEFAULT NULL,
+    "firstname" varchar(255) DEFAULT NULL,
+    "surname" varchar(255) DEFAULT NULL,
+    "email" varchar(255) DEFAULT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_contact_type_idx" ON "kolab_cache_contact" ("folder_id", "type");
+CREATE INDEX "kolab_cache_contact_uid2msguid" ON "kolab_cache_contact" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_event" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "dtstart" timestamp DEFAULT NULL,
+    "dtend" timestamp DEFAULT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_event_uid2msguid" ON "kolab_cache_event" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_task" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "dtstart" timestamp DEFAULT NULL,
+    "dtend" timestamp DEFAULT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_task_uid2msguid" ON "kolab_cache_task" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_journal" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "dtstart" timestamp DEFAULT NULL,
+    "dtend" timestamp DEFAULT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_journal_uid2msguid" ON "kolab_cache_journal" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_note" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_note_uid2msguid" ON "kolab_cache_note" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_file" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "filename" varchar(255) DEFAULT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_file_filename" ON "kolab_cache_file" ("folder_id", "filename");
+CREATE INDEX "kolab_cache_file_uid2msguid" ON "kolab_cache_file" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_configuration" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "type" varchar(32) NOT NULL,
+    PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_config_type" ON "kolab_cache_configuration" ("folder_id", "type");
+CREATE INDEX "kolab_cache_config_uid2msguid" ON "kolab_cache_configuration" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_freebusy" (
+    "folder_id" number NOT NULL
+        REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+    "msguid" number NOT NULL,
+    "uid" varchar(128) NOT NULL,
+    "created" timestamp DEFAULT NULL,
+    "changed" timestamp DEFAULT NULL,
+    "data" clob NOT NULL,
+    "xml" clob NOT NULL,
+    "tags" clob DEFAULT NULL,
+    "words" clob DEFAULT NULL,
+    "dtstart" timestamp DEFAULT NULL,
+    "dtend" timestamp DEFAULT NULL,
+    PRIMARY KEY("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_fb_uid2msguid" ON "kolab_cache_freebusy" ("folder_id", "uid", "msguid");
+
+
+INSERT INTO "system" ("name", "value") VALUES ('libkolab-version', '2015011600');
diff --git a/lib/plugins/libkolab/SQL/oracle/2015011600.sql b/lib/plugins/libkolab/SQL/oracle/2015011600.sql
new file mode 100644
index 0000000..69f7953
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/oracle/2015011600.sql
@@ -0,0 +1,40 @@
+-- direct change from varchar to clob does not work, need temp column (#4257)
+ALTER TABLE "kolab_cache_contact" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_contact" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_contact" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_contact" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_event" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_event" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_event" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_event" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_task" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_task" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_task" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_task" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_journal" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_journal" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_journal" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_journal" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_note" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_note" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_note" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_note" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_file" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_file" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_file" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_file" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_configuration" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_configuration" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_configuration" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_configuration" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_freebusy" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_freebusy" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_freebusy" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_freebusy" RENAME COLUMN "tags1" TO "tags";
diff --git a/lib/plugins/libkolab/bin/readcache.sh b/lib/plugins/libkolab/bin/readcache.sh
new file mode 100755
index 0000000..7e6a3a3
--- /dev/null
+++ b/lib/plugins/libkolab/bin/readcache.sh
@@ -0,0 +1,150 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Kolab storage cache testing script
+ *
+ * @author Thomas Bruederli <bruederli at kolabsys.com>
+ *
+ * Copyright (C) 2014, Kolab Systems AG <contact at kolabsys.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALL_PATH', realpath('.') . '/' );
+ini_set('display_errors', 1);
+libxml_use_internal_errors(true);
+
+if (!file_exists(INSTALL_PATH . 'program/include/clisetup.php'))
+    die("Execute this from the Roundcube installation dir!\n\n");
+
+require_once INSTALL_PATH . 'program/include/clisetup.php';
+
+function print_usage()
+{
+	print "Usage:  readcache.sh [OPTIONS] FOLDER\n";
+	print "-h, --host     IMAP host name\n";
+	print "-l, --limit    Limit the number of records to be listed\n";
+}
+
+// read arguments
+$opts = get_opt(array(
+    'h' => 'host',
+    'l' => 'limit',
+    'v' => 'verbose',
+));
+
+$folder = $opts[0];
+$imap_host = $opts['host'];
+
+$rcmail = rcube::get_instance(rcube::INIT_WITH_DB | rcube::INIT_WITH_PLUGINS);
+
+if (empty($imap_host)) {
+    $default_host = $rcmail->config->get('default_host');
+    if (is_array($default_host)) {
+        list($k,$v) = each($default_host);
+        $imap_host = is_numeric($k) ? $v : $k;
+    }
+    else {
+        $imap_host = $default_host;
+    }
+
+    // strip protocol prefix
+    $imap_host = preg_replace('!^[a-z]+://!', '', $imap_host);
+}
+
+if (empty($folder) || empty($imap_host)) {
+    print_usage();
+    exit;
+}
+
+// connect to database
+$db = $rcmail->get_dbh();
+$db->db_connect('r');
+if (!$db->is_connected() || $db->is_error())
+    die("No DB connection\n");
+
+
+// resolve folder_id
+if (!is_numeric($folder)) {
+    if (strpos($folder, '@')) {
+        list($mailbox, $domain) = explode('@', $folder);
+        list($username, $subpath) = explode('/', preg_replace('!^user/!', '', $mailbox), 2);
+        $folder_uri = 'imap://' . urlencode($username.'@'.$domain) . '@' . $imap_host . '/' . $subpath;
+    }
+    else {
+        die("Invalid mailbox identifier! Example: user/john.doe/Calendar at example.org\n");
+    }
+
+    print "Resolving folder $folder_uri...";
+    $sql_result = $db->query('SELECT * FROM `kolab_folders` WHERE `resource`=?', $folder_uri);
+    if ($sql_result && ($folder_data = $db->fetch_assoc($sql_result))) {
+        $folder_id = $folder_data['folder_id'];
+        print $folder_id;
+    }
+    print "\n";
+}
+else {
+    $folder_id = intval($folder);
+    $sql_result = $db->query('SELECT * FROM `kolab_folders` WHERE `folder_id`=?', $folder_id);
+    if ($sql_result) {
+        $folder_data = $db->fetch_assoc($sql_result);
+    }
+}
+
+if (empty($folder_data)) {
+    die("Can't find cache mailbox for '$folder'\n");
+}
+
+print "Querying cache for folder $folder_id ($folder_data[type])...\n";
+
+$extra_cols = array(
+    'event'   => array('dtstart','dtend'),
+    'contact' => array('type'),
+);
+
+$cache_table = $db->table_name('kolab_cache_' . $folder_data['type']);
+$extra_cols_ = $extra_cols[$folder_data['type']] ?: array();
+$sql_arr = $db->fetch_assoc($db->query("SELECT COUNT(*) as cnt FROM `$cache_table` WHERE `folder_id`=?", intval($folder_id)));
+
+print "CTag  = " . $folder_data['ctag'] . "\n";
+print "Lock  = " . $folder_data['synclock'] . "\n";
+print "Count = " . $sql_arr['cnt'] . "\n";
+print "----------------------------------------------------------------------------------\n";
+print "<MSG>\t<UUID>\t<CHANGED>\t<DATA>\t<XML>\t";
+print join("\t", array_map(function($c) { return '<' . strtoupper($c) . '>'; }, $extra_cols_));
+print "\n----------------------------------------------------------------------------------\n";
+
+$result = $db->limitquery("SELECT * FROM `$cache_table` WHERE `folder_id`=?", 0, $opts['limit'], intval($folder_id));
+while ($result && ($sql_arr = $db->fetch_assoc($result))) {
+    print $sql_arr['msguid'] . "\t" . $sql_arr['uid'] . "\t" . $sql_arr['changed'];
+
+    // try to unserialize data block
+    $object = @unserialize(@base64_decode($sql_arr['data']));
+    print "\t" . ($object === false ? 'FAIL!' : ($object['uid'] == $sql_arr['uid'] ? 'OK' : '!!!'));
+
+    // check XML validity
+    $xml = simplexml_load_string($sql_arr['xml']);
+    print "\t" . ($xml === false ? 'FAIL!' : 'OK');
+
+    // print extra cols
+    array_walk($extra_cols_, function($c) use ($sql_arr) {
+        print "\t" . $sql_arr[$c];
+    });
+
+    print "\n";
+}
+
+print "----------------------------------------------------------------------------------\n";
+echo "Done.\n";
diff --git a/lib/plugins/libkolab/composer.json b/lib/plugins/libkolab/composer.json
index 8926037..b458df6 100644
--- a/lib/plugins/libkolab/composer.json
+++ b/lib/plugins/libkolab/composer.json
@@ -4,7 +4,7 @@
     "description": "Plugin to setup a basic environment for the interaction with a Kolab server.",
     "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/",
     "license": "AGPLv3",
-    "version": "1.1.0",
+    "version": "3.2.3",
     "authors": [
         {
             "name": "Thomas Bruederli",
diff --git a/lib/plugins/libkolab/config.inc.php.dist b/lib/plugins/libkolab/config.inc.php.dist
index b043bb7..7efa8d1 100644
--- a/lib/plugins/libkolab/config.inc.php.dist
+++ b/lib/plugins/libkolab/config.inc.php.dist
@@ -3,56 +3,57 @@
 /* Configuration for libkolab */
 
 // Enable caching of Kolab objects in local database
-$rcmail_config['kolab_cache'] = true;
+$config['kolab_cache'] = true;
 
 // Specify format version to write Kolab objects (must be a string value!)
-$rcmail_config['kolab_format_version']  = '3.0';
+$config['kolab_format_version']  = '3.0';
 
 // Optional override of the URL to read and trigger Free/Busy information of Kolab users
 // Defaults to https://<imap-server->/freebusy
-$rcmail_config['kolab_freebusy_server'] = 'https://<some-host>/<freebusy-path>';
+$config['kolab_freebusy_server'] = null;
 
 // Enables listing of only subscribed folders. This e.g. will limit
 // folders in calendar view or available addressbooks
-$rcmail_config['kolab_use_subscriptions'] = false;
+$config['kolab_use_subscriptions'] = false;
 
 // List any of 'personal','shared','other' namespaces to be excluded from groupware folder listing
 // example: array('other');
-$rcmail_config['kolab_skip_namespace'] = null;
+$config['kolab_skip_namespace'] = null;
 
 // Enables the use of displayname folder annotations as introduced in KEP:?
 // for displaying resource folder names (experimental!)
-$rcmail_config['kolab_custom_display_names'] = false;
+$config['kolab_custom_display_names'] = false;
 
 // Configuration of HTTP requests.
 // See http://pear.php.net/manual/en/package.http.http-request2.config.php
 // for list of supported configuration options (array keys)
-$rcmail_config['kolab_http_request'] = array();
+$config['kolab_http_request'] = array();
 
 // When kolab_cache is enabled Roundcube's messages cache will be redundant
 // when working on kolab folders. Here we can:
 // 2 - bypass messages/indexes cache completely
 // 1 - bypass only messages, but use index cache
-$rcmail_config['kolab_messages_cache_bypass'] = 0;
+$config['kolab_messages_cache_bypass'] = 0;
 
 // LDAP directory to find avilable users for folder sharing.
 // Either contains an array with LDAP addressbook configuration or refers to entry in $config['ldap_public'].
 // If not specified, the configuraton from 'kolab_auth_addressbook' will be used.
-$rcmail_config['kolab_users_directory'] = null;
+// Should be provided for multi-domain setups with placeholders like %dc, %d, %u, %fu or %dn.
+$config['kolab_users_directory'] = null;
 
 // Filter to be used for resolving user folders in LDAP.
 // Defaults to the 'kolab_auth_filter' configuration option.
-$rcmail_config['kolab_users_filter'] = '(&(objectclass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)))';
+$config['kolab_users_filter'] = '(&(objectclass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)))';
 
 // Which property of the LDAP user record to use for user folder mapping in IMAP.
 // Defaults to the 'kolab_auth_login' configuration option.
-$rcmail_config['kolab_users_id_attrib'] = null;
+$config['kolab_users_id_attrib'] = null;
 
 // Use these attributes when searching users in LDAP
-$rcmail_config['kolab_users_search_attrib'] = array('cn','mail','alias');
+$config['kolab_users_search_attrib'] = array('cn','mail','alias');
 
 // JSON-RPC endpoint configuration of the Bonnie web service providing historic data for groupware objects
-$rcmail_config['kolab_bonnie_api'] = array(
+$config['kolab_bonnie_api'] = array(
     'uri'    => 'https://<kolab-hostname>:8080/api/rpc',
     'user'   => 'webclient',
     'pass'   => 'Welcome2KolabSystems',
diff --git a/lib/plugins/libkolab/js/folderlist.js b/lib/plugins/libkolab/js/folderlist.js
index 1c8ce2f..62a60ef 100644
--- a/lib/plugins/libkolab/js/folderlist.js
+++ b/lib/plugins/libkolab/js/folderlist.js
@@ -68,7 +68,7 @@ function kolab_folderlist(node, p)
                           id = li.attr('id').replace(new RegExp('^'+p.id_prefix), '');
                       if (p.id_decode)
                           id = p.id_decode(id);
-                      node = search_results_widget.get_node(id),
+                      node = search_results_widget.get_node(id);
                       has_children = node.children && node.children.length;
 
                       e.stopPropagation();
@@ -81,6 +81,11 @@ function kolab_folderlist(node, p)
                           li.children().first()
                               .toggleClass('subscribed')
                               .find('input[type=checkbox]').get(0).checked = true;
+
+                          if (has_children && search_results[id].group == 'other user') {
+                              li.find('ul li > div').addClass('subscribed')
+                                  .find('a.subscribed').attr('aria-checked', 'true');;
+                          }
                       }
                       else if (!this.checked) {
                           return;
@@ -97,6 +102,11 @@ function kolab_folderlist(node, p)
                           li.remove();
                       }
 
+                      // set partial subscription status
+                      if (search_results[id].subscribed && search_results[id].parent && search_results[id].group == 'other') {
+                          parent_subscription_status($(me.get_item(id, true)));
+                      }
+
                       // set focus to cloned checkbox
                       if (rcube_event.is_keyboard(e)) {
                         $(me.get_item(id, true)).find('input[type=checkbox]').first().focus();
@@ -149,7 +159,8 @@ function kolab_folderlist(node, p)
             prop = search_results[id],
             parent_id = prop.parent || null,
             has_children = node.children && node.children.length,
-            dom_node = has_children ? li.children().first().clone(true, true) : li.children().first();
+            dom_node = has_children ? li.children().first().clone(true, true) : li.children().first(),
+            childs = [];
 
         // find parent node and insert at the right place
         if (parent_id && me.get_node(parent_id)) {
@@ -171,18 +182,58 @@ function kolab_folderlist(node, p)
                 .removeClass('virtual');
         }
         else {
+            // copy childs, too
+            if (has_children && prop.group == 'other user') {
+                for (var cid, j=0; j < node.children.length; j++) {
+                    if ((cid = node.children[j].id) && search_results[cid]) {
+                        childs.push(search_results_widget.get_node(cid));
+                    }
+                }
+            }
+
             // move this result item to the main list widget
             me.insert({
                 id: id,
                 classes: [ prop.group || '' ],
                 virtual: prop.virtual,
                 html: dom_node,
+                level: node.level,
+                collapsed: true,
+                children: childs
             }, parent_id, prop.group);
         }
 
         delete prop.html;
         prop.active = active;
         me.triggerEvent('insert-item', { id: id, data: prop, item: li });
+
+        // register childs, too
+        if (childs.length) {
+            for (var cid, j=0; j < node.children.length; j++) {
+                if ((cid = node.children[j].id) && search_results[cid]) {
+                    prop = search_results[cid];
+                    delete prop.html;
+                    prop.active = false;
+                    me.triggerEvent('insert-item', { id: cid, data: prop });
+                }
+            }
+        }
+    }
+
+    // update the given item's parent's (partial) subscription state
+    function parent_subscription_status(li)
+    {
+        var top_li = li.closest(me.container.children('li')),
+            all_childs = $('li > div:not(.treetoggle)', top_li),
+            subscribed = all_childs.filter('.subscribed').length;
+
+        if (subscribed == 0) {
+            top_li.children('div:first').removeClass('subscribed partial');
+        }
+        else {
+            top_li.children('div:first')
+                .addClass('subscribed')[subscribed < all_childs.length ? 'addClass' : 'removeClass']('partial');
+        }
     }
 
     // do some magic when search is performed on the widget
@@ -239,25 +290,60 @@ function kolab_folderlist(node, p)
         }
     });
 
-    this.container.on('click', 'a.subscribed, span.subscribed', function(e){
+    this.container.on('click', 'a.subscribed, span.subscribed', function(e) {
         var li = $(this).closest('li'),
             id = li.attr('id').replace(new RegExp('^'+p.id_prefix), ''),
-            div = li.children().first();
+            div = li.children().first(),
+            is_subscribed;
 
-        if (me.is_search())
-          id = id.replace(/--xsR$/, '');
+        if (me.is_search()) {
+            id = id.replace(/--xsR$/, '');
+            li = $(me.get_item(id, true));
+            div = $(div).add(li.children().first());
+        }
 
         if (p.id_decode)
             id = p.id_decode(id);
 
         div.toggleClass('subscribed');
-        $(this).attr('aria-checked', div.hasClass('subscribed') ? 'true' : 'false');
-        me.triggerEvent('subscribe', { id: id, subscribed: div.hasClass('subscribed'), item: li });
+        is_subscribed = div.hasClass('subscribed');
+        $(this).attr('aria-checked', is_subscribed ? 'true' : 'false');
+        me.triggerEvent('subscribe', { id: id, subscribed: is_subscribed, item: li });
+
+        // update subscribe state of all 'virtual user' child folders
+        if (li.hasClass('other user')) {
+            $('ul li > div', li).each(function() {
+                $(this)[is_subscribed ? 'addClass' : 'removeClass']('subscribed');
+                $('.subscribed', div).attr('aria-checked', is_subscribed ? 'true' : 'false');
+            });
+            div.removeClass('partial');
+        }
+        // propagate subscription state to parent  'virtual user' folder
+        else if (li.closest('li.other.user').length) {
+            parent_subscription_status(li);
+        }
 
         e.stopPropagation();
         return false;
-    })
+    });
+
+    this.container.on('click', 'a.remove', function(e) {
+      var li = $(this).closest('li'),
+          id = li.attr('id').replace(new RegExp('^'+p.id_prefix), '');
+
+      if (me.is_search()) {
+          id = id.replace(/--xsR$/, '');
+          li = $(me.get_item(id, true));
+      }
 
+      if (p.id_decode)
+          id = p.id_decode(id);
+
+      me.triggerEvent('remove', { id: id, item: li });
+
+      e.stopPropagation();
+      return false;
+    });
 }
 
 // link prototype from base class
diff --git a/lib/plugins/libkolab/lib/kolab_bonnie_api.php b/lib/plugins/libkolab/lib/kolab_bonnie_api.php
index 23dafd8..e8ac131 100644
--- a/lib/plugins/libkolab/lib/kolab_bonnie_api.php
+++ b/lib/plugins/libkolab/lib/kolab_bonnie_api.php
@@ -36,7 +36,7 @@ class kolab_bonnie_api
      */
     public function __construct($config)
     {
-        $this->config = $confg;
+        $this->config = $config;
 
         $this->client = new kolab_bonnie_api_client($config['uri'], $config['timeout'] ?: 5, (bool)$config['debug']);
 
diff --git a/lib/plugins/libkolab/lib/kolab_format.php b/lib/plugins/libkolab/lib/kolab_format.php
index ae7705c..625483b 100644
--- a/lib/plugins/libkolab/lib/kolab_format.php
+++ b/lib/plugins/libkolab/lib/kolab_format.php
@@ -47,6 +47,117 @@ abstract class kolab_format
     const KTYPE_PREFIX = 'application/x-vnd.kolab.';
     const PRODUCT_ID   = 'Roundcube-libkolab-1.1';
 
+    // mapping table for valid PHP timezones not supported by libkolabxml
+    // basically the entire list of ftp://ftp.iana.org/tz/data/backward
+    protected static $timezone_map = array(
+        'Africa/Asmera' => 'Africa/Asmara',
+        'Africa/Timbuktu' => 'Africa/Abidjan',
+        'America/Argentina/ComodRivadavia' => 'America/Argentina/Catamarca',
+        'America/Atka' => 'America/Adak',
+        'America/Buenos_Aires' => 'America/Argentina/Buenos_Aires',
+        'America/Catamarca' => 'America/Argentina/Catamarca',
+        'America/Coral_Harbour' => 'America/Atikokan',
+        'America/Cordoba' => 'America/Argentina/Cordoba',
+        'America/Ensenada' => 'America/Tijuana',
+        'America/Fort_Wayne' => 'America/Indiana/Indianapolis',
+        'America/Indianapolis' => 'America/Indiana/Indianapolis',
+        'America/Jujuy' => 'America/Argentina/Jujuy',
+        'America/Knox_IN' => 'America/Indiana/Knox',
+        'America/Louisville' => 'America/Kentucky/Louisville',
+        'America/Mendoza' => 'America/Argentina/Mendoza',
+        'America/Porto_Acre' => 'America/Rio_Branco',
+        'America/Rosario' => 'America/Argentina/Cordoba',
+        'America/Virgin' => 'America/Port_of_Spain',
+        'Asia/Ashkhabad' => 'Asia/Ashgabat',
+        'Asia/Calcutta' => 'Asia/Kolkata',
+        'Asia/Chungking' => 'Asia/Shanghai',
+        'Asia/Dacca' => 'Asia/Dhaka',
+        'Asia/Katmandu' => 'Asia/Kathmandu',
+        'Asia/Macao' => 'Asia/Macau',
+        'Asia/Saigon' => 'Asia/Ho_Chi_Minh',
+        'Asia/Tel_Aviv' => 'Asia/Jerusalem',
+        'Asia/Thimbu' => 'Asia/Thimphu',
+        'Asia/Ujung_Pandang' => 'Asia/Makassar',
+        'Asia/Ulan_Bator' => 'Asia/Ulaanbaatar',
+        'Atlantic/Faeroe' => 'Atlantic/Faroe',
+        'Atlantic/Jan_Mayen' => 'Europe/Oslo',
+        'Australia/ACT' => 'Australia/Sydney',
+        'Australia/Canberra' => 'Australia/Sydney',
+        'Australia/LHI' => 'Australia/Lord_Howe',
+        'Australia/NSW' => 'Australia/Sydney',
+        'Australia/North' => 'Australia/Darwin',
+        'Australia/Queensland' => 'Australia/Brisbane',
+        'Australia/South' => 'Australia/Adelaide',
+        'Australia/Tasmania' => 'Australia/Hobart',
+        'Australia/Victoria' => 'Australia/Melbourne',
+        'Australia/West' => 'Australia/Perth',
+        'Australia/Yancowinna' => 'Australia/Broken_Hill',
+        'Brazil/Acre' => 'America/Rio_Branco',
+        'Brazil/DeNoronha' => 'America/Noronha',
+        'Brazil/East' => 'America/Sao_Paulo',
+        'Brazil/West' => 'America/Manaus',
+        'Canada/Atlantic' => 'America/Halifax',
+        'Canada/Central' => 'America/Winnipeg',
+        'Canada/East-Saskatchewan' => 'America/Regina',
+        'Canada/Eastern' => 'America/Toronto',
+        'Canada/Mountain' => 'America/Edmonton',
+        'Canada/Newfoundland' => 'America/St_Johns',
+        'Canada/Pacific' => 'America/Vancouver',
+        'Canada/Saskatchewan' => 'America/Regina',
+        'Canada/Yukon' => 'America/Whitehorse',
+        'Chile/Continental' => 'America/Santiago',
+        'Chile/EasterIsland' => 'Pacific/Easter',
+        'Cuba' => 'America/Havana',
+        'Egypt' => 'Africa/Cairo',
+        'Eire' => 'Europe/Dublin',
+        'Europe/Belfast' => 'Europe/London',
+        'Europe/Tiraspol' => 'Europe/Chisinau',
+        'GB' => 'Europe/London',
+        'GB-Eire' => 'Europe/London',
+        'Greenwich' => 'Etc/GMT',
+        'Hongkong' => 'Asia/Hong_Kong',
+        'Iceland' => 'Atlantic/Reykjavik',
+        'Iran' => 'Asia/Tehran',
+        'Israel' => 'Asia/Jerusalem',
+        'Jamaica' => 'America/Jamaica',
+        'Japan' => 'Asia/Tokyo',
+        'Kwajalein' => 'Pacific/Kwajalein',
+        'Libya' => 'Africa/Tripoli',
+        'Mexico/BajaNorte' => 'America/Tijuana',
+        'Mexico/BajaSur' => 'America/Mazatlan',
+        'Mexico/General' => 'America/Mexico_City',
+        'NZ' => 'Pacific/Auckland',
+        'NZ-CHAT' => 'Pacific/Chatham',
+        'Navajo' => 'America/Denver',
+        'PRC' => 'Asia/Shanghai',
+        'Pacific/Ponape' => 'Pacific/Pohnpei',
+        'Pacific/Samoa' => 'Pacific/Pago_Pago',
+        'Pacific/Truk' => 'Pacific/Chuuk',
+        'Pacific/Yap' => 'Pacific/Chuuk',
+        'Poland' => 'Europe/Warsaw',
+        'Portugal' => 'Europe/Lisbon',
+        'ROC' => 'Asia/Taipei',
+        'ROK' => 'Asia/Seoul',
+        'Singapore' => 'Asia/Singapore',
+        'Turkey' => 'Europe/Istanbul',
+        'UCT' => 'Etc/UCT',
+        'US/Alaska' => 'America/Anchorage',
+        'US/Aleutian' => 'America/Adak',
+        'US/Arizona' => 'America/Phoenix',
+        'US/Central' => 'America/Chicago',
+        'US/East-Indiana' => 'America/Indiana/Indianapolis',
+        'US/Eastern' => 'America/New_York',
+        'US/Hawaii' => 'Pacific/Honolulu',
+        'US/Indiana-Starke' => 'America/Indiana/Knox',
+        'US/Michigan' => 'America/Detroit',
+        'US/Mountain' => 'America/Denver',
+        'US/Pacific' => 'America/Los_Angeles',
+        'US/Samoa' => 'Pacific/Pago_Pago',
+        'Universal' => 'Etc/UTC',
+        'W-SU' => 'Europe/Moscow',
+        'Zulu' => 'Etc/UTC',
+    );
+
     /**
      * Factory method to instantiate a kolab_format object of the given type and version
      *
@@ -63,7 +174,7 @@ abstract class kolab_format
         if (!self::supports($version))
             return PEAR::raiseError("No support for Kolab format version " . $version);
 
-        $type = preg_replace('/configuration\.[a-z.]+$/', 'configuration', $type);
+        $type = preg_replace('/configuration\.[a-z._]+$/', 'configuration', $type);
         $suffix = preg_replace('/[^a-z]+/', '', $type);
         $classname = 'kolab_format_' . $suffix;
         if (class_exists($classname))
@@ -112,7 +223,7 @@ abstract class kolab_format
                 if ($tz) $datetime->setTimezone($tz);
             }
             else if (is_string($datetime) && strlen($datetime)) {
-                $datetime = new DateTime($datetime, $tz ?: null);
+                $datetime = $tz ? new DateTime($datetime, $tz) : new DateTime($datetime);
             }
         }
         catch (Exception $e) {}
@@ -123,10 +234,15 @@ abstract class kolab_format
             if (!$dateonly)
                 $result->setTime($datetime->format('G'), $datetime->format('i'), $datetime->format('s'));
 
-            if ($tz && in_array($tz->getName(), array('UTC', 'GMT', '+00:00', 'Z')))
+            if ($tz && in_array($tz->getName(), array('UTC', 'GMT', '+00:00', 'Z'))) {
                 $result->setUTC(true);
-            else if ($tz !== false)
-                $result->setTimezone($tz->getName());
+            }
+            else if ($tz !== false) {
+                $tzid = $tz->getName();
+                if (array_key_exists($tzid, self::$timezone_map))
+                    $tzid = self::$timezone_map[$tzid];
+                $result->setTimezone($tzid);
+            }
         }
 
         return $result;
diff --git a/lib/plugins/libkolab/lib/kolab_format_configuration.php b/lib/plugins/libkolab/lib/kolab_format_configuration.php
index 17b46a7..ceb7ebb 100644
--- a/lib/plugins/libkolab/lib/kolab_format_configuration.php
+++ b/lib/plugins/libkolab/lib/kolab_format_configuration.php
@@ -24,7 +24,7 @@
 
 class kolab_format_configuration extends kolab_format
 {
-    public $CTYPE   = 'application/x-vnd.kolab.configuration';
+    public $CTYPE   = 'application/vnd.kolab+xml';
     public $CTYPEv2 = 'application/x-vnd.kolab.configuration';
 
     protected $objclass   = 'Configuration';
@@ -32,12 +32,14 @@ class kolab_format_configuration extends kolab_format
     protected $write_func = 'writeConfiguration';
 
     private $type_map = array(
-        'category'   => Configuration::TypeCategoryColor,
-        'dictionary' => Configuration::TypeDictionary,
-        'relation'   => Configuration::TypeRelation,
-        'snippet'    => Configuration::TypeSnippet,
+        'category'    => Configuration::TypeCategoryColor,
+        'dictionary'  => Configuration::TypeDictionary,
+        'file_driver' => Configuration::TypeFileDriver,
+        'relation'    => Configuration::TypeRelation,
+        'snippet'     => Configuration::TypeSnippet,
     );
 
+    private $driver_settings_fields = array('host', 'port', 'username', 'password');
 
     /**
      * Set properties to the kolabformat object
@@ -46,9 +48,6 @@ class kolab_format_configuration extends kolab_format
      */
     public function set(&$object)
     {
-        // set common object properties
-        parent::set($object);
-
         // read type-specific properties
         switch ($object['type']) {
         case 'dictionary':
@@ -63,6 +62,21 @@ class kolab_format_configuration extends kolab_format
             $this->obj = new Configuration($categories);
             break;
 
+        case 'file_driver':
+            $driver = new FileDriver($object['driver'], $object['title']);
+
+            $driver->setEnabled((bool) $object['enabled']);
+
+            foreach ($this->driver_settings_fields as $field) {
+                $value = $object[$field];
+                if ($value !== null) {
+                    $driver->{'set' . ucfirst($field)}($value);
+                }
+            }
+
+            $this->obj = new Configuration($driver);
+            break;
+
         case 'relation':
             $relation = new Relation(strval($object['name']), strval($object['category']));
 
@@ -109,7 +123,12 @@ class kolab_format_configuration extends kolab_format
         }
 
         // adjust content-type string
-        $this->CTYPE = $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
+        $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
+
+        // reset old object data, otherwise set() will overwrite current data (#4095)
+        $this->xmldata = null;
+        // set common object properties
+        parent::set($object);
 
         // cache this data
         $this->data = $object;
@@ -157,6 +176,19 @@ class kolab_format_configuration extends kolab_format
             // TODO: implement this
             break;
 
+        case 'file_driver':
+            $driver = $this->obj->fileDriver();
+
+            $object['driver']  = $driver->driver();
+            $object['title']   = $driver->title();
+            $object['enabled'] = $driver->enabled();
+
+            foreach ($this->driver_settings_fields as $field) {
+                $object[$field] = $driver->{$field}();
+            }
+
+            break;
+
         case 'relation':
             $relation = $this->obj->relation();
 
@@ -192,7 +224,7 @@ class kolab_format_configuration extends kolab_format
 
         // adjust content-type string
         if ($object['type']) {
-            $this->CTYPE = $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
+            $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
         }
 
         $this->data = $object;
@@ -241,6 +273,10 @@ class kolab_format_configuration extends kolab_format
             else if (!empty($member['params']['message-id'])) {
                 $words[] = $member['params']['message-id'];
             }
+            else {
+                // derive message identifier from URI
+                $words[] = md5($url);
+            }
         }
 
         return $words;
diff --git a/lib/plugins/libkolab/lib/kolab_format_event.php b/lib/plugins/libkolab/lib/kolab_format_event.php
index c233f44..8cad89a 100644
--- a/lib/plugins/libkolab/lib/kolab_format_event.php
+++ b/lib/plugins/libkolab/lib/kolab_format_event.php
@@ -96,11 +96,13 @@ class kolab_format_event extends kolab_format_xcal
         // save recurrence exceptions
         if (is_array($object['recurrence']) && $object['recurrence']['EXCEPTIONS']) {
             $vexceptions = new vectorevent;
-            foreach((array)$object['recurrence']['EXCEPTIONS'] as $exception) {
+            foreach((array)$object['recurrence']['EXCEPTIONS'] as $i => $exception) {
                 $exevent = new kolab_format_event;
-                $exevent->set($this->compact_exception($exception, $object));  // only save differing values
+                $exevent->set(($compacted = $this->compact_exception($exception, $object)));  // only save differing values
                 $exevent->obj->setRecurrenceID(self::get_datetime($exception['start'], null, true), (bool)$exception['thisandfuture']);
                 $vexceptions->push($exevent->obj);
+                // write cleaned-up exception data back to memory/cache
+                $object['recurrence']['EXCEPTIONS'][$i] = $this->expand_exception($compacted, $object);
             }
             $this->obj->setExceptions($vexceptions);
         }
@@ -217,6 +219,12 @@ class kolab_format_event extends kolab_format_xcal
         }
       }
 
+      foreach ($master as $prop => $value) {
+        if (isset($exception[$prop]) && gettype($exception[$prop]) == gettype($value) && $exception[$prop] == $value) {
+          unset($exception[$prop]);
+        }
+      }
+
       return $exception;
     }
 
diff --git a/lib/plugins/libkolab/lib/kolab_format_xcal.php b/lib/plugins/libkolab/lib/kolab_format_xcal.php
index 421ee92..ad54505 100644
--- a/lib/plugins/libkolab/lib/kolab_format_xcal.php
+++ b/lib/plugins/libkolab/lib/kolab_format_xcal.php
@@ -237,7 +237,7 @@ abstract class kolab_format_xcal extends kolab_format
 
                 if ($type == 'EMAIL') {
                     $valarm['attendees'] = array();
-                    $attvec = $this->obj->attendees();
+                    $attvec = $alarm->attendees();
                     for ($j=0; $j < $attvec->size(); $j++) {
                         $cr = $attvec->get($j);
                         $valarm['attendees'][] = $cr->email();
@@ -364,14 +364,17 @@ abstract class kolab_format_xcal extends kolab_format
                 $cr = new ContactReference(ContactReference::EmailReference, $attendee['email']);
                 $cr->setName($attendee['name']);
 
+                // set attendee RSVP if missing
+                if (!isset($attendee['rsvp'])) {
+                    $object['attendees'][$i]['rsvp'] = $attendee['rsvp'] = true;
+                }
+
                 $att = new Attendee;
                 $att->setContact($cr);
                 $att->setPartStat($this->part_status_map[$attendee['status']]);
                 $att->setRole($this->role_map[$attendee['role']] ? $this->role_map[$attendee['role']] : kolabformat::Required);
                 $att->setCutype($this->cutype_map[$attendee['cutype']] ? $this->cutype_map[$attendee['cutype']] : kolabformat::CutypeIndividual);
-                $att->setRSVP((bool)$attendee['rsvp'] || $reschedule);
-
-                $object['attendees'][$i]['rsvp'] = $attendee['rsvp'] || $reschedule;
+                $att->setRSVP((bool)$attendee['rsvp']);
 
                 if (!empty($attendee['delegated-from'])) {
                     $vdelegators = new vectorcontactref;
diff --git a/lib/plugins/libkolab/lib/kolab_storage.php b/lib/plugins/libkolab/lib/kolab_storage.php
index 7287fc2..47c1e4b 100644
--- a/lib/plugins/libkolab/lib/kolab_storage.php
+++ b/lib/plugins/libkolab/lib/kolab_storage.php
@@ -35,6 +35,11 @@ class kolab_storage
     const UID_KEY_PRIVATE   = '/private/vendor/kolab/uniqueid';
     const UID_KEY_CYRUS     = '/shared/vendor/cmu/cyrus-imapd/uniqueid';
 
+    const ERROR_IMAP_CONN      = 1;
+    const ERROR_CACHE_DB       = 2;
+    const ERROR_NO_PERMISSION  = 3;
+    const ERROR_INVALID_FOLDER = 4;
+
     public static $version = '3.0';
     public static $last_error;
     public static $encode_ids = false;
@@ -139,7 +144,6 @@ class kolab_storage
         return self::$ldap;
     }
 
-
     /**
      * Get a list of storage folders for the given data type
      *
@@ -154,7 +158,7 @@ class kolab_storage
 
         if (self::setup()) {
             foreach ((array)self::list_folders('', '*', $type, $subscribed, $folderdata) as $foldername) {
-                $folders[$foldername] = new kolab_storage_folder($foldername, $folderdata[$foldername]);
+                $folders[$foldername] = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
             }
         }
 
@@ -171,26 +175,26 @@ class kolab_storage
     {
         if (self::setup()) {
             foreach ((array)self::list_folders('', '*', $type . '.default', false, $folderdata) as $foldername) {
-                return new kolab_storage_folder($foldername, $folderdata[$foldername]);
+                return new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
             }
         }
 
         return null;
     }
 
-
     /**
      * Getter for a specific storage folder
      *
-     * @param string  IMAP folder to access (UTF7-IMAP)
+     * @param string IMAP folder to access (UTF7-IMAP)
+     * @param string Expected folder type
+     *
      * @return object kolab_storage_folder  The folder object
      */
-    public static function get_folder($folder)
+    public static function get_folder($folder, $type = null)
     {
-        return self::setup() ? new kolab_storage_folder($folder) : null;
+        return self::setup() ? new kolab_storage_folder($folder, $type) : null;
     }
 
-
     /**
      * Getter for a single Kolab object, identified by its UID.
      * This will search all folders storing objects of the given type.
@@ -203,11 +207,11 @@ class kolab_storage
     {
         self::setup();
         $folder = null;
-        foreach ((array)self::list_folders('', '*', $type) as $foldername) {
+        foreach ((array)self::list_folders('', '*', $type, null, $folderdata) as $foldername) {
             if (!$folder)
-                $folder = new kolab_storage_folder($foldername);
+                $folder = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
             else
-                $folder->set_folder($foldername);
+                $folder->set_folder($foldername, $type, $folderdata[$foldername]);
 
             if ($object = $folder->get_object($uid, '*'))
                 return $object;
@@ -230,11 +234,11 @@ class kolab_storage
         $folder = null;
         $result = array();
 
-        foreach ((array)self::list_folders('', '*', $type) as $foldername) {
+        foreach ((array)self::list_folders('', '*', $type, null, $folderdata) as $foldername) {
             if (!$folder)
-                $folder = new kolab_storage_folder($foldername);
+                $folder = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
             else
-                $folder->set_folder($foldername);
+                $folder->set_folder($foldername, $type, $folderdata[$foldername]);
 
             foreach ($folder->select($query, '*') as $object) {
                 $result[] = $object;
@@ -245,13 +249,16 @@ class kolab_storage
     }
 
     /**
-     *
+     * Returns Free-busy server URL
      */
     public static function get_freebusy_server()
     {
-        return unslashify(self::$config->get('kolab_freebusy_server', 'https://' . $_SESSION['imap_host'] . '/freebusy'));
-    }
+        $url = 'https://' . $_SESSION['imap_host'] . '/freebusy';
+        $url = self::$config->get('kolab_freebusy_server', $url);
+        $url = rcube_utils::resolve_url($url);
 
+        return unslashify($url);
+    }
 
     /**
      * Compose an URL to query the free/busy status for the given user
@@ -261,7 +268,6 @@ class kolab_storage
         return self::get_freebusy_server() . '/' . $email . '.ifb';
     }
 
-
     /**
      * Creates folder ID from folder name
      *
@@ -276,7 +282,6 @@ class kolab_storage
             asciiwords(strtr($folder, '/.-', '___'));
     }
 
-
     /**
      * Encode the given ID to a safe ascii representation
      *
@@ -300,7 +305,6 @@ class kolab_storage
       return base64_decode(str_pad(strtr($id, '-_', '+/'), strlen($id) % 4, '=', STR_PAD_RIGHT));
     }
 
-
     /**
      * Return the (first) path of the requested IMAP namespace
      *
@@ -403,13 +407,13 @@ class kolab_storage
             'oldname' => $oldname, 'newname' => $newname));
 
         $oldfolder = self::get_folder($oldname);
-        $active = self::folder_is_active($oldname);
-        $success = self::$imap->rename_folder($oldname, $newname);
+        $active    = self::folder_is_active($oldname);
+        $success   = self::$imap->rename_folder($oldname, $newname);
         self::$last_error = self::$imap->get_error_str();
 
         // pass active state to new folder name
         if ($success && $active) {
-            self::set_state($oldnam, false);
+            self::set_state($oldname, false);
             self::set_state($newname, true);
         }
 
@@ -901,7 +905,7 @@ class kolab_storage
                 !self::folder_is_subscribed($foldername, true) &&
                 !in_array(self::$imap->folder_namespace($foldername), (array)$exclude_ns)
               ) {
-                $folders[] = new kolab_storage_folder($foldername, $folderdata[$foldername]);
+                $folders[] = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
             }
         }
 
@@ -974,7 +978,7 @@ class kolab_storage
                     $parent_parent = join($delim, $path);
                     if (!$refs[$parent]) {
                         if ($folder->type && self::folder_type($parent) == $folder->type) {
-                            $refs[$parent] = new kolab_storage_folder($parent, $folder->type);
+                            $refs[$parent] = new kolab_storage_folder($parent, $folder->type, $folder->type);
                             $refs[$parent]->parent = $parent_parent;
                         }
                         else if ($parent_parent == $other_ns) {
@@ -1049,7 +1053,8 @@ class kolab_storage
                         foreach ((array)self::$imap->get_metadata('%', $type_keys) as $folder => $metadata) {
                             if (!in_array($folder, $blacklist)) {
                                 $folderdata[$folder] = $metadata;
-                                if ($data = self::$imap->get_metadata($folder.$delimiter.'*', $type_keys)) {
+                                $opts = self::$imap->folder_attributes($folder);
+                                if (!in_array('\\HasNoChildren', $opts) && ($data = self::$imap->get_metadata($folder.$delimiter.'*', $type_keys))) {
                                     $folderdata += $data;
                                 }
                             }
@@ -1085,7 +1090,7 @@ class kolab_storage
             return $types[self::CTYPE_KEY_PRIVATE];
         }
         else if (!empty($types[self::CTYPE_KEY])) {
-            list($ctype, $suffix) = explode('.', $types[self::CTYPE_KEY]);
+            list($ctype, ) = explode('.', $types[self::CTYPE_KEY]);
             return $ctype;
         }
         return null;
@@ -1104,8 +1109,10 @@ class kolab_storage
         self::setup();
 
         // return in-memory cached result
-        if (is_array(self::$typedata['*']) && array_key_exists($folder, self::$typedata['*'])) {
-            return self::$typedata['*'][$folder];
+        foreach (self::$typedata as $typedata) {
+            if (array_key_exists($folder, $typedata)) {
+                return $typedata[$folder];
+            }
         }
 
         $metadata = self::$imap->get_metadata($folder, array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE));
@@ -1190,7 +1197,7 @@ class kolab_storage
             }
         }
         else if (self::$imap->subscribe($folder)) {
-            self::$subscriptions === null;
+            self::$subscriptions = null;
             return true;
         }
 
@@ -1218,7 +1225,7 @@ class kolab_storage
             return true;
         }
         else if (self::$imap->unsubscribe($folder)) {
-            self::$subscriptions === null;
+            self::$subscriptions = null;
             return true;
         }
 
@@ -1461,7 +1468,7 @@ class kolab_storage
         $user_attrib = self::$config->get('kolab_users_id_attrib', self::$config->get('kolab_auth_login', 'mail'));
 
         array_walk($results, function(&$user, $dn) use ($root, $user_attrib) {
-            list($localpart, $domain) = explode('@', $user[$user_attrib]);
+            list($localpart, ) = explode('@', $user[$user_attrib]);
             $user['kolabtargetfolder'] = $root . $localpart;
         });
 
@@ -1534,6 +1541,16 @@ class kolab_storage
                     $folders[$foldername] = new kolab_storage_folder_user($foldername, $other_ns);
                 }
             }
+
+            // for every (subscribed) user folder, list all (unsubscribed) subfolders
+            foreach ($folders as $userfolder) {
+                foreach ((array)self::list_folders($userfolder->name . $delimiter, '*', $type, false, $folderdata) as $foldername) {
+                    if (!$folders[$foldername]) {
+                        $folders[$foldername] = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
+                        $userfolder->children[] = $folders[$foldername];
+                    }
+                }
+            }
         }
 
         return $folders;
@@ -1549,8 +1566,6 @@ class kolab_storage
     {
         $db = rcmail::get_instance()->get_dbh();
         $prefix = 'imap://' . urlencode($args['username']) . '@' . $args['host'] . '/%';
-        $db->query("DELETE FROM " . $db->table_name('kolab_folders') . " WHERE resource LIKE ?", $prefix);
+        $db->query("DELETE FROM " . $db->table_name('kolab_folders', true) . " WHERE `resource` LIKE ?", $prefix);
     }
-
 }
-
diff --git a/lib/plugins/libkolab/lib/kolab_storage_cache.php b/lib/plugins/libkolab/lib/kolab_storage_cache.php
index d56f04d..227fa4e 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_cache.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_cache.php
@@ -26,6 +26,8 @@ class kolab_storage_cache
 {
     const DB_DATE_FORMAT = 'Y-m-d H:i:s';
 
+    public $sync_complete = false;
+
     protected $db;
     protected $imap;
     protected $folder;
@@ -46,6 +48,7 @@ class kolab_storage_cache
     protected $extra_cols = array();
     protected $order_by = null;
     protected $limit = null;
+    protected $error = 0;
 
 
     /**
@@ -78,6 +81,7 @@ class kolab_storage_cache
         $this->db = $rcmail->get_dbh();
         $this->imap = $rcmail->get_storage();
         $this->enabled = $rcmail->config->get('kolab_cache', false);
+        $this->folders_table = $this->db->table_name('kolab_folders');
 
         if ($this->enabled) {
             // always read folder cache and lock state from DB master
@@ -96,8 +100,7 @@ class kolab_storage_cache
      */
     public function select_by_id($folder_id)
     {
-        $folders_table = $this->db->table_name('kolab_folders');
-        $sql_arr = $this->db->fetch_assoc($this->db->query("SELECT * FROM $folders_table WHERE folder_id=?", $folder_id));
+        $sql_arr = $this->db->fetch_assoc($this->db->query("SELECT * FROM `{$this->folders_table}` WHERE `folder_id` = ?", $folder_id));
         if ($sql_arr) {
             $this->metadata = $sql_arr;
             $this->folder_id = $sql_arr['folder_id'];
@@ -118,14 +121,13 @@ class kolab_storage_cache
     {
         $this->folder = $storage_folder;
 
-        if (empty($this->folder->name)) {
+        if (empty($this->folder->name) || !$this->folder->valid) {
             $this->ready = false;
             return;
         }
 
         // compose fully qualified ressource uri for this instance
         $this->resource_uri = $this->folder->get_resource_uri();
-        $this->folders_table = $this->db->table_name('kolab_folders');
         $this->cache_table = $this->db->table_name('kolab_cache_' . $this->folder->type);
         $this->ready = $this->enabled && !empty($this->folder->type);
         $this->folder_id = null;
@@ -149,6 +151,16 @@ class kolab_storage_cache
     }
 
     /**
+     * Returns code of last error
+     *
+     * @return int Error code
+     */
+    public function get_error()
+    {
+        return $this->error;
+    }
+
+    /**
      * Synchronize local cache data with remote
      */
     public function synchronize()
@@ -158,7 +170,14 @@ class kolab_storage_cache
             return;
 
         // increase time limit
-        @set_time_limit($this->max_sync_lock_time);
+        @set_time_limit($this->max_sync_lock_time - 60);
+
+        // get effective time limit we have for synchronization (~70% of the execution time)
+        $time_limit = ini_get('max_execution_time') * 0.7;
+        $sync_start = time();
+
+        // assume sync will be completed
+        $this->sync_complete = true;
 
         if (!$this->ready) {
             // kolab cache is disabled, synchronize IMAP mailbox cache only
@@ -188,20 +207,26 @@ class kolab_storage_cache
 
                     // read cache index
                     $sql_result = $this->db->query(
-                        "SELECT msguid, uid FROM $this->cache_table WHERE folder_id=?",
+                        "SELECT `msguid`, `uid` FROM `{$this->cache_table}` WHERE `folder_id` = ?",
                         $this->folder_id
                     );
 
                     $old_index = array();
                     while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
                         $old_index[] = $sql_arr['msguid'];
-                        $this->uid2msg[$sql_arr['uid']] = $sql_arr['msguid'];
                     }
 
                     // fetch new objects from imap
+                    $i = 0;
                     foreach (array_diff($imap_index, $old_index) as $msguid) {
                         if ($object = $this->folder->read_object($msguid, '*')) {
                             $this->_extended_insert($msguid, $object);
+
+                            // check time limit and abort sync if running too long
+                            if (++$i % 50 == 0 && time() - $sync_start > $time_limit) {
+                                $this->sync_complete = false;
+                                break;
+                            }
                         }
                     }
                     $this->_extended_insert(0, null);
@@ -211,13 +236,15 @@ class kolab_storage_cache
                     if (!empty($del_index)) {
                         $quoted_ids = join(',', array_map(array($this->db, 'quote'), $del_index));
                         $this->db->query(
-                            "DELETE FROM $this->cache_table WHERE folder_id=? AND msguid IN ($quoted_ids)",
+                            "DELETE FROM `{$this->cache_table}` WHERE `folder_id` = ? AND `msguid` IN ($quoted_ids)",
                             $this->folder_id
                         );
                     }
 
                     // update ctag value (will be written to database in _sync_unlock())
-                    $this->metadata['ctag'] = $this->folder->get_ctag();
+                    if ($this->sync_complete) {
+                        $this->metadata['ctag'] = $this->folder->get_ctag();
+                    }
                 }
 
                 $this->bypass(false);
@@ -227,6 +254,7 @@ class kolab_storage_cache
             }
         }
 
+        $this->check_error();
         $this->synched = time();
     }
 
@@ -243,7 +271,12 @@ class kolab_storage_cache
     {
         // delegate to another cache instance
         if ($foldername && $foldername != $this->folder->name) {
-            return kolab_storage::get_folder($foldername)->cache->get($msguid, $type);
+            $success = false;
+            if ($targetfolder = kolab_storage::get_folder($foldername)) {
+                $success = $targetfolder->cache->get($msguid, $type);
+                $this->error = $targetfolder->cache->get_error();
+            }
+            return $success;
         }
 
         // load object if not in memory
@@ -252,8 +285,8 @@ class kolab_storage_cache
                 $this->_read_folder_data();
 
                 $sql_result = $this->db->query(
-                    "SELECT * FROM $this->cache_table ".
-                    "WHERE folder_id=? AND msguid=?",
+                    "SELECT * FROM `{$this->cache_table}` ".
+                    "WHERE `folder_id` = ? AND `msguid` = ?",
                     $this->folder_id,
                     $msguid
                 );
@@ -265,11 +298,14 @@ class kolab_storage_cache
 
             // fetch from IMAP if not present in cache
             if (empty($this->objects[$msguid])) {
-                $result = $this->_fetch(array($msguid), $type, $foldername);
-                $this->objects = array($msguid => $result[0]);  // store only this object in memory (#2827)
+                if ($object = $this->folder->read_object($msguid, $type ?: '*', $foldername)) {
+                    $this->objects = array($msguid => $object);
+                    $this->set($msguid, $object);
+                }
             }
         }
 
+        $this->check_error();
         return $this->objects[$msguid];
     }
 
@@ -289,14 +325,17 @@ class kolab_storage_cache
 
         // delegate to another cache instance
         if ($foldername && $foldername != $this->folder->name) {
-            kolab_storage::get_folder($foldername)->cache->set($msguid, $object);
-            return;
+          if ($targetfolder = kolab_storage::get_folder($foldername)) {
+              $targetfolder->cache->set($msguid, $object);
+              $this->error = $targetfolder->cache->get_error();
+          }
+          return;
         }
 
         // remove old entry
         if ($this->ready) {
             $this->_read_folder_data();
-            $this->db->query("DELETE FROM $this->cache_table WHERE folder_id=? AND msguid=?",
+            $this->db->query("DELETE FROM `{$this->cache_table}` WHERE `folder_id` = ? AND `msguid` = ?",
                 $this->folder_id, $msguid);
         }
 
@@ -308,6 +347,8 @@ class kolab_storage_cache
             // ...or set in-memory cache to false
             $this->objects[$msguid] = $object;
         }
+
+        $this->check_error();
     }
 
 
@@ -343,13 +384,13 @@ class kolab_storage_cache
                     $cols[$idx] = "$col = ?";
                 }
 
-                $query = "UPDATE $this->cache_table SET " . implode(', ', $cols)
-                    . " WHERE folder_id = ? AND msguid = ?";
+                $query = "UPDATE `{$this->cache_table}` SET " . implode(', ', $cols)
+                    . " WHERE `folder_id` = ? AND `msguid` = ?";
                 $args[] = $this->folder_id;
                 $args[] = $olduid;
             }
             else {
-                $query = "INSERT INTO $this->cache_table (created, " . implode(', ', $cols)
+                $query = "INSERT INTO `{$this->cache_table}` (`created`, " . implode(', ', $cols)
                     . ") VALUES (" . $this->db->now() . str_repeat(', ?', count($cols)) . ")";
             }
 
@@ -366,6 +407,8 @@ class kolab_storage_cache
         // keep a copy in memory for fast access
         $this->objects = array($msguid => $object);
         $this->uid2msg = array($object['uid'] => $msguid);
+
+        $this->check_error();
     }
 
 
@@ -374,20 +417,21 @@ class kolab_storage_cache
      *
      * @param string Entry's IMAP message UID
      * @param string Entry's Object UID
-     * @param string Target IMAP folder to move it to
+     * @param object kolab_storage_folder Target storage folder instance
      */
-    public function move($msguid, $uid, $target_folder)
+    public function move($msguid, $uid, $target)
     {
         if ($this->ready) {
-            $target = kolab_storage::get_folder($target_folder);
+            // clear cached uid mapping and force new lookup
+            unset($target->cache->uid2msg[$uid]);
 
             // resolve new message UID in target folder
             if ($new_msguid = $target->cache->uid2msguid($uid)) {
                 $this->_read_folder_data();
 
                 $this->db->query(
-                    "UPDATE $this->cache_table SET folder_id=?, msguid=? ".
-                    "WHERE folder_id=? AND msguid=?",
+                    "UPDATE `{$this->cache_table}` SET `folder_id` = ?, `msguid` = ? ".
+                    "WHERE `folder_id` = ? AND `msguid` = ?",
                     $target->cache->get_folder_id(),
                     $new_msguid,
                     $this->folder_id,
@@ -404,13 +448,14 @@ class kolab_storage_cache
         }
 
         unset($this->uid2msg[$uid]);
+        $this->check_error();
     }
 
 
     /**
      * Remove all objects from local cache
      */
-    public function purge($type = null)
+    public function purge()
     {
         if (!$this->ready) {
             return true;
@@ -419,7 +464,7 @@ class kolab_storage_cache
         $this->_read_folder_data();
 
         $result = $this->db->query(
-            "DELETE FROM $this->cache_table WHERE folder_id=?",
+            "DELETE FROM `{$this->cache_table}` WHERE `folder_id` = ?",
             $this->folder_id
         );
 
@@ -437,15 +482,20 @@ class kolab_storage_cache
             return;
         }
 
-        $target = kolab_storage::get_folder($new_folder);
+        if ($target = kolab_storage::get_folder($new_folder)) {
+            // resolve new message UID in target folder
+            $this->db->query(
+                "UPDATE `{$this->folders_table}` SET `resource` = ? ".
+                "WHERE `resource` = ?",
+                $target->get_resource_uri(),
+                $this->resource_uri
+            );
 
-        // resolve new message UID in target folder
-        $this->db->query(
-            "UPDATE $this->folders_table SET resource=? ".
-            "WHERE resource=?",
-            $target->get_resource_uri(),
-            $this->resource_uri
-        );
+            $this->check_error();
+        }
+        else {
+            $this->error = kolab_storage::ERROR_IMAP_CONN;
+        }
     }
 
     /**
@@ -466,8 +516,8 @@ class kolab_storage_cache
 
             // fetch full object data on one query if a small result set is expected
             $fetchall = !$uids && ($this->limit ? $this->limit[0] : $this->count($query)) < 500;
-            $sql_query = "SELECT " . ($fetchall ? '*' : 'msguid AS _msguid, uid') . " FROM $this->cache_table ".
-                         "WHERE folder_id=? " . $this->_sql_where($query);
+            $sql_query = "SELECT " . ($fetchall ? '*' : '`msguid` AS `_msguid`, `uid`') . " FROM `{$this->cache_table}` ".
+                         "WHERE `folder_id` = ? " . $this->_sql_where($query);
             if (!empty($this->order_by)) {
                 $sql_query .= ' ORDER BY ' . $this->order_by;
             }
@@ -510,6 +560,7 @@ class kolab_storage_cache
             }
 
             if ($index->is_error()) {
+                $this->check_error();
                 if ($uids) {
                     return null;
                 }
@@ -532,6 +583,8 @@ class kolab_storage_cache
             }
         }
 
+        $this->check_error();
+
         return $result;
     }
 
@@ -549,8 +602,8 @@ class kolab_storage_cache
             $this->_read_folder_data();
 
             $sql_result = $this->db->query(
-                "SELECT COUNT(*) AS numrows FROM $this->cache_table ".
-                "WHERE folder_id=? " . $this->_sql_where($query),
+                "SELECT COUNT(*) AS `numrows` FROM `{$this->cache_table}` ".
+                "WHERE `folder_id` = ?" . $this->_sql_where($query),
                 $this->folder_id
             );
 
@@ -574,6 +627,7 @@ class kolab_storage_cache
             }
 
             if ($index->is_error()) {
+                $this->check_error();
                 return null;
             }
 
@@ -582,6 +636,7 @@ class kolab_storage_cache
             $count = $index->count();
         }
 
+        $this->check_error();
         return $count;
     }
 
@@ -591,7 +646,7 @@ class kolab_storage_cache
     public function set_order_by($sortcols)
     {
         if (!empty($sortcols)) {
-            $this->order_by = join(', ', (array)$sortcols);
+            $this->order_by = '`' . join('`, `', (array)$sortcols) . '`';
         }
         else {
             $this->order_by = null;
@@ -787,6 +842,40 @@ class kolab_storage_cache
         $line = '';
         if ($object) {
             $sql_data = $this->_serialize($object);
+
+            // Skip multifolder insert for Oracle, we can't put long data inline
+            if ($this->db->db_provider == 'oracle') {
+                $extra_cols = '';
+                if ($this->extra_cols) {
+                    $extra_cols = array_map(function($n) { return "`{$n}`"; }, $this->extra_cols);
+                    $extra_cols = ', ' . join(', ', $extra_cols);
+                    $extra_args = str_repeat(', ?', count($this->extra_cols));
+                }
+
+                $params = array($this->folder_id, $msguid, $object['uid'], $sql_data['changed'],
+                    $sql_data['data'], $sql_data['xml'], $sql_data['tags'], $sql_data['words']);
+
+                foreach ($this->extra_cols as $col) {
+                    $params[] = $sql_data[$col];
+                }
+
+                $result = $this->db->query(
+                    "INSERT INTO `{$this->cache_table}` "
+                    . " (`folder_id`, `msguid`, `uid`, `created`, `changed`, `data`, `xml`, `tags`, `words` $extra_cols)"
+                    . " VALUES (?, ?, ?, " . $this->db->now() . ", ?, ?, ?, ?, ? $extra_args)",
+                    $params
+                );
+
+                if (!$this->db->affected_rows($result)) {
+                    rcube::raise_error(array(
+                        'code' => 900, 'type' => 'php',
+                        'message' => "Failed to write to kolab cache"
+                    ), true);
+                }
+
+                return;
+            }
+
             $values = array(
                 $this->db->quote($this->folder_id),
                 $this->db->quote($msguid),
@@ -805,12 +894,18 @@ class kolab_storage_cache
         }
 
         if ($buffer && (!$msguid || (strlen($buffer) + strlen($line) > $this->max_sql_packet()))) {
-            $extra_cols = $this->extra_cols ? ', ' . join(', ', $this->extra_cols) : '';
+            $extra_cols = '';
+            if ($this->extra_cols) {
+                $extra_cols = array_map(function($n) { return "`{$n}`"; }, $this->extra_cols);
+                $extra_cols = ', ' . join(', ', $extra_cols);
+            }
+
             $result = $this->db->query(
-                "INSERT INTO $this->cache_table ".
-                " (folder_id, msguid, uid, created, changed, data, xml, tags, words $extra_cols)".
+                "INSERT INTO `{$this->cache_table}` ".
+                " (`folder_id`, `msguid`, `uid`, `created`, `changed`, `data`, `xml`, `tags`, `words` $extra_cols)".
                 " VALUES $buffer"
             );
+
             if (!$this->db->affected_rows($result)) {
                 rcube::raise_error(array(
                     'code' => 900, 'type' => 'php',
@@ -847,13 +942,20 @@ class kolab_storage_cache
         if (!empty($this->folder_id) || !$this->ready)
             return;
 
-        $sql_arr = $this->db->fetch_assoc($this->db->query("SELECT folder_id, synclock, ctag FROM $this->folders_table WHERE resource=?", $this->resource_uri));
+        $sql_arr = $this->db->fetch_assoc($this->db->query(
+                "SELECT `folder_id`, `synclock`, `ctag`"
+                . " FROM `{$this->folders_table}` WHERE `resource` = ?",
+                $this->resource_uri
+        ));
+
         if ($sql_arr) {
             $this->metadata = $sql_arr;
             $this->folder_id = $sql_arr['folder_id'];
         }
         else {
-            $this->db->query("INSERT INTO $this->folders_table (resource, type) VALUES (?, ?)", $this->resource_uri, $this->folder->type);
+            $this->db->query("INSERT INTO `{$this->folders_table}` (`resource`, `type`)"
+                . " VALUES (?, ?)", $this->resource_uri, $this->folder->type);
+
             $this->folder_id = $this->db->insert_id('kolab_folders');
             $this->metadata = array();
         }
@@ -868,24 +970,29 @@ class kolab_storage_cache
             return;
 
         $this->_read_folder_data();
-        $sql_query = "SELECT synclock, ctag FROM $this->folders_table WHERE folder_id=?";
 
         // abort if database is not set-up
         if ($this->db->is_error()) {
+            $this->check_error();
             $this->ready = false;
             return;
         }
 
-        $this->synclock = true;
+        $read_query  = "SELECT `synclock`, `ctag` FROM `{$this->folders_table}` WHERE `folder_id` = ?";
+        $write_query = "UPDATE `{$this->folders_table}` SET `synclock` = ? WHERE `folder_id` = ? AND `synclock` = ?";
 
-        // wait if locked (expire locks after 10 minutes)
-        while ($this->metadata && intval($this->metadata['synclock']) > 0 && $this->metadata['synclock'] + $this->max_sync_lock_time > time()) {
+        // wait if locked (expire locks after 10 minutes) ...
+        // ... or if setting lock fails (another process meanwhile set it)
+        while (
+            (intval($this->metadata['synclock']) + $this->max_sync_lock_time > time()) ||
+            (($res = $this->db->query($write_query, time(), $this->folder_id, intval($this->metadata['synclock']))) &&
+                !($affected = $this->db->affected_rows($res)))
+        ) {
             usleep(500000);
-            $this->metadata = $this->db->fetch_assoc($this->db->query($sql_query, $this->folder_id));
+            $this->metadata = $this->db->fetch_assoc($this->db->query($read_query, $this->folder_id));
         }
 
-        // set lock
-        $this->db->query("UPDATE $this->folders_table SET synclock = ? WHERE folder_id = ?", time(), $this->folder_id);
+        $this->synclock = $affected > 0;
     }
 
     /**
@@ -897,7 +1004,7 @@ class kolab_storage_cache
             return;
 
         $this->db->query(
-            "UPDATE $this->folders_table SET synclock = 0, ctag = ? WHERE folder_id = ?",
+            "UPDATE `{$this->folders_table}` SET `synclock` = 0, `ctag` = ? WHERE `folder_id` = ?",
             $this->metadata['ctag'],
             $this->folder_id
         );
@@ -906,6 +1013,22 @@ class kolab_storage_cache
     }
 
     /**
+     * Check IMAP connection error state
+     */
+    protected function check_error()
+    {
+        if (($err_code = $this->imap->get_error_code()) < 0) {
+            $this->error = kolab_storage::ERROR_IMAP_CONN;
+            if (($res_code = $this->imap->get_response_code()) !== 0 && in_array($res_code, array(rcube_storage::NOPERM, rcube_storage::READONLY))) {
+                $this->error = kolab_storage::ERROR_NO_PERMISSION;
+            }
+        }
+        else if ($this->db->is_error()) {
+            $this->error = kolab_storage::ERROR_CACHE_DB;
+        }
+    }
+
+    /**
      * Resolve an object UID into an IMAP message UID
      *
      * @param string  Kolab object UID
@@ -919,8 +1042,8 @@ class kolab_storage_cache
             $this->_read_folder_data();
 
             $sql_result = $this->db->query(
-                "SELECT msguid FROM $this->cache_table ".
-                "WHERE folder_id=? AND uid=? ORDER BY msguid DESC",
+                "SELECT `msguid` FROM `{$this->cache_table}` ".
+                "WHERE `folder_id` = ? AND `uid` = ? ORDER BY `msguid` DESC",
                 $this->folder_id,
                 $uid
             );
diff --git a/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php b/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php
index ec015dd..c3c7ac4 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php
@@ -39,6 +39,28 @@ class kolab_storage_cache_configuration extends kolab_storage_cache
     }
 
     /**
+     * Select Kolab objects filtered by the given query
+     *
+     * @param array Pseudo-SQL query as list of filter parameter triplets
+     * @param boolean Set true to only return UIDs instead of complete objects
+     * @return array List of Kolab data objects (each represented as hash array) or UIDs
+     */
+    public function select($query = array(), $uids = false)
+    {
+        // modify query for IMAP search: query param 'type' is actually a subtype
+        if (!$this->ready) {
+            foreach ($query as $i => $tuple) {
+                if ($tuple[0] == 'type') {
+                    $tuple[2] = 'configuration.' . $tuple[2];
+                    $query[$i] = $tuple;
+                }
+            }
+        }
+
+        return parent::select($query, $uids);
+    }
+
+    /**
      * Helper method to compose a valid SQL query from pseudo filter triplets
      */
     protected function _sql_where($query)
diff --git a/lib/plugins/libkolab/lib/kolab_storage_config.php b/lib/plugins/libkolab/lib/kolab_storage_config.php
index 9bc5d50..036b827 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_config.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_config.php
@@ -125,6 +125,7 @@ class kolab_storage_config
             }
 
             foreach ($folder->select($filter) as $object) {
+                unset($object['_formatobj']);
                 $list[] = $object;
             }
         }
@@ -350,6 +351,8 @@ class kolab_storage_config
                 'params' => $params,
             );
         }
+
+        return false;
     }
 
     /**
@@ -626,20 +629,24 @@ class kolab_storage_config
             // use faster method
             if ($uid && $uid != '*') {
                 $filter[] = array('member', '=', $uid);
-                return $this->get_objects($filter, $default);
+                $tags = $this->get_objects($filter, $default);
+            }
+            else {
+                $this->tags = $tags = $this->get_objects($filter, $default);
             }
-
-            $this->tags = $this->get_objects($filter, $default);
+        }
+        else {
+            $tags = $this->tags;
         }
 
         if ($uid === '*') {
-            return $this->tags;
+            return $tags;
         }
 
         $result = array();
         $search = self::build_member_url($uid);
 
-        foreach ($this->tags as $tag) {
+        foreach ($tags as $tag) {
             if (in_array($search, (array) $tag['members'])) {
                 $result[] = $tag;
             }
@@ -649,6 +656,100 @@ class kolab_storage_config
     }
 
     /**
+     * Find objects linked with the given groupware object through a relation
+     *
+     * @param string Object UUID
+     * @param array List of related URIs
+     */
+    public function get_object_links($uid)
+    {
+        $links = array();
+        $object_uri = self::build_member_url($uid);
+
+        foreach ($this->get_relations_for_member($uid) as $relation) {
+            if (in_array($object_uri, (array) $relation['members'])) {
+                // make relation members up-to-date
+                kolab_storage_config::resolve_members($relation);
+
+                foreach ($relation['members'] as $member) {
+                    if ($member != $object_uri) {
+                        $links[] = $member;
+                    }
+                }
+            }
+        }
+
+        return array_unique($links);
+    }
+
+    /**
+     *
+     */
+    public function save_object_links($uid, $links, $remove = array())
+    {
+        $object_uri = self::build_member_url($uid);
+        $relations = $this->get_relations_for_member($uid);
+        $done = false;
+
+        foreach ($relations as $relation) {
+            // make relation members up-to-date
+            kolab_storage_config::resolve_members($relation);
+
+            // remove and add links
+            $members = array_diff($relation['members'], (array)$remove);
+            $members = array_unique(array_merge($members, $links));
+
+            // make sure the object_uri is still a member
+            if (!in_array($object_uri, $members)) {
+                $members[$object_uri];
+            }
+
+            // remove relation if no other members remain
+            if (count($members) <= 1) {
+                $done = $this->delete($relation['uid']);
+            }
+            // update relation object if members changed
+            else if (count(array_diff($members, $relation['members'])) || count(array_diff($relation['members'], $members))) {
+                $relation['members'] = $members;
+                $done = $this->save($relation, 'relation');
+                $links = array();
+            }
+            // no changes, we're happy
+            else {
+                $done = true;
+                $links = array();
+            }
+        }
+
+        // create a new relation
+        if (!$done && !empty($links)) {
+            $relation = array(
+                'members'  => array_merge($links, array($object_uri)),
+                'category' => 'generic',
+            );
+
+            $ret = $this->save($relation, 'relation');
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Find relation objects referring to specified note
+     */
+    public function get_relations_for_member($uid, $reltype = 'generic')
+    {
+        $default = true;
+        $filter  = array(
+            array('type', '=', 'relation'),
+            array('category', '=', $reltype),
+            array('member', '=', $uid),
+        );
+
+        return $this->get_objects($filter, $default, 100);
+    }
+
+    /**
      * Find kolab objects assigned to specified e-mail message
      *
      * @param rcube_message $message E-mail message
@@ -659,6 +760,8 @@ class kolab_storage_config
      */
     public function get_message_relations($message, $folder, $type)
     {
+        static $_cache = array();
+
         $result  = array();
         $uids    = array();
         $default = true;
@@ -666,28 +769,42 @@ class kolab_storage_config
         $filter  = array(
             array('type', '=', 'relation'),
             array('category', '=', 'generic'),
-            // @TODO: what if Message-Id (and Date) does not exist?
-            array('member', '=', $message->get('message-id', false)),
         );
 
-        // get UIDs of assigned notes
-        foreach ($this->get_objects($filter, $default) as $relation) {
-            // we don't need to update members if the URI is found
-            if (in_array($uri, $relation['members'])) {
-                // update members...
-                $messages = kolab_storage_config::resolve_members($relation);
-                // ...and check again
-                if (empty($messages[$folder]) || !in_array($message->uid, $messages[$folder])) {
-                    continue;
+        // query by message-id
+        $member_id = $message->get('message-id', false);
+        if (empty($member_id)) {
+            // derive message identifier from URI
+            $member_id = md5($uri);
+        }
+        $filter[] = array('member', '=', $member_id);
+
+        if (!isset($_cache[$uri])) {
+            // get UIDs of related groupware objects
+            foreach ($this->get_objects($filter, $default) as $relation) {
+                // we don't need to update members if the URI is found
+                if (!in_array($uri, $relation['members'])) {
+                    // update members...
+                    $messages = kolab_storage_config::resolve_members($relation);
+                    // ...and check again
+                    if (empty($messages[$folder]) || !in_array($message->uid, $messages[$folder])) {
+                        continue;
+                    }
                 }
-            }
 
-            // find note UID(s)
-            foreach ($relation['members'] as $member) {
-                if (strpos($member, 'urn:uuid:') === 0) {
-                    $uids[] = substr($member, 9);
+                // find groupware object UID(s)
+                foreach ($relation['members'] as $member) {
+                    if (strpos($member, 'urn:uuid:') === 0) {
+                        $uids[] = substr($member, 9);
+                    }
                 }
             }
+
+            // remember this lookup
+            $_cache[$uri] = $uids;
+        }
+        else {
+            $uids = $_cache[$uri];
         }
 
         // get kolab objects of specified type
@@ -720,4 +837,30 @@ class kolab_storage_config
 
         return self::build_member_url($params);
     }
+
+    /**
+     * Resolve the email message reference from the given URI
+     */
+    public function get_message_reference($uri, $rel = null)
+    {
+        if ($linkref = self::parse_member_url($uri)) {
+            $linkref['subject'] = $linkref['params']['subject'];
+            $linkref['uri']     = $uri;
+
+            $rcmail = rcube::get_instance();
+            if (method_exists($rcmail, 'url')) {
+                $linkref['mailurl'] = $rcmail->url(array(
+                    'task'   => 'mail',
+                    'action' => 'show',
+                    'mbox'   => $linkref['folder'],
+                    'uid'    => $linkref['uid'],
+                    'rel'    => $rel,
+                ));
+            }
+
+            unset($linkref['params']);
+        }
+
+        return $linkref;
+    }
 }
diff --git a/lib/plugins/libkolab/lib/kolab_storage_folder.php b/lib/plugins/libkolab/lib/kolab_storage_folder.php
index ad6d5c0..ab3c63f 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_folder.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_folder.php
@@ -30,18 +30,28 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public $cache;
 
-    private $type_annotation;
-    private $resource_uri;
+    /**
+     * Indicate validity status
+     * @var boolean
+     */
+    public $valid = false;
+
+    protected $error = 0;
+
+    protected $resource_uri;
 
 
     /**
      * Default constructor
+     *
+     * @param string The folder name/path
+     * @param string Expected folder type
      */
-    function __construct($name, $type = null)
+    function __construct($name, $type = null, $type_annotation = null)
     {
         parent::__construct($name);
         $this->imap->set_options(array('skip_deleted' => true));
-        $this->set_folder($name, $type);
+        $this->set_folder($name, $type, $type_annotation);
     }
 
 
@@ -49,29 +59,63 @@ class kolab_storage_folder extends kolab_storage_folder_api
      * Set the IMAP folder this instance connects to
      *
      * @param string The folder name/path
+     * @param string Expected folder type
      * @param string Optional folder type if known
      */
-    public function set_folder($name, $type = null)
+    public function set_folder($name, $type = null, $type_annotation = null)
     {
-        $this->type_annotation = $type ? $type : kolab_storage::folder_type($name);
+        if (empty($type_annotation)) {
+            $type_annotation = kolab_storage::folder_type($name);
+        }
 
         $oldtype = $this->type;
-        list($this->type, $suffix) = explode('.', $this->type_annotation);
+        list($this->type, $suffix) = explode('.', $type_annotation);
         $this->default      = $suffix == 'default';
+        $this->subtype      = $this->default ? '' : $suffix;
         $this->name         = $name;
         $this->id           = kolab_storage::folder_id($name);
+        $this->valid        = !empty($this->type) && $this->type != 'mail' && (!$type || $this->type == $type);
+
+        if (!$this->valid) {
+            $this->error = $this->imap->get_error_code() < 0 ? kolab_storage::ERROR_IMAP_CONN : kolab_storage::ERROR_INVALID_FOLDER;
+        }
 
         // reset cached object properties
         $this->owner = $this->namespace = $this->resource_uri = $this->info = $this->idata = null;
 
-        // get a new cache instance of folder type changed
-        if (!$this->cache || $type != $oldtype)
+        // get a new cache instance if folder type changed
+        if (!$this->cache || $this->type != $oldtype)
             $this->cache = kolab_storage_cache::factory($this);
+        else
+            $this->cache->set_folder($this);
 
         $this->imap->set_folder($this->name);
-        $this->cache->set_folder($this);
     }
 
+    /**
+     * Returns code of last error
+     *
+     * @return int Error code
+     */
+    public function get_error()
+    {
+        return $this->error ?: $this->cache->get_error();
+    }
+
+    /**
+     * Check IMAP connection error state
+     */
+    public function check_error()
+    {
+        if (($err_code = $this->imap->get_error_code()) < 0) {
+            $this->error = kolab_storage::ERROR_IMAP_CONN;
+            if (($res_code = $this->imap->get_response_code()) !== 0 && in_array($res_code, array(rcube_storage::NOPERM, rcube_storage::READONLY))) {
+                $this->error = kolab_storage::ERROR_NO_PERMISSION;
+            }
+        }
+
+        return $this->error;
+    }
 
     /**
      * Compose a unique resource URI for this IMAP folder
@@ -96,7 +140,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
         }
 
         // compose fully qualified ressource uri for this instance
-        $this->resource_uri = 'imap://' . urlencode($this->get_owner()) . '@' . $this->imap->options['host'] . '/' . $subpath;
+        $this->resource_uri = 'imap://' . urlencode($this->get_owner(true)) . '@' . $this->imap->options['host'] . '/' . $subpath;
         return $this->resource_uri;
     }
 
@@ -118,9 +162,12 @@ class kolab_storage_folder extends kolab_storage_folder_api
 
         // generate a folder UID and set it to IMAP
         $uid = rtrim(chunk_split(md5($this->name . $this->get_owner() . uniqid('-', true)), 12, '-'), '-');
-        $this->set_uid($uid);
+        if ($this->set_uid($uid)) {
+            return $uid;
+        }
 
-        return $uid;
+        // create hash from folder name if we can't write the UID metadata
+        return md5($this->name . $this->get_owner());
     }
 
     /**
@@ -134,6 +181,8 @@ class kolab_storage_folder extends kolab_storage_folder_api
         if (!($success = $this->set_metadata(array(kolab_storage::UID_KEY_SHARED => $uid)))) {
             $success = $this->set_metadata(array(kolab_storage::UID_KEY_PRIVATE => $uid));
         }
+
+        $this->check_error();
         return $success;
     }
 
@@ -143,6 +192,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
     public function get_ctag()
     {
         $fdata = $this->get_imap_data();
+        $this->check_error();
         return sprintf('%d-%d-%d', $fdata['UIDVALIDITY'], $fdata['HIGHESTMODSEQ'], $fdata['UIDNEXT']);
     }
 
@@ -200,6 +250,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function count($query = null)
     {
+        if (!$this->valid) {
+            return 0;
+        }
+
         // synchronize cache first
         $this->cache->synchronize();
 
@@ -217,6 +271,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
     {
         if (!$type) $type = $this->type;
 
+        if (!$this->valid) {
+            return array();
+        }
+
         // synchronize caches
         $this->cache->synchronize();
 
@@ -234,9 +292,14 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function select($query = array())
     {
+        if (!$this->valid) {
+            return array();
+        }
+
         // check query argument
-        if (empty($query))
+        if (empty($query)) {
             return $this->get_objects();
+        }
 
         // synchronize caches
         $this->cache->synchronize();
@@ -254,6 +317,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function get_uids($query = array())
     {
+        if (!$this->valid) {
+            return array();
+        }
+
         // synchronize caches
         $this->cache->synchronize();
 
@@ -315,6 +382,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function get_object($uid, $type = null)
     {
+        if (!$this->valid) {
+            return false;
+        }
+
         // synchronize caches
         $this->cache->synchronize();
 
@@ -344,7 +415,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function get_attachment($uid, $part, $mailbox = null, $print = false, $fp = null, $skip_charset_conv = false)
     {
-        if ($msguid = ($mailbox ? $uid : $this->cache->uid2msguid($uid))) {
+        if ($this->valid && ($msguid = ($mailbox ? $uid : $this->cache->uid2msguid($uid)))) {
             $this->imap->set_folder($mailbox ? $mailbox : $this->name);
 
             if (substr($part, 0, 2) == 'i:') {
@@ -356,7 +427,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
                         $object['_formatobj']->get_attachments($object);
                     }
 
-                    foreach ($object['_attachments'] as $k => $attach) {
+                    foreach ($object['_attachments'] as $attach) {
                         if ($attach['id'] == $part) {
                             if ($print)   echo $attach['content'];
                             else if ($fp) fwrite($fp, $attach['content']);
@@ -388,6 +459,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function read_object($msguid, $type = null, $folder = null)
     {
+        if (!$this->valid) {
+            return false;
+        }
+
         if (!$type) $type = $this->type;
         if (!$folder) $folder = $this->name;
 
@@ -440,7 +515,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
         // get XML part
         foreach ((array)$message->attachments as $part) {
             if (!$xml && ($part->mimetype == $content_type || preg_match('!application/([a-z.]+\+)?xml!', $part->mimetype))) {
-                $xml = $part->body ? $part->body : $message->get_part_content($part->mime_id);
+                $xml = $message->get_part_body($part->mime_id, true);
             }
             else if ($part->filename || $part->content_id) {
                 $key  = $part->content_id ? trim($part->content_id, '<>') : $part->filename;
@@ -533,6 +608,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function save(&$object, $type = null, $uid = null)
     {
+        if (!$this->valid) {
+            return false;
+        }
+
         if (!$type)
             $type = $this->type;
 
@@ -728,6 +807,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function delete($object, $expunge = true)
     {
+        if (!$this->valid) {
+            return false;
+        }
+
         $msguid = is_array($object) ? $object['_msguid'] : $this->cache->uid2msguid($object);
         $success = false;
 
@@ -755,6 +838,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function delete_all()
     {
+        if (!$this->valid) {
+            return false;
+        }
+
         $this->cache->purge();
         $this->cache->bypass(true);
         $result = $this->imap->clear_folder($this->name);
@@ -772,6 +859,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function undelete($uid)
     {
+        if (!$this->valid) {
+            return false;
+        }
+
         if ($msguid = $this->cache->uid2msguid($uid, true)) {
             $this->cache->bypass(true);
             $result = $this->imap->set_flag($msguid, 'UNDELETED', $this->name);
@@ -795,9 +886,16 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     public function move($uid, $target_folder)
     {
+        if (!$this->valid) {
+            return false;
+        }
+
+        if (is_string($target_folder))
+            $target_folder = kolab_storage::get_folder($target_folder);
+
         if ($msguid = $this->cache->uid2msguid($uid)) {
             $this->cache->bypass(true);
-            $result = $this->imap->move_message($msguid, $target_folder, $this->name);
+            $result = $this->imap->move_message($msguid, $target_folder->name, $this->name);
             $this->cache->bypass(false);
 
             if ($result) {
@@ -875,7 +973,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
         if (!empty($object['_attachments']) && ($mem_limit = parse_bytes(ini_get('memory_limit'))) > 0) {
             $memory = function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024; // safe value: 16MB
 
-            foreach ($object['_attachments'] as $id => $attachment) {
+            foreach ($object['_attachments'] as $attachment) {
                 $memory += $attachment['size'];
             }
 
@@ -1047,8 +1145,6 @@ class kolab_storage_folder extends kolab_storage_folder_api
      */
     private function trigger_url($url, $auth_user = null, $auth_passwd = null)
     {
-        require_once('HTTP/Request2.php');
-
         try {
             $request = libkolab::http_request($url);
 
diff --git a/lib/plugins/libkolab/lib/kolab_storage_folder_api.php b/lib/plugins/libkolab/lib/kolab_storage_folder_api.php
index ef3309e..7280389 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_folder_api.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_folder_api.php
@@ -41,6 +41,12 @@ abstract class kolab_storage_folder_api
     public $type;
 
     /**
+     * The subtype of this folder.
+     * @var string
+     */
+    public $subtype;
+
+    /**
      * Is this folder set to be the default for its type
      * @var boolean
      */
@@ -79,9 +85,10 @@ abstract class kolab_storage_folder_api
     /**
      * Returns the owner of the folder.
      *
+     * @param boolean  Return a fully qualified owner name (i.e. including domain for shared folders)
      * @return string  The owner of this folder.
      */
-    public function get_owner()
+    public function get_owner($fully_qualified = false)
     {
         // return cached value
         if (isset($this->owner))
@@ -100,16 +107,21 @@ abstract class kolab_storage_folder_api
             break;
 
         default:
-            list($prefix, $user) = explode($this->imap->get_hierarchy_delimiter(), $info['name']);
-            if (strpos($user, '@') === false) {
-                $domain = strstr($rcmail->get_user_name(), '@');
-                if (!empty($domain))
-                    $user .= $domain;
-            }
-            $this->owner = $user;
+            list($prefix, $this->owner) = explode($this->imap->get_hierarchy_delimiter(), $info['name']);
+            $fully_qualified = true;  // enforce email addresses (backwards compatibility)
             break;
         }
 
+        if ($fully_qualified && strpos($this->owner, '@') === false) {
+            // extract domain from current user name
+            $domain = strstr($rcmail->get_user_name(), '@');
+            // fall back to mail_domain config option
+            if (empty($domain) && ($mdomain = $rcmail->config->mail_domain($this->imap->options['host']))) {
+                $domain = '@' . $mdomain;
+            }
+            $this->owner .= $domain;
+        }
+
         return $this->owner;
     }
 
@@ -326,5 +338,14 @@ abstract class kolab_storage_folder_api
         return $subscribed ? kolab_storage::folder_subscribe($this->name) : kolab_storage::folder_unsubscribe($this->name);
     }
 
+    /**
+     * Return folder name as string representation of this object
+     *
+     * @return string Full IMAP folder name
+     */
+    public function __toString()
+    {
+        return $this->name;
+    }
 }
 
diff --git a/lib/plugins/libkolab/lib/kolab_storage_folder_user.php b/lib/plugins/libkolab/lib/kolab_storage_folder_user.php
index 1c37da9..7c141c5 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_folder_user.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_folder_user.php
@@ -26,6 +26,7 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual
     protected static $ldapcache = array();
 
     public $ldaprec;
+    public $type;
 
     /**
      * Default constructor
@@ -85,13 +86,28 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual
     }
 
     /**
-     * Check subscription status of this folder
+     * Check subscription status of this folder.
+     * Subscription of a virtual user folder depends on the subscriptions of subfolders.
      *
      * @return boolean True if subscribed, false if not
      */
     public function is_subscribed()
     {
-        return kolab_storage::folder_is_subscribed($this->name, true);
+        if (!empty($this->type)) {
+            $children = $subscribed = 0;
+            $delimiter = $this->imap->get_hierarchy_delimiter();
+            foreach ((array)kolab_storage::list_folders($this->name . $delimiter, '*', $this->type, false) as $subfolder) {
+                if (kolab_storage::folder_is_subscribed($subfolder)) {
+                    $subscribed++;
+                }
+                $children++;
+            }
+            if ($subscribed > 0) {
+                return $subscribed == $children ? true : 2;
+            }
+        }
+
+        return false;
     }
 
     /**
@@ -103,9 +119,17 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual
      */
     public function subscribe($subscribed)
     {
-        return $subscribed ?
-            kolab_storage::folder_subscribe($this->name, true) :
-            kolab_storage::folder_unsubscribe($this->name, true);
+        $success = false;
+
+        // (un)subscribe all subfolders of a given type
+        if (!empty($this->type)) {
+            $delimiter = $this->imap->get_hierarchy_delimiter();
+            foreach ((array)kolab_storage::list_folders($this->name . $delimiter, '*', $this->type, false) as $subfolder) {
+                $success |= ($subscribed ? kolab_storage::folder_subscribe($subfolder) : kolab_storage::folder_unsubscribe($subfolder));
+            }
+        }
+
+        return $success;
     }
 
 }
\ No newline at end of file
diff --git a/lib/plugins/libkolab/package.xml b/lib/plugins/libkolab/package.xml
deleted file mode 100644
index cd3e3a0..0000000
--- a/lib/plugins/libkolab/package.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-    http://pear.php.net/dtd/tasks-1.0.xsd
-    http://pear.php.net/dtd/package-2.0
-    http://pear.php.net/dtd/package-2.0.xsd">
-	<name>libkolab</name>
-	<uri>http://git.kolab.org/roundcubemail-plugins-kolab/</uri>
-	<summary>Kolab core library</summary>
-	<description>Plugin to setup a basic environment for the interaction with a Kolab server.</description>
-	<lead>
-		<name>Thomas Bruederli</name>
-		<user>bruederli</user>
-		<email>bruederli at kolabsys.com</email>
-		<active>yes</active>
-	</lead>
-	<developer>
-		<name>Alensader Machniak</name>
-		<user>machniak</user>
-		<email>machniak at kolabsys.com</email>
-		<active>yes</active>
-	</developer>
-	<date>2013-04-19</date>
-	<version>
-		<release>0.9</release>
-		<api>0.9</api>
-	</version>
-	<stability>
-		<release>stable</release>
-		<api>stable</api>
-	</stability>
-	<license uri="http://www.gnu.org/licenses/agpl.html">GNU AGPLv3</license>
-	<notes>-</notes>
-	<contents>
-		<dir baseinstalldir="/" name="/">
-			<file name="libkolab.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_configuration.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_contact.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_distributionlist.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_event.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_file.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_journal.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_note.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_task.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_format_xcal.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_storage.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_storage_cache.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_storage_folder.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/kolab_date_recurrence.php" role="php">
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-
-			<file name="bin/modcache.php" role="php"></file>
-
-			<file name="config.inc.php.dist" role="data"></file>
-			<file name="LICENSE" role="data"></file>
-			<file name="README" role="data"></file>
-			<file name="UPGRADING" role="data"></file>
-		</dir>
-		<!-- / -->
-	</contents>
-	<dependencies>
-		<required>
-			<php>
-				<min>5.3.1</min>
-			</php>
-			<pearinstaller>
-				<min>1.7.0</min>
-			</pearinstaller>
-		</required>
-	</dependencies>
-	<phprelease/>
-</package>
diff --git a/lib/plugins/managesieve/Changelog b/lib/plugins/managesieve/Changelog
index 01afe69..5255d5b 100644
--- a/lib/plugins/managesieve/Changelog
+++ b/lib/plugins/managesieve/Changelog
@@ -1,6 +1,17 @@
+* version 8.2 [2015-01-14]
+-----------------------------------------------------------
+- Fix bug where actions without if/elseif/else in sieve scripts were skipped
+- Support "not allof" test as a negation of all sub-tests
+- Fix bug where vacation rule was saved to wrong script if managesieve_kolab_master=true
+- Improve procedure of script selection to write a vacation rule
+
+* version 8.1 [2014-12-09]
+-----------------------------------------------------------
+- Added simple API to manage vacation rule
 - Fix missing css/js scripts in filter form in mail task
 - Fix default vacation status (#1490019)
 - Make possible to set vacation start/end date and time
+- Fix compatibility with contextmenu plugin
 
 * version 8.0 [2014-07-16]
 -----------------------------------------------------------
diff --git a/lib/plugins/managesieve/composer.json b/lib/plugins/managesieve/composer.json
index 51e76bc..6d640da 100644
--- a/lib/plugins/managesieve/composer.json
+++ b/lib/plugins/managesieve/composer.json
@@ -2,8 +2,8 @@
     "name": "roundcube/managesieve",
     "type": "roundcube-plugin",
     "description": "Adds a possibility to manage Sieve scripts (incoming mail filters). It's clickable interface which operates on text scripts and communicates with server using managesieve protocol. Adds Filters tab in Settings.",
-    "license": "GNU GPLv3+",
-    "version": "7.2",
+    "license": "GPLv3+",
+    "version": "8.2",
     "authors": [
         {
             "name": "Aleksander Machniak",
diff --git a/lib/plugins/managesieve/config.inc.php.dist b/lib/plugins/managesieve/config.inc.php.dist
index 1f20b5a..b9f9a50 100644
--- a/lib/plugins/managesieve/config.inc.php.dist
+++ b/lib/plugins/managesieve/config.inc.php.dist
@@ -31,7 +31,7 @@ $config['managesieve_usetls'] = false;
 // Connection scket context options
 // See http://php.net/manual/en/context.ssl.php
 // The example below enables server certificate validation
-//$config['imap_conn_options'] = array(
+//$config['managesieve_conn_options'] = array(
 //  'ssl'         => array(
 //     'verify_peer'  => true,
 //     'verify_depth' => 3,
diff --git a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
index 302c7c7..d412e17 100644
--- a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
+++ b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
@@ -5,8 +5,8 @@
  *
  * Engine part of Managesieve plugin implementing UI and backend access.
  *
- * Copyright (C) 2008-2013, The Roundcube Dev Team
- * Copyright (C) 2011-2013, Kolab Systems AG
+ * Copyright (C) 2008-2014, The Roundcube Dev Team
+ * Copyright (C) 2011-2014, Kolab Systems AG
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -63,7 +63,7 @@ class rcube_sieve_engine
         1 => 'notifyimportancehigh'
     );
 
-    const VERSION  = '8.0';
+    const VERSION  = '8.2';
     const PROGNAME = 'Roundcube (Managesieve)';
     const PORT     = 4190;
 
@@ -220,14 +220,14 @@ class rcube_sieve_engine
      *
      * @return int Connection status: 0 on success, >0 on failure
      */
-    public function load_script($script_name = null)
+    protected function load_script($script_name = null)
     {
         // Get list of scripts
         $list = $this->list_scripts();
 
         if ($script_name === null || $script_name === '') {
             // get (first) active script
-            if (!empty($this->active[0])) {
+            if (!empty($this->active)) {
                $script_name = $this->active[0];
             }
             else if ($list) {
@@ -349,7 +349,7 @@ class rcube_sieve_engine
                 }
             }
             else if ($action == 'setact' && !$error) {
-                $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
+                $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST, true);
                 $result = $this->activate_script($script_name);
                 $kep14  = $this->rc->config->get('managesieve_kolab_master');
 
@@ -363,7 +363,7 @@ class rcube_sieve_engine
                 }
             }
             else if ($action == 'deact' && !$error) {
-                $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
+                $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST, true);
                 $result = $this->deactivate_script($script_name);
 
                 if ($result === true) {
@@ -376,7 +376,7 @@ class rcube_sieve_engine
                 }
             }
             else if ($action == 'setdel' && !$error) {
-                $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
+                $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST, true);
                 $result = $this->remove_script($script_name);
 
                 if ($result === true) {
@@ -419,14 +419,14 @@ class rcube_sieve_engine
                 $this->rc->output->command('managesieve_updatelist', 'list', array('list' => $result));
             }
             else if ($action == 'ruleadd') {
-                $rid = rcube_utils::get_input_value('_rid', rcube_utils::INPUT_GPC);
+                $rid = rcube_utils::get_input_value('_rid', rcube_utils::INPUT_POST);
                 $id = $this->genid();
                 $content = $this->rule_div($fid, $id, false);
 
                 $this->rc->output->command('managesieve_rulefill', $content, $id, $rid);
             }
             else if ($action == 'actionadd') {
-                $aid = rcube_utils::get_input_value('_aid', rcube_utils::INPUT_GPC);
+                $aid = rcube_utils::get_input_value('_aid', rcube_utils::INPUT_POST);
                 $id = $this->genid();
                 $content = $this->action_div($fid, $id, false);
 
@@ -1177,16 +1177,7 @@ class rcube_sieve_engine
 
     function filter_frame($attrib)
     {
-        if (!$attrib['id'])
-            $attrib['id'] = 'rcmfilterframe';
-
-        $attrib['name'] = $attrib['id'];
-
-        $this->rc->output->set_env('contentframe', $attrib['name']);
-        $this->rc->output->set_env('blankpage', $attrib['src'] ?
-        $this->rc->output->abs_url($attrib['src']) : 'program/resources/blank.gif');
-
-        return $this->rc->output->frame($attrib);
+        return $this->rc->output->frame($attrib, true);
     }
 
     function filterset_form($attrib)
@@ -1279,8 +1270,11 @@ class rcube_sieve_engine
         $out .= $hiddenfields->show();
 
         // 'any' flag
-        if (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+        if ((!isset($this->form) && empty($scr['tests']) && !empty($scr))
+            || (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+        ) {
             $any = true;
+        }
 
         // filter name input
         $field_id = '_name';
@@ -1341,7 +1335,7 @@ class rcube_sieve_engine
         $out .= sprintf("%s<label for=\"%s\">%s</label>\n",
             $input_join, $field_id, rcube::Q($this->plugin->gettext('filterany')));
 
-        $rows_num = isset($scr) ? sizeof($scr['tests']) : 1;
+        $rows_num = !empty($scr['tests']) ? sizeof($scr['tests']) : 1;
 
         $out .= '<div id="rules"'.($any ? ' style="display: none"' : '').'>';
         for ($x=0; $x<$rows_num; $x++)
@@ -1472,31 +1466,26 @@ class rcube_sieve_engine
             $select_op->add(rcube::Q($this->plugin->gettext('valuenotequals')), 'value-ne');
         }
 
+        $test   = self::rule_test($rule);
+        $target = '';
+
         // target(s) input
         if (in_array($rule['test'], array('header', 'address', 'envelope'))) {
-            $test   = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is');
             $target = $rule['arg2'];
         }
         else if (in_array($rule['test'], array('body', 'date', 'currentdate'))) {
-            $test   = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is');
             $target = $rule['arg'];
         }
         else if ($rule['test'] == 'size') {
-            $test   = '';
-            $target = '';
             if (preg_match('/^([0-9]+)(K|M|G)?$/', $rule['arg'], $matches)) {
                 $sizetarget = $matches[1];
-                $sizeitem = $matches[2];
+                $sizeitem   = $matches[2];
             }
             else {
                 $sizetarget = $rule['arg'];
-                $sizeitem = $rule['item'];
+                $sizeitem   = $rule['item'];
             }
         }
-        else {
-            $test   = ($rule['not'] ? 'not' : '').$rule['test'];
-            $target =  '';
-        }
 
         // (current)date part select
         if (in_array('date', $this->exts) || in_array('currentdate', $this->exts)) {
@@ -1646,6 +1635,43 @@ class rcube_sieve_engine
         return $out;
     }
 
+    private static function rule_test(&$rule)
+    {
+        // first modify value/count tests with 'not' keyword
+        // we'll revert the meaning of operators
+        if ($rule['not'] && preg_match('/^(count|value)-([gteqnl]{2})/', $rule['type'], $m)) {
+            $rule['not'] = false;
+
+            switch ($m[2]) {
+            case 'gt': $rule['type'] = $m[1] . '-le'; break;
+            case 'ge': $rule['type'] = $m[1] . '-lt'; break;
+            case 'lt': $rule['type'] = $m[1] . '-ge'; break;
+            case 'le': $rule['type'] = $m[1] . '-gt'; break;
+            case 'eq': $rule['type'] = $m[1] . '-ne'; break;
+            case 'ne': $rule['type'] = $m[1] . '-eq'; break;
+            }
+        }
+        else if ($rule['not'] && $rule['test'] == 'size') {
+            $rule['not']  = false;
+            $rule['type'] = $rule['type'] == 'over' ? 'under' : 'over';
+        }
+
+        $set = array('header', 'address', 'envelope', 'body', 'date', 'currentdate');
+
+        // build test string supported by select element
+        if ($rule['size']) {
+            $test = $rule['type'];
+        }
+        else if (in_array($rule['test'], $set)) {
+            $test = ($rule['not'] ? 'not' : '') . ($rule['type'] ? $rule['type'] : 'is');
+        }
+        else {
+            $test = ($rule['not'] ? 'not' : '') . $rule['test'];
+        }
+
+        return $test;
+    }
+
     function action_div($fid, $id, $div=true)
     {
         $action   = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id];
@@ -2052,7 +2078,6 @@ class rcube_sieve_engine
 
         // Handle active script(s) and list of scripts according to Kolab's KEP:14
         if ($this->rc->config->get('managesieve_kolab_master')) {
-
             // Skip protected names
             foreach ((array)$this->list as $idx => $name) {
                 $_name = strtoupper($name);
@@ -2080,7 +2105,10 @@ class rcube_sieve_engine
                     foreach ($rules['actions'] as $action) {
                         if ($action['type'] == 'include' && empty($action['global'])) {
                             $name = preg_replace($filename_regex, '', $action['target']);
-                            $this->active[] = $name;
+                            // make sure the script exist
+                            if (in_array($name, $this->list)) {
+                                $this->active[] = $name;
+                            }
                         }
                     }
                 }
@@ -2114,6 +2142,11 @@ class rcube_sieve_engine
             }
         }
 
+        // reindex
+        if (!empty($this->list)) {
+            $this->list = array_values($this->list);
+        }
+
         return $this->list;
     }
 
@@ -2291,7 +2324,7 @@ class rcube_sieve_engine
         $i      = 1;
 
         foreach ($this->script as $idx => $filter) {
-            if ($filter['type'] != 'if') {
+            if (empty($filter['actions'])) {
                 continue;
             }
             $fname = $filter['name'] ? $filter['name'] : "#$i";
diff --git a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
index bc62d2f..518d79d 100644
--- a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
+++ b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
@@ -622,6 +622,7 @@ class rcube_sieve_script
 
         $disabled = false;
         $join     = false;
+        $join_not = false;
 
         // disabled rule (false + comment): if false # .....
         if (preg_match('/^\s*false\s+#/i', $content)) {
@@ -650,15 +651,22 @@ class rcube_sieve_script
                 $not = false;
             }
 
+            // we support "not allof" as a negation of allof sub-tests
+            if ($join_not) {
+                $not = !$not;
+            }
+
             switch ($token) {
             case 'allof':
-                $join = true;
+                $join     = true;
+                $join_not = $not;
                 break;
+
             case 'anyof':
                 break;
 
             case 'size':
-                $test = array('test' => 'size', 'not'  => $not);
+                $test = array('test' => 'size', 'not' => $not);
 
                 $test['arg'] = array_pop($tokens);
 
@@ -740,16 +748,16 @@ class rcube_sieve_script
                 break;
 
             case 'exists':
-                $tests[] = array('test' => 'exists', 'not'  => $not,
+                $tests[] = array('test' => 'exists', 'not' => $not,
                     'arg'  => array_pop($tokens));
                 break;
 
             case 'true':
-                $tests[] = array('test' => 'true', 'not'  => $not);
+                $tests[] = array('test' => 'true', 'not' => $not);
                 break;
 
             case 'false':
-                $tests[] = array('test' => 'true', 'not'  => !$not);
+                $tests[] = array('test' => 'true', 'not' => !$not);
                 break;
             }
 
diff --git a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
index 10aaea0..28fd801 100644
--- a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
+++ b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
@@ -24,6 +24,8 @@
 class rcube_sieve_vacation extends rcube_sieve_engine
 {
     protected $error;
+    protected $script_name;
+    protected $vacation = array();
 
     function actions()
     {
@@ -34,6 +36,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
             $this->vacation_rule();
             $this->vacation_post();
         }
+
         $this->plugin->add_label('vacation.saving');
         $this->rc->output->add_handlers(array(
             'vacationform' => array($this, 'vacation_form'),
@@ -43,15 +46,90 @@ class rcube_sieve_vacation extends rcube_sieve_engine
         $this->rc->output->send('managesieve.vacation');
     }
 
-    private function vacation_rule()
+    /**
+     * Find and load sieve script with/for vacation rule
+     *
+     * @return int Connection status: 0 on success, >0 on failure
+     */
+    protected function load_script()
     {
-        $this->vacation = array();
+        if ($this->script_name !== null) {
+            return 0;
+        }
+
+        $list     = $this->list_scripts();
+        $master   = $this->rc->config->get('managesieve_kolab_master');
+        $included = array();
+
+        $this->script_name = false;
+
+        // first try the active script(s)...
+        if (!empty($this->active)) {
+            // Note: there can be more than one active script on KEP:14-enabled server
+            foreach ($this->active as $script) {
+                if ($this->sieve->load($script)) {
+                    foreach ($this->sieve->script->as_array() as $rule) {
+                        if (!empty($rule['actions'])) {
+                            if ($rule['actions'][0]['type'] == 'vacation') {
+                                $this->script_name = $script;
+                                return 0;
+                            }
+                            else if (empty($master) && $rule['actions'][0]['type'] == 'include') {
+                                $included[] = $rule['actions'][0]['target'];
+                            }
+                        }
+                    }
+                }
+            }
+
+            // ...else try scripts included in active script (not for KEP:14)
+            foreach ($included as $script) {
+                if ($this->sieve->load($script)) {
+                    foreach ($this->sieve->script->as_array() as $rule) {
+                        if (!empty($rule['actions']) && $rule['actions'][0]['type'] == 'vacation') {
+                            $this->script_name = $script;
+                            return 0;
+                        }
+                    }
+                }
+            }
+        }
+
+        // try all other scripts
+        if (!empty($list)) {
+            // else try included scripts
+            foreach (array_diff($list, $included, $this->active) as $script) {
+                if ($this->sieve->load($script)) {
+                    foreach ($this->sieve->script->as_array() as $rule) {
+                        if (!empty($rule['actions']) && $rule['actions'][0]['type'] == 'vacation') {
+                            $this->script_name = $script;
+                            return 0;
+                        }
+                    }
+                }
+            }
+
+            // none of the scripts contains existing vacation rule
+            // use any (first) active or just existing script (in that order)
+            if (!empty($this->active)) {
+                $this->sieve->load($this->script_name = $this->active[0]);
+            }
+            else {
+                $this->sieve->load($this->script_name = $list[0]);
+            }
+        }
+
+        return $this->sieve->error();
+    }
 
-        if (empty($this->active)) {
+    private function vacation_rule()
+    {
+        if ($this->script_name === false || $this->script_name === null || !$this->sieve->load($this->script_name)) {
             return;
         }
 
-        $list = array();
+        $list   = array();
+        $active = in_array($this->script_name, $this->active);
 
         // find (first) vacation rule
         foreach ($this->script as $idx => $rule) {
@@ -68,14 +146,14 @@ class rcube_sieve_vacation extends rcube_sieve_engine
 
                 $this->vacation = array_merge($rule['actions'][0], array(
                         'idx'      => $idx,
-                        'disabled' => $rule['disabled'],
+                        'disabled' => $rule['disabled'] || !$active,
                         'name'     => $rule['name'],
                         'tests'    => $rule['tests'],
                         'action'   => $action ?: 'keep',
                         'target'   => $target,
                 ));
             }
-            else {
+            else if ($active) {
                 $list[$idx] = $rule['name'];
             }
         }
@@ -202,8 +280,6 @@ class rcube_sieve_vacation extends rcube_sieve_engine
             $vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true')));
         }
 
-        // @TODO: handle situation when there's no active script
-
         if (!$error) {
             $rule               = $this->vacation;
             $rule['type']       = 'if';
@@ -212,6 +288,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
             $rule['tests']      = $vacation_tests;
             $rule['join']       = $date_extension ? count($vacation_tests) > 1 : false;
             $rule['actions']    = array($vacation_action);
+            $rule['after']      = $after;
 
             if ($action && $action != 'keep') {
                 $rule['actions'][] = array(
@@ -221,40 +298,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
                 );
             }
 
-            // reset original vacation rule
-            if (isset($this->vacation['idx'])) {
-                $this->script[$this->vacation['idx']] = null;
-            }
-
-            // re-order rules if needed
-            if (isset($after) && $after !== '') {
-                // add at target position
-                if ($after >= count($this->script) - 1) {
-                    $this->script[] = $rule;
-                }
-                else {
-                    $script = array();
-
-                    foreach ($this->script as $idx => $r) {
-                        if ($r) {
-                            $script[] = $r;
-                        }
-
-                        if ($idx == $after) {
-                            $script[] = $rule;
-                        }
-                    }
-
-                    $this->script = $script;
-                }
-            }
-            else {
-                array_unshift($this->script, $rule);
-            }
-
-            $this->sieve->script->content = array_values(array_filter($this->script));
-
-            if ($this->save_script()) {
+            if ($this->save_vacation_script($rule)) {
                 $this->rc->output->show_message('managesieve.vacationsaved', 'confirmation');
                 $this->rc->output->send();
             }
@@ -507,6 +551,87 @@ class rcube_sieve_vacation extends rcube_sieve_engine
     }
 
     /**
+     * Saves vacation script (adding some variables)
+     */
+    protected function save_vacation_script($rule)
+    {
+        // if script does not exist create a new one
+        if ($this->script_name === null || $this->script_name === false) {
+            $this->script_name = $this->rc->config->get('managesieve_script_name');
+            if (empty($this->script_name)) {
+                $this->script_name = 'roundcube';
+            }
+
+            $this->script = array($rule);
+            $script_active = false;
+        }
+        // if script exists
+        else {
+            $script_active = in_array($this->script_name, $this->active);
+
+            // re-order rules if needed
+            if (isset($rule['after']) && $rule['after'] !== '') {
+                // reset original vacation rule
+                if (isset($this->vacation['idx'])) {
+                    $this->script[$this->vacation['idx']] = null;
+                }
+
+                // add at target position
+                if ($rule['after'] >= count($this->script) - 1) {
+                    $this->script[] = $rule;
+                }
+                else {
+                    $script = array();
+
+                    foreach ($this->script as $idx => $r) {
+                        if ($r) {
+                            $script[] = $r;
+                        }
+
+                        if ($idx == $rule['after']) {
+                            $script[] = $rule;
+                        }
+                    }
+
+                    $this->script = $script;
+                }
+
+                $this->script = array_values(array_filter($this->script));
+            }
+            // update original vacation rule if it exists
+            else if (isset($this->vacation['idx'])) {
+                $this->script[$this->vacation['idx']] = $rule;
+            }
+            // otherwise put vacation rule on top
+            else {
+                array_unshift($this->script, $rule);
+            }
+
+            // if the script was not active, we need to de-activate
+            // all rules except the vacation rule, but only if it is not disabled
+            if (!$script_active && !$rule['disabled']) {
+                foreach ($this->script as $idx => $r) {
+                    if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') {
+                        $this->script[$idx]['disabled'] = true;
+                    }
+                }
+            }
+        }
+
+        $this->sieve->script->content = $this->script;
+
+        // save the script
+        $saved = $this->save_script($this->script_name);
+
+        // activate the script
+        if ($saved && !$script_active && !$rule['disabled']) {
+            $this->activate_script($this->script_name);
+        }
+
+        return $saved;
+    }
+
+    /**
      * API: get vacation rule
      *
      * @return array Vacation rule information
@@ -684,8 +809,6 @@ class rcube_sieve_vacation extends rcube_sieve_engine
             $vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true')));
         }
 
-        // @TODO: handle situation when there's no active script
-
         $rule             = $this->vacation;
         $rule['type']     = 'if';
         $rule['name']     = $rule['name'] ?: 'Out-of-Office';
@@ -702,16 +825,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
             );
         }
 
-        // reset original vacation rule
-        if (isset($this->vacation['idx'])) {
-            $this->script[$this->vacation['idx']] = null;
-        }
-
-        array_unshift($this->script, $rule);
-
-        $this->sieve->script->content = array_values(array_filter($this->script));
-
-        return $this->save_script();
+        return $this->save_vacation_script($rule);
     }
 
     /**
diff --git a/lib/plugins/managesieve/localization/ar_SA.inc b/lib/plugins/managesieve/localization/ar_SA.inc
index 8e6d841..88e8957 100644
--- a/lib/plugins/managesieve/localization/ar_SA.inc
+++ b/lib/plugins/managesieve/localization/ar_SA.inc
@@ -15,19 +15,174 @@
 
  For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
 */
+$labels['filters'] = 'تصفية';
+$labels['managefilters'] = 'ادارة تصفية البريد الوارد';
+$labels['filtername'] = 'اسم التصفية';
+$labels['newfilter'] = 'تصفية جديدة';
+$labels['filteradd'] = 'اضافة تصفية';
+$labels['filterdel'] = 'حذف تصفية';
+$labels['moveup'] = 'نقل الى الاعلى ';
+$labels['movedown'] = 'نقل الى الاسفل';
+$labels['filterallof'] = 'مطابقة جميع القواعد التالية';
+$labels['filteranyof'] = 'مطابقة اي القواعد التالية';
+$labels['filterany'] = 'كل الرسائل';
+$labels['filtercontains'] = 'محتوى';
+$labels['filternotcontains'] = 'بدون محتوى';
+$labels['filteris'] = 'مساوي الى';
+$labels['filterisnot'] = 'لا يساوي';
+$labels['filterexists'] = 'موجود';
+$labels['filternotexists'] = 'غير موجود';
+$labels['filtermatches'] = 'يطابق التعبير';
+$labels['filternotmatches'] = 'لا يطابق التعبير';
+$labels['filterregex'] = 'يطابق التعبير العادي';
+$labels['filternotregex'] = 'لا يطابق التعبير العادي';
+$labels['filterunder'] = 'تحت';
+$labels['filterover'] = 'خلال';
+$labels['addrule'] = 'اضافة قاعدة';
+$labels['delrule'] = 'حذف قاعدة';
+$labels['messagemoveto'] = 'نقل الرساله الى ';
+$labels['messageredirect'] = 'إعادة توجيه الرسالة الى ';
+$labels['messagecopyto'] = 'نسخ الرسالة الى ';
+$labels['messagesendcopy'] = 'ارسال نسخة من الرسالة الى ';
+$labels['messagereply'] = 'الرد مع رسالة';
 $labels['messagedelete'] = 'حذف الرسالة';
+$labels['messagediscard'] = 'تجاهل مع الرسالة';
+$labels['messagekeep'] = 'إبقاء الرسالة في علبة الوارد';
+$labels['messagesrules'] = 'للبريد الوارد:';
+$labels['messagesactions'] = '...تنفيذ المهام التالية:';
 $labels['add'] = 'إضافة';
 $labels['del'] = 'حذف';
+$labels['sender'] = 'المرسل';
 $labels['recipient'] = 'مستلم';
+$labels['vacationaddr'] = 'عناوين البريد الالكتروني(ـة) الاضافية:';
+$labels['vacationdays'] = 'في الغالب كم رسالة ترسل (بالايام):';
+$labels['vacationinterval'] = 'كم عدد الرسائل المرسلة عادةً:';
+$labels['vacationreason'] = 'نص الرسالة (بسبب الاجازة):';
+$labels['vacationsubject'] = 'موضوع الرسالة:';
+$labels['days'] = 'ايام';
+$labels['seconds'] = 'ثواني';
+$labels['rulestop'] = 'ايقاف تقييم القواعد';
+$labels['enable'] = 'تفعيل/تعطيل';
+$labels['filterset'] = 'مجموعة مصفياة';
+$labels['filtersets'] = 'مجموعة تصفية';
+$labels['filtersetadd'] = 'اضافة مجموعة تصفية';
+$labels['filtersetdel'] = 'حذف مجموعة التصفية الحالية';
+$labels['filtersetact'] = 'تفعيل مجموعة التصفية الحالية ';
+$labels['filtersetdeact'] = 'تعطيل مجموعة التصفية الحالية ';
+$labels['filterdef'] = 'تعريف التصفية ';
+$labels['filtersetname'] = 'اسم مجموعة التصفية';
+$labels['newfilterset'] = 'مجموعة تصفية جديدة';
 $labels['active'] = 'نشط';
+$labels['none'] = 'لاشيء';
+$labels['fromset'] = 'من مجموعة';
+$labels['fromfile'] = 'من ملف';
+$labels['filterdisabled'] = 'تعطيل التصفية';
+$labels['countisgreaterthan'] = 'العدد اكبر من ';
+$labels['countisgreaterthanequal'] = 'العدد اكبر من او يساوي ';
+$labels['countislessthan'] = 'العدد اقل من ';
+$labels['countislessthanequal'] = 'العدد اقل من او يساوي';
+$labels['countequals'] = 'العدد يساوي ';
+$labels['countnotequals'] = 'العدد لا يساوي';
+$labels['valueisgreaterthan'] = 'القيمة اكبر من ';
+$labels['valueisgreaterthanequal'] = 'القيمة اكبر من او تساوي';
+$labels['valueislessthan'] = 'القيمة اقل من ';
+$labels['valueislessthanequal'] = 'القيمة اقل من او يساوي';
+$labels['valueequals'] = 'القيمة تساوي';
+$labels['valuenotequals'] = 'القيمة لا تساوي';
+$labels['setflags'] = 'ضع وسم على هذه الرسالة ';
+$labels['addflags'] = 'اضف وسم على هذه الرسالة ';
+$labels['removeflags'] = 'احذف الوسم الموجود على هذه الرسالة ';
+$labels['flagread'] = 'قراءة ';
 $labels['flagdeleted'] = 'محذوف';
+$labels['flaganswered'] = 'مجابة';
 $labels['flagflagged'] = 'موسوم';
 $labels['flagdraft'] = 'مسودة';
+$labels['setvariable'] = 'تعيين متغير';
+$labels['setvarname'] = 'اسم المتغير:';
+$labels['setvarvalue'] = 'قيمة المتغير:';
+$labels['setvarmodifiers'] = 'تعديلات:';
+$labels['varquotewildcard'] = 'أقتبس أحرف خاصة';
+$labels['varlength'] = 'الطول';
+$labels['notify'] = 'ارسل تنبية';
+$labels['notifyimportance'] = 'اهمية:';
 $labels['notifyimportancelow'] = 'منخفض';
 $labels['notifyimportancenormal'] = 'عادي';
 $labels['notifyimportancehigh'] = 'مرتفع';
+$labels['filtercreate'] = 'انشئ تصفية';
+$labels['usedata'] = 'استخدم البيانات التالية في الفلتر:';
+$labels['nextstep'] = 'الخطوة التالية';
+$labels['...'] = '...';
+$labels['currdate'] = 'التاريخ الحالي';
+$labels['datetest'] = 'التاريخ';
+$labels['dateheader'] = 'الراس:';
+$labels['year'] = 'السنة';
+$labels['month'] = 'شهر';
+$labels['day'] = 'يوم';
+$labels['date'] = 'التاريخ (yyyy-mm-dd)';
+$labels['julian'] = 'التاريخ (يوليان)';
+$labels['hour'] = 'ساعات';
+$labels['minute'] = 'دقائق';
+$labels['second'] = 'ثواني';
+$labels['time'] = 'الوقت (hh:mm:ss)';
+$labels['iso8601'] = 'التاريخ (ISO8601)';
+$labels['std11'] = 'التاريخ (RFC2822)';
+$labels['zone'] = 'المنطقة الزمنية';
+$labels['weekday'] = 'ايام العمل (0-6)';
 $labels['advancedopts'] = 'خيارات متقدّمة';
+$labels['body'] = 'نص';
 $labels['address'] = 'العنوان';
+$labels['modifier'] = 'تعديل:';
+$labels['text'] = 'نص';
+$labels['contenttype'] = 'نوع المحتوى';
+$labels['modtype'] = 'نوع:';
 $labels['allparts'] = 'الكل';
 $labels['domain'] = 'المجال';
+$labels['localpart'] = 'الجزء المحلي';
+$labels['user'] = 'مستخدم';
+$labels['detail'] = 'تفاصيل';
+$labels['default'] = 'افتراضي';
+$labels['index'] = 'الوارد:';
+$labels['indexlast'] = 'تراجع';
+$labels['vacation'] = 'اجازة ';
+$labels['vacation.advanced'] = 'اعدادات متقدمة';
+$labels['vacation.subject'] = 'موضوع';
+$labels['vacation.body'] = 'محتوى ';
+$labels['vacation.status'] = 'الحالة ';
+$labels['vacation.on'] = 'تشغيل';
+$labels['vacation.off'] = 'ايقاف';
+$labels['vacation.addresses'] = 'عناوينني الاضافية';
+$labels['vacation.saving'] = 'يتم حفظ البيانات...';
+$messages['filterunknownerror'] = 'خطا غير معروف من الخادم.';
+$messages['filterconnerror'] = 'لا يمكن الاتصال بالخادم.';
+$messages['filterdeleteerror'] = 'لا يمكن حذف التصفية.خطا في الخادم.';
+$messages['filterdeleted'] = 'تم حذف التصفية بنجاح.';
+$messages['filtersaved'] = 'تم حفظ التصفية بنجاح.';
+$messages['filtersaveerror'] = 'لا يمكن حفظ التصفية.خطا في الخادم.';
+$messages['filterdeleteconfirm'] = 'هل تريد فعلاً حذف التصفية المحددة؟';
+$messages['ruledeleteconfirm'] = 'هل تريد فعلاً حذف القواعد المحددة؟';
+$messages['actiondeleteconfirm'] = 'هل تريد فعلاً حذف الاجراءات المحددة؟';
+$messages['forbiddenchars'] = 'احرف محظورة في هذا الحقل.';
+$messages['cannotbeempty'] = 'لا يمكن ترك الحقل فارغاً';
+$messages['ruleexist'] = 'اسم هذة التصفية موجود مسبقاً';
+$messages['setactivateerror'] = 'لا يمكن تفعيل مجموعة التصفية المحددة.خطا في الخادم.';
+$messages['setdeactivateerror'] = 'لا يمكن تعطيل مجموعة التصفية المحددة.خطا في الخادم.';
+$messages['setdeleteerror'] = 'لا يمكن حذف مجموعة التصفية المحددة.خطا في الخادم.';
+$messages['setactivated'] = 'تم تفعيل مجموعة التصفية بنجاح.';
+$messages['setdeactivated'] = 'تم تعطيل مجموعة التصفية بنجاح.';
+$messages['setdeleted'] = 'تم حذف مجموعة التصفية بنجاح.';
+$messages['setdeleteconfirm'] = 'هل تريد فعلاً حذف مجموعات التصفية المحددة؟';
+$messages['setcreateerror'] = 'لا يمكن انشاء مجموعة تصفية.خطا في الخادم.';
+$messages['setcreated'] = 'تم انشاء مجموعة التصفية بنجاح.';
+$messages['activateerror'] = 'لا يمكن تمكين التصفية(ـات) المحددة .خطا في الخادم.';
+$messages['deactivateerror'] = 'لا يمكن تعطيل التصفية(ـات) المحددة .خطا في الخادم.';
+$messages['deactivated'] = 'تم تعطيل المصفيـ(ـاة) بنجاح.';
+$messages['activated'] = 'تم تفعيل المصفيـ(ـاة) بنجاح.';
+$messages['moved'] = 'تم نقل التصفية بنجاح.';
+$messages['moveerror'] = 'لا يمكن نقل التصفياة المحددة.خطا في الخادم.';
+$messages['nametoolong'] = 'الإسم طويل جداً';
+$messages['setexist'] = 'المجموعة موجودة مسبقا.';
+$messages['nodata'] = 'يجب تحديد موضع واحد على الأقل!';
+$messages['invaliddateformat'] = 'تاريخ غير صحيح او يوجد خطا في تنسق اجزاء التاريخ';
+$messages['saveerror'] = 'لا يمكن حفظ البيانات. خطا في الخادم.';
+$messages['vacationsaved'] = 'تم حفظ تاريخ الاجازة بنجاح.';
 ?>
diff --git a/lib/plugins/managesieve/localization/az_AZ.inc b/lib/plugins/managesieve/localization/az_AZ.inc
index d692b96..8aec7e3 100644
--- a/lib/plugins/managesieve/localization/az_AZ.inc
+++ b/lib/plugins/managesieve/localization/az_AZ.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Qəbul edən';
 $labels['vacationaddr'] = 'Mənim əlavə e-poçt ünvan(lar)ım: ';
 $labels['vacationdays'] = 'Məktub neçə müddətdən bir göndərilsin (gündə):';
 $labels['vacationinterval'] = 'Məktublar nə qədər sıx göndərilsin:';
-$labels['days'] = 'günlər';
-$labels['seconds'] = 'saniyələr';
 $labels['vacationreason'] = 'Məktubun mətni (səbəb yoxdur):';
 $labels['vacationsubject'] = 'Məktubun mövzusu:';
+$labels['days'] = 'günlər';
+$labels['seconds'] = 'saniyələr';
 $labels['rulestop'] = 'Yerinə yetirməyi dayandır';
 $labels['enable'] = 'Yandır/Söndür';
 $labels['filterset'] = 'Süzgəc dəsti';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'yuxarı registrdə birinci simvol';
 $labels['varquotewildcard'] = 'dırnaq simvolu';
 $labels['varlength'] = 'uzunluq';
 $labels['notify'] = 'Bildiriş göndər';
-$labels['notifyaddress'] = 'Poçt ünvanı:';
-$labels['notifybody'] = 'Bildiriş mətni';
-$labels['notifysubject'] = 'Bildiriş mövzusu';
-$labels['notifyfrom'] = 'BildiriÅŸi yolla:';
 $labels['notifyimportance'] = 'Vaciblik';
 $labels['notifyimportancelow'] = 'aşağı';
 $labels['notifyimportancenormal'] = 'normal';
diff --git a/lib/plugins/managesieve/localization/be_BE.inc b/lib/plugins/managesieve/localization/be_BE.inc
index 29c97ad..5a691cd 100644
--- a/lib/plugins/managesieve/localization/be_BE.inc
+++ b/lib/plugins/managesieve/localization/be_BE.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Каму';
 $labels['vacationaddr'] = 'Дадатковы(я) адрасы эл. пошты:';
 $labels['vacationdays'] = 'Як часта дасылаць паведамленні (у днях):';
 $labels['vacationinterval'] = 'Як часта дасылаць паведамленні:';
-$labels['days'] = 'дзён';
-$labels['seconds'] = 'секунд';
 $labels['vacationreason'] = 'Цела паведамлення (прычына вакацый):';
 $labels['vacationsubject'] = 'Тэма паведамлення:';
+$labels['days'] = 'дзён';
+$labels['seconds'] = 'секунд';
 $labels['rulestop'] = 'Перастаць выконваць праверку правілаў';
 $labels['enable'] = 'Уключыць/Выключыць';
 $labels['filterset'] = 'Набор фільтраў';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'першы знак у верхнім рэгістр
 $labels['varquotewildcard'] = 'службовыя знакі забіраць у апострафы';
 $labels['varlength'] = 'даўжыня';
 $labels['notify'] = 'Паслаць апавяшчэнне';
-$labels['notifyaddress'] = 'На эл. адрас:';
-$labels['notifybody'] = 'Цела апавяшчэння:';
-$labels['notifysubject'] = 'Тэма апавяшчэння:';
-$labels['notifyfrom'] = 'Адпраўнік апавяшчэння:';
 $labels['notifyimportance'] = 'Важнасць:';
 $labels['notifyimportancelow'] = 'нізкая';
 $labels['notifyimportancenormal'] = 'звычайная';
diff --git a/lib/plugins/managesieve/localization/bg_BG.inc b/lib/plugins/managesieve/localization/bg_BG.inc
index c9d06d2..432cb4f 100644
--- a/lib/plugins/managesieve/localization/bg_BG.inc
+++ b/lib/plugins/managesieve/localization/bg_BG.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Получател';
 $labels['vacationaddr'] = 'Мои допълнителни e-mail адреси:';
 $labels['vacationdays'] = 'Колко често да праща писма (в дни):';
 $labels['vacationinterval'] = 'Колко често да праща писма:';
-$labels['days'] = 'дни';
-$labels['seconds'] = 'секунди';
 $labels['vacationreason'] = 'Текст на писмото (причина за ваканцията)';
 $labels['vacationsubject'] = 'Заглавие на писмото';
+$labels['days'] = 'дни';
+$labels['seconds'] = 'секунди';
 $labels['rulestop'] = 'Спри проверка на други условия';
 $labels['enable'] = 'Включи/Изключи';
 $labels['filterset'] = 'Набор филтри';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'първи знак с главна буква';
 $labels['varquotewildcard'] = 'цитиране на специални знаци';
 $labels['varlength'] = 'дължина';
 $labels['notify'] = 'Изпрати известие';
-$labels['notifyaddress'] = 'До e-mail адрес:';
-$labels['notifybody'] = 'Основен текст на известието:';
-$labels['notifysubject'] = 'Заглавие на известието:';
-$labels['notifyfrom'] = 'Подател на известието:';
+$labels['notifytarget'] = 'Известие към:';
+$labels['notifymessage'] = 'Съдържание на известие (опционално):';
+$labels['notifyoptions'] = 'Опции на известие (опционално):';
+$labels['notifyfrom'] = 'Известие от (опционално):';
 $labels['notifyimportance'] = 'Приоритет:';
 $labels['notifyimportancelow'] = 'нисък';
 $labels['notifyimportancenormal'] = 'нормален';
 $labels['notifyimportancehigh'] = 'висок';
+$labels['notifymethodmailto'] = 'Ел. поща';
+$labels['notifymethodtel'] = 'Телефон';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Използвай за нов филтър';
 $labels['usedata'] = 'Използвай следните данни във филтъра:';
 $labels['nextstep'] = 'Следваща стъпка';
@@ -157,6 +160,18 @@ $labels['asciicasemap'] = 'без значение малки/големи бу
 $labels['asciinumeric'] = 'цифрово';
 $labels['index'] = 'индекс:';
 $labels['indexlast'] = 'наобратно';
+$labels['vacation'] = 'Отпуск';
+$labels['vacation.reply'] = 'Писмо отговор';
+$labels['vacation.advanced'] = 'Разширени настройки';
+$labels['vacation.subject'] = 'Относно';
+$labels['vacation.body'] = 'Съдържание';
+$labels['vacation.status'] = 'Статус';
+$labels['vacation.on'] = 'Вкл.';
+$labels['vacation.off'] = 'Изкл.';
+$labels['vacation.addresses'] = 'Моите допълнителни адреси';
+$labels['vacation.interval'] = 'Интервал на отговор';
+$labels['vacation.after'] = 'Постави правило за отпуск след';
+$labels['vacation.saving'] = 'Запис на данни...';
 $messages['filterunknownerror'] = 'Неизвестна сървърна грешка.';
 $messages['filterconnerror'] = 'Неуспешно свързване с managesieve сървъра.';
 $messages['filterdeleteerror'] = 'Невъзможно изтриване на филтъра. Възникна сървърна грешка.';
@@ -189,4 +204,6 @@ $messages['namereserved'] = 'Резервирано име.';
 $messages['setexist'] = 'Вече има такъв набор филтри.';
 $messages['nodata'] = 'Поне една позиция трябва да е избрана!';
 $messages['invaliddateformat'] = 'невалидна дата или формат на част от дата';
+$messages['saveerror'] = 'Невъзможен запис на данни. Грешка при достъп до сървър.';
+$messages['vacationsaved'] = 'Данните за отпуск са записани успешно.';
 ?>
diff --git a/lib/plugins/managesieve/localization/bs_BA.inc b/lib/plugins/managesieve/localization/bs_BA.inc
index bee1aba..84a85a3 100644
--- a/lib/plugins/managesieve/localization/bs_BA.inc
+++ b/lib/plugins/managesieve/localization/bs_BA.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Poruka sa odgovorom';
 $labels['vacation.advanced'] = 'Napredmen postavke';
 $labels['vacation.subject'] = 'Naslov';
 $labels['vacation.body'] = 'Tijelo';
-$labels['vacation.dates'] = 'Vrijeme odmora';
-$labels['vacation.from'] = 'Od:';
-$labels['vacation.to'] = 'Do:';
+$labels['vacation.start'] = 'Početak odmora';
+$labels['vacation.end'] = 'Kraj odmora';
 $labels['vacation.status'] = 'Status';
 $labels['vacation.on'] = 'Uključeno';
 $labels['vacation.off'] = 'Isključeno';
diff --git a/lib/plugins/managesieve/localization/ca_ES.inc b/lib/plugins/managesieve/localization/ca_ES.inc
index 5e54c6a..0dc6863 100644
--- a/lib/plugins/managesieve/localization/ca_ES.inc
+++ b/lib/plugins/managesieve/localization/ca_ES.inc
@@ -24,7 +24,7 @@ $labels['filterdel'] = 'Suprimeix el filtre';
 $labels['moveup'] = 'Mou amunt';
 $labels['movedown'] = 'Mou avall';
 $labels['filterallof'] = 'que coincideixi amb totes les regles següents';
-$labels['filteranyof'] = 'que no coincideixi amb cap de les regles següents';
+$labels['filteranyof'] = 'que coincideixi amb qualsevol de les regles següents';
 $labels['filterany'] = 'tots els missatges';
 $labels['filtercontains'] = 'conté';
 $labels['filternotcontains'] = 'no conté';
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatari';
 $labels['vacationaddr'] = 'Les meves adreces de correu addicionals:';
 $labels['vacationdays'] = 'Cada quan enviar un missatge (en dies):';
 $labels['vacationinterval'] = 'Amb quina freqüència s\'han d\'enviar els missatges:';
-$labels['days'] = 'dies';
-$labels['seconds'] = 'segons';
 $labels['vacationreason'] = 'Cos del missatge (raó de l\'absència):';
 $labels['vacationsubject'] = 'Assumpte del missatge:';
+$labels['days'] = 'dies';
+$labels['seconds'] = 'segons';
 $labels['rulestop'] = 'Deixa d\'avaluar regles';
 $labels['enable'] = 'Habilita/Deshabilita';
 $labels['filterset'] = 'Conjunt de filtres';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'el primer caràcter en majúscula';
 $labels['varquotewildcard'] = 'engloba els caràcters especials amb cometes';
 $labels['varlength'] = 'llargada';
 $labels['notify'] = 'Envia notificació';
-$labels['notifyaddress'] = 'A l\'adreça de correu electrònic:';
-$labels['notifybody'] = 'Cos de la notificació:';
-$labels['notifysubject'] = 'Assumpte de la notificació:';
-$labels['notifyfrom'] = 'Remitent de la notificació:';
+$labels['notifytarget'] = 'Objectiu de la notificació:';
+$labels['notifymessage'] = 'Missatge de notificació (opcional):';
+$labels['notifyoptions'] = 'Opcions de notificació (opcional):';
+$labels['notifyfrom'] = 'Remitent de la notificació (opcional):';
 $labels['notifyimportance'] = 'Importància:';
 $labels['notifyimportancelow'] = 'baixa';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Correu electrònic';
+$labels['notifymethodtel'] = 'Telèfon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Crea filtre';
 $labels['usedata'] = 'Fes servir les següents dades al filtre:';
 $labels['nextstep'] = 'Següent pas';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'No distingeix entre majúscules i minúscules  (ascii
 $labels['asciinumeric'] = 'numèric (ascii-numeric)';
 $labels['index'] = 'índex:';
 $labels['indexlast'] = 'cap enrere';
+$labels['vacation'] = 'Vacances';
+$labels['vacation.reply'] = 'Missatge de resposta';
+$labels['vacation.advanced'] = 'Paràmetres avançats';
+$labels['vacation.subject'] = 'Assumpte';
+$labels['vacation.body'] = 'Cos';
+$labels['vacation.start'] = 'Inici de vacances';
+$labels['vacation.end'] = 'Finalització de vacances';
+$labels['vacation.status'] = 'Estat';
+$labels['vacation.on'] = 'Activat';
+$labels['vacation.off'] = 'Desactivat';
+$labels['vacation.addresses'] = 'Les meves adreces addicionals:';
+$labels['vacation.interval'] = 'Interval de resposta';
+$labels['vacation.after'] = 'Posa la regla de vacances després';
+$labels['vacation.saving'] = 'S\'estan desant les dades...';
+$labels['vacation.action'] = 'Acció pel missatge entrant';
+$labels['vacation.keep'] = 'Conserva';
+$labels['vacation.discard'] = 'Descarta';
+$labels['vacation.redirect'] = 'Redirigeix cap a';
+$labels['vacation.copy'] = 'Envia còpia a';
+$labels['arialabelfiltersetactions'] = 'Accions pel conjunt de filtres';
+$labels['arialabelfilteractions'] = 'Accions del filtre';
+$labels['arialabelfilterform'] = 'Propietats del filtre';
+$labels['ariasummaryfilterslist'] = 'Llistat de filtres';
+$labels['ariasummaryfiltersetslist'] = 'Llistat de conjunts de filtres';
+$labels['filterstitle'] = 'Edita els filtres pels missatges entrants';
+$labels['vacationtitle'] = 'Edita la norma "fora de l\'oficina"';
 $messages['filterunknownerror'] = 'Error desconegut al servidor.';
 $messages['filterconnerror'] = 'No s\'ha pogut connectar al servidor.';
 $messages['filterdeleteerror'] = 'No s\'ha pogut suprimir el filtre. Hi ha hagut un error al servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nom reservat.';
 $messages['setexist'] = 'El conjunt ja existeix.';
 $messages['nodata'] = 'S\'ha de seleccionar com a mínim una posició!';
 $messages['invaliddateformat'] = 'data no vàlida o format no vàlid';
+$messages['saveerror'] = 'No s\'han pogut desar les dades. Hi ha hagut un error al servidor.';
+$messages['vacationsaved'] = 'Les dades de les vacances s\'han desat correctament.';
+$messages['emptyvacationbody'] = 'És obligatori definir el cos del missatge de vacances';
 ?>
diff --git a/lib/plugins/managesieve/localization/cs_CZ.inc b/lib/plugins/managesieve/localization/cs_CZ.inc
index d304da6..6db6bac 100644
--- a/lib/plugins/managesieve/localization/cs_CZ.inc
+++ b/lib/plugins/managesieve/localization/cs_CZ.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Příjemce';
 $labels['vacationaddr'] = 'Moje další e-mailová adresa(y):';
 $labels['vacationdays'] = 'Počet dnů mezi automatickými odpověďmi:';
 $labels['vacationinterval'] = 'Prodleva mezi automatickými odpověďmi:';
-$labels['days'] = 'dnů';
-$labels['seconds'] = 'sekund';
 $labels['vacationreason'] = 'Zpráva (Důvod nepřítomnosti):';
 $labels['vacationsubject'] = 'Předmět zprávy:';
+$labels['days'] = 'dnů';
+$labels['seconds'] = 'sekund';
 $labels['rulestop'] = 'Zastavit pravidla';
 $labels['enable'] = 'Zapnout/Vypnout';
 $labels['filterset'] = 'Sada filtrů';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'první písmeno velké';
 $labels['varquotewildcard'] = 'uvodit speciální znaky uvozovkama';
 $labels['varlength'] = 'délka';
 $labels['notify'] = 'Odeslat oznámení';
-$labels['notifyaddress'] = 'Na emailovou adresu:';
-$labels['notifybody'] = 'Zpráva oznámení:';
-$labels['notifysubject'] = 'Předmět oznámení:';
-$labels['notifyfrom'] = 'Odesílatel oznámení:';
+$labels['notifytarget'] = 'Cíl oznámení:';
+$labels['notifymessage'] = 'Zpráva oznámení (nepovinné):';
+$labels['notifyoptions'] = 'Možnosti oznámení (nepovinné):';
+$labels['notifyfrom'] = 'Odesílatel oznámení (nepovinné):';
 $labels['notifyimportance'] = 'Důležitost:';
 $labels['notifyimportancelow'] = 'nízká';
 $labels['notifyimportancenormal'] = 'normální';
 $labels['notifyimportancehigh'] = 'vysoká';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Vytvořit filtr';
 $labels['usedata'] = 'Použít následující údaje ve filtru:';
 $labels['nextstep'] = 'Další krok';
@@ -157,6 +160,26 @@ $labels['asciicasemap'] = 'necitlivé na velikost písmen (ascii-casemap)';
 $labels['asciinumeric'] = 'číslené (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'pozpátku';
+$labels['vacation'] = 'Dovolená';
+$labels['vacation.reply'] = 'Odpověd';
+$labels['vacation.advanced'] = 'Pokročilá nastavení';
+$labels['vacation.subject'] = 'Předmět';
+$labels['vacation.body'] = 'Tělo';
+$labels['vacation.start'] = 'Začátek dovolené';
+$labels['vacation.end'] = 'Konec dovolené';
+$labels['vacation.status'] = 'Stav';
+$labels['vacation.on'] = 'Zapnuto';
+$labels['vacation.off'] = 'Vypnuto';
+$labels['vacation.addresses'] = 'Moje další adresy:';
+$labels['vacation.interval'] = 'Doba mezi odpověďmi';
+$labels['vacation.after'] = 'Uložit pravidlo o dovolené za';
+$labels['vacation.saving'] = 'Ukládám data...';
+$labels['vacation.keep'] = 'Zachovat';
+$labels['vacation.discard'] = 'Zrušit';
+$labels['vacation.copy'] = 'Odeslat kopii zprávy na';
+$labels['arialabelfilterform'] = 'Vlastnosti filtru';
+$labels['ariasummaryfilterslist'] = 'Seznam filtrů';
+$labels['ariasummaryfiltersetslist'] = 'Seznam sad filtrů';
 $messages['filterunknownerror'] = 'Neznámá chyba serveru';
 $messages['filterconnerror'] = 'Nebylo možné se připojit k sieve serveru';
 $messages['filterdeleteerror'] = 'Nebylo možné smazat filtr. Došlo k chybě serveru.';
@@ -180,7 +203,7 @@ $messages['setcreateerror'] = 'Nelze vytvořit sadu filtrů. Došlo k chybě ser
 $messages['setcreated'] = 'Sada filtrů úspěšně vytvořena.';
 $messages['activateerror'] = 'Nelze zapnout vybrané filtr/y. Došlo k chybě serveru.';
 $messages['deactivateerror'] = 'Nelze vypnout vybrané filtr/y. Došlo k chybě serveru.';
-$messages['deactivated'] = 'Filtr/y úspěšne vypnuty.';
+$messages['deactivated'] = 'Filtr(y) úspěšně vypnuty.';
 $messages['activated'] = 'Filtr/y úspěšně zapnuty.';
 $messages['moved'] = 'Filtr byl úspěšně přesunut.';
 $messages['moveerror'] = 'Nelze přesunout vybraný filtr. Došlo k chybě serveru.';
@@ -189,4 +212,7 @@ $messages['namereserved'] = 'Vyhrazený název.';
 $messages['setexist'] = 'Sada již existuje.';
 $messages['nodata'] = 'Musí být vybrána minimálně jedna pozice!';
 $messages['invaliddateformat'] = 'Neplatné datum nebo část data';
+$messages['saveerror'] = 'Nebylo možné uložit data. Došlo k chybě serveru.';
+$messages['vacationsaved'] = 'Data o dovolené byla uložena.';
+$messages['emptyvacationbody'] = 'Tělo zprávy';
 ?>
diff --git a/lib/plugins/managesieve/localization/cy_GB.inc b/lib/plugins/managesieve/localization/cy_GB.inc
index a10205d..8d8d1a5 100644
--- a/lib/plugins/managesieve/localization/cy_GB.inc
+++ b/lib/plugins/managesieve/localization/cy_GB.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Derbynnwr';
 $labels['vacationaddr'] = 'Fy nghyfeiriad(au) ebost ychwanegol:';
 $labels['vacationdays'] = 'Pa mor aml i ddanfon negeseuon (mewn dyddiau):';
 $labels['vacationinterval'] = 'Pa mor aml i ddanfon negeseuon:';
-$labels['days'] = 'dyddiau';
-$labels['seconds'] = 'eiliadau';
 $labels['vacationreason'] = 'Corff neges (rheswm ar wyliau):';
 $labels['vacationsubject'] = 'Pwnc neges:';
+$labels['days'] = 'dyddiau';
+$labels['seconds'] = 'eiliadau';
 $labels['rulestop'] = 'Stopio gwerthuso rheolau';
 $labels['enable'] = 'Galluogi/Analluogi';
 $labels['filterset'] = 'Set hidlyddion';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'llythyren gyntaf yn briflythyren';
 $labels['varquotewildcard'] = 'dyfynnu nodau arbennig';
 $labels['varlength'] = 'hyd';
 $labels['notify'] = 'Anfon hysbysiad';
-$labels['notifyaddress'] = 'I gyfeiriad ebost:';
-$labels['notifybody'] = 'Corff hysbysiad:';
-$labels['notifysubject'] = 'Pwnc hysbysiad:';
-$labels['notifyfrom'] = 'Anfonwr hysbysiad:';
+$labels['notifytarget'] = 'Target hysbysu:';
+$labels['notifymessage'] = 'Neges hysbysu (dewisol):';
+$labels['notifyoptions'] = 'Dewisiadau hysbysu (dewisol):';
+$labels['notifyfrom'] = 'Anfonwr hysbysiad (dewisol):';
 $labels['notifyimportance'] = 'Pwysigrwydd:';
 $labels['notifyimportancelow'] = 'isel';
 $labels['notifyimportancenormal'] = 'arferol';
 $labels['notifyimportancehigh'] = 'uchel';
+$labels['notifymethodmailto'] = 'Ebost';
+$labels['notifymethodtel'] = 'Ffôn';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Creu hidlydd';
 $labels['usedata'] = 'Defnyddio\'r wybodaeth ganlynol yn yr hidlydd:';
 $labels['nextstep'] = 'Cam nesaf';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'maint llythrennau (ascii-casemap)';
 $labels['asciinumeric'] = 'rhifau (ascii-numeric)';
 $labels['index'] = 'mynegai:';
 $labels['indexlast'] = 'o chwith';
+$labels['vacation'] = 'Gwyliau';
+$labels['vacation.reply'] = 'Neges ymateb';
+$labels['vacation.advanced'] = 'Gosodiadau uwch';
+$labels['vacation.subject'] = 'Pwnc';
+$labels['vacation.body'] = 'Corff';
+$labels['vacation.start'] = 'Dechrau gwyliau';
+$labels['vacation.end'] = 'Diwedd gwyliau';
+$labels['vacation.status'] = 'Statws';
+$labels['vacation.on'] = 'Ymlaen';
+$labels['vacation.off'] = 'I ffwrdd';
+$labels['vacation.addresses'] = 'Fy nghyfeiriadau ychwanegol';
+$labels['vacation.interval'] = 'Cyfnod ymateb';
+$labels['vacation.after'] = 'Rhoi rheol gwyliau ar ôl';
+$labels['vacation.saving'] = 'Yn cadw\'r data...';
+$labels['vacation.action'] = 'Gweithred neges i fewn';
+$labels['vacation.keep'] = 'Cadw';
+$labels['vacation.discard'] = 'Gwaredu';
+$labels['vacation.redirect'] = 'Ailgyfeirio i';
+$labels['vacation.copy'] = 'Danfon copi i';
+$labels['arialabelfiltersetactions'] = 'Gweithrediadau set hidlydd';
+$labels['arialabelfilteractions'] = 'Gweithrediadau hidlydd';
+$labels['arialabelfilterform'] = 'Nodweddion hidlydd';
+$labels['ariasummaryfilterslist'] = 'Rhestr o hidlyddion';
+$labels['ariasummaryfiltersetslist'] = 'Rhestr o setiau hidlyddion';
+$labels['filterstitle'] = 'Golygu hidlyddion ebost i fewn';
+$labels['vacationtitle'] = 'Golygu rheol allan-o\'r-swyddfa';
 $messages['filterunknownerror'] = 'Gwall gweinydd anhysbys.';
 $messages['filterconnerror'] = 'Methwyd cysylltu a\'r gweinydd.';
 $messages['filterdeleteerror'] = 'Methwyd dileu hidlydd. Cafwydd gwall gweinydd.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Enw neilltuedig.';
 $messages['setexist'] = 'Mae\'r set yn bodoli\'n barod.';
 $messages['nodata'] = 'Rhaid dewis o leia un safle!';
 $messages['invaliddateformat'] = 'Dyddiad neu fformat dyddiad annilys';
+$messages['saveerror'] = 'Methwyd cadw\'r data. Cafwyd gwall gweinydd.';
+$messages['vacationsaved'] = 'Cadwyd y data gwyliau yn llwyddiannus.';
+$messages['emptyvacationbody'] = 'Mae angen rhoi corff y neges wyliau!';
 ?>
diff --git a/lib/plugins/managesieve/localization/da_DK.inc b/lib/plugins/managesieve/localization/da_DK.inc
index b240741..ebf1cb0 100644
--- a/lib/plugins/managesieve/localization/da_DK.inc
+++ b/lib/plugins/managesieve/localization/da_DK.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Modtager';
 $labels['vacationaddr'] = 'Min(e) yderligere email-adresse(r):';
 $labels['vacationdays'] = 'Hvor tit skal besked sendes (i dage):';
 $labels['vacationinterval'] = 'Hvor tit skal besked sendes:';
-$labels['days'] = 'dage';
-$labels['seconds'] = 'sekunder';
 $labels['vacationreason'] = 'Besked (ved ferie):';
 $labels['vacationsubject'] = 'Besked emne:';
+$labels['days'] = 'dage';
+$labels['seconds'] = 'sekunder';
 $labels['rulestop'] = 'Stop behandling af regler';
 $labels['enable'] = 'Aktivér/Deaktivér';
 $labels['filterset'] = 'Filter sæt';
@@ -108,14 +108,13 @@ $labels['varupperfirst'] = 'Første bogstav stort';
 $labels['varquotewildcard'] = 'Sæt specialle tegn i citationstegn ';
 $labels['varlength'] = 'længde';
 $labels['notify'] = 'Send meddelelse';
-$labels['notifyaddress'] = 'Til e-mail adresse:';
-$labels['notifybody'] = 'meddelelses indhold:';
-$labels['notifysubject'] = 'Meddelelses emne:';
-$labels['notifyfrom'] = 'Meddelelses afsender:';
 $labels['notifyimportance'] = 'Vigtighed:';
 $labels['notifyimportancelow'] = 'lav';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'høj';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Opret filter';
 $labels['usedata'] = 'Brug følgende data i filteret:';
 $labels['nextstep'] = 'Næste trin';
@@ -157,6 +156,18 @@ $labels['asciicasemap'] = 'store og små bogstaver (ascii-bogstaver)';
 $labels['asciinumeric'] = 'numerisk (ascii-numerisk)';
 $labels['index'] = 'indeks:';
 $labels['indexlast'] = 'baglends';
+$labels['vacation'] = 'Ferie';
+$labels['vacation.reply'] = 'Svar besked';
+$labels['vacation.advanced'] = 'Avanceret indstillinger ';
+$labels['vacation.subject'] = 'Emne';
+$labels['vacation.start'] = 'Ferie star';
+$labels['vacation.end'] = 'Ferie slut';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.saving'] = 'Gemmer data...';
+$labels['vacation.keep'] = 'Behold';
+$labels['vacation.discard'] = 'Kasser';
+$labels['vacation.redirect'] = 'Omdiriger til ';
+$labels['vacation.copy'] = 'Send kopi til';
 $messages['filterunknownerror'] = 'Ukendt server fejl.';
 $messages['filterconnerror'] = 'Kan ikke forbinde til server.';
 $messages['filterdeleteerror'] = 'Kunne ikke slette filter. Serverfejl opstod.';
@@ -189,4 +200,6 @@ $messages['namereserved'] = 'Reserveret navn.';
 $messages['setexist'] = 'Filterv sæt eksisterer allerede';
 $messages['nodata'] = 'Mindst en position skal vælges!';
 $messages['invaliddateformat'] = 'Ugyldigt dato- eller tidsformat';
+$messages['saveerror'] = 'Kunne ikke gemme data. Server fejl';
+$messages['vacationsaved'] = 'Ferie data gemt';
 ?>
diff --git a/lib/plugins/managesieve/localization/de_CH.inc b/lib/plugins/managesieve/localization/de_CH.inc
index 234f313..13a4a67 100644
--- a/lib/plugins/managesieve/localization/de_CH.inc
+++ b/lib/plugins/managesieve/localization/de_CH.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Empfänger';
 $labels['vacationaddr'] = 'Meine weiteren E-Mail-Adressen:';
 $labels['vacationdays'] = 'Antwort wird erneut gesendet nach (in Tagen):';
 $labels['vacationinterval'] = 'Wie oft senden:';
-$labels['days'] = 'Tage';
-$labels['seconds'] = 'Sekunden';
 $labels['vacationreason'] = 'Inhalt der Nachricht (Abwesenheitsgrund):';
 $labels['vacationsubject'] = 'Betreff';
+$labels['days'] = 'Tage';
+$labels['seconds'] = 'Sekunden';
 $labels['rulestop'] = 'Regelauswertung anhalten';
 $labels['enable'] = 'Aktivieren/Deaktivieren';
 $labels['filterset'] = 'Filtersätze';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'Erster Buchstabe gross';
 $labels['varquotewildcard'] = 'Sonderzeichen auszeichnen';
 $labels['varlength'] = 'Länge';
 $labels['notify'] = 'Mitteilung senden';
-$labels['notifyaddress'] = 'Empfängeradresse:';
-$labels['notifybody'] = 'Mitteilungstext:';
-$labels['notifysubject'] = 'Mitteilungsbetreff:';
-$labels['notifyfrom'] = 'Absender:';
+$labels['notifytarget'] = 'Mitteilungsempfänger:';
+$labels['notifymessage'] = 'Mitteilungstext (optional):';
+$labels['notifyoptions'] = 'Mitteilungsoptionen (optional):';
+$labels['notifyfrom'] = 'Absender (optional):';
 $labels['notifyimportance'] = 'Wichtigkeit:';
 $labels['notifyimportancelow'] = 'tief';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'hoch';
+$labels['notifymethodmailto'] = 'E-Mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Filter erstellen';
 $labels['usedata'] = 'Die folgenden Daten im Filter benutzen:';
 $labels['nextstep'] = 'Nächster Schritt';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'Gross-/Kleinschreibung ignorieren';
 $labels['asciinumeric'] = 'numerisch (ascii-numeric)';
 $labels['index'] = 'Index:';
 $labels['indexlast'] = 'rückwärts';
+$labels['vacation'] = 'Abwesenheit';
+$labels['vacation.reply'] = 'Antworte mit Nachricht';
+$labels['vacation.advanced'] = 'Erweiterte Einstellungen';
+$labels['vacation.subject'] = 'Betreff';
+$labels['vacation.body'] = 'Inhalt';
+$labels['vacation.start'] = 'Beginn der Abwesenheit';
+$labels['vacation.end'] = 'Ende der Abwesenheit';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'Ein';
+$labels['vacation.off'] = 'Aus';
+$labels['vacation.addresses'] = 'Meine weiteren E-Mail-Adressen';
+$labels['vacation.interval'] = 'Antwort-Intervall';
+$labels['vacation.after'] = 'Abwesenheitsregel einfügen nach';
+$labels['vacation.saving'] = 'Speichere Daten...';
+$labels['vacation.action'] = 'Aktion für eingehende Nachrichten';
+$labels['vacation.keep'] = 'Behalten';
+$labels['vacation.discard'] = 'Verwerfen';
+$labels['vacation.redirect'] = 'Weiterleiten an';
+$labels['vacation.copy'] = 'Kopie an';
+$labels['arialabelfiltersetactions'] = 'Filtersatz-Aktionen';
+$labels['arialabelfilteractions'] = 'Filteraktionen';
+$labels['arialabelfilterform'] = 'Filtereigenschaften';
+$labels['ariasummaryfilterslist'] = 'Filterliste';
+$labels['ariasummaryfiltersetslist'] = 'Filtersatzliste';
+$labels['filterstitle'] = 'Eingehende Nachrichtenfilter bearbeiten';
+$labels['vacationtitle'] = 'Abwesenheitsregel bearbeiten';
 $messages['filterunknownerror'] = 'Unbekannter Serverfehler';
 $messages['filterconnerror'] = 'Kann nicht zum Sieve-Server verbinden';
 $messages['filterdeleteerror'] = 'Serverfehler beim Löschen des Filters.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reservierter Name.';
 $messages['setexist'] = 'Filtersatz existiert bereits.';
 $messages['nodata'] = 'Mindestens eine Position muss ausgewählt werden!';
 $messages['invaliddateformat'] = 'Ungültiges Datumsformat';
+$messages['saveerror'] = 'Fehler beim Speichern (Serverfehler)';
+$messages['vacationsaved'] = 'Abwesenheitsnotiz erfolgreich gespeichert.';
+$messages['emptyvacationbody'] = 'Mitteilungstext ist erforderlich!';
 ?>
diff --git a/lib/plugins/managesieve/localization/de_DE.inc b/lib/plugins/managesieve/localization/de_DE.inc
index 2eaa215..f57ffa3 100644
--- a/lib/plugins/managesieve/localization/de_DE.inc
+++ b/lib/plugins/managesieve/localization/de_DE.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Empfänger';
 $labels['vacationaddr'] = 'Meine zusätzliche E-Mail-Adresse(n):';
 $labels['vacationdays'] = 'Wie oft sollen Nachrichten gesendet werden (in Tagen):';
 $labels['vacationinterval'] = 'Wie oft sollen Nachrichten gesendet werden:';
-$labels['days'] = 'Tage';
-$labels['seconds'] = 'Sekunden';
 $labels['vacationreason'] = 'Nachrichteninhalt (Abwesenheitsgrund):';
 $labels['vacationsubject'] = 'Nachrichtenbetreff';
+$labels['days'] = 'Tage';
+$labels['seconds'] = 'Sekunden';
 $labels['rulestop'] = 'Regelauswertung anhalten';
 $labels['enable'] = 'Aktivieren/Deaktivieren';
 $labels['filterset'] = 'Filtersätze';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'Erster Buchstabe großgeschrieben';
 $labels['varquotewildcard'] = 'maskiere Sonderzeichen';
 $labels['varlength'] = 'Länge';
 $labels['notify'] = 'Sende Benachrichtigung';
-$labels['notifyaddress'] = 'An Email Adresse:';
-$labels['notifybody'] = 'Benachrichtigungs-Text:';
-$labels['notifysubject'] = 'Benachrichtigungs-Betreff:';
-$labels['notifyfrom'] = 'Benachrichtigungs-Absender:';
+$labels['notifytarget'] = 'Benachrichtigungs-Empfänger:';
+$labels['notifymessage'] = 'Inhalt der Benachrichtigung (optional):';
+$labels['notifyoptions'] = 'Optionen für die Benachrichtigung (optional)';
+$labels['notifyfrom'] = 'Absender der Benachrichtigung (optional):';
 $labels['notifyimportance'] = 'Priorität:';
 $labels['notifyimportancelow'] = 'niedrig';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'hoch';
+$labels['notifymethodmailto'] = 'E-Mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Filter erstellen';
 $labels['usedata'] = 'Die folgenden Daten im Filter benutzen:';
 $labels['nextstep'] = 'Nächster Schritt';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'Groß-/Kleinschreibung ignorieren';
 $labels['asciinumeric'] = 'numerisch (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'rückwärts';
+$labels['vacation'] = 'Urlaub';
+$labels['vacation.reply'] = 'Antwort';
+$labels['vacation.advanced'] = 'Erweiterte Einstellungen';
+$labels['vacation.subject'] = 'Betreff';
+$labels['vacation.body'] = 'Hauptteil';
+$labels['vacation.start'] = 'Beginn des Urlaubs';
+$labels['vacation.end'] = 'Ende des Urlaubs';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'An';
+$labels['vacation.off'] = 'Aus';
+$labels['vacation.addresses'] = 'Meine weiteren Adressen';
+$labels['vacation.interval'] = 'Antwort Intervall';
+$labels['vacation.after'] = 'Setze Urlaubsregel nach';
+$labels['vacation.saving'] = 'Speichere Daten...';
+$labels['vacation.action'] = 'Eingehende Nachrichtaktion';
+$labels['vacation.keep'] = 'Behalten';
+$labels['vacation.discard'] = 'Verwerfen';
+$labels['vacation.redirect'] = 'Weiterleiten an';
+$labels['vacation.copy'] = 'Kopie senden an';
+$labels['arialabelfiltersetactions'] = 'Aktionen für Filtersätze';
+$labels['arialabelfilteractions'] = 'Aktionen für Filter';
+$labels['arialabelfilterform'] = 'Filtereigenschaften';
+$labels['ariasummaryfilterslist'] = 'Liste von Filtern';
+$labels['ariasummaryfiltersetslist'] = 'Liste von Filtersätzen';
+$labels['filterstitle'] = 'Eingehende Mailfilter bearbeiten';
+$labels['vacationtitle'] = 'Abwesendheitsregel bearbeiten';
 $messages['filterunknownerror'] = 'Unbekannter Serverfehler';
 $messages['filterconnerror'] = 'Kann keine Verbindung mit Managesieve-Server herstellen';
 $messages['filterdeleteerror'] = 'Filter kann nicht gelöscht werden. Ein Serverfehler ist aufgetreten.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reservierter Name.';
 $messages['setexist'] = 'Filtersatz existiert bereits.';
 $messages['nodata'] = 'Mindestens eine Position muss ausgewählt werden!';
 $messages['invaliddateformat'] = 'Ungültiges Datum oder Teil-Format';
+$messages['saveerror'] = 'Ein Serverfehler ist aufgetreten, Speicherung war nicht möglich.';
+$messages['vacationsaved'] = 'Urlaubsdaten erfolgreich gespeichert.';
+$messages['emptyvacationbody'] = 'Inhalt der Abwesenheitsbenachrichtigung wird benötigt!';
 ?>
diff --git a/lib/plugins/managesieve/localization/el_GR.inc b/lib/plugins/managesieve/localization/el_GR.inc
index 73ec786..d1c7833 100644
--- a/lib/plugins/managesieve/localization/el_GR.inc
+++ b/lib/plugins/managesieve/localization/el_GR.inc
@@ -47,18 +47,20 @@ $labels['messagesendcopy'] = 'Αποστολη της αντιγραφης μυ
 $labels['messagereply'] = 'Απάντηση με μήνυμα';
 $labels['messagedelete'] = 'Διαγραφή μηνύματος';
 $labels['messagediscard'] = 'Απόρριψη με μήνυμα';
+$labels['messagekeep'] = 'Διατήρηση μηνύματος στα Εισερχόμενα';
 $labels['messagesrules'] = 'Για εισερχόμενα μηνύματα που:';
 $labels['messagesactions'] = '...εκτέλεση των παρακάτω ενεργειών:';
 $labels['add'] = 'Προσθήκη';
 $labels['del'] = 'Διαγραφή';
 $labels['sender'] = 'Αποστολέας';
 $labels['recipient'] = 'Παραλήπτης';
+$labels['vacationaddr'] = 'Πρόσθετες διευθύνσεις email:';
 $labels['vacationdays'] = 'Συχνότητα αποστολής μηνυμάτων (σε ημέρες):';
 $labels['vacationinterval'] = 'Συχνότητα αποστολής μηνυμάτων:';
-$labels['days'] = 'ημερες';
-$labels['seconds'] = 'δευτερόλεπτα';
 $labels['vacationreason'] = 'Σώμα μηνύματος (λόγος απουσίας):';
 $labels['vacationsubject'] = 'Θέμα μηνύματος: ';
+$labels['days'] = 'ημερες';
+$labels['seconds'] = 'δευτερόλεπτα';
 $labels['rulestop'] = 'Παύση επαλήθευσης κανόνων';
 $labels['enable'] = 'Ενεργοποιηση/Απενεργοποιηση';
 $labels['filterset'] = 'Φίλτρα';
@@ -106,14 +108,17 @@ $labels['varupperfirst'] = 'πρώτος χαρακτήρας κεφαλαία 
 $labels['varquotewildcard'] = 'παραθέση ειδικων χαρακτήρων';
 $labels['varlength'] = 'Μήκος';
 $labels['notify'] = 'Αποστολή ειδοποίησης ';
-$labels['notifyaddress'] = 'Σε διεύθυνση email:';
-$labels['notifybody'] = 'Οργανισμός ειδοποιησης:';
-$labels['notifysubject'] = 'Θεμα ειδοποιησης:';
-$labels['notifyfrom'] = 'Αποστολεας ειδοποιησης:';
+$labels['notifytarget'] = 'Παραλήπτης ειδοποίησης:';
+$labels['notifymessage'] = 'Μήνυμα ειδοποίησης (προαιρετικά):';
+$labels['notifyoptions'] = 'Επιλογές ειδοποίησης (προαιρετικά):';
+$labels['notifyfrom'] = 'Αποστολέας ειδοποίησης (προαιρετικά):';
 $labels['notifyimportance'] = 'Σημασία: ';
 $labels['notifyimportancelow'] = 'Χαμηλή';
 $labels['notifyimportancenormal'] = 'Κανονική';
 $labels['notifyimportancehigh'] = 'Υψηλή';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Τηλέφωνο';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Δημιουργία φίλτρου';
 $labels['usedata'] = 'Χρησιμοποιηση ακολουθων δεδομενων στο φιλτρο:';
 $labels['nextstep'] = 'Επομενο βημα';
@@ -155,27 +160,65 @@ $labels['asciicasemap'] = 'πεζά ή κεφαλαία (ascii-casemap)';
 $labels['asciinumeric'] = 'αριθμητικό (ascii-αριθμητικο)';
 $labels['index'] = 'ευρετήριο:';
 $labels['indexlast'] = 'προς τα πίσω';
+$labels['vacation'] = 'Διακοπές';
+$labels['vacation.reply'] = 'Μήνυμα απάντησης';
+$labels['vacation.advanced'] = 'Προηγμένες ρυθμίσεις';
+$labels['vacation.subject'] = 'Θέμα';
+$labels['vacation.body'] = 'Σώμα';
+$labels['vacation.start'] = 'Έναρξη διακοπών';
+$labels['vacation.end'] = 'Λήξη διακοπών';
+$labels['vacation.status'] = 'Κατάσταση';
+$labels['vacation.on'] = 'Ενεργό';
+$labels['vacation.off'] = 'Ανενεργό';
+$labels['vacation.addresses'] = 'Επιπλέον διευθύνσεις';
+$labels['vacation.interval'] = 'Διάστημα απάντησης';
+$labels['vacation.after'] = 'Εισαγωγή κανόνα διακοπών μετά από';
+$labels['vacation.saving'] = 'Αποθήκευση δεδομένων...';
+$labels['vacation.action'] = 'Ενέργεια εισερχόμενου μηνύματος';
+$labels['vacation.keep'] = 'Διατήρηση';
+$labels['vacation.discard'] = 'Διαγραφή';
+$labels['vacation.redirect'] = 'Ανακατεύθυνση σε';
+$labels['vacation.copy'] = 'Αποστολή αντιγράφου σε';
+$labels['arialabelfiltersetactions'] = 'Ενέργειες ομάδας φίλτρων';
+$labels['arialabelfilteractions'] = 'Ενέργειες φίλτρων';
+$labels['arialabelfilterform'] = 'Ιδιότητες φίλτρων';
+$labels['ariasummaryfilterslist'] = 'Λίστα φίλτρων';
+$labels['ariasummaryfiltersetslist'] = 'Λίστα ομάδων φίλτρων';
+$labels['filterstitle'] = 'Επεξεργασία φίλτρων εισερχόμενης αλληλογραφίας';
+$labels['vacationtitle'] = 'Επεξεργασία κανόνα εκτός-γραφείου';
 $messages['filterunknownerror'] = 'Άγνωστο σφάλμα διακομιστή';
 $messages['filterconnerror'] = 'Αδυναμία σύνδεσης στον διακομιστή managesieve';
+$messages['filterdeleteerror'] = 'Αδυναμία διαγραφής φίλτρου. Προέκυψε σφάλμα στον διακομιστή';
 $messages['filterdeleted'] = 'Το φίλτρο διαγράφηκε επιτυχώς';
 $messages['filtersaved'] = 'Το φίλτρο αποθηκεύτηκε επιτυχώς';
+$messages['filtersaveerror'] = 'Αδυναμία αποθήκευσης φίλτρου. Προέκυψε σφάλμα στον διακομιστή';
 $messages['filterdeleteconfirm'] = 'Είστε σίγουροι ότι θέλετε να διαγράψετε το επιλεγμένο φίλτρο? ';
 $messages['ruledeleteconfirm'] = 'Θέλετε όντως να διαγράψετε τον επιλεγμένο κανόνα;';
 $messages['actiondeleteconfirm'] = 'Θέλετε όντως να διαγράψετε την επιλεγμένη ενέργεια;';
 $messages['forbiddenchars'] = 'Μη επιτρεπτοί χαρακτήρες στο πεδίο';
 $messages['cannotbeempty'] = 'Το πεδίο δεν μπορεί να είναι κενό';
 $messages['ruleexist'] = 'Φιλτρο με αυτο το όνομα υπάρχει ήδη. ';
+$messages['setactivateerror'] = 'Αδυναμία ενεργοποίησης επιλεγμένων ομάδων φίλτρων. Προέκυψε σφάλμα στον διακομιστή.';
+$messages['setdeactivateerror'] = 'Αδυναμία απενεργοποίησης επιλεγμένων ομάδων φίλτρων. Προέκυψε σφάλμα στον διακομιστή.';
+$messages['setdeleteerror'] = 'Αδυναμία διαγραφής των επιλεγμένων ομάδων φίλτρων. Προέκυψε σφάλμα στον διακομιστή';
 $messages['setactivated'] = 'Φίλτρα ενεργοποιήθηκαν με επιτυχία.';
 $messages['setdeactivated'] = 'Φίλτρα απενεργοποιήθηκαν με επιτυχία.';
 $messages['setdeleted'] = 'Τα φίλτρα διαγράφηκαν επιτυχώς.';
 $messages['setdeleteconfirm'] = 'Θέλετε όντως να διαγράψετε τα επιλεγμένα φιλτρα?';
+$messages['setcreateerror'] = 'Αδυναμία δημιουργίας ομάδας φίλτρων. Προέκυψε σφάλμα στον διακομιστή.';
 $messages['setcreated'] = 'Τα φιλτρα δημιουργηθηκαν επιτυχως.';
+$messages['activateerror'] = 'Αδυναμία ενεργοποίησης επιλεγμένου φίλτρου(ων). Προέκυψε σφάλμα στον διακομιστή.';
+$messages['deactivateerror'] = 'Αδυναμία απενεργοποίησης επιλεγμένου φίλτρου(ων). Προέκυψε σφάλμα στον διακομιστή.';
 $messages['deactivated'] = 'Το φιλτρο(α) απενεργοποιηθηκαν επιτυχως.';
 $messages['activated'] = 'Το φίλτρο(α) ενεργοποιηθηκαν επιτυχώς.';
 $messages['moved'] = 'Το φίλτρο μετακινηθηκε επιτυχώς.';
+$messages['moveerror'] = 'Αδυναμία μετακίνησης επιλεγμένου φίλτρου. Προέκυψε σφάλμα στον διακομιστή.';
 $messages['nametoolong'] = 'Το όνομα είναι πολύ μεγάλο.';
 $messages['namereserved'] = 'Δεσμευμένο όνομα. ';
 $messages['setexist'] = 'Set υπάρχει ήδη. ';
 $messages['nodata'] = 'Τουλάχιστον μία θέση πρέπει να επιλεγεί!';
 $messages['invaliddateformat'] = 'Μη έγκυρη ημερομηνία ή η ημερομηνία μορφής τμήμα';
+$messages['saveerror'] = 'Αδύνατη η αποθήκευση δεδομένων. Προέκυψε σφάλμα στον διακομιστή';
+$messages['vacationsaved'] = 'Τα δεδομένα διακοπών αποθηκεύτηκαν επιτυχώς.';
+$messages['emptyvacationbody'] = 'Απαιτείται σώμα για το μήνυμα διακοπών!';
 ?>
diff --git a/lib/plugins/managesieve/localization/en_CA.inc b/lib/plugins/managesieve/localization/en_CA.inc
index 311e595..400f835 100644
--- a/lib/plugins/managesieve/localization/en_CA.inc
+++ b/lib/plugins/managesieve/localization/en_CA.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Recipient';
 $labels['vacationaddr'] = 'My additional e-mail address(es):';
 $labels['vacationdays'] = 'How often send messages (in days):';
 $labels['vacationinterval'] = 'How often send messages:';
-$labels['days'] = 'days';
-$labels['seconds'] = 'seconds';
 $labels['vacationreason'] = 'Message body (vacation reason):';
 $labels['vacationsubject'] = 'Message subject:';
+$labels['days'] = 'days';
+$labels['seconds'] = 'seconds';
 $labels['rulestop'] = 'Stop evaluating rules';
 $labels['enable'] = 'Enable/Disable';
 $labels['filterset'] = 'Filters set';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'first character upper-case';
 $labels['varquotewildcard'] = 'quote special characters';
 $labels['varlength'] = 'length';
 $labels['notify'] = 'Send notification';
-$labels['notifyaddress'] = 'To e-mail address:';
-$labels['notifybody'] = 'Notification body:';
-$labels['notifysubject'] = 'Notification subject:';
-$labels['notifyfrom'] = 'Notification sender:';
+$labels['notifytarget'] = 'Notification target:';
+$labels['notifymessage'] = 'Notification message (optional):';
+$labels['notifyoptions'] = 'Notification options (optional):';
+$labels['notifyfrom'] = 'Notification sender (optional):';
 $labels['notifyimportance'] = 'Importance:';
 $labels['notifyimportancelow'] = 'low';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'high';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Phone';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Create filter';
 $labels['usedata'] = 'Use following data in the filter:';
 $labels['nextstep'] = 'Next Step';
@@ -157,6 +160,18 @@ $labels['asciicasemap'] = 'case insensitive (ascii-casemap)';
 $labels['asciinumeric'] = 'numeric (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'backwards';
+$labels['vacation'] = 'Vacation';
+$labels['vacation.reply'] = 'Reply message';
+$labels['vacation.advanced'] = 'Advanced settings';
+$labels['vacation.subject'] = 'Subject';
+$labels['vacation.body'] = 'Body';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'On';
+$labels['vacation.off'] = 'Off';
+$labels['vacation.addresses'] = 'My additional addresses';
+$labels['vacation.interval'] = 'Reply interval';
+$labels['vacation.after'] = 'Put vacation rule after';
+$labels['vacation.saving'] = 'Saving data...';
 $messages['filterunknownerror'] = 'Unknown server error.';
 $messages['filterconnerror'] = 'Unable to connect to server.';
 $messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred.';
@@ -189,4 +204,6 @@ $messages['namereserved'] = 'Reserved name.';
 $messages['setexist'] = 'Set already exists.';
 $messages['nodata'] = 'At least one position must be selected!';
 $messages['invaliddateformat'] = 'Invalid date or date part format';
+$messages['saveerror'] = 'Unable to save data. Server error occurred.';
+$messages['vacationsaved'] = 'Vacation data saved successfully.';
 ?>
diff --git a/lib/plugins/managesieve/localization/en_GB.inc b/lib/plugins/managesieve/localization/en_GB.inc
index f899e60..0cc8872 100644
--- a/lib/plugins/managesieve/localization/en_GB.inc
+++ b/lib/plugins/managesieve/localization/en_GB.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Recipient';
 $labels['vacationaddr'] = 'My additional e-mail address(es):';
 $labels['vacationdays'] = 'How often send messages (in days):';
 $labels['vacationinterval'] = 'How often send messages:';
-$labels['days'] = 'days';
-$labels['seconds'] = 'seconds';
 $labels['vacationreason'] = 'Message body (vacation reason):';
 $labels['vacationsubject'] = 'Message subject:';
+$labels['days'] = 'days';
+$labels['seconds'] = 'seconds';
 $labels['rulestop'] = 'Stop evaluating rules';
 $labels['enable'] = 'Enable/Disable';
 $labels['filterset'] = 'Filters set';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'first character upper-case';
 $labels['varquotewildcard'] = 'quote special characters';
 $labels['varlength'] = 'length';
 $labels['notify'] = 'Send notification';
-$labels['notifyaddress'] = 'To e-mail address:';
-$labels['notifybody'] = 'Notification body:';
-$labels['notifysubject'] = 'Notification subject:';
-$labels['notifyfrom'] = 'Notification sender:';
+$labels['notifytarget'] = 'Notification target:';
+$labels['notifymessage'] = 'Notification message (optional):';
+$labels['notifyoptions'] = 'Notification options (optional):';
+$labels['notifyfrom'] = 'Notification sender (optional):';
 $labels['notifyimportance'] = 'Importance:';
 $labels['notifyimportancelow'] = 'low';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'high';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Phone';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Create filter';
 $labels['usedata'] = 'Use following data in the filter:';
 $labels['nextstep'] = 'Next Step';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'case insensitive (ascii-casemap)';
 $labels['asciinumeric'] = 'numeric (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'backwards';
+$labels['vacation'] = 'Vacation';
+$labels['vacation.reply'] = 'Reply message';
+$labels['vacation.advanced'] = 'Advanced settings';
+$labels['vacation.subject'] = 'Subject';
+$labels['vacation.body'] = 'Body';
+$labels['vacation.start'] = 'Vacation start';
+$labels['vacation.end'] = 'Vacation end';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'On';
+$labels['vacation.off'] = 'Off';
+$labels['vacation.addresses'] = 'My additional addresses';
+$labels['vacation.interval'] = 'Reply interval';
+$labels['vacation.after'] = 'Put vacation rule after';
+$labels['vacation.saving'] = 'Saving data...';
+$labels['vacation.action'] = 'Incoming message action';
+$labels['vacation.keep'] = 'Keep';
+$labels['vacation.discard'] = 'Discard';
+$labels['vacation.redirect'] = 'Redirect to';
+$labels['vacation.copy'] = 'Send copy to';
+$labels['arialabelfiltersetactions'] = 'Filter set actions';
+$labels['arialabelfilteractions'] = 'Filter actions';
+$labels['arialabelfilterform'] = 'Filter properties';
+$labels['ariasummaryfilterslist'] = 'List of filters';
+$labels['ariasummaryfiltersetslist'] = 'List of filter sets';
+$labels['filterstitle'] = 'Edit incoming mail filters';
+$labels['vacationtitle'] = 'Edit out-of-office rule';
 $messages['filterunknownerror'] = 'Unknown server error';
 $messages['filterconnerror'] = 'Unable to connect to managesieve server';
 $messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reserved name.';
 $messages['setexist'] = 'Set already exists.';
 $messages['nodata'] = 'At least one position must be selected!';
 $messages['invaliddateformat'] = 'Invalid date or date part format';
+$messages['saveerror'] = 'Unable to save data. Server error occurred.';
+$messages['vacationsaved'] = 'Vacation data saved successfully.';
+$messages['emptyvacationbody'] = 'Body of vacation message is required!';
 ?>
diff --git a/lib/plugins/managesieve/localization/en_US.inc b/lib/plugins/managesieve/localization/en_US.inc
index ac766f9..f455d55 100644
--- a/lib/plugins/managesieve/localization/en_US.inc
+++ b/lib/plugins/managesieve/localization/en_US.inc
@@ -167,9 +167,8 @@ $labels['vacation.reply'] = 'Reply message';
 $labels['vacation.advanced'] = 'Advanced settings';
 $labels['vacation.subject'] = 'Subject';
 $labels['vacation.body'] = 'Body';
-$labels['vacation.dates'] = 'Vacation time';
-$labels['vacation.from'] = 'From:';
-$labels['vacation.to'] = 'To:';
+$labels['vacation.start'] = 'Vacation start';
+$labels['vacation.end'] = 'Vacation end';
 $labels['vacation.status'] = 'Status';
 $labels['vacation.on'] = 'On';
 $labels['vacation.off'] = 'Off';
diff --git a/lib/plugins/managesieve/localization/es_419.inc b/lib/plugins/managesieve/localization/es_419.inc
index 45b5dfb..6131895 100644
--- a/lib/plugins/managesieve/localization/es_419.inc
+++ b/lib/plugins/managesieve/localization/es_419.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Responder mensaje';
 $labels['vacation.advanced'] = 'Opciones avanzadas';
 $labels['vacation.subject'] = 'Asunto';
 $labels['vacation.body'] = 'Cuerpo';
-$labels['vacation.dates'] = 'Horario de vacaciones';
-$labels['vacation.from'] = 'De:';
-$labels['vacation.to'] = 'Para:';
+$labels['vacation.start'] = 'Inicio de vacaciones';
+$labels['vacation.end'] = 'Final de vacaciones';
 $labels['vacation.status'] = 'Estado';
 $labels['vacation.on'] = 'Encendido';
 $labels['vacation.off'] = 'Apagado';
diff --git a/lib/plugins/managesieve/localization/es_AR.inc b/lib/plugins/managesieve/localization/es_AR.inc
index 6b3749d..6ac6533 100644
--- a/lib/plugins/managesieve/localization/es_AR.inc
+++ b/lib/plugins/managesieve/localization/es_AR.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Responder mensaje';
 $labels['vacation.advanced'] = 'Opciones avanzdas';
 $labels['vacation.subject'] = 'Asunto';
 $labels['vacation.body'] = 'Cuerpo';
-$labels['vacation.dates'] = 'Período de vacaciones';
-$labels['vacation.from'] = 'De:';
-$labels['vacation.to'] = 'Para:';
+$labels['vacation.start'] = 'Inicio de vacaciones';
+$labels['vacation.end'] = 'Final de vacaciones';
 $labels['vacation.status'] = 'Estado';
 $labels['vacation.on'] = 'On';
 $labels['vacation.off'] = 'Off';
diff --git a/lib/plugins/managesieve/localization/es_ES.inc b/lib/plugins/managesieve/localization/es_ES.inc
index 91602ee..62f357b 100644
--- a/lib/plugins/managesieve/localization/es_ES.inc
+++ b/lib/plugins/managesieve/localization/es_ES.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatario';
 $labels['vacationaddr'] = 'Mis direcciones adicionales de correo electrónico:';
 $labels['vacationdays'] = 'Cada cuánto enviar mensajes (en días):';
 $labels['vacationinterval'] = 'Cada cuánto enviar mensajes:';
-$labels['days'] = 'días';
-$labels['seconds'] = 'segundos';
 $labels['vacationreason'] = 'Cuerpo del mensaje (razón de vacaciones):';
 $labels['vacationsubject'] = 'Asunto del Mensaje:';
+$labels['days'] = 'días';
+$labels['seconds'] = 'segundos';
 $labels['rulestop'] = 'Parar de evaluar reglas';
 $labels['enable'] = 'Habilitar/Deshabilitar';
 $labels['filterset'] = 'Conjunto de filtros';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'inicial en mayúsculas';
 $labels['varquotewildcard'] = 'entrecomillar caracteres especiales';
 $labels['varlength'] = 'longitud';
 $labels['notify'] = 'Enviar notificación';
-$labels['notifyaddress'] = 'A la dirección de correo:';
-$labels['notifybody'] = 'Cuerpo de la notificación:';
-$labels['notifysubject'] = 'Tema de la notificación:';
-$labels['notifyfrom'] = 'Remitente de la notificación:';
+$labels['notifytarget'] = 'Destino de la notificación:';
+$labels['notifymessage'] = 'Mensaje de notificación (opcional):';
+$labels['notifyoptions'] = 'Opciones de notificación (opcional):';
+$labels['notifyfrom'] = 'Remitente de la notificación (opcional):';
 $labels['notifyimportance'] = 'Importancia:';
 $labels['notifyimportancelow'] = 'baja';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Correo electrónico';
+$labels['notifymethodtel'] = 'Teléfono';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Crear Filtro';
 $labels['usedata'] = 'Usar los siguientes datos en el filtro:';
 $labels['nextstep'] = 'Siguiente paso';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'no sensible a mayúsculas (ascii-casemap)';
 $labels['asciinumeric'] = 'numerico (ascii-numeric)';
 $labels['index'] = 'índice:';
 $labels['indexlast'] = 'hacia atrás';
+$labels['vacation'] = 'Vacaciones';
+$labels['vacation.reply'] = 'Mensaje de respuesta';
+$labels['vacation.advanced'] = 'Configuración avanzada';
+$labels['vacation.subject'] = 'Asunto';
+$labels['vacation.body'] = 'Cuerpo';
+$labels['vacation.start'] = 'Comienzo de las vacaciones';
+$labels['vacation.end'] = 'Final de las vacaciones';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Activado';
+$labels['vacation.off'] = 'Desactivado';
+$labels['vacation.addresses'] = 'Mis direcciones adicionales';
+$labels['vacation.interval'] = 'Intervalo de respuesta';
+$labels['vacation.after'] = 'Poner regla de vacaciones después de';
+$labels['vacation.saving'] = 'Guardando datos...';
+$labels['vacation.action'] = 'Acción de mensaje entrante';
+$labels['vacation.keep'] = 'Mantener';
+$labels['vacation.discard'] = 'Descartar';
+$labels['vacation.redirect'] = 'Redireccionar a';
+$labels['vacation.copy'] = 'Enviar copia a';
+$labels['arialabelfiltersetactions'] = 'Acciones de un paquete de filtros';
+$labels['arialabelfilteractions'] = 'Acciones de filtro';
+$labels['arialabelfilterform'] = 'Propiedades de filtro';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de paquetes de filtros';
+$labels['filterstitle'] = 'Editar filtros de mensajes entrantes';
+$labels['vacationtitle'] = 'Editar la regla fuera-de-la-oficina';
 $messages['filterunknownerror'] = 'Error desconocido en el servidor.';
 $messages['filterconnerror'] = 'No se ha podido conectar con el servidor managesieve.';
 $messages['filterdeleteerror'] = 'No se ha podido borrar el filtro. Ha ocurrido un error en el servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nombre reservado.';
 $messages['setexist'] = 'El conjunto ya existe.';
 $messages['nodata'] = '¡Al menos una posición debe ser seleccionada!';
 $messages['invaliddateformat'] = 'Fecha o formato de parte de la fecha no válido';
+$messages['saveerror'] = 'No fue posible guardar los datos. Ha ocurrido un error en el servidor.';
+$messages['vacationsaved'] = 'Datos de vacaciones guardados correctamente.';
+$messages['emptyvacationbody'] = '¡Hace falta un texto en el mensaje de vacaciones!';
 ?>
diff --git a/lib/plugins/managesieve/localization/et_EE.inc b/lib/plugins/managesieve/localization/et_EE.inc
index e8a3bd3..3957dcb 100644
--- a/lib/plugins/managesieve/localization/et_EE.inc
+++ b/lib/plugins/managesieve/localization/et_EE.inc
@@ -55,10 +55,10 @@ $labels['sender'] = 'Saatja';
 $labels['recipient'] = 'Saaja';
 $labels['vacationdays'] = 'Kui tihti kirju saata (päevades):';
 $labels['vacationinterval'] = 'Kui tihti kirju saata:';
-$labels['days'] = 'päeva';
-$labels['seconds'] = 'sekundit';
 $labels['vacationreason'] = 'Kirja sisu (puhkuse põhjus):';
 $labels['vacationsubject'] = 'Kirja teema:';
+$labels['days'] = 'päeva';
+$labels['seconds'] = 'sekundit';
 $labels['rulestop'] = 'Peata reeglite otsimine';
 $labels['enable'] = 'Luba/keela';
 $labels['filterset'] = 'Filtrite kogum';
@@ -106,10 +106,6 @@ $labels['varupperfirst'] = 'esimene märk on suurtäht';
 $labels['varquotewildcard'] = 'tsiteeri erimärke';
 $labels['varlength'] = 'pikkus';
 $labels['notify'] = 'Saada teavitus';
-$labels['notifyaddress'] = 'Saaja e-posti aadress:';
-$labels['notifybody'] = 'Teavituse sisu:';
-$labels['notifysubject'] = 'Teavituse pealkiri:';
-$labels['notifyfrom'] = 'Teavituse saatja:';
 $labels['notifyimportance'] = 'Tähtsus:';
 $labels['notifyimportancelow'] = 'madal';
 $labels['notifyimportancenormal'] = 'tavaline';
diff --git a/lib/plugins/managesieve/localization/eu_ES.inc b/lib/plugins/managesieve/localization/eu_ES.inc
index fe29e58..c9a39dc 100644
--- a/lib/plugins/managesieve/localization/eu_ES.inc
+++ b/lib/plugins/managesieve/localization/eu_ES.inc
@@ -32,10 +32,10 @@ $labels['filteris'] = 'honen berdina da';
 $labels['filterisnot'] = 'ez da honen berdina';
 $labels['filterexists'] = 'badago';
 $labels['filternotexists'] = 'ez dago';
-$labels['filtermatches'] = 'bat datorren espresio';
-$labels['filternotmatches'] = 'bat ez datorren espresio';
-$labels['filterregex'] = 'bat datozen adierazpen erregularrak';
-$labels['filternotregex'] = 'bat ez datorren espresio erregularrak';
+$labels['filtermatches'] = 'bat datorren espresioa';
+$labels['filternotmatches'] = 'bat ez datorren espresioa';
+$labels['filterregex'] = 'bat datozen adierazpen erregularra';
+$labels['filternotregex'] = 'bat ez datorren espresio erregularra';
 $labels['filterunder'] = 'azpian';
 $labels['filterover'] = 'gainean';
 $labels['addrule'] = 'Gehitu araua';
@@ -55,12 +55,12 @@ $labels['del'] = 'Ezabatu';
 $labels['sender'] = 'Bidaltzailea';
 $labels['recipient'] = 'Hartzailea';
 $labels['vacationaddr'] = 'Nire helbide elektroniko osagarria(k):';
-$labels['vacationdays'] = 'Zer maiztasunarekin bidaltzen ditu mezuak (egunak)';
+$labels['vacationdays'] = 'Zenbatero bidali mezuak (egunak)';
 $labels['vacationinterval'] = 'Zenbatero bidali mezuak:';
+$labels['vacationreason'] = 'Mezuaren gorputza (oporrak direla medio):';
+$labels['vacationsubject'] = 'Mezuaren gaia:';
 $labels['days'] = 'egun';
 $labels['seconds'] = 'segundo';
-$labels['vacationreason'] = 'Mezuaren gorputza (oporrak direla medio):';
-$labels['vacationsubject'] = 'Mezuaren izenburua:';
 $labels['rulestop'] = 'Gelditu arauak ebaluatzen';
 $labels['enable'] = 'Gaitu/Ezgaitu';
 $labels['filterset'] = 'Iragazki-paketea';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'lehenengo karakterea maiuskulan';
 $labels['varquotewildcard'] = 'aipatu karaktere bereziak';
 $labels['varlength'] = 'luzera';
 $labels['notify'] = 'Bidali jakinarazpena';
-$labels['notifyaddress'] = 'e-posta helbidera:';
-$labels['notifybody'] = 'Jakinarazpenaren gorputza:';
-$labels['notifysubject'] = 'Jakinarazpenaren subjektua:';
-$labels['notifyfrom'] = 'Jakinarazpenaren bidaltzailea:';
+$labels['notifytarget'] = 'Jakinarazpenaren xedea:';
+$labels['notifymessage'] = 'Jakinarazpenaren mezua (aukerakoa):';
+$labels['notifyoptions'] = 'Jakinarazpenaren aukerak (aukerakoa):';
+$labels['notifyfrom'] = 'Jakinarazpenaren bidaltzailea (aukerakoa):';
 $labels['notifyimportance'] = 'Garrantzia:';
 $labels['notifyimportancelow'] = 'baxua';
 $labels['notifyimportancenormal'] = 'normala';
 $labels['notifyimportancehigh'] = 'altua';
+$labels['notifymethodmailto'] = 'Helbide elektronikoa';
+$labels['notifymethodtel'] = 'Telefonoa';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Sortu iragazkia';
 $labels['usedata'] = 'Erabili datorren data iragazkian:';
 $labels['nextstep'] = 'Hurrengo urratsa';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'minuskulak eta maiuskulak (ascii-casemap)';
 $labels['asciinumeric'] = 'numerikoa  (ascii-numeric)';
 $labels['index'] = 'indexatu:';
 $labels['indexlast'] = 'atzeraka';
+$labels['vacation'] = 'Oporraldia';
+$labels['vacation.reply'] = 'Erantzun mezua';
+$labels['vacation.advanced'] = 'Ezarpen aurreratuak';
+$labels['vacation.subject'] = 'Gaia';
+$labels['vacation.body'] = 'Gorputza';
+$labels['vacation.start'] = 'Oporraldiaren hasiera';
+$labels['vacation.end'] = 'Oporraldiaren bukaera';
+$labels['vacation.status'] = 'Egoera';
+$labels['vacation.on'] = 'Piztuta';
+$labels['vacation.off'] = 'Itzalita';
+$labels['vacation.addresses'] = 'Nire helbide osagarriak';
+$labels['vacation.interval'] = 'Erantzun tartea';
+$labels['vacation.after'] = 'Jarri oporren erregela honen ondoren';
+$labels['vacation.saving'] = 'Datuak gordetzen...';
+$labels['vacation.action'] = 'Sarrerako mezuaren ekintza';
+$labels['vacation.keep'] = 'Mantendu';
+$labels['vacation.discard'] = 'Baztertu';
+$labels['vacation.redirect'] = 'Birbideratu hona';
+$labels['vacation.copy'] = 'Bidali kopia hona';
+$labels['arialabelfiltersetactions'] = 'Iragazki-paketearen ekintzak';
+$labels['arialabelfilteractions'] = 'Iragazki-ekintzak';
+$labels['arialabelfilterform'] = 'Iragazkiaren ezaugarriak';
+$labels['ariasummaryfilterslist'] = 'Iragazkien zerrenda';
+$labels['ariasummaryfiltersetslist'] = 'Iragazki-paketeen zerrenda';
+$labels['filterstitle'] = 'Editatu postaren sarrera-iragazkiak';
+$labels['vacationtitle'] = 'Bulegotik-kanpo -erantzun automatiko- araua';
 $messages['filterunknownerror'] = 'Zerbitzari ezezaguna errorea';
 $messages['filterconnerror'] = 'Ezin da konektatu zerbitzariarekin.';
 $messages['filterdeleteerror'] = 'Ezin da ezabatu iragazkia. Errore bat gertatu da zerbitzarian.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Izen erreserbatua.';
 $messages['setexist'] = 'Lehendik badago pakete hori.';
 $messages['nodata'] = 'Gutxienez posizio bat hautatu behar da!';
 $messages['invaliddateformat'] = 'Dataren edo dataren zati baten formatua ez da baliozkoa ';
+$messages['saveerror'] = 'Ezin dira datuak gorde. Errorea gertatu da zerbitzarian.';
+$messages['vacationsaved'] = 'Oporren data ongi gorde da.';
+$messages['emptyvacationbody'] = 'Beharrezkoa da oporraldiko mezua jartzea!';
 ?>
diff --git a/lib/plugins/managesieve/localization/fa_IR.inc b/lib/plugins/managesieve/localization/fa_IR.inc
index b938c58..65f2d0d 100644
--- a/lib/plugins/managesieve/localization/fa_IR.inc
+++ b/lib/plugins/managesieve/localization/fa_IR.inc
@@ -15,18 +15,18 @@
 
  For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
 */
-$labels['filters'] = 'صافی‌ها';
-$labels['managefilters'] = 'مدیریت صافی‌های نامه ورودی';
-$labels['filtername'] = 'نام صافی';
-$labels['newfilter'] = 'صافی جدید';
-$labels['filteradd'] = 'افزودن صافی';
-$labels['filterdel'] = 'حذف صافی';
+$labels['filters'] = 'پالایه‌ها';
+$labels['managefilters'] = 'مدیریت پالایه‌های نامه ورودی';
+$labels['filtername'] = 'نام پالایه';
+$labels['newfilter'] = 'پالایه جدید';
+$labels['filteradd'] = 'افزودن پالایه';
+$labels['filterdel'] = 'حذف پالایه';
 $labels['moveup'] = 'انتقال به بالا';
 $labels['movedown'] = 'انتقال به پایین';
 $labels['filterallof'] = 'مطابقت همه قوانین ذیل';
 $labels['filteranyof'] = 'مطابقت هر کدام از قوانین ذیل';
 $labels['filterany'] = 'همه پیغام ها';
-$labels['filtercontains'] = 'شامل‌';
+$labels['filtercontains'] = 'دربرگیرنده';
 $labels['filternotcontains'] = 'بدون';
 $labels['filteris'] = 'برابر است با';
 $labels['filterisnot'] = 'برابر نیست با';
@@ -54,29 +54,29 @@ $labels['add'] = 'افزودن';
 $labels['del'] = 'حذف';
 $labels['sender'] = 'فرستنده';
 $labels['recipient'] = 'گیرنده';
-$labels['vacationaddr'] = 'آدرس(های) ایمیل اضافی من:';
+$labels['vacationaddr'] = 'نشانی(های) رایانامه دیگر من:';
 $labels['vacationdays'] = 'پیغام ها در چه مواقعی فرستاده شدند (در روزهای):';
 $labels['vacationinterval'] = 'مواقعی که پیغام‌ها ارسال می‌شوند:';
-$labels['days'] = 'روزها';
-$labels['seconds'] = 'ثانیه‌ها';
 $labels['vacationreason'] = 'بدنه پیغام (علت مسافرت):';
 $labels['vacationsubject'] = 'موضوع پیغام:';
+$labels['days'] = 'روزها';
+$labels['seconds'] = 'ثانیه‌ها';
 $labels['rulestop'] = 'توقف قوانین ارزیابی';
 $labels['enable'] = 'فعال/غیرفعال‌سازی';
-$labels['filterset'] = 'مجموعه صافی‌ها';
-$labels['filtersets'] = 'مجموعه‌های صافی‌ها';
-$labels['filtersetadd'] = 'افزودن مجموعه صافی‌ها';
-$labels['filtersetdel'] = 'حذف مجموعه صافی‌های جاری';
-$labels['filtersetact'] = 'فعال کردن مجموعه صافی‌های جاری';
-$labels['filtersetdeact'] = 'غیرفعال کردن مجموعه صافی‌های جاری';
-$labels['filterdef'] = 'تعریف صافی';
-$labels['filtersetname'] = 'نام مجموعه صافی‌ها';
-$labels['newfilterset'] = 'مجموعه صافی‌های جدید';
+$labels['filterset'] = 'مجموعه پالایه‌ها';
+$labels['filtersets'] = 'مجموعه‌های پالایه‌ها';
+$labels['filtersetadd'] = 'افزودن مجموعه پالایه‌ها';
+$labels['filtersetdel'] = 'حذف مجموعه پالایه‌های جاری';
+$labels['filtersetact'] = 'فعال کردن مجموعه پالایه‌های جاری';
+$labels['filtersetdeact'] = 'غیرفعال کردن مجموعه پالایه‌های جاری';
+$labels['filterdef'] = 'تعریف پالایه';
+$labels['filtersetname'] = 'نام مجموعه پالایه‌ها';
+$labels['newfilterset'] = 'مجموعه پالایه‌های جدید';
 $labels['active'] = 'فعال';
 $labels['none'] = 'هیچ‌کدام';
 $labels['fromset'] = 'از مجموعه';
 $labels['fromfile'] = 'از پرونده';
-$labels['filterdisabled'] = 'صافی غیرفعال شد';
+$labels['filterdisabled'] = 'پالایه غیرفعال شد';
 $labels['countisgreaterthan'] = 'تعداد بیشتر است از';
 $labels['countisgreaterthanequal'] = 'تعداد بیشتر یا مساوی است با';
 $labels['countislessthan'] = 'تعداد کمتر است از';
@@ -108,16 +108,19 @@ $labels['varupperfirst'] = 'حرف اول بزرگ';
 $labels['varquotewildcard'] = 'نقل قول کاراکترهای خاص';
 $labels['varlength'] = 'طول';
 $labels['notify'] = 'ارسال تذکر';
-$labels['notifyaddress'] = 'به آدرس پست الکترونیکی:';
-$labels['notifybody'] = 'بدنه تذکر:';
-$labels['notifysubject'] = 'موضوع تذکر:';
-$labels['notifyfrom'] = 'فرستنده تذکر:';
+$labels['notifytarget'] = 'مقصد آگاه‌سازی:';
+$labels['notifymessage'] = 'متن آگاه‌سازی (تختیاری):';
+$labels['notifyoptions'] = 'گزینه‌های آگاه‌سازی (اختیاری):';
+$labels['notifyfrom'] = 'فرستنده آگاه‌سازی (اختیاری):';
 $labels['notifyimportance'] = 'اهمیت:';
 $labels['notifyimportancelow'] = 'Ú©Ù…';
 $labels['notifyimportancenormal'] = 'معمولی';
 $labels['notifyimportancehigh'] = 'زیاد';
-$labels['filtercreate'] = 'ایجاد صافی';
-$labels['usedata'] = 'استفاده از داده ذیل در صافی:';
+$labels['notifymethodmailto'] = 'رایانامه';
+$labels['notifymethodtel'] = 'تلفن';
+$labels['notifymethodsms'] = 'پیامک';
+$labels['filtercreate'] = 'ایجاد پالایه';
+$labels['usedata'] = 'استفاده از داده ذیل در پالایه:';
 $labels['nextstep'] = 'مرحله بعدی';
 $labels['...'] = '...';
 $labels['currdate'] = 'تاریخ جاری';
@@ -157,36 +160,65 @@ $labels['asciicasemap'] = 'حساس به حروه کوچک و بزرگ (ascii-ca
 $labels['asciinumeric'] = 'عددی (ascii-numeric)';
 $labels['index'] = 'فهرست:';
 $labels['indexlast'] = 'به عقب';
+$labels['vacation'] = 'مسافرت';
+$labels['vacation.reply'] = 'پاسخ به یغام';
+$labels['vacation.advanced'] = 'تنظیمات پیشرفته';
+$labels['vacation.subject'] = 'موضوع';
+$labels['vacation.body'] = 'بدنه';
+$labels['vacation.start'] = 'شروع تعطیلی';
+$labels['vacation.end'] = 'پایان تعطیلی';
+$labels['vacation.status'] = 'وضعیت';
+$labels['vacation.on'] = 'روشن';
+$labels['vacation.off'] = 'خاموش';
+$labels['vacation.addresses'] = 'نشانی‌های دیگر من';
+$labels['vacation.interval'] = 'فاصله پاسخ';
+$labels['vacation.after'] = 'قرار دادن قانون مسافرت بعد از';
+$labels['vacation.saving'] = 'ذخیره داده‌ها...';
+$labels['vacation.action'] = 'کنش عملکرد ورودی';
+$labels['vacation.keep'] = 'نگه داشتن';
+$labels['vacation.discard'] = 'دور انداختن';
+$labels['vacation.redirect'] = 'بازگردانی به';
+$labels['vacation.copy'] = 'ارسال رونوشت به';
+$labels['arialabelfiltersetactions'] = 'کنش‌های مجموعه پالایه';
+$labels['arialabelfilteractions'] = 'کنش‌های پالایه';
+$labels['arialabelfilterform'] = 'خصوصیات پالایه';
+$labels['ariasummaryfilterslist'] = 'فهرست پالایه‌ها';
+$labels['ariasummaryfiltersetslist'] = 'فهرست مجموعه پالایه‌ها';
+$labels['filterstitle'] = 'ویرایش پالایه‌های پست ورودی';
+$labels['vacationtitle'] = 'ویرایش نقش بیرون از دفتر';
 $messages['filterunknownerror'] = 'خطای سرور نامعلوم.';
 $messages['filterconnerror'] = 'ناتوانی در اتصال به سرور.';
-$messages['filterdeleteerror'] = 'ناتوانی در حذف صافی. خطای سرور رخ داد.';
-$messages['filterdeleted'] = 'صافی با موفقیت حذف شد.';
-$messages['filtersaved'] = 'صافی با موفقیت ذخیره شد.';
+$messages['filterdeleteerror'] = 'ناتوانی در حذف پالایه. خطای سرور رخ داد.';
+$messages['filterdeleted'] = 'پالایه با کام‌یابی حذف شد.';
+$messages['filtersaved'] = 'پالایه با کام‌یابی ذخیره شد.';
 $messages['filtersaveerror'] = 'ناتوانی در ذخیره فیلتر. خطای سرور رخ داد.';
-$messages['filterdeleteconfirm'] = 'آیا مطمئن به حذف صافی انتخاب شده هستید؟';
+$messages['filterdeleteconfirm'] = 'آیا مطمئن به حذف پالایه انتخاب شده هستید؟';
 $messages['ruledeleteconfirm'] = 'آیا مطمئن هستید که می خواهید قانون انتخاب شده را حذف کنید؟';
 $messages['actiondeleteconfirm'] = 'آیا مطمئن هستید که می خواهید عمل انتخاب شده را حذف کنید.';
 $messages['forbiddenchars'] = 'حروف ممنوعه در فیلد.';
 $messages['cannotbeempty'] = 'فیلد نمی تواند خالی باشد.';
-$messages['ruleexist'] = 'صافی با این نام مشخص وجود دارد.';
-$messages['setactivateerror'] = 'ناتوان در فعال کردن مجموعه صافی‌ها انتخاب شده. خطای سرور رخ داد.';
-$messages['setdeactivateerror'] = 'ناتوان در غیرفعال کردن مجموعه صافی‌ها انتخاب شده. خطای سرور رخ داد.';
-$messages['setdeleteerror'] = 'ناتوان در حذف مجموعه صافی‌ها انتخاب شده. خطای سرور رخ داد.';
-$messages['setactivated'] = 'مجموعه صافی‌ها با موفقیت فعال شد.';
-$messages['setdeactivated'] = 'مجموعه صافی‌ها با موفقیت غیرفعال شد.';
-$messages['setdeleted'] = 'مجموعه صافی‌ها با موفقیت حذف شد.';
-$messages['setdeleteconfirm'] = 'آیا مطمئن هستید که می‌خواهید مجموعه صافی‌ها انتخاب شده را حذف کنید؟';
-$messages['setcreateerror'] = 'ناتوانی در ایجاد مجموعه صافی‌ها. خطای سرور رخ داد.';
-$messages['setcreated'] = 'مجموعه صافی‌ها با موفقیت ایجاد شد.';
-$messages['activateerror'] = 'ناتوانی در فعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.';
-$messages['deactivateerror'] = 'ناتوانی در غیرفعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.';
-$messages['deactivated'] = 'صافی(ها) با موفقیت فعال شدند.';
-$messages['activated'] = 'صافی(ها) با موفقیت غیرفعال شدند.';
-$messages['moved'] = 'صافی با موفقیت منتقل شد.';
-$messages['moveerror'] = 'ناتوانی در انتقال صافی انتخاب شده. خطای سرور رخ داد.';
+$messages['ruleexist'] = 'پالایه با این نام مشخص وجود دارد.';
+$messages['setactivateerror'] = 'ناتوان در فعال کردن مجموعه پالایه‌ها انتخاب شده. خطای سرور رخ داد.';
+$messages['setdeactivateerror'] = 'ناتوان در غیرفعال کردن مجموعه پالایه‌ها انتخاب شده. خطای سرور رخ داد.';
+$messages['setdeleteerror'] = 'ناتوان در حذف مجموعه پالایه‌ها انتخاب شده. خطای سرور رخ داد.';
+$messages['setactivated'] = 'مجموعه پالایه‌ها با کام‌یابی فعال شد.';
+$messages['setdeactivated'] = 'مجموعه پالایه‌ها با کام‌یابی غیرفعال شد.';
+$messages['setdeleted'] = 'مجموعه پالایه‌ها با کام‌یابی حذف شد.';
+$messages['setdeleteconfirm'] = 'آیا مطمئن هستید که می‌خواهید مجموعه پالایه‌ها انتخاب شده را حذف کنید؟';
+$messages['setcreateerror'] = 'ناتوانی در ایجاد مجموعه پالایه‌ها. خطای سرور رخ داد.';
+$messages['setcreated'] = 'مجموعه پالایه‌ها با کام‌یابی ایجاد شد.';
+$messages['activateerror'] = 'ناتوانی در فعال کردن پالایه(های) انتخاب شده. خطای سرور رخ داد.';
+$messages['deactivateerror'] = 'ناتوانی در غیرفعال کردن پالایه(های) انتخاب شده. خطای سرور رخ داد.';
+$messages['deactivated'] = 'پالایه(ها) با کام‌یابی فعال شدند.';
+$messages['activated'] = 'پالایه(ها) با کام‌یابی غیرفعال شدند.';
+$messages['moved'] = 'پالایه با کام‌یابی منتقل شد.';
+$messages['moveerror'] = 'ناتوانی در انتقال پالایه انتخاب شده. خطای سرور رخ داد.';
 $messages['nametoolong'] = 'نام خیلی بلند.';
 $messages['namereserved'] = 'نام رزرو شده.';
 $messages['setexist'] = 'مجموعه در حال حاضر موجود است.';
 $messages['nodata'] = 'حداقل باید یک موقعیت باید انتخاب شود.';
 $messages['invaliddateformat'] = 'قالب تاریخ اشتباه';
+$messages['saveerror'] = 'ناتوانی در ذخیره اطلاعات. خطای سرور رخ داد.';
+$messages['vacationsaved'] = 'اطلاعات مسافرت با کام‌یابی ذخیره شد.';
+$messages['emptyvacationbody'] = 'متن پیغام تعطیلی لازم است!';
 ?>
diff --git a/lib/plugins/managesieve/localization/fi_FI.inc b/lib/plugins/managesieve/localization/fi_FI.inc
index 1bec7a3..ba10b1f 100644
--- a/lib/plugins/managesieve/localization/fi_FI.inc
+++ b/lib/plugins/managesieve/localization/fi_FI.inc
@@ -48,17 +48,48 @@ $labels['messagereply'] = 'Vastaa viestillä';
 $labels['messagedelete'] = 'Poista viesti';
 $labels['messagediscard'] = 'Hylkää viestillä';
 $labels['messagekeep'] = 'Säilytä viesti saapuneissa';
+$labels['messagesrules'] = 'Saapuville viesteille:';
 $labels['messagesactions'] = '...suorita seuraavat toiminnot:';
 $labels['add'] = 'Lisää';
 $labels['del'] = 'Poista';
 $labels['sender'] = 'Lähettäjä';
 $labels['recipient'] = 'Vastaanottaja';
+$labels['vacationaddr'] = 'Muut sähköpostiosoitteeni:';
+$labels['vacationreason'] = 'Viestin runko (loman syy):';
 $labels['vacationsubject'] = 'Viestin aihe:';
 $labels['days'] = 'päivää';
 $labels['seconds'] = 'sekuntia';
+$labels['rulestop'] = 'Lopeta sääntöjen arviointi';
+$labels['enable'] = 'Ota käyttöön/poista käytöstä';
+$labels['filterset'] = 'Suodattimien asetus';
+$labels['filtersets'] = 'Suodattimen asetus';
+$labels['filtersetadd'] = 'Lisää suodatinasetus';
+$labels['filtersetdel'] = 'Poista nykyiset suodatinasetukset';
+$labels['filtersetact'] = 'Aktivoi nykyinen suodattimien asetus';
+$labels['filtersetdeact'] = 'Poista käytöstä nykyinen suodattimien asetus';
+$labels['filterdef'] = 'Suodattimen määrittely';
+$labels['filtersetname'] = 'Suodattimien asetuksen nimi';
+$labels['active'] = 'aktiivinen';
+$labels['none'] = 'Ei mikään';
+$labels['fromset'] = 'sarjasta';
+$labels['fromfile'] = 'tiedostosta';
+$labels['filterdisabled'] = 'Suodatin poistettu käytöstä';
+$labels['countisgreaterthan'] = 'määrä on suurempi kuin';
+$labels['countisgreaterthanequal'] = 'määrä on suurempi tai yhtä suuri kuin';
+$labels['countislessthan'] = 'määrä on vähemmän kuin';
+$labels['countislessthanequal'] = 'määrä on vähemmän tai yhtä suuri kuin';
+$labels['countequals'] = 'määrä on yhtä suuri kuin';
+$labels['countnotequals'] = 'määrä ei ole yhtä suuri kuin';
+$labels['valueisgreaterthan'] = 'arvo on suurempi kuin';
+$labels['valueisgreaterthanequal'] = 'arvo on suurempi kuin tai yhtä suuri kuin';
+$labels['valueislessthan'] = 'arvo on vähemmän kuin';
+$labels['valueislessthanequal'] = 'määrä on vähemmän tai yhtä suuri kuin';
+$labels['valueequals'] = 'arvo on yhtä suuri kuin';
+$labels['valuenotequals'] = 'arvo ei ole yhtä suuri kuin';
 $labels['setflags'] = 'Aseta liput viestiin';
 $labels['addflags'] = 'Lisää liput viestiin';
 $labels['removeflags'] = 'Poista liput viestistä';
+$labels['flagread'] = 'Lue';
 $labels['flagdeleted'] = 'Poistettu';
 $labels['flaganswered'] = 'Vastattu';
 $labels['flagflagged'] = 'Liputettu';
@@ -66,42 +97,84 @@ $labels['flagdraft'] = 'Luonnos';
 $labels['setvariable'] = 'Aseta muuttuja';
 $labels['setvarname'] = 'Muuttujan nimi:';
 $labels['setvarvalue'] = 'Muuttujan arvo:';
+$labels['setvarmodifiers'] = 'Muuntimet:';
+$labels['varlower'] = 'pienellä kirjoitettu';
+$labels['varupper'] = 'isolla kirjoitettu';
+$labels['varlowerfirst'] = 'ensimmäinen merkki pienellä kirjoitettuna';
+$labels['varupperfirst'] = 'ensimmäinen merkki isolla kirjoitettuna';
+$labels['varquotewildcard'] = 'lainaa erikoismerkit';
+$labels['varlength'] = 'pituus';
+$labels['notify'] = 'Lähetä ilmoitus';
+$labels['notifytarget'] = 'Ilmoituksen kohde:';
+$labels['notifymessage'] = 'Ilmoituksen viesti (valinnainen):';
+$labels['notifyoptions'] = 'Ilmoituksen valinnat (valinnainen)';
+$labels['notifyfrom'] = 'Ilmoituksen lähettäjä (valinnainen):';
 $labels['notifyimportance'] = 'Tärkeysaste:';
+$labels['notifyimportancelow'] = 'matala';
+$labels['notifyimportancenormal'] = 'normaali';
+$labels['notifyimportancehigh'] = 'korkea';
 $labels['notifymethodmailto'] = 'Sähköposti';
 $labels['notifymethodtel'] = 'Puhelin';
 $labels['notifymethodsms'] = 'Tekstiviesti';
 $labels['filtercreate'] = 'Luo suodatin';
+$labels['usedata'] = 'Käytä seuraavaa dataa suodattimessa:';
+$labels['nextstep'] = 'Seuraava vaihe';
 $labels['...'] = '...';
+$labels['currdate'] = 'Nykyinen päivämäärä';
+$labels['datetest'] = 'Päivämäärä';
+$labels['dateheader'] = 'otsikko:';
 $labels['year'] = 'vuosi';
 $labels['month'] = 'kuukausi';
 $labels['day'] = 'päivä';
+$labels['date'] = 'päivämäärä (vvvv-kk-pp)';
+$labels['julian'] = 'päivämäärä (juliaaninen)';
 $labels['hour'] = 'tunti';
 $labels['minute'] = 'minuutti';
 $labels['second'] = 'sekunti';
 $labels['time'] = 'aika (hh:mm:ss)';
+$labels['iso8601'] = 'päivämäärä (ISO8601)';
+$labels['std11'] = 'päivämäärä (RFC2882)';
 $labels['zone'] = 'aikavyöhyke';
+$labels['weekday'] = 'viikonpäivä (0-6)';
 $labels['advancedopts'] = 'Lisävalinnat';
+$labels['body'] = 'Runko';
 $labels['address'] = 'osoite';
+$labels['envelope'] = 'kirjekuori';
+$labels['modifier'] = 'muuntaja:';
+$labels['text'] = 'teksti';
+$labels['undecoded'] = 'dekoodaamaton (raaka)';
+$labels['contenttype'] = 'sisällön tyyppi';
+$labels['modtype'] = 'tyyppi:';
 $labels['allparts'] = 'kaikki';
+$labels['domain'] = 'domain';
+$labels['localpart'] = 'paikallinen osa';
 $labels['user'] = 'käyttäjä';
+$labels['detail'] = 'yksityiskohta';
+$labels['comparator'] = 'vertailija:';
 $labels['default'] = 'oletus';
 $labels['vacation'] = 'Loma';
 $labels['vacation.reply'] = 'Vastausviesti';
 $labels['vacation.advanced'] = 'Lisäasetukset';
 $labels['vacation.subject'] = 'Aihe';
 $labels['vacation.body'] = 'Sisältö';
-$labels['vacation.dates'] = 'Loma-aika';
-$labels['vacation.from'] = 'Lähettäjä:';
-$labels['vacation.to'] = 'Vastaanottaja:';
 $labels['vacation.status'] = 'Tila';
 $labels['vacation.on'] = 'Päällä';
 $labels['vacation.off'] = 'Pois';
 $labels['vacation.saving'] = 'Tallennetaan tietoja...';
+$labels['vacation.action'] = 'Toiminto saapuvalle viestille';
+$labels['vacation.keep'] = 'Säilytä';
+$labels['vacation.discard'] = 'Hylkää';
+$labels['vacation.redirect'] = 'Ohjaa uudelleen osoitteeseen';
+$labels['vacation.copy'] = 'Lähetä kopio osoitteeseen';
 $messages['filterunknownerror'] = 'Tuntematon palvelinvirhe.';
 $messages['filterconnerror'] = 'Yhteys palvelimeen epäonnistui.';
 $messages['filterdeleted'] = 'Suodatin poistettu onnistuneesti.';
+$messages['filtersaved'] = 'Suodatin tallennettu onnistuneesti.';
+$messages['filtersaveerror'] = 'Suodattimen tallennus epäonnistui palvelinvirheen vuoksi.';
 $messages['filterdeleteconfirm'] = 'Haluatko varmasti poistaa valitun suodattimen?';
+$messages['forbiddenchars'] = 'Virheellisiä merkkejä kentässä.';
 $messages['cannotbeempty'] = 'Kenttä ei voi olla tyhjä.';
+$messages['ruleexist'] = 'Suodatin samalla nimellä on jo olemassa.';
 $messages['moved'] = 'Suodatin siirretty onnistuneesti.';
 $messages['nametoolong'] = 'Nimi on liian pitkä.';
 $messages['saveerror'] = 'Tietojen tallennus epäonnistui palvelinvirheen vuoksi.';
diff --git a/lib/plugins/managesieve/localization/fr_FR.inc b/lib/plugins/managesieve/localization/fr_FR.inc
index 67a73a9..6377d12 100644
--- a/lib/plugins/managesieve/localization/fr_FR.inc
+++ b/lib/plugins/managesieve/localization/fr_FR.inc
@@ -16,14 +16,14 @@
  For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
 */
 $labels['filters'] = 'Filtres';
-$labels['managefilters'] = 'Gérer les filtres sur les courriels entrants';
+$labels['managefilters'] = 'Gérer les filtres de courriels entrants';
 $labels['filtername'] = 'Nom du filtre';
 $labels['newfilter'] = 'Nouveau filtre';
 $labels['filteradd'] = 'Ajouter un filtre';
 $labels['filterdel'] = 'Supprimer le filtre';
 $labels['moveup'] = 'Monter';
 $labels['movedown'] = 'Descendre';
-$labels['filterallof'] = 'valident toutes les conditions suivantes';
+$labels['filterallof'] = 'correspondant à toutes les règles suivantes';
 $labels['filteranyof'] = 'valident au moins une des conditions suivantes';
 $labels['filterany'] = 'tous les messages';
 $labels['filtercontains'] = 'contient';
@@ -32,16 +32,16 @@ $labels['filteris'] = 'est égal à';
 $labels['filterisnot'] = 'est différent de';
 $labels['filterexists'] = 'existe';
 $labels['filternotexists'] = 'n\'existe pas';
-$labels['filtermatches'] = 'concorde avec l\'expression';
-$labels['filternotmatches'] = 'ne concorde pas avec l\'expression';
-$labels['filterregex'] = 'concorde avec l\'expression régulière';
-$labels['filternotregex'] = 'ne concorde pas avec l\'expression régulière';
-$labels['filterunder'] = 'est plus petit que';
-$labels['filterover'] = 'est plus grand que';
+$labels['filtermatches'] = 'correspond à l\'expression';
+$labels['filternotmatches'] = 'ne correspond pas à l\'expression';
+$labels['filterregex'] = 'correspond à l\'expression rationnelle';
+$labels['filternotregex'] = 'ne correspond pas à l\'expression rationnelle';
+$labels['filterunder'] = 'plus petit que';
+$labels['filterover'] = 'plus grand que';
 $labels['addrule'] = 'Ajouter une règle';
 $labels['delrule'] = 'Supprimer une règle';
 $labels['messagemoveto'] = 'Déplacer le message vers';
-$labels['messageredirect'] = 'Transférer le message à';
+$labels['messageredirect'] = 'Rediriger le message à';
 $labels['messagecopyto'] = 'Copier le message vers';
 $labels['messagesendcopy'] = 'Envoyer une copie du message à';
 $labels['messagereply'] = 'Répondre avec le message';
@@ -49,84 +49,87 @@ $labels['messagedelete'] = 'Supprimer le message';
 $labels['messagediscard'] = 'Rejeter avec le message';
 $labels['messagekeep'] = 'Conserver le message dans la boîte de réception';
 $labels['messagesrules'] = 'Pour les courriels entrants :';
-$labels['messagesactions'] = '...exécuter les actions suivantes:';
+$labels['messagesactions'] = '...exécuter les actions suivantes :';
 $labels['add'] = 'Ajouter';
 $labels['del'] = 'Supprimer';
 $labels['sender'] = 'Expéditeur';
 $labels['recipient'] = 'Destinataire';
-$labels['vacationaddr'] = 'Adresse(s) e-mail additionnelle(s):';
-$labels['vacationdays'] = 'Ne pas renvoyer un message avant (jours) :';
-$labels['vacationinterval'] = 'Comment envoyer les messages :';
+$labels['vacationaddr'] = 'Mes adresses courriel additionnelles :';
+$labels['vacationdays'] = 'Fréquence d\'envoi des messages (en jours) :';
+$labels['vacationinterval'] = 'Fréquence d\'envoi des messages :';
+$labels['vacationreason'] = 'Corps du message (raison de l\'absence) :';
+$labels['vacationsubject'] = 'Objet du message :';
 $labels['days'] = 'jours';
 $labels['seconds'] = 'secondes';
-$labels['vacationreason'] = 'Corps du message (raison de l\'absence) :';
-$labels['vacationsubject'] = 'Sujet du message:';
-$labels['rulestop'] = 'Arrêter d\'évaluer les prochaines règles';
-$labels['enable'] = 'Activer/Désactiver';
-$labels['filterset'] = 'Groupe de filtres';
-$labels['filtersets'] = 'Groupes de filtres';
-$labels['filtersetadd'] = 'Ajouter un groupe de filtres';
-$labels['filtersetdel'] = 'Supprimer le groupe de filtres actuel';
-$labels['filtersetact'] = 'Activer le groupe de filtres actuel';
-$labels['filtersetdeact'] = 'Désactiver le groupe de filtres actuel';
+$labels['rulestop'] = 'Arrêter l\'évaluation des règles';
+$labels['enable'] = 'Activer/désactiver';
+$labels['filterset'] = 'Jeu de filtres';
+$labels['filtersets'] = 'Jeux de filtres';
+$labels['filtersetadd'] = 'Ajouter un jeu de filtres';
+$labels['filtersetdel'] = 'Supprimer le jeu de filtres actuel';
+$labels['filtersetact'] = 'Activer le jeu de filtres actuel';
+$labels['filtersetdeact'] = 'Désactiver le jeu de filtres actuel';
 $labels['filterdef'] = 'Définition du filtre';
-$labels['filtersetname'] = 'Nom du groupe de filtres';
-$labels['newfilterset'] = 'Nouveau groupe de filtres';
-$labels['active'] = 'actif';
+$labels['filtersetname'] = 'Nom du jeu de filtres';
+$labels['newfilterset'] = 'Nouveau jeu de filtres';
+$labels['active'] = 'activer';
 $labels['none'] = 'aucun';
-$labels['fromset'] = 'à partir du filtre';
+$labels['fromset'] = 'à partir du jeu';
 $labels['fromfile'] = 'à partir du fichier';
 $labels['filterdisabled'] = 'Filtre désactivé';
 $labels['countisgreaterthan'] = 'total supérieur à';
 $labels['countisgreaterthanequal'] = 'total supérieur ou égal à';
 $labels['countislessthan'] = 'total inférieur à';
-$labels['countislessthanequal'] = 'total inférieur à';
+$labels['countislessthanequal'] = 'total inférieur ou égal à';
 $labels['countequals'] = 'total égal à';
-$labels['countnotequals'] = 'le comptage n\'est pas égal à';
+$labels['countnotequals'] = 'le nombre n\'est pas égal à';
 $labels['valueisgreaterthan'] = 'valeur supérieure à';
 $labels['valueisgreaterthanequal'] = 'valeur supérieure ou égale à';
 $labels['valueislessthan'] = 'valeur inférieure à';
 $labels['valueislessthanequal'] = 'valeur inférieure ou égale à';
 $labels['valueequals'] = 'valeur égale à';
 $labels['valuenotequals'] = 'la valeur n\'est pas égale à';
-$labels['setflags'] = 'Mettre les marqueurs au message';
-$labels['addflags'] = 'Ajouter les marqueurs au message';
-$labels['removeflags'] = 'Supprimer les marqueurs du message';
+$labels['setflags'] = 'Définir les drapeaux pour le message';
+$labels['addflags'] = 'Ajouter les drapeaux au message';
+$labels['removeflags'] = 'Supprimer les drapeaux du message';
 $labels['flagread'] = 'Lu';
 $labels['flagdeleted'] = 'Supprimé';
-$labels['flaganswered'] = 'Répondu';
-$labels['flagflagged'] = 'Marqué';
+$labels['flaganswered'] = 'Réponse envoyée';
+$labels['flagflagged'] = 'Signalé';
 $labels['flagdraft'] = 'Brouillon';
 $labels['setvariable'] = 'Définir une variable';
 $labels['setvarname'] = 'Nom de la variable :';
 $labels['setvarvalue'] = 'Valeur de la variable :';
-$labels['setvarmodifiers'] = 'Modifications :';
+$labels['setvarmodifiers'] = 'Modificateurs :';
 $labels['varlower'] = 'minuscule';
 $labels['varupper'] = 'majuscule';
-$labels['varlowerfirst'] = 'premier caractère minuscule';
-$labels['varupperfirst'] = 'premier caractère majuscule';
-$labels['varquotewildcard'] = 'Échapper les caractères spéciaux';
+$labels['varlowerfirst'] = 'premier caractère en minuscule';
+$labels['varupperfirst'] = 'premier caractère en majuscule';
+$labels['varquotewildcard'] = 'citer les caractères spéciaux';
 $labels['varlength'] = 'longueur';
 $labels['notify'] = 'Envoyer la notification';
-$labels['notifyaddress'] = 'A l\'adresse e-mail :';
-$labels['notifybody'] = 'Corps de la notification :';
-$labels['notifysubject'] = 'Objet de la notification :';
-$labels['notifyfrom'] = 'Expéditeur de la notification :';
+$labels['notifytarget'] = 'Cible de la notification :';
+$labels['notifymessage'] = 'Message de notification (optionnel) :';
+$labels['notifyoptions'] = 'Options de notification (optionnel) :';
+$labels['notifyfrom'] = 'Expéditeur de la notification (optionnel) :';
 $labels['notifyimportance'] = 'Importance :';
 $labels['notifyimportancelow'] = 'faible';
-$labels['notifyimportancenormal'] = 'normal';
+$labels['notifyimportancenormal'] = 'normale';
 $labels['notifyimportancehigh'] = 'haute';
+$labels['notifymethodmailto'] = 'Courriel';
+$labels['notifymethodtel'] = 'Téléphone';
+$labels['notifymethodsms'] = 'Message texte';
 $labels['filtercreate'] = 'Créer un filtre';
-$labels['usedata'] = 'Utiliser les informations suivantes dans le filtre';
+$labels['usedata'] = 'Utiliser les données suivantes dans le filtre :';
 $labels['nextstep'] = 'Étape suivante';
 $labels['...'] = '...';
 $labels['currdate'] = 'Date actuelle';
 $labels['datetest'] = 'Date';
-$labels['dateheader'] = 'header:';
+$labels['dateheader'] = 'en-tête :';
 $labels['year'] = 'année';
 $labels['month'] = 'mois';
 $labels['day'] = 'jour';
-$labels['date'] = 'date (yyyy-mm-dd)';
+$labels['date'] = 'date (aaaa-mm-jj)';
 $labels['julian'] = 'date (julien)';
 $labels['hour'] = 'heure';
 $labels['minute'] = 'minute';
@@ -137,56 +140,85 @@ $labels['std11'] = 'date (RFC2822)';
 $labels['zone'] = 'fuseau horaire';
 $labels['weekday'] = 'jour de la semaine (0-6)';
 $labels['advancedopts'] = 'Options avancées';
-$labels['body'] = 'Corps du message';
+$labels['body'] = 'Corps';
 $labels['address'] = 'adresse';
 $labels['envelope'] = 'enveloppe';
-$labels['modifier'] = 'modificateur:';
+$labels['modifier'] = 'modificateur :';
 $labels['text'] = 'texte';
 $labels['undecoded'] = 'non décodé (brut)';
 $labels['contenttype'] = 'type de contenu';
-$labels['modtype'] = 'type:';
+$labels['modtype'] = 'type :';
 $labels['allparts'] = 'tout';
 $labels['domain'] = 'domaine';
 $labels['localpart'] = 'partie locale';
 $labels['user'] = 'utilisateur';
 $labels['detail'] = 'détail';
-$labels['comparator'] = 'comparateur';
+$labels['comparator'] = 'comparateur :';
 $labels['default'] = 'par défaut';
 $labels['octet'] = 'strict (octet)';
 $labels['asciicasemap'] = 'insensible à la casse (ascii-casemap)';
 $labels['asciinumeric'] = 'numérique (ascii-numeric)';
-$labels['index'] = 'index:';
-$labels['indexlast'] = 'retour arrière';
-$messages['filterunknownerror'] = 'Erreur du serveur inconnue';
-$messages['filterconnerror'] = 'Connexion au serveur Managesieve impossible';
-$messages['filterdeleteerror'] = 'Impossible de supprimer le filtre. Une erreur serveur est survenue.';
-$messages['filterdeleted'] = 'Le filtre a bien été supprimé';
-$messages['filtersaved'] = 'Le filtre a bien été enregistré';
-$messages['filtersaveerror'] = 'Impossible de sauvegarder le filtre. Une erreur serveur est survenue.';
-$messages['filterdeleteconfirm'] = 'Voulez-vous vraiment supprimer le filtre sélectionné?';
-$messages['ruledeleteconfirm'] = 'Voulez-vous vraiment supprimer la règle sélectionnée?';
-$messages['actiondeleteconfirm'] = 'Voulez-vous vraiment supprimer l\'action sélectionnée?';
+$labels['index'] = 'index :';
+$labels['indexlast'] = 'à l\'envers';
+$labels['vacation'] = 'Vacances';
+$labels['vacation.reply'] = 'Message de réponse';
+$labels['vacation.advanced'] = 'Paramètres avancés';
+$labels['vacation.subject'] = 'Objet';
+$labels['vacation.body'] = 'Corps';
+$labels['vacation.start'] = 'Début de vacances';
+$labels['vacation.end'] = 'Fin de vacances';
+$labels['vacation.status'] = 'État';
+$labels['vacation.on'] = 'Arrêt';
+$labels['vacation.off'] = 'Marche';
+$labels['vacation.addresses'] = 'Mes adresses supplémentaires';
+$labels['vacation.interval'] = 'Plage de réponse';
+$labels['vacation.after'] = 'Mettre en place la règle de vacances après';
+$labels['vacation.saving'] = 'Enregistrement des données...';
+$labels['vacation.action'] = 'Action pour message entrant';
+$labels['vacation.keep'] = 'Garder';
+$labels['vacation.discard'] = 'Rejeter';
+$labels['vacation.redirect'] = 'Réacheminer à';
+$labels['vacation.copy'] = 'Envoyer une copie à';
+$labels['arialabelfiltersetactions'] = 'Actions des jeux de filtrage';
+$labels['arialabelfilteractions'] = 'Actions de filtrage';
+$labels['arialabelfilterform'] = 'Propriété du filtrage';
+$labels['ariasummaryfilterslist'] = 'Liste des filtres';
+$labels['ariasummaryfiltersetslist'] = 'Liste des jeux de filtrage';
+$labels['filterstitle'] = 'Modifier les filtres de courriels entrants';
+$labels['vacationtitle'] = 'Modifier la règle d\'absence du bureau';
+$messages['filterunknownerror'] = 'Erreur de serveur inconnue';
+$messages['filterconnerror'] = 'Connexion au serveur impossible.';
+$messages['filterdeleteerror'] = 'Impossible de supprimer le filtre. Une erreur de serveur est survenue.';
+$messages['filterdeleted'] = 'Le filtre a été supprimé avec succès.';
+$messages['filtersaved'] = 'Le filtre a été enregistré avec succès.';
+$messages['filtersaveerror'] = 'Impossible d\'enregistrer le filtre. Une erreur de serveur est survenue.';
+$messages['filterdeleteconfirm'] = 'Voulez-vous vraiment supprimer le filtre sélectionné ?';
+$messages['ruledeleteconfirm'] = 'Voulez-vous vraiment supprimer la règle sélectionnée ?';
+$messages['actiondeleteconfirm'] = 'Voulez-vous vraiment supprimer l\'action sélectionnée ?';
 $messages['forbiddenchars'] = 'Caractères interdits dans le champ';
 $messages['cannotbeempty'] = 'Le champ ne peut pas être vide';
 $messages['ruleexist'] = 'Un filtre existe déjà avec ce nom.';
-$messages['setactivateerror'] = 'Impossible d\'activer le set de filtres sélectionné. Une erreur serveur est survenue.';
-$messages['setdeactivateerror'] = 'Impossible de désactiver le set de filtres sélectionné. Une erreur serveur est survenue.';
-$messages['setdeleteerror'] = 'Impossible de supprimer les set de filtres sélectionné. Une erreur serveur est survenue.';
-$messages['setactivated'] = 'Le groupe de filtres a bien été activé.';
-$messages['setdeactivated'] = 'Le groupe de filtres a bien été désactivé.';
-$messages['setdeleted'] = 'Le groupe de filtres a bien été supprimé.';
-$messages['setdeleteconfirm'] = 'Voulez vous vraiment supprimer le groupe de filtres sélectionné ?';
-$messages['setcreateerror'] = 'Impossible de créer un set de filtres. Une erreur serveur est survenue.';
-$messages['setcreated'] = 'Le groupe de filtres a bien été créé.';
-$messages['activateerror'] = 'Impossible d\'activer le ou les filtres sélectionné(s). Une erreur serveur est survenue.';
-$messages['deactivateerror'] = 'Impossible de désactiver le ou les filtres sélectionné(s). Une erreur serveur est survenue.';
+$messages['setactivateerror'] = 'Impossible d\'activer le jeu de filtres sélectionné. Une erreur de serveur est survenue.';
+$messages['setdeactivateerror'] = 'Impossible de désactiver le jeu de filtres sélectionné. Une erreur de serveur est survenue.';
+$messages['setdeleteerror'] = 'Impossible de supprimer le jeu de filtres sélectionné. Une erreur de serveur est survenue.';
+$messages['setactivated'] = 'Le jeu de filtres a été activé avec succès.';
+$messages['setdeactivated'] = 'Le jeu de filtres a été désactivé avec succès.';
+$messages['setdeleted'] = 'Le jeu de filtres a été supprimé avec succès.';
+$messages['setdeleteconfirm'] = 'Voulez vous vraiment supprimer le jeu de filtres sélectionné ?';
+$messages['setcreateerror'] = 'Impossible de créer un jeu de filtres. Une erreur de serveur est survenue.';
+$messages['setcreated'] = 'Le jeu de filtres a été créé avec succès.';
+$messages['activateerror'] = 'Impossible d\'activer le/les filtre(s) sélectionné(s). Une erreur de serveur est survenue.';
+$messages['deactivateerror'] = 'Impossible de désactiver le/les filtre(s) sélectionné(s). Une erreur de serveur est survenue.';
 $messages['deactivated'] = 'Filtre(s) désactivé(s) avec succès.';
 $messages['activated'] = 'Filtre(s) activé(s) avec succès.';
 $messages['moved'] = 'Filtre déplacé avec succès.';
-$messages['moveerror'] = 'Impossible de déplacer le filtre sélectionné. Une erreur serveur est survenue.';
+$messages['moveerror'] = 'Impossible de déplacer le filtre sélectionné. Une erreur de serveur est survenue.';
 $messages['nametoolong'] = 'Nom trop long.';
 $messages['namereserved'] = 'Nom réservé.';
-$messages['setexist'] = 'Ce groupe existe déjà.';
-$messages['nodata'] = 'Au moins un élément doit être selectionné !';
-$messages['invaliddateformat'] = 'Date non valide ou format d\'une partie de la date';
+$messages['setexist'] = 'Le jeu existe déjà.';
+$messages['nodata'] = 'Au moins un élément doit être sélectionné !';
+$messages['invaliddateformat'] = 'Format de date ou d\'une partie de la date invalide';
+$messages['saveerror'] = 'Impossible d\'enregistrer les données. Une erreur du serveur est survenue.';
+$messages['vacationsaved'] = 'Les données de vacances ont été enregistrées avec succès.';
+$messages['emptyvacationbody'] = 'Le corps du message de vacances est nécessaire !';
 ?>
diff --git a/lib/plugins/managesieve/localization/gl_ES.inc b/lib/plugins/managesieve/localization/gl_ES.inc
index f1f9d2f..cbe45ca 100644
--- a/lib/plugins/managesieve/localization/gl_ES.inc
+++ b/lib/plugins/managesieve/localization/gl_ES.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Persoa destinataria';
 $labels['vacationaddr'] = 'O(s) meu(s) outro (s) enderezo(s) de correo:';
 $labels['vacationdays'] = 'Cada canto enviar mensaxes (en días):';
 $labels['vacationinterval'] = 'Con que frecuencia se van enviar mensaxes:';
-$labels['days'] = 'días';
-$labels['seconds'] = 'segundos';
 $labels['vacationreason'] = 'Corpo da mensaxe (por vacacións):';
 $labels['vacationsubject'] = 'Asunto da mensaxe:';
+$labels['days'] = 'días';
+$labels['seconds'] = 'segundos';
 $labels['rulestop'] = 'Parar de avaliar regras';
 $labels['enable'] = 'Activar/Desactivar';
 $labels['filterset'] = 'Conxunto de filtros';
@@ -108,14 +108,13 @@ $labels['varupperfirst'] = 'primeira letra maiúscula';
 $labels['varquotewildcard'] = 'poñer entre aspas caracteres especiais';
 $labels['varlength'] = 'lonxitude';
 $labels['notify'] = 'Enviar notificación';
-$labels['notifyaddress'] = 'A este enderezo de correo:';
-$labels['notifybody'] = 'Corpo da notificación:';
-$labels['notifysubject'] = 'Asunto da notificación:';
-$labels['notifyfrom'] = 'Remite da notificación:';
 $labels['notifyimportance'] = 'Importancia:';
 $labels['notifyimportancelow'] = 'baixa';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Correo electrónico';
+$labels['notifymethodtel'] = 'Teléfono';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Crear filtro';
 $labels['usedata'] = 'Usar os seguintes datos no filtro:';
 $labels['nextstep'] = 'Seguinte paso';
@@ -157,6 +156,21 @@ $labels['asciicasemap'] = 'non sensíbel a maiúsculas/minúsculas (ascii-casema
 $labels['asciinumeric'] = 'numérico (ascii-numerico)';
 $labels['index'] = 'índice:';
 $labels['indexlast'] = 'atrás';
+$labels['vacation.reply'] = 'Respostar á mensaxe';
+$labels['vacation.advanced'] = 'Opcións avanzadas';
+$labels['vacation.subject'] = 'Asunto';
+$labels['vacation.body'] = 'Corpo';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Activar';
+$labels['vacation.off'] = 'Desactivar';
+$labels['vacation.saving'] = 'Gardando datos...';
+$labels['vacation.keep'] = 'Manter';
+$labels['vacation.discard'] = 'Descartar';
+$labels['vacation.redirect'] = 'Redirixir a';
+$labels['vacation.copy'] = 'Enviar copia a';
+$labels['arialabelfilteractions'] = 'Accións de filtrado';
+$labels['arialabelfilterform'] = 'Propiedades dos filtros';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
 $messages['filterunknownerror'] = 'Erro descoñecido do servidor';
 $messages['filterconnerror'] = 'Imposíbel conectar co servidor.';
 $messages['filterdeleteerror'] = 'Non se pode eliminar filtro. Produciuse un erro de servidor.';
diff --git a/lib/plugins/managesieve/localization/he_IL.inc b/lib/plugins/managesieve/localization/he_IL.inc
index f347d94..4e7b597 100644
--- a/lib/plugins/managesieve/localization/he_IL.inc
+++ b/lib/plugins/managesieve/localization/he_IL.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'הנמען';
 $labels['vacationaddr'] = 'כתובות דוא"ל נוספות:';
 $labels['vacationdays'] = 'באיזו תדירות ( בימים ) לשלוח הודעות:';
 $labels['vacationinterval'] = 'באיזו תדירות לשלוח ההודעה';
-$labels['days'] = 'ימים';
-$labels['seconds'] = 'שניות';
 $labels['vacationreason'] = 'גוף ההודעה (סיבת החופשה):';
 $labels['vacationsubject'] = 'נושא ההודעה:';
+$labels['days'] = 'ימים';
+$labels['seconds'] = 'שניות';
 $labels['rulestop'] = 'עצירה של בחינת הכללים';
 $labels['enable'] = 'אפשור/ניטרול';
 $labels['filterset'] = 'קבוצת מסננים';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'התו הראשון אות גדולה';
 $labels['varquotewildcard'] = 'תו מיוחד יש לשים בין מרכאות';
 $labels['varlength'] = 'אורך';
 $labels['notify'] = 'משלוח התראה';
-$labels['notifyaddress'] = 'אל כתובת דו"אל:';
-$labels['notifybody'] = 'גוף ההתראה:';
-$labels['notifysubject'] = 'נושא ההתראה:';
-$labels['notifyfrom'] = 'שולח ההתראה:';
+$labels['notifytarget'] = 'יעד התראה:';
+$labels['notifymessage'] = 'הודעת התראה (רשות):';
+$labels['notifyoptions'] = 'אפשרויות התראה (רשות):';
+$labels['notifyfrom'] = 'שולח התראה (רשות):';
 $labels['notifyimportance'] = 'חשיובת:';
 $labels['notifyimportancelow'] = 'נמוכה';
 $labels['notifyimportancenormal'] = 'רגילה';
 $labels['notifyimportancehigh'] = 'גבוהה';
+$labels['notifymethodmailto'] = 'דוא״ל';
+$labels['notifymethodtel'] = 'טלפון';
+$labels['notifymethodsms'] = 'מסרון';
 $labels['filtercreate'] = 'יצירת מסנן';
 $labels['usedata'] = 'שימוש במידע שלהלן ליצירת המסנן:';
 $labels['nextstep'] = 'הצעד הבא';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'case insensitive (ascii-casemap)';
 $labels['asciinumeric'] = 'numeric (ascii-numeric)';
 $labels['index'] = 'אינדקס:';
 $labels['indexlast'] = 'בחזרה';
+$labels['vacation'] = 'חופשה';
+$labels['vacation.reply'] = 'הודעת תשובה';
+$labels['vacation.advanced'] = 'הגדרות מתקדמות';
+$labels['vacation.subject'] = 'נושא';
+$labels['vacation.body'] = 'גוף ההודעה';
+$labels['vacation.start'] = 'תאריך התחלה';
+$labels['vacation.end'] = 'תאריך סיום';
+$labels['vacation.status'] = 'מצב';
+$labels['vacation.on'] = 'מופעל';
+$labels['vacation.off'] = 'כבוי';
+$labels['vacation.addresses'] = 'כתובות נוספות שלי';
+$labels['vacation.interval'] = 'מרווח בין תשובות';
+$labels['vacation.after'] = 'העתקת סרגל החופשה אחרי';
+$labels['vacation.saving'] = 'שמירת מידע...';
+$labels['vacation.action'] = 'פעולה על הודעה נכנסת';
+$labels['vacation.keep'] = 'להשאיר';
+$labels['vacation.discard'] = 'להפטר';
+$labels['vacation.redirect'] = 'הפניה אל';
+$labels['vacation.copy'] = 'שליחת העתק אל';
+$labels['arialabelfiltersetactions'] = 'פעולות על קבוצה של חוקי סינון';
+$labels['arialabelfilteractions'] = 'פעולות מסנן';
+$labels['arialabelfilterform'] = 'מאפייני מסנן';
+$labels['ariasummaryfilterslist'] = 'רשימה של מסננים';
+$labels['ariasummaryfiltersetslist'] = 'רשימת קבוצות של חוקי סינון';
+$labels['filterstitle'] = 'ערוך מסנני דואר נכנס';
+$labels['vacationtitle'] = 'ערוך כלל מחוץ-אל-משרדי';
 $messages['filterunknownerror'] = 'שגיאת שרת בלתי מוכרת.';
 $messages['filterconnerror'] = 'לא ניתן להתחבר לשרת.';
 $messages['filterdeleteerror'] = 'לא ניתן למחוק סינון. שגיאת שרת.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'השם הזה שמור.';
 $messages['setexist'] = 'הערכה כבר קיימת.';
 $messages['nodata'] = 'חובה לבחור במיקום אחד לפחות!';
 $messages['invaliddateformat'] = 'תאריך לא חוקי אן פורמט לא תקין';
+$messages['saveerror'] = 'לא ניתן לשמור המידע בשל שגיאה של השרת';
+$messages['vacationsaved'] = 'הודעת החופשה נשמרה בהצלחה';
+$messages['emptyvacationbody'] = 'גוף של הודעת חופשה נדרש!';
 ?>
diff --git a/lib/plugins/managesieve/localization/hr_HR.inc b/lib/plugins/managesieve/localization/hr_HR.inc
index b3192ab..efcd4da 100644
--- a/lib/plugins/managesieve/localization/hr_HR.inc
+++ b/lib/plugins/managesieve/localization/hr_HR.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Primatelj';
 $labels['vacationaddr'] = 'Dodatna e-mail adresa(e):';
 $labels['vacationdays'] = 'Koliko često slati poruku (u danima):';
 $labels['vacationinterval'] = 'Koliko često slati poruku:';
-$labels['days'] = 'dana';
-$labels['seconds'] = 'sekundi';
 $labels['vacationreason'] = 'Tijelo poruke (razlog odmora):';
 $labels['vacationsubject'] = 'Naslov poruke:';
+$labels['days'] = 'dana';
+$labels['seconds'] = 'sekundi';
 $labels['rulestop'] = 'Prekini izvođenje filtera';
 $labels['enable'] = 'Omogući/Onemogući';
 $labels['filterset'] = 'Grupa filtera';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'prvo slovo veliko';
 $labels['varquotewildcard'] = 'Citiraj specijalne znakove';
 $labels['varlength'] = 'duljina';
 $labels['notify'] = 'Pošalji obavijest';
-$labels['notifyaddress'] = 'Na e-mail adresu:';
-$labels['notifybody'] = 'Tekst obavijesti:';
-$labels['notifysubject'] = 'Naslov obavijesti:';
-$labels['notifyfrom'] = 'Pošiljatelj obavijesti:';
 $labels['notifyimportance'] = 'Važnost:';
 $labels['notifyimportancelow'] = 'niska';
 $labels['notifyimportancenormal'] = 'normalna';
@@ -157,6 +153,11 @@ $labels['asciicasemap'] = 'neosjetljivo na veličinu slova (ascii-casemap)';
 $labels['asciinumeric'] = 'numerički (ascii-numeric)';
 $labels['index'] = 'indeks:';
 $labels['indexlast'] = 'unatrag';
+$labels['vacation.advanced'] = 'Napredne postavke';
+$labels['vacation.subject'] = 'Naslov';
+$labels['vacation.body'] = 'Tijelo poruke';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.saving'] = 'Spremanje podataka...';
 $messages['filterunknownerror'] = 'Nepoznata greška na poslužitelju';
 $messages['filterconnerror'] = 'Nemoguće spajanje na poslužitelj (managesieve)';
 $messages['filterdeleteerror'] = 'Nemoguće brisanje filtera. Greška na poslužitelju.';
@@ -189,4 +190,5 @@ $messages['namereserved'] = 'Rezervirano ime.';
 $messages['setexist'] = 'Skup već postoji.';
 $messages['nodata'] = 'Barem jedan pozicija mora biti odabrana!';
 $messages['invaliddateformat'] = 'Neispravan datum ili dio datuma';
+$messages['saveerror'] = 'Nemoguće spremiti podatke. Greška na poslužitelju.';
 ?>
diff --git a/lib/plugins/managesieve/localization/hu_HU.inc b/lib/plugins/managesieve/localization/hu_HU.inc
index afab3f3..eae7650 100644
--- a/lib/plugins/managesieve/localization/hu_HU.inc
+++ b/lib/plugins/managesieve/localization/hu_HU.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Címzett';
 $labels['vacationaddr'] = 'További e-mail címeim:';
 $labels['vacationdays'] = 'Válaszüzenet küldése ennyi naponként:';
 $labels['vacationinterval'] = 'Milyen gyakran küld üzeneteket:';
-$labels['days'] = 'napok';
-$labels['seconds'] = 'másodpercek';
 $labels['vacationreason'] = 'Levél szövege (automatikus válasz):';
 $labels['vacationsubject'] = 'Üzenet tárgya:';
+$labels['days'] = 'napok';
+$labels['seconds'] = 'másodpercek';
 $labels['rulestop'] = 'Műveletek végrehajtásának befejezése';
 $labels['enable'] = 'Bekapcsol/Kikapcsol';
 $labels['filterset'] = 'Szűrök készlet';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'első karakter nagybetű';
 $labels['varquotewildcard'] = 'speciális karakterek idézése';
 $labels['varlength'] = 'hossz';
 $labels['notify'] = 'Értesítés küldése';
-$labels['notifyaddress'] = 'Címzett e-mail címe:';
-$labels['notifybody'] = 'Értesítés levéltörzse:';
-$labels['notifysubject'] = 'Értesítés tárgya:';
-$labels['notifyfrom'] = 'Értesítés feladója:';
+$labels['notifytarget'] = 'Értesítés célja:';
+$labels['notifymessage'] = 'Értesítési üzenet (opcionális):';
+$labels['notifyoptions'] = 'Értesítés opcióik (opcionális):';
+$labels['notifyfrom'] = 'Értesítés feladója (opcionális):';
 $labels['notifyimportance'] = 'Fontosság:';
 $labels['notifyimportancelow'] = 'alacsony';
 $labels['notifyimportancenormal'] = 'normál';
 $labels['notifyimportancehigh'] = 'magas';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefonszám';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Szűrő létrehozása';
 $labels['usedata'] = 'A következő adatok használata a szűrőben';
 $labels['nextstep'] = 'Következő lépés';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'kis-nagybetüre nem érzékeny (ascii-casemap)';
 $labels['asciinumeric'] = 'számszerü (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'visszafelé';
+$labels['vacation'] = 'Vakáció';
+$labels['vacation.reply'] = 'Válasz az üzenetre';
+$labels['vacation.advanced'] = 'Haladó beállítások';
+$labels['vacation.subject'] = 'Tárgy';
+$labels['vacation.body'] = 'Törzs';
+$labels['vacation.start'] = 'Szünidő kezdete';
+$labels['vacation.end'] = 'Szünidő vége';
+$labels['vacation.status'] = 'Állapot';
+$labels['vacation.on'] = 'Be';
+$labels['vacation.off'] = 'Ki';
+$labels['vacation.addresses'] = 'További címeim';
+$labels['vacation.interval'] = 'Válasz intervallum';
+$labels['vacation.after'] = 'Rakd a szabadság szabályt ez után ';
+$labels['vacation.saving'] = 'Adatok mentése...';
+$labels['vacation.action'] = 'Beérkező üzenet akció';
+$labels['vacation.keep'] = 'Megtartás';
+$labels['vacation.discard'] = 'Érvénytelenít';
+$labels['vacation.redirect'] = 'Átírányítás ide';
+$labels['vacation.copy'] = 'Másolat kűldése ide';
+$labels['arialabelfiltersetactions'] = 'Szűrő készlet müveletek';
+$labels['arialabelfilteractions'] = 'Szűrő müveletek';
+$labels['arialabelfilterform'] = 'Szűrő tulajdonságai';
+$labels['ariasummaryfilterslist'] = 'Szűrők listája';
+$labels['ariasummaryfiltersetslist'] = 'Szűrő készletek listája';
+$labels['filterstitle'] = 'Bejövő üzenetek szűrőinek szerkesztése';
+$labels['vacationtitle'] = 'Irodán kiívül szabász szerkesztése';
 $messages['filterunknownerror'] = 'Ismeretlen szerverhiba';
 $messages['filterconnerror'] = 'Nem tudok a szűrőszerverhez kapcsolódni';
 $messages['filterdeleteerror'] = 'A szűrőt nem lehet törölni. Szerverhiba történt';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nem használható (foglalt) név-';
 $messages['setexist'] = 'A készlet már létezik.';
 $messages['nodata'] = 'Legalább egyet ki kell választani.';
 $messages['invaliddateformat'] = 'hibás dátum formátum';
+$messages['saveerror'] = 'Az adat mentése sikertelen. Szerverhiba történt';
+$messages['vacationsaved'] = 'Vakáció adatai sikeresen elmentve.';
+$messages['emptyvacationbody'] = 'A vakácíó üzenet szövegtörzse kötelező!';
 ?>
diff --git a/lib/plugins/managesieve/localization/id_ID.inc b/lib/plugins/managesieve/localization/id_ID.inc
index 59dadc7..b445ef6 100644
--- a/lib/plugins/managesieve/localization/id_ID.inc
+++ b/lib/plugins/managesieve/localization/id_ID.inc
@@ -165,9 +165,6 @@ $labels['vacation.reply'] = 'Balas pesan';
 $labels['vacation.advanced'] = 'Pengaturan Lanjutan';
 $labels['vacation.subject'] = 'Judul';
 $labels['vacation.body'] = 'Isi';
-$labels['vacation.dates'] = 'Waktu Liburan';
-$labels['vacation.from'] = 'Pengirim:';
-$labels['vacation.to'] = 'Kepada:';
 $labels['vacation.status'] = 'Status';
 $labels['vacation.on'] = 'Nyala';
 $labels['vacation.off'] = 'Mati';
diff --git a/lib/plugins/managesieve/localization/it_IT.inc b/lib/plugins/managesieve/localization/it_IT.inc
index b7fc970..b97fde8 100644
--- a/lib/plugins/managesieve/localization/it_IT.inc
+++ b/lib/plugins/managesieve/localization/it_IT.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatario';
 $labels['vacationaddr'] = 'Account email aggiuntivo(i):';
 $labels['vacationdays'] = 'Ogni quanti giorni ribadire il messaggio allo stesso mittente';
 $labels['vacationinterval'] = 'Ogni quanto tempo inviare i messaggi:';
-$labels['days'] = 'giorni';
-$labels['seconds'] = 'secondi';
 $labels['vacationreason'] = 'Corpo del messaggio (dettagli relativi all\'assenza):';
 $labels['vacationsubject'] = 'Oggetto del messaggio';
+$labels['days'] = 'giorni';
+$labels['seconds'] = 'secondi';
 $labels['rulestop'] = 'Non valutare le regole successive';
 $labels['enable'] = 'Abilita/disabilita';
 $labels['filterset'] = 'Gruppi di filtri';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'primo carattere maiuscolo';
 $labels['varquotewildcard'] = 'caratteri speciali di quoting';
 $labels['varlength'] = 'lunghezza';
 $labels['notify'] = 'Invia notifica';
-$labels['notifyaddress'] = 'All\'indirizzo email:';
-$labels['notifybody'] = 'Corpo della notifica:';
-$labels['notifysubject'] = 'Oggetto della notifica:';
-$labels['notifyfrom'] = 'Mittente della notifica:';
+$labels['notifytarget'] = 'Destinatario della notifica';
+$labels['notifymessage'] = 'Messaggio di notifica (opzionale):';
+$labels['notifyoptions'] = 'Opzioni di notifica (opzionale):';
+$labels['notifyfrom'] = 'Mittente della notifica (opzionale):';
 $labels['notifyimportance'] = 'Importanza:';
 $labels['notifyimportancelow'] = 'bassa';
 $labels['notifyimportancenormal'] = 'normale';
 $labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefono';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Crea filtro';
 $labels['usedata'] = 'utilizza i seguenti dati nel filtro';
 $labels['nextstep'] = 'passo successivo';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'non differenziare maiuscole/minuscole (ascii-casemap)
 $labels['asciinumeric'] = 'numerico';
 $labels['index'] = 'indice:';
 $labels['indexlast'] = 'indietro';
+$labels['vacation'] = 'Vacanza';
+$labels['vacation.reply'] = 'Messaggio di risposta';
+$labels['vacation.advanced'] = 'Impostazioni avanzate';
+$labels['vacation.subject'] = 'Oggetto';
+$labels['vacation.body'] = 'Testo';
+$labels['vacation.start'] = 'Inizio vacanza';
+$labels['vacation.end'] = 'Fine vacanza';
+$labels['vacation.status'] = 'Stato';
+$labels['vacation.on'] = 'Attivato';
+$labels['vacation.off'] = 'Disattivato';
+$labels['vacation.addresses'] = 'I miei indirizzi aggiuntivi';
+$labels['vacation.interval'] = 'Intervallo di risposta';
+$labels['vacation.after'] = 'Imposta regola di vacanza dopo';
+$labels['vacation.saving'] = 'Salvataggio...';
+$labels['vacation.action'] = 'Azione messaggio in arrivo';
+$labels['vacation.keep'] = 'Mantieni';
+$labels['vacation.discard'] = 'Elimina';
+$labels['vacation.redirect'] = 'Ridireziona a';
+$labels['vacation.copy'] = 'Invia copia a';
+$labels['arialabelfiltersetactions'] = 'Azione settaggio dei filtri ';
+$labels['arialabelfilteractions'] = 'Azione Filtri';
+$labels['arialabelfilterform'] = 'Proprietà filtri';
+$labels['ariasummaryfilterslist'] = 'Lista dei filtri';
+$labels['ariasummaryfiltersetslist'] = 'Lista settaggio dei filtri';
+$labels['filterstitle'] = 'Modifica filtri dei messaggio in arrivo';
+$labels['vacationtitle'] = 'Modifica le regole del Risponditore automatico';
 $messages['filterunknownerror'] = 'Errore sconosciuto del server';
 $messages['filterconnerror'] = 'Collegamento al server managesieve fallito';
 $messages['filterdeleteerror'] = 'Eliminazione del filtro fallita. Si è verificato un errore nel server.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'nome riservato';
 $messages['setexist'] = 'Il gruppo esiste già';
 $messages['nodata'] = 'selezionare almeno una posizione';
 $messages['invaliddateformat'] = 'Formato della data non valido';
+$messages['saveerror'] = 'Impossibile salvare i dati. Errore del server.';
+$messages['vacationsaved'] = 'Dati di vacanza salvati correttamente.';
+$messages['emptyvacationbody'] = 'Il testo del messaggio non puo\' essere vuoto!';
 ?>
diff --git a/lib/plugins/managesieve/localization/ja_JP.inc b/lib/plugins/managesieve/localization/ja_JP.inc
index 1fff7e3..db04084 100644
--- a/lib/plugins/managesieve/localization/ja_JP.inc
+++ b/lib/plugins/managesieve/localization/ja_JP.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = '宛先';
 $labels['vacationaddr'] = 'My additional e-mail address(es):';
 $labels['vacationdays'] = 'メッセージを(1日に)送信する頻度:';
 $labels['vacationinterval'] = 'メッセージを送信する頻度:';
-$labels['days'] = 'æ—¥';
-$labels['seconds'] = '秒';
 $labels['vacationreason'] = 'メッセージ本体(休暇の理由):';
 $labels['vacationsubject'] = 'メッセージの件名:';
+$labels['days'] = 'æ—¥';
+$labels['seconds'] = '秒';
 $labels['rulestop'] = 'ルールの評価を停止';
 $labels['enable'] = '有効/無効';
 $labels['filterset'] = 'フィルターセット';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = '最初の文字を大文字';
 $labels['varquotewildcard'] = '特殊文字を引用処理';
 $labels['varlength'] = '長さ';
 $labels['notify'] = '通知を送信';
-$labels['notifyaddress'] = '送信先の電子メールアドレス:';
-$labels['notifybody'] = '通知の本文:';
-$labels['notifysubject'] = '通知の件名:';
-$labels['notifyfrom'] = '通知の送信者:';
+$labels['notifytarget'] = '通知の対象:';
+$labels['notifymessage'] = '通知のメッセージ(任意):';
+$labels['notifyoptions'] = '通知のオプション(任意):';
+$labels['notifyfrom'] = '通知の送信者(任意):';
 $labels['notifyimportance'] = '重要度:';
 $labels['notifyimportancelow'] = '低';
 $labels['notifyimportancenormal'] = '通常';
 $labels['notifyimportancehigh'] = '高';
+$labels['notifymethodmailto'] = '電子メール';
+$labels['notifymethodtel'] = '電話';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'フィルターを作成';
 $labels['usedata'] = 'フィルターで次のデータを使用';
 $labels['nextstep'] = '次のステップ';
@@ -157,6 +160,23 @@ $labels['asciicasemap'] = '大文字小文字を区別しない(ascii-casemap)';
 $labels['asciinumeric'] = '数値(ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'backwards';
+$labels['vacation'] = '休暇';
+$labels['vacation.reply'] = '返信のメッセージ';
+$labels['vacation.advanced'] = '詳細な設定';
+$labels['vacation.subject'] = '件名';
+$labels['vacation.body'] = '本文';
+$labels['vacation.status'] = '状態';
+$labels['vacation.on'] = 'オン';
+$labels['vacation.off'] = 'オフ';
+$labels['vacation.addresses'] = '追加のアドレス';
+$labels['vacation.interval'] = '返信の間隔';
+$labels['vacation.after'] = '後に休暇のルールを記入';
+$labels['vacation.saving'] = 'データを保存中...';
+$labels['arialabelfiltersetactions'] = 'フィルターセットの動作';
+$labels['arialabelfilteractions'] = 'フィルターの動作';
+$labels['arialabelfilterform'] = 'フィルターの特性';
+$labels['ariasummaryfilterslist'] = 'フィルターの一覧';
+$labels['ariasummaryfiltersetslist'] = 'フィルターセットの一覧';
 $messages['filterunknownerror'] = '不明なサーバーのエラーです。';
 $messages['filterconnerror'] = 'サーバに接続できません。';
 $messages['filterdeleteerror'] = 'フィルターを削除できません。サーバーでエラーが発生しました。';
@@ -189,4 +209,6 @@ $messages['namereserved'] = '予約されている名前です。';
 $messages['setexist'] = 'フィルターセットが既に存在します。';
 $messages['nodata'] = '少なくとも1つの場所を選択しなければなりません!';
 $messages['invaliddateformat'] = '無効な日付または日付部分の書式';
+$messages['saveerror'] = 'フィルターの保存できません。サーバーでエラーが発生しました。';
+$messages['vacationsaved'] = '休暇のデータを保存しました。';
 ?>
diff --git a/lib/plugins/managesieve/localization/km_KH.inc b/lib/plugins/managesieve/localization/km_KH.inc
index a6094be..9d3de70 100644
--- a/lib/plugins/managesieve/localization/km_KH.inc
+++ b/lib/plugins/managesieve/localization/km_KH.inc
@@ -51,16 +51,17 @@ $labels['del'] = 'លុប';
 $labels['sender'] = 'អ្នក​ផ្ញើ';
 $labels['recipient'] = 'អ្នក​ទទួល';
 $labels['vacationdays'] = 'តើ​ផ្ញើ​សារ​ញឹកញាប់​ប៉ុណ្ណា (ក្នុង​មួយ​ថ្ងៃ)៖';
-$labels['days'] = 'ថ្ងៃ';
-$labels['seconds'] = 'វិនាទី';
 $labels['vacationreason'] = 'តួ​សារ (ហេតុផល​វិស្សមកាល)៖';
 $labels['vacationsubject'] = 'ប្រធានបទ​សារ៖';
+$labels['days'] = 'ថ្ងៃ';
+$labels['seconds'] = 'វិនាទី';
 $labels['rulestop'] = 'ឈប់​គិត​ទៅ​លើ​លក្ខខណ្ឌ';
 $labels['enable'] = 'បើក/បិទ';
 $labels['filterdef'] = 'អត្ថន័យ​តម្រង';
 $labels['active'] = 'សកម្ម';
 $labels['none'] = 'គ្មាន';
 $labels['fromfile'] = 'ពី​ឯកសារ';
+$labels['filterdisabled'] = 'បាន​បិទ​តម្រង';
 $labels['valuenotequals'] = 'តម្លៃ​មិន​ស្មើ​នឹង';
 $labels['flagread'] = 'បាន​អាន';
 $labels['flagdeleted'] = 'បាន​លុប';
@@ -74,10 +75,6 @@ $labels['varlower'] = 'អក្សរ​តូច';
 $labels['varupper'] = 'អក្សរ​ធំ';
 $labels['varlength'] = 'ប្រវែង';
 $labels['notify'] = 'ផ្ញើ​ការ​ជូន​ដំណឹង';
-$labels['notifyaddress'] = 'ទៅ​អាសយដ្ឋាន​អ៊ីមែល៖';
-$labels['notifybody'] = 'តួ​ការ​ជូន​ដំណឹង៖';
-$labels['notifysubject'] = 'ប្រធានបទ​ការ​ជូន​ដំណឹង៖';
-$labels['notifyfrom'] = 'អ្នក​ផ្ញើ​ការ​ជូន​ដំណឹង៖';
 $labels['notifyimportance'] = 'សំខាន់៖';
 $labels['notifyimportancelow'] = 'ទាប';
 $labels['notifyimportancenormal'] = 'ធម្មតា';
diff --git a/lib/plugins/managesieve/localization/ko_KR.inc b/lib/plugins/managesieve/localization/ko_KR.inc
index b552fa9..e9497e7 100644
--- a/lib/plugins/managesieve/localization/ko_KR.inc
+++ b/lib/plugins/managesieve/localization/ko_KR.inc
@@ -18,18 +18,18 @@
 $labels['filters'] = 'í•„í„°';
 $labels['managefilters'] = '수신 메일 필터 관리';
 $labels['filtername'] = '필터명';
-$labels['newfilter'] = '새 필터';
+$labels['newfilter'] = '새로운 필터';
 $labels['filteradd'] = '필터 추가';
 $labels['filterdel'] = '필터 삭제';
 $labels['moveup'] = '위로 이동';
 $labels['movedown'] = '아래로 이동';
-$labels['filterallof'] = '다음의 모든 규칙과 일치함';
+$labels['filterallof'] = '다음 모든 규칙과 일치함';
 $labels['filteranyof'] = '다음 규칙 중 하나라도 일치함';
 $labels['filterany'] = '모든 메시지';
 $labels['filtercontains'] = '다음을 포함함';
 $labels['filternotcontains'] = '다음을 포함하지 않음';
-$labels['filteris'] = '다음과 같음';
-$labels['filterisnot'] = '다음과 같지 않음';
+$labels['filteris'] = '다음과 일치함';
+$labels['filterisnot'] = '다음과 일치하지 않음';
 $labels['filterexists'] = '다음이 존재함';
 $labels['filternotexists'] = '다음이 존재하지 않음';
 $labels['filtermatches'] = '다음 표현식과 일치함';
@@ -40,38 +40,39 @@ $labels['filterunder'] = '다음보다 아래임';
 $labels['filterover'] = '다음보다 위임';
 $labels['addrule'] = '규칙 추가';
 $labels['delrule'] = '규칙 삭제';
-$labels['messagemoveto'] = '메시지를 다음 위치로 이동함';
-$labels['messageredirect'] = '메시지를 다음 주소로 전송함';
-$labels['messagecopyto'] = '메시지를 다음 위치로 복사함';
-$labels['messagesendcopy'] = '메시지의 사본을 다음 위치로 보냄';
+$labels['messagemoveto'] = '메시지를 다음 위치로 이동';
+$labels['messageredirect'] = '메시지를 다음 주소로 재전송';
+$labels['messagecopyto'] = '메시지를 다음 위치로 복사';
+$labels['messagesendcopy'] = '메시지 사본을 다음 대상에게 보내기';
 $labels['messagereply'] = '다음 메시지로 회신';
-$labels['messagedelete'] = '메시지를 삭제';
+$labels['messagedelete'] = '메시지 삭제';
 $labels['messagediscard'] = '다음 메시지와 함께 폐기';
 $labels['messagekeep'] = '메시지를 받은 편지함에 보관';
 $labels['messagesrules'] = '해당 받은 메일:';
 $labels['messagesactions'] = '...다음 동작을 실행:';
 $labels['add'] = '추가';
 $labels['del'] = '삭제';
-$labels['sender'] = '발신인';
-$labels['recipient'] = '수신인';
+$labels['sender'] = '발송자';
+$labels['recipient'] = '수신자';
+$labels['vacationaddr'] = '나의 추가적인 이메일 주소:';
 $labels['vacationdays'] = '메시지 발신 주기 (일):';
 $labels['vacationinterval'] = '메시지 발신 주기:';
-$labels['days'] = '일';
-$labels['seconds'] = 'ì´ˆ';
 $labels['vacationreason'] = '메시지 본문 (휴가 사유):';
 $labels['vacationsubject'] = '메시지 제목:';
+$labels['days'] = '일';
+$labels['seconds'] = 'ì´ˆ';
 $labels['rulestop'] = '규칙 평가를 중단';
 $labels['enable'] = '활성화/비활성화';
 $labels['filterset'] = '필터 세트';
 $labels['filtersets'] = '필터 세트';
 $labels['filtersetadd'] = '필터 세트 추가';
 $labels['filtersetdel'] = '현재 필터 세트를 삭제';
-$labels['filtersetact'] = '현재 필터 세트를 활성화';
-$labels['filtersetdeact'] = '현재 필터 세트를 비활성화';
+$labels['filtersetact'] = '현재 필터 세트 활성화';
+$labels['filtersetdeact'] = '현재 필터 세트 비활성화';
 $labels['filterdef'] = '필터 정의';
 $labels['filtersetname'] = '필터 세트명';
 $labels['newfilterset'] = '새 필터 세트';
-$labels['active'] = '활성';
+$labels['active'] = '활성화됨';
 $labels['none'] = '없음';
 $labels['fromset'] = '세트로부터';
 $labels['fromfile'] = '파일로부터';
@@ -81,20 +82,20 @@ $labels['countisgreaterthanequal'] = '개수가 다음보다 크거나 같음';
 $labels['countislessthan'] = '개수가 다음보다 작음';
 $labels['countislessthanequal'] = '개수가 작거나 같음';
 $labels['countequals'] = '개수가 다음과 같음';
-$labels['countnotequals'] = '갯수가 다음과 같지 않음';
+$labels['countnotequals'] = '개수가 다음과 일치하지 않음';
 $labels['valueisgreaterthan'] = '값이 다음보다 큼';
 $labels['valueisgreaterthanequal'] = '값이 다음보다 크거나 같음';
 $labels['valueislessthan'] = '값이 다음보다 작음';
 $labels['valueislessthanequal'] = '값이 다음보다 작거나 같음';
 $labels['valueequals'] = '값이 다음과 같음';
-$labels['valuenotequals'] = '값이 다음과 같지 않음';
-$labels['setflags'] = '메시지에 깃발을 설정';
+$labels['valuenotequals'] = '값이 다음과 일치하지 않음';
+$labels['setflags'] = '메시지를 깃발로 표시';
 $labels['addflags'] = '메시지에 깃발을 추가';
 $labels['removeflags'] = '메시지에서 깃발을 제거';
 $labels['flagread'] = '읽음';
 $labels['flagdeleted'] = '삭제됨';
 $labels['flaganswered'] = '응답함';
-$labels['flagflagged'] = '깃발을 추가함';
+$labels['flagflagged'] = '깃발로 표시함';
 $labels['flagdraft'] = '임시 보관함';
 $labels['setvariable'] = '변수 설정';
 $labels['setvarname'] = '변수명:';
@@ -107,14 +108,17 @@ $labels['varupperfirst'] = '첫 문자를 대문자로';
 $labels['varquotewildcard'] = '특수 기호를 인용';
 $labels['varlength'] = '길이';
 $labels['notify'] = '알림 메시지 보내기';
-$labels['notifyaddress'] = '대상 이메일 주소:';
-$labels['notifybody'] = '알림 메시지 본문:';
-$labels['notifysubject'] = '알림 메시지 제목:';
-$labels['notifyfrom'] = '알림 메시지 발신인:';
+$labels['notifytarget'] = '알림 대상:';
+$labels['notifymessage'] = '알림 메시지(옵션):';
+$labels['notifyoptions'] = '알림 옵션(옵션):';
+$labels['notifyfrom'] = '알림 발송자(옵션):';
 $labels['notifyimportance'] = '중요도:';
 $labels['notifyimportancelow'] = '낮음';
 $labels['notifyimportancenormal'] = '보통';
 $labels['notifyimportancehigh'] = '높음';
+$labels['notifymethodmailto'] = '이메일';
+$labels['notifymethodtel'] = 'ì „í™”';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = '필터 생성';
 $labels['usedata'] = '필터에서 다음 데이터를 사용:';
 $labels['nextstep'] = '다음 단계';
@@ -141,7 +145,7 @@ $labels['address'] = '주소';
 $labels['envelope'] = '봉투';
 $labels['modifier'] = '수식자:';
 $labels['text'] = '텍스트';
-$labels['undecoded'] = '암호화되지 않음 (원상태)';
+$labels['undecoded'] = '암호화되지 않음(원상태)';
 $labels['contenttype'] = '내용 유형';
 $labels['modtype'] = '유형:';
 $labels['allparts'] = '모두';
@@ -156,27 +160,65 @@ $labels['asciicasemap'] = '대/소문자 구분 (ascii-casemap)';
 $labels['asciinumeric'] = '숫자 (ascii-numeric)';
 $labels['index'] = '색인:';
 $labels['indexlast'] = 'ì—­ë°©í–¥';
+$labels['vacation'] = '휴가';
+$labels['vacation.reply'] = '메시지 회신';
+$labels['vacation.advanced'] = '고급 설정';
+$labels['vacation.subject'] = '제목';
+$labels['vacation.body'] = '본문';
+$labels['vacation.start'] = '휴가 시작';
+$labels['vacation.end'] = '휴가 끝';
+$labels['vacation.status'] = '상태';
+$labels['vacation.on'] = '켬';
+$labels['vacation.off'] = '끔';
+$labels['vacation.addresses'] = '내 추가적인 주소';
+$labels['vacation.interval'] = '회신 주기';
+$labels['vacation.after'] = '다음 이후에 휴가 규칙을 위치함';
+$labels['vacation.saving'] = '데이터를 저장하는 중...';
+$labels['vacation.action'] = '수신 메시지 동작';
+$labels['vacation.keep'] = 'ë³´ê´€';
+$labels['vacation.discard'] = '폐기';
+$labels['vacation.redirect'] = '재전송';
+$labels['vacation.copy'] = '사본을 다음 대상에게 전송';
+$labels['arialabelfiltersetactions'] = '필터 세트 동작';
+$labels['arialabelfilteractions'] = '필터 동작';
+$labels['arialabelfilterform'] = '필터 속성';
+$labels['ariasummaryfilterslist'] = '필터 목록';
+$labels['ariasummaryfiltersetslist'] = '필터 세트 목록';
+$labels['filterstitle'] = '수신 메일 필터 편집';
+$labels['vacationtitle'] = '자리비움 규칙 편집';
 $messages['filterunknownerror'] = '알수 없는 서버 오류.';
-$messages['filterconnerror'] = '서버에 연결할 수 없음.';
+$messages['filterconnerror'] = '서버에 연결할 수 없습니다.';
+$messages['filterdeleteerror'] = '필터를 삭제할 수 없습니다. 서버 오류가 발생했습니다.';
 $messages['filterdeleted'] = '필터가 성공적으로 삭제됨.';
 $messages['filtersaved'] = '필터가 성공적으로 저장됨.';
+$messages['filtersaveerror'] = '필터를 저장할 수 없습니다. 서버 오류가 발생했습니다.';
 $messages['filterdeleteconfirm'] = '정말로 선택한 필터를 삭제하시겠습니까?';
 $messages['ruledeleteconfirm'] = '정말로 선택한 규칙을 삭제하시겠습니까?';
 $messages['actiondeleteconfirm'] = '정말로 선택한 동작을 삭제하시겠습니까?';
-$messages['forbiddenchars'] = '필드에 금지된 문자가 존재함.';
-$messages['cannotbeempty'] = '필드는 비워둘 수 없음.';
-$messages['ruleexist'] = '지정한 이름의 필터가 이미 존재함.';
+$messages['forbiddenchars'] = '필드에 금지된 문자가 존재합니다.';
+$messages['cannotbeempty'] = '필드는 비어둘 수 없습니다.';
+$messages['ruleexist'] = '지정한 이름의 필터가 이미 존재합니다.';
+$messages['setactivateerror'] = '선택한 필터 세트를 활성화할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['setdeactivateerror'] = '선택한 필터 세트를 비활성화할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['setdeleteerror'] = '선택한 필터 세트를 삭제할 수 없습니다. 서버 오류가 발생했습니다.';
 $messages['setactivated'] = '필터 세트가 성공적으로 활성화됨.';
 $messages['setdeactivated'] = '필터 세트가 성공적으로 비활성화됨.';
 $messages['setdeleted'] = '필터 세트가 성공적으로 삭제됨.';
 $messages['setdeleteconfirm'] = '정말로 선택한 필터 세트를 삭제하시겠습니까?';
+$messages['setcreateerror'] = '선택한 필터 세트를 생성할 수 없습니다. 서버 오류가 발생했습니다.';
 $messages['setcreated'] = '필터 세트가 성공적으로 생성됨.';
+$messages['activateerror'] = '선택한 필터를 활성화할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['deactivateerror'] = '선택한 필터를 비활성화할 수 없습니다. 서버 오류가 발생했습니다.';
 $messages['deactivated'] = '필터가 성공적으로 비활성화됨.';
 $messages['activated'] = '필터가 성공적으로 활성화됨.';
-$messages['moved'] = '필터가 성공적으로 이동함.';
-$messages['nametoolong'] = '이름이 너무 김.';
-$messages['namereserved'] = '예약된 이름.';
-$messages['setexist'] = '세트가 이미 존재함.';
+$messages['moved'] = '필터가 성공적으로 이동되었습니다.';
+$messages['moveerror'] = '선택한 필터를 이동할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['nametoolong'] = '이름이 너무 깁니다.';
+$messages['namereserved'] = '예약된 이름입니다.';
+$messages['setexist'] = '세트가 이미 존재합니다.';
 $messages['nodata'] = '최소 하나의 위치가 선택되어야 합니다!';
 $messages['invaliddateformat'] = '유효하지 않은 날짜 또는 날짜 일부 형식';
+$messages['saveerror'] = '데이터를 저장할 수 없습니다.. 서버 오류가 발생했습니다.';
+$messages['vacationsaved'] = '휴가 데이터가 성공적으로 저장됨.';
+$messages['emptyvacationbody'] = '휴가 메시지의 본문이 필요합니다!';
 ?>
diff --git a/lib/plugins/managesieve/localization/lt_LT.inc b/lib/plugins/managesieve/localization/lt_LT.inc
index 5dc81af..575e43c 100644
--- a/lib/plugins/managesieve/localization/lt_LT.inc
+++ b/lib/plugins/managesieve/localization/lt_LT.inc
@@ -46,6 +46,8 @@ $labels['messagecopyto'] = 'Kopijuoti laišką į';
 $labels['messagesendcopy'] = 'Nusiųsti laiško kopiją';
 $labels['messagereply'] = 'Atsakyti laišku';
 $labels['messagedelete'] = 'Pašalinti laišką';
+$labels['messagediscard'] = 'Panaikinti su laišku';
+$labels['messagekeep'] = 'Palikti laišką gautųjų aplanke';
 $labels['messagesrules'] = 'Gaunamiems laiškams:';
 $labels['messagesactions'] = '…vykdyti šiuos veiksmus:';
 $labels['add'] = 'PridÄ—ti';
@@ -55,10 +57,10 @@ $labels['recipient'] = 'GavÄ—jas';
 $labels['vacationaddr'] = 'Papildomas gavėjų adresų sąrašas:';
 $labels['vacationdays'] = 'Kaip dažnai išsiųsti laiškus (dienomis):';
 $labels['vacationinterval'] = 'Kaip dažnai siųsti laiškus:';
-$labels['days'] = 'd.';
-$labels['seconds'] = 'sek.';
 $labels['vacationreason'] = 'Laiško tekstas';
 $labels['vacationsubject'] = 'Laiško tema:';
+$labels['days'] = 'd.';
+$labels['seconds'] = 'sek.';
 $labels['rulestop'] = 'Nutraukti taisyklių vykdymą';
 $labels['enable'] = 'Įjungti / išjungti';
 $labels['filterset'] = 'Filtrų rinkinys';
@@ -106,14 +108,17 @@ $labels['varupperfirst'] = 'pirmoji raidė didžioji';
 $labels['varquotewildcard'] = 'cituoti specialius simbolius';
 $labels['varlength'] = 'ilgis';
 $labels['notify'] = 'Siųsti priminimą';
-$labels['notifyaddress'] = 'Kam, el. pašto adresas:';
-$labels['notifybody'] = 'Priminimo tekstas';
-$labels['notifysubject'] = 'Priminimo pavadinimas';
-$labels['notifyfrom'] = 'Priminimo siuntÄ—jas';
+$labels['notifytarget'] = 'Priminimo gavÄ—jas:';
+$labels['notifymessage'] = 'Priminimo laiškas (nebūtina):';
+$labels['notifyoptions'] = 'Priminimo nustatymai (nebūtina):';
+$labels['notifyfrom'] = 'Priminimo siuntėjas (nebūtina):';
 $labels['notifyimportance'] = 'Svarbumas';
 $labels['notifyimportancelow'] = 'žemas';
 $labels['notifyimportancenormal'] = 'normalus';
 $labels['notifyimportancehigh'] = 'aukštas';
+$labels['notifymethodmailto'] = 'El. paštas';
+$labels['notifymethodtel'] = 'Telefono numeris';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Kurti filtrÄ…';
 $labels['usedata'] = 'Filtrui naudoti Å¡iuos duomenis:';
 $labels['nextstep'] = 'Kitas žingsnis';
@@ -155,27 +160,62 @@ $labels['asciicasemap'] = 'nepaisantis raidžių registro („ascii-casemap“)'
 $labels['asciinumeric'] = 'skaitinis („ascii-numeric“)';
 $labels['index'] = 'turinys:';
 $labels['indexlast'] = 'atbulai';
+$labels['vacation'] = 'Atostogos';
+$labels['vacation.reply'] = 'Atsakyti laišku';
+$labels['vacation.advanced'] = 'Papildomos nuostatos';
+$labels['vacation.subject'] = 'Tema';
+$labels['vacation.body'] = 'Laiško tekstas';
+$labels['vacation.status'] = 'BÅ«sena';
+$labels['vacation.on'] = 'Įjungta';
+$labels['vacation.off'] = 'IÅ¡jungta';
+$labels['vacation.addresses'] = 'Mano papildomi adresai';
+$labels['vacation.interval'] = 'Atsakymo intervalas';
+$labels['vacation.after'] = 'Atostogų taisyklę pastatyti po';
+$labels['vacation.saving'] = 'IÅ¡saugomi duomenys...';
+$labels['vacation.action'] = 'Veiksmas su gaunamais laiškais';
+$labels['vacation.keep'] = 'Palikti';
+$labels['vacation.discard'] = 'Panaikinti';
+$labels['vacation.redirect'] = 'Peradresuoti kam';
+$labels['vacation.copy'] = 'Siųsti kopiją kam';
+$labels['arialabelfiltersetactions'] = 'Filtrų rinkinio veiksmai';
+$labels['arialabelfilteractions'] = 'Filtro veiksmai';
+$labels['arialabelfilterform'] = 'Filtro nustatymai';
+$labels['ariasummaryfilterslist'] = 'Filtrų sąrašas';
+$labels['ariasummaryfiltersetslist'] = 'Filtrų rinkinių sąrašas';
+$labels['filterstitle'] = 'Tvarkyti gaunamų laiškų filtrus';
+$labels['vacationtitle'] = 'Redaguoti ne-biure taisyklÄ™';
 $messages['filterunknownerror'] = 'Nežinoma serverio klaida.';
 $messages['filterconnerror'] = 'Neįmanoma užmegzti ryšio su serveriu.';
+$messages['filterdeleteerror'] = 'Nepavyksta ištrinti filtro. Įvyko serverio klaida.';
 $messages['filterdeleted'] = 'Filtras panaikintas sÄ—kmingai.';
 $messages['filtersaved'] = 'Filtras sėkmingai išsaugotas';
+$messages['filtersaveerror'] = 'Nepavyksta išsaugoti filtro. Įvyko serverio klaida.';
 $messages['filterdeleteconfirm'] = 'Ar jūs esate įsitikinęs, jog norite panaikinti pasirinktus filtrus(-ą)?';
 $messages['ruledeleteconfirm'] = 'Ar jūs įsitikinęs, jog norite panaikinti pasirinktą taisyklę?';
 $messages['actiondeleteconfirm'] = 'Ar jūs įsitikinęs, jog norite panaikinti pasirinktą veiksmą?';
 $messages['forbiddenchars'] = 'Laukelyje yra draudžiamų simbolių.';
 $messages['cannotbeempty'] = 'Laukelis negali būti tuščias';
 $messages['ruleexist'] = 'Filtras tokiu vardu jau yra.';
+$messages['setactivateerror'] = 'Neįmanoma aktyvuoti pasirinkto filtrų rinkinio. Įvyko serverio klaida.';
+$messages['setdeactivateerror'] = 'Neįmanoma išjungti pasirinkto filtrų rinkinio. Įvyko serverio klaida.';
+$messages['setdeleteerror'] = 'Neįmanoma panaikinti pasirinkto filtrų rinkinio. Įvyko serverio klaida.';
 $messages['setactivated'] = 'Filtrų rinkinys sėkmingai aktyvuotas.';
 $messages['setdeactivated'] = 'Filtrų rinkinys sėkmingai deaktyvuotas.';
 $messages['setdeleted'] = 'Filtrų rinkinys sėkmingai panaikintas.';
 $messages['setdeleteconfirm'] = 'Ar jūs esate tikri, jog norite panaikinti pasirinktą filtrų rinkinį?';
+$messages['setcreateerror'] = 'Neįmanoma sukurti filtrų rinkinio. Įvyko serverio klaida.';
 $messages['setcreated'] = 'Filtrų rinkinys sėkmingai sukurtas.';
+$messages['activateerror'] = 'Neįmanoma įjungti pasirinktų filtrų(-o). Įvyko serverio klaida.';
+$messages['deactivateerror'] = 'Neįmanoma išjungti pasirinktų filtrų(-o). Įvyko serverio klaida.';
 $messages['deactivated'] = 'Filtras(-as) sėkmingai išjungti.';
 $messages['activated'] = 'Filtras(-as) sėkmingai įjungti.';
 $messages['moved'] = 'Filtrai perkelti sÄ—kmingai.';
+$messages['moveerror'] = 'Pasirinkto filtro perkelti neįmanoma. Įvyko serverio klaida.';
 $messages['nametoolong'] = 'Vardas per ilgas.';
 $messages['namereserved'] = 'Rezervuotas vardas.';
 $messages['setexist'] = 'Rinkinys jau yra sukurtas.';
 $messages['nodata'] = 'BÅ«tina pasirinkti bent vienÄ… pozicijÄ…!';
 $messages['invaliddateformat'] = 'Neteisingas datos ar jos dalies formatas';
+$messages['saveerror'] = 'Nepavyksta išsaugoti duomenų. Įvyko serverio klaida.';
+$messages['vacationsaved'] = 'Sėkmingai išsaugoti atostogų duomenys.';
 ?>
diff --git a/lib/plugins/managesieve/localization/lv_LV.inc b/lib/plugins/managesieve/localization/lv_LV.inc
index 111f3b4..33c000e 100644
--- a/lib/plugins/managesieve/localization/lv_LV.inc
+++ b/lib/plugins/managesieve/localization/lv_LV.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Saņēmējs';
 $labels['vacationaddr'] = 'Mana(s) papildus e-pasta adrese(s):';
 $labels['vacationdays'] = 'Cik bieži sūtī ziņojumus (dienās):';
 $labels['vacationinterval'] = 'Cik bieži sūtīt vēstules:';
-$labels['days'] = 'dienas';
-$labels['seconds'] = 'sekundes';
 $labels['vacationreason'] = 'Atvaļinājuma paziņojuma teksts:';
 $labels['vacationsubject'] = 'Vēstules tēma:';
+$labels['days'] = 'dienas';
+$labels['seconds'] = 'sekundes';
 $labels['rulestop'] = 'Apturēt nosacījumu pārbaudi';
 $labels['enable'] = 'Ieslēgt/Izslēgt';
 $labels['filterset'] = 'Filtru kopa';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'pirmais burts kā lielais burts';
 $labels['varquotewildcard'] = '"citēt" speciālās rakstzīmes';
 $labels['varlength'] = 'garums';
 $labels['notify'] = 'Sūtīt paziņojumus';
-$labels['notifyaddress'] = 'Uz e-pasta adresi:';
-$labels['notifybody'] = 'Paziņojuma teksts:';
-$labels['notifysubject'] = 'Paziņojuma tēma:';
-$labels['notifyfrom'] = 'Paziņojuma sūtītājs:';
 $labels['notifyimportance'] = 'Svarīgums:';
 $labels['notifyimportancelow'] = 'zems';
 $labels['notifyimportancenormal'] = 'parasts';
diff --git a/lib/plugins/managesieve/localization/nb_NO.inc b/lib/plugins/managesieve/localization/nb_NO.inc
index e0a3448..c9224ae 100644
--- a/lib/plugins/managesieve/localization/nb_NO.inc
+++ b/lib/plugins/managesieve/localization/nb_NO.inc
@@ -47,18 +47,20 @@ $labels['messagesendcopy'] = 'Send en kopi av meldingen til';
 $labels['messagereply'] = 'Svar med melding';
 $labels['messagedelete'] = 'Slett melding';
 $labels['messagediscard'] = 'Avvis med melding';
+$labels['messagekeep'] = 'Behold melding i innboks';
 $labels['messagesrules'] = 'For innkommende e-post';
 $labels['messagesactions'] = '... gjør følgende:';
 $labels['add'] = 'Legg til';
 $labels['del'] = 'Slett';
 $labels['sender'] = 'Avsender';
 $labels['recipient'] = 'Mottaker';
+$labels['vacationaddr'] = 'Tilleggs epost-adresse(r):';
 $labels['vacationdays'] = 'Periode mellom meldinger (i dager):';
 $labels['vacationinterval'] = 'Periode mellom meldinger:';
-$labels['days'] = 'dager';
-$labels['seconds'] = 'sekunder';
 $labels['vacationreason'] = 'Innhold (begrunnelse for fravær)';
 $labels['vacationsubject'] = 'Meldingsemne:';
+$labels['days'] = 'dager';
+$labels['seconds'] = 'sekunder';
 $labels['rulestop'] = 'Stopp evaluering av regler';
 $labels['enable'] = 'Aktiver/Deaktiver';
 $labels['filterset'] = 'Filtersett';
@@ -106,10 +108,6 @@ $labels['varupperfirst'] = 'første tegn stor bokstav';
 $labels['varquotewildcard'] = 'sitér spesialtegn';
 $labels['varlength'] = 'lengde';
 $labels['notify'] = 'Send melding';
-$labels['notifyaddress'] = 'Til e-postadresse:';
-$labels['notifybody'] = 'Varseltekst:';
-$labels['notifysubject'] = 'Varselemne:';
-$labels['notifyfrom'] = 'Varselavsender:';
 $labels['notifyimportance'] = 'Viktighet:';
 $labels['notifyimportancelow'] = 'lav';
 $labels['notifyimportancenormal'] = 'normal';
@@ -157,22 +155,31 @@ $labels['index'] = 'index:';
 $labels['indexlast'] = 'baklengs';
 $messages['filterunknownerror'] = 'Ukjent problem med tjener.';
 $messages['filterconnerror'] = 'Kunne ikke koble til tjeneren.';
+$messages['filterdeleteerror'] = 'Kunne ikke slette filter. Fikk feilmelding fra server.';
 $messages['filterdeleted'] = 'Filteret er blitt slettet.';
 $messages['filtersaved'] = 'Filteret er blitt lagret.';
+$messages['filtersaveerror'] = 'Kunne ikke lagre filter. Fikk feilmelding fra server.';
 $messages['filterdeleteconfirm'] = 'Vil du virkelig slette det valgte filteret?';
 $messages['ruledeleteconfirm'] = 'Er du sikker på at du vil slette valgte regel?';
 $messages['actiondeleteconfirm'] = 'Er du sikker på at du vil slette valgte hendelse?';
 $messages['forbiddenchars'] = 'Ugyldige tegn i felt.';
 $messages['cannotbeempty'] = 'Feltet kan ikke stå tomt.';
 $messages['ruleexist'] = 'Det finnes allerede et filter med dette navnet.';
+$messages['setactivateerror'] = 'Kunne ikke aktivere valgte filtersett. Fikk feilmelding fra server.';
+$messages['setdeactivateerror'] = 'Kunne ikke deaktivere valgte filtersett. Fikk feilmelding fra server.';
+$messages['setdeleteerror'] = 'Kunne ikke slette valgte filtersett. Fikk feilmelding fra server.';
 $messages['setactivated'] = 'Filtersett aktivert.';
 $messages['setdeactivated'] = 'Filtersett deaktivert.';
 $messages['setdeleted'] = 'Filtersett slettet.';
 $messages['setdeleteconfirm'] = 'Er du sikker på at du vil slette det valgte filtersettet?';
+$messages['setcreateerror'] = 'Kunne ikke opprette filtersett. Fikk feilmelding fra server.';
 $messages['setcreated'] = 'Filtersett opprettet.';
+$messages['activateerror'] = 'Kunne ikke aktivere valgte filter(e). Fikk feilmelding fra server.';
+$messages['deactivateerror'] = 'Kunne ikke deaktivere valgte filter(e). Fikk feilmelding fra server.';
 $messages['deactivated'] = 'Filter skrudd på.';
 $messages['activated'] = 'Filter skrudd av.';
 $messages['moved'] = 'Filter ble flyttet.';
+$messages['moveerror'] = 'Kunne ikke flytte valgte filter. Fikk feilmelding fra server.';
 $messages['nametoolong'] = 'Navnet er for langt.';
 $messages['namereserved'] = 'Navnet er reservert.';
 $messages['setexist'] = 'Settet eksisterer allerede.';
diff --git a/lib/plugins/managesieve/localization/nl_NL.inc b/lib/plugins/managesieve/localization/nl_NL.inc
index 97a4e16..b84b87e 100644
--- a/lib/plugins/managesieve/localization/nl_NL.inc
+++ b/lib/plugins/managesieve/localization/nl_NL.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Ontvanger';
 $labels['vacationaddr'] = 'Mijn extra e-mailadres(sen):';
 $labels['vacationdays'] = 'Hoe vaak moet een bericht verstuurd worden (in dagen):';
 $labels['vacationinterval'] = 'Hoe vaak moet een bericht verstuurd worden:';
-$labels['days'] = 'dagen';
-$labels['seconds'] = 'seconden';
 $labels['vacationreason'] = 'Bericht (vakantiereden):';
 $labels['vacationsubject'] = 'Onderwerp:';
+$labels['days'] = 'dagen';
+$labels['seconds'] = 'seconden';
 $labels['rulestop'] = 'Stop met regels uitvoeren';
 $labels['enable'] = 'In-/uitschakelen';
 $labels['filterset'] = 'Filterset';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'eerste karakter als hoofdletter';
 $labels['varquotewildcard'] = 'speciale karakters quoten';
 $labels['varlength'] = 'lengte';
 $labels['notify'] = 'Stuur melding';
-$labels['notifyaddress'] = 'Naar e-mailadres:';
-$labels['notifybody'] = 'Meldingsbericht:';
-$labels['notifysubject'] = 'Onderwerp van melding:';
-$labels['notifyfrom'] = 'Afzender:';
+$labels['notifytarget'] = 'Meldingsdoel:';
+$labels['notifymessage'] = 'Meldingsbericht (optioneel):';
+$labels['notifyoptions'] = 'Meldingsopties (optioneel):';
+$labels['notifyfrom'] = 'Meldingsafzender (optioneel):';
 $labels['notifyimportance'] = 'Prioriteit:';
 $labels['notifyimportancelow'] = 'laag';
 $labels['notifyimportancenormal'] = 'normaal';
 $labels['notifyimportancehigh'] = 'hoog';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telefoon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Filter aanmaken';
 $labels['usedata'] = 'Gebruik de volgende gegevens in het filter:';
 $labels['nextstep'] = 'Volgende stap';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'hoofdletterongevoelig (ascii-casemap)';
 $labels['asciinumeric'] = 'numeriek (ascii-numeriek)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'terugwaarts';
+$labels['vacation'] = 'Vakantie';
+$labels['vacation.reply'] = 'Antwoordbericht';
+$labels['vacation.advanced'] = 'Geavanceerde instellingen';
+$labels['vacation.subject'] = 'Onderwerp';
+$labels['vacation.body'] = 'Inhoud';
+$labels['vacation.start'] = 'Begin van vakantie';
+$labels['vacation.end'] = 'Einde van vakantie';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'Aan';
+$labels['vacation.off'] = 'Uit';
+$labels['vacation.addresses'] = 'Mijn extra e-mailadressen';
+$labels['vacation.interval'] = 'Antwoordinterval';
+$labels['vacation.after'] = 'Voeg een vakantieregel toe na';
+$labels['vacation.saving'] = 'Gegevens worden opgeslagen...';
+$labels['vacation.action'] = 'Actie voor inkomend bericht';
+$labels['vacation.keep'] = 'Bewaren';
+$labels['vacation.discard'] = 'Weggooien';
+$labels['vacation.redirect'] = 'Doorsturen naar';
+$labels['vacation.copy'] = 'Kopie sturen naar';
+$labels['arialabelfiltersetactions'] = 'Filtersetacties';
+$labels['arialabelfilteractions'] = 'Filteracties';
+$labels['arialabelfilterform'] = 'Filtereigenschappen';
+$labels['ariasummaryfilterslist'] = 'Filterlijst';
+$labels['ariasummaryfiltersetslist'] = 'Lijst met filtersets';
+$labels['filterstitle'] = 'Bewerk filters voor inkomende berichten';
+$labels['vacationtitle'] = 'Bewerk vakantieregel';
 $messages['filterunknownerror'] = 'Onbekende fout';
 $messages['filterconnerror'] = 'Kan geen verbinding maken met de managesieve server';
 $messages['filterdeleteerror'] = 'Kan filter niet verwijderen. Er trad een serverfout op.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Gereserveerde naam.';
 $messages['setexist'] = 'Filterset bestaat al.';
 $messages['nodata'] = 'Tenminste één positie moet geselecteerd worden!';
 $messages['invaliddateformat'] = 'Ongeldige datum of datumformaat';
+$messages['saveerror'] = 'Opslaan van de gegevens is mislukt. Er trad een serverfout op.';
+$messages['vacationsaved'] = 'Vakantiegegevens succesvol opgeslagen.';
+$messages['emptyvacationbody'] = 'Inhoud van vakantiebericht is verplicht!';
 ?>
diff --git a/lib/plugins/managesieve/localization/pl_PL.inc b/lib/plugins/managesieve/localization/pl_PL.inc
index 2759309..06c0a79 100644
--- a/lib/plugins/managesieve/localization/pl_PL.inc
+++ b/lib/plugins/managesieve/localization/pl_PL.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Odbiorca';
 $labels['vacationaddr'] = 'Moje dodatkowe adresy email:';
 $labels['vacationdays'] = 'Częstotliwość wysyłania wiadomości (w dniach):';
 $labels['vacationinterval'] = 'Jak często wysyłać wiadomości:';
-$labels['days'] = 'dni';
-$labels['seconds'] = 'sekundy';
 $labels['vacationreason'] = 'Treść (przyczyna nieobecności):';
 $labels['vacationsubject'] = 'Temat wiadomości:';
+$labels['days'] = 'dni';
+$labels['seconds'] = 'sekundy';
 $labels['rulestop'] = 'Przerwij przetwarzanie reguł';
 $labels['enable'] = 'Włącz/Wyłącz';
 $labels['filterset'] = 'Zbiór filtrów';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'pierwsza wielka litera';
 $labels['varquotewildcard'] = 'zamień znaki specjalne';
 $labels['varlength'] = 'długość';
 $labels['notify'] = 'Wyślij powiadomienie';
-$labels['notifyaddress'] = 'Na adres e-mail:';
-$labels['notifybody'] = 'Treść powiadomienia:';
-$labels['notifysubject'] = 'Tytuł powiadomienia:';
-$labels['notifyfrom'] = 'Nadawca powiadomienia:';
+$labels['notifytarget'] = 'Odbiorca powiadomienia:';
+$labels['notifymessage'] = 'Wiadomość powiadomienia (opcjonalne):';
+$labels['notifyoptions'] = 'Opcje powiadomienia (opcjonalne):';
+$labels['notifyfrom'] = 'Nadawca powiadomienia (opcjonalne):';
 $labels['notifyimportance'] = 'Priorytet:';
 $labels['notifyimportancelow'] = 'niski';
 $labels['notifyimportancenormal'] = 'normalny';
 $labels['notifyimportancehigh'] = 'wysoki';
+$labels['notifymethodmailto'] = 'E-Mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Utwórz filtr';
 $labels['usedata'] = 'Użyj następujących danych do utworzenia filtra:';
 $labels['nextstep'] = 'Następny krok';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'nierozróżniający wielkości liter (ascii-casemap)'
 $labels['asciinumeric'] = 'numeryczny (ascii-numeric)';
 $labels['index'] = 'indeks:';
 $labels['indexlast'] = 'wstecz';
+$labels['vacation'] = 'Nieobecność';
+$labels['vacation.reply'] = 'Odpowiedź';
+$labels['vacation.advanced'] = 'Ustawienia zaawansowane';
+$labels['vacation.subject'] = 'Temat';
+$labels['vacation.body'] = 'Treść';
+$labels['vacation.start'] = 'Początek nieobecności';
+$labels['vacation.end'] = 'Koniec nieobecności';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'włączone';
+$labels['vacation.off'] = 'wyłączone';
+$labels['vacation.addresses'] = 'Moje dodatkowe adresy';
+$labels['vacation.interval'] = 'Częstotliwość odpowiedzi';
+$labels['vacation.after'] = 'Umieść regułę odpowiedzi po';
+$labels['vacation.saving'] = 'Zapisywanie danych...';
+$labels['vacation.action'] = 'Akcje wiadomości przychodzących';
+$labels['vacation.keep'] = 'Zachowaj';
+$labels['vacation.discard'] = 'Odrzuć';
+$labels['vacation.redirect'] = 'Przekaż do';
+$labels['vacation.copy'] = 'Wyślij kopię do';
+$labels['arialabelfiltersetactions'] = 'Zbiór filtrów akcji';
+$labels['arialabelfilteractions'] = 'Akcje filtrów';
+$labels['arialabelfilterform'] = 'Ustawienia filtrów';
+$labels['ariasummaryfilterslist'] = 'Spis filtrów';
+$labels['ariasummaryfiltersetslist'] = 'Lista zbiorów filtrów';
+$labels['filterstitle'] = 'Zarządzaj filtrami wiadomości przychodzących';
+$labels['vacationtitle'] = 'Zarządzaj asystentem nieobecności';
 $messages['filterunknownerror'] = 'Nieznany błąd serwera.';
 $messages['filterconnerror'] = 'Nie można nawiązać połączenia z serwerem.';
 $messages['filterdeleteerror'] = 'Nie można usunąć filtra. Błąd serwera.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nazwa zarezerwowana.';
 $messages['setexist'] = 'Zbiór już istnieje.';
 $messages['nodata'] = 'Należy wybrać co najmniej jedną pozycję!';
 $messages['invaliddateformat'] = 'Nieprawidłowy format daty lub fragmentu daty';
+$messages['saveerror'] = 'Nie można zapisać danych. Wystąpił błąd serwera.';
+$messages['vacationsaved'] = 'Dane nieobecności zapisano pomyślnie.';
+$messages['emptyvacationbody'] = 'Treść wiadomości jest wymagana!';
 ?>
diff --git a/lib/plugins/managesieve/localization/pt_BR.inc b/lib/plugins/managesieve/localization/pt_BR.inc
index 063c60c..b0ccaf6 100644
--- a/lib/plugins/managesieve/localization/pt_BR.inc
+++ b/lib/plugins/managesieve/localization/pt_BR.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatário';
 $labels['vacationaddr'] = 'Meu endereço de e-mail adicional:';
 $labels['vacationdays'] = 'Enviar mensagens com que frequência (em dias):';
 $labels['vacationinterval'] = 'Como geralmente enviam mensagens:';
-$labels['days'] = 'dias';
-$labels['seconds'] = 'segundos';
 $labels['vacationreason'] = 'Corpo da mensagem (motivo de férias):';
 $labels['vacationsubject'] = 'Título da mensagem:';
+$labels['days'] = 'dias';
+$labels['seconds'] = 'segundos';
 $labels['rulestop'] = 'Parar de avaliar regras';
 $labels['enable'] = 'Habilitar/Desabilitar';
 $labels['filterset'] = 'Conjunto de filtros';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'primeiro caractere maiúsculo';
 $labels['varquotewildcard'] = 'caracteres especiais de citação';
 $labels['varlength'] = 'tamanho';
 $labels['notify'] = 'Enviar notificação';
-$labels['notifyaddress'] = 'Para endereço de e-mail:';
-$labels['notifybody'] = 'Corpo da notificação:';
-$labels['notifysubject'] = 'Título da notificação:';
-$labels['notifyfrom'] = 'Remetente da notificação:';
+$labels['notifytarget'] = 'Destino da notificação:';
+$labels['notifymessage'] = 'Mensagem de notificação (opcional):';
+$labels['notifyoptions'] = 'Opções de notificação (opcional):';
+$labels['notifyfrom'] = 'Remetente da notificação (opcional):';
 $labels['notifyimportance'] = 'Importância';
 $labels['notifyimportancelow'] = 'baixa';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefone';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Criar filtro';
 $labels['usedata'] = 'Usar os seguintes dados no filtro:';
 $labels['nextstep'] = 'Próximo Passo';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'caso insensível (mapa de caracteres ascii)';
 $labels['asciinumeric'] = 'numérico (ascii-numeric)';
 $labels['index'] = 'índice:';
 $labels['indexlast'] = 'retroceder';
+$labels['vacation'] = 'Férias';
+$labels['vacation.reply'] = 'Responder mensagem';
+$labels['vacation.advanced'] = 'Opções avançadas';
+$labels['vacation.subject'] = 'Assunto';
+$labels['vacation.body'] = 'Conteúdo';
+$labels['vacation.start'] = 'Início das férias';
+$labels['vacation.end'] = 'Término das férias';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Ligado';
+$labels['vacation.off'] = 'Desligado';
+$labels['vacation.addresses'] = 'Meus endereços de e-mail adicionais';
+$labels['vacation.interval'] = 'Intervalo de resposta';
+$labels['vacation.after'] = 'Colocar regra de férias após';
+$labels['vacation.saving'] = 'Salvando dados...';
+$labels['vacation.action'] = 'Ações para mensagens recebidas';
+$labels['vacation.keep'] = 'Manter';
+$labels['vacation.discard'] = 'Descartar';
+$labels['vacation.redirect'] = 'Redirecionar para';
+$labels['vacation.copy'] = 'Enviar cópia para';
+$labels['arialabelfiltersetactions'] = 'Ações do grupo de filtros';
+$labels['arialabelfilteractions'] = 'Ações do filtro';
+$labels['arialabelfilterform'] = 'Propriedades do filtro';
+$labels['ariasummaryfilterslist'] = 'Lista dos filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de grupo de filtros';
+$labels['filterstitle'] = 'Editar filtro dos e-mails recebidos';
+$labels['vacationtitle'] = 'Editar regra de ausência';
 $messages['filterunknownerror'] = 'Erro desconhecido de servidor';
 $messages['filterconnerror'] = 'Não foi possível conectar ao servidor managesieve';
 $messages['filterdeleteerror'] = 'Impossível excluir o filtro. Ocorreu um erro no servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nome reservado.';
 $messages['setexist'] = 'Conjunto já existe.';
 $messages['nodata'] = 'Pelo menos uma posição precisa ser selecionada!';
 $messages['invaliddateformat'] = 'Data inválida';
+$messages['saveerror'] = 'Impossível salvar dados. Ocorreu um erro no servidor.';
+$messages['vacationsaved'] = 'Dados de férias salvos com sucesso.';
+$messages['emptyvacationbody'] = 'Conteúdo da mensagem de férias necessário!';
 ?>
diff --git a/lib/plugins/managesieve/localization/pt_PT.inc b/lib/plugins/managesieve/localization/pt_PT.inc
index 4e93076..ec39542 100644
--- a/lib/plugins/managesieve/localization/pt_PT.inc
+++ b/lib/plugins/managesieve/localization/pt_PT.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatário';
 $labels['vacationaddr'] = 'Os meus endereços de e-mail adicionais:';
 $labels['vacationdays'] = 'Enviar mensagens com que frequência (em dias):';
 $labels['vacationinterval'] = 'Com que frequência envia mensagens:';
-$labels['days'] = 'dias';
-$labels['seconds'] = 'segundos';
 $labels['vacationreason'] = 'Conteúdo da mensagem (motivo da ausência):';
 $labels['vacationsubject'] = 'Assunto da mensagem:';
+$labels['days'] = 'dias';
+$labels['seconds'] = 'segundos';
 $labels['rulestop'] = 'Parar de avaliar regras';
 $labels['enable'] = 'Activar/Desactivar';
 $labels['filterset'] = 'Filtros definidos';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'primeira letra em maiúscula';
 $labels['varquotewildcard'] = 'citar caracteres especiais';
 $labels['varlength'] = 'tamanho';
 $labels['notify'] = 'Enviar notificação';
-$labels['notifyaddress'] = 'Endereço de E-mail to:';
-$labels['notifybody'] = 'Corpo de Notificação:';
-$labels['notifysubject'] = 'Assunto Notificação:';
-$labels['notifyfrom'] = 'Remetente Notificação:';
+$labels['notifytarget'] = 'Destino da notificação:';
+$labels['notifymessage'] = 'Mensagem de notificação (opcional):';
+$labels['notifyoptions'] = 'Opções de notificação (opcional):';
+$labels['notifyfrom'] = 'Remetente da notificação (opcional):';
 $labels['notifyimportance'] = 'Importância:';
 $labels['notifyimportancelow'] = 'baixa';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefone';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Criar filtro';
 $labels['usedata'] = 'Usar os seguintes dados no filtro:';
 $labels['nextstep'] = 'Próximo passo';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'não sensível a maiúsculas/minúsculas (caracteres
 $labels['asciinumeric'] = 'numérico (numérico ascii)';
 $labels['index'] = 'índice:';
 $labels['indexlast'] = 'retroceder';
+$labels['vacation'] = 'Férias';
+$labels['vacation.reply'] = 'Mensagem de resposta';
+$labels['vacation.advanced'] = 'Definições avançadas';
+$labels['vacation.subject'] = 'Assunto';
+$labels['vacation.body'] = 'Corpo da mensagem';
+$labels['vacation.start'] = 'Início de férias';
+$labels['vacation.end'] = 'Fim de férias';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Ligar';
+$labels['vacation.off'] = 'Desligar';
+$labels['vacation.addresses'] = 'Meus endereços adicionais';
+$labels['vacation.interval'] = 'Intervalo de resposta';
+$labels['vacation.after'] = 'Coloque regra de férias depois';
+$labels['vacation.saving'] = 'A guardar dados...';
+$labels['vacation.action'] = 'Acção para mensagem recebida';
+$labels['vacation.keep'] = 'Manter';
+$labels['vacation.discard'] = 'Rejeitar';
+$labels['vacation.redirect'] = 'Redireccionar para';
+$labels['vacation.copy'] = 'Enviar cópia para';
+$labels['arialabelfiltersetactions'] = 'Acções do conjunto de filtros';
+$labels['arialabelfilteractions'] = 'Acções dos filtros';
+$labels['arialabelfilterform'] = 'Propriedades dos filtro';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de conjuntos de filtros';
+$labels['filterstitle'] = 'Editar filtros de mensagens recebidas';
+$labels['vacationtitle'] = 'Editar regra de ausência do escritório';
 $messages['filterunknownerror'] = 'Erro de servidor desconhecido';
 $messages['filterconnerror'] = 'Não é possível ligar ao servidor Sieve';
 $messages['filterdeleteerror'] = 'Não foi possível eliminar o filtro.  Ocorreu um erro no servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nome invertido.';
 $messages['setexist'] = 'O conjunto já existe.';
 $messages['nodata'] = 'Deve selecionar pelo menos uma posição.';
 $messages['invaliddateformat'] = 'Data ou formato de data inválido.';
+$messages['saveerror'] = 'Não foi possível guardar os dados. Ocorreu um erro no servidor.';
+$messages['vacationsaved'] = 'Dados de férias guardados com sucesso.';
+$messages['emptyvacationbody'] = 'É necessário o corpo da mensagem de férias!';
 ?>
diff --git a/lib/plugins/managesieve/localization/ro_RO.inc b/lib/plugins/managesieve/localization/ro_RO.inc
index 2cddf36..017320e 100644
--- a/lib/plugins/managesieve/localization/ro_RO.inc
+++ b/lib/plugins/managesieve/localization/ro_RO.inc
@@ -54,13 +54,13 @@ $labels['add'] = 'Adauga';
 $labels['del'] = 'Sterge';
 $labels['sender'] = 'Expeditor';
 $labels['recipient'] = 'Destinatar';
-$labels['vacationaddr'] = 'Adrese(le) mele de email suplimentare:';
+$labels['vacationaddr'] = 'Adresele mele de e-mail (adiţionale)';
 $labels['vacationdays'] = 'Cat de des sa trimit mesajele (in zile):';
 $labels['vacationinterval'] = 'Cât de des să trimit mesaje:';
-$labels['days'] = 'zile';
-$labels['seconds'] = 'secunde';
 $labels['vacationreason'] = 'Corpul mesajului (motivul vacantei):';
 $labels['vacationsubject'] = 'Subiectul mesajului:';
+$labels['days'] = 'zile';
+$labels['seconds'] = 'secunde';
 $labels['rulestop'] = 'Nu mai evalua reguli';
 $labels['enable'] = 'Activeaza/Dezactiveaza';
 $labels['filterset'] = 'Filtre setate';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'primul caracter cu litre mari';
 $labels['varquotewildcard'] = 'caracterele speciale in citat';
 $labels['varlength'] = 'lungime';
 $labels['notify'] = 'Notificare trimitere';
-$labels['notifyaddress'] = 'La adresa de e-mail';
-$labels['notifybody'] = 'Mesajul de notificare:';
-$labels['notifysubject'] = 'Subiectul notificării:';
-$labels['notifyfrom'] = 'Expeditorul notificării:';
 $labels['notifyimportance'] = 'Importanța:';
 $labels['notifyimportancelow'] = 'mică';
 $labels['notifyimportancenormal'] = 'normală';
@@ -157,27 +153,50 @@ $labels['asciicasemap'] = 'ignoră majusculele (ascii-casemap)';
 $labels['asciinumeric'] = 'numeric (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'invers';
+$labels['vacation'] = 'Vacanta';
+$labels['vacation.reply'] = 'Raspunde mesajului';
+$labels['vacation.advanced'] = 'Setari avansate';
+$labels['vacation.subject'] = 'Subiect';
+$labels['vacation.body'] = 'Corp';
+$labels['vacation.status'] = 'Statut';
+$labels['vacation.on'] = 'Pe';
+$labels['vacation.off'] = 'De pe';
+$labels['vacation.addresses'] = 'Adresa mea aditionala';
+$labels['vacation.interval'] = 'Interval de raspundere';
+$labels['vacation.after'] = 'Pune regula de vacanta dupa';
+$labels['vacation.saving'] = 'Salvez datele...';
 $messages['filterunknownerror'] = 'Eroare necunoscută la server:';
 $messages['filterconnerror'] = 'Nu mă pot conecta la server.';
+$messages['filterdeleteerror'] = 'Nu pot ÅŸterge filtrul. S-a produs o eroare la server.';
 $messages['filterdeleted'] = 'Filtrul a fost ÅŸters cu succes.';
 $messages['filtersaved'] = 'Filtrul a fost salvat cu succes.';
+$messages['filtersaveerror'] = 'Nu am putut salva filtrul. S-a produs o eroare la server.';
 $messages['filterdeleteconfirm'] = 'Chiar vrei să ştergi filtrul selectat?';
 $messages['ruledeleteconfirm'] = 'Eşti sigur că vrei să ştergi regula selectată?';
 $messages['actiondeleteconfirm'] = 'Eşti sigur că vrei să ştergi acţiunea selectată?';
 $messages['forbiddenchars'] = 'Caractere nepermise în câmp.';
 $messages['cannotbeempty'] = 'Câmpul nu poate fi gol.';
 $messages['ruleexist'] = 'Filtrul cu numele specificat există deja.';
+$messages['setactivateerror'] = 'Nu pot activa setul de filtre selectat. S-a produs o eroare la server.';
+$messages['setdeactivateerror'] = 'Nu pot dezactiva setul de filtre selectat. S-a produs o eroare la server.';
+$messages['setdeleteerror'] = 'Nu pot ÅŸterge setul de filtre selectat. S-a produs o eroare la server.';
 $messages['setactivated'] = 'Setul de filtre activat cu succes.';
 $messages['setdeactivated'] = 'Setul de filtre dezactivat cu succes.';
 $messages['setdeleted'] = 'Setul de filtre ÅŸters cu succes.';
 $messages['setdeleteconfirm'] = 'Eşti sigur(ă) că vrei să ştergi setul de filtre selectat?';
+$messages['setcreateerror'] = 'Nu am putut crea setul de filtre. S-a produs o eroare la server.';
 $messages['setcreated'] = 'Setul de filtre creat cu succes.';
+$messages['activateerror'] = 'Nu am putut activa filtrul (filtrele) selectate. S-a produs o eroare la server.';
+$messages['deactivateerror'] = 'Nu am putut dezactiva filtrele (filtrele) selectate. S-a produs o eroare la server.';
 $messages['deactivated'] = 'Filtrele au fost activate cu succes.';
 $messages['activated'] = 'Filtrele au fost dezactivate cu succes.';
 $messages['moved'] = 'Filtrele au fost mutate cu succes.';
+$messages['moveerror'] = 'Nu am putut muta filtrul selectat. S-a produs o eroare la server.';
 $messages['nametoolong'] = 'Numele este prea lung.';
 $messages['namereserved'] = 'Nume rezervat.';
 $messages['setexist'] = 'Setul există deja.';
 $messages['nodata'] = 'Trebuie selectată cel putin o poziţie!';
 $messages['invaliddateformat'] = 'Data sau parte din data in format invalid';
+$messages['saveerror'] = 'Nu am putut salva datele. A aparut o eroare de server.';
+$messages['vacationsaved'] = 'Data de vacanta salvata cu succes';
 ?>
diff --git a/lib/plugins/managesieve/localization/ru_RU.inc b/lib/plugins/managesieve/localization/ru_RU.inc
index ea0ebd2..6714c4c 100644
--- a/lib/plugins/managesieve/localization/ru_RU.inc
+++ b/lib/plugins/managesieve/localization/ru_RU.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Ответное сообщение';
 $labels['vacation.advanced'] = 'Дополнительные настройки';
 $labels['vacation.subject'] = 'Тема';
 $labels['vacation.body'] = 'Тело письма';
-$labels['vacation.dates'] = 'Время отпуска';
-$labels['vacation.from'] = 'От:';
-$labels['vacation.to'] = 'Кому:';
+$labels['vacation.start'] = 'Начало отпуска';
+$labels['vacation.end'] = 'Конец отпуска';
 $labels['vacation.status'] = 'Состояние';
 $labels['vacation.on'] = 'Вкл.';
 $labels['vacation.off'] = 'Выкл.';
diff --git a/lib/plugins/managesieve/localization/sk_SK.inc b/lib/plugins/managesieve/localization/sk_SK.inc
index 9a75586..4cad13f 100644
--- a/lib/plugins/managesieve/localization/sk_SK.inc
+++ b/lib/plugins/managesieve/localization/sk_SK.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Príjemca';
 $labels['vacationaddr'] = 'Iná moja e-mailová adresa (adresy):';
 $labels['vacationdays'] = 'Ako často odosielať správy (v dňoch):';
 $labels['vacationinterval'] = 'Ako často odosielať správy:';
-$labels['days'] = 'dní';
-$labels['seconds'] = 'sekúnd';
 $labels['vacationreason'] = 'Telo správy (dôvod neprítomnosti):';
 $labels['vacationsubject'] = 'Predmet správy:';
+$labels['days'] = 'dní';
+$labels['seconds'] = 'sekúnd';
 $labels['rulestop'] = 'Koniec pravidiel';
 $labels['enable'] = 'Zapnúť/vypnúť';
 $labels['filterset'] = 'Súprava filtrov';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'prvé písmeno veľké';
 $labels['varquotewildcard'] = 'k špeciálnym znakom pridať úvodzovky';
 $labels['varlength'] = 'dĺžka';
 $labels['notify'] = 'Odoslať oznámenie';
-$labels['notifyaddress'] = 'Na e-mailovú adresu:';
-$labels['notifybody'] = 'Telo oznámenia:';
-$labels['notifysubject'] = 'Predmet oznámenia:';
-$labels['notifyfrom'] = 'Odosielateľ oznámenia:';
+$labels['notifytarget'] = 'Cieľ notifikácie:';
+$labels['notifymessage'] = 'Notifikačná správa (voliteľne):';
+$labels['notifyoptions'] = 'Nastavenia notifikácie (voliteľné):';
+$labels['notifyfrom'] = 'Odosielateľ notifikácie (voliteľne):';
 $labels['notifyimportance'] = 'Priorita:';
 $labels['notifyimportancelow'] = 'nízka';
 $labels['notifyimportancenormal'] = 'normálna';
 $labels['notifyimportancehigh'] = 'vysoká';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telefón';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Vytvoriť filter';
 $labels['usedata'] = 'Použiť tieto údaje vo filtri:';
 $labels['nextstep'] = 'Ďalší krok';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'nerozlišuje veľké a malé písmená (ascii tabuľk
 $labels['asciinumeric'] = 'numerické (ascii čísla)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'dozadu';
+$labels['vacation'] = 'Dovolenka';
+$labels['vacation.reply'] = 'Odpoveď na správu';
+$labels['vacation.advanced'] = 'Pokročilé nastavenia';
+$labels['vacation.subject'] = 'Predmet';
+$labels['vacation.body'] = 'Telo';
+$labels['vacation.start'] = 'Začiatok dovolenky';
+$labels['vacation.end'] = 'Koniec dovolenky';
+$labels['vacation.status'] = 'Stav';
+$labels['vacation.on'] = 'Zap.';
+$labels['vacation.off'] = 'Vyp.';
+$labels['vacation.addresses'] = 'Moje ďalšie adresy';
+$labels['vacation.interval'] = 'Interval odpovedania';
+$labels['vacation.after'] = 'Nastaviť pravidlo pre dovolenku po';
+$labels['vacation.saving'] = 'Ukladanie údajov...';
+$labels['vacation.action'] = 'Akcia pre prichádzajúcu správu';
+$labels['vacation.keep'] = 'Zachovať';
+$labels['vacation.discard'] = 'Vyhodiť do koša';
+$labels['vacation.redirect'] = 'Presmerovať na';
+$labels['vacation.copy'] = 'Poslať kópiu na';
+$labels['arialabelfiltersetactions'] = 'Akcie zo súpravy filtrov';
+$labels['arialabelfilteractions'] = 'Akcie filtra';
+$labels['arialabelfilterform'] = 'Nastavenia filtra';
+$labels['ariasummaryfilterslist'] = 'Zoznam filtrov';
+$labels['ariasummaryfiltersetslist'] = 'Zoznam súprav s filtrami';
+$labels['filterstitle'] = 'Upraviť filtre prichádzajúcich e-mailov';
+$labels['vacationtitle'] = 'Upraviť pravidlo pre čas mimo kancelárie';
 $messages['filterunknownerror'] = 'Neznáma chyba servera.';
 $messages['filterconnerror'] = 'Nepodarilo sa pripojiť k serveru.';
 $messages['filterdeleteerror'] = 'Nemožno vymazať filter. Nastala chyba servera.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Rezervovaný názov.';
 $messages['setexist'] = 'Súprava už existuje.';
 $messages['nodata'] = 'Aspoň jedna pozícia musí byť zvolená!';
 $messages['invaliddateformat'] = 'Neplatný formát dátumu alebo časti dátumu';
+$messages['saveerror'] = 'Údaje nemožno uložiť. Nastala chyba servera.';
+$messages['vacationsaved'] = 'Údaje o dovolenke boli úspešne uložené.';
+$messages['emptyvacationbody'] = 'Musíte zadať telo správy, zobrazovanej v čase neprítomnosti!';
 ?>
diff --git a/lib/plugins/managesieve/localization/sl_SI.inc b/lib/plugins/managesieve/localization/sl_SI.inc
index 2915684..f0e5159 100644
--- a/lib/plugins/managesieve/localization/sl_SI.inc
+++ b/lib/plugins/managesieve/localization/sl_SI.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Prejemnik';
 $labels['vacationaddr'] = 'Moji dodatni e-naslovi';
 $labels['vacationdays'] = 'Kako pogosto naj bodo sporočila poslana (v dnevih):';
 $labels['vacationinterval'] = 'Sporočila pošlji na:';
-$labels['days'] = 'dni';
-$labels['seconds'] = 'sekund';
 $labels['vacationreason'] = 'Vsebina sporočila (vzrok za odsotnost):';
 $labels['vacationsubject'] = 'Zadeva sporočila';
+$labels['days'] = 'dni';
+$labels['seconds'] = 'sekund';
 $labels['rulestop'] = 'Prekini z izvajanjem pravil';
 $labels['enable'] = 'Omogoči/Onemogoči';
 $labels['filterset'] = 'Nastavitev filtrov';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'prvi znak velika začetnica';
 $labels['varquotewildcard'] = 'citiraj posebne znake';
 $labels['varlength'] = 'dolžina';
 $labels['notify'] = 'Poštlji obvestilo';
-$labels['notifyaddress'] = 'Na elektronski naslov:';
-$labels['notifybody'] = 'Telo obvestila:';
-$labels['notifysubject'] = 'Zadeva obvestila:';
-$labels['notifyfrom'] = 'Pošiljatelj obvestila:';
 $labels['notifyimportance'] = 'Pomembnost:';
 $labels['notifyimportancelow'] = 'nizko';
 $labels['notifyimportancenormal'] = 'običajno';
diff --git a/lib/plugins/managesieve/localization/sv_SE.inc b/lib/plugins/managesieve/localization/sv_SE.inc
index 131d46c..ede13cb 100644
--- a/lib/plugins/managesieve/localization/sv_SE.inc
+++ b/lib/plugins/managesieve/localization/sv_SE.inc
@@ -19,7 +19,7 @@ $labels['filters'] = 'Filter';
 $labels['managefilters'] = 'Administrera filter';
 $labels['filtername'] = 'Filternamn';
 $labels['newfilter'] = 'Nytt filter';
-$labels['filteradd'] = 'Lägg till filter';
+$labels['filteradd'] = 'Nytt filter';
 $labels['filterdel'] = 'Ta bort filter';
 $labels['moveup'] = 'Flytta upp filter';
 $labels['movedown'] = 'Flytta ner filter';
@@ -57,15 +57,15 @@ $labels['recipient'] = 'Mottagare';
 $labels['vacationaddr'] = 'Ytterligare mottagaradresser:';
 $labels['vacationdays'] = 'Antal dagar mellan auto-svar:';
 $labels['vacationinterval'] = 'Tid mellan auto-svar:';
+$labels['vacationreason'] = 'Meddelandetext (frånvaroanledning):';
+$labels['vacationsubject'] = 'Meddelandeämne:';
 $labels['days'] = 'Dagar';
 $labels['seconds'] = 'Sekunder';
-$labels['vacationreason'] = 'Meddelande i auto-svar:';
-$labels['vacationsubject'] = 'Meddelandeämne:';
 $labels['rulestop'] = 'Avsluta filtrering';
 $labels['enable'] = 'Aktivera/deaktivera';
 $labels['filterset'] = 'Filtergrupp';
 $labels['filtersets'] = 'Filtergrupper';
-$labels['filtersetadd'] = 'Lägg till filtergrupp';
+$labels['filtersetadd'] = 'Ny filtergrupp';
 $labels['filtersetdel'] = 'Ta bort filtergrupp';
 $labels['filtersetact'] = 'Aktivera filtergrupp';
 $labels['filtersetdeact'] = 'Deaktivera filtergrupp';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'Första tecken versalt';
 $labels['varquotewildcard'] = 'Koda specialtecken';
 $labels['varlength'] = 'Längd';
 $labels['notify'] = 'Skicka avisering';
-$labels['notifyaddress'] = 'Mottagaradress:';
-$labels['notifybody'] = 'Aviseringsmeddelande:';
-$labels['notifysubject'] = 'Aviseringsämne:';
-$labels['notifyfrom'] = 'Aviseringsavsändare:';
+$labels['notifytarget'] = 'Aviseringsmål:';
+$labels['notifymessage'] = 'Aviseringsmeddelande (valfritt):';
+$labels['notifyoptions'] = 'Aviseringstillval (valfritt):';
+$labels['notifyfrom'] = 'Aviseringsavsändare (valfri):';
 $labels['notifyimportance'] = 'Prioritet:';
 $labels['notifyimportancelow'] = 'LÃ¥g';
 $labels['notifyimportancenormal'] = 'Normal';
 $labels['notifyimportancehigh'] = 'Hög';
+$labels['notifymethodmailto'] = 'E-post';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Skapa filter';
 $labels['usedata'] = 'Använd följande information i filtret:';
 $labels['nextstep'] = 'Nästa steg';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'teckenlägesokänslig (ascii-casemap)';
 $labels['asciinumeric'] = 'numerisk (ascii-numeric)';
 $labels['index'] = 'index:';
 $labels['indexlast'] = 'omvänd';
+$labels['vacation'] = 'Frånvaro';
+$labels['vacation.reply'] = 'Besvara meddelande';
+$labels['vacation.advanced'] = 'Avancerade inställningar';
+$labels['vacation.subject'] = 'Ämne';
+$labels['vacation.body'] = 'Innehåll';
+$labels['vacation.start'] = 'Frånvaron börjar';
+$labels['vacation.end'] = 'Frånvaron slutar';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'PÃ¥';
+$labels['vacation.off'] = 'Av';
+$labels['vacation.addresses'] = 'Ytterligare mottagaradresser';
+$labels['vacation.interval'] = 'Svarsintervall';
+$labels['vacation.after'] = 'Placera frånvaroregel efter';
+$labels['vacation.saving'] = 'Sparar data...';
+$labels['vacation.action'] = 'Hantering av inkommande meddelanden';
+$labels['vacation.keep'] = 'Behåll';
+$labels['vacation.discard'] = 'Förkasta';
+$labels['vacation.redirect'] = 'Ändra mottagare till';
+$labels['vacation.copy'] = 'Skicka kopia till';
+$labels['arialabelfiltersetactions'] = 'Hantera filtergrupper';
+$labels['arialabelfilteractions'] = 'Hantera filter';
+$labels['arialabelfilterform'] = 'Filteregenskaper';
+$labels['ariasummaryfilterslist'] = 'Lista med filter';
+$labels['ariasummaryfiltersetslist'] = 'Lista med filtergrupper';
+$labels['filterstitle'] = 'Ändra filter för inkommande meddelanden';
+$labels['vacationtitle'] = 'Ändra regel för frånvaromeddelande';
 $messages['filterunknownerror'] = 'Okänt serverfel';
 $messages['filterconnerror'] = 'Anslutning till serverns filtertjänst misslyckades';
 $messages['filterdeleteerror'] = 'Filtret kunde inte tas bort på grund av serverfel';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reserverat namn.';
 $messages['setexist'] = 'Filtergrupp finns redan.';
 $messages['nodata'] = 'Minst en position måste väljas!';
 $messages['invaliddateformat'] = 'Ogiltigt datum eller del av datumformat';
+$messages['saveerror'] = 'Datan kunde inte sparas på grund av serverfel.';
+$messages['vacationsaved'] = 'Frånvarodatan har sparats.';
+$messages['emptyvacationbody'] = 'Text för frånvaromeddelande saknas!';
 ?>
diff --git a/lib/plugins/managesieve/localization/tr_TR.inc b/lib/plugins/managesieve/localization/tr_TR.inc
index b0b09e1..c618386 100644
--- a/lib/plugins/managesieve/localization/tr_TR.inc
+++ b/lib/plugins/managesieve/localization/tr_TR.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Alıcı';
 $labels['vacationaddr'] = 'Ek e-posta adres(ler)im:';
 $labels['vacationdays'] = 'Ne sıklıkla mesajlar gönderilir(gün)';
 $labels['vacationinterval'] = 'Ne kadar sıklıkla mesaj gönderirsiniz:';
-$labels['days'] = 'günler';
-$labels['seconds'] = 'saniyeler';
 $labels['vacationreason'] = 'Mesaj gövdesi(tatil sebebi):';
 $labels['vacationsubject'] = 'Mesaj konusu:';
+$labels['days'] = 'günler';
+$labels['seconds'] = 'saniyeler';
 $labels['rulestop'] = 'Kuralları değerlendirmeyi bitir';
 $labels['enable'] = 'Etkinleştir/Etkisiz Kıl';
 $labels['filterset'] = 'Filtre seti';
@@ -98,7 +98,7 @@ $labels['flaganswered'] = 'Cevaplanmış';
 $labels['flagflagged'] = 'Ä°ÅŸaretli';
 $labels['flagdraft'] = 'Taslak';
 $labels['setvariable'] = 'Değişken tanımla';
-$labels['setvarname'] = 'Değişken adı';
+$labels['setvarname'] = 'Değişken adı:';
 $labels['setvarvalue'] = 'DeÄŸiÅŸken deÄŸeri:';
 $labels['setvarmodifiers'] = 'DeÄŸiÅŸtiriciler:';
 $labels['varlower'] = 'küçük harf';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'İlk karakter büyük harf';
 $labels['varquotewildcard'] = 'özel karakterleri tırnak içine al';
 $labels['varlength'] = 'uzunluk';
 $labels['notify'] = 'Bildirim gönder';
-$labels['notifyaddress'] = 'Alıcı e-posta adresi';
-$labels['notifybody'] = 'Bildirim gövdesi:';
-$labels['notifysubject'] = 'Bildirim konusu:';
-$labels['notifyfrom'] = 'Bildirim göndericisi:';
-$labels['notifyimportance'] = 'Önem derecesi';
+$labels['notifytarget'] = 'Bildirim hedefi:';
+$labels['notifymessage'] = 'Bildirim mesajı (tercihe bağlı):';
+$labels['notifyoptions'] = 'Bildirim tercihleri (tercihe bağlı):';
+$labels['notifyfrom'] = 'Bildirim göndericisi (tercihe bağlı):';
+$labels['notifyimportance'] = 'Önem derecesi:';
 $labels['notifyimportancelow'] = 'düşük';
 $labels['notifyimportancenormal'] = 'normal';
 $labels['notifyimportancehigh'] = 'yüksek';
+$labels['notifymethodmailto'] = 'E-posta';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
 $labels['filtercreate'] = 'Süzgeç oluştur';
 $labels['usedata'] = 'Aşağıdaki verileri süzgeçte kullan';
 $labels['nextstep'] = 'Sonraki adım';
@@ -157,11 +160,37 @@ $labels['asciicasemap'] = 'büyük küçük harf duyarsız(ascii-casemap)';
 $labels['asciinumeric'] = 'sayı (ascii-numeric)';
 $labels['index'] = 'indeks:';
 $labels['indexlast'] = 'geriye yönelik';
+$labels['vacation'] = 'Tatil';
+$labels['vacation.reply'] = 'Cevap mesajı';
+$labels['vacation.advanced'] = 'Gelişmiş seçenekler';
+$labels['vacation.subject'] = 'Konu';
+$labels['vacation.body'] = 'Gövde';
+$labels['vacation.start'] = 'Tatil başlangıcı';
+$labels['vacation.end'] = 'Tatil bitiÅŸi';
+$labels['vacation.status'] = 'Durum';
+$labels['vacation.on'] = 'Etkin';
+$labels['vacation.off'] = 'Devre dışı';
+$labels['vacation.addresses'] = 'Ek adresler';
+$labels['vacation.interval'] = 'Cevap aralığı';
+$labels['vacation.after'] = 'Şundan sonra tatil kuralı koy';
+$labels['vacation.saving'] = 'Veri kaydediliyor...';
+$labels['vacation.action'] = 'Gelen mesaj aksiyonu';
+$labels['vacation.keep'] = 'Koru';
+$labels['vacation.discard'] = 'Yoksay';
+$labels['vacation.redirect'] = 'Şuraya yönlendir';
+$labels['vacation.copy'] = 'Şuraya kopya gönder';
+$labels['arialabelfiltersetactions'] = 'Filtre seti aksiyonları';
+$labels['arialabelfilteractions'] = 'Filtre aksiyonları';
+$labels['arialabelfilterform'] = 'Filtre özellikleri';
+$labels['ariasummaryfilterslist'] = 'Filtre listesi';
+$labels['ariasummaryfiltersetslist'] = 'Filtre seti listesi';
+$labels['filterstitle'] = 'Gelen e-posta filtrelerini düzenle';
+$labels['vacationtitle'] = 'Ofis dışında kuralını düzenle';
 $messages['filterunknownerror'] = 'Bilinmeyen sunucu hatası.';
 $messages['filterconnerror'] = 'Sunucuya bağlanamıyor.';
 $messages['filterdeleteerror'] = 'Filtre silinemedi. Sunucuda hata oluÅŸtu.';
 $messages['filterdeleted'] = 'Filtre başarıyla silindi.';
-$messages['filtersaved'] = 'Filter başarıyla kaydedildi.';
+$messages['filtersaved'] = 'Filtre başarıyla kaydedildi.';
 $messages['filtersaveerror'] = 'Filtre kaydedilemedi. Sunucuda hata oluÅŸtu.';
 $messages['filterdeleteconfirm'] = 'Seçilen filtreleri  gerçekten silmek istiyor musun?';
 $messages['ruledeleteconfirm'] = 'Seçili kuralları silmek istediğinizden emin misiniz?';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'rezerve edilmiÅŸ isim.';
 $messages['setexist'] = 'Set zaten var.';
 $messages['nodata'] = 'En az bir pozisyon seçilmelidir.';
 $messages['invaliddateformat'] = 'geçersiz tarih veya tarih biçimi';
+$messages['saveerror'] = 'Veri kaydedilemedi. Sunucuda hata oluÅŸtu.';
+$messages['vacationsaved'] = 'Tatil verisi başarıyla kaydedildi.';
+$messages['emptyvacationbody'] = 'Tatil mesajı metni gerekmektedir.';
 ?>
diff --git a/lib/plugins/managesieve/localization/uk_UA.inc b/lib/plugins/managesieve/localization/uk_UA.inc
index d85b03b..fce7867 100644
--- a/lib/plugins/managesieve/localization/uk_UA.inc
+++ b/lib/plugins/managesieve/localization/uk_UA.inc
@@ -52,10 +52,10 @@ $labels['sender'] = 'Відправник';
 $labels['recipient'] = 'Отримувач';
 $labels['vacationaddr'] = 'Додаткова адреса(и):';
 $labels['vacationdays'] = 'Як часто повторювати (у днях):';
-$labels['days'] = 'днів';
-$labels['seconds'] = 'секунд';
 $labels['vacationreason'] = 'Текст повідомлення:';
 $labels['vacationsubject'] = 'Тема листа:';
+$labels['days'] = 'днів';
+$labels['seconds'] = 'секунд';
 $labels['rulestop'] = 'Зупинити перевірку правил';
 $labels['enable'] = 'Увімкнути/Вимкнуни';
 $labels['filterset'] = 'Набір фільтрів';
@@ -93,10 +93,6 @@ $labels['varlowerfirst'] = 'перший символ в нижньому рег
 $labels['varupperfirst'] = 'перший символ в верхньому регістрі';
 $labels['varlength'] = 'довжина';
 $labels['notify'] = 'Надсилати сповіщення';
-$labels['notifyaddress'] = 'На електронну адресу:';
-$labels['notifybody'] = 'Тіло сповіщення:';
-$labels['notifysubject'] = 'Тема сповіщення:';
-$labels['notifyfrom'] = 'Відправник сповіщення:';
 $labels['filtercreate'] = 'Створити фільтр';
 $labels['nextstep'] = 'Наступний крок';
 $labels['...'] = '...';
diff --git a/lib/plugins/managesieve/localization/vi_VN.inc b/lib/plugins/managesieve/localization/vi_VN.inc
index c791381..d22ff7e 100644
--- a/lib/plugins/managesieve/localization/vi_VN.inc
+++ b/lib/plugins/managesieve/localization/vi_VN.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Người nhận';
 $labels['vacationaddr'] = '(Các) Địa chỉ email bổ sung của tôi:';
 $labels['vacationdays'] = 'Số lần gửi thư (trong ngày)';
 $labels['vacationinterval'] = 'Tần suất gửi thư:';
-$labels['days'] = 'ngày';
-$labels['seconds'] = 'giây';
 $labels['vacationreason'] = 'Nội dung chính';
 $labels['vacationsubject'] = 'Tiêu đề thư';
+$labels['days'] = 'ngày';
+$labels['seconds'] = 'giây';
 $labels['rulestop'] = 'Ngừng đánh giá qui luật';
 $labels['enable'] = 'Kích hoạt/Không kích hoạt';
 $labels['filterset'] = 'Đặt các bộ lọc';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'chữ cái đầu viết hoa';
 $labels['varquotewildcard'] = 'trích dẫn ký tự đặc biệt';
 $labels['varlength'] = 'độ dài';
 $labels['notify'] = 'Gửi thông báo';
-$labels['notifyaddress'] = 'Gửi đến địa chỉ email:';
-$labels['notifybody'] = 'Nội dung thông báo:';
-$labels['notifysubject'] = 'Tiêu đề thông báo:';
-$labels['notifyfrom'] = 'Người gửi thông báo:';
+$labels['notifytarget'] = 'Mục tiêu thông báo:';
+$labels['notifymessage'] = 'Nội dung thông báo (tuỳ chọn):';
+$labels['notifyoptions'] = 'Lựa chọn thông báo (tuỳ chọn):';
+$labels['notifyfrom'] = 'Người gửi thông báo (tuỳ chọn):';
 $labels['notifyimportance'] = 'Mức độ quan trọng:';
 $labels['notifyimportancelow'] = 'thấp';
 $labels['notifyimportancenormal'] = 'vừa phải';
 $labels['notifyimportancehigh'] = 'cao';
+$labels['notifymethodmailto'] = 'Thư điện tử';
+$labels['notifymethodtel'] = 'Điện thoại';
+$labels['notifymethodsms'] = 'Tin nhắn';
 $labels['filtercreate'] = 'Tạo bộ lọc';
 $labels['usedata'] = 'Dùng dữ liệu trong bộ lọc sau:';
 $labels['nextstep'] = 'Bước tiếp theo';
@@ -157,6 +160,18 @@ $labels['asciicasemap'] = 'Không phân biệt chữ hoa chữ thường';
 $labels['asciinumeric'] = 'Bảng mã ASCII';
 $labels['index'] = 'chỉ mục:';
 $labels['indexlast'] = 'ngược';
+$labels['vacation'] = 'Thiết lập tự động trả lời trong kỳ nghỉ';
+$labels['vacation.reply'] = 'Trả lời thư';
+$labels['vacation.advanced'] = 'Tùy chọn tính năng cao hơn';
+$labels['vacation.subject'] = 'Tiêu đề';
+$labels['vacation.body'] = 'Ná»™i dung thÆ°';
+$labels['vacation.status'] = 'Trạng thái';
+$labels['vacation.on'] = 'Bật';
+$labels['vacation.off'] = 'Tắt';
+$labels['vacation.addresses'] = 'Các địa chỉ bổ sung của tôi';
+$labels['vacation.interval'] = 'Khoảng thời gian trả lời';
+$labels['vacation.after'] = 'Đặt quy định kỳ nghỉ sau';
+$labels['vacation.saving'] = 'Lưu lại dữ liệu...';
 $messages['filterunknownerror'] = 'Không tìm được lỗi máy chủ';
 $messages['filterconnerror'] = 'Không kết nối được với máy chủ.';
 $messages['filterdeleteerror'] = 'Không thể xóa bộ lọc. Xuất hiện lỗi ở máy chủ';
@@ -189,4 +204,6 @@ $messages['namereserved'] = 'Tên đã được bảo vệ';
 $messages['setexist'] = 'Thiết lập đã tồn tại';
 $messages['nodata'] = 'Ít nhất một vị trí phải được chọn';
 $messages['invaliddateformat'] = 'Lỗi không đúng cú pháp ngày hoặc nhập ngày sai';
+$messages['saveerror'] = 'Không thể lưu trữ dữ liệu. Xuất hiện lỗi ở máy chủ.';
+$messages['vacationsaved'] = 'Thiết lập kỳ nghỉ đã được lưu lại thành công.';
 ?>
diff --git a/lib/plugins/managesieve/localization/zh_CN.inc b/lib/plugins/managesieve/localization/zh_CN.inc
index 5c38cfe..a39b312 100644
--- a/lib/plugins/managesieve/localization/zh_CN.inc
+++ b/lib/plugins/managesieve/localization/zh_CN.inc
@@ -55,10 +55,10 @@ $labels['sender'] = '发件人';
 $labels['recipient'] = '收件人';
 $labels['vacationdays'] = '发送邮件频率(单位:天):';
 $labels['vacationinterval'] = '发送邮件频率:';
-$labels['days'] = '天';
-$labels['seconds'] = '秒';
 $labels['vacationreason'] = '邮件正文(假期原因)';
 $labels['vacationsubject'] = '邮件主题';
+$labels['days'] = '天';
+$labels['seconds'] = '秒';
 $labels['rulestop'] = '停止评价规则';
 $labels['enable'] = '启用/禁用';
 $labels['filterset'] = '过滤器设置';
@@ -104,10 +104,6 @@ $labels['varupperfirst'] = '首字母大写';
 $labels['varquotewildcard'] = '引用特殊字符';
 $labels['varlength'] = '长度';
 $labels['notify'] = '发送通知';
-$labels['notifyaddress'] = '收件地址:';
-$labels['notifybody'] = '通知正文:';
-$labels['notifysubject'] = '通知主题';
-$labels['notifyfrom'] = '通知的发送人:';
 $labels['notifyimportance'] = '优先级:';
 $labels['notifyimportancelow'] = '低';
 $labels['notifyimportancenormal'] = '中';
diff --git a/lib/plugins/managesieve/managesieve.js b/lib/plugins/managesieve/managesieve.js
index cd0d5f3..4d60833 100644
--- a/lib/plugins/managesieve/managesieve.js
+++ b/lib/plugins/managesieve/managesieve.js
@@ -736,6 +736,9 @@ function smart_field_init(field)
 
   if (field.attr('disabled'))
     area.hide();
+  // disable the original field anyway, we don't want it in POST
+  else
+    field.prop('disabled', true);
 
   field.after(area);
 
@@ -930,7 +933,7 @@ function sieve_form_init()
 
 rcube_webmail.prototype.managesieve_create = function(force)
 {
-  if (!force && this.env.action != 'show' && !$('#'+this.env.contentframe).is(':visible')) {
+  if (!force && this.env.action != 'show') {
     var uid = this.message_list.get_single_selection(),
       lock = this.set_busy(true, 'loading');
 
diff --git a/lib/plugins/managesieve/managesieve.php b/lib/plugins/managesieve/managesieve.php
index 478f26b..f41394e 100644
--- a/lib/plugins/managesieve/managesieve.php
+++ b/lib/plugins/managesieve/managesieve.php
@@ -51,7 +51,9 @@ class managesieve extends rcube_plugin
         }
         else if ($this->rc->task == 'mail') {
             // register message hook
-            $this->add_hook('message_headers_output', array($this, 'mail_headers'));
+            if ($this->rc->action == 'show') {
+                $this->add_hook('message_headers_output', array($this, 'mail_headers'));
+            }
 
             // inject Create Filter popup stuff
             if (empty($this->rc->action) || $this->rc->action == 'show'
@@ -83,14 +85,10 @@ class managesieve extends rcube_plugin
         // include styles
         $skin_path = $this->local_skin_path();
         if ($this->rc->task == 'settings' || $sieve_action) {
-            if (is_file($this->home . "/$skin_path/managesieve.css")) {
-                $this->include_stylesheet("$skin_path/managesieve.css");
-            }
+            $this->include_stylesheet("$skin_path/managesieve.css");
         }
         else {
-            if (is_file($this->home . "/$skin_path/managesieve_mail.css")) {
-                $this->include_stylesheet("$skin_path/managesieve_mail.css");
-            }
+            $this->include_stylesheet("$skin_path/managesieve_mail.css");
         }
 
         $this->ui_initialized = true;
@@ -192,9 +190,10 @@ class managesieve extends rcube_plugin
     function managesieve_actions()
     {
         // handle fetching email headers for the new filter form
-        if ($uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GPC)) {
-            $mailbox = $this->rc->get_storage()->get_folder();
-            $message = new rcube_message($uid, $mailbox);
+        if ($uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) {
+            $uids    = rcmail::get_uids();
+            $mailbox = key($uids);
+            $message = new rcube_message($uids[$mailbox][0], $mailbox);
             $headers = $this->parse_headers($message->headers);
 
             $this->rc->output->set_env('sieve_headers', $headers);
diff --git a/lib/plugins/managesieve/package.xml b/lib/plugins/managesieve/package.xml
deleted file mode 100644
index f4c4bb9..0000000
--- a/lib/plugins/managesieve/package.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-    http://pear.php.net/dtd/tasks-1.0.xsd
-    http://pear.php.net/dtd/package-2.0
-    http://pear.php.net/dtd/package-2.0.xsd">
-	<name>managesieve</name>
-	<channel>pear.roundcube.net</channel>
-	<summary>Sieve filters manager for Roundcube</summary>
-	<description>
-	    Adds a possibility to manage Sieve scripts (incoming mail filters).
-        It's clickable interface which operates on text scripts and communicates
-        with server using managesieve protocol. Adds Filters tab in Settings.
-	</description>
-	<lead>
-		<name>Aleksander Machniak</name>
-		<user>alec</user>
-		<email>alec at alec.pl</email>
-		<active>yes</active>
-	</lead>
-	<date>2014-02-14</date>
-	<version>
-		<release>7.2</release>
-		<api>7.0</api>
-	</version>
-	<stability>
-		<release>stable</release>
-		<api>stable</api>
-	</stability>
-	<license uri="http://www.gnu.org/licenses/gpl.html">GNU GPLv3+</license>
-    <notes>-</notes>
-	<contents>
-		<dir baseinstalldir="/" name="/">
-			<file name="managesieve.php" role="php">
-				<tasks:replace from="@name@" to="name" type="package-info"/>
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="managesieve.js" role="data">
-				<tasks:replace from="@name@" to="name" type="package-info"/>
-				<tasks:replace from="@package_version@" to="version" type="package-info"/>
-			</file>
-			<file name="lib/Roundcube/rcube_sieve.php" role="php"></file>
-			<file name="lib/Roundcube/rcube_sieve_engine.php" role="php"></file>
-			<file name="lib/Roundcube/rcube_sieve_script.php" role="php"></file>
-			<file name="lib/Net/Sieve.php" role="php"></file>
-			<file name="localization/be_BE.inc" role="data"></file>
-			<file name="localization/bg_BG.inc" role="data"></file>
-			<file name="localization/bs_BA.inc" role="data"></file>
-			<file name="localization/ca_ES_BA.inc" role="data"></file>
-			<file name="localization/cs_CZ.inc" role="data"></file>
-			<file name="localization/cy_GB.inc" role="data"></file>
-			<file name="localization/da_DK.inc" role="data"></file>
-			<file name="localization/de_CH.inc" role="data"></file>
-			<file name="localization/de_DE.inc" role="data"></file>
-			<file name="localization/el_GR.inc" role="data"></file>
-			<file name="localization/en_GB.inc" role="data"></file>
-			<file name="localization/en_US.inc" role="data"></file>
-			<file name="localization/eo.inc" role="data"></file>
-			<file name="localization/es_AR.inc" role="data"></file>
-			<file name="localization/es_ES.inc" role="data"></file>
-			<file name="localization/et_EE.inc" role="data"></file>
-			<file name="localization/fa_IR.inc" role="data"></file>
-			<file name="localization/fi_FI.inc" role="data"></file>
-			<file name="localization/fr_FR.inc" role="data"></file>
-			<file name="localization/gl_ES.inc" role="data"></file>
-			<file name="localization/he_IL.inc" role="data"></file>
-			<file name="localization/hr_HR.inc" role="data"></file>
-			<file name="localization/hu_HU.inc" role="data"></file>
-			<file name="localization/ia_IA.inc" role="data"></file>
-			<file name="localization/id_ID.inc" role="data"></file>
-			<file name="localization/it_IT.inc" role="data"></file>
-			<file name="localization/ja_JP.inc" role="data"></file>
-			<file name="localization/lt_LT.inc" role="data"></file>
-			<file name="localization/lv_LV.inc" role="data"></file>
-			<file name="localization/ml_ML.inc" role="data"></file>
-			<file name="localization/mr_IN.inc" role="data"></file>
-			<file name="localization/nb_NO.inc" role="data"></file>
-			<file name="localization/nl_NL.inc" role="data"></file>
-			<file name="localization/pl_PL.inc" role="data"></file>
-			<file name="localization/pt_BR.inc" role="data"></file>
-			<file name="localization/pt_PT.inc" role="data"></file>
-			<file name="localization/ro_RO.inc" role="data"></file>
-			<file name="localization/ru_RU.inc" role="data"></file>
-			<file name="localization/si_LK.inc" role="data"></file>
-			<file name="localization/sk_SK.inc" role="data"></file>
-			<file name="localization/sl_SI.inc" role="data"></file>
-			<file name="localization/sv_SE.inc" role="data"></file>
-			<file name="localization/tr_TR.inc" role="data"></file>
-			<file name="localization/uk_UA.inc" role="data"></file>
-			<file name="localization/vi_VN.inc" role="data"></file>
-			<file name="localization/zh_CN.inc" role="data"></file>
-			<file name="localization/zh_TW.inc" role="data"></file>
-			<file name="skins/classic/managesieve.css" role="data"></file>
-			<file name="skins/classic/managesieve_mail.css" role="data"></file>
-			<file name="skins/classic/templates/filteredit.html" role="data"></file>
-			<file name="skins/classic/templates/managesieve.html" role="data"></file>
-			<file name="skins/classic/templates/setedit.html" role="data"></file>
-			<file name="skins/classic/images/add.png" role="data"></file>
-			<file name="skins/classic/images/del.png" role="data"></file>
-			<file name="skins/classic/images/down_small.gif" role="data"></file>
-			<file name="skins/classic/images/erase.png" role="data"></file>
-			<file name="skins/classic/images/filter.png" role="data"></file>
-			<file name="skins/classic/images/up_small.gif" role="data"></file>
-			<file name="skins/larry/managesieve.css" role="data"></file>
-			<file name="skins/larry/managesieve_mail.css" role="data"></file>
-			<file name="skins/larry/templates/filteredit.html" role="data"></file>
-			<file name="skins/larry/templates/managesieve.html" role="data"></file>
-			<file name="skins/larry/templates/setedit.html" role="data"></file>
-			<file name="skins/larry/images/add.png" role="data"></file>
-			<file name="skins/larry/images/del.png" role="data"></file>
-			<file name="skins/larry/images/down_small.gif" role="data"></file>
-			<file name="skins/larry/images/erase.png" role="data"></file>
-			<file name="skins/larry/images/up_small.gif" role="data"></file>
-			<file name="config.inc.php.dist" role="data"></file>
-		</dir>
-		<!-- / -->
-	</contents>
-	<dependencies>
-		<required>
-			<php>
-				<min>5.2.1</min>
-			</php>
-			<pearinstaller>
-				<min>1.7.0</min>
-			</pearinstaller>
-		</required>
-	</dependencies>
-	<phprelease/>
-</package>
diff --git a/lib/plugins/managesieve/skins/larry/managesieve.css b/lib/plugins/managesieve/skins/larry/managesieve.css
index 61d1c89..47e992c 100644
--- a/lib/plugins/managesieve/skins/larry/managesieve.css
+++ b/lib/plugins/managesieve/skins/larry/managesieve.css
@@ -309,19 +309,10 @@ a.button.disabled
   max-width: 280px;
 }
 
-html.mozilla #filter-form select
-{
-  padding-top: 3px;
-  padding-bottom: 3px;
-}
-
 /* revert larry style button */
 #filter-form input.button
 {
-  padding-bottom: 2px;
-  padding-left: 5px;
-  padding-right: 5px;
-  padding-top: 2px;
+  padding: inherit;
 }
 
 fieldset
diff --git a/lib/plugins/managesieve/tests/Managesieve.php b/lib/plugins/managesieve/tests/Managesieve.php
index d802f56..6e930b8 100644
--- a/lib/plugins/managesieve/tests/Managesieve.php
+++ b/lib/plugins/managesieve/tests/Managesieve.php
@@ -5,7 +5,7 @@ class Managesieve_Plugin extends PHPUnit_Framework_TestCase
 
     function setUp()
     {
-        include_once dirname(__FILE__) . '/../managesieve.php';
+        include_once __DIR__ . '/../managesieve.php';
     }
 
     /**
diff --git a/lib/plugins/managesieve/tests/Parser.php b/lib/plugins/managesieve/tests/Parser.php
index 9050f09..33edce0 100644
--- a/lib/plugins/managesieve/tests/Parser.php
+++ b/lib/plugins/managesieve/tests/Parser.php
@@ -5,7 +5,7 @@ class Parser extends PHPUnit_Framework_TestCase
 
     function setUp()
     {
-        include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_script.php';
+        include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_script.php';
     }
 
     /**
@@ -34,7 +34,7 @@ class Parser extends PHPUnit_Framework_TestCase
      */
     function data_parser()
     {
-        $dir_path = realpath(dirname(__FILE__) . '/src');
+        $dir_path = realpath(__DIR__ . '/src');
         $dir      = opendir($dir_path);
         $result   = array();
 
diff --git a/lib/plugins/managesieve/tests/Tokenizer.php b/lib/plugins/managesieve/tests/Tokenizer.php
index e71bae0..f50ed75 100644
--- a/lib/plugins/managesieve/tests/Tokenizer.php
+++ b/lib/plugins/managesieve/tests/Tokenizer.php
@@ -5,7 +5,7 @@ class Tokenizer extends PHPUnit_Framework_TestCase
 
     function setUp()
     {
-        include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_script.php';
+        include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_script.php';
     }
 
     function data_tokenizer()
diff --git a/lib/plugins/managesieve/tests/Vacation.php b/lib/plugins/managesieve/tests/Vacation.php
index e34eb7a..942525c 100644
--- a/lib/plugins/managesieve/tests/Vacation.php
+++ b/lib/plugins/managesieve/tests/Vacation.php
@@ -5,8 +5,8 @@ class Managesieve_Vacation extends PHPUnit_Framework_TestCase
 
     function setUp()
     {
-        include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_engine.php';
-        include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_vacation.php';
+        include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_engine.php';
+        include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_vacation.php';
     }
 
     /**




More information about the commits mailing list