Merge branch '2016.11-develop' into 2017.02 2017.02
authorPhilipp Schüle <p.schuele@metaways.de>
Wed, 2 Aug 2017 07:57:09 +0000 (09:57 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 2 Aug 2017 07:57:09 +0000 (09:57 +0200)
Change-Id: I2777aae751aae52bf381399950e07c52fba7b9a1

15 files changed:
1  2 
tine20/Addressbook/translations/template.pot
tine20/Felamimail/Controller/Message/Send.php
tine20/Timetracker/Setup/Update/Release10.php
tine20/Timetracker/Setup/setup.xml
tine20/Timetracker/js/TimesheetEditDialog.js
tine20/Tinebase/Config.php
tine20/Tinebase/Container.php
tine20/Tinebase/Frontend/Cli.php
tine20/Tinebase/Record/Abstract.php
tine20/Tinebase/Server/WebDAV.php
tine20/Tinebase/js/LoginPanel.js
tine20/Tinebase/js/tineInit.js
tine20/Tinebase/js/widgets/tags/TagsPanel.js
tine20/composer.json
tine20/composer.lock

@@@ -13,418 -13,344 +13,460 @@@ msgstr "
  "X-Poedit-SourceCharset: utf-8\n"
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
  
 -#: js/ContactFilterModel.js:35 js/ContactGrid.js:162 js/Model.js:100
 -#: js/Model.js:185
 -msgid "Contact"
 -msgid_plural "Contacts"
 +#: Export/Pdf.php:37
 +msgid "Business Contact Data"
 +msgstr ""
 +
 +#: Export/Pdf.php:39
 +msgid "Organisation / Unit"
 +msgstr ""
 +
 +#: Export/Pdf.php:44
 +msgid "Business Address"
 +msgstr ""
 +
- #: Export/Pdf.php:52 js/ContactGrid.js:306
++#: Export/Pdf.php:52 js/ContactGrid.js:306 js/ContactGrid.js:232
 +msgid "Email"
 +msgstr ""
 +
 +#: Export/Pdf.php:55
 +msgid "Telephone Work"
 +msgstr ""
 +
 +#: Export/Pdf.php:58
 +msgid "Telephone Cellphone"
 +msgstr ""
 +
 +#: Export/Pdf.php:61
 +msgid "Telephone Car"
 +msgstr ""
 +
 +#: Export/Pdf.php:64
 +msgid "Telephone Fax"
 +msgstr ""
 +
 +#: Export/Pdf.php:67
 +msgid "Telephone Page"
 +msgstr ""
 +
 +#: Export/Pdf.php:70
 +msgid "URL"
 +msgstr ""
 +
 +#: Export/Pdf.php:73
 +msgid "Role"
 +msgstr ""
 +
 +#: Export/Pdf.php:76 js/ContactEditDialog.js:165 js/Model.js:33
- #: js/ContactGrid.js:295
++#: js/ContactGrid.js:295 js/ContactEditDialog.js:186 js/ContactGrid.js:220
 +msgid "Room"
 +msgstr ""
 +
 +#: Export/Pdf.php:79
 +msgid "Assistant"
 +msgstr ""
 +
 +#: Export/Pdf.php:82
 +msgid "Assistant Telephone"
 +msgstr ""
 +
 +#: Export/Pdf.php:86
 +msgid "Private Contact Data"
 +msgstr ""
 +
- #: Export/Pdf.php:88 js/ContactEditDialog.js:326 js/Model.js:43
- #: js/Model.js:179 js/Model.js:180 js/Model.js:181 js/Model.js:182
- #: js/Model.js:183
++#: Export/Pdf.php:88 js/ContactEditDialog.js:326 js/Model.js:43 js/Model.js:179
++#: js/Model.js:180 js/Model.js:181 js/Model.js:182 js/Model.js:183
++#: js/ContactEditDialog.js:355 js/Model.js:210 js/Model.js:211 js/Model.js:212
++#: js/Model.js:213 js/Model.js:214 js/Printer/ContactRecord.js:72
 +msgid "Private Address"
 +msgstr ""
 +
 +#: Export/Pdf.php:96
 +msgid "Email Home"
 +msgstr ""
 +
 +#: Export/Pdf.php:99
 +msgid "Telephone Home"
 +msgstr ""
 +
 +#: Export/Pdf.php:102
 +msgid "Telephone Cellphone Private"
 +msgstr ""
 +
 +#: Export/Pdf.php:105
 +msgid "Telephone Fax Home"
 +msgstr ""
 +
 +#: Export/Pdf.php:108
 +msgid "URL Home"
 +msgstr ""
 +
 +#: Export/Pdf.php:112
 +msgid "Other Data"
 +msgstr ""
 +
 +#: Export/Pdf.php:114 js/ContactEditDialog.js:192 js/Model.js:26
- #: js/Model.js:173 js/ContactGrid.js:321
++#: js/Model.js:173 js/ContactGrid.js:321 js/ContactEditDialog.js:221
++#: js/ContactGrid.js:247 js/Model.js:204
 +msgid "Birthday"
 +msgstr ""
 +
 +#: Export/Pdf.php:117 js/ContactEditDialog.js:186 js/Model.js:30
- #: js/Model.js:168 js/ContactGrid.js:293
++#: js/Model.js:168 js/ContactGrid.js:293 js/ContactEditDialog.js:215
++#: js/ContactGrid.js:218 js/Model.js:199
 +msgid "Job Title"
 +msgstr ""
 +
 +#: Export/Doc.php:63
 +msgid "Dear Mister"
 +msgstr ""
 +
 +#: Export/Doc.php:65
 +msgid "Dear Miss"
 +msgstr ""
 +
 +#: Export/Doc.php:67
 +msgid "Dear"
 +msgstr ""
 +
 +#: Export/Doc.php:83
 +msgid "Mister"
 +msgstr ""
 +
 +#: Export/Doc.php:85
 +msgid "Misses"
 +msgstr ""
 +
 +#: Controller.php:129
 +#, python-format
 +msgid "%s's personal addressbook"
 +msgstr ""
 +
 +#: Controller.php:184 js/Model.js:240 js/ListGridDetailsPanel.js:57
- #: js/ListGridDetailsPanel.js:83
++#: js/ListGridDetailsPanel.js:83 js/Model.js:282
 +msgid "Lists"
 +msgstr ""
 +
 +#: Controller.php:193 js/Model.js:338 js/ContactGrid.js:322
- #: js/ListRoleGridPanel.js:50
++#: js/ListRoleGridPanel.js:50 js/ContactGrid.js:248 js/Model.js:380
 +msgid "List Roles"
 +msgstr ""
 +
- #: Controller.php:201 js/Model.js:369
++#: Controller.php:201 js/Model.js:369 js/Model.js:411 Controller.php:202
 +msgid "Industries"
 +msgstr ""
 +
 +#: Acl/Rights.php:122
 +msgid "manage shared addressbooks"
 +msgstr ""
 +
 +#: Acl/Rights.php:123
 +msgid "Create new shared addressbook folders"
 +msgstr ""
 +
 +#: Acl/Rights.php:126
 +msgid "manage shared addressbook favorites"
 +msgstr ""
 +
 +#: Acl/Rights.php:127
 +msgid "Create or update shared addressbook favorites"
 +msgstr ""
 +
 +#: Acl/Rights.php:130
 +msgid "Manage lists in CoreData"
 +msgstr ""
 +
 +#: Acl/Rights.php:131
 +msgid "View, create, delete or update lists in CoreData application"
 +msgstr ""
 +
 +#: Acl/Rights.php:134
 +msgid "Manage list roles in CoreData"
 +msgstr ""
 +
 +#: Acl/Rights.php:135
 +msgid "View, create, delete or update list roles in CoreData application"
 +msgstr ""
 +
 +#: Model/Contact.php:557 js/ContactEditDialog.js:145 js/Model.js:369
++#: js/ContactEditDialog.js:209 js/ContactGrid.js:251 js/Model.js:411
 +msgid "Industry"
 +msgid_plural "Industries"
  msgstr[0] ""
  msgstr[1] ""
  
 -#: js/MapPanel.js:40 js/ContactEditDialog.js:45 js/ContactEditDialog.js:54
 -msgid "Map"
 +#: js/ListSearchCombo.js:27
 +msgid "Search for system groups ..."
  msgstr ""
  
 -#: js/MapPanel.js:58
 -msgid "Company address"
 +#: js/ListSearchCombo.js:28
 +msgid "Search for groups ..."
  msgstr ""
  
 -#: js/MapPanel.js:65
 -msgid "Private address"
 +#: js/CardDAVContainerPropertiesHookField.js:35
 +msgid "CardDAV URL"
  msgstr ""
  
 -#: js/ListMemberFilterModel.js:37
 -msgid "Member of List"
 -msgstr ""
 +#: js/ContactFilterModel.js:35 js/Model.js:97 js/Model.js:154
- #: js/ContactGrid.js:255
++#: js/ContactGrid.js:255 js/ContactGrid.js:162 js/Model.js:100 js/Model.js:185
 +msgid "Contact"
 +msgid_plural "Contacts"
 +msgstr[0] ""
 +msgstr[1] ""
  
- #: js/ListRoleMemberFilterModel.js:37 js/Model.js:338
 -#: js/contactListsGridPanel.js:55 js/ContactGrid.js:200 js/Model.js:215
 -#: js/ListGrid.js:100
 -msgid "Type"
++#: js/ListRoleMemberFilterModel.js:37 js/Model.js:338 js/Model.js:380
 +msgid "List Role"
 +msgid_plural "List Roles"
 +msgstr[0] ""
 +msgstr[1] ""
 +
 +#: js/ListMemberRoleGridPanel.js:37 js/ListRoleGridPanel.js:71
++#: js/Printer/ListRecord.js:40
 +msgid "Members"
  msgstr ""
  
- #: js/ListMemberRoleGridPanel.js:207
 -#: js/contactListsGridPanel.js:56 js/Model.js:19 js/Model.js:302
 -#: js/ListRoleGridPanel.js:65 js/Addressbook.js:75 js/Addressbook.js:110
 -#: js/ListEditDialog.js:98 js/ListEditDialog.js:181 js/ListGrid.js:102
 -msgid "Name"
++#: js/ListMemberRoleGridPanel.js:207 js/ListMemberRoleGridPanel.js:221
 +msgid "Remove Member"
  msgstr ""
  
 -#: js/ContactEditDialog.js:64 js/ContactEditDialog.js:79 js/ContactGrid.js:231
 -#: js/Model.js:51
 -msgid "Preferred Address"
 +#: js/ContactEditDialog.js:42 js/ContactEditDialog.js:51 js/MapPanel.js:40
++#: js/ContactEditDialog.js:45 js/ContactEditDialog.js:54
 +msgid "Map"
  msgstr ""
  
- #: js/ContactEditDialog.js:80
 -#: js/ContactEditDialog.js:114
++#: js/ContactEditDialog.js:80 js/ContactEditDialog.js:114
  msgid "Personal Information"
  msgstr ""
  
 -#: js/ContactEditDialog.js:130 js/ContactGrid.js:202 js/Model.js:29
 +#: js/ContactEditDialog.js:96 js/Model.js:29 js/Model.js:190
- #: js/ContactGrid.js:277
++#: js/ContactGrid.js:277 js/ContactEditDialog.js:130 js/ContactGrid.js:202
+ #: js/Model.js:221
  msgid "Salutation"
  msgstr ""
  
 -#: js/ContactEditDialog.js:146 js/ContactGrid.js:210 js/Model.js:22
 +#: js/ContactEditDialog.js:112 js/Model.js:22 js/Model.js:161
- #: js/ContactGrid.js:285
++#: js/ContactGrid.js:285 js/ContactEditDialog.js:146 js/ContactGrid.js:210
+ #: js/Model.js:192
  msgid "Title"
  msgstr ""
  
 -#: js/ContactEditDialog.js:151 js/ContactGrid.js:213 js/Model.js:20
 +#: js/ContactEditDialog.js:117 js/Model.js:20 js/Model.js:162
- #: js/ContactGrid.js:288
++#: js/ContactGrid.js:288 js/ContactEditDialog.js:151 js/ContactGrid.js:213
+ #: js/Model.js:193
  msgid "First Name"
  msgstr ""
  
 -#: js/ContactEditDialog.js:156 js/ContactGrid.js:211 js/Model.js:21
 +#: js/ContactEditDialog.js:122 js/Model.js:21 js/Model.js:164
- #: js/ContactGrid.js:286
++#: js/ContactGrid.js:286 js/ContactEditDialog.js:156 js/ContactGrid.js:211
+ #: js/Model.js:195
  msgid "Middle Name"
  msgstr ""
  
 -#: js/ContactEditDialog.js:161 js/ContactGrid.js:212 js/Model.js:19
 +#: js/ContactEditDialog.js:127 js/Model.js:19 js/Model.js:163
- #: js/ContactGrid.js:287
++#: js/ContactGrid.js:287 js/ContactEditDialog.js:161 js/ContactGrid.js:212
+ #: js/Model.js:194
  msgid "Last Name"
  msgstr ""
  
 -#: js/ContactEditDialog.js:167 js/ContactGrid.js:216 js/Model.js:27
 -#: js/Model.js:196 Config.php:165 Setup/Update/Release5.php:196
 +#: js/ContactEditDialog.js:133 js/Model.js:27 js/Model.js:165
 +#: js/ContactGridDetailsPanel.js:131 js/ContactGrid.js:291 Config.php:110
- #: Setup/Update/Release5.php:196
++#: Setup/Update/Release5.php:196 js/ContactEditDialog.js:167
++#: js/ContactGrid.js:216 js/Model.js:196 Config.php:165
  msgid "Company"
  msgstr ""
  
 -#: js/ContactEditDialog.js:172 js/ContactGrid.js:217 js/Model.js:28
 +#: js/ContactEditDialog.js:138 js/Model.js:28 js/Model.js:166
- #: js/ContactGrid.js:292
++#: js/ContactGrid.js:292 js/ContactEditDialog.js:172 js/ContactGrid.js:217
+ #: js/Model.js:197
  msgid "Unit"
  msgstr ""
  
- #: js/ContactEditDialog.js:157 js/Model.js:23
 -#: js/ContactEditDialog.js:178 js/Model.js:23
++#: js/ContactEditDialog.js:157 js/Model.js:23 js/ContactEditDialog.js:178
  msgid "Suffix"
  msgstr ""
  
 -#: js/ContactEditDialog.js:182 js/ContactGrid.js:219 js/Model.js:31
 +#: js/ContactEditDialog.js:161 js/Model.js:31 js/Model.js:172
- #: js/ContactGrid.js:294
++#: js/ContactGrid.js:294 js/ContactEditDialog.js:182 js/ContactGrid.js:219
+ #: js/Model.js:203
  msgid "Job Role"
  msgstr ""
  
 -#: js/ContactEditDialog.js:186 js/ContactGrid.js:220 js/Model.js:33
 -#: Export/Pdf.php:76
 -msgid "Room"
 -msgstr ""
 -
 -#: js/ContactEditDialog.js:203 js/ContactGrid.js:215 js/Model.js:24
 +#: js/ContactEditDialog.js:181 js/Model.js:24 js/ContactGrid.js:290
++#: js/ContactEditDialog.js:203 js/ContactGrid.js:215
  msgid "Display Name"
  msgstr ""
  
- #: js/ContactEditDialog.js:200
 -#: js/ContactEditDialog.js:209 js/ContactGrid.js:251 js/Model.js:411
 -msgid "Industry"
 -msgid_plural "Industries"
 -msgstr[0] ""
 -msgstr[1] ""
 -
 -#: js/ContactEditDialog.js:215 js/ContactGrid.js:218 js/Model.js:30
 -#: js/Model.js:199 Export/Pdf.php:117
 -msgid "Job Title"
 -msgstr ""
 -
 -#: js/ContactEditDialog.js:221 js/ContactGrid.js:247 js/Model.js:26
 -#: js/Model.js:204 Export/Pdf.php:114
 -msgid "Birthday"
 -msgstr ""
 -
 -#: js/ContactEditDialog.js:229 js/Printer/ContactRecord.js:42
++#: js/ContactEditDialog.js:200 js/ContactEditDialog.js:229
++#: js/Printer/ContactRecord.js:42
  msgid "Contact Information"
  msgstr ""
  
 -#: js/ContactEditDialog.js:238 js/ContactGridDetailsPanel.js:117
 -#: js/ContactGrid.js:233 js/Model.js:52 js/Model.js:198
 +#: js/ContactEditDialog.js:209 js/Model.js:51 js/Model.js:167
 +#: js/ContactGridDetailsPanel.js:139 js/ContactGridDetailsPanel.js:163
- #: js/ContactGrid.js:307
++#: js/ContactGrid.js:307 js/ContactEditDialog.js:238
++#: js/ContactGridDetailsPanel.js:117 js/ContactGrid.js:233 js/Model.js:52
++#: js/Model.js:198
  msgid "Phone"
  msgstr ""
  
- #: js/ContactEditDialog.js:214 js/Model.js:52
- #: js/ContactGridDetailsPanel.js:140 js/ContactGridDetailsPanel.js:164
- #: js/ContactGrid.js:308
++#: js/ContactEditDialog.js:214 js/Model.js:52 js/ContactGridDetailsPanel.js:140
++#: js/ContactGridDetailsPanel.js:164 js/ContactGrid.js:308
+ #: js/ContactEditDialog.js:243 js/ContactGridDetailsPanel.js:121
+ #: js/ContactGrid.js:234 js/Model.js:53
  msgid "Mobile"
  msgstr ""
  
- #: js/ContactEditDialog.js:219 js/Model.js:53
- #: js/ContactGridDetailsPanel.js:141 js/ContactGridDetailsPanel.js:165
- #: js/ContactGrid.js:309
++#: js/ContactEditDialog.js:219 js/Model.js:53 js/ContactGridDetailsPanel.js:141
++#: js/ContactGridDetailsPanel.js:165 js/ContactGrid.js:309
+ #: js/ContactEditDialog.js:248 js/ContactGridDetailsPanel.js:125
+ #: js/ContactGrid.js:235 js/Model.js:54
  msgid "Fax"
  msgstr ""
  
 +#: js/ContactEditDialog.js:224 js/Model.js:57 js/ContactGrid.js:312
+ #: js/ContactEditDialog.js:253 js/ContactGrid.js:238 js/Model.js:58
  msgid "Phone (private)"
  msgstr ""
  
 +#: js/ContactEditDialog.js:229 js/Model.js:59 js/ContactGrid.js:314
+ #: js/ContactEditDialog.js:258 js/ContactGrid.js:240 js/Model.js:60
  msgid "Mobile (private)"
  msgstr ""
  
 +#: js/ContactEditDialog.js:234 js/Model.js:58 js/ContactGrid.js:313
+ #: js/ContactEditDialog.js:263 js/ContactGrid.js:239 js/Model.js:59
  msgid "Fax (private)"
  msgstr ""
  
 +#: js/ContactEditDialog.js:239 js/Model.js:62 js/Model.js:170
 +#: js/ContactGridDetailsPanel.js:142 js/ContactGridDetailsPanel.js:166
+ #: js/ContactEditDialog.js:268 js/ContactGridDetailsPanel.js:129 js/Model.js:63
+ #: js/Model.js:201
  msgid "E-Mail"
  msgstr ""
  
- #: js/ContactEditDialog.js:245 js/Model.js:63
 -#: js/ContactEditDialog.js:274 js/Model.js:64
++#: js/ContactEditDialog.js:245 js/Model.js:63 js/ContactEditDialog.js:274
++#: js/Model.js:64
  msgid "E-Mail (private)"
  msgstr ""
  
- #: js/ContactEditDialog.js:252 js/Model.js:64
- #: js/ContactGridDetailsPanel.js:144 js/ContactGridDetailsPanel.js:168
- #: js/ContactGrid.js:316
++#: js/ContactEditDialog.js:252 js/Model.js:64 js/ContactGridDetailsPanel.js:144
++#: js/ContactGridDetailsPanel.js:168 js/ContactGrid.js:316
+ #: js/ContactEditDialog.js:281 js/ContactGridDetailsPanel.js:135
+ #: js/ContactGrid.js:242 js/Model.js:65
  msgid "Web"
  msgstr ""
  
 -#: js/ContactEditDialog.js:326 js/Model.js:34 js/Model.js:205 js/Model.js:206
 -#: js/Model.js:207 js/Model.js:208 js/Model.js:209
 -#: js/Printer/ContactRecord.js:67
 +#: js/ContactEditDialog.js:297 js/Model.js:34 js/Model.js:174 js/Model.js:175
- #: js/Model.js:176 js/Model.js:177 js/Model.js:178
++#: js/Model.js:176 js/Model.js:177 js/Model.js:178 js/ContactEditDialog.js:326
++#: js/Model.js:205 js/Model.js:206 js/Model.js:207 js/Model.js:208
++#: js/Model.js:209 js/Printer/ContactRecord.js:67
  msgid "Company Address"
  msgstr ""
  
 -#: js/ContactEditDialog.js:329 js/ContactEditDialog.js:358
 +#: js/ContactEditDialog.js:300 js/ContactEditDialog.js:329 js/Model.js:174
- #: js/Model.js:179 js/ContactGrid.js:296
++#: js/Model.js:179 js/ContactGrid.js:296 js/ContactEditDialog.js:358
+ #: js/ContactGrid.js:221 js/Model.js:205 js/Model.js:210
  msgid "Street"
  msgstr ""
  
 -#: js/ContactEditDialog.js:333 js/ContactEditDialog.js:362
 +#: js/ContactEditDialog.js:304 js/ContactEditDialog.js:333
++#: js/ContactEditDialog.js:362
  msgid "Street 2"
  msgstr ""
  
 -#: js/ContactEditDialog.js:337 js/ContactEditDialog.js:366
 +#: js/ContactEditDialog.js:308 js/ContactEditDialog.js:337 js/Model.js:175
- #: js/Model.js:180 js/ContactGrid.js:298
++#: js/Model.js:180 js/ContactGrid.js:298 js/ContactEditDialog.js:366
+ #: js/ContactGrid.js:223 js/Model.js:206 js/Model.js:211
  msgid "Region"
  msgstr ""
  
 -#: js/ContactEditDialog.js:341 js/ContactEditDialog.js:370 js/Model.js:207
 -#: js/Model.js:212
 +#: js/ContactEditDialog.js:312 js/ContactEditDialog.js:341 js/Model.js:176
- #: js/Model.js:181
++#: js/Model.js:181 js/ContactEditDialog.js:370 js/Model.js:207 js/Model.js:212
  msgid "Postal Code"
  msgstr ""
  
 -#: js/ContactEditDialog.js:345 js/ContactEditDialog.js:374
 +#: js/ContactEditDialog.js:316 js/ContactEditDialog.js:345 js/Model.js:177
- #: js/Model.js:182 js/ContactGrid.js:297
++#: js/Model.js:182 js/ContactGrid.js:297 js/ContactEditDialog.js:374
+ #: js/ContactGrid.js:222 js/Model.js:208 js/Model.js:213
  msgid "City"
  msgstr ""
  
 -#: js/ContactEditDialog.js:350 js/ContactEditDialog.js:379
 +#: js/ContactEditDialog.js:321 js/ContactEditDialog.js:350 js/Model.js:178
- #: js/Model.js:183 js/ContactGrid.js:300
++#: js/Model.js:183 js/ContactGrid.js:300 js/ContactEditDialog.js:379
+ #: js/ContactGrid.js:225 js/Model.js:209 js/Model.js:214
  msgid "Country"
  msgstr ""
  
 -#: js/ContactEditDialog.js:355 js/Model.js:43 js/Model.js:210 js/Model.js:211
 -#: js/Model.js:212 js/Model.js:213 js/Model.js:214
 -#: js/Printer/ContactRecord.js:72 Export/Pdf.php:88
 -msgid "Private Address"
 -msgstr ""
 -
 +#: js/ContactEditDialog.js:376 js/Addressbook.js:80 js/Addressbook.js:115
 +#: js/Model.js:68 js/Model.js:169 js/Model.js:261 js/ListEditDialog.js:118
+ #: js/ContactEditDialog.js:405 js/Model.js:69 js/Model.js:200 js/Model.js:303
+ #: js/Addressbook.js:81 js/Addressbook.js:116 js/ListEditDialog.js:133
  msgid "Description"
  msgstr ""
  
 +#: js/ContactEditDialog.js:390 js/ListEditDialog.js:132
+ #: js/ContactEditDialog.js:419 js/ListEditDialog.js:147
  msgid "Enter description"
  msgstr ""
  
 -#: js/ContactEditDialog.js:423 js/Model.js:83
 -msgid "Groups"
 +#: js/ContactEditDialog.js:428
 +msgid "Export as pdf"
  msgstr ""
  
 +#: js/ContactEditDialog.js:435 js/ContactEditDialog.js:479
+ #: js/ContactEditDialog.js:466 js/ContactEditDialog.js:524
  msgid "Parse address"
  msgstr ""
  
- #: js/ContactEditDialog.js:471
 -#: js/ContactEditDialog.js:474
 -msgid "Print contact"
 -msgstr ""
 -
 -#: js/ContactEditDialog.js:516
++#: js/ContactEditDialog.js:471 js/ContactEditDialog.js:516
  msgid "Paste address"
  msgstr ""
  
- #: js/ContactEditDialog.js:471
 -#: js/ContactEditDialog.js:516
++#: js/ContactEditDialog.js:471 js/ContactEditDialog.js:516
  msgid "Please paste an address or a URI to a vcard that should be parsed:"
  msgstr ""
  
- #: js/ContactEditDialog.js:497
 -#: js/ContactEditDialog.js:542
++#: js/ContactEditDialog.js:497 js/ContactEditDialog.js:542
  msgid "Failed to parse address!"
  msgstr ""
  
- #: js/ContactEditDialog.js:497
 -#: js/ContactEditDialog.js:542
++#: js/ContactEditDialog.js:497 js/ContactEditDialog.js:542
  msgid "The address could not be read."
  msgstr ""
  
- #: js/ContactEditDialog.js:514
 -#: js/ContactEditDialog.js:559
++#: js/ContactEditDialog.js:514 js/ContactEditDialog.js:559
  msgid "End token mode"
  msgstr ""
  
 -#: js/ContactGridDetailsPanel.js:79 js/ContactGrid.js:187
 -msgid "Business"
 -msgstr ""
 -
 -#: js/ContactGridDetailsPanel.js:148 js/ContactGrid.js:189
 -msgid "Private"
 -msgstr ""
 -
 -#: js/ContactGrid.js:110
 -msgid "Import contacts"
 -msgstr ""
 -
 -#: js/ContactGrid.js:162
 -msgid "Contact of a user account"
 -msgstr ""
 -
 -#: js/ContactGrid.js:169
 -msgid "No name"
 -msgstr ""
 -
 -#: js/ContactGrid.js:191
 -msgid "Not set"
 -msgstr ""
 -
 -#: js/ContactGrid.js:201 js/ListGrid.js:101
 -msgid "Tags"
 -msgstr ""
 -
 -#: js/ContactGrid.js:214
 -msgid "Full Name"
 -msgstr ""
 -
 -#: js/ContactGrid.js:224
 -msgid "Postalcode"
 -msgstr ""
 -
 -#: js/ContactGrid.js:226
 -msgid "Street (private)"
 -msgstr ""
 -
 -#: js/ContactGrid.js:227
 -msgid "City (private)"
 -msgstr ""
 -
 -#: js/ContactGrid.js:228
 -msgid "Region (private)"
 -msgstr ""
 -
 -#: js/ContactGrid.js:229
 -msgid "Postalcode (private)"
 -msgstr ""
 -
 -#: js/ContactGrid.js:230
 -msgid "Country (private)"
 -msgstr ""
 -
 -#: js/ContactGrid.js:232 Export/Pdf.php:52
 -msgid "Email"
 -msgstr ""
 -
 -#: js/ContactGrid.js:236
 -msgid "Car phone"
 -msgstr ""
 -
 -#: js/ContactGrid.js:237
 -msgid "Pager"
 -msgstr ""
 -
 -#: js/ContactGrid.js:241
 -msgid "Email (private)"
 -msgstr ""
 -
 -#: js/ContactGrid.js:243
 -msgid "URL (private)"
 +#: js/Addressbook.js:22
 +msgid "New Contact"
  msgstr ""
  
 -#: js/ContactGrid.js:244
 -msgid "Note"
 -msgstr ""
 +#: js/Addressbook.js:32 js/Model.js:101 js/Model.js:244 js/Model.js:295
++#: js/Model.js:104 js/Model.js:286 js/Model.js:337
 +msgid "Addressbook"
 +msgid_plural "Addressbooks"
 +msgstr[0] ""
 +msgstr[1] ""
  
 -#: js/ContactGrid.js:245
 -msgid "Timezone"
 +#: js/Addressbook.js:67 js/Addressbook.js:102 js/ListRoleGridPanel.js:58
++#: js/Addressbook.js:68 js/Addressbook.js:103
 +msgid "ID"
  msgstr ""
  
 -#: js/ContactGrid.js:246
 -msgid "Geo"
 +#: js/Addressbook.js:74 js/Addressbook.js:109 js/Model.js:19 js/Model.js:260
 +#: js/ListGrid.js:102 js/ListEditDialog.js:83 js/ListEditDialog.js:166
- #: js/ListRoleGridPanel.js:65
++#: js/ListRoleGridPanel.js:65 js/contactListsGridPanel.js:56 js/Model.js:302
++#: js/Addressbook.js:75 js/Addressbook.js:110 js/ListEditDialog.js:98
++#: js/ListEditDialog.js:181
 +msgid "Name"
  msgstr ""
  
 -#: js/ContactGrid.js:248 js/Model.js:380 js/ListRoleGridPanel.js:50
 -#: Controller.php:193
 -msgid "List Roles"
 +#: js/ListMemberFilterModel.js:37
 +msgid "Member of List"
  msgstr ""
  
 -#: js/ListRoleMemberFilterModel.js:37 js/Model.js:380
 -msgid "List Role"
 -msgid_plural "List Roles"
 -msgstr[0] ""
 -msgstr[1] ""
 -
  #: js/Model.js:34
  msgid "Street (Company Address)"
  msgstr ""
@@@ -481,461 -407,562 +523,571 @@@ msgstr "
  msgid "Country (Private Address)"
  msgstr ""
  
- #: js/Model.js:51
 -#: js/Model.js:52
++#: js/Model.js:51 js/Model.js:52
  msgid "Company Communication"
  msgstr ""
  
- #: js/Model.js:57
 -#: js/Model.js:58
++#: js/Model.js:57 js/Model.js:58
  msgid "Private Communication"
  msgstr ""
  
- #: js/Model.js:65
 -#: js/Model.js:66
++#: js/Model.js:65 js/Model.js:66
  msgid "Web (private)"
  msgstr ""
  
- #: js/Model.js:97 js/ContactGridDetailsPanel.js:62
 -#: js/Model.js:100
++#: js/Model.js:97 js/ContactGridDetailsPanel.js:62 js/Model.js:100
  msgid "Contacts"
  msgstr ""
  
- #: js/Model.js:101 js/Model.js:244 js/Model.js:295
 -#: js/Model.js:104 js/Model.js:286 js/Model.js:337 js/Addressbook.js:32
 -msgid "Addressbook"
 -msgid_plural "Addressbooks"
 -msgstr[0] ""
 -msgstr[1] ""
 -
 -#: js/Model.js:104 js/Model.js:286 js/Model.js:337
++#: js/Model.js:101 js/Model.js:244 js/Model.js:295 js/Model.js:104
++#: js/Model.js:286 js/Model.js:337
  msgid "Addressbooks"
  msgstr ""
  
- #: js/Model.js:154 js/Model.js:254
 -#: js/Model.js:170
 -msgid "Resource"
 -msgid_plural "Resources"
 -msgstr[0] ""
 -msgstr[1] ""
 -
 -#: js/Model.js:170
 -msgid "Resources"
 -msgstr ""
 -
 -#: js/Model.js:185 js/Model.js:296
++#: js/Model.js:154 js/Model.js:254 js/Model.js:185 js/Model.js:296
  msgid "User Account"
  msgstr ""
  
- #: js/Model.js:157
 -#: js/Model.js:188
++#: js/Model.js:157 js/Model.js:188
  msgid "Quick Search"
  msgstr ""
  
 -#: js/Model.js:216 js/Model.js:304
 +#: js/Model.js:184 js/ListGrid.js:100 js/ContactGrid.js:275
++#: js/contactListsGridPanel.js:55 js/ContactGrid.js:200 js/Model.js:215
 +msgid "Type"
 +msgstr ""
 +
- #: js/Model.js:185 js/Model.js:262
++#: js/Model.js:185 js/Model.js:262 js/Model.js:216 js/Model.js:304
  msgid "Last Modified Time"
  msgstr ""
  
- #: js/Model.js:186 js/Model.js:263
 -#: js/Model.js:217 js/Model.js:305
++#: js/Model.js:186 js/Model.js:263 js/Model.js:217 js/Model.js:305
  msgid "Last Modified By"
  msgstr ""
  
- #: js/Model.js:187 js/Model.js:264
 -#: js/Model.js:218 js/Model.js:306
++#: js/Model.js:187 js/Model.js:264 js/Model.js:218 js/Model.js:306
  msgid "Creation Time"
  msgstr ""
  
- #: js/Model.js:188 js/Model.js:265
 -#: js/Model.js:219 js/Model.js:307
++#: js/Model.js:188 js/Model.js:265 js/Model.js:219 js/Model.js:307
  msgid "Created By"
  msgstr ""
  
 -#: js/Model.js:282 js/Model.js:296 js/ListGridDetailsPanel.js:86
 +#: js/Model.js:240 js/Model.js:254 js/ListGridDetailsPanel.js:86
++#: js/Model.js:282 js/Model.js:296
  msgid "List"
  msgid_plural "Lists"
  msgstr[0] ""
  msgstr[1] ""
  
 -#: js/Model.js:282 js/ListGridDetailsPanel.js:57 js/ListGridDetailsPanel.js:83
 -#: Controller.php:184
 -msgid "Lists"
 -msgstr ""
 -
 +#: js/Model.js:257 js/Model.js:322 js/Model.js:352 js/Model.js:383
+ #: js/Model.js:299 js/Model.js:364 js/Model.js:394 js/Model.js:425
  msgid "Quick search"
  msgstr ""
  
- #: js/Model.js:291
 -#: js/Model.js:333
++#: js/Model.js:291 js/Model.js:333
  msgid "Email Address"
  msgid_plural "Email Addresses"
  msgstr[0] ""
  msgstr[1] ""
  
- #: js/Model.js:291
 -#: js/Model.js:333
++#: js/Model.js:291 js/Model.js:333
  msgid "Email Addresses"
  msgstr ""
  
 -#: js/Model.js:411 Controller.php:202
 -msgid "Industries"
 +#: js/ListGridDetailsPanel.js:60
 +msgid "Select list"
  msgstr ""
  
- #: js/ListGrid.js:101 js/ContactGrid.js:276
 -#: js/ListMemberRoleGridPanel.js:37 js/ListRoleGridPanel.js:71
 -#: js/Printer/ListRecord.js:40
 -msgid "Members"
++#: js/ListGrid.js:101 js/ContactGrid.js:276 js/ContactGrid.js:201
 +msgid "Tags"
  msgstr ""
  
- #: js/ListGrid.js:103 js/ListEditDialog.js:89
 -#: js/ListMemberRoleGridPanel.js:221
 -msgid "Remove Member"
++#: js/ListGrid.js:103 js/ListEditDialog.js:89 js/ListEditDialog.js:104
 +msgid "List type"
  msgstr ""
  
 -#: js/ContactSearchCombo.js:68
 -msgid "Search for users ..."
 +#: js/ListGrid.js:104
 +msgid "Emails"
  msgstr ""
  
 -#: js/ContactSearchCombo.js:69
 -msgid "Search for Contacts ..."
 +#: js/ListGrid.js:146
 +msgid "System Group"
  msgstr ""
  
 -#: js/ListGridDetailsPanel.js:60
 -msgid "Select list"
 +#: js/ListGrid.js:146
 +msgid "Group"
  msgstr ""
  
- #: js/ListEditDialog.js:71
 -#: js/CardDAVContainerPropertiesHookField.js:35
 -msgid "CardDAV URL"
++#: js/ListEditDialog.js:71 js/ListEditDialog.js:86
 +msgid "List Information"
  msgstr ""
  
- #: js/ListEditDialog.js:166
 -#: js/ListRoleGridPanel.js:58 js/Addressbook.js:68 js/Addressbook.js:103
 -msgid "ID"
++#: js/ListEditDialog.js:166 js/ListEditDialog.js:181
 +#, python-brace-format
 +msgid "{0} must be given"
  msgstr ""
  
 -#: js/Addressbook.js:22
 -msgid "New Contact"
 +#: js/MapPanel.js:58
 +msgid "Company address"
  msgstr ""
  
 -#: js/Printer/ListRecord.js:56
 -msgid "Customfields"
 +#: js/MapPanel.js:65
 +msgid "Private address"
  msgstr ""
  
 -#: js/Printer/ListRecord.js:67 js/Printer/ContactRecord.js:79
 -msgid "Related to"
 +#: js/ContactGridDetailsPanel.js:65
 +msgid "Select contact"
  msgstr ""
  
- #: js/ContactGridDetailsPanel.js:155
 -#: js/ListSearchCombo.js:27
 -msgid "Search for system groups ..."
++#: js/ContactGridDetailsPanel.js:155 js/ContactGridDetailsPanel.js:148
++#: js/ContactGrid.js:189
 +msgid "Private"
  msgstr ""
  
 -#: js/ListSearchCombo.js:28
 -msgid "Search for groups ..."
 +#: js/ContactGridDetailsPanel.js:178
 +msgid "Info"
  msgstr ""
  
 -#: js/ListEditDialog.js:55
 +#: js/ContactGridDetailsPanel.js:214
 +msgid "Insecure link"
 +msgstr ""
 +
 +#: js/ContactGridDetailsPanel.js:214
 +msgid "Please review this link in edit dialog."
 +msgstr ""
 +
 +#: js/ContactGrid.js:110 js/ContactGrid.js:111 js/ContactGrid.js:112
  #, python-brace-format
 -msgid "Print {0}"
 +msgid "Export {0}"
 +msgid_plural "Export {0}"
 +msgstr[0] ""
 +msgstr[1] ""
 +
 +#: js/ContactGrid.js:121
 +msgid "Export as PDF"
  msgstr ""
  
 -#: js/ListEditDialog.js:86
 -msgid "List Information"
 +#: js/ContactGrid.js:128
 +msgid "Export as CSV"
  msgstr ""
  
 -#: js/ListEditDialog.js:104 js/ListGrid.js:103
 -msgid "List type"
 +#: js/ContactGrid.js:135
 +msgid "Export as ODS"
  msgstr ""
  
 -#: js/ListEditDialog.js:181
 -#, python-brace-format
 -msgid "{0} must be given"
 +#: js/ContactGrid.js:142
 +msgid "Export as XLS"
  msgstr ""
  
 -#: js/ListGrid.js:104
 -msgid "Emails"
 +#: js/ContactGrid.js:149
 +msgid "Export as DOC"
  msgstr ""
  
 -#: js/ListGrid.js:146
 -msgid "System Group"
 +#: js/ContactGrid.js:156
 +msgid "Export as ..."
  msgstr ""
  
- #: js/ContactGrid.js:168
 -#: js/ListGrid.js:146
 -msgid "Group"
++#: js/ContactGrid.js:168 js/ContactGrid.js:110
 +msgid "Import contacts"
  msgstr ""
  
- #: js/ContactGrid.js:255
 -#: Controller/Contact.php:589
 -msgid "Uploaded new contact image."
++#: js/ContactGrid.js:255 js/ContactGrid.js:162
 +msgid "Contact of a user account"
  msgstr ""
  
- #: js/ContactGrid.js:262
 -#: Frontend/Cli.php:216
 -msgid ""
 -"This contact has been automatically added by the system as an event attender"
++#: js/ContactGrid.js:262 js/ContactGrid.js:169
 +msgid "No name"
  msgstr ""
  
- #: js/ContactGrid.js:289
 -#: Frontend/CardDAV/AllContacts.php:41
 -msgid "All Contacts"
++#: js/ContactGrid.js:289 js/ContactGrid.js:214
 +msgid "Full Name"
  msgstr ""
  
- #: js/ContactGrid.js:299
 -#: Import/definitions/adb_outlook_import_csv.xml:10
 -msgid "Import CSV formated contacts from Exchange / Outlook address book"
++#: js/ContactGrid.js:299 js/ContactGrid.js:224
 +msgid "Postalcode"
  msgstr ""
  
- #: js/ContactGrid.js:301
 -#: Import/definitions/adb_outlook_import_csv.xml:14
 -msgid "Contact CSV import from Outlook address book"
++#: js/ContactGrid.js:301 js/ContactGrid.js:226
 +msgid "Street (private)"
  msgstr ""
  
- #: js/ContactGrid.js:302
 -#: Import/definitions/adb_mac_import_csv.xml:17
 -msgid "Contact CSV import from mac address book"
++#: js/ContactGrid.js:302 js/ContactGrid.js:227
 +msgid "City (private)"
  msgstr ""
  
- #: js/ContactGrid.js:303
 -#: Import/definitions/adb_tine_import_csv.xml:11
 -msgid "Tine 2.0 contact CSV import"
++#: js/ContactGrid.js:303 js/ContactGrid.js:228
 +msgid "Region (private)"
  msgstr ""
  
- #: js/ContactGrid.js:304
 -#: Import/definitions/adb_tine_import_csv.xml:13
 -msgid "Import CSV formated contacts from Tine 2.0 address book"
++#: js/ContactGrid.js:304 js/ContactGrid.js:229
 +msgid "Postalcode (private)"
  msgstr ""
  
- #: js/ContactGrid.js:305
 -#: Import/definitions/adb_tine_import_csv.xml:19
 -msgid "Import list (###CURRENTDATE###)"
++#: js/ContactGrid.js:305 js/ContactGrid.js:230
 +msgid "Country (private)"
  msgstr ""
  
- #: js/ContactGrid.js:310
 -#: Import/definitions/adb_tine_import_csv.xml:21
 -msgid ""
 -"Contacts imported on ###CURRENTDATE### at ###CURRENTTIME### by "
 -"###USERFULLNAME###"
++#: js/ContactGrid.js:310 js/ContactGrid.js:236
 +msgid "Car phone"
  msgstr ""
  
- #: js/ContactGrid.js:311
 -#: Import/definitions/adb_outlook2007_de_import_csv.xml:10
 -msgid "Import CSV formated contacts from Outlook 2007 German address book"
++#: js/ContactGrid.js:311 js/ContactGrid.js:237
 +msgid "Pager"
 +msgstr ""
 +
- #: js/ContactGrid.js:315
++#: js/ContactGrid.js:315 js/ContactGrid.js:241
 +msgid "Email (private)"
 +msgstr ""
 +
- #: js/ContactGrid.js:317
++#: js/ContactGrid.js:317 js/ContactGrid.js:243
 +msgid "URL (private)"
 +msgstr ""
 +
- #: js/ContactGrid.js:318
++#: js/ContactGrid.js:318 js/ContactGrid.js:244
 +msgid "Note"
 +msgstr ""
 +
- #: js/ContactGrid.js:319
++#: js/ContactGrid.js:319 js/ContactGrid.js:245
 +msgid "Timezone"
 +msgstr ""
 +
- #: js/ContactGrid.js:320
++#: js/ContactGrid.js:320 js/ContactGrid.js:246
 +msgid "Geo"
 +msgstr ""
 +
 +#: js/ContactSearchCombo.js:68
 +msgid "Search for users ..."
 +msgstr ""
 +
 +#: js/ContactSearchCombo.js:69
 +msgid "Search for Contacts ..."
 +msgstr ""
 +
- #: Controller/Contact.php:592
++#: Controller/Contact.php:348 Controller/Contact.php:589
 +msgid "Uploaded new contact image."
 +msgstr ""
 +
- #: Controller/Contact.php:601
- msgid "Deleted contact image."
- msgstr ""
 +#: Preference.php:28
 +msgid "All contacts"
  msgstr ""
  
 -#: Import/definitions/adb_outlook2007_de_import_csv.xml:15
 -msgid "CSV Outlook 2007 German"
 +#: Preference.php:81
 +msgid "Default Addressbook"
  msgstr ""
  
 -#: Import/definitions/adb_import_vcard.xml:9
 -msgid "Import vCard formated contacts"
 +#: Preference.php:82
 +msgid "The default addressbook for new contacts"
  msgstr ""
  
 -#: Import/definitions/adb_import_vcard.xml:15
 -msgid "Contact VCARD import"
 +#: Preference.php:85
 +msgid "Default Favorite"
  msgstr ""
  
 -#: Import/definitions/adb_google_import_csv.xml:11
 -msgid "Import CSV formated contacts from Google address book"
 +#: Preference.php:86
 +msgid "The default favorite which is loaded on addressbook startup"
  msgstr ""
  
 -#: Import/definitions/adb_google_import_csv.xml:13
 -msgid "Contact import from Google address book"
 +#: Preference.php:89
 +msgid "Contacts ODS export configuration"
  msgstr ""
  
 -#: Import/definitions/adb_lxoffice_import_csv.xml:11
 -msgid "LX-Office CSV Contact import"
 +#: Preference.php:90
 +msgid "Use this configuration for the contact ODS export."
  msgstr ""
  
 -#: Import/definitions/adb_lxoffice_import_csv.xml:13
 -msgid "Import CSV formated contacts from LX-Office"
 +#: Preference.php:93
 +msgid "Contacts XLS export configuration"
  msgstr ""
  
 -#: Config.php:95
 -msgid "Enabled Features"
 +#: Preference.php:94
 +msgid "Use this configuration for the contact XLS export."
  msgstr ""
  
 -#: Config.php:97
 -msgid "Enabled Features in Calendar Application."
 +#: Preference.php:165
 +msgid "default"
  msgstr ""
  
- #: Frontend/Cli.php:114
 -#: Config.php:105
 -msgid "Addressbook List View"
++#: Frontend/Cli.php:114 Frontend/Cli.php:216
 +msgid ""
 +"This contact has been automatically added by the system as an event attender"
  msgstr ""
  
 -#: Config.php:107
 -msgid "Shows an additional view for lists inside the addressbook"
 +#: Frontend/CardDAV/AllContacts.php:41
 +msgid "All Contacts"
  msgstr ""
  
- #: Config.php:67
 -#: Config.php:110
 -msgid "Addressbook Industries"
++#: Config.php:67 Config.php:95
 +msgid "Enabled Features"
  msgstr ""
  
- #: Config.php:69
 -#: Config.php:111
 -msgid "Add Industry field to Adressbook"
++#: Config.php:69 Config.php:97
 +msgid "Enabled Features in Calendar Application."
  msgstr ""
  
- #: Config.php:76
 -#: Config.php:114
 -msgid "Manage resources in Addressbook"
++#: Config.php:76 Config.php:105
 +msgid "Addressbook List View"
  msgstr ""
  
 -#: Config.php:115
 -msgid "Show the resources grid also inside the Addressbook"
 +#: Config.php:77
 +msgid "Shows an additional view for lists inside the addressbook)"
  msgstr ""
  
- #: Config.php:85
 -#: Config.php:125
++#: Config.php:85 Config.php:125
  msgid "Contact duplicate check fields"
  msgstr ""
  
- #: Config.php:87
 -#: Config.php:127
++#: Config.php:87 Config.php:127
  msgid ""
  "These fields are checked when a new contact is created. If a record with the "
  "same data in the fields is found, a duplicate exception is thrown."
  msgstr ""
  
- #: Config.php:99
 -#: Config.php:144
 -msgid "Contact Hidden Criteria"
 -msgstr ""
 -
 -#: Config.php:146
 -msgid "The contact is hidden if it is ... (one of: disabled, expired or never"
 -msgstr ""
 -
 -#: Config.php:153
++#: Config.php:99 Config.php:153
  msgid "Contact salutations available"
  msgstr ""
  
- #: Config.php:101
 -#: Config.php:155
++#: Config.php:101 Config.php:155
  msgid ""
  "Possible contact salutations. Please note that additional values might "
  "impact other Addressbook systems on export or syncronisation."
  msgstr ""
  
- #: Config.php:108 Setup/Update/Release5.php:194
 -#: Config.php:163 Setup/Update/Release5.php:194
++#: Config.php:108 Setup/Update/Release5.php:194 Config.php:163
  msgid "Mr"
  msgstr ""
  
- #: Config.php:109 Setup/Update/Release5.php:195
 -#: Config.php:164 Setup/Update/Release5.php:195
++#: Config.php:109 Setup/Update/Release5.php:195 Config.php:164
  msgid "Ms"
  msgstr ""
  
- #: Config.php:116
 -#: Config.php:171
++#: Config.php:116 Config.php:171
  msgid "Parsing rules for addresses"
  msgstr ""
  
- #: Config.php:118
 -#: Config.php:173
++#: Config.php:118 Config.php:173
  msgid "Path to a XML file with address parsing rules."
  msgstr ""
  
- #: Config.php:126
 -#: Config.php:181
++#: Config.php:126 Config.php:181
  msgid "List types available"
  msgstr ""
  
- #: Config.php:128
 -#: Config.php:183
++#: Config.php:128 Config.php:183
  msgid "List types available."
  msgstr ""
  
- #: Config.php:135
 -#: Config.php:190
++#: Config.php:135 Config.php:190
  msgid "Department"
  msgstr ""
  
- #: Config.php:136
 -#: Config.php:191
++#: Config.php:136 Config.php:191
  msgid "Mailing list"
  msgstr ""
  
- #: Config.php:141
 -#: Config.php:196
++#: Config.php:141 Config.php:196
  msgid "Use Nominatim during contact import"
  msgstr ""
  
 -#: Config.php:206 Config.php:208
 -msgid "Sync Backends"
 +#: Import/definitions/adb_outlook2007_de_import_csv.xml:10
 +msgid "Import CSV formated contacts from Outlook 2007 German address book"
  msgstr ""
  
 -#: Setup/Initialize.php:125 Setup/Update/Release3.php:37
 -msgid "All contacts I have read grants for"
 +#: Import/definitions/adb_outlook2007_de_import_csv.xml:15
 +msgid "CSV Outlook 2007 German"
  msgstr ""
  
 -#: Setup/Initialize.php:130
 -msgid "My company"
 +#: Import/definitions/adb_lxoffice_import_csv.xml:11
 +msgid "LX-Office CSV Contact import"
  msgstr ""
  
 -#: Setup/Initialize.php:131
 -msgid "All coworkers in my company"
 +#: Import/definitions/adb_lxoffice_import_csv.xml:13
 +msgid "Import CSV formated contacts from LX-Office"
  msgstr ""
  
 -#: Setup/Initialize.php:144
 -msgid "My contacts"
 +#: Import/definitions/adb_tine_import_csv.xml:11
 +msgid "Tine 2.0 contact CSV import"
  msgstr ""
  
 -#: Setup/Initialize.php:145
 -msgid "All contacts in my Addressbooks"
 +#: Import/definitions/adb_tine_import_csv.xml:13
 +msgid "Import CSV formated contacts from Tine 2.0 address book"
  msgstr ""
  
 -#: Setup/Initialize.php:157
 -msgid "Last modified by me"
 +#: Import/definitions/adb_tine_import_csv.xml:19
 +msgid "Import list (###CURRENTDATE###)"
  msgstr ""
  
 -#: Setup/Initialize.php:158
 -msgid "All contacts that I have last modified"
 +#: Import/definitions/adb_tine_import_csv.xml:21
 +msgid ""
 +"Contacts imported on ###CURRENTDATE### at ###CURRENTTIME### by "
 +"###USERFULLNAME###"
  msgstr ""
  
 -#: Setup/setup.xml:965
 -msgid "Internal Contacts"
 +#: Import/definitions/adb_outlook_import_csv.xml:10
 +msgid "Import CSV formated contacts from Exchange / Outlook address book"
  msgstr ""
  
 -#: Controller.php:129
 -#, python-format
 -msgid "%s's personal addressbook"
 +#: Import/definitions/adb_outlook_import_csv.xml:14
 +msgid "Contact CSV import from Outlook address book"
  msgstr ""
  
 -#: Acl/Rights.php:122
 -msgid "manage shared addressbooks"
 +#: Import/definitions/adb_google_import_csv.xml:11
 +msgid "Import CSV formated contacts from Google address book"
  msgstr ""
  
 -#: Acl/Rights.php:123
 -msgid "Create new shared addressbook folders"
 +#: Import/definitions/adb_google_import_csv.xml:13
 +msgid "Contact import from Google address book"
  msgstr ""
  
 -#: Acl/Rights.php:126
 -msgid "manage shared addressbook favorites"
 +#: Import/definitions/adb_mac_import_csv.xml:17
 +msgid "Contact CSV import from mac address book"
  msgstr ""
  
 -#: Acl/Rights.php:127
 -msgid "Create or update shared addressbook favorites"
 +#: Import/definitions/adb_import_vcard.xml:9
 +msgid "Import vCard formated contacts"
  msgstr ""
  
 -#: Acl/Rights.php:130
 -msgid "Manage lists in CoreData"
 +#: Import/definitions/adb_import_vcard.xml:15
 +msgid "Contact VCARD import"
  msgstr ""
  
- #: Setup/setup.xml:936
 -#: Acl/Rights.php:131
 -msgid "View, create, delete or update lists in CoreData application"
++#: Setup/setup.xml:936 Setup/setup.xml:965
 +msgid "Internal Contacts"
  msgstr ""
  
 -#: Acl/Rights.php:134
 -msgid "Manage list roles in CoreData"
 +#: Setup/Initialize.php:117 Setup/Update/Release3.php:37
++#: Setup/Initialize.php:125
 +msgid "All contacts I have read grants for"
  msgstr ""
  
- #: Setup/Initialize.php:122
 -#: Acl/Rights.php:135
 -msgid "View, create, delete or update list roles in CoreData application"
++#: Setup/Initialize.php:122 Setup/Initialize.php:130
 +msgid "My company"
  msgstr ""
  
- #: Setup/Initialize.php:123
 -#: Export/Pdf.php:37
 -msgid "Business Contact Data"
++#: Setup/Initialize.php:123 Setup/Initialize.php:131
 +msgid "All coworkers in my company"
  msgstr ""
  
- #: Setup/Initialize.php:136
 -#: Export/Pdf.php:39
 -msgid "Organisation / Unit"
++#: Setup/Initialize.php:136 Setup/Initialize.php:144
 +msgid "My contacts"
  msgstr ""
  
- #: Setup/Initialize.php:137
 -#: Export/Pdf.php:44
 -msgid "Business Address"
++#: Setup/Initialize.php:137 Setup/Initialize.php:145
 +msgid "All contacts in my Addressbooks"
  msgstr ""
  
- #: Setup/Initialize.php:149
 -#: Export/Pdf.php:55
 -msgid "Telephone Work"
++#: Setup/Initialize.php:149 Setup/Initialize.php:157
 +msgid "Last modified by me"
  msgstr ""
  
- #: Setup/Initialize.php:150
 -#: Export/Pdf.php:58
 -msgid "Telephone Cellphone"
++#: Setup/Initialize.php:150 Setup/Initialize.php:158
 +msgid "All contacts that I have last modified"
  msgstr ""
 -#: Export/Pdf.php:61
 -msgid "Telephone Car"
 -#: Export/Pdf.php:64
 -msgid "Telephone Fax"
++#: js/ContactEditDialog.js:64 js/ContactEditDialog.js:79 js/ContactGrid.js:231
++#: js/Model.js:51
++msgid "Preferred Address"
+ msgstr ""
 -#: Export/Pdf.php:67
 -msgid "Telephone Page"
++#: js/ContactEditDialog.js:423 js/Model.js:83
++msgid "Groups"
+ msgstr ""
 -#: Export/Pdf.php:70
 -msgid "URL"
++#: js/ContactEditDialog.js:474
++msgid "Print contact"
+ msgstr ""
 -#: Export/Pdf.php:73
 -msgid "Role"
++#: js/ContactGridDetailsPanel.js:79 js/ContactGrid.js:187
++msgid "Business"
+ msgstr ""
 -#: Export/Pdf.php:79
 -msgid "Assistant"
++#: js/ContactGrid.js:191
++msgid "Not set"
+ msgstr ""
 -#: Export/Pdf.php:82
 -msgid "Assistant Telephone"
++#: js/Model.js:170
++msgid "Resource"
++msgid_plural "Resources"
++msgstr[0] ""
++msgstr[1] ""
++
++#: js/Model.js:170
++msgid "Resources"
+ msgstr ""
 -#: Export/Pdf.php:86
 -msgid "Private Contact Data"
++#: js/Printer/ListRecord.js:56
++msgid "Customfields"
+ msgstr ""
 -#: Export/Pdf.php:96
 -msgid "Email Home"
++#: js/Printer/ListRecord.js:67 js/Printer/ContactRecord.js:79
++msgid "Related to"
+ msgstr ""
 -#: Export/Pdf.php:99
 -msgid "Telephone Home"
++#: js/ListEditDialog.js:55
++#, python-brace-format
++msgid "Print {0}"
+ msgstr ""
 -#: Export/Pdf.php:102
 -msgid "Telephone Cellphone Private"
++#: Config.php:107
++msgid "Shows an additional view for lists inside the addressbook"
+ msgstr ""
 -#: Export/Pdf.php:105
 -msgid "Telephone Fax Home"
++#: Config.php:110
++msgid "Addressbook Industries"
+ msgstr ""
 -#: Export/Pdf.php:108
 -msgid "URL Home"
++#: Config.php:111
++msgid "Add Industry field to Adressbook"
+ msgstr ""
 -#: Export/Pdf.php:112
 -msgid "Other Data"
++#: Config.php:114
++msgid "Manage resources in Addressbook"
+ msgstr ""
 -
 -#: Preference.php:28
 -msgid "All contacts"
 -msgstr ""
 -
 -#: Preference.php:81
 -msgid "Default Addressbook"
 -msgstr ""
 -
 -#: Preference.php:82
 -msgid "The default addressbook for new contacts"
 -msgstr ""
 -
 -#: Preference.php:85
 -msgid "Default Favorite"
 -msgstr ""
 -
 -#: Preference.php:86
 -msgid "The default favorite which is loaded on addressbook startup"
 -msgstr ""
 -
 -#: Preference.php:89
 -msgid "Contacts ODS export configuration"
 -msgstr ""
 -
 -#: Preference.php:90
 -msgid "Use this configuration for the contact ODS export."
 -msgstr ""
 -
 -#: Preference.php:93
 -msgid "Contacts XLS export configuration"
 -msgstr ""
 -
 -#: Preference.php:94
 -msgid "Use this configuration for the contact XLS export."
 -msgstr ""
 -
 -#: Preference.php:165
 -msgid "default"
 -msgstr ""
++#: Config.php:115
++msgid "Show the resources grid also inside the Addressbook"
++msgstr ""
++
++#: Config.php:144
++msgid "Contact Hidden Criteria"
++msgstr ""
++
++#: Config.php:146
++msgid "The contact is hidden if it is ... (one of: disabled, expired or never"
++msgstr ""
++
++#: Config.php:206 Config.php:208
++msgid "Sync Backends"
+ msgstr ""
+ #: Export/definitions/adb_default_ods.xml:7
+ msgid "OpenDocument all data"
+ msgstr ""
+ #: Export/definitions/adb_list_doc.xml:5 Export/definitions/adb_doc.xml:5
+ msgid "Word details"
+ msgstr ""
+ #: Export/definitions/adb_pdf.xml:5
+ msgid "PDF details"
+ msgstr ""
+ #: Export/definitions/adb_csv.xml:5
+ msgid "CSV all data"
+ msgstr ""
+ #: Export/definitions/adb_list_xls.xml:5 Export/definitions/adb_xls.xml:5
+ msgid "Excel all data"
+ msgstr ""
+ #: Export/definitions/adb_by_company_xls.xml:7
+ msgid "Excel phone list"
+ msgstr ""
+ #: Export/definitions/adb_by_company_xls.xml:9
+ msgid "Excel phone list grouped by company"
+ msgstr ""
+ #: Export/definitions/adb_doc_letter.xml:6
+ msgid "Word letter"
+ msgstr ""
@@@ -809,7 -809,7 +809,7 @@@ class Felamimail_Controller_Message_Sen
  
          $node = Filemanager_Controller_Node::getInstance()->get($_attachment['id']);
  
-         $this->_insertDownloadLinkIntoMailBody(Filemanager_Model_node::getDeepLink($node), $_message);
+         $this->_insertDownloadLinkIntoMailBody(Filemanager_Model_Node::getDeepLink($node), $_message);
  
          return true;
      }
      /**
       * get max attachment size for outgoing mails
       * 
 -     * - currently it is set to memory_limit / 10
 +     * - currently it is set to memory_limit
       * - returns size in Bytes
       * 
       * @return integer
              $configuredMemoryLimit = '512M';
          }
          
 -        return Tinebase_Helper::convertToBytes($configuredMemoryLimit) / 10;
 +        return Tinebase_Helper::convertToBytes($configuredMemoryLimit);
      }
  }
@@@ -17,25 -17,23 +17,25 @@@ class Timetracker_Setup_Update_Release1
       */
      public function update_0()
      {
 -        $declaration = new Setup_Backend_Schema_Index_Xml('
 -            <index>
 -                <name>description</name>
 -                <fulltext>true</fulltext>
 -                <field>
 +        if ($this->getTableVersion('timetracker_timesheet') < 6) {
 +            $declaration = new Setup_Backend_Schema_Index_Xml('
 +                <index>
                      <name>description</name>
 -                </field>
 -            </index>
 -        ');
 +                    <fulltext>true</fulltext>
 +                    <field>
 +                        <name>description</name>
 +                    </field>
 +                </index>
 +            ');
  
 -        try {
 -            $this->_backend->addIndex('timetracker_timesheet', $declaration);
 -        } catch (Exception $e) {
 -            Tinebase_Exception::log($e);
 -        }
 +            try {
 +                $this->_backend->addIndex('timetracker_timesheet', $declaration);
 +            } catch (Exception $e) {
 +                Tinebase_Exception::log($e);
 +            }
  
 -        $this->setTableVersion('timetracker_timesheet', '6');
 +            $this->setTableVersion('timetracker_timesheet', '6');
 +        }
          $this->setApplicationVersion('Timetracker', '10.1');
      }
  
       */
      public function update_1()
      {
 -        $declaration = new Setup_Backend_Schema_Index_Xml('
 -            <index>
 -                <name>description</name>
 -                <fulltext>true</fulltext>
 -                <field>
 +        if ($this->getTableVersion('timetracker_timesheet') < 11) {
 +            $declaration = new Setup_Backend_Schema_Index_Xml('
 +                <index>
                      <name>description</name>
 -                </field>
 -            </index>
 -        ');
 +                    <fulltext>true</fulltext>
 +                    <field>
 +                        <name>description</name>
 +                    </field>
 +                </index>
 +            ');
  
 -        try {
 -            $this->_backend->addIndex('timetracker_timeaccount', $declaration);
 -        } catch (Exception $e) {
 -            Tinebase_Exception::log($e);
 +            try {
 +                $this->_backend->addIndex('timetracker_timeaccount', $declaration);
 +            } catch (Exception $e) {
 +                Tinebase_Exception::log($e);
 +            }
 +            $this->setTableVersion('timetracker_timeaccount', '11');
          }
 -
 -        $this->setTableVersion('timetracker_timeaccount', '11');
          $this->setApplicationVersion('Timetracker', '10.2');
      }
  
-      * update to 10.3
+     public function update_2()
+     {
+         $this->setApplicationVersion('Timetracker', '10.3');
+     }
++
 +    /**
-     public function update_2()
++     * update to 10.4
 +     *
 +     * @return void
 +     */
-         $this->setApplicationVersion('Timetracker', '10.3');
++    public function update_3()
 +    {
 +        if (! $this->_backend->tableExists('timetracker_timeaccount_fav')) {
 +            $declaration = new Setup_Backend_Schema_Table_Xml('<table>
 +                <name>timetracker_timeaccount_fav</name>
 +                <version>1</version>
 +                <declaration>
 +                    <field>
 +                        <name>id</name>
 +                        <type>text</type>
 +                        <length>40</length>
 +                        <notnull>true</notnull>
 +                    </field>
 +                    <field>
 +                        <name>account_id</name>
 +                        <type>text</type>
 +                        <length>40</length>
 +                        <notnull>true</notnull>
 +                    </field>
 +                    <field>
 +                        <name>timeaccount_id</name>
 +                        <type>text</type>
 +                        <length>40</length>
 +                        <notnull>false</notnull>
 +                    </field>
 +                    <field>
 +                        <name>created_by</name>
 +                        <type>text</type>
 +                        <length>40</length>
 +                    </field>
 +                    <field>
 +                        <name>creation_time</name>
 +                        <type>datetime</type>
 +                    </field>
 +                    <field>
 +                        <name>last_modified_by</name>
 +                        <type>text</type>
 +                        <length>40</length>
 +                    </field>
 +                    <field>
 +                        <name>last_modified_time</name>
 +                        <type>datetime</type>
 +                    </field>
 +                    <field>
 +                        <name>is_deleted</name>
 +                        <type>boolean</type>
 +                        <default>false</default>
 +                    </field>
 +                    <field>
 +                        <name>deleted_by</name>
 +                        <type>text</type>
 +                        <length>40</length>
 +                    </field>
 +                    <field>
 +                        <name>deleted_time</name>
 +                        <type>datetime</type>
 +                    </field>
 +                    <index>
 +                        <name>id</name>
 +                        <primary>true</primary>
 +                        <field>
 +                            <name>id</name>
 +                        </field>
 +                    </index>
 +                    <index>
 +                        <name>timesheet_favorites--timesheet_id::id</name>
 +                        <field>
 +                            <name>timeaccount_id</name>
 +                        </field>
 +                        <foreign>true</foreign>
 +                        <reference>
 +                            <table>timetracker_timeaccount</table>
 +                            <field>id</field>
 +                        </reference>
 +                    </index>
 +                    <index>
 +                        <name>timesheet_favorites--account_id::id</name>
 +                        <field>
 +                            <name>account_id</name>
 +                        </field>
 +                        <foreign>true</foreign>
 +                        <reference>
 +                            <table>accounts</table>
 +                            <field>id</field>
 +                            <ondelete>CASCADE</ondelete>
 +                        </reference>
 +                    </index>
 +                </declaration>
 +            </table>');
 +
 +            $this->_backend->createTable($declaration, 'Timetracker', 'timetracker_timeaccount_fav');
 +            $this->setTableVersion('timetracker_timeaccount_fav', 1);
 +        }
-     public function update_3()
++        $this->setApplicationVersion('Timetracker', '10.4');
 +    }
 +
 +    /**
 +     * 0012470: Don't shorten description in export
 +     */
-         $this->setApplicationVersion('Timetracker', '10.4');
++    public function update_4()
 +    {
 +        Setup_Controller::getInstance()->createImportExportDefinitions(Tinebase_Application::getInstance()->getApplicationByName('Timetracker'));
-      * update to 10.5
++        $this->setApplicationVersion('Timetracker', '10.5');
 +    }
 +
 +    /**
-     public function update_4()
++     * update to 10.6
 +     *
 +     * Add fulltext index to field description of timesheet
 +     * - re-run update 0 + 1 because 2017.02 added update 2 + 3
 +     */
-         $this->setApplicationVersion('Timetracker', '10.5');
++    public function update_5()
 +    {
 +        $this->update_0();
 +        $this->update_1();
++        $this->setApplicationVersion('Timetracker', '10.6');
 +    }
  }
@@@ -2,7 -2,7 +2,7 @@@
  <application>
      <name>Timetracker</name>
      <!-- gettext('Timetracker') -->   
-     <version>10.5</version>
 -    <version>10.3</version>
++    <version>10.6</version>
      <order>60</order>
      <status>enabled</status>
      <depends>
@@@ -11,7 -11,7 +11,7 @@@
      <tables>
          <table>
              <name>timetracker_timeaccount</name>
-             <version>11</version>
+             <version>12</version>
              <declaration>
                  <field>
                      <name>id</name>
@@@ -21,7 -21,8 +21,8 @@@
                  </field>
                  <field>
                      <name>container_id</name>
-                     <type>integer</type>
+                     <type>text</type>
+                     <length>40</length>
                      <notnull>false</notnull>
                  </field>
                  <field>
                  </index>
              </declaration>
          </table>
 +        <table>
 +            <name>timetracker_timeaccount_fav</name>
 +            <version>1</version>
 +            <declaration>
 +                <field>
 +                    <name>id</name>
 +                    <type>text</type>
 +                    <length>40</length>
 +                    <notnull>true</notnull>
 +                </field>
 +                <field>
 +                    <name>account_id</name>
 +                    <type>text</type>
 +                    <length>40</length>
 +                    <notnull>true</notnull>
 +                </field>
 +                <field>
 +                    <name>timeaccount_id</name>
 +                    <type>text</type>
 +                    <length>40</length>
 +                    <notnull>false</notnull>
 +                </field>
 +                <field>
 +                    <name>created_by</name>
 +                    <type>text</type>
 +                    <length>40</length>
 +                </field>
 +                <field>
 +                    <name>creation_time</name>
 +                    <type>datetime</type>
 +                </field>
 +                <field>
 +                    <name>last_modified_by</name>
 +                    <type>text</type>
 +                    <length>40</length>
 +                </field>
 +                <field>
 +                    <name>last_modified_time</name>
 +                    <type>datetime</type>
 +                </field>
 +                <field>
 +                    <name>is_deleted</name>
 +                    <type>boolean</type>
 +                    <default>false</default>
 +                </field>
 +                <field>
 +                    <name>deleted_by</name>
 +                    <type>text</type>
 +                    <length>40</length>
 +                </field>
 +                <field>
 +                    <name>deleted_time</name>
 +                    <type>datetime</type>
 +                </field>
 +                <index>
 +                    <name>id</name>
 +                    <primary>true</primary>
 +                    <field>
 +                        <name>id</name>
 +                    </field>
 +                </index>
 +                <index>
 +                    <name>timesheet_favorites--timesheet_id::id</name>
 +                    <field>
 +                        <name>timeaccount_id</name>
 +                    </field>
 +                    <foreign>true</foreign>
 +                    <reference>
 +                        <table>timetracker_timeaccount</table>
 +                        <field>id</field>
 +                    </reference>
 +                </index>
 +                <index>
 +                    <name>timesheet_favorites--account_id::id</name>
 +                    <field>
 +                        <name>account_id</name>
 +                    </field>
 +                    <foreign>true</foreign>
 +                    <reference>
 +                        <table>accounts</table>
 +                        <field>id</field>
 +                        <ondelete>CASCADE</ondelete>
 +                    </reference>
 +                </index>
 +            </declaration>
 +        </table>
      </tables>
  </application>
  
@@@ -97,17 -97,13 +97,17 @@@ Tine.Timetracker.TimesheetEditDialog = 
              this.getForm().findField('billed_in').setDisabled(! (grants.adminGrant || manageRight));
          }
  
 -        if (timeaccount) {
 +        if (timeaccount && timeaccount.data) {
              notBillable = notBillable || timeaccount.data.is_billable == "0" || timeaccount.get('is_billable') == "0";
              
              // clearable depends on timeaccount is_billable as well (changed by ps / 2009-09-01, behaviour was inconsistent)
              notClearable = notClearable || timeaccount.data.is_billable == "0" || timeaccount.get('is_billable') == "0";
 +
 +            if (timeaccount.data.is_billable == "0" || timeaccount.get('is_billable') == "0") {
 +                this.getForm().findField('is_billable').setValue(false);
 +            }
          }
 -        
 +
          this.getForm().findField('is_billable').setDisabled(notBillable);
          this.getForm().findField('is_cleared').setDisabled(notClearable);
          
          if (this.record.id == 0 && this.record.get('timeaccount_id') && this.record.get('timeaccount_id').is_billable) {
              this.getForm().findField('is_billable').setValue(this.record.get('timeaccount_id').is_billable);
          }
+         var focusFieldName = this.record.get('timeaccount_id') ? 'duration' : 'timeaccount_id',
+             focusField = this.getForm().findField(focusFieldName);
+         focusField.focus(true, 250);
      },
  
      /**
                          allowBlank: false,
                          forceSelection: true,
                          name: 'timeaccount_id',
-                         lazyInit: false,
-                         listeners: {
-                             scope: this,
-                             render: function(field){
-                                 if(!this.useMultiple) {
-                                     field.focus(false, 250);
-                                 }
-                             },
-                             select: this.onTimeaccountUpdate
-                         }
+                         lazyInit: false
                      })], [{
                          fieldLabel: this.app.i18n._('Duration'),
                          name: 'duration',
+                         selectOnFocus: true,
                          allowBlank: false,
                          xtype: 'tinedurationspinner'
                          }, {
@@@ -42,6 -42,13 +42,13 @@@ class Tinebase_Config extends Tinebase_
      const AUTHENTICATIONSECONDFACTOR = 'Tinebase_Authentication_SecondFactor';
  
      /**
+      * authentication second factor protection for apps
+      *
+      * @var string
+      */
+     const SECONDFACTORPROTECTEDAPPS = 'Tinebase_Authentication_SecondFactor_Protected_Apps';
+     /**
       * save automatic alarms when creating new record
       *
       * @var string
      const DEFAULT_LOCALE = 'defaultLocale';
  
      /**
+      * default user role
+      */
+     const DEFAULT_USER_ROLE_NAME = 'defaultUserRoleName';
+     /**
+      * default user role
+      */
+     const DEFAULT_ADMIN_ROLE_NAME = 'defaulAdminRoleName';
+     /**
       * INTERNET_PROXY
       *
       * @var string
      const VERSION_CHECK = 'versionCheck';
  
      /**
 +     * WEBDAV_SYNCTOKEN_ENABLED
 +     *
 +     * @var string
 +     */
 +    const WEBDAV_SYNCTOKEN_ENABLED = 'webdavSynctokenEnabled';
 +
 +    /**
       * @var string
       */
      const REPLICATION_MASTER = 'replicationMaster';
      const ACTIONQUEUE = 'actionqueue';
      const ACTIONQUEUE_BACKEND = 'backend';
      const ACTIONQUEUE_ACTIVE = 'active';
+     const ACTIONQUEUE_HOST = 'host';
+     const ACTIONQUEUE_PORT = 'port';
+     const ACTIONQUEUE_NAME = 'queueName';
+     const QUOTA = 'quota';
+     const QUOTA_INCLUDE_REVISION = 'includeRevision';
+     const QUOTA_TOTALINMB = 'totalInMB';
+     const QUOTA_TOTALBYUSERINMB = 'totalByUserInMB';
+     const QUOTA_SOFT_QUOTA = 'softQuota';
+     const QUOTA_SQ_NOTIFICATION_ROLE = 'softQuotaNotificationRole';
  
  
      /**
           *
           * useSystemAccount (bool)
           * domain (string)
+          * instanceName (string)
           * useEmailAsUsername (bool)
           * host (string)
           * port (integer)
           *      'url'                   => 'https://localhost/validate/check',
           *      'allow_self_signed'     => true,
           *      'ignorePeerName'        => true,
+          *      'login'                 => true, // validate during login + show field on login screen
+          *      'sessionLifetime'       => 15 // minutes
           * )
           */
          self::AUTHENTICATIONSECONDFACTOR => array(
              'setByAdminModule'      => FALSE,
              'setBySetupModule'      => TRUE,
          ),
+         self::SECONDFACTORPROTECTEDAPPS => array(
+             //_('Second Factor Protected Applications')
+             'label'                 => 'Second Factor Protected Applications',
+             //_('Second Factor Authentication is needed to access these applications')
+             'description'           => 'Second Factor Authentication is needed to access these applications',
+             'type'                  => 'array',
+             'clientRegistryInclude' => true,
+             'setByAdminModule'      => false,
+             'setBySetupModule'      => true,
+         ),
          self::USERBACKENDTYPE => array(
                                     //_('User Backend')
              'label'                 => 'User Backend',
                      'type'                              => Tinebase_Config::TYPE_BOOL,
                      'default'                           => false
                  ),
+                 self::ACTIONQUEUE_HOST       => array(
+                     'type'                              => Tinebase_Config::TYPE_STRING,
+                     'default'                           => 'localhost'
+                 ),
+                 self::ACTIONQUEUE_PORT       => array(
+                     'type'                              => Tinebase_Config::TYPE_INT,
+                     'default'                           => 6379
+                 ),
+                 self::ACTIONQUEUE_NAME       => array(
+                     'type'                              => Tinebase_Config::TYPE_STRING,
+                     'default'                           => 'TinebaseQueue'
+                 ),
              ),
              'default'                           => array()
          ),
  
              ),
          ),
