* [Calendars] Implemented a reusable calendar tab with events, recurring schedules, active/busy.  A scheduler job creates ongoing future events based on recurring schedules.

* [Calendars/Profiles] Added a calendar tab to each worker profile.
[Platform/Plugins/Search] Fixed some PHP notices when deeply nesting search parameters.
* [Virtual Attendants/Plugins/Platform] Implemented the ability to 'dry run' Virtual Attendant behavior.  This returns information about the decisions that are made, and the actions that would be executed, without actually making changes to data.  This is used in the upcoming simulator for VA behavior.
* [Mail/Parser/Debug] The email parser can now be instructed to save a copy of all incoming messages prior to processing them.  The original message source for each message is saved in the /storage/mail/archive/ directory and organized by subdirectories for year, month, and day.  This mode can be enabled by defining the DEVELOPMENT_ARCHIVE_PARSER_MSGSOURCE constant as 'true' in the framework.config.php file.  This is useful if you want to keep a record of processed messages for audit control, backups, or if you want to recover the original sources for troubleshooting.
* [Virtual Attendants/Scheduled Behavior] Virtual Attendant scheduled behavior that fails to run will now be deleted rather than accumulating in the queue.  The original intention was to retry them, but in practice a failing behavior will continue to fail and it just wastes cycles.
Code cleanup
* [Virtual Attendants/Usability] Improved the way that menus are drawn when editing Virtual Attendant behavior.  This should fix the issue with menus becoming stuck open when opening several popup editors at once.
* [Setup/Virtual Attendants] Implemented a new Virtual Attendants section in Setup.  You'll find it in the Configure menu.  This page enables administrators to view and configure all VA behavior from a single place regardless of owner.  A text box at the top of the page helps quickly locate the desired roles, groups, or workers.  Selecting an owner will add a new tab to the page with their Virtual Attendant behavior.
* [Setup/Community Portals/Usability] The Community Portals menu in Setup has been moved to an entry in the Configure menu.  This frees up that screen space for use by something that actually needs its own menu.
* [Devblocks/Platform/Plugins/Search/Views] Implemented a new shared 'internal/views/criteria/__list.tpl' template.  This can be used by plugin-provided worklists to set the values of a list-based field using associative keys that differ from the displayed values.  The previous option was using the custom field 'picklist' template, but it only saved the literal labels without the option to use keys.  For example, this can be used to present a list of color options by label (Red, Green, Blue) when filtering, and the value for filtering can be keys instead (R, G, B).  Plugin developers could always implement this functionality themselves, but using this shared template will reduce the number of files in the project, which benefits performance.
* [Virtual Attendants/Simulator] Implemented a simulator for testing Virtual Attendant behavior in a sandbox.  This enables you to see how behavior will respond in any situation without having to test using live data.  Click on any behavior and select 'Simulate' from the menu.  The values used by conditions and actions will be initialized from a sample object.  You can modify any combination of values.  The current time (as perceived by VAs) can be changed for testing time-dependent behavior (e.g. day, night, weekend).  You can use the simulator popup in real-time while making changes to behavior.  This should significantly improve the workflow of creating and testing VA behaviors.
5.8.0-dev Push
Code cleanup
* [Virtual Attendants] Fixed a warning if the 'month of year' or 'day of week' conditions were used on VA behavior and no options were selected.
* [Performance/Custom Fields] Improved the performance of custom field lookups.  Previously, all custom field database tables were blindly checked for values.  Now we'll only scan the tables  for the custom field types applicable for a given object.  For example, if an object type (e.g. tasks) only has a string custom field, the 'number' and 'club' tables won't be checked.  If no custom fields are defined for an object then lookups are bypassed entirely.  This reduces the number of queries made to the database.

* [Performance/Custom Fields] Combined the multiple custom field value lookup queries into a single UNION ALL query.  This reduces the number of queries and roundtrips to the database server while serving requests.
* [Virtual Attendants/Editor/Simulator/Usability] When editing actions on a Virtual Attendant behavior, you can now choose between 'Save & Close' and 'Save & Continue'.  The former was the default behavior in the past, and the latter allows you to make changes to the actions and test them in the VA Simulator without having to constantly reopen the action editor popup.
* [Virtual Attendants/Editor/Snippets/Usability] When testing snippets in the Virtual Attendant action popup, the tester will no longer be closed automatically when you re-focus the text box.  This made it tedious to adjust and test snippets.
* [Virtual Attendant/Snippets/Simulator] The Virtual Attendant behavior simulator can now display output for actions to describes the changes that would have occurred.  For example, a comment that's created with placeholders will show the translated content, as well as the workers that would be notified about it.  Plugins can take advantage of this feature by implementing the simulateActionExtension() method on devblocks.event extensions.
List variables in Virtual Attendants

* [Virtual Attendants/Behavior Variables/Collections] Virtual Attendants can now use their own worklists to gather information and make decisions. You can now add list-based variables to VA behavior.  VAs can populate these lists with objects using a combination of presets, and then use the results in conditions and actions.  For example, with a 'Task List' variable, a VA can then search tasks using presets for 'Overdue' and 'Watched by me'.  The results can be filtered, sorted, and limited; and multiple lookups can be combined with addition (add to list), subtraction (remove these from list if they exist), and replacement (only use this list).  For another example, you could use presets to set a worker list variable to 'Admins' and 'Active within the past hour'. This variable could then be used instead of an explicit worker list when sending notifications, adding watchers, etc.

* [Virtual Attendants/Behavior Variables/Collections] List variables can be used as conditions.  This is a comparison of the number of objects in the list (e.g. greater than zero).
* [Virtual Attendants/Plugins/Development] When running actions on VA behavior,the $values dictionary will now always contain a reference to the trigger with the key '_trigger'.  This can be used to access information about the behavior, like variables or the decision tree.