+         self::DEFAULT_ADMIN_ROLE_NAME => array(
+             //_('Default Admin Role Name')
+             'label'                 => 'Default Admin Role Name',
+             'description'           => 'Default Admin Role Name',
+             'type'                  => 'string',
+             'clientRegistryInclude' => false,
+             'setByAdminModule'      => false,
+             'setBySetupModule'      => true,
+             'default'               => 'admin role'
+         ),
+         self::DEFAULT_USER_ROLE_NAME => array(
+             //_('Default User Role Name')
+             'label'                 => 'Default User Role Name',
+             'description'           => 'Default User Role Name',
+             'type'                  => 'string',
+             'clientRegistryInclude' => false,
+             'setByAdminModule'      => false,
+             'setBySetupModule'      => true,
+             'default'               => 'user role'
+         ),
          self::CRONUSERID => array(
                                     //_('Cronuser ID')
              'label'                 => 'Cronuser ID',
              'setBySetupModule'      => FALSE,
              'default'               => NULL,
          ),
 +        self::WEBDAV_SYNCTOKEN_ENABLED => array(
 +        //_('Enable SyncToken plugin')
 +            'label'                 => 'Enable SyncToken plugin',
 +        //_('Enable the use of the SyncToken plugin.')
 +            'description'           => 'Enable the use of the SyncToken plugin.',
 +            'type'                  => 'bool',
 +            'clientRegistryInclude' => FALSE,
 +            'setByAdminModule'      => FALSE,
 +            'setBySetupModule'      => FALSE,
 +            'default'               => TRUE,
 +        ),
          self::CURRENCY_SYMBOL => array(
              //_('currency symbol')
              'label' => 'urrency symbol',
              ),
              'default'               => array(),
          ),
+         self::QUOTA => array(
+             //_('Quota settings')
+             'label'                 => 'Quota settings',
+             //_('Quota settings')
+             'description'           => 'Quota settings',
+             'type'                  => 'object',
+             'class'                 => 'Tinebase_Config_Struct',
+             'clientRegistryInclude' => true,
+             'setByAdminModule'      => true,
+             'setBySetupModule'      => false,
+             'content'               => array(
+                 self::QUOTA_INCLUDE_REVISION => array(
+                     //_('Include revisions')
+                     'label'                 => 'Include revisions',
+                     //_('Should all revisions be used to calculate total usage?')
+                     'description'           => 'Should all revisions be used to calculate total usage?',
+                     'type'                  => 'bool',
+                     'clientRegistryInclude' => true,
+                     'setByAdminModule'      => true,
+                     'setBySetupModule'      => false,
+                     'default'               => false,
+                 ),
+                 self::QUOTA_TOTALINMB => array(
+                     //_('Total quota in MB')
+                     'label'                 => 'Total quota in MB',
+                     //_('Total quota in MB (0 for unlimited)')
+                     'description'           => 'Total quota in MB (0 for unlimited)',
+                     'type'                  => 'integer',
+                     'clientRegistryInclude' => true,
+                     'setByAdminModule'      => true,
+                     'setBySetupModule'      => false,
+                     'default'               => 0,
+                 ),
+                 self::QUOTA_TOTALBYUSERINMB => array(
+                     //_('Total quota by user in MB')
+                     'label'                 => 'Total quota by user in MB',
+                     //_('Total quota by user in MB (0 for unlimited)')
+                     'description'           => 'Total quota by user in MB (0 for unlimited)',
+                     'type'                  => 'integer',
+                     'clientRegistryInclude' => true,
+                     'setByAdminModule'      => true,
+                     'setBySetupModule'      => false,
+                     'default'               => 0,
+                 ),
+                 self::QUOTA_SOFT_QUOTA => array(
+                     //_('Soft quota in %')
+                     'label'                 => 'Soft quota in %',
+                     //_('Soft quota in % (0-100, 0 means off)')
+                     'description'           => 'Soft quota in % (0-100, 0 means off)',
+                     'type'                  => 'integer',
+                     'clientRegistryInclude' => true,
+                     'setByAdminModule'      => true,
+                     'setBySetupModule'      => false,
+                     'default'               => 90,
+                 ),
+                 self::QUOTA_SQ_NOTIFICATION_ROLE => array(
+                     //_('Soft quota notification role')
+                     'label'                 => 'Soft quota notification role',
+                     //_('Name of the role to notify if soft quote is exceeded')
+                     'description'           => 'Name of the role to notify if soft quote is exceeded',
+                     'type'                  => 'string',
+                     'clientRegistryInclude' => true,
+                     'setByAdminModule'      => true,
+                     'setBySetupModule'      => false,
+                     'default'               => 'soft quota notification',
+                 ),
+             ),
+             'default'               => array(),
+         ),
+         /*
  
+     const QUOTA_SQ_NOTIFICATION_ROLE = 'softQuotaNotificationRole';*/
      );
      
      /**
@@@ -265,7 -265,7 +265,7 @@@ class Tinebase_Container extends Tineba
       */
      public function addGrants($_containerId, $_accountType, $_accountId, array $_grants, $_ignoreAcl = FALSE)
      {
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($_containerId);
          
          if($_ignoreAcl !== TRUE and !$this->hasGrant(Tinebase_Core::getUser(), $_containerId, Tinebase_Model_Grants::GRANT_ADMIN)) {
              throw new Tinebase_Exception_AccessDenied('Permission to manage grants on container denied.');
          $containerGrants->addIndices(array('account_type', 'account_id'));
          $existingGrants = $containerGrants->filter('account_type', $_accountType)->filter('account_id', $_accountId)->getFirstRecord();
          
-         $id = Tinebase_Record_Abstract::generateUID();
-         
          foreach($_grants as $grant) {
              if ($existingGrants === NULL || ! $existingGrants->{$grant}) {
                  $data = array(
-                     'id'            => $id,
+                     'id'            => Tinebase_Record_Abstract::generateUID(),
                      'container_id'  => $containerId,
                      'account_type'  => $_accountType,
                      'account_id'    => $accountId,
          
          $this->_clearCache($container);
          
-         return $this->update($container);
+         return $this->update($container, true);
      }
  
      /**
 -     * get containers with bad names (name == uuid)
 -     * 
 -     * @return Tinebase_Record_RecordSet
 -     */
 -    public function getContainersWithBadNames()
 -    {
 -        $select = $this->_getSelect();
 -        $select->where($this->_db->quoteIdentifier('uuid') . ' = ' . $this->_db->quoteIdentifier('name'));
 -        $stmt = $this->_db->query('/*' . __FUNCTION__ . '*/' . $select);
 -        $rows = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
 -        
 -        $result = new Tinebase_Record_RecordSet('Tinebase_Model_Container', $rows, TRUE);
 -        
 -        return $result;
 -    }
 -    
 -    /**
       * return all container, which the user has the requested right for
       *
       * used to get a list of all containers accesssible by the current user
       */
      public function getContainerById($_containerId, $_getDeleted = FALSE)
      {
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($_containerId);
          
          $cacheId = $containerId . 'd' . (int)$_getDeleted;
          
       *
       * @param   int|Tinebase_Model_Container $_containerId
       * @param   boolean $_ignoreAcl
-      * @param   boolean $_tryAgain
       * @throws  Tinebase_Exception_AccessDenied
       * @throws  Tinebase_Exception_Record_SystemContainer
       * @throws  Tinebase_Exception_InvalidArgument
       * 
       * @todo move records in deleted container to personal container?
       */
-     public function deleteContainer($_containerId, $_ignoreAcl = FALSE, $_tryAgain = TRUE)
+     public function deleteContainer($_containerId, $_ignoreAcl = false)
      {
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
-         $container = ($_containerId instanceof Tinebase_Model_Container) ? $_containerId : $this->getContainerById($containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($_containerId);
+         $container = ($_containerId instanceof Tinebase_Model_Container) ? $_containerId : $this->getContainerById($containerId, $_ignoreAcl);
          $this->checkSystemContainer($containerId);
  
          Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
              $this->deleteContainerContents($container, $_ignoreAcl);
              $deletedContainer = $this->_setRecordMetaDataAndUpdate($container, 'delete');
  
-             Tinebase_Record_PersistentObserver::getInstance()->fireEvent($deletedContainer, 'Tinebase_Event_Record_Delete');
+             $event = new Tinebase_Event_Record_Delete();
+             $event->observable = $deletedContainer;
+             Tinebase_Record_PersistentObserver::getInstance()->fireEvent($event);
          } catch (Exception $e) {
              $tm->rollBack();
              throw $e;
          $accountId = Tinebase_Model_User::convertUserIdToInt($_accountId);
          
          try {
-             $containerId = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
+             $containerId = Tinebase_Model_Container::convertContainerId($_containerId);
          } catch (Tinebase_Exception_InvalidArgument $teia) {
              if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $teia->getMessage());
              if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $teia->getTraceAsString());
      {
          $grants = new Tinebase_Record_RecordSet('Tinebase_Model_Grants');
          
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($_containerId);
          
          $select = $this->_getAclSelectByContainerId($containerId)
              ->group(array('container_acl.container_id', 'container_acl.account_type', 'container_acl.account_id'));
      public function getGrantsOfAccount($_accountId, $_containerId, $_grantModel = 'Tinebase_Model_Grants') 
      {
          $accountId          = Tinebase_Model_User::convertUserIdToInt($_accountId);
-         $containerId        = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
+         $containerId        = Tinebase_Model_Container::convertContainerId($_containerId);
          $container          = ($_containerId instanceof Tinebase_Model_Container) ? $_containerId : $this->getContainerById($_containerId);
          
          $classCacheId = $accountId . $containerId . $container->seq . $_grantModel;
      {
          $containerIds = array();
          foreach ($_records as $record) {
-             if (isset($record[$_containerProperty]) && !isset($containerIds[Tinebase_Model_Container::convertContainerIdToInt($record[$_containerProperty])])) {
-                 $containerIds[Tinebase_Model_Container::convertContainerIdToInt($record[$_containerProperty])] = null;
+             if (isset($record[$_containerProperty]) && !isset($containerIds[Tinebase_Model_Container::convertContainerId($record[$_containerProperty])])) {
+                 $containerIds[Tinebase_Model_Container::convertContainerId($record[$_containerProperty])] = null;
              }
          }
          
       */
      public function setGrants($_containerId, Tinebase_Record_RecordSet $_grants, $_ignoreAcl = FALSE, $_failSafe = TRUE) 
      {
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($_containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($_containerId);
          
          if($_ignoreAcl !== TRUE) {
              if(!$this->hasGrant(Tinebase_Core::getUser(), $containerId, Tinebase_Model_Grants::GRANT_ADMIN)) {
              
              foreach ($_grants as $recordGrants) {
                  $data = array(
-                     'id'            => $recordGrants->getId(),
                      'container_id'  => $containerId,
                      'account_id'    => $recordGrants['account_id'],
                      'account_type'  => $recordGrants['account_type'],
                  );
-                 if (empty($data['id'])) {
-                     $data['id'] = $recordGrants->generateUID();
-                 }
                  
                  foreach ($recordGrants as $grantName => $grant) {
                      if (in_array($grantName, $recordGrants->getAllGrants()) && $grant === TRUE) {
+                         $data['id'] = $recordGrants->generateUID();
                          $this->_getContainerAclTable()->insert($data + array('account_grant' => $grantName));
                      }
                  }
       */
      protected function _clearCache($containerId) 
      {
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($containerId);
          $cache = Tinebase_Core::getCache();
          
          if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
       */
      public function increaseContentSequence($containerId, $action = NULL, $recordId = NULL)
      {
-         $containerId = Tinebase_Model_Container::convertContainerIdToInt($containerId);
+         $containerId = Tinebase_Model_Container::convertContainerId($containerId);
  
          $newContentSeq = NULL;
          try {
      public function getContentHistory($containerId, $lastContentSeq = -1)
      {
          $filter = new Tinebase_Model_ContainerContentFilter(array(
-             array('field' => 'container_id', 'operator' => 'equals',  'value' => Tinebase_Model_Container::convertContainerIdToInt($containerId)),
+             array('field' => 'container_id', 'operator' => 'equals',  'value' => Tinebase_Model_Container::convertContainerId($containerId)),
              array('field' => 'content_seq',  'operator' => 'greater', 'value' => ($lastContentSeq == -1 ? $lastContentSeq : $lastContentSeq - 1)),
          ));
          $pagination = new Tinebase_Model_Pagination(array(
          }
          
          $containerIds = (! is_array($containerIds))
-             ? Tinebase_Model_Container::convertContainerIdToInt($containerIds)
+             ? Tinebase_Model_Container::convertContainerId($containerIds)
              : $containerIds;
          
          $select = $this->_getSelect(array('id', 'content_seq'), TRUE);
       * Updates existing container and clears the cache entry of the container
       *
       * @param Tinebase_Record_Interface $_record
+      * @param boolean $_updateDeleted = false;
       * @return Tinebase_Record_Interface Record|NULL
       */
-     public function update(Tinebase_Record_Interface $_record)
+     public function update(Tinebase_Record_Interface $_record, $_updateDeleted = false)
      {
          $this->_clearCache($_record);
  
          $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
  
          //use get (avoids cache) or getContainerById, guess its better to avoid the cache
-         $oldContainer = $this->get($_record->getId());
+         $oldContainer = $this->get($_record->getId(), $_updateDeleted);
  
          $result = parent::update($_record);
  
          unset($oldContainer->account_grants);
          $this->_writeModLog($result, $oldContainer);
  
-         Tinebase_Record_PersistentObserver::getInstance()->fireEvent($result, 'Tinebase_Event_Record_Update');
+         $event = new Tinebase_Event_Record_Update();
+         $event->observable = $result;
+         Tinebase_Record_PersistentObserver::getInstance()->fireEvent($event);
  
          Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId);
  
       */
      public function applyReplicationModificationLog(Tinebase_Model_ModificationLog $_modification)
      {
          switch ($_modification->change_type) {
              case Tinebase_Timemachine_ModificationLog::CREATED:
                  $diff = new Tinebase_Record_Diff(json_decode($_modification->new_value, true));
                  } else {
                      $record = $this->get($_modification->record_id, true);
                      $record->applyDiff($diff);
-                     $this->update($record);
+                     $this->update($record, true);
                  }
                  break;
  
              case Tinebase_Timemachine_ModificationLog::DELETED:
-                 $this->delete($_modification->record_id);
+                 $this->deleteContainer($_modification->record_id, true);
                  break;
  
              default:
@@@ -95,6 -95,14 +95,14 @@@ class Tinebase_Frontend_Cli extends Tin
      public function forceSyncTokenResync($_opts)
      {
          $args = $this->_parseArgs($_opts, array());
+         $container = Tinebase_Container::getInstance();
+         if (isset($args['userIds'])) {
+             $args['userIds'] = !is_array($args['userIds']) ? array($args['userIds']) : $args['userIds'];
+             $args['containerIds'] = $container->search(new Tinebase_Model_ContainerFilter(array(
+                 array('field' => 'owner_id', 'operator' => 'in', 'value' => $args['userIds'])
+             )))->getId();
+         }
  
          if (isset($args['containerIds'])) {
              $resultStr = '';
  
              $db = Tinebase_Core::getDb();
  
-             $container = Tinebase_Container::getInstance();
              $contentBackend = $container->getContentBackend();
              foreach($args['containerIds'] as $id) {
                  $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction($db);
  
-                 $container->increaseContentSequence($id);
-                 $resultStr .= ($resultStr!==''?', ':'') . $id . '(' . $contentBackend->deleteByProperty($id, 'container_id') . ')';
+                 $containerData = $container->get($id);
+                 $recordsBackend = Tinebase_Core::getApplicationInstance($containerData->model)->getBackend();
+                 if (method_exists($recordsBackend, 'increaseSeqsForContainerId')) {
+                     $recordsBackend->increaseSeqsForContainerId($id);
  
+                     $container->increaseContentSequence($id);
+                     $resultStr .= ($resultStr !== '' ? ', ' : '') . $id . '(' . $contentBackend->deleteByProperty($id,
+                             'container_id') . ')';
+                 }
                  Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId);
              }
  
       * process given queue job
       *  --message json encoded task
       *
-      * @TODO rework user management, jobs should be executed as the right user in future
-      * 
       * @param Zend_Console_Getopt $_opts
       * @return boolean success
       */
          if (! $message) {
              throw new Tinebase_Exception_InvalidArgument('mandatory parameter "message" is missing');
          }
-         
-         Tinebase_ActionQueue::getInstance()->executeAction($message);
+         if (null === ($job = json_decode($message, true))) {
+             throw new Tinebase_Exception_InvalidArgument('parameter "message" can not be json decoded');
+         }
+         if (isset($job['account_id'])) {
+             Tinebase_Core::set(Tinebase_Core::USER, Tinebase_User::getInstance()->getFullUserById($job['account_id']));
+         }
+         Tinebase_ActionQueue::getInstance()->executeAction($job);
          
          return TRUE;
      }
  
          return 0;
      }
-     
      /**
       * repair a table
       * 
          
          exit($result);
      }
 -    
 -    /**
 -     * repairs container names
 -     * 
 -     * @param Zend_Console_Getopt $opts
 -     */
 -    public function repairContainerName($opts)
 -    {
 -        if (! $this->_checkAdminRight()) {
 -            return FALSE;
 -        }
 -        $dryrun = $opts->d;
 -        
 -        $this->_addOutputLogWriter();
 -        $args = $this->_parseArgs($opts);
 -        
 -        $containersWithBadNames = Tinebase_Container::getInstance()->getContainersWithBadNames();
 -        
 -        $locale = Tinebase_Translation::getLocale((isset($args['locale']) ?$args['locale'] : 'auto'));
  
 -        if ($dryrun) {
 -            print_r($containersWithBadNames->toArray());
 -            echo "Using Locale " . $locale . "\n";
 -        }
 -        
 -        $appContainerNames = array(
 -            'Calendar' => 'calendar',
 -            'Tasks'    => 'tasks',
 -            'Addressbook'    => 'addressbook',
 -        );
 -        
 -        foreach ($containersWithBadNames as $container) {
 -            if (empty($container->owner_id)) {
 -                if ($dryrun) {
 -                    echo "Don't rename shared container " . $container->id . "\n";
 -                }
 -                continue;
 -            }
 -            $app = Tinebase_Application::getInstance()->getApplicationById($container->application_id);
 -            $appContainerName = isset($appContainerNames[$app->name]) ? $appContainerNames[$app->name] : "container";
 -            $translation = Tinebase_Translation::getTranslation($app->name, $locale);
 -            $account = Tinebase_User::getInstance()->getUserByPropertyFromSqlBackend('accountId', $container->owner_id);
 -            $newName = $newBaseName = sprintf($translation->_("%s's personal " . $appContainerName), $account->accountFullName);
 -            
 -            $count = 1;
 -            do {
 -                try {
 -                    Tinebase_Container::getInstance()->getContainerByName($app->name, $newName, Tinebase_Model_Container::TYPE_PERSONAL, $container->owner_id);
 -                    $found = true;
 -                    $newName = $newBaseName . ' ' . ++$count;
 -                } catch (Tinebase_Exception_NotFound $tenf) {
 -                    $found = false;
 -                }
 -                
 -            } while ($found);
 -            if ($dryrun) {
 -                echo "Rename container id " . $container->id . ' to ' . $newName . "\n";
 -            } else {
 -                
 -                $container->name = $newName;
 -                Tinebase_Container::getInstance()->update($container);
 -            }
 -        }
 -        
 -        $result = 0;
 -        exit($result);
 -    }
 -    
      /**
       * transfer relations
       * 
      public function repairContainerOwner()
      {
          if (! $this->_checkAdminRight()) {
-             return -1;
+             return 2;
          }
  
          $this->_addOutputLogWriter(6);
          return 0;
      }
  
+     /**
+      * show user report (number of enabled, disabled, ... users)
+      *
+      * TODO add system user count
+      * TODO use twig?
+      */
+     public function userReport()
+     {
+         if (! $this->_checkAdminRight()) {
+             return 2;
+         }
+         $translation = Tinebase_Translation::getTranslation('Tinebase');
+         $userStatus = array(
+             'total' => array(),
+             Tinebase_Model_User::ACCOUNT_STATUS_ENABLED => array(/* 'showUserNames' => true, 'showClients' => true */),
+             Tinebase_Model_User::ACCOUNT_STATUS_DISABLED => array(),
+             Tinebase_Model_User::ACCOUNT_STATUS_BLOCKED => array(),
+             Tinebase_Model_User::ACCOUNT_STATUS_EXPIRED => array(),
+             //'system' => array(),
+             'lastmonth' => array('lastMonths' => 1, 'showUserNames' => true, 'showClients' => true),
+             'last 3 months' => array('lastMonths' => 3),
+         );
+         foreach ($userStatus as $status => $options) {
+             switch ($status) {
+                 case 'lastmonth':
+                 case 'last 3 months':
+                     $userCount = Tinebase_User::getInstance()->getActiveUserCount($options['lastMonths']);
+                     $text = $translation->_("Number of distinct users") . " (" . $status . "): " . $userCount . "\n";
+                     break;
+                 case 'system':
+                     $text = "TODO add me\n";
+                     break;
+                 default:
+                     $userCount = Tinebase_User::getInstance()->getUserCount($status);
+                     $text = $translation->_("Number of users") . " (" . $status . "): " . $userCount . "\n";
+             }
+             echo $text;
+             if (isset($options['showUserNames']) && $options['showUserNames']
+                 && in_array($status, array('lastmonth', 'last 3 months'))
+                 && isset($options['lastMonths'])
+             ) {
+                 // TODO allow this for other status
+                 echo $translation->_("  User Accounts:\n");
+                 $userIds = Tinebase_User::getInstance()->getActiveUserIds($options['lastMonths']);
+                 foreach ($userIds as $userId) {
+                     $user = Tinebase_User::getInstance()->getUserByProperty('accountId', $userId, 'Tinebase_Model_FullUser');
+                     echo "  * " . $user->accountLoginName . ' / ' . $user->accountDisplayName . "\n";
+                     if (isset($options['showClients']) && $options['showClients']) {
+                         $userClients = Tinebase_AccessLog::getInstance()->getUserClients($user, $options['lastMonths']);
+                         echo "    Clients: \n";
+                         foreach ($userClients as $client) {
+                             echo "     - $client\n";
+                         }
+                         echo "\n";
+                     }
+                 }
+             }
+             echo "\n";
+         }
+         return 0;
+     }
      public function createFullTextIndex()
      {
          if (! $this->_checkAdminRight()) {
@@@ -862,14 -862,14 +862,14 @@@ abstract class Tinebase_Record_Abstrac
       * returns a random 40-character hexadecimal number to be used as 
       * universal identifier (UID)
       * 
 -     * @param int|boolean $_length the length of the uid, defaults to 40
 +     * @param int|null $_length the length of the uid, defaults to 40
       * @return string 40-character hexadecimal number
       */
 -    public static function generateUID($_length = false)
 +    public static function generateUID($_length = null)
      {
 -        $uid = sha1(mt_rand(). microtime());
 +        $uid = sha1(mt_rand() . microtime());
          
 -        if ($_length !== false) {
 +        if ($_length && $_length > 0) {
              $uid = substr($uid, 0, $_length);
          }
          
  
          foreach((array)($diff->oldData) as $property => $oldValue)
          {
-             if (in_array($property, $this->_datetimeFields) && ! is_object($oldValue)) {
+             if ('customfields' === $property) {
+                 if (!is_array($oldValue)) {
+                     $oldValue = array();
+                 }
+                 if (isset($diff->diff['customfields']) && is_array($diff->diff['customfields'])) {
+                     foreach (array_keys($diff->diff['customfields']) as $unSetProperty) {
+                         if (!isset($oldValue[$unSetProperty])) {
+                             $oldValue[$unSetProperty] = null;
+                         }
+                     }
+                 }
+             } elseif (in_array($property, $this->_datetimeFields) && ! is_object($oldValue)) {
                  $oldValue = new Tinebase_DateTime($oldValue);
              }
              $this->$property = $oldValue;
                          is_array($this->$property)?$this->$property:array());
                  }
  
-                 $this->$property->applyRecordSetDiff($recordSetDiff);
+                 /** @var Tinebase_Record_Abstract $model */
+                 $model = $recordSetDiff->model;
+                 if (true !== $model::applyRecordSetDiff($this->$property, $recordSetDiff)) {
+                     $this->$property->applyRecordSetDiff($recordSetDiff);
+                 }
              } else {
                  if (in_array($property, $this->_datetimeFields) && ! is_object($oldValue)) {
                      $oldValue = new Tinebase_DateTime($oldValue);
      }
  
      /**
+      * @param Tinebase_Record_RecordSet $_recordSet
+      * @param Tinebase_Record_RecordSetDiff $_recordSetDiff
+      * @return bool
+      */
+     public static function applyRecordSetDiff(Tinebase_Record_RecordSet $_recordSet, Tinebase_Record_RecordSetDiff $_recordSetDiff)
+     {
+         return false;
+     }
+     /**
       * returns true if this record should be replicated
       *
       * @return boolean
       */
      public function getPathPart(Tinebase_Record_Interface $_parent = null, Tinebase_Record_Interface $_child = null)
      {
-         /** @var Tinebase_Record_Abstract_GetPathPartDecorator $delegate */
+         /** @var Tinebase_Record_Abstract_GetPathPartDelegatorInterface $delegate */
          $delegate = Tinebase_Core::getDelegate($this->_application, 'getPathPartDelegate_' . get_called_class() ,
                                                  'Tinebase_Record_Abstract_GetPathPartDelegatorInterface');
          if (false !== $delegate) {
       * extended properties getter
       *
       * @param string $_property
-      * @return &array
+      * @return array
       */
      public function &xprops($_property = 'xprops')
      {
  
          return $this->_properties[$_property];
      }
+     /**
+      * @param Tinebase_Record_RecordSet $_recordSetOne
+      * @param Tinebase_Record_RecordSet $_recordSetTwo
+      * @return null|Tinebase_Record_RecordSetDiff
+      */
+     public static function recordSetDiff(Tinebase_Record_RecordSet $_recordSetOne, Tinebase_Record_RecordSet $_recordSetTwo)
+     {
+         return null;
+     }
  }
@@@ -37,23 -37,6 +37,23 @@@ class Tinebase_Server_WebDAV extends Ti
              $this->_body = fopen('php://temp', 'r+');
              fwrite($this->_body, $request->getContent());
              rewind($this->_body);
 +            /*
 +             * JN: dirty hack for native Windows 7 & 10 webdav client (after early 2017):
 +             * client sends empty request instead empty xml-sceleton -> inject it here
 +             */
 +            $broken_user_agent_preg = '/^Microsoft-WebDAV-MiniRedir\/[6,10]/';
 +            if (isset($_SERVER['HTTP_USER_AGENT']) && (preg_match($broken_user_agent_preg, $_SERVER['HTTP_USER_AGENT']) === 1) ) {
 +                if ($request->getContent() == '') {
 +                    $broken_user_agent_body = '<?xml version="1.0" encoding="utf-8" ?><D:propfind xmlns:D="DAV:"><D:prop>';
 +                    $broken_user_agent_body.= '<D:creationdate/><D:displayname/><D:getcontentlength/><D:getcontenttype/><D:getetag/><D:getlastmodified/><D:resourcetype/>';
 +                    $broken_user_agent_body.= '</D:prop></D:propfind>';
 +                    fwrite($this->_body, $broken_user_agent_body);
 +                    rewind($this->_body);
 +                    if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG))
 +                        Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " broken userAgent detected: " .
 +                        $_SERVER['HTTP_USER_AGENT'] . " --> inserted xml body");
 +                }
 +            }
          }
          
          try {
          
          if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
              self::$_server->debugExceptions = true;
+             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " headers: " . print_r(self::$_server->httpRequest->getHeaders(), true));
              $contentType = self::$_server->httpRequest->getHeader('Content-Type');
              Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " requestContentType: " . $contentType);
              
          self::$_server->addPlugin(new Tinebase_WebDav_Plugin_PrincipalSearch());
          self::$_server->addPlugin(new Tinebase_WebDav_Plugin_ExpandedPropertiesReport());
          self::$_server->addPlugin(new \Sabre\DAV\Browser\Plugin());
 -        self::$_server->addPlugin(new Tinebase_WebDav_Plugin_SyncToken());
 +        if (Tinebase_Config::getInstance()->get(Tinebase_Config::WEBDAV_SYNCTOKEN_ENABLED)) {
 +            if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) 
 +                Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' SyncTokenSupport enabled');
 +            self::$_server->addPlugin(new Tinebase_WebDav_Plugin_SyncToken());
 +        } else {
 +            if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) 
 +                Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' SyncTokenSupport disabled');
 +        }
          self::$_server->addPlugin(new Calendar_Frontend_CalDAV_SpeedUpPropfindPlugin());
  
          $contentType = self::$_server->httpRequest->getHeader('Content-Type');
@@@ -64,7 -64,7 +64,7 @@@ Tine.Tinebase.LoginPanel = Ext.extend(E
      getLoginPanel: function () {
          //Do we have a cutom Logo for branding?
          var modSsl = Tine.Tinebase.registry.get('modSsl'),
-             secondFactor = Tine.Tinebase.registry.get('secondFactor'),
+             secondFactor = Tine.Tinebase.registry.get('secondFactorLogin'),
              logo = this.loginLogo ? this.loginLogo : Tine.logo;
          
          if (! this.loginPanel) {
                          this.onLogin.call(this.scope, response);
                      } else {
                          var modSsl = Tine.Tinebase.registry.get('modSsl');
 -                        var resultMsg = modSsl ? i18n._('There was an error verifying your certificate!!!') :
 -                            i18n._('Your username and/or your password are wrong!!!');
 +                        var resultMsg = modSsl ? i18n._('There was an error verifying your certificate!') :
 +                            i18n._('Your username and/or your password are wrong!');
                          Ext.MessageBox.show({
                              title: i18n._('Login failure'),
                              msg: resultMsg,
@@@ -53,7 -53,7 +53,7 @@@ Tine.clientVersion.releaseTime      = '
   */
  Tine.logo = 'images/tine_logo.png';
  Tine.favicon;
 -Tine.title = 'Tine 2.0 \u00ae';
 +Tine.title = 'Tine 2.0 \u263c';
  Tine.weburl = 'http://www.tine20.com/1/welcome-community/';
  Tine.helpUrl = 'https://wiki.tine20.org/Main_Page';
  Tine.bugreportUrl = 'https://api.tine20.net/bugreport.php';
@@@ -146,7 -146,7 +146,7 @@@ Tine.Tinebase.tineInit = 
              var target = e.getTarget('a',1 ,true);
              if (target && target.getAttribute('target') == '_blank') {
                  var href = String(target.getAttribute('href'));
-                     if (href.match(new RegExp('^' + Tine.Tinebase.common.getUrl()))) {
+                     if (href.match(new RegExp('^' + window.lodash.escapeRegExp(Tine.Tinebase.common.getUrl())))) {
                          target.set({
                              href: decodeURI(href),
                              target: "_self"
          };
          postal.fedx.addFilter( [
              { channel: 'thirdparty', topic: '#', direction: 'both' },
-             { channel: 'recordchange', topic: '#', direction: 'both' }
+             { channel: 'recordchange', topic: '#', direction: 'both' },
+             { channel: 'messagebus', topic: '#', direction: 'both' }
              //{ channel: 'postal.request-response', topic: '#', direction: 'both' }
          ] );
          postal.fedx.signalReady();
              var sessionLifeTime = Tine.Tinebase.registry.get('sessionLifeTime') || 86400,
                  presenceObserver = new Tine.Tinebase.PresenceObserver({
                      maxAbsenseTime: sessionLifeTime / 60,
-                     callback: function(lastPresence, po) {
+                     absenceCallback: function(lastPresence, po) {
                          Tine.Tinebase.MainMenu.prototype._doLogout()
                      }
                  });
@@@ -89,7 -89,7 +89,7 @@@ Tine.widgets.tags.TagPanel = Ext.extend
                  paging : {}
              }
          });
 -        
 +
          this.searchField = new Tine.widgets.tags.TagCombo({
              app: this.app,
              onlyUsableTags: true,
                  this.dataView.clearSelections();
                  this.dataView.select(selectedIdx);
              }
-             event.preventDefault();
+             event.stopEvent();
              
              var selectedTags = this.dataView.getSelectedRecords();
              var selectedTag = selectedTags.length == 1 ? selectedTags[0] : null;
                              
                              // @todo use correct strings: Realy -> Really / disapear -> disappear
                              Ext.MessageBox.confirm(
 -                                i18n.ngettext('Realy Delete Selected Tag?', 'Realy Delete Selected Tags?', selectedTags.length),
 -                                i18n.ngettext('the selected tag will be deleted and disapear for all entries',
 -                                                        'The selected tags will be removed and disapear for all entries', selectedTags.length), 
 +                                i18n.ngettext('Really delete selected tag?', 'Really delete selected tags?', selectedTags.length),
 +                                i18n.ngettext('The selected tag will be deleted and disappear for all entries',
 +                                                        'The selected tags will be removed and disappear for all entries', selectedTags.length), 
                                  function(btn) {
                                      if (btn == 'yes'){
                                          Ext.MessageBox.wait(i18n._('Please wait a moment...'), i18n.ngettext('Deleting Tag', 'Deleting Tags', selectedTags.length));
diff --combined tine20/composer.json
@@@ -24,7 -24,7 +24,7 @@@
      "require": {
          "zendframework/zendframework1": "1.12.20pl14 as 1.12.20",
          "tine20/composerapploader": "1.0.*",
 -        "syncroton/syncroton": "1.3.*",
 +        "syncroton/syncroton": "dev-master#7a130976f93cce5035ec9a455f65b5b7134a7142",
          "ezyang/htmlpurifier": "v4.6.0",
          "phpoffice/phpexcel": "1.8.*",
          "phpoffice/phpword": "v0.13.*",
@@@ -34,7 -34,8 +34,8 @@@
          "metaways/timezoneconvert": "1.*",
          "zendframework/zend-http": "2.4.*",
          "doctrine/orm": "2.5.*",
-         "twig/twig": "~1.0"
+         "twig/twig": "~1.0",
+         "phpoffice/phpspreadsheet": "dev-master"
      },
      "require-dev": {
          "phpunit/phpunit": "3.7.*",
diff --combined tine20/composer.lock
@@@ -4,8 -4,7 +4,7 @@@
          "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
          "This file is @generated automatically"
      ],
-     "hash": "d98d732a2328e86c84f6fa8174b42e8d",
-     "content-hash": "d2b2517319121ffa041f6c40d8ab329c",
+     "content-hash": "1c9f4588350bdb69d46c2e0da0a44a9e",
      "packages": [
          {
              "name": "doctrine/annotations",
@@@ -73,7 -72,7 +72,7 @@@
                  "docblock",
                  "parser"
              ],
-             "time": "2015-08-31 12:32:49"
+             "time": "2015-08-31T12:32:49+00:00"
          },
          {
              "name": "doctrine/cache",
                  "cache",
                  "caching"
              ],
-             "time": "2015-12-31 16:37:02"
+             "time": "2015-12-31T16:37:02+00:00"
          },
          {
              "name": "doctrine/collections",
                  "collections",
                  "iterator"
              ],
-             "time": "2015-04-14 22:21:58"
+             "time": "2015-04-14T22:21:58+00:00"
          },
          {
              "name": "doctrine/common",
                  "persistence",
                  "spl"
              ],
-             "time": "2015-12-25 13:18:31"
+             "time": "2015-12-25T13:18:31+00:00"
          },
          {
              "name": "doctrine/dbal",
 -            "version": "v2.5.4",
 +            "version": "v2.5.5",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/dbal.git",
 -                "reference": "abbdfd1cff43a7b99d027af3be709bc8fc7d4769"
 +                "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/dbal/zipball/abbdfd1cff43a7b99d027af3be709bc8fc7d4769",
 -                "reference": "abbdfd1cff43a7b99d027af3be709bc8fc7d4769",
 +                "url": "https://api.github.com/repos/doctrine/dbal/zipball/9f8c05cd5225a320d56d4bfdb4772f10d045a0c9",
 +                "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9",
                  "shasum": ""
              },
              "require": {
              },
              "require-dev": {
                  "phpunit/phpunit": "4.*",
 -                "symfony/console": "2.*"
 +                "symfony/console": "2.*||^3.0"
              },
              "suggest": {
                  "symfony/console": "For helpful console commands such as SQL execution and import of files."
                  "persistence",
                  "queryobject"
              ],
-             "time": "2016-01-05 22:11:12"
+             "time": "2016-01-05T22:11:12+00:00"
          },
          {
              "name": "doctrine/inflector",
                  "singularize",
                  "string"
              ],
-             "time": "2015-11-06 14:35:42"
+             "time": "2015-11-06T14:35:42+00:00"
          },
          {
              "name": "doctrine/instantiator",
                  "constructor",
                  "instantiate"
              ],
-             "time": "2015-06-14 21:17:01"
+             "time": "2015-06-14T21:17:01+00:00"
          },
          {
              "name": "doctrine/lexer",
                  "lexer",
                  "parser"
              ],
-             "time": "2014-09-09 13:34:57"
+             "time": "2014-09-09T13:34:57+00:00"
          },
          {
              "name": "doctrine/orm",
 -            "version": "v2.5.4",
 +            "version": "v2.5.5",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/doctrine2.git",
 -                "reference": "bc4ddbfb0114cb33438cc811c9a740d8aa304aab"
 +                "reference": "73e4be7c7b3ba26f96b781a40b33feba4dfa6d45"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/bc4ddbfb0114cb33438cc811c9a740d8aa304aab",
 -                "reference": "bc4ddbfb0114cb33438cc811c9a740d8aa304aab",
 +                "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/73e4be7c7b3ba26f96b781a40b33feba4dfa6d45",
 +                "reference": "73e4be7c7b3ba26f96b781a40b33feba4dfa6d45",
                  "shasum": ""
              },
              "require": {
                  "database",
                  "orm"
              ],
-             "time": "2016-01-05 21:34:58"
+             "time": "2016-01-05T21:34:58+00:00"
          },
          {
              "name": "ezyang/htmlpurifier",
              "keywords": [
                  "html"
              ],
-             "time": "2013-11-30 08:25:19"
+             "time": "2013-11-30T08:25:19+00:00"
          },
          {
              "name": "metaways/opendocument",
                  "OpenDocument",
                  "Template"
              ],
-             "time": "2016-04-01 11:09:24"
+             "time": "2016-04-01T11:09:24+00:00"
          },
          {
              "name": "metaways/timezoneconvert",
                  "Timezones",
                  "UTC"
              ],
-             "time": "2016-04-25 08:20:13"
+             "time": "2016-04-25T08:20:13+00:00"
          },
          {
              "name": "pclzip/pclzip",
                  "php",
                  "zip"
              ],
-             "time": "2014-06-05 11:42:24"
+             "time": "2014-06-05T11:42:24+00:00"
          },
          {
              "name": "phpoffice/common",
                  "office",
                  "php"
              ],
-             "time": "2016-07-07 17:26:55"
+             "time": "2016-07-07T17:26:55+00:00"
          },
          {
              "name": "phpoffice/phpexcel",
                  "xls",
                  "xlsx"
              ],
-             "time": "2015-05-01 07:00:55"
+             "time": "2015-05-01T07:00:55+00:00"
+         },
+         {
+             "name": "phpoffice/phpspreadsheet",
+             "version": "dev-master",
+             "source": {
+                 "type": "git",
+                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+                 "reference": "fb12e82d62df6adf8efb734e799a250c0aada70a"
+             },
+             "dist": {
+                 "type": "zip",
+                 "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fb12e82d62df6adf8efb734e799a250c0aada70a",
+                 "reference": "fb12e82d62df6adf8efb734e799a250c0aada70a",
+                 "shasum": ""
+             },
+             "require": {
+                 "ext-iconv": "*",
+                 "ext-mbstring": "*",
+                 "ext-xml": "*",
+                 "ext-xmlwriter": "*",
+                 "ext-zip": "*",
+                 "php": "^5.6|^7.0",
+                 "psr/simple-cache": "^1.0"
+             },
+             "require-dev": {
+                 "dompdf/dompdf": "^0.8.0",
+                 "friendsofphp/php-cs-fixer": "^2.0",
+                 "mpdf/mpdf": "^6.1",
+                 "phpunit/phpunit": "^5.7",
+                 "squizlabs/php_codesniffer": "^2.7",
+                 "tecnickcom/tcpdf": "^6.2"
+             },
+             "suggest": {
+                 "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+                 "ext-dom": "Option to read and write HTML files",
+                 "ext-gd": "Required for exact column width autocalculation",
+                 "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                 "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+                 "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer"
+             },
+             "type": "library",
+             "autoload": {
+                 "psr-4": {
+                     "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                 }
+             },
+             "notification-url": "https://packagist.org/downloads/",
+             "license": [
+                 "LGPL-2.1"
+             ],
+             "authors": [
+                 {
+                     "name": "Maarten Balliauw",
+                     "homepage": "http://blog.maartenballiauw.be"
+                 },
+                 {
+                     "name": "Erik Tilt"
+                 },
+                 {
+                     "name": "Franck Lefevre",
+                     "homepage": "http://rootslabs.net"
+                 },
+                 {
+                     "name": "Mark Baker",
+                     "homepage": "http://markbakeruk.net"
+                 }
+             ],
+             "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+             "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+             "keywords": [
+                 "OpenXML",
+                 "excel",
+                 "gnumeric",
+                 "ods",
+                 "php",
+                 "spreadsheet",
+                 "xls",
+                 "xlsx"
+             ],
+             "time": "2017-07-14 08:09:25"
          },
          {
              "name": "phpoffice/phpword",
                  "word",
                  "writer"
              ],
-             "time": "2016-07-31 08:53:39"
+             "time": "2016-07-31T08:53:39+00:00"
+         },
+         {
+             "name": "psr/simple-cache",
+             "version": "1.0.0",
+             "source": {
+                 "type": "git",
+                 "url": "https://github.com/php-fig/simple-cache.git",
+                 "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
+             },
+             "dist": {
+                 "type": "zip",
+                 "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
+                 "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
+                 "shasum": ""
+             },
+             "require": {
+                 "php": ">=5.3.0"
+             },
+             "type": "library",
+             "extra": {
+                 "branch-alias": {
+                     "dev-master": "1.0.x-dev"
+                 }
+             },
+             "autoload": {
+                 "psr-4": {
+                     "Psr\\SimpleCache\\": "src/"
+                 }
+             },
+             "notification-url": "https://packagist.org/downloads/",
+             "license": [
+                 "MIT"
+             ],
+             "authors": [
+                 {
+                     "name": "PHP-FIG",
+                     "homepage": "http://www.php-fig.org/"
+                 }
+             ],
+             "description": "Common interfaces for simple caching",
+             "keywords": [
+                 "cache",
+                 "caching",
+                 "psr",
+                 "psr-16",
+                 "simple-cache"
+             ],
+             "time": "2017-01-02T13:31:39+00:00"
          },
          {
              "name": "sabre/dav",
                  "framework",
                  "iCalendar"
              ],
-             "time": "2015-01-21 21:01:09"
+             "time": "2015-01-21T21:01:09+00:00"
          },
          {
              "name": "sabre/vobject",
                  "jCard",
                  "vCard"
              ],
-             "time": "2016-10-07 03:20:40"
+             "time": "2016-10-07T03:20:40+00:00"
          },
          {
              "name": "symfony/console",
 -            "version": "v3.1.2",
 +            "version": "v3.1.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/console.git",
 -                "reference": "747154aa69b0f83cd02fc9aa554836dee417631a"
 +                "reference": "8ea494c34f0f772c3954b5fbe00bffc5a435e563"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/console/zipball/747154aa69b0f83cd02fc9aa554836dee417631a",
 -                "reference": "747154aa69b0f83cd02fc9aa554836dee417631a",
 +                "url": "https://api.github.com/repos/symfony/console/zipball/8ea494c34f0f772c3954b5fbe00bffc5a435e563",
 +                "reference": "8ea494c34f0f772c3954b5fbe00bffc5a435e563",
                  "shasum": ""
              },
              "require": {
              ],
              "description": "Symfony Console Component",
              "homepage": "https://symfony.com",
-             "time": "2016-06-29 07:02:31"
+             "time": "2016-06-29T07:02:31+00:00"
          },
          {
              "name": "symfony/polyfill-mbstring",
                  "portable",
                  "shim"
              ],
-             "time": "2016-05-18 14:26:46"
+             "time": "2016-05-18T14:26:46+00:00"
          },
          {
              "name": "syncroton/syncroton",
 -            "version": "1.3.3",
 +            "version": "dev-master",
              "source": {
                  "type": "git",
                  "url": "http://git.syncroton.org/Syncroton",
 -                "reference": "fbd03e07c494556f291f67841111dc5321c07893"
 +                "reference": "7a130976f93cce5035ec9a455f65b5b7134a7142"
              },
              "require": {
                  "php": ">=5.3.0",
              ],
              "description": "Library to sync mobile devices",
              "homepage": "http://www.syncroton.org",
-             "time": "2017-01-05 13:51:53"
+             "time": "2017-01-03T16:14:20+00:00"
          },
          {
              "name": "tine20/composerapploader",
                      "Tine20\\ComposerAppLoader\\": "src/"
                  }
              },
-             "time": "2017-02-13 11:26:52"
+             "time": "2017-02-13T11:26:52+00:00"
          },
          {
              "name": "twig/twig",
                  "escaper",
                  "zf2"
              ],
-             "time": "2015-05-07 14:55:31"
+             "time": "2015-05-07T14:55:31+00:00"
          },
          {
              "name": "zendframework/zend-http",
                  "http",
                  "zf2"
              ],
-             "time": "2015-09-14 16:11:20"
+             "time": "2015-09-14T16:11:20+00:00"
          },
          {
              "name": "zendframework/zend-loader",
                  "loader",
                  "zf2"
              ],
-             "time": "2015-05-07 14:55:31"
+             "time": "2015-05-07T14:55:31+00:00"
          },
          {
              "name": "zendframework/zend-stdlib",
                  "stdlib",
                  "zf2"
              ],
-             "time": "2015-07-21 13:55:46"
+             "time": "2015-07-21T13:55:46+00:00"
          },
          {
              "name": "zendframework/zend-uri",
                  "uri",
                  "zf2"
              ],
-             "time": "2015-09-14 16:17:10"
+             "time": "2015-09-14T16:17:10+00:00"
          },
          {
              "name": "zendframework/zend-validator",
                  "validator",
                  "zf2"
              ],
-             "time": "2015-09-08 21:04:17"
+             "time": "2015-09-08T21:04:17+00:00"
          },
          {
              "name": "zendframework/zendframework1",
                  "New BSD License"
              ],
              "description": "Metaways Infosystems GmbH - Patched Zendframework1",
-             "time": "2017-05-15 08:19:50"
+             "time": "2017-05-15T08:19:50+00:00"
          }
      ],
      "packages-dev": [
                  "task",
                  "tool"
              ],
-             "time": "2016-03-10 21:39:23"
+             "time": "2016-03-10T21:39:23+00:00"
          },
          {
              "name": "phpunit/php-code-coverage",
                  "testing",
                  "xunit"
              ],
-             "time": "2014-09-02 10:13:14"
+             "time": "2014-09-02T10:13:14+00:00"
          },
          {
              "name": "phpunit/php-file-iterator",
                  "filesystem",
                  "iterator"
              ],
-             "time": "2015-06-21 13:08:43"
+             "time": "2015-06-21T13:08:43+00:00"
          },
          {
              "name": "phpunit/php-text-template",
              "keywords": [
                  "template"
              ],
-             "time": "2015-06-21 13:50:34"
+             "time": "2015-06-21T13:50:34+00:00"
          },
          {
              "name": "phpunit/php-timer",
              "keywords": [
                  "timer"
              ],
-             "time": "2016-05-12 18:03:57"
+             "time": "2016-05-12T18:03:57+00:00"
          },
          {
              "name": "phpunit/php-token-stream",
              "keywords": [
                  "tokenizer"
              ],
-             "time": "2014-03-03 05:10:30"
+             "time": "2014-03-03T05:10:30+00:00"
          },
          {
              "name": "phpunit/phpunit",
                  "testing",
                  "xunit"
              ],
-             "time": "2014-10-17 09:04:17"
+             "time": "2014-10-17T09:04:17+00:00"
          },
          {
              "name": "phpunit/phpunit-mock-objects",
                  "mock",
                  "xunit"
              ],
-             "time": "2013-01-13 10:24:48"
+             "time": "2013-01-13T10:24:48+00:00"
          },
          {
              "name": "symfony/yaml",
 -            "version": "v2.8.8",
 +            "version": "v2.8.11",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/yaml.git",
 -                "reference": "dba4bb5846798cd12f32e2d8f3f35d77045773c8"
 +                "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/yaml/zipball/dba4bb5846798cd12f32e2d8f3f35d77045773c8",
 -                "reference": "dba4bb5846798cd12f32e2d8f3f35d77045773c8",
 +                "url": "https://api.github.com/repos/symfony/yaml/zipball/e7540734bad981fe59f8ef14b6fc194ae9df8d9c",
 +                "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c",
                  "shasum": ""
              },
              "require": {
              ],
              "description": "Symfony Yaml Component",
              "homepage": "https://symfony.com",
-             "time": "2016-09-02 01:57:56"
+             "time": "2016-06-29T05:29:29+00:00"
          },
          {
              "name": "tedivm/jshrink",
                  "javascript",
                  "minifier"
              ],
-             "time": "2015-07-04 07:35:09"
+             "time": "2015-07-04T07:35:09+00:00"
          }
      ],
      "aliases": [
      ],
      "minimum-stability": "stable",
      "stability-flags": {
-         "syncroton/syncroton": 20
+         "phpoffice/phpspreadsheet": 20
      },
      "prefer-stable": false,
      "prefer-lowest": false